@besaitech/ng-design-system 0.0.51 → 0.0.53

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":"besaitech-ng-design-system.mjs","sources":["../../../projects/saitech-design-system/src/lib/icon/icon-registry.ts","../../../projects/saitech-design-system/src/lib/icon/sds-icon.ts","../../../projects/saitech-design-system/src/lib/button/sds-button.ts","../../../projects/saitech-design-system/src/lib/input/sds-input.ts","../../../projects/saitech-design-system/src/lib/input-number/sds-input-number.ts","../../../projects/saitech-design-system/src/lib/localized-input/sds-localized-input.ts","../../../projects/saitech-design-system/src/lib/otp-input/sds-otp-input.ts","../../../projects/saitech-design-system/src/lib/textarea/sds-textarea.ts","../../../projects/saitech-design-system/src/lib/toggle-switch/sds-toggle-switch.ts","../../../projects/saitech-design-system/src/lib/checkbox/sds-checkbox.ts","../../../projects/saitech-design-system/src/lib/radio/sds-radio.ts","../../../projects/saitech-design-system/src/lib/avatar/sds-avatar.ts","../../../projects/saitech-design-system/src/lib/badge/sds-badge.ts","../../../projects/saitech-design-system/src/lib/card/sds-card.ts","../../../projects/saitech-design-system/src/lib/datepicker/date-utils.ts","../../../projects/saitech-design-system/src/lib/datepicker/sds-calendar.ts","../../../projects/saitech-design-system/src/lib/datepicker/sds-date-picker.ts","../../../projects/saitech-design-system/src/lib/select/sds-select-templates.ts","../../../projects/saitech-design-system/src/lib/select/sds-select.ts","../../../projects/saitech-design-system/src/lib/select/sds-multi-select.ts","../../../projects/saitech-design-system/src/lib/phone-input/phone-countries.ts","../../../projects/saitech-design-system/src/lib/phone-input/sds-phone-input.ts","../../../projects/saitech-design-system/src/lib/paginator/sds-paginator.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tabs-store.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tabs.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-list.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-panels.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-panel.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-store.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-panel.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-header.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-content.ts","../../../projects/saitech-design-system/src/lib/table/sds-table-cell.ts","../../../projects/saitech-design-system/src/lib/table/sds-table-row-expansion.ts","../../../projects/saitech-design-system/src/lib/table/sds-table.ts","../../../projects/saitech-design-system/src/lib/toast/sds-toast.service.ts","../../../projects/saitech-design-system/src/lib/toast/sds-toast-host.ts","../../../projects/saitech-design-system/src/lib/theme/sds-theme.service.ts","../../../projects/saitech-design-system/src/lib/theme/sds-theme-toggle.ts","../../../projects/saitech-design-system/src/lib/sidebar/sidebar-store.ts","../../../projects/saitech-design-system/src/lib/topbar/sds-topbar.ts","../../../projects/saitech-design-system/src/lib/shell/sds-shell.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-sidebar.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-nav-group.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-nav-item.ts","../../../projects/saitech-design-system/src/lib/user-menu/sds-user-menu.ts","../../../projects/saitech-design-system/src/lib/user-menu/sds-menu-item.ts","../../../projects/saitech-design-system/src/lib/search/sds-search-command.ts","../../../projects/saitech-design-system/src/lib/language-switcher/sds-language-switcher.ts","../../../projects/saitech-design-system/src/public-api.ts","../../../projects/saitech-design-system/src/besaitech-ng-design-system.ts"],"sourcesContent":["/**\n * Curated set of line icons (Lucide-style, 24x24 viewBox, stroke-based).\n * Each entry holds only the inner SVG markup; the <sds-icon> component wraps it.\n * Add new icons here and they become available everywhere via name=\"...\".\n */\nexport const SDS_ICONS = {\n // Added for the Belvigo merchant shell (nav + header). Lucide 24x24 stroke paths, matching the\n // set the app already used before it moved onto this library.\n 'chart-column':\n '<path d=\"M3 3v16a2 2 0 0 0 2 2h16\"/><path d=\"M18 17V9\"/><path d=\"M13 17V5\"/><path d=\"M8 17v-3\"/>',\n 'clipboard-list':\n '<rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"/><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\"/><path d=\"M12 11h4\"/><path d=\"M12 16h4\"/><path d=\"M8 11h.01\"/><path d=\"M8 16h.01\"/>',\n 'credit-card':\n '<rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\"/><line x1=\"2\" x2=\"22\" y1=\"10\" y2=\"10\"/>',\n 'external-link':\n '<path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>',\n 'languages':\n '<path d=\"m5 8 6 6\"/><path d=\"m4 14 6-6 2-3\"/><path d=\"M2 5h12\"/><path d=\"M7 2h1\"/><path d=\"m22 22-5-10-5 10\"/><path d=\"M14 18h6\"/>',\n 'megaphone':\n '<path d=\"m3 11 18-5v12L3 14v-3z\"/><path d=\"M11.6 16.8a3 3 0 1 1-5.8-1.6\"/>',\n 'monitor':\n '<rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/>',\n 'store':\n '<path d=\"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7\"/><path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\"/><path d=\"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4\"/><path d=\"M2 7h20\"/><path d=\"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7\"/>',\n 'user-round':\n '<circle cx=\"12\" cy=\"8\" r=\"5\"/><path d=\"M20 21a8 8 0 0 0-16 0\"/>',\n home: '<path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><polyline points=\"9 22 9 12 15 12 15 22\"/>',\n 'user-plus':\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><line x1=\"19\" x2=\"19\" y1=\"8\" y2=\"14\"/><line x1=\"22\" x2=\"16\" y1=\"11\" y2=\"11\"/>',\n 'user-check':\n '<path d=\"m16 11 2 2 4-4\"/><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/>',\n hand: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-hand-icon lucide-hand\"><path d=\"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\"/><path d=\"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\"/><path d=\"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\"/><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"/></svg>',\n users:\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/>',\n // Couriers. The back-office and the courier-facing screens both name a rider, and every Belvigo\n // surface that does should draw the same one.\n bike: '<circle cx=\"18.5\" cy=\"17.5\" r=\"3.5\"/><circle cx=\"5.5\" cy=\"17.5\" r=\"3.5\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><path d=\"M12 17.5V14l-3-3 4-3 2 3h2\"/>',\n 'building-2':\n '<path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\"/><path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\"/><path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\"/><path d=\"M10 6h4\"/><path d=\"M10 10h4\"/><path d=\"M10 14h4\"/><path d=\"M10 18h4\"/>',\n package:\n '<path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\"/><path d=\"M12 22V12\"/><polyline points=\"3.29 7 12 12 20.71 7\"/><path d=\"m7.5 4.27 9 5.15\"/>',\n 'package-plus':\n '<path d=\"M16 16h6\"/><path d=\"M19 13v6\"/><path d=\"M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0\"/><path d=\"m7.5 4.27 9 5.15\"/><polyline points=\"3.29 7 12 12 20.71 7\"/><path d=\"M12 22V12\"/>',\n 'package-open':\n '<path d=\"M12 22v-9\"/><path d=\"M15.17 2.21a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.655 1.655 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z\"/><path d=\"M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13\"/><path d=\"M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36z\"/>',\n 'rotate-ccw':\n '<path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/><path d=\"M3 3v5h5\"/>',\n 'bar-chart-3':\n '<path d=\"M3 3v18h18\"/><path d=\"M18 17V9\"/><path d=\"M13 17V5\"/><path d=\"M8 17v-3\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n 'log-out':\n '<path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\"/>',\n 'panel-left-close':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/><path d=\"m16 15-3-3 3-3\"/>',\n 'panel-left-open':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/><path d=\"m14 9 3 3-3 3\"/>',\n 'panel-left':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/>',\n calendar:\n '<path d=\"M8 2v4\"/><path d=\"M16 2v4\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"/><path d=\"M3 10h18\"/>',\n 'chevron-right': '<path d=\"m9 18 6-6-6-6\"/>',\n 'chevron-left': '<path d=\"m15 18-6-6 6-6\"/>',\n 'chevron-down': '<path d=\"m6 9 6 6 6-6\"/>',\n // Stepper glyphs for sds-input-number: chevrons for the stacked spinner, plus/minus for the\n // horizontal/vertical layouts.\n 'chevron-up': '<path d=\"m18 15-6-6-6 6\"/>',\n plus: '<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n 'chevrons-left': '<path d=\"m11 17-5-5 5-5\"/><path d=\"m18 17-5-5 5-5\"/>',\n 'chevrons-right': '<path d=\"m6 17 5-5-5-5\"/><path d=\"m13 17 5-5-5-5\"/>',\n x: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n check: '<path d=\"M20 6 9 17l-5-5\"/>',\n 'alert-circle':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/>',\n copy: '<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>',\n type: '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\"/><line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\"/>',\n tag: '<path d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/>',\n ticket:\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\"/><path d=\"M13 5v2\"/><path d=\"M13 17v2\"/><path d=\"M13 11v2\"/>',\n square: '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>',\n 'square-check': '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"m9 12 2 2 4-4\"/>',\n 'circle-dot': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/>',\n 'circle-user':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662\"/>',\n 'layout-grid':\n '<rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/>',\n 'panels-top-left':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M9 21V9\"/>',\n 'panel-top': '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/>',\n 'rows-3':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/>',\n 'book-open':\n '<path d=\"M12 7v14\"/><path d=\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/>',\n palette:\n '<circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\"/><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z\"/>',\n bell: '<path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\"/><path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\"/>',\n phone:\n '<path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"/>',\n settings:\n '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n 'align-left': '<path d=\"M15 12H3\"/><path d=\"M17 18H3\"/><path d=\"M21 6H3\"/>',\n 'toggle-left':\n '<rect width=\"20\" height=\"12\" x=\"2\" y=\"6\" rx=\"6\" ry=\"6\"/><circle cx=\"8\" cy=\"12\" r=\"2\"/>',\n 'arrow-up': '<path d=\"m5 12 7-7 7 7\"/><path d=\"M12 19V5\"/>',\n 'arrow-down': '<path d=\"M12 5v14\"/><path d=\"m19 12-7 7-7-7\"/>',\n 'chevrons-up-down': '<path d=\"m7 15 5 5 5-5\"/><path d=\"m7 9 5-5 5 5\"/>',\n filter: '<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>',\n table:\n '<path d=\"M12 3v18\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/>',\n // Contactless ordering: every restaurant table gets its own QR code (Belvigo merchant nav).\n 'qr-code':\n '<rect width=\"5\" height=\"5\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"5\" height=\"5\" x=\"16\" y=\"3\" rx=\"1\"/><rect width=\"5\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\"/><path d=\"M21 16h-3a2 2 0 0 0-2 2v3\"/><path d=\"M21 21v.01\"/><path d=\"M12 7v3a2 2 0 0 1-2 2H7\"/><path d=\"M3 12h.01\"/><path d=\"M12 3h.01\"/><path d=\"M12 16v.01\"/><path d=\"M16 12h1\"/><path d=\"M21 12v.01\"/><path d=\"M12 21v-1\"/>',\n eye: '<path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n // Pairs with `eye` for password reveal. Without it a show/hide toggle has no second state to draw,\n // and aria-pressed alone leaves sighted users with no visible change.\n 'eye-off':\n '<path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><path d=\"m2 2 20 20\"/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"/>',\n user: '<path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>',\n 'check-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/>',\n 'arrows-clockwise':\n '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/>',\n menu: '<line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\"/><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/><line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\"/>',\n 'file-text':\n '<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/><path d=\"M10 9H8\"/><path d=\"M16 13H8\"/><path d=\"M16 17H8\"/>',\n hash: '<line x1=\"4\" x2=\"20\" y1=\"9\" y2=\"9\"/><line x1=\"4\" x2=\"20\" y1=\"15\" y2=\"15\"/><line x1=\"10\" x2=\"8\" y1=\"3\" y2=\"21\"/><line x1=\"16\" x2=\"14\" y1=\"3\" y2=\"21\"/>',\n 'map-pin':\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\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/>',\n inbox:\n '<polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\"/><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 'arrow-right': '<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>',\n 'refresh-cw':\n '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/>',\n 'loader-circle': '<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>',\n bug: '<path d=\"M12 20v-9\"/><path d=\"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\"/><path d=\"M14.12 3.88 16 2\"/><path d=\"M21 21a4 4 0 0 0-3.81-4\"/><path d=\"M21 5a4 4 0 0 1-3.55 3.97\"/><path d=\"M22 13h-4\"/><path d=\"M3 21a4 4 0 0 1 3.81-4\"/><path d=\"M3 5a4 4 0 0 0 3.55 3.97\"/><path d=\"M6 13H2\"/><path d=\"m8 2 1.88 1.88\"/><path d=\"M9 7.13V6a3 3 0 1 1 6 0v1.13\"/>',\n 'scroll-text':\n '<path d=\"M15 12h-5\"/><path d=\"M15 8h-5\"/><path d=\"M19 17V5a2 2 0 0 0-2-2H4\"/><path d=\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"/>',\n // Added for the dark/light switcher (sds-theme-toggle) and the command palette (sds-search-command).\n moon: '<path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/>',\n 'search-x':\n '<path d=\"m13.5 8.5-5 5\"/><path d=\"m8.5 8.5 5 5\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n command:\n '<path d=\"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3\"/>',\n sparkles:\n '<path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\"/><path d=\"M20 3v4\"/><path d=\"M22 5h-4\"/><path d=\"M4 17v2\"/><path d=\"M5 18H3\"/>',\n} as const;\n\nexport type SdsIconName = keyof typeof SDS_ICONS;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { SDS_ICONS, SdsIconName } from './icon-registry';\n\nexport type SdsIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\nconst SIZE_PX: Record<SdsIconSize, number> = { sm: 16, md: 20, lg: 24, xl: 32 };\n\n/** Accept a pixel number, a numeric string (\"18\"), or a size keyword (\"sm\"). */\nfunction toIconPx(value: number | string): number {\n if (typeof value === 'number') return value;\n const n = Number(value);\n return Number.isNaN(n) ? (SIZE_PX[value as SdsIconSize] ?? 20) : n;\n}\n\n/**\n * Inline SVG icon backed by a curated, dependency-free registry.\n *\n * @example\n * <sds-icon name=\"search\" />\n * <sds-icon name=\"home\" [size]=\"18\" />\n */\n@Component({\n selector: 'sds-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '',\n host: {\n class: 'sds-icon inline-flex shrink-0 items-center justify-center',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n '[innerHTML]': 'svg()',\n '[attr.aria-hidden]': '\"true\"',\n },\n})\nexport class SdsIcon {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Icon identifier from the registry. */\n readonly name = input.required<SdsIconName>();\n /** Square size: a pixel number, a numeric string, or a keyword (sm·md·lg·xl). */\n readonly size = input(20, { transform: toIconPx });\n /** Stroke width of the line icon. */\n readonly strokeWidth = input<number>(2);\n\n protected readonly svg = computed<SafeHtml>(() => {\n const inner = SDS_ICONS[this.name()] ?? '';\n const markup =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" ` +\n `width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"currentColor\" ` +\n `stroke-width=\"${this.strokeWidth()}\" stroke-linecap=\"round\" ` +\n `stroke-linejoin=\"round\">${inner}</svg>`;\n return this.sanitizer.bypassSecurityTrustHtml(markup);\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n isDevMode,\n} from '@angular/core';\n\nexport type SdsButtonVariant =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'ghost'\n | 'danger';\nexport type SdsButtonSize = 'sm' | 'md' | 'lg';\nexport type SdsButtonShape = 'control' | 'pill';\n\nconst BASE =\n 'inline-flex items-center justify-center gap-2 font-medium ' +\n 'transition-colors duration-150 select-none whitespace-nowrap cursor-pointer ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-surface focus-visible:ring-brand-500 ' +\n 'disabled:opacity-50 disabled:pointer-events-none';\n\n/**\n * Dark mode has its own fills. A monochrome brand's dark 600 step is a mid-dark grey: as a primary fill\n * it read as disabled, and at `disabled:opacity-50` the real disabled state looked the same. So the dark\n * primary is the inverted light fill (`ink` on `surface`); tertiary and ghost swap their black/brand-50\n * tints for white ones, which show on a dark surface.\n */\nconst VARIANTS: Record<SdsButtonVariant, string> = {\n primary:\n 'bg-brand-600 text-white shadow-sm hover:bg-brand-700 active:bg-brand-800 ' +\n 'dark:bg-ink dark:text-surface dark:hover:bg-ink/90 dark:active:bg-ink/80',\n secondary:\n 'bg-surface text-ink border border-border shadow-sm hover:bg-muted active:bg-brand-50',\n tertiary:\n 'bg-brand-50 text-brand-700 hover:bg-brand-100 active:bg-brand-200/70 ' +\n 'dark:bg-white/10 dark:text-ink dark:hover:bg-white/15 dark:active:bg-white/20',\n ghost:\n 'bg-transparent text-ink-soft hover:bg-black/5 active:bg-black/10 ' +\n 'dark:hover:bg-white/10 dark:active:bg-white/15',\n danger: 'bg-danger text-white shadow-sm hover:brightness-95 active:brightness-90',\n};\n\nconst SIZES: Record<SdsButtonSize, string> = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-5 text-base',\n};\n\nconst ICON_ONLY: Record<SdsButtonSize, string> = {\n sm: 'w-8 px-0',\n md: 'w-10 px-0',\n lg: 'w-12 px-0',\n};\n\n/**\n * Brand button. Project an <sds-icon sdsIconLeading/> or <sds-icon sdsIconTrailing/>\n * for icons, or set [iconOnly]=\"true\" for a square icon button.\n *\n * @example\n * <sds-button variant=\"primary\" (click)=\"save()\">Enregistrer</sds-button>\n */\n@Component({\n selector: 'sds-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n '[attr.aria-disabled]': '(disabled() || loading()) ? \"true\" : null',\n '[style.pointer-events]': '(disabled() || loading()) ? \"none\" : null',\n '(click)': 'onHostClick($event)',\n },\n template: `\n <button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [class]=\"classes()\"\n >\n @if (loading()) {\n <span class=\"sds-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content select=\"[sdsIconLeading]\" />\n }\n <ng-content />\n <ng-content select=\"[sdsIconTrailing]\" />\n </button>\n `,\n styles: `\n .sds-spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-right-color: transparent;\n border-radius: 9999px;\n animation: sds-spin 0.6s linear infinite;\n }\n @keyframes sds-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `,\n})\nexport class SdsButton {\n readonly variant = input<SdsButtonVariant>('primary');\n readonly size = input<SdsButtonSize>('md');\n\n /**\n * `pill` fully rounds the button. It is the shape a consumer-facing surface tends to want for its\n * primary action, and the same axis {@link SdsInput} exposes — a design system with pill inputs and\n * no pill buttons would force any app that wants one back onto hand-rolled classes for its single\n * most important control.\n */\n readonly shape = input<SdsButtonShape>('control');\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n /** Full-width button. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Square icon-only button (provide [ariaLabel] for accessibility). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n\n constructor() {\n // Dev-only guard: icon-only buttons need an explicit accessible name\n // (the projected icon is aria-hidden, so there is no other source).\n if (isDevMode()) {\n effect(() => {\n if (this.iconOnly() && !this.ariaLabel()) {\n console.warn(\n 'sds-button: icon-only buttons require [ariaLabel] for an accessible name.',\n );\n }\n });\n }\n }\n\n /** Block the documented host-bound (click)/routerLink when inert. */\n protected onHostClick(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n }\n\n protected readonly hostClass = computed(() =>\n this.block() ? 'flex w-full' : 'inline-flex',\n );\n\n protected readonly classes = computed(() => {\n const size = this.size();\n return [\n BASE,\n this.shape() === 'pill' ? 'rounded-full' : 'rounded-control',\n VARIANTS[this.variant()],\n SIZES[size],\n this.iconOnly() ? ICON_ONLY[size] : '',\n this.block() ? 'w-full' : '',\n ]\n .filter(Boolean)\n .join(' ');\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsInputSize = 'sm' | 'md' | 'lg';\nexport type SdsInputAppearance = 'default' | 'filled' | 'on-brand';\nexport type SdsInputShape = 'control' | 'pill';\nexport type SdsInputType =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'search'\n | 'url';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsInputSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\n/**\n * Text input with label, hint/error, optional leading/trailing icons and a\n * clear button. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)]. The `on-brand` appearance is tuned for dark surfaces (e.g. the\n * sidebar search field).\n */\n@Component({\n selector: 'sds-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n styles: `\n /*\n * Chrome paints an opaque autofill background on the INPUT element. This input is deliberately\n * bg-transparent inside a themed wrapper that owns the field's background, border and radius — so\n * the autofill paint lands as a square block sitting inside the field's rounded, coloured box,\n * and on a filled or on-brand field it is a differently-coloured block at that.\n *\n * The long transition delay is the standard way to suppress it: the UA sets the background\n * through an internal rule no stylesheet can override, but it is still a transition-able\n * property, so deferring the transition indefinitely means it is never painted. The field stays\n * autofilled and the password manager still works — only the paint is suppressed.\n *\n * -webkit-text-fill-color keeps the VALUE readable, since the UA also forces a text colour to\n * match the background it just painted.\n */\n input:-webkit-autofill,\n input:-webkit-autofill:hover,\n input:-webkit-autofill:focus,\n input:-webkit-autofill:active {\n transition: background-color 100000s ease-in-out 0s;\n -webkit-text-fill-color: currentColor;\n caret-color: currentColor;\n }\n `,\n template: `\n @if (label()) {\n <label\n [for]=\"inputId\"\n class=\"mb-1.5 block text-sm font-medium\"\n [class]=\"onBrand() ? 'text-white/90' : 'text-ink'\"\n >\n {{ label() }}\n </label>\n }\n\n <div\n class=\"relative flex items-center border transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n @if (leadingIcon()) {\n <!-- A pill needs its icon further in: on a fully-rounded field an icon at left-3 sits over\n the curve rather than inside the field. -->\n <sds-icon\n [name]=\"leadingIcon()!\"\n [size]=\"18\"\n class=\"pointer-events-none absolute opacity-70\"\n [class]=\"pill() ? 'left-4' : 'left-3'\"\n />\n }\n\n <input\n [id]=\"inputId\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"value()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.maxlength]=\"maxLength() || null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n class=\"w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed\n [&::-webkit-search-cancel-button]:appearance-none\n [&::-webkit-search-decoration]:appearance-none\"\n [class]=\"fieldPadding()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n\n @if (clearable() && value() && !isDisabled()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-2.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:opacity-100 hover:bg-black/5\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n } @else if (trailingAction()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"trailingActionLabel() || null\"\n [attr.aria-pressed]=\"trailingActionPressed()\"\n [attr.aria-controls]=\"inputId\"\n class=\"absolute right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full\n opacity-70 hover:opacity-100 hover:bg-black/5\"\n (click)=\"trailingActionClick.emit()\"\n >\n <sds-icon [name]=\"trailingAction()!\" [size]=\"18\" />\n </button>\n } @else if (trailingIcon()) {\n <sds-icon\n [name]=\"trailingIcon()!\"\n [size]=\"18\"\n class=\"pointer-events-none absolute right-3 opacity-70\"\n />\n }\n </div>\n\n @if (error()) {\n <p [id]=\"inputId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p\n [id]=\"inputId + '-hint'\"\n class=\"mt-1.5 text-xs\"\n [class]=\"onBrand() ? 'text-white/60' : 'text-ink-faint'\"\n >\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsInput implements ControlValueAccessor {\n readonly inputId = `sds-input-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n /**\n * `search` is the semantically right type for a search field, and the template strips the WebKit\n * search decorations that come with it. Without that, a `search` field with {@link clearable} draws\n * TWO clear buttons — the component's and the browser's own, which no stylesheet can reach and which\n * sits outside the field's own padding.\n */\n readonly type = input<SdsInputType>('text');\n readonly size = input<SdsInputSize>('md');\n /**\n * `filled` is a borderless field on a muted ground, for a search box that has to sit inside a page\n * rather than announce itself as a form control — a storefront's search pill above all.\n * `on-brand` is the same field tuned for a dark surface.\n */\n readonly appearance = input<SdsInputAppearance>('default');\n\n /**\n * `pill` fully rounds the field. Separate from {@link appearance} on purpose: a bordered pill and a\n * filled box are both real designs, and folding the two axes into one enum would forbid half of them.\n */\n readonly shape = input<SdsInputShape>('control');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n\n /**\n * The native `autocomplete` token (`name`, `tel`, `email`, `new-password`, `one-time-code`…). Empty\n * leaves the browser's default. Checkout and sign-up fields need it: browsers autofill from it, and\n * password managers only offer a generated password for `new-password`.\n */\n readonly autocomplete = input<string>('');\n\n /** Hard character cap on the native field; 0 means no limit. */\n readonly maxLength = input(0, { transform: numberAttribute });\n\n /**\n * Accessible name for the clear button. French default so existing consumers are unchanged, but an\n * app serving more than one language MUST translate it — it is an icon-only control, so this string\n * is its only name.\n */\n readonly clearLabel = input<string>('Effacer');\n readonly leadingIcon = input<SdsIconName | null>(null);\n readonly trailingIcon = input<SdsIconName | null>(null);\n\n /**\n * A CLICKABLE trailing icon, for the affordances that belong to the field itself — password reveal\n * above all. Distinct from {@link trailingIcon}, which is decorative and explicitly\n * `pointer-events-none`; a consumer who needed a working control previously had to abandon\n * `sds-input` and rebuild the whole field, losing the label/error/aria wiring with it.\n *\n * Always pair it with {@link trailingActionLabel} — an icon-only button with no accessible name is\n * unusable by a screen reader. For a toggle, also bind {@link trailingActionPressed}.\n */\n readonly trailingAction = input<SdsIconName | null>(null);\n\n /** Accessible name for {@link trailingAction}. Translate it in the consuming app. */\n readonly trailingActionLabel = input<string>('');\n\n /** `aria-pressed` for a toggling action (e.g. show/hide password). Null renders no attribute. */\n readonly trailingActionPressed = input<boolean | null>(null);\n\n readonly trailingActionClick = output<void>();\n\n /** Current value (driven by CVA + user input). */\n protected readonly value = signal('');\n private readonly cvaDisabled = signal(false);\n\n protected readonly onBrand = computed(() => this.appearance() === 'on-brand');\n protected readonly filled = computed(() => this.appearance() === 'filled');\n protected readonly pill = computed(() => this.shape() === 'pill');\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.inputId}-err`;\n if (this.hint()) return `${this.inputId}-hint`;\n return null;\n });\n\n protected readonly fieldPadding = computed(() => {\n const inset = this.pill() ? 'pl-11' : 'pl-10';\n const bare = this.pill() ? 'pl-5' : 'pl-3.5';\n const left = this.leadingIcon() ? inset : bare;\n const right =\n this.trailingIcon() || this.clearable() || this.trailingAction()\n ? 'pr-10'\n : this.pill()\n ? 'pr-5'\n : 'pr-3.5';\n return `${left} ${right}`;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()], this.pill() ? 'rounded-full' : 'rounded-control'];\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n if (this.filled()) {\n // border-transparent, not border-0: the border box is what keeps a filled field the same height\n // as a bordered one, so the two sit level when a toolbar mixes them.\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n } else if (this.onBrand()) {\n parts.push('bg-white/10 text-white');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'border-white/15 focus-within:border-white/40 focus-within:ring-2 focus-within:ring-white/20',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n }\n return parts.join(' ');\n });\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).value;\n this.value.set(next);\n this.onChange(next);\n }\n\n protected clear(): void {\n this.value.set('');\n this.onChange('');\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsInputNumberSize = 'sm' | 'md' | 'lg';\nexport type SdsInputNumberAppearance = 'default' | 'filled';\n\n/**\n * Formatting behaviour, backed by `Intl.NumberFormat`:\n * - `decimal` — a plain grouped number (`42 723`).\n * - `currency` — a monetary amount; pair with {@link SdsInputNumber.currency} (ISO 4217).\n *\n * For percentages, units or any other affix, use {@link SdsInputNumber.prefix} /\n * {@link SdsInputNumber.suffix} on top of `decimal` — the stored value then stays the plain magnitude.\n */\nexport type SdsInputNumberMode = 'decimal' | 'currency';\n\n/** How the currency is shown in `currency` mode — a symbol (€), the ISO code (EUR) or the name (euros). */\nexport type SdsInputNumberCurrencyDisplay = 'symbol' | 'code' | 'name';\n\n/**\n * Placement of the increment/decrement spinner buttons:\n * - `stacked` — a two-button column at the trailing edge (chevrons).\n * - `horizontal` — a minus button before and a plus button after the field.\n * - `vertical` — a plus button above and a minus button below the field.\n */\nexport type SdsInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical';\n\nlet nextId = 0;\n\nconst HEIGHTS: Record<SdsInputNumberSize, string> = {\n sm: 'h-9',\n md: 'h-10',\n lg: 'h-12',\n};\n\nconst TEXT: Record<SdsInputNumberSize, string> = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n};\n\n/** The numeric fragments pulled out of a partially-typed, formatted string. */\ninterface Parsed {\n negative: boolean;\n intDigits: string;\n fracDigits: string;\n /** The user has typed the decimal separator (even if no fraction digits follow yet). */\n hadDecimal: boolean;\n}\n\n/**\n * Numeric input with locale-aware formatting, optional currency, prefix/suffix affixes, min/max/step\n * boundaries and spinner buttons — the design-system counterpart of PrimeNG's `InputNumber`.\n *\n * The value is a `number | null` bound through ControlValueAccessor, so it works with reactive forms\n * or `[(ngModel)]`: `<sds-input-number [(ngModel)]=\"amount\" mode=\"currency\" currency=\"EUR\" />`.\n *\n * The field formats **live as you type**: the currency symbol, grouping separators and prefix/suffix\n * stay visible on every keystroke, and the caret is kept where it belongs. The value is clamped to\n * {@link min}/{@link max} on blur and on every spinner step; ArrowUp / ArrowDown also step it.\n */\n@Component({\n selector: 'sds-input-number',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsInputNumber),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"inputId\" class=\"mb-1.5 block text-sm font-medium text-ink\">{{ label() }}</label>\n }\n\n <div class=\"relative border transition-colors\" [class]=\"wrapperClasses()\">\n <!-- Horizontal: minus before the field. Vertical: plus above it. -->\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"border-r\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"16\" />\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"w-full border-b\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"16\" />\n </button>\n }\n\n <div class=\"relative flex min-w-0 flex-1 items-center\" [class]=\"fieldCellClasses()\">\n <input\n #field\n [id]=\"inputId\"\n type=\"text\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n class=\"w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n [class]=\"inputClasses()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n @if (clearVisible()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:bg-black/5 hover:opacity-100\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n </div>\n\n <!-- Horizontal: plus after the field. Vertical: minus below it. -->\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"border-l\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"16\" />\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"w-full border-t\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"16\" />\n </button>\n }\n\n <!-- Stacked: a chevron column at the trailing edge. -->\n @if (showButtons() && buttonLayout() === 'stacked') {\n <div class=\"flex w-9 shrink-0 flex-col divide-y divide-border border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"min-h-0 flex-1\"\n [class]=\"stackedButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"14\" />\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"min-h-0 flex-1\"\n [class]=\"stackedButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"14\" />\n </button>\n </div>\n }\n </div>\n\n @if (error()) {\n <p [id]=\"inputId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n } @else if (hint()) {\n <p [id]=\"inputId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsInputNumber implements ControlValueAccessor {\n readonly inputId = `sds-input-number-${nextId++}`;\n\n private readonly fieldRef = viewChild<ElementRef<HTMLInputElement>>('field');\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n\n readonly size = input<SdsInputNumberSize>('md');\n /** `filled` is a borderless field on a muted ground; `default` is the bordered white field. */\n readonly appearance = input<SdsInputNumberAppearance>('default');\n\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Read-only: the value is shown and selectable but cannot be typed or stepped. */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n // --- Formatting -----------------------------------------------------------\n readonly mode = input<SdsInputNumberMode>('decimal');\n /** BCP 47 locale for grouping/decimal symbols (e.g. `fr-FR`). Empty follows the runtime locale. */\n readonly locale = input<string>('');\n /** ISO 4217 code, required when {@link mode} is `currency` (e.g. `EUR`, `USD`). */\n readonly currency = input<string>('');\n readonly currencyDisplay = input<SdsInputNumberCurrencyDisplay>('symbol');\n /** Thousands/grouping separators. */\n readonly useGrouping = input(true, { transform: booleanAttribute });\n readonly minFractionDigits = input<number | null>(null);\n readonly maxFractionDigits = input<number | null>(null);\n /** Text shown before the value (e.g. `↑ `). */\n readonly prefix = input<string>('');\n /** Text shown after the value (e.g. ` kg`, `%`). */\n readonly suffix = input<string>('');\n\n // --- Boundaries & spinner -------------------------------------------------\n readonly min = input<number | null>(null);\n readonly max = input<number | null>(null);\n readonly step = input(1, { transform: numberAttribute });\n /** Show the increment/decrement spinner buttons. */\n readonly showButtons = input(false, { transform: booleanAttribute });\n readonly buttonLayout = input<SdsInputNumberButtonLayout>('stacked');\n /** Override the increment button icon (defaults: chevron-up when stacked, plus otherwise). */\n readonly incrementIcon = input<SdsIconName | null>(null);\n /** Override the decrement button icon (defaults: chevron-down when stacked, minus otherwise). */\n readonly decrementIcon = input<SdsIconName | null>(null);\n /** Allow an empty (null) value. When false, blurring an empty field falls back to {@link min} or 0. */\n readonly allowEmpty = input(true, { transform: booleanAttribute });\n\n readonly clearable = input(false, { transform: booleanAttribute });\n /**\n * Accessible names for the icon-only controls. French defaults so existing consumers are unchanged;\n * translate them in a multi-language app.\n */\n readonly clearLabel = input<string>('Effacer');\n readonly incrementLabel = input<string>('Augmenter');\n readonly decrementLabel = input<string>('Diminuer');\n\n /** The committed numeric value (driven by CVA + user input). */\n protected readonly value = signal<number | null>(null);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.inputId}-err`;\n if (this.hint()) return `${this.inputId}-hint`;\n return null;\n });\n\n protected readonly clearVisible = computed(\n () => this.clearable() && this.value() !== null && !this.isDisabled() && !this.readonly(),\n );\n\n protected readonly incrementIconName = computed<SdsIconName>(\n () => this.incrementIcon() ?? (this.buttonLayout() === 'stacked' ? 'chevron-up' : 'plus'),\n );\n protected readonly decrementIconName = computed<SdsIconName>(\n () => this.decrementIcon() ?? (this.buttonLayout() === 'stacked' ? 'chevron-down' : 'minus'),\n );\n\n protected readonly canIncrement = computed(() => {\n if (this.isDisabled() || this.readonly()) return false;\n const max = this.max();\n return max === null || (this.value() ?? this.min() ?? 0) < max;\n });\n protected readonly canDecrement = computed(() => {\n if (this.isDisabled() || this.readonly()) return false;\n const min = this.min();\n return min === null || (this.value() ?? min ?? 0) > min;\n });\n\n /** Locale grouping/decimal separators, derived from Intl so parsing matches formatting. */\n private readonly separators = computed(() => {\n const sample = new Intl.NumberFormat(this.locale() || undefined, {\n useGrouping: true,\n }).formatToParts(1234567.8);\n return {\n group: sample.find((p) => p.type === 'group')?.value ?? ',',\n decimal: sample.find((p) => p.type === 'decimal')?.value ?? '.',\n };\n });\n\n /** Base Intl options (style/currency/grouping) without any fraction-digit constraints. */\n private baseOptions(): Intl.NumberFormatOptions {\n const opts: Intl.NumberFormatOptions = { useGrouping: this.useGrouping() };\n if (this.mode() === 'currency') {\n opts.style = 'currency';\n opts.currency = this.currency() || 'USD';\n opts.currencyDisplay = this.currencyDisplay();\n } else {\n opts.style = 'decimal';\n }\n return opts;\n }\n\n private readonly committedOptions = computed<Intl.NumberFormatOptions>(() => {\n const opts = this.baseOptions();\n const min = this.minFractionDigits();\n const max = this.maxFractionDigits();\n if (min !== null) opts.minimumFractionDigits = min;\n if (max !== null) opts.maximumFractionDigits = min !== null ? Math.max(max, min) : max;\n return opts;\n });\n\n /** The most fraction digits the field will keep — the resolved Intl maximum (2 for USD, 0 for JPY…). */\n private readonly maxFrac = computed(() => {\n const fallback = this.maxFractionDigits() ?? (this.mode() === 'currency' ? 2 : 3);\n try {\n const resolved = new Intl.NumberFormat(\n this.locale() || undefined,\n this.committedOptions(),\n ).resolvedOptions().maximumFractionDigits;\n return resolved ?? fallback;\n } catch {\n return fallback;\n }\n });\n\n protected readonly wrapperClasses = computed(() => {\n const vertical = this.buttonLayout() === 'vertical' && this.showButtons();\n const parts = [\n 'overflow-hidden rounded-control',\n vertical ? 'flex flex-col' : `flex items-stretch ${HEIGHTS[this.size()]}`,\n ];\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n if (this.appearance() === 'filled') {\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n }\n return parts.join(' ');\n });\n\n protected readonly fieldCellClasses = computed(() =>\n this.buttonLayout() === 'vertical' && this.showButtons() ? HEIGHTS[this.size()] : 'h-full',\n );\n\n protected readonly inputClasses = computed(() => {\n const parts = [TEXT[this.size()], 'pl-3.5', this.clearVisible() ? 'pr-9' : 'pr-3.5'];\n if (this.showButtons() && this.buttonLayout() !== 'stacked') parts.push('text-center');\n return parts.join(' ');\n });\n\n private readonly buttonBase =\n 'inline-flex shrink-0 items-center justify-center text-ink-soft transition-colors ' +\n 'hover:bg-muted hover:text-ink disabled:cursor-not-allowed disabled:opacity-40 select-none';\n\n protected readonly edgeButtonClasses = computed(() =>\n this.buttonLayout() === 'vertical'\n ? `${this.buttonBase} ${HEIGHTS[this.size()]} border-border`\n : `${this.buttonBase} w-10 border-border`,\n );\n protected readonly stackedButtonClasses = computed(() => this.buttonBase);\n\n constructor() {\n // Reflect the committed value into the field whenever it — or a formatting input — changes from\n // OUTSIDE typing (initial render, writeValue, a spin while blurred, a currency/locale switch).\n // While the field is the active element the input handler owns the DOM value and its caret, so this\n // stands down: gating on the live `document.activeElement` (not a signal) is immune to focus-event\n // timing, which is what makes live formatting safe.\n effect(() => {\n const el = this.fieldRef()?.nativeElement;\n const v = this.value();\n // Touch the formatting inputs so a currency/locale/affix change repaints a blurred field.\n this.committedOptions();\n this.prefix();\n this.suffix();\n if (!el || this.isActive(el)) return;\n el.value = v === null ? '' : this.format(v);\n });\n }\n\n private isActive(el: HTMLInputElement): boolean {\n return typeof document !== 'undefined' && document.activeElement === el;\n }\n\n /** Paint the committed value into the field imperatively (used by spin/clear/blur). */\n private paintCommitted(): void {\n const el = this.fieldRef()?.nativeElement;\n if (!el) return;\n const v = this.value();\n el.value = v === null ? '' : this.format(v);\n }\n\n // --- Formatting / parsing helpers -----------------------------------------\n /** Format a committed value with the configured min/max fraction digits (used at rest and on blur). */\n private format(n: number): string {\n try {\n const body = new Intl.NumberFormat(this.locale() || undefined, this.committedOptions()).format(n);\n return `${this.prefix()}${body}${this.suffix()}`;\n } catch {\n return `${this.prefix()}${n}${this.suffix()}`;\n }\n }\n\n /**\n * Format a partially-typed value, keeping exactly the fraction digits the user has entered (so\n * trailing zeros and a lone decimal separator survive) while still grouping the integer part and\n * showing the currency symbol / affixes.\n */\n private formatLive(p: Parsed): string {\n const locale = this.locale() || undefined;\n const fracCount = p.fracDigits.length;\n const num = this.toNumber(p) ?? 0;\n\n if (fracCount > 0 || !p.hadDecimal) {\n try {\n const body = new Intl.NumberFormat(locale, {\n ...this.baseOptions(),\n minimumFractionDigits: fracCount,\n maximumFractionDigits: fracCount,\n }).format(num);\n return `${this.prefix()}${body}${this.suffix()}`;\n } catch {\n return `${this.prefix()}${num}${this.suffix()}`;\n }\n }\n\n // A lone decimal separator was just typed (\"1234,\"): format the integer, then splice the separator\n // in right after the integer digits — which, for a trailing-symbol currency, is NOT the string end.\n const dec = this.separators().decimal;\n let out = '';\n let inserted = false;\n try {\n const parts = new Intl.NumberFormat(locale, {\n ...this.baseOptions(),\n maximumFractionDigits: 0,\n }).formatToParts(num);\n parts.forEach((part, i) => {\n out += part.value;\n const here = part.type === 'integer' || part.type === 'group';\n const next = parts[i + 1];\n const nextHere = next && (next.type === 'integer' || next.type === 'group');\n if (here && !nextHere && !inserted) {\n out += dec;\n inserted = true;\n }\n });\n } catch {\n out = `${num}${dec}`;\n inserted = true;\n }\n if (!inserted) out += dec;\n return `${this.prefix()}${out}${this.suffix()}`;\n }\n\n private toNumber(p: Parsed): number | null {\n const s = `${p.negative ? '-' : ''}${p.intDigits || '0'}${p.fracDigits ? '.' + p.fracDigits : ''}`;\n const n = Number(s);\n return Number.isFinite(n) ? n : null;\n }\n\n /** Pull the sign / integer / fraction fragments out of a formatted, partially-typed string. */\n private parseInput(raw: string): Parsed {\n const { group, decimal } = this.separators();\n let t = raw;\n const prefix = this.prefix();\n const suffix = this.suffix();\n if (prefix && t.startsWith(prefix)) t = t.slice(prefix.length);\n if (suffix && t.endsWith(suffix)) t = t.slice(0, t.length - suffix.length);\n if (group) t = t.split(group).join('');\n if (decimal && decimal !== '.') t = t.split(decimal).join('.');\n t = t.replace(/[^0-9.\\-]/g, '');\n\n const negative = t.includes('-');\n t = t.replace(/-/g, '');\n const dot = t.indexOf('.');\n const hadDecimal = dot !== -1 && this.maxFrac() > 0;\n let intDigits = (hadDecimal ? t.slice(0, dot) : t.replace(/\\./g, '')).replace(/\\D/g, '');\n let fracDigits = hadDecimal ? t.slice(dot + 1).replace(/\\D/g, '') : '';\n // Strip a leading run of zeros (\"007\" -> \"7\") but keep a lone \"0\".\n intDigits = intDigits.replace(/^0+(?=\\d)/, '');\n fracDigits = fracDigits.slice(0, this.maxFrac());\n return { negative, intDigits, fracDigits, hadDecimal };\n }\n\n /** Characters that \"carry meaning\" for caret placement (digits, minus, the decimal separator). */\n private isSignificant(ch: string): boolean {\n return (ch >= '0' && ch <= '9') || ch === '-' || ch === this.separators().decimal;\n }\n\n private significantBefore(s: string, upto: number): number {\n let n = 0;\n for (let i = 0; i < upto && i < s.length; i++) if (this.isSignificant(s[i])) n++;\n return n;\n }\n\n /** The caret index in `formatted` that sits just after `target` significant characters. */\n private caretAfter(formatted: string, target: number): number {\n if (target <= 0) {\n for (let i = 0; i < formatted.length; i++) if (this.isSignificant(formatted[i])) return i;\n return formatted.length;\n }\n let n = 0;\n for (let i = 0; i < formatted.length; i++) {\n if (this.isSignificant(formatted[i]) && ++n === target) return i + 1;\n }\n return formatted.length;\n }\n\n private clamp(n: number): number {\n const min = this.min();\n const max = this.max();\n if (min !== null && n < min) n = min;\n if (max !== null && n > max) n = max;\n return n;\n }\n\n /** Trim binary-float drift (0.1 + 0.2) back to a clean decimal. */\n private tidy(n: number): number {\n return Math.round(n * 1e10) / 1e10;\n }\n\n // --- Interaction ----------------------------------------------------------\n protected onInput(event: Event): void {\n const el = event.target as HTMLInputElement;\n const raw = el.value;\n const caret = el.selectionStart ?? raw.length;\n const target = this.significantBefore(raw, caret);\n\n const parsed = this.parseInput(raw);\n if (parsed.intDigits === '' && parsed.fracDigits === '' && !parsed.hadDecimal) {\n // Nothing numeric left — allow a lone \"-\" mid-entry, otherwise empty.\n const text = parsed.negative ? '-' : '';\n el.value = text;\n el.setSelectionRange(text.length, text.length);\n this.value.set(null);\n this.onChange(null);\n return;\n }\n\n const num = this.toNumber(parsed);\n const formatted = this.formatLive(parsed);\n el.value = formatted;\n const next = this.caretAfter(formatted, target);\n el.setSelectionRange(next, next);\n\n this.value.set(num);\n this.onChange(num);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.spin(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.spin(-1);\n }\n }\n\n protected onBlur(): void {\n let v = this.value();\n if (v === null && !this.allowEmpty()) v = this.min() ?? 0;\n if (v !== null) v = this.clamp(this.tidy(v));\n // Re-render through the committed formatter (applies min-fraction padding + clamping).\n this.value.set(v);\n this.paintCommitted();\n this.onChange(v);\n this.onTouched();\n }\n\n protected spin(direction: 1 | -1): void {\n if (this.isDisabled() || this.readonly()) return;\n const base = this.value() ?? this.min() ?? 0;\n const nextValue = this.clamp(this.tidy(base + direction * this.step()));\n this.value.set(nextValue);\n this.onChange(nextValue);\n this.onTouched();\n // Paint the stepped value ourselves — the effect stands down while the field is focused.\n const el = this.fieldRef()?.nativeElement;\n if (el) {\n const text = this.format(nextValue);\n el.value = text;\n if (this.isActive(el)) el.setSelectionRange(text.length, text.length);\n }\n }\n\n protected clear(): void {\n this.value.set(null);\n this.onChange(null);\n this.onTouched();\n const el = this.fieldRef()?.nativeElement;\n if (el) el.value = '';\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: number | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: number | null): void {\n this.value.set(typeof value === 'number' && Number.isFinite(value) ? value : null);\n }\n registerOnChange(fn: (value: number | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** A translatable string held per language code — e.g. `{ fr: 'Titre', nl: 'Titel' }`. */\nexport type SdsLocalizedValue = Record<string, string>;\n\nexport type SdsLocalizedInputSize = 'sm' | 'md' | 'lg';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsLocalizedInputSize, string> = {\n sm: 'min-h-9 text-sm',\n md: 'min-h-10 text-sm',\n lg: 'min-h-12 text-base',\n};\n\n/**\n * One language-aware text field for editing a translated value (a {@link SdsLocalizedValue} — a title,\n * label or description in several languages). Only one language is edited at a time; a compact switcher\n * sitting **inside the field** flips which translation you are editing, and a dot marks the languages that\n * already have content, so a partially-translated value is obvious at a glance.\n *\n * The active language defaults to {@link currentLanguage} when it is one of {@link languages}, otherwise the\n * first accepted language — so the field \"opens on the language you are working in\". Empty translations are\n * pruned from the emitted value, keeping the stored map clean.\n *\n * Implements ControlValueAccessor over the map — use with reactive forms or `[(ngModel)]`:\n * `<sds-localized-input [languages]=\"['fr','nl','en']\" [(ngModel)]=\"title\" />`.\n */\n@Component({\n selector: 'sds-localized-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsLocalizedInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"inputId\" class=\"mb-1.5 block text-sm font-medium text-ink\">{{ label() }}</label>\n }\n\n <div\n class=\"relative flex items-stretch rounded-control border bg-surface text-ink transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n @if (multiline()) {\n <textarea\n [id]=\"inputId\"\n [rows]=\"rows()\"\n [placeholder]=\"fieldPlaceholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"current()\"\n (input)=\"write($event)\"\n (blur)=\"onTouched()\"\n class=\"min-w-0 flex-1 resize-y bg-transparent px-3.5 py-2 outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n ></textarea>\n } @else {\n <input\n [id]=\"inputId\"\n [placeholder]=\"fieldPlaceholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"current()\"\n (input)=\"write($event)\"\n (blur)=\"onTouched()\"\n class=\"min-w-0 flex-1 bg-transparent px-3.5 outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n />\n }\n\n @if (languages().length > 1) {\n <div\n class=\"flex shrink-0 items-center gap-0.5 self-start p-1\"\n [class]=\"multiline() ? '' : 'self-center'\"\n role=\"tablist\"\n [attr.aria-label]=\"languageSwitcherLabel()\"\n >\n @for (lang of languages(); track lang) {\n <button\n type=\"button\"\n role=\"tab\"\n tabindex=\"-1\"\n [disabled]=\"isDisabled()\"\n (click)=\"select(lang)\"\n [attr.aria-selected]=\"activeLang() === lang\"\n [attr.title]=\"lang.toUpperCase() + (filled(lang) ? '' : ' — ' + untranslatedLabel())\"\n class=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-[11px] font-semibold uppercase leading-none transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n [class]=\"\n activeLang() === lang\n ? 'bg-brand-50 text-brand-700'\n : 'text-ink-faint hover:bg-muted hover:text-ink-soft'\n \"\n >\n {{ lang }}\n <span\n class=\"inline-block h-1 w-1 rounded-full\"\n [class]=\"filled(lang) ? 'bg-success' : 'bg-current/30'\"\n ></span>\n </button>\n }\n </div>\n }\n </div>\n\n @if (hint()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsLocalizedInput implements ControlValueAccessor {\n readonly inputId = `sds-localized-input-${nextId++}`;\n\n readonly label = input<string>('');\n readonly hint = input<string>('');\n readonly placeholder = input<string>('');\n\n /** The accepted language codes, in display order (e.g. `['fr','nl','en']`). */\n readonly languages = input<string[]>([]);\n\n /** Language to pre-select; used when it is one of {@link languages}, else the first accepted language. */\n readonly currentLanguage = input<string | null>(null);\n\n readonly multiline = input(false, { transform: booleanAttribute });\n readonly rows = input(3, { transform: numberAttribute });\n readonly size = input<SdsLocalizedInputSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Accessible name for the in-field language switcher, and the \"no translation yet\" title suffix on each\n * language button. French defaults so existing consumers are unchanged; translate them in a multi-language\n * app (the buttons are letter-only, so the title carries their meaning).\n */\n readonly languageSwitcherLabel = input<string>('Langue');\n readonly untranslatedLabel = input<string>('à traduire');\n\n private readonly valueMap = signal<SdsLocalizedValue>({});\n /** Language chosen via the switcher; null means \"follow currentLanguage / the first language\". */\n private readonly manual = signal<string | null>(null);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.isDisabled()\n ? 'border-border opacity-60 cursor-not-allowed'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n return parts.join(' ');\n });\n\n /** The language currently being edited. */\n protected readonly activeLang = computed(() => {\n const langs = this.languages();\n if (!langs.length) {\n return '';\n }\n const manual = this.manual();\n if (manual && langs.includes(manual)) {\n return manual;\n }\n const preferred = this.currentLanguage();\n return preferred && langs.includes(preferred) ? preferred : langs[0];\n });\n\n protected readonly current = computed(() => this.valueMap()[this.activeLang()] ?? '');\n\n protected filled(lang: string): boolean {\n const text = this.valueMap()[lang];\n return !!text && text.trim().length > 0;\n }\n\n protected fieldPlaceholder(): string {\n const base = this.placeholder();\n const lang = this.activeLang().toUpperCase();\n if (base) {\n return lang ? `${base} (${lang})` : base;\n }\n return lang ? `(${lang})` : '';\n }\n\n protected select(lang: string): void {\n this.manual.set(lang);\n this.onTouched();\n }\n\n protected write(event: Event): void {\n const lang = this.activeLang();\n if (!lang) {\n return;\n }\n const text = (event.target as HTMLInputElement | HTMLTextAreaElement).value;\n const next: SdsLocalizedValue = { ...this.valueMap() };\n if (text) {\n next[lang] = text;\n } else {\n delete next[lang];\n }\n this.valueMap.set(next);\n this.onChange(next);\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: SdsLocalizedValue) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: SdsLocalizedValue | null): void {\n this.valueMap.set(value ? { ...value } : {});\n }\n registerOnChange(fn: (value: SdsLocalizedValue) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nexport type SdsOtpInputSize = 'md' | 'lg';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsOtpInputSize, string> = {\n md: 'h-12 w-11 text-lg',\n lg: 'h-14 w-12 text-xl',\n};\n\n/**\n * A segmented one-time-code field: one box per character, for the short numeric codes emailed or\n * texted for sign-in and verification. Implements ControlValueAccessor — bind\n * `formControlName`/`[(ngModel)]`; the value is the concatenated string (e.g. `\"483920\"`), and\n * {@link completed} fires the moment every box is filled.\n *\n * <p>Only digits are accepted (`inputMode` is `numeric` by default). Typing auto-advances,\n * Backspace steps back and clears, the arrow keys move between boxes, and pasting a whole code\n * distributes it across the boxes from the focused one — so a user can paste `483920` into the\n * first box and have it land correctly.\n */\n@Component({\n selector: 'sds-otp-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsOtpInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [id]=\"groupId + '-label'\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div\n class=\"flex items-center gap-2\"\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? groupId + '-label' : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n >\n @for (i of indexes(); track i) {\n <input\n #cell\n type=\"text\"\n [attr.data-index]=\"i\"\n [inputMode]=\"inputMode()\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n [value]=\"charAt(i)\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"cellLabel() + ' ' + (i + 1)\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n class=\"bg-surface text-center font-semibold tabular-nums outline-none transition-colors\n disabled:cursor-not-allowed\"\n [class]=\"cellClasses()\"\n (input)=\"onInput($event, i)\"\n (keydown)=\"onKeydown($event, i)\"\n (paste)=\"onPaste($event, i)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onTouched()\"\n />\n }\n </div>\n\n @if (error()) {\n <p [id]=\"groupId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n } @else if (hint()) {\n <p [id]=\"groupId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsOtpInput implements ControlValueAccessor {\n readonly groupId = `sds-otp-${nextId++}`;\n\n /** How many boxes / characters the code has. */\n readonly length = input(6, { transform: numberAttribute });\n readonly label = input<string>('');\n /** Accessible name for the whole group when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsOtpInputSize>('md');\n /** `numeric` for digit codes (the default); `text` for alphanumeric codes. */\n readonly inputMode = input<'numeric' | 'text'>('numeric');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Focus the first box on first render. */\n readonly autoFocus = input(false, { transform: booleanAttribute });\n\n /**\n * Accessible name for an individual box, suffixed with its 1-based position (\"Digit 1\", \"Digit\n * 2\", …). French default so existing consumers are unchanged; translate it in an app serving more\n * than one language, since each box is an icon-less control whose only name this is.\n */\n readonly cellLabel = input<string>('Chiffre');\n\n /** Emitted with the full value the moment the last box is filled. */\n readonly completed = output<string>();\n\n private readonly cells = viewChildren<ElementRef<HTMLInputElement>>('cell');\n\n /** One entry per box; the source of truth, kept exactly {@link length} long. */\n private readonly chars = signal<string[]>([]);\n private readonly cvaDisabled = signal(false);\n\n protected readonly indexes = computed(() =>\n Array.from({ length: this.length() }, (_, i) => i),\n );\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.groupId}-err`;\n if (this.hint()) return `${this.groupId}-hint`;\n return null;\n });\n\n protected readonly cellClasses = computed(() => {\n const parts = ['rounded-control border', SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border text-ink focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60');\n return parts.join(' ');\n });\n\n constructor() {\n // Autofocus once the boxes are in the DOM. afterRenderEffect re-runs on signal reads, but the\n // guard keeps it to the first paint — refocusing on every value change would fight the user.\n let focused = false;\n afterRenderEffect(() => {\n if (this.autoFocus() && !focused && !this.isDisabled()) {\n this.cells()[0]?.nativeElement.focus();\n focused = true;\n }\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n // Programmatic set never emits — CVA writeValue must not call onChange.\n this.chars.set(this.spread(value ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n // --- events ---------------------------------------------------------------\n\n protected charAt(index: number): string {\n return this.chars()[index] ?? '';\n }\n\n protected onInput(event: Event, index: number): void {\n const el = event.target as HTMLInputElement;\n const raw = el.value;\n const digits = this.sanitize(raw);\n if (digits.length === 0) {\n if (raw.length === 0) {\n // Genuinely emptied (cut, or a deletion the keydown handler did not catch) — clear the box.\n this.setChar(index, '');\n } else {\n // A rejected character (letter, symbol) — reassert the box's real content, since the\n // [value] binding will not repaint an unchanged signal.\n el.value = this.charAt(index);\n }\n return;\n }\n if (digits.length > 1) {\n // Fast typing or an autofill dropped several characters into one box — spread them.\n this.fill(digits, index);\n return;\n }\n this.setChar(index, digits);\n this.focusIndex(index + 1);\n }\n\n protected onKeydown(event: KeyboardEvent, index: number): void {\n switch (event.key) {\n case 'Backspace':\n event.preventDefault();\n if (this.charAt(index)) {\n this.setChar(index, '');\n } else if (index > 0) {\n this.setChar(index - 1, '');\n this.focusIndex(index - 1);\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.focusIndex(index - 1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.focusIndex(index + 1);\n break;\n case 'Delete':\n event.preventDefault();\n this.setChar(index, '');\n break;\n default:\n break;\n }\n }\n\n protected onPaste(event: ClipboardEvent, index: number): void {\n const digits = this.sanitize(event.clipboardData?.getData('text') ?? '');\n if (!digits) return;\n event.preventDefault();\n this.fill(digits, index);\n }\n\n protected onFocus(event: FocusEvent): void {\n // Select the box's content so a keystroke overwrites rather than being rejected by maxlength.\n (event.target as HTMLInputElement).select();\n }\n\n // --- internals ------------------------------------------------------------\n\n private sanitize(raw: string): string {\n return this.inputMode() === 'numeric'\n ? raw.replace(/\\D/g, '')\n : raw.replace(/[^A-Za-z0-9]/g, '');\n }\n\n /** Normalize any input string into an array exactly {@link length} long. */\n private spread(raw: string): string[] {\n const cleaned = this.sanitize(raw).slice(0, this.length());\n return Array.from({ length: this.length() }, (_, i) => cleaned[i] ?? '');\n }\n\n private setChar(index: number, value: string): void {\n const next = this.normalized();\n next[index] = value;\n this.commit(next);\n }\n\n /** Write `digits` across the boxes starting at `start`, then focus the next empty box. */\n private fill(digits: string, start: number): void {\n const next = this.normalized();\n let cursor = start;\n for (const ch of digits) {\n if (cursor >= this.length()) break;\n next[cursor] = ch;\n cursor += 1;\n }\n this.commit(next);\n this.focusIndex(Math.min(cursor, this.length() - 1));\n }\n\n private commit(next: string[]): void {\n this.chars.set(next);\n const value = next.join('');\n this.onChange(value);\n if (next.every((c) => c !== '')) {\n this.completed.emit(value);\n }\n }\n\n /** The current boxes as a fresh, correctly-sized array to mutate. */\n private normalized(): string[] {\n const current = this.chars();\n return Array.from({ length: this.length() }, (_, i) => current[i] ?? '');\n }\n\n private focusIndex(index: number): void {\n const clamped = Math.max(0, Math.min(index, this.length() - 1));\n const cell = this.cells()[clamped]?.nativeElement;\n if (cell) {\n cell.focus();\n cell.select();\n }\n }\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nexport type SdsTextareaSize = 'sm' | 'md' | 'lg';\nexport type SdsTextareaResize = 'none' | 'vertical' | 'both';\nexport type SdsTextareaAppearance = 'default' | 'filled';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsTextareaSize, string> = {\n sm: 'text-sm px-3 py-2',\n md: 'text-sm px-3.5 py-2.5',\n lg: 'text-base px-4 py-3',\n};\n\n/**\n * Multi-line text field with label, hint/error, character counter and optional\n * auto-resize. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)].\n */\n@Component({\n selector: 'sds-textarea',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsTextarea),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <textarea\n #field\n [id]=\"fieldId\"\n [value]=\"value()\"\n [rows]=\"rows()\"\n [placeholder]=\"placeholder()\"\n [attr.maxlength]=\"maxLength() || null\"\n [readonly]=\"readonly() || null\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.resize]=\"autoResize() ? 'none' : resize()\"\n [class]=\"fieldClasses()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n @if (hasCounter()) {\n <div class=\"mt-1.5 flex items-start gap-2 text-xs\">\n @if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"flex-1 font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"flex-1 text-ink-faint\">\n {{ hint() }}\n </p>\n } @else {\n <span class=\"flex-1\"></span>\n }\n <span\n [id]=\"fieldId + '-count'\"\n aria-live=\"polite\"\n [attr.aria-label]=\"countLabel()\"\n class=\"shrink-0 tabular-nums text-ink-faint\"\n >\n {{ count() }}{{ maxLength() ? ' / ' + maxLength() : '' }}\n </span>\n </div>\n } @else if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsTextarea implements ControlValueAccessor {\n readonly fieldId = `sds-textarea-${nextId++}`;\n\n private readonly field =\n viewChild<ElementRef<HTMLTextAreaElement>>('field');\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsTextareaSize>('md');\n /**\n * `filled` is a borderless field on a muted ground — the textarea counterpart of `sds-input`'s\n * `filled`, so a form that uses filled inputs keeps one look down to its notes field.\n */\n readonly appearance = input<SdsTextareaAppearance>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Minimum visible rows. */\n readonly rows = input(3, { transform: numberAttribute });\n /** Grow the field to fit its content as the user types. */\n readonly autoResize = input(false, { transform: booleanAttribute });\n /** Hard character cap; 0 means no limit. */\n readonly maxLength = input(0, { transform: numberAttribute });\n /** Show a character counter row. */\n readonly showCount = input(false, { transform: booleanAttribute });\n readonly resize = input<SdsTextareaResize>('vertical');\n\n /** Current value (driven by CVA + user input). */\n protected readonly value = signal('');\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly count = computed(() => this.value().length);\n\n protected readonly hasCounter = computed(\n () => this.showCount() || this.maxLength() > 0,\n );\n\n /** Spoken description of the counter for assistive tech. */\n protected readonly countLabel = computed(() =>\n this.maxLength()\n ? `${this.count()} sur ${this.maxLength()} caractères utilisés`\n : `${this.count()} caractère(s)`,\n );\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.error()) ids.push(`${this.fieldId}-err`);\n else if (this.hint()) ids.push(`${this.fieldId}-hint`);\n if (this.hasCounter()) ids.push(`${this.fieldId}-count`);\n return ids.length ? ids.join(' ') : null;\n });\n\n protected readonly fieldClasses = computed(() => {\n const parts = [\n 'block w-full rounded-control border text-ink outline-none transition-colors placeholder:text-ink-faint',\n SIZES[this.size()],\n ];\n\n if (this.autoResize()) parts.push('overflow-hidden');\n\n if (this.appearance() === 'filled') {\n // border-transparent, not border-0, for the same reason as sds-input's filled: one box model.\n parts.push('bg-muted');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/30'\n : 'border-transparent focus:ring-2 focus:ring-brand-500/25',\n );\n } else {\n parts.push('bg-surface');\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n }\n\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n return parts.join(' ');\n });\n\n constructor() {\n // Drive auto-resize reactively from the value signal. This runs once after\n // the initial render and again whenever the value changes (user input or\n // programmatic writeValue), without accumulating one-shot render hooks.\n afterRenderEffect(() => {\n this.value();\n if (this.autoResize()) this.resizeToContent();\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n // Auto-resize is handled reactively by the afterRenderEffect in the\n // constructor, which re-runs whenever this signal changes.\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLTextAreaElement).value;\n this.value.set(next);\n this.onChange(next);\n if (this.autoResize()) this.resizeToContent();\n }\n\n private resizeToContent(): void {\n const el = this.field()?.nativeElement;\n if (!el) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n isDevMode,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsToggleSwitchSize = 'sm' | 'md' | 'lg';\n\nlet nextId = 0;\n\ninterface ToggleSizing {\n /** Track width/height. */\n track: string;\n /** Knob width/height. */\n knob: string;\n /** Knob translate distance when checked. */\n on: string;\n /** Icon size in pixels. */\n icon: number;\n}\n\nconst SIZES: Record<SdsToggleSwitchSize, ToggleSizing> = {\n sm: { track: 'h-5 w-9', knob: 'h-4 w-4', on: 'translate-x-4', icon: 11 },\n md: { track: 'h-6 w-11', knob: 'h-5 w-5', on: 'translate-x-5', icon: 13 },\n lg: { track: 'h-7 w-[3.4rem]', knob: 'h-6 w-6', on: 'translate-x-7', icon: 15 },\n};\n\n/**\n * On/off switch styled as a sliding toggle. Implements ControlValueAccessor —\n * use with reactive forms or [(ngModel)]. Supports an optional visible label,\n * custom `trueValue`/`falseValue`, and optional knob icons for the on/off\n * states.\n */\n@Component({\n selector: 'sds-toggle-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsToggleSwitch),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n <div class=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n [id]=\"fieldId\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() || null) : null\"\n [attr.aria-labelledby]=\"label() ? fieldId + '-label' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n class=\"relative inline-flex shrink-0 cursor-pointer items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-60\"\n [class]=\"trackClasses()\"\n (click)=\"toggle()\"\n (keydown.space)=\"onSpace($event)\"\n >\n <span\n class=\"pointer-events-none inline-flex items-center justify-center rounded-full shadow-sm transition-[transform,background-color]\"\n [class]=\"knobClasses()\"\n >\n @if (checked() && onIcon()) {\n <sds-icon\n [name]=\"onIcon()!\"\n [size]=\"sizing().icon\"\n class=\"text-brand-600 dark:text-ink\"\n />\n } @else if (!checked() && offIcon()) {\n <sds-icon\n [name]=\"offIcon()!\"\n [size]=\"sizing().icon\"\n class=\"text-ink-faint dark:text-surface\"\n />\n }\n </span>\n </button>\n\n @if (label()) {\n <span\n [id]=\"fieldId + '-label'\"\n class=\"select-none text-sm font-medium text-ink\"\n [class.cursor-pointer]=\"!isDisabled()\"\n [class.cursor-not-allowed]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n {{ label() }}\n </span>\n }\n </div>\n\n @if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsToggleSwitch implements ControlValueAccessor {\n readonly fieldId = `sds-toggle-switch-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly size = input<SdsToggleSwitchSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Value emitted/stored when the switch is on. */\n readonly trueValue = input<unknown>(true);\n /** Value emitted/stored when the switch is off. */\n readonly falseValue = input<unknown>(false);\n /** Icon shown on the knob when checked. */\n readonly onIcon = input<SdsIconName | null>(null);\n /** Icon shown on the knob when unchecked. */\n readonly offIcon = input<SdsIconName | null>(null);\n readonly hint = input<string>('');\n readonly error = input<string>('');\n\n /**\n * Current value (driven by CVA). Initialized to a stable literal off-state\n * rather than reading falseValue() in the field initializer — a signal input\n * read here always returns its declared default, so capturing it would ignore\n * a custom [falseValue] and is non-reactive. The off-state is resolved live\n * against trueValue() in checked() and against falseValue() in toggle().\n */\n protected readonly value = signal<unknown>(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly checked = computed(\n () => this.value() === this.trueValue(),\n );\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly sizing = computed(() => SIZES[this.size()]);\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.fieldId}-err`;\n if (this.hint()) return `${this.fieldId}-hint`;\n return null;\n });\n\n /**\n * On/off must read at a glance in both modes. In light mode the brand track against a pale grey one does\n * it. In dark mode a monochrome brand's 600 step is a mid-dark grey, as dim as the off track, so there\n * \"on\" flips to a light track with a dark knob and \"off\" keeps a dim track with a muted knob. `ink` (not\n * black) tints the off track so it stays visible on dark surfaces too.\n */\n protected readonly trackClasses = computed(() => {\n const parts = [this.sizing().track];\n parts.push(this.checked() ? 'bg-brand-600 dark:bg-ink' : 'bg-ink/15');\n return parts.join(' ');\n });\n\n protected readonly knobClasses = computed(() => {\n const parts = [this.sizing().knob];\n parts.push(this.checked() ? this.sizing().on : 'translate-x-0.5');\n parts.push(this.checked() ? 'bg-white dark:bg-surface' : 'bg-white dark:bg-ink-soft');\n return parts.join(' ');\n });\n\n constructor() {\n // Dev-only guard: a toggle is effectively icon-only (no intrinsic text), so\n // without a visible [label] or an explicit [ariaLabel] the switch ships with\n // no accessible name. Mirrors the sds-button icon-only guard.\n if (isDevMode()) {\n effect(() => {\n if (!this.label() && !this.ariaLabel()) {\n console.warn(\n 'sds-toggle-switch: provide [label] or [ariaLabel] for an accessible name.',\n );\n }\n });\n }\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n // A null/undefined write (initial bind with no model, or reset()) means the\n // control is unset — resolve it to the configured off value so a custom\n // [falseValue] is honored and checked() renders off consistently.\n this.value.set(value ?? this.falseValue());\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.setValue(this.checked() ? this.falseValue() : this.trueValue());\n }\n\n protected onSpace(event: Event): void {\n event.preventDefault();\n this.toggle();\n }\n\n private setValue(next: unknown): void {\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsCheckboxSize = 'sm' | 'md';\n\nlet nextId = 0;\n\n/**\n * Boolean checkbox. Implements ControlValueAccessor — use with reactive forms\n * or `[(ngModel)]`. Renders a styled box (brand-filled with a check when on)\n * and an optional inline label. Without a visible `label` it renders no `<label>`\n * of its own, so it can sit inside the consumer's `<label>` (a whole clickable\n * row), whose text then names it.\n *\n * @example\n * <sds-checkbox label=\"Fusion automatique\" [(ngModel)]=\"autoMerge\" />\n */\n@Component({\n selector: 'sds-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsCheckbox),\n multi: true,\n },\n ],\n host: { class: 'inline-flex' },\n template: `\n <!-- With a visible label the whole thing is a <label>. Without one it is a plain span, so the box can\n sit inside the consumer's own <label> (a clickable row, say) without nesting labels. -->\n @if (label()) {\n <label class=\"inline-flex select-none items-center gap-2\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"box\" />\n <span class=\"text-sm text-ink\">{{ label() }}</span>\n </label>\n } @else {\n <span class=\"inline-flex select-none items-center\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"box\" />\n </span>\n }\n\n <ng-template #box>\n <span\n class=\"relative inline-flex shrink-0 items-center justify-center rounded-control border transition-colors\"\n [class]=\"boxClasses()\"\n >\n <input\n type=\"checkbox\"\n class=\"absolute inset-0 m-0 cursor-[inherit] opacity-0\"\n [id]=\"id\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (change)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n @if (checked()) {\n <sds-icon name=\"check\" [size]=\"iconSize()\" [strokeWidth]=\"3\" />\n }\n </span>\n </ng-template>\n `,\n})\nexport class SdsCheckbox implements ControlValueAccessor {\n readonly id = `sds-checkbox-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly size = input<SdsCheckboxSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly checked = signal(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n protected readonly iconSize = computed(() => (this.size() === 'sm' ? 11 : 13));\n protected readonly stateClasses = computed(() =>\n this.isDisabled() ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n );\n\n protected readonly boxClasses = computed(() => {\n const size = this.size() === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n const state = this.checked()\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface text-transparent';\n const focus =\n 'focus-within:ring-2 focus-within:ring-brand-500/30 focus-within:border-brand-500';\n return `${size} ${state} ${focus}`;\n });\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: boolean | null): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).checked;\n this.checked.set(next);\n this.onChange(next);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type SdsRadioSize = 'sm' | 'md';\n\nlet nextId = 0;\n\n/**\n * Mounted radios by group name. A pick updates the rest of its group, because a native radio says\n * nothing when the browser unchecks it — without this a reactive form would leave the old choice drawn.\n */\nconst groups = new Map<string, Set<SdsRadio>>();\n\n/**\n * One option of a single-choice group: a styled circle (brand-filled with a dot when on) over a native\n * radio input, so grouping and keyboard behaviour stay the browser's — radios that share a `name`\n * move with the arrow keys and only one of them is on.\n *\n * Two ways to bind it:\n * - with forms: every radio of the group gets the same `[(ngModel)]` / `formControlName`, the same\n * `name` and its own `[value]`; the control holds the value of the selected radio\n * (ControlValueAccessor, like a native radio);\n * - without forms: drive `[checked]` yourself and update it from `(selected)`, which emits this radio's\n * value when the user picks it.\n *\n * Like `sds-checkbox`, without a visible `label` it renders no `<label>` of its own, so it can sit\n * inside the consumer's `<label>` (a whole clickable row), whose text then names it.\n *\n * @example\n * <sds-radio name=\"size\" value=\"small\" label=\"Petit\" [(ngModel)]=\"size\" />\n * <sds-radio name=\"size\" value=\"large\" label=\"Grand\" [(ngModel)]=\"size\" />\n */\n@Component({\n selector: 'sds-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsRadio),\n multi: true,\n },\n ],\n host: { class: 'inline-flex' },\n template: `\n @if (label()) {\n <label class=\"inline-flex select-none items-center gap-2\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"circle\" />\n <span class=\"text-sm text-ink\">{{ label() }}</span>\n </label>\n } @else {\n <span class=\"inline-flex select-none items-center\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"circle\" />\n </span>\n }\n\n <ng-template #circle>\n <span\n class=\"relative inline-flex shrink-0 items-center justify-center rounded-full border transition-colors\"\n [class]=\"circleClasses()\"\n >\n <input\n type=\"radio\"\n class=\"absolute inset-0 m-0 cursor-[inherit] opacity-0\"\n [id]=\"id\"\n [attr.name]=\"name() || null\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (change)=\"onPick()\"\n (blur)=\"onTouched()\"\n />\n @if (isChecked()) {\n <span\n class=\"pointer-events-none rounded-full bg-white\"\n [class]=\"dotClasses()\"\n aria-hidden=\"true\"\n ></span>\n }\n </span>\n </ng-template>\n `,\n})\nexport class SdsRadio implements ControlValueAccessor {\n readonly id = `sds-radio-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n /** The group's name, shared by all its radios (native grouping, arrow keys, and form syncing). */\n readonly name = input<string>('');\n /** What this option stands for: a form control bound to the group holds it while this radio is on. */\n readonly value = input<unknown>(null);\n /** On/off when used without forms. Ignored once a form control is bound. */\n readonly checked = input(false, { transform: booleanAttribute });\n readonly size = input<SdsRadioSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emits this radio's value when the user picks it. */\n readonly selected = output<unknown>();\n\n /** The group's current value, once a form control is bound (see {@link registerOnChange}). */\n private readonly modelValue = signal<unknown>(undefined);\n private readonly formBound = signal(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isChecked = computed(() =>\n this.formBound() ? Object.is(this.modelValue(), this.value()) : this.checked(),\n );\n protected readonly stateClasses = computed(() =>\n this.isDisabled() ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n );\n protected readonly circleClasses = computed(() => {\n const size = this.size() === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n const state = this.isChecked() ? 'border-brand-600 bg-brand-600' : 'border-border bg-surface';\n const focus =\n 'focus-within:ring-2 focus-within:ring-brand-500/30 focus-within:border-brand-500';\n return `${size} ${state} ${focus}`;\n });\n protected readonly dotClasses = computed(() =>\n this.size() === 'sm' ? 'h-1.5 w-1.5' : 'h-2 w-2',\n );\n\n constructor() {\n effect((onCleanup) => {\n const name = this.name();\n if (!name) {\n return;\n }\n let group = groups.get(name);\n if (!group) {\n group = new Set();\n groups.set(name, group);\n }\n group.add(this);\n onCleanup(() => {\n group.delete(this);\n if (group.size === 0) {\n groups.delete(name);\n }\n });\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.modelValue.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n this.formBound.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n /** A native radio only fires `change` when it turns on. */\n protected onPick(): void {\n const value = this.value();\n if (this.formBound()) {\n const name = this.name();\n for (const radio of (name && groups.get(name)) || [this]) {\n radio.modelValue.set(value);\n }\n this.onChange(value);\n }\n this.selected.emit(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsAvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_COLOR: Record<SdsAvatarStatus, string> = {\n online: 'bg-success',\n offline: 'bg-ink-faint',\n busy: 'bg-danger',\n away: 'bg-warning',\n};\n\n/**\n * Circular avatar showing an image or initials, with an optional status dot.\n */\n@Component({\n selector: 'sds-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'inline-block shrink-0 align-middle' },\n template: `\n <div\n class=\"relative grid place-items-center overflow-hidden rounded-full font-semibold text-white ring-2 ring-white/20\"\n [class]=\"bgClass()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [style.fontSize.px]=\"size() * 0.4\"\n >\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"name()\" class=\"h-full w-full object-cover\" />\n } @else {\n <span>{{ resolvedInitials() }}</span>\n }\n\n @if (status()) {\n <span\n class=\"absolute bottom-0 right-0 rounded-full ring-2 ring-white\"\n [class]=\"statusColor()\"\n [style.width.px]=\"dotSize()\"\n [style.height.px]=\"dotSize()\"\n ></span>\n }\n </div>\n `,\n})\nexport class SdsAvatar {\n readonly name = input<string>('');\n readonly initials = input<string>('');\n readonly src = input<string | null>(null);\n readonly size = input<number>(36);\n readonly status = input<SdsAvatarStatus | null>(null);\n /** Tailwind bg utility for the initials background. */\n readonly bgClass = input<string>('bg-brand-400');\n\n protected readonly dotSize = computed(() =>\n Math.max(8, Math.round(this.size() * 0.28)),\n );\n\n protected readonly statusColor = computed(() =>\n this.status() ? STATUS_COLOR[this.status()!] : '',\n );\n\n protected readonly resolvedInitials = computed(() => {\n if (this.initials()) return this.initials().slice(0, 2).toUpperCase();\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsBadgeVariant =\n | 'neutral'\n | 'brand'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger';\nexport type SdsBadgeSize = 'sm' | 'md';\n\nconst VARIANTS: Record<SdsBadgeVariant, string> = {\n neutral: 'bg-muted text-ink-soft border-border',\n brand: 'bg-brand-50 text-brand-700 border-brand-100',\n info: 'bg-accent-blue-soft text-accent-blue border-transparent',\n success: 'bg-accent-green-soft text-accent-green border-transparent',\n warning: 'bg-accent-amber-soft text-accent-amber border-transparent',\n danger: 'bg-accent-red-soft text-accent-red border-transparent',\n};\n\nconst DOT: Record<SdsBadgeVariant, string> = {\n neutral: 'bg-ink-faint',\n brand: 'bg-brand-500',\n info: 'bg-accent-blue',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n};\n\n/**\n * Small status/label pill. Used e.g. for the \"TEST V.1.0.0\" version chip.\n */\n@Component({\n selector: 'sds-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'inline-flex' },\n template: `\n <span\n class=\"inline-flex items-center gap-1.5 rounded-full border font-semibold uppercase tracking-wide\"\n [class]=\"classes()\"\n >\n @if (dot()) {\n <span class=\"h-1.5 w-1.5 rounded-full\" [class]=\"dotClass()\"></span>\n }\n <ng-content />\n </span>\n `,\n})\nexport class SdsBadge {\n readonly variant = input<SdsBadgeVariant>('neutral');\n readonly size = input<SdsBadgeSize>('md');\n readonly dot = input(false, { transform: booleanAttribute });\n\n protected readonly classes = computed(() => {\n const size =\n this.size() === 'sm'\n ? 'px-2 py-0.5 text-[10px]'\n : 'px-2.5 py-1 text-[11px]';\n return `${VARIANTS[this.variant()]} ${size}`;\n });\n\n protected readonly dotClass = computed(() => DOT[this.variant()]);\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsCardVariant = 'elevated' | 'outlined' | 'subtle';\n\nconst VARIANTS: Record<SdsCardVariant, string> = {\n elevated: 'bg-surface border border-border shadow-sm',\n outlined: 'bg-surface border border-border',\n subtle: 'bg-muted border border-border',\n};\n\n/**\n * Generic surface container. Set [interactive]=\"true\" for hover affordance\n * (used by the dashboard action cards).\n */\n@Component({\n selector: 'sds-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClass()' },\n template: `<ng-content />`,\n})\nexport class SdsCard {\n readonly variant = input<SdsCardVariant>('elevated');\n /** Inner padding utility (override with e.g. \"p-4\"). */\n readonly padding = input<string>('p-5');\n readonly interactive = input(false, { transform: booleanAttribute });\n\n protected readonly hostClass = computed(() => {\n const parts = ['block rounded-card', VARIANTS[this.variant()], this.padding()];\n if (this.interactive()) {\n parts.push(\n 'cursor-pointer transition-all duration-150 hover:border-brand-300 hover:shadow-md',\n );\n }\n return parts.join(' ');\n });\n}\n","/** Small, dependency-free date helpers (day-granularity, local time). */\n\nexport function startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Zero-pad a number to two digits (e.g. 9 → \"09\"). */\nexport function pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/** Format a date's time-of-day as HH:mm (24h, local time). */\nexport function formatHhMm(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function addDays(d: Date, n: number): Date {\n const r = new Date(d);\n r.setDate(r.getDate() + n);\n return r;\n}\n\nexport function addMonths(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth() + n, 1);\n}\n\n/** Add `n` months, keeping the day-of-month but clamping to the target month's length. */\nexport function addMonthsKeepDay(d: Date, n: number): Date {\n const t = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const lastDay = new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();\n t.setDate(Math.min(d.getDate(), lastDay));\n return t;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n return (\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/** True when `d` falls outside the inclusive [min, max] day range. */\nexport function isOutOfRange(d: Date, min: Date | null, max: Date | null): boolean {\n const day = startOfDay(d).getTime();\n if (min && day < startOfDay(min).getTime()) return true;\n if (max && day > startOfDay(max).getTime()) return true;\n return false;\n}\n\nexport function isoDay(d: Date): string {\n const p = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n/** Format a date as dd/MM/yyyy (default display format). */\nexport function formatDdMmYyyy(d: Date): string {\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()}`;\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n addDays,\n addMonths,\n addMonthsKeepDay,\n isOutOfRange,\n isSameDay,\n isoDay,\n pad2,\n startOfDay,\n startOfMonth,\n} from './date-utils';\n\ntype CalView = 'day' | 'month' | 'year';\n\ninterface DayCell {\n date: Date;\n day: number;\n otherMonth: boolean;\n today: boolean;\n selected: boolean;\n disabled: boolean;\n focused: boolean;\n}\n\n/**\n * Inline month calendar with day → month → year drill-down navigation,\n * min/max bounds and keyboard support. Used standalone (inline) or inside\n * <sds-date-picker>.\n */\n@Component({\n selector: 'sds-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n class=\"w-[20rem] select-none rounded-card border border-border bg-surface p-3 shadow-lg\"\n role=\"group\"\n [attr.aria-label]=\"calendarLabel()\"\n >\n <!-- Header -->\n <div class=\"mb-2 flex items-center justify-between\">\n <button type=\"button\" [class]=\"navBtn\" [attr.aria-label]=\"previousLabel()\" (click)=\"prev()\">\n <sds-icon name=\"chevron-left\" [size]=\"18\" />\n </button>\n\n <div class=\"flex items-center gap-1 text-sm font-semibold text-ink\">\n @switch (view()) {\n @case ('day') {\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('month')\">\n {{ monthLong() }}\n </button>\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('year')\">\n {{ yearLabel() }}\n </button>\n }\n @case ('month') {\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('year')\">\n {{ yearLabel() }}\n </button>\n }\n @case ('year') {\n <span class=\"px-1\">{{ decadeStart() }} – {{ decadeStart() + 11 }}</span>\n }\n }\n </div>\n\n <button type=\"button\" [class]=\"navBtn\" [attr.aria-label]=\"nextLabel()\" (click)=\"next()\">\n <sds-icon name=\"chevron-right\" [size]=\"18\" />\n </button>\n </div>\n\n <!-- Day view -->\n @if (view() === 'day') {\n <table class=\"w-full border-collapse\" role=\"grid\">\n <thead>\n <tr>\n @for (wd of weekdayLabels(); track $index) {\n <th scope=\"col\" class=\"pb-1 text-[11px] font-medium uppercase text-ink-faint\">\n {{ wd }}\n </th>\n }\n </tr>\n </thead>\n <tbody (keydown)=\"onGridKeydown($event)\">\n @for (week of weeks(); track $index) {\n <tr>\n @for (cell of week; track cell.date.getTime()) {\n <td class=\"p-0.5 text-center\">\n <button\n type=\"button\"\n [attr.data-date]=\"iso(cell.date)\"\n [tabindex]=\"cell.focused ? 0 : -1\"\n [disabled]=\"cell.disabled\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-current]=\"cell.today ? 'date' : null\"\n [attr.aria-label]=\"fullLabel(cell.date)\"\n [class]=\"dayClass(cell)\"\n (click)=\"selectDay(cell.date)\"\n >\n {{ cell.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Month view -->\n @if (view() === 'month') {\n <div class=\"grid grid-cols-3 gap-1.5\">\n @for (m of monthsGrid(); track m.month) {\n <button\n type=\"button\"\n [disabled]=\"m.disabled\"\n [class]=\"cellClass(m.selected, m.current, m.disabled)\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.label }}\n </button>\n }\n </div>\n }\n\n <!-- Year view -->\n @if (view() === 'year') {\n <div class=\"grid grid-cols-3 gap-1.5\">\n @for (y of yearsGrid(); track y.year) {\n <button\n type=\"button\"\n [disabled]=\"y.disabled\"\n [class]=\"cellClass(y.selected, y.current, y.disabled)\"\n (click)=\"selectYear(y.year)\"\n >\n {{ y.year }}\n </button>\n }\n </div>\n }\n\n <!-- Time editor -->\n @if (showTime()) {\n <div class=\"mt-2 flex items-center gap-2 border-t border-border pt-2\">\n <span class=\"text-xs font-medium text-ink-soft\">{{ timeLabel() }}</span>\n <div class=\"ml-auto inline-flex items-center gap-1.5\">\n <div class=\"inline-flex items-center rounded-control border border-border bg-surface\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"hoursText()\"\n [disabled]=\"!value()\"\n [attr.aria-label]=\"hoursLabel()\"\n (change)=\"setHours($any($event.target).value)\"\n (blur)=\"$any($event.target).value = hoursText()\"\n (keydown.arrowup)=\"stepHours(1); $event.preventDefault()\"\n (keydown.arrowdown)=\"stepHours(-1); $event.preventDefault()\"\n [class]=\"timeInput\"\n />\n <div class=\"flex flex-col border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepHours(1)\"\n >\n <span class=\"inline-flex rotate-180\"\n ><sds-icon name=\"chevron-down\" [size]=\"11\"\n /></span>\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepHours(-1)\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"11\" />\n </button>\n </div>\n </div>\n <span class=\"text-sm font-semibold text-ink-soft\">:</span>\n <div class=\"inline-flex items-center rounded-control border border-border bg-surface\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"minutesText()\"\n [disabled]=\"!value()\"\n [attr.aria-label]=\"minutesLabel()\"\n (change)=\"setMinutes($any($event.target).value)\"\n (blur)=\"$any($event.target).value = minutesText()\"\n (keydown.arrowup)=\"stepMinutes(1); $event.preventDefault()\"\n (keydown.arrowdown)=\"stepMinutes(-1); $event.preventDefault()\"\n [class]=\"timeInput\"\n />\n <div class=\"flex flex-col border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepMinutes(1)\"\n >\n <span class=\"inline-flex rotate-180\"\n ><sds-icon name=\"chevron-down\" [size]=\"11\"\n /></span>\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepMinutes(-1)\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"11\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Actions -->\n @if (showActions() || showDone()) {\n <div class=\"mt-2 flex items-center justify-between border-t border-border pt-2\">\n <div class=\"flex items-center gap-1\">\n @if (showActions()) {\n <button\n type=\"button\"\n [class]=\"actionBtn\"\n [disabled]=\"todayDisabled()\"\n (click)=\"goToday()\"\n >\n {{ todayActionLabel() }}\n </button>\n <button type=\"button\" [class]=\"actionBtn\" (click)=\"clear()\">\n {{ clearActionLabel() }}\n </button>\n }\n </div>\n @if (showDone()) {\n <button type=\"button\" [class]=\"doneBtn\" (click)=\"done.emit()\">{{ doneLabel() }}</button>\n }\n </div>\n }\n </div>\n `,\n})\nexport class SdsCalendar {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly value = model<Date | null>(null);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n /** 0 = Sunday, 1 = Monday (default, European). */\n readonly firstDayOfWeek = input<0 | 1>(1);\n readonly locale = input<string>('fr-FR');\n readonly showActions = input<boolean>(true);\n\n /** When true, a time editor (HH:mm, 24h) is shown and the value keeps its time-of-day. */\n readonly showTime = input(false, { transform: booleanAttribute });\n /** When true, a \"done\" action is shown (used by the overlay picker to close the panel). */\n readonly showDone = input(false, { transform: booleanAttribute });\n\n /** Visible label of the time editor. Translate it in the consuming app. */\n readonly timeLabel = input<string>('Heure');\n /** Accessible name of the hours field (it is a bare numeric input). */\n readonly hoursLabel = input<string>('Heures');\n /** Accessible name of the minutes field. */\n readonly minutesLabel = input<string>('Minutes');\n /** Visible text of the \"done\" action (shown when {@link showDone} is true). */\n readonly doneLabel = input<string>('Terminé');\n\n /**\n * Accessible name for the calendar container. French default so existing consumers are unchanged,\n * but an app serving more than one language MUST translate it.\n */\n readonly calendarLabel = input<string>('Calendrier');\n\n /**\n * Accessible name for the \"previous\" nav button. It is icon-only, so this string is its ONLY\n * accessible name — a hardcoded French one is simply wrong in every other locale. Translate it in\n * the consuming app.\n */\n readonly previousLabel = input<string>('Précédent');\n\n /** Accessible name for the icon-only \"next\" nav button. See {@link previousLabel}. */\n readonly nextLabel = input<string>('Suivant');\n\n /**\n * Visible text of the \"today\" action (shown when {@link showActions} is true). Translate it in the\n * consuming app — the library ships no i18n of its own.\n */\n readonly todayActionLabel = input<string>(\"Aujourd'hui\");\n\n /** Visible text of the \"clear\" action. See {@link todayActionLabel}. */\n readonly clearActionLabel = input<string>('Effacer');\n\n /** Emitted when a concrete date is picked (day click or \"Aujourd'hui\"). */\n readonly dateSelect = output<Date>();\n /** Emitted when the \"done\" action is used (see {@link showDone}). */\n readonly done = output<void>();\n\n protected readonly view = signal<CalView>('day');\n protected readonly viewDate = signal<Date>(startOfMonth(new Date()));\n protected readonly focusedDate = signal<Date>(startOfDay(new Date()));\n\n constructor() {\n // Keep the displayed month in sync with the value (e.g. when a form writes\n // a value, including while the panel is open). Plain navigation does not\n // change the value, so this does not fight the user.\n effect(() => {\n const v = this.value();\n if (v) this.viewDate.set(startOfMonth(v));\n });\n }\n\n /** Today falls outside [min, max] — used to disable the \"Today\" action. */\n protected readonly todayDisabled = computed(() =>\n isOutOfRange(new Date(), this.min(), this.max()),\n );\n\n // --- styling helpers ---\n protected readonly navBtn =\n 'inline-flex h-8 w-8 items-center justify-center rounded-control text-ink-soft hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly titleBtn =\n 'rounded-control px-2 py-1 capitalize hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly actionBtn =\n 'rounded-control px-2 py-1 text-xs font-medium text-brand-700 hover:bg-brand-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n protected readonly doneBtn =\n 'rounded-control bg-brand-600 px-3 py-1 text-xs font-semibold text-white hover:bg-brand-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly timeInput =\n 'w-8 bg-transparent py-1 text-center text-sm text-ink outline-none disabled:cursor-not-allowed disabled:opacity-40';\n protected readonly stepBtn =\n 'flex h-3.5 w-5 items-center justify-center text-ink-faint transition-colors hover:text-ink focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-30';\n\n // --- labels ---\n protected readonly monthLong = computed(() =>\n new Intl.DateTimeFormat(this.locale(), { month: 'long' }).format(this.viewDate()),\n );\n protected readonly yearLabel = computed(() => this.viewDate().getFullYear());\n protected readonly decadeStart = computed(() => {\n const y = this.viewDate().getFullYear();\n return y - (y % 10);\n });\n\n protected readonly weekdayLabels = computed(() => {\n const fmt = new Intl.DateTimeFormat(this.locale(), { weekday: 'short' });\n const sunday = new Date(2023, 0, 1); // a known Sunday\n return Array.from({ length: 7 }, (_, i) =>\n fmt.format(addDays(sunday, (this.firstDayOfWeek() + i) % 7)),\n );\n });\n\n protected readonly weeks = computed<DayCell[][]>(() => {\n const vd = this.viewDate();\n const first = startOfMonth(vd);\n const offset = (first.getDay() - this.firstDayOfWeek() + 7) % 7;\n const start = addDays(first, -offset);\n const today = startOfDay(new Date());\n const val = this.value();\n const min = this.min();\n const max = this.max();\n const focused = this.focusedDate();\n\n const out: DayCell[][] = [];\n let cur = start;\n for (let w = 0; w < 6; w++) {\n const row: DayCell[] = [];\n for (let i = 0; i < 7; i++) {\n row.push({\n date: cur,\n day: cur.getDate(),\n otherMonth: cur.getMonth() !== vd.getMonth(),\n today: isSameDay(cur, today),\n selected: isSameDay(cur, val),\n disabled: isOutOfRange(cur, min, max),\n focused: isSameDay(cur, focused),\n });\n cur = addDays(cur, 1);\n }\n out.push(row);\n }\n return out;\n });\n\n protected readonly monthsGrid = computed(() => {\n const fmt = new Intl.DateTimeFormat(this.locale(), { month: 'short' });\n const y = this.viewDate().getFullYear();\n const val = this.value();\n const today = new Date();\n const min = this.min();\n const max = this.max();\n return Array.from({ length: 12 }, (_, m) => ({\n month: m,\n label: fmt.format(new Date(y, m, 1)),\n selected: !!val && val.getFullYear() === y && val.getMonth() === m,\n current: today.getFullYear() === y && today.getMonth() === m,\n disabled:\n (!!max && new Date(y, m, 1) > startOfMonth(max)) ||\n (!!min && new Date(y, m + 1, 0) < startOfDay(min)),\n }));\n });\n\n protected readonly yearsGrid = computed(() => {\n const start = this.decadeStart();\n const val = this.value();\n const thisYear = new Date().getFullYear();\n const min = this.min();\n const max = this.max();\n return Array.from({ length: 12 }, (_, i) => {\n const year = start + i;\n return {\n year,\n selected: !!val && val.getFullYear() === year,\n current: thisYear === year,\n disabled: (!!max && year > max.getFullYear()) || (!!min && year < min.getFullYear()),\n };\n });\n });\n\n // --- navigation ---\n protected prev(): void {\n const v = this.view();\n if (v === 'day') this.viewDate.set(addMonths(this.viewDate(), -1));\n else if (v === 'month') this.viewDate.set(new Date(this.viewDate().getFullYear() - 1, 0, 1));\n else this.viewDate.set(new Date(this.viewDate().getFullYear() - 10, 0, 1));\n }\n protected next(): void {\n const v = this.view();\n if (v === 'day') this.viewDate.set(addMonths(this.viewDate(), 1));\n else if (v === 'month') this.viewDate.set(new Date(this.viewDate().getFullYear() + 1, 0, 1));\n else this.viewDate.set(new Date(this.viewDate().getFullYear() + 10, 0, 1));\n }\n\n protected selectDay(d: Date): void {\n if (isOutOfRange(d, this.min(), this.max())) return;\n // showTime keeps the current time-of-day (or 00:00 when nothing was set yet); otherwise midnight.\n const day = this.applyTime(startOfDay(d));\n this.value.set(day);\n this.viewDate.set(startOfMonth(day));\n this.focusedDate.set(startOfDay(day));\n this.dateSelect.emit(day);\n }\n\n /** Carry the previously-selected time-of-day onto a freshly-picked day (only when showTime). */\n private applyTime(day: Date): Date {\n if (!this.showTime()) return day;\n const prev = this.value();\n if (!prev) return day; // no prior time → keep 00:00\n const d = new Date(day);\n d.setHours(prev.getHours(), prev.getMinutes(), 0, 0);\n return d;\n }\n protected selectMonth(m: number): void {\n this.viewDate.set(new Date(this.viewDate().getFullYear(), m, 1));\n this.view.set('day');\n }\n protected selectYear(y: number): void {\n this.viewDate.set(new Date(y, this.viewDate().getMonth(), 1));\n this.view.set('month');\n }\n\n protected goToday(): void {\n this.view.set('day');\n this.selectDay(new Date());\n }\n protected clear(): void {\n this.value.set(null);\n }\n\n // --- time editor (only rendered when showTime) ---\n protected readonly hoursText = computed(() => {\n const v = this.value();\n return v ? pad2(v.getHours()) : '';\n });\n protected readonly minutesText = computed(() => {\n const v = this.value();\n return v ? pad2(v.getMinutes()) : '';\n });\n\n protected setHours(raw: string): void {\n const v = this.value();\n if (!v) return;\n const n = parseInt(raw, 10);\n if (Number.isNaN(n)) return;\n const d = new Date(v);\n d.setHours(Math.min(23, Math.max(0, n)));\n this.value.set(d);\n }\n protected setMinutes(raw: string): void {\n const v = this.value();\n if (!v) return;\n const n = parseInt(raw, 10);\n if (Number.isNaN(n)) return;\n const d = new Date(v);\n d.setMinutes(Math.min(59, Math.max(0, n)));\n this.value.set(d);\n }\n /** Wrap hours within 0–23; never carries into the day. */\n protected stepHours(delta: number): void {\n const v = this.value();\n if (!v) return;\n const d = new Date(v);\n d.setHours((d.getHours() + delta + 24) % 24);\n this.value.set(d);\n }\n /** Wrap minutes within 0–59; never carries into the hour. */\n protected stepMinutes(delta: number): void {\n const v = this.value();\n if (!v) return;\n const d = new Date(v);\n d.setMinutes((d.getMinutes() + delta + 60) % 60);\n this.value.set(d);\n }\n\n // --- keyboard (day grid) ---\n protected onGridKeydown(e: KeyboardEvent): void {\n let f = this.focusedDate();\n switch (e.key) {\n case 'ArrowLeft':\n f = addDays(f, -1);\n break;\n case 'ArrowRight':\n f = addDays(f, 1);\n break;\n case 'ArrowUp':\n f = addDays(f, -7);\n break;\n case 'ArrowDown':\n f = addDays(f, 7);\n break;\n case 'Home':\n f = addDays(f, -((f.getDay() - this.firstDayOfWeek() + 7) % 7));\n break;\n case 'End':\n f = addDays(f, 6 - ((f.getDay() - this.firstDayOfWeek() + 7) % 7));\n break;\n case 'PageUp':\n f = addMonthsKeepDay(f, -1);\n break;\n case 'PageDown':\n f = addMonthsKeepDay(f, 1);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.selectDay(f);\n return;\n default:\n return;\n }\n e.preventDefault();\n if (\n f.getMonth() !== this.viewDate().getMonth() ||\n f.getFullYear() !== this.viewDate().getFullYear()\n ) {\n this.viewDate.set(startOfMonth(f));\n }\n this.focusedDate.set(f);\n this.focusCell(f);\n }\n\n /** Move focus to the active day cell (called when the panel opens). */\n focusActiveCell(): void {\n const target = this.value() ?? new Date();\n this.view.set('day');\n this.viewDate.set(startOfMonth(target));\n this.focusedDate.set(startOfDay(target));\n this.focusCell(target);\n }\n\n private focusHandle?: ReturnType<typeof setTimeout>;\n private focusCell(d: Date): void {\n clearTimeout(this.focusHandle);\n this.focusHandle = setTimeout(() => {\n const el = this.host.nativeElement.querySelector<HTMLElement>(`[data-date=\"${isoDay(d)}\"]`);\n el?.focus();\n });\n }\n\n // --- template helpers ---\n protected iso(d: Date): string {\n return isoDay(d);\n }\n protected fullLabel(d: Date): string {\n return new Intl.DateTimeFormat(this.locale(), {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(d);\n }\n\n protected dayClass(cell: DayCell): string {\n const base =\n 'inline-flex h-9 w-9 items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n if (cell.selected) return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;\n let cls = `${base} hover:bg-brand-50`;\n if (cell.otherMonth) cls += ' text-ink-faint';\n else cls += ' text-ink';\n if (cell.today) cls += ' font-bold text-brand-600 ring-1 ring-inset ring-brand-300';\n return cls;\n }\n\n protected cellClass(selected: boolean, current: boolean, disabled: boolean): string {\n const base =\n 'h-10 rounded-control text-sm capitalize transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n if (selected) return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;\n let cls = `${base} text-ink hover:bg-brand-50`;\n if (current) cls += ' font-semibold text-brand-600';\n return cls;\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsCalendar } from './sds-calendar';\nimport { formatDdMmYyyy, formatHhMm } from './date-utils';\n\nexport type SdsDatePickerSize = 'sm' | 'md' | 'lg';\n\nconst SIZES: Record<SdsDatePickerSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\n/**\n * Date picker: a read-only field that opens a calendar overlay, or an inline\n * calendar. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)]; the value is a `Date | null`.\n *\n * @example\n * <sds-date-picker label=\"Date de garde\" [(ngModel)]=\"date\" />\n */\n@Component({\n selector: 'sds-date-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, SdsCalendar],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsDatePicker), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'onEscape($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n @if (inline()) {\n <sds-calendar\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [showActions]=\"showActions()\"\n [showTime]=\"showTime()\"\n [timeLabel]=\"timeLabel()\"\n [hoursLabel]=\"hoursLabel()\"\n [minutesLabel]=\"minutesLabel()\"\n [calendarLabel]=\"calendarLabel()\"\n [previousLabel]=\"previousLabel()\"\n [nextLabel]=\"nextLabel()\"\n [todayActionLabel]=\"todayActionLabel()\"\n [clearActionLabel]=\"clearActionLabel()\"\n (valueChange)=\"onCalendarValue($event)\"\n />\n } @else {\n <div class=\"relative\">\n <div\n #trigger\n class=\"relative flex items-center rounded-control border bg-surface transition-colors\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n >\n <input\n [id]=\"fieldId\"\n type=\"text\"\n readonly\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (keydown.enter)=\"onTriggerKeydown($event)\"\n (keydown.space)=\"onTriggerKeydown($event)\"\n (keydown.arrowdown)=\"onTriggerKeydown($event)\"\n class=\"w-full cursor-pointer bg-transparent pl-3.5 text-ink outline-none placeholder:text-ink-faint disabled:cursor-not-allowed\"\n [class.pr-20]=\"showClear()\"\n [class.pr-11]=\"!showClear()\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-10 inline-flex h-6 w-6 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"open() ? closeCalendarLabel() : openCalendarLabel()\"\n class=\"absolute right-2 inline-flex h-7 w-7 items-center justify-center rounded-control text-ink-soft hover:bg-muted\"\n (click)=\"toggle($event)\"\n >\n <sds-icon name=\"calendar\" [size]=\"18\" />\n </button>\n </div>\n\n @if (open()) {\n <!-- Relocated to document.body on open (appendTo body) to escape\n ancestor overflow/stacking; positioned via positionPanel(). -->\n <div\n class=\"fixed z-[1000]\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown.escape)=\"onEscape($event)\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <sds-calendar\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [showActions]=\"showActions()\"\n [showTime]=\"showTime()\"\n [showDone]=\"showTime()\"\n [timeLabel]=\"timeLabel()\"\n [hoursLabel]=\"hoursLabel()\"\n [minutesLabel]=\"minutesLabel()\"\n [doneLabel]=\"doneLabel()\"\n [calendarLabel]=\"calendarLabel()\"\n [previousLabel]=\"previousLabel()\"\n [nextLabel]=\"nextLabel()\"\n [todayActionLabel]=\"todayActionLabel()\"\n [clearActionLabel]=\"clearActionLabel()\"\n (valueChange)=\"onCalendarValue($event)\"\n (dateSelect)=\"onDateSelect()\"\n (done)=\"close(true)\"\n />\n </div>\n }\n </div>\n }\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsDatePicker implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n protected readonly fieldId = `sds-date-${nextId++}`;\n\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('jj/mm/aaaa');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsDatePickerSize>('md');\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly firstDayOfWeek = input<0 | 1>(1);\n readonly locale = input<string>('fr-FR');\n readonly inline = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly showActions = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * When true, the calendar shows a time editor (HH:mm, 24h), the value keeps its time-of-day, and\n * the field displays date + time. The overlay stays open on day-select so the time can be set;\n * a \"done\" action (and click-away / Escape) closes it.\n */\n readonly showTime = input(false, { transform: booleanAttribute });\n /** Custom display formatter for the DATE part (default dd/MM/yyyy). The time is appended as HH:mm. */\n readonly format = input<(d: Date) => string>(formatDdMmYyyy);\n\n /** Visible label of the time editor (forwarded to the calendar). See {@link showTime}. */\n readonly timeLabel = input<string>('Heure');\n /** Accessible name of the hours field (forwarded to the calendar). */\n readonly hoursLabel = input<string>('Heures');\n /** Accessible name of the minutes field (forwarded to the calendar). */\n readonly minutesLabel = input<string>('Minutes');\n /** Visible text of the calendar's \"done\" action, shown in the overlay when {@link showTime}. */\n readonly doneLabel = input<string>('Terminé');\n\n /**\n * Accessible name for the clear button. French default so existing consumers are unchanged, but an\n * app serving more than one language MUST translate it — it is an icon-only control, so this string\n * is its only name.\n */\n readonly clearLabel = input<string>('Effacer la date');\n\n /**\n * Accessible name for the icon-only calendar toggle while the panel is CLOSED. See\n * {@link clearLabel} for why this has to be translatable.\n */\n readonly openCalendarLabel = input<string>('Ouvrir le calendrier');\n\n /** Accessible name for the calendar toggle while the panel is OPEN. See {@link openCalendarLabel}. */\n readonly closeCalendarLabel = input<string>('Fermer le calendrier');\n\n /** Accessible name for the overlay dialog that holds the calendar. */\n readonly panelLabel = input<string>('Sélection de date');\n\n /**\n * Labels forwarded to the embedded <sds-calendar>. They live here because the picker is how the\n * calendar is normally reached — without forwarding, a consumer could translate the field but not\n * the panel it opens. Defaults match SdsCalendar's own, so nothing changes for existing consumers.\n */\n readonly calendarLabel = input<string>('Calendrier');\n readonly previousLabel = input<string>('Précédent');\n readonly nextLabel = input<string>('Suivant');\n readonly todayActionLabel = input<string>(\"Aujourd'hui\");\n readonly clearActionLabel = input<string>('Effacer');\n\n protected readonly value = signal<Date | null>(null);\n protected readonly open = signal(false);\n private readonly cvaDisabled = signal(false);\n private readonly calendar = viewChild(SdsCalendar);\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n /** The overlay panel, relocated to document.body while open. */\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly displayValue = computed(() => {\n const v = this.value();\n if (!v) return '';\n return this.showTime() ? `${this.format()(v)} ${formatHhMm(v)}` : this.format()(v);\n });\n /** Whether the clear button is shown (affects the field's right padding). */\n protected readonly showClear = computed(\n () => this.clearable() && !!this.value() && !this.isDisabled(),\n );\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed pointer-events-none');\n else parts.push('cursor-pointer');\n return parts.join(' ');\n });\n\n protected toggle(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.open.set(true);\n this.onTouched();\n // Run after the overlay is rendered, then relocate it to <body>.\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[role=\"dialog\"]');\n this.positionPanel(); // also relocates to document.body\n this.addReflowListeners();\n this.calendar()?.focusActiveCell();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove(); // pull the body-relocated node before destroying the view\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) {\n this.host.nativeElement.querySelector<HTMLInputElement>('input')?.focus();\n }\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue(null);\n }\n\n protected onCalendarValue(v: Date | null): void {\n this.setValue(v);\n }\n\n /**\n * A day was clicked in the overlay. Without a time editor, a day click is the whole selection, so\n * close. With showTime, the user still needs to set the time, so keep the panel open (they close it\n * with the \"done\" action, a click away, or Escape).\n */\n protected onDateSelect(): void {\n if (!this.showTime()) this.close(true);\n }\n\n /**\n * Escape closes the panel and consumes the event while the panel is open, so an ancestor modal does\n * not also dismiss on the same keystroke (mirrors sds-select). When the panel is already closed, the\n * event passes through so Escape can dismiss whatever contains the field.\n */\n protected onEscape(event: Event): void {\n if (!this.open()) return;\n event.preventDefault();\n this.close(true);\n }\n\n /** The readonly trigger is not a button, so open the overlay on Enter / Space / ArrowDown too. */\n protected onTriggerKeydown(event: Event): void {\n event.preventDefault(); // stop Space/ArrowDown scrolling and Enter submitting an enclosing form\n if (!this.isDisabled() && !this.open()) this.openPanel();\n }\n\n /**\n * Self-contained Tab trap for the overlay. The panel is relocated to document.body, so it sits\n * outside any ancestor modal's focus trap; without this, tabbing off the last control would land on\n * the page behind the dialog. Keeps Tab / Shift+Tab cycling within the panel's own focusables.\n */\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.panelEl) return;\n const sel =\n 'a[href],button:not([disabled]):not([tabindex=\"-1\"]),input:not([disabled]),' +\n '[tabindex]:not([tabindex=\"-1\"])';\n const items = Array.from(this.panelEl.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null,\n );\n if (items.length === 0) return;\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (event.shiftKey && (active === first || !this.panelEl.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n // --- body-appended overlay positioning ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n // capture=true so scrolling any ancestor scroll container repositions.\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n\n // appendTo body: relocate out of any clipping/stacking ancestor.\n if (panelEl.parentElement !== document.body) {\n document.body.appendChild(panelEl);\n }\n\n const r = triggerEl.getBoundingClientRect();\n const ph = panelEl.offsetHeight || 360;\n const pw = panelEl.offsetWidth || 296;\n const gap = 6;\n const margin = 8;\n\n // Below the field by default; flip above when there isn't room.\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n // Align to the field's left, but keep it within the viewport.\n let left = r.left;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n\n // Set directly (position: fixed → viewport coordinates) to avoid a flash.\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private setValue(v: Date | null): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: Date | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: Date | string | number | null): void {\n if (value === null || value === undefined || value === '') {\n this.value.set(null);\n return;\n }\n const d = value instanceof Date ? value : new Date(value);\n this.value.set(isNaN(d.getTime()) ? null : d);\n }\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\nlet nextId = 0;\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Context handed to a custom option template. Lets consumers destructure with\n * `let-option`, `let-selected=\"selected\"`, `let-label=\"label\"`, etc., with full\n * type inference (see {@link SdsSelectOption.ngTemplateContextGuard}).\n */\nexport interface SdsSelectOptionContext {\n /** Same as {@link option} — enables the implicit `let-option` binding. Typed `any` so consumer templates\n * can read their own option fields (e.g. `option.color`) without casting. */\n $implicit: any;\n /** The raw option object (or primitive) from the `options` array. */\n option: any;\n /** The resolved display label (via optionLabel). */\n label: string;\n /** The resolved option value (via optionValue). */\n value: unknown;\n /** Whether this option is currently selected. */\n selected: boolean;\n /** Whether this option is disabled. */\n disabled: boolean;\n /** Zero-based index within the currently displayed (filtered) options. */\n index: number;\n}\n\n/**\n * Supplies a custom template for each option row (and the selected value shown\n * in the trigger) of an `<sds-select>` / `<sds-multi-select>`. Use as a\n * structural template projected into the select:\n *\n * @example\n * <sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"catId\">\n * <ng-template sdsSelectOption let-option let-selected=\"selected\">\n * <span class=\"dot\" [style.background]=\"option.color\"></span>\n * <span class=\"truncate\">{{ option.name }}</span>\n * </ng-template>\n * </sds-select>\n */\n@Directive({\n selector: 'ng-template[sdsSelectOption]',\n standalone: true,\n})\nexport class SdsSelectOption {\n /** The wrapped template, rendered by the host select via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsSelectOptionContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsSelectOptionContext. */\n static ngTemplateContextGuard(\n _dir: SdsSelectOption,\n _ctx: unknown,\n ): _ctx is SdsSelectOptionContext {\n return true;\n }\n}\n\n/** Context handed to a custom empty-state template. */\nexport interface SdsSelectEmptyContext {\n /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */\n $implicit: string;\n /** The current filter query (empty when the field isn't filterable or is blank). */\n filterText: string;\n}\n\n/**\n * Supplies a custom template shown in place of the default \"no results\" message\n * when a select has no (matching) options.\n *\n * @example\n * <ng-template sdsSelectEmpty let-q>No category matches \"{{ q }}\".</ng-template>\n */\n@Directive({\n selector: 'ng-template[sdsSelectEmpty]',\n standalone: true,\n})\nexport class SdsSelectEmpty {\n readonly template = inject<TemplateRef<SdsSelectEmptyContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: SdsSelectEmpty,\n _ctx: unknown,\n ): _ctx is SdsSelectEmptyContext {\n return true;\n }\n}\n\n/** Context handed to a custom footer template. */\nexport interface SdsSelectFooterContext {\n /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */\n $implicit: string;\n /** The current filter query. */\n filterText: string;\n /** Closes the open panel — handy for a footer action (e.g. \"+ New…\"). */\n close: () => void;\n}\n\n/**\n * Supplies a custom sticky footer rendered below the option list — e.g. a\n * \"+ Create new\" action. The `close` context callback dismisses the panel.\n *\n * @example\n * <ng-template sdsSelectFooter let-close=\"close\">\n * <button (click)=\"createCategory(); close()\">+ New category</button>\n * </ng-template>\n */\n@Directive({\n selector: 'ng-template[sdsSelectFooter]',\n standalone: true,\n})\nexport class SdsSelectFooter {\n readonly template = inject<TemplateRef<SdsSelectFooterContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: SdsSelectFooter,\n _ctx: unknown,\n ): _ctx is SdsSelectFooterContext {\n return true;\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SdsSelectEmpty,\n SdsSelectFooter,\n SdsSelectOption,\n SdsSelectOptionContext,\n} from './sds-select-templates';\n\nexport type SdsSelectSize = 'sm' | 'md' | 'lg';\n/** Field skin. `filled` is borderless on a muted ground (to sit inside a page, matching sds-input's\n * filled appearance); `on-brand` is tuned for a dark surface. */\nexport type SdsSelectAppearance = 'default' | 'filled' | 'on-brand';\n\ninterface NormOption {\n label: string;\n value: unknown;\n disabled: boolean;\n /** The original option (object or primitive), passed to a custom option template. */\n raw: unknown;\n}\n\nconst SIZES: Record<SdsSelectSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * Single-select dropdown. Options may be primitives or objects (configure via\n * [optionLabel]/[optionValue]/[optionDisabled]). The overlay is appended to\n * <body>. Supports filtering, clearing, and full keyboard navigation.\n * Implements ControlValueAccessor — use with reactive forms or [(ngModel)].\n *\n * For object options, set [optionValue] or [dataKey] so written values match by\n * key; otherwise selection matching falls back to reference equality (a written\n * copy of an option will not match).\n *\n * Options render as plain text by default. To render richer options (an icon,\n * an avatar, a two-line row…) project template directives — the same content\n * also renders in the trigger for the selected value:\n * - `<ng-template sdsSelectOption let-option>` — one option row (see {@link SdsSelectOption});\n * context: the raw `option` (implicit), plus `label`, `value`, `selected`, `disabled`, `index`.\n * - `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n * - `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action, e.g. \"+ New…\"\n * (see {@link SdsSelectFooter}); `close()` dismisses the panel.\n *\n * @example\n * <sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"id\"\n * placeholder=\"Choisir un service\" [(ngModel)]=\"serviceId\" filter clearable />\n *\n * @example\n * <sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"categoryId\">\n * <ng-template sdsSelectOption let-option>\n * <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n * </ng-template>\n * </sds-select>\n */\n@Component({\n selector: 'sds-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsSelect), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"selectId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div class=\"relative\">\n <div\n #trigger\n [id]=\"selectId\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-activedescendant]=\"open() ? activeDescId() : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n class=\"relative flex items-center rounded-control border transition-colors focus:outline-none\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (optionTpl() && selectedOption()) {\n <span class=\"flex flex-1 items-center gap-2 truncate pl-3.5 text-ink\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"triggerContext()!\"\n />\n </span>\n } @else {\n <span\n class=\"flex-1 truncate pl-3.5\"\n [class]=\"selectedOption() ? 'text-ink' : 'text-ink-faint'\"\n >\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n }\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Effacer la sélection\"\n class=\"mr-1 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <span\n class=\"mr-3 ml-1 inline-flex shrink-0 items-center justify-center text-ink-soft transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"18\" />\n </span>\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div data-sds-select-panel class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\">\n @if (filter()) {\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n role=\"combobox\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeDescId()\"\n [placeholder]=\"filterPlaceholder()\"\n [value]=\"filterText()\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n aria-label=\"Rechercher\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n />\n </div>\n </div>\n }\n\n <ul [id]=\"listId\" role=\"listbox\" class=\"max-h-60 overflow-auto py-1\">\n @for (opt of filteredOptions(); track $index; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? 'true' : null\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, opt)\"\n (click)=\"opt.disabled ? null : selectOption(opt)\"\n (mouseenter)=\"opt.disabled ? null : highlightedIndex.set(i)\"\n >\n @if (optionTpl()) {\n <span class=\"flex min-w-0 flex-1 items-center gap-2\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"optionContext(opt, i)\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{ opt.label }}</span>\n }\n @if (isSelected(opt.value)) {\n <sds-icon name=\"check\" [size]=\"16\" class=\"shrink-0 text-brand-600\" />\n }\n </li>\n } @empty {\n @if (emptyTpl()) {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">\n <ng-container\n [ngTemplateOutlet]=\"emptyTpl()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: filterText(), filterText: filterText() }\"\n />\n </li>\n } @else {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ emptyMessage() }}</li>\n }\n }\n </ul>\n\n @if (footerTpl()) {\n <div class=\"border-t border-border\">\n <ng-container\n [ngTemplateOutlet]=\"footerTpl()!.template\"\n [ngTemplateOutletContext]=\"footerContext()\"\n />\n </div>\n }\n </div>\n }\n </div>\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsSelect implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly selectId = `sds-select-${nextId++}`;\n protected readonly listId = `${this.selectId}-list`;\n\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<string>('label');\n readonly optionValue = input<string>('');\n readonly optionDisabled = input<string>('disabled');\n /** Key used to compare object values for selection equality. */\n readonly dataKey = input<string>('');\n readonly placeholder = input<string>('Sélectionner…');\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsSelectSize>('md');\n readonly appearance = input<SdsSelectAppearance>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly filter = input(false, { transform: booleanAttribute });\n readonly filterPlaceholder = input<string>('Rechercher…');\n readonly emptyMessage = input<string>('Aucun résultat');\n\n /** Optional projected `<ng-template sdsSelectOption>` — custom option + selected-value rendering. */\n protected readonly optionTpl = contentChild(SdsSelectOption);\n /** Optional projected `<ng-template sdsSelectEmpty>` — custom no-results content. */\n protected readonly emptyTpl = contentChild(SdsSelectEmpty);\n /** Optional projected `<ng-template sdsSelectFooter>` — a sticky footer action. */\n protected readonly footerTpl = contentChild(SdsSelectFooter);\n\n protected readonly value = signal<unknown>(null);\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n private readonly cvaDisabled = signal(false);\n\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly filled = computed(() => this.appearance() === 'filled');\n protected readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly normalizedOptions = computed<NormOption[]>(() =>\n this.options().map((o) => this.norm(o)),\n );\n\n protected readonly filteredOptions = computed<NormOption[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.normalizedOptions();\n if (!this.filter() || !f) return all;\n return all.filter((o) => o.label.toLowerCase().includes(f));\n });\n\n protected readonly selectedOption = computed<NormOption | null>(\n () => this.normalizedOptions().find((o) => this.equals(o.value, this.value())) ?? null,\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && this.value() != null && !this.isDisabled(),\n );\n\n protected readonly activeDescId = computed(() =>\n this.highlightedIndex() >= 0 ? this.optionId(this.highlightedIndex()) : null,\n );\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n if (this.filled()) {\n // border-transparent (not border-0) so a filled field is the same height as a bordered one when a\n // form mixes them — mirrors sds-input's filled appearance.\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/25'\n : 'focus:ring-2 focus:ring-brand-500/25',\n );\n } else if (this.onBrand()) {\n parts.push('bg-white/10 text-white');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-white/15 focus:border-white/40 focus:ring-2 focus:ring-white/20',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n }\n parts.push(\n this.isDisabled()\n ? 'opacity-60 cursor-not-allowed pointer-events-none'\n : 'cursor-pointer',\n );\n return parts.join(' ');\n });\n\n // --- option normalization & equality ---\n private norm(raw: unknown): NormOption {\n if (raw !== null && typeof raw === 'object') {\n const o = raw as Record<string, unknown>;\n const labelKey = this.optionLabel();\n const label =\n labelKey && labelKey in o ? String(o[labelKey]) : String(o['label'] ?? raw);\n const value = this.optionValue() ? o[this.optionValue()] : raw;\n const disabled = this.optionDisabled() ? !!o[this.optionDisabled()] : !!o['disabled'];\n return { label, value, disabled, raw };\n }\n return { label: String(raw), value: raw, disabled: false, raw };\n }\n\n /** Context for a projected option template (an option row). */\n protected optionContext(opt: NormOption, index: number): SdsSelectOptionContext {\n return {\n $implicit: opt.raw,\n option: opt.raw,\n label: opt.label,\n value: opt.value,\n selected: this.isSelected(opt.value),\n disabled: opt.disabled,\n index,\n };\n }\n\n /** Context for the option template reused in the trigger to render the selected value. */\n protected readonly triggerContext = computed<SdsSelectOptionContext | null>(() => {\n const sel = this.selectedOption();\n return sel ? this.optionContext(sel, -1) : null;\n });\n\n /** Context for a projected footer template. */\n protected footerContext() {\n return { $implicit: this.filterText(), filterText: this.filterText(), close: () => this.close(true) };\n }\n\n private equals(a: unknown, b: unknown): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k];\n }\n return a === b;\n }\n\n protected isSelected(v: unknown): boolean {\n return this.value() != null && this.equals(v, this.value());\n }\n\n protected optionId(i: number): string {\n return `${this.selectId}-opt-${i}`;\n }\n\n protected optionClass(i: number, opt: NormOption): string {\n const base = 'flex cursor-pointer items-center justify-between gap-2 px-3 py-2 text-sm';\n if (opt.disabled) return `${base} cursor-not-allowed text-ink-faint opacity-60`;\n let cls = `${base} text-ink`;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (this.isSelected(opt.value)) cls += ' font-medium text-brand-700';\n return cls;\n }\n\n // --- open / close ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.open.set(true);\n this.onTouched();\n this.initHighlight();\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>(\n '[data-sds-select-panel]',\n );\n this.positionPanel();\n this.addReflowListeners();\n if (this.filter()) {\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n } else {\n this.trigger()?.nativeElement.focus();\n }\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue(null);\n }\n\n protected selectOption(opt: NormOption): void {\n this.setValue(opt.value);\n this.close(true);\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightFirst();\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n if (this.handleNavKey(event)) return;\n // Type-ahead (no-filter mode keeps focus on the trigger).\n if (\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n this.typeAhead(event.key);\n }\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): boolean {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); return true;\n case 'ArrowUp': event.preventDefault(); this.move(-1); return true;\n case 'Home': event.preventDefault(); this.highlightFirst(); return true;\n case 'End': event.preventDefault(); this.highlightLast(); return true;\n case 'Enter': event.preventDefault(); this.selectHighlighted(); return true;\n case 'Escape': event.preventDefault(); this.close(true); return true;\n case 'Tab': this.close(false); return true;\n default: return false;\n }\n }\n\n private initHighlight(): void {\n const opts = this.filteredOptions();\n const sel = opts.findIndex((o) => !o.disabled && this.equals(o.value, this.value()));\n this.highlightedIndex.set(sel >= 0 ? sel : this.firstEnabled(opts));\n }\n\n private firstEnabled(opts: NormOption[]): number {\n return opts.findIndex((o) => !o.disabled);\n }\n\n private move(delta: number): void {\n const opts = this.filteredOptions();\n if (!opts.length) return;\n let i = this.highlightedIndex();\n for (let step = 0; step < opts.length; step++) {\n i = (i + delta + opts.length) % opts.length;\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private highlightFirst(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n this.scrollHighlightedIntoView();\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private selectHighlighted(): void {\n const opt = this.filteredOptions()[this.highlightedIndex()];\n if (opt && !opt.disabled) this.selectOption(opt);\n }\n\n private typeBuffer = '';\n private typeTimer?: ReturnType<typeof setTimeout>;\n private typeAhead(char: string): void {\n clearTimeout(this.typeTimer);\n this.typeBuffer += char.toLowerCase();\n const opts = this.filteredOptions();\n const idx = opts.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (idx >= 0) {\n this.highlightedIndex.set(idx);\n this.scrollHighlightedIntoView();\n }\n this.typeTimer = setTimeout(() => (this.typeBuffer = ''), 600);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n const el = this.panelEl?.querySelector<HTMLElement>(\n `[data-index=\"${this.highlightedIndex()}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-date-picker) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 240;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n clearTimeout(this.typeTimer);\n this.panelEl?.remove();\n }\n\n private setValue(v: unknown): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.value.set(value ?? null);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n numberAttribute,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SdsSelectEmpty,\n SdsSelectFooter,\n SdsSelectOption,\n SdsSelectOptionContext,\n} from './sds-select-templates';\n\nexport type SdsMultiSelectSize = 'sm' | 'md' | 'lg';\nexport type SdsMultiSelectDisplay = 'comma' | 'chip';\n\ninterface NormOption {\n label: string;\n value: unknown;\n disabled: boolean;\n /** The original option (object or primitive), passed to a custom option template. */\n raw: unknown;\n}\n\nconst SIZES: Record<SdsMultiSelectSize, string> = {\n sm: 'min-h-9 text-sm',\n md: 'min-h-10 text-sm',\n lg: 'min-h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * Multi-select dropdown (value is an array). Options may be primitives or\n * objects (configure via [optionLabel]/[optionValue]/[optionDisabled]). The\n * overlay is appended to <body>. Supports a \"select all\" toggle, per-option\n * checkboxes, chip or comma display, filtering, clearing and keyboard nav.\n * Implements ControlValueAccessor — use with reactive forms or [(ngModel)].\n *\n * For object options, set [optionValue] or [dataKey] so written values match by\n * key; otherwise matching falls back to reference equality.\n *\n * Project template directives to customise the panel:\n * - `<ng-template sdsSelectOption let-option>` — the content of each option row, after its\n * checkbox (see {@link SdsSelectOption}); context: the raw `option` (implicit), plus `label`,\n * `value`, `selected`, `disabled`, `index`.\n * - `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n * - `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action (see {@link SdsSelectFooter});\n * `close()` dismisses the panel.\n *\n * @example\n * <sds-multi-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\"\n * display=\"chip\" filter [(ngModel)]=\"codes\" />\n *\n * @example\n * <sds-multi-select [options]=\"tags\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"tagIds\">\n * <ng-template sdsSelectOption let-option>\n * <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n * </ng-template>\n * </sds-multi-select>\n */\n@Component({\n selector: 'sds-multi-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsMultiSelect), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"selectId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div class=\"relative\">\n <div\n #trigger\n [id]=\"selectId\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-activedescendant]=\"open() && !filter() ? activeDescId() : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n class=\"relative flex items-center rounded-control border bg-surface transition-colors focus:outline-none\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (display() === 'chip' && selectedOptions().length) {\n <div class=\"flex flex-1 flex-wrap items-center gap-1 py-1 pl-2\">\n @for (opt of selectedOptions(); track $index) {\n <span class=\"inline-flex items-center gap-1 rounded bg-brand-50 py-0.5 pl-2 pr-1 text-xs font-medium text-brand-700\">\n {{ opt.label }}\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Retirer ' + opt.label\"\n class=\"inline-flex h-4 w-4 items-center justify-center rounded-full hover:bg-brand-100\"\n (click)=\"removeChip($event, opt)\"\n >\n <sds-icon name=\"x\" [size]=\"12\" />\n </button>\n </span>\n }\n </div>\n } @else {\n <span\n class=\"flex-1 truncate pl-3.5\"\n [class]=\"selectedOptions().length ? 'text-ink' : 'text-ink-faint'\"\n >\n {{ triggerLabel() }}\n </span>\n }\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Tout effacer\"\n class=\"mr-1 inline-flex h-6 w-6 shrink-0 items-center justify-center self-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <span\n class=\"mr-3 ml-1 shrink-0 self-center text-ink-soft transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"18\" />\n </span>\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div data-sds-select-panel class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\">\n @if (filter()) {\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n role=\"combobox\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeDescId()\"\n [placeholder]=\"filterPlaceholder()\"\n [value]=\"filterText()\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n aria-label=\"Rechercher\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n />\n </div>\n </div>\n }\n\n @if (hasToggleAll()) {\n <button\n type=\"button\"\n role=\"checkbox\"\n [id]=\"toggleAllId\"\n [attr.data-index]=\"-1\"\n [attr.aria-checked]=\"allFilteredSelected() ? 'true' : (toggleAllIndeterminate() ? 'mixed' : 'false')\"\n class=\"flex w-full items-center gap-2.5 border-b border-border px-3 py-2 text-sm text-ink\"\n [class.bg-brand-50]=\"highlightedIndex() === -1\"\n (click)=\"toggleAll()\"\n (mouseenter)=\"highlightedIndex.set(-1)\"\n >\n <span class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border\" [class]=\"checkboxClass(allFilteredSelected(), toggleAllIndeterminate())\">\n @if (allFilteredSelected()) {\n <sds-icon name=\"check\" [size]=\"12\" />\n } @else if (toggleAllIndeterminate()) {\n <span class=\"h-0.5 w-2.5 rounded-full bg-white\"></span>\n }\n </span>\n Tout sélectionner\n </button>\n }\n\n <ul [id]=\"listId\" role=\"listbox\" aria-multiselectable=\"true\" class=\"max-h-60 overflow-auto py-1\">\n @for (opt of filteredOptions(); track $index; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? 'true' : null\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, opt)\"\n (click)=\"opt.disabled ? null : toggleOption(opt)\"\n (mouseenter)=\"opt.disabled ? null : highlightedIndex.set(i)\"\n >\n <span class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border\" [class]=\"checkboxClass(isSelected(opt.value), false)\">\n @if (isSelected(opt.value)) {\n <sds-icon name=\"check\" [size]=\"12\" />\n }\n </span>\n @if (optionTpl()) {\n <span class=\"flex min-w-0 flex-1 items-center gap-2\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"optionContext(opt, i)\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{ opt.label }}</span>\n }\n </li>\n } @empty {\n @if (emptyTpl()) {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">\n <ng-container\n [ngTemplateOutlet]=\"emptyTpl()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: filterText(), filterText: filterText() }\"\n />\n </li>\n } @else {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ emptyMessage() }}</li>\n }\n }\n </ul>\n\n @if (footerTpl()) {\n <div class=\"border-t border-border\">\n <ng-container\n [ngTemplateOutlet]=\"footerTpl()!.template\"\n [ngTemplateOutletContext]=\"footerContext()\"\n />\n </div>\n }\n </div>\n }\n </div>\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsMultiSelect implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly selectId = `sds-multiselect-${nextId++}`;\n protected readonly listId = `${this.selectId}-list`;\n\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<string>('label');\n readonly optionValue = input<string>('');\n readonly optionDisabled = input<string>('disabled');\n readonly dataKey = input<string>('');\n readonly placeholder = input<string>('Sélectionner…');\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsMultiSelectSize>('md');\n readonly display = input<SdsMultiSelectDisplay>('comma');\n /** In comma mode, show a count label once more than this many are selected. */\n readonly maxSelectedLabels = input(3, { transform: numberAttribute });\n readonly selectedItemsLabel = input<string>('{0} éléments sélectionnés');\n readonly showToggleAll = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly filter = input(false, { transform: booleanAttribute });\n readonly filterPlaceholder = input<string>('Rechercher…');\n readonly emptyMessage = input<string>('Aucun résultat');\n\n /** Optional projected `<ng-template sdsSelectOption>` — custom option-row rendering. */\n protected readonly optionTpl = contentChild(SdsSelectOption);\n /** Optional projected `<ng-template sdsSelectEmpty>` — custom no-results content. */\n protected readonly emptyTpl = contentChild(SdsSelectEmpty);\n /** Optional projected `<ng-template sdsSelectFooter>` — a sticky footer action. */\n protected readonly footerTpl = contentChild(SdsSelectFooter);\n\n protected readonly value = signal<unknown[]>([]);\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n private readonly cvaDisabled = signal(false);\n\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly normalizedOptions = computed<NormOption[]>(() =>\n this.options().map((o) => this.norm(o)),\n );\n\n protected readonly filteredOptions = computed<NormOption[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.normalizedOptions();\n if (!this.filter() || !f) return all;\n return all.filter((o) => o.label.toLowerCase().includes(f));\n });\n\n protected readonly selectedOptions = computed<NormOption[]>(() =>\n this.normalizedOptions().filter((o) => this.isSelected(o.value)),\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && this.value().length > 0 && !this.isDisabled(),\n );\n\n protected readonly triggerLabel = computed(() => {\n const sel = this.selectedOptions();\n const total = this.value().length;\n if (!total) return this.placeholder();\n const max = this.maxSelectedLabels();\n const limit = Number.isFinite(max) ? max : 3;\n if (total <= limit) {\n const labels = sel.map((o) => o.label).join(', ');\n // Some selected values may not resolve to a current option.\n return total > sel.length ? `${labels} +${total - sel.length}`.trim() : labels;\n }\n return this.selectedItemsLabel().replace('{0}', String(total));\n });\n\n private readonly filteredEnabled = computed(() =>\n this.filteredOptions().filter((o) => !o.disabled),\n );\n protected readonly allFilteredSelected = computed(() => {\n const e = this.filteredEnabled();\n return e.length > 0 && e.every((o) => this.isSelected(o.value));\n });\n protected readonly toggleAllIndeterminate = computed(\n () => !this.allFilteredSelected() && this.filteredEnabled().some((o) => this.isSelected(o.value)),\n );\n /** Show the select-all row only when there is at least one enabled option. */\n protected readonly hasToggleAll = computed(\n () => this.showToggleAll() && this.filteredEnabled().length > 0,\n );\n protected readonly toggleAllId = `${this.selectId}-all`;\n\n protected readonly activeDescId = computed(() => {\n const i = this.highlightedIndex();\n if (i === -1) return this.hasToggleAll() ? this.toggleAllId : null;\n return i >= 0 ? this.optionId(i) : null;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n parts.push(\n this.isDisabled()\n ? 'opacity-60 cursor-not-allowed pointer-events-none'\n : 'cursor-pointer',\n );\n return parts.join(' ');\n });\n\n // --- normalization & equality ---\n private norm(raw: unknown): NormOption {\n if (raw !== null && typeof raw === 'object') {\n const o = raw as Record<string, unknown>;\n const labelKey = this.optionLabel();\n const label =\n labelKey && labelKey in o ? String(o[labelKey]) : String(o['label'] ?? raw);\n const value = this.optionValue() ? o[this.optionValue()] : raw;\n const disabled = this.optionDisabled() ? !!o[this.optionDisabled()] : !!o['disabled'];\n return { label, value, disabled, raw };\n }\n return { label: String(raw), value: raw, disabled: false, raw };\n }\n\n /** Context for a projected option template (an option row). */\n protected optionContext(opt: NormOption, index: number): SdsSelectOptionContext {\n return {\n $implicit: opt.raw,\n option: opt.raw,\n label: opt.label,\n value: opt.value,\n selected: this.isSelected(opt.value),\n disabled: opt.disabled,\n index,\n };\n }\n\n /** Context for a projected footer template. */\n protected footerContext() {\n return { $implicit: this.filterText(), filterText: this.filterText(), close: () => this.close(true) };\n }\n\n private equals(a: unknown, b: unknown): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k];\n }\n return a === b;\n }\n\n protected isSelected(v: unknown): boolean {\n return this.value().some((x) => this.equals(x, v));\n }\n\n protected optionId(i: number): string {\n return `${this.selectId}-opt-${i}`;\n }\n\n protected optionClass(i: number, opt: NormOption): string {\n const base = 'flex cursor-pointer items-center gap-2.5 px-3 py-2 text-sm';\n if (opt.disabled) return `${base} cursor-not-allowed text-ink-faint opacity-60`;\n let cls = `${base} text-ink`;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (this.isSelected(opt.value)) cls += ' font-medium';\n return cls;\n }\n\n protected checkboxClass(checked: boolean, indeterminate: boolean): string {\n return checked || indeterminate\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface';\n }\n\n // --- open / close ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.open.set(true);\n this.onTouched();\n this.initHighlight();\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[data-sds-select-panel]');\n this.positionPanel();\n this.addReflowListeners();\n if (this.filter()) {\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n } else {\n this.trigger()?.nativeElement.focus();\n }\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue([]);\n }\n\n protected removeChip(event: Event, opt: NormOption): void {\n event.stopPropagation();\n this.toggleOption(opt);\n }\n\n protected toggleOption(opt: NormOption): void {\n const cur = this.value();\n const exists = cur.some((x) => this.equals(x, opt.value));\n const next = exists\n ? cur.filter((x) => !this.equals(x, opt.value))\n : [...cur, opt.value];\n this.setValue(next);\n }\n\n protected toggleAll(): void {\n const enabled = this.filteredEnabled();\n if (this.allFilteredSelected()) {\n this.setValue(\n this.value().filter((v) => !enabled.some((o) => this.equals(o.value, v))),\n );\n } else {\n const toAdd = enabled.filter((o) => !this.isSelected(o.value)).map((o) => o.value);\n this.setValue([...this.value(), ...toAdd]);\n }\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightFirst();\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n } else if (event.key === 'Backspace' && this.selectedOptions().length) {\n event.preventDefault();\n const sel = this.selectedOptions();\n this.toggleOption(sel[sel.length - 1]);\n }\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.toggleHighlighted();\n return;\n }\n if (this.handleNavKey(event)) return;\n if (\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n this.typeAhead(event.key);\n }\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): boolean {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); return true;\n case 'ArrowUp': event.preventDefault(); this.move(-1); return true;\n case 'Home': event.preventDefault(); this.highlightFirst(); return true;\n case 'End': event.preventDefault(); this.highlightLast(); return true;\n case 'Enter': event.preventDefault(); this.toggleHighlighted(); return true;\n case 'Escape': event.preventDefault(); this.close(true); return true;\n case 'Tab': this.close(false); return true;\n default: return false;\n }\n }\n\n private initHighlight(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n }\n\n private firstEnabled(opts: NormOption[]): number {\n return opts.findIndex((o) => !o.disabled);\n }\n\n private move(delta: number): void {\n // Navigable rows: the select-all sentinel (-1) followed by enabled options.\n const nav: number[] = [];\n if (this.hasToggleAll()) nav.push(-1);\n this.filteredOptions().forEach((o, i) => {\n if (!o.disabled) nav.push(i);\n });\n if (!nav.length) return;\n const cur = nav.indexOf(this.highlightedIndex());\n const next = cur === -1 ? (delta > 0 ? 0 : nav.length - 1) : (cur + delta + nav.length) % nav.length;\n this.highlightedIndex.set(nav[next]);\n this.scrollHighlightedIntoView();\n }\n\n private highlightFirst(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n this.scrollHighlightedIntoView();\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private toggleHighlighted(): void {\n if (this.highlightedIndex() === -1) {\n if (this.hasToggleAll()) this.toggleAll();\n return;\n }\n const opt = this.filteredOptions()[this.highlightedIndex()];\n if (opt && !opt.disabled) this.toggleOption(opt);\n }\n\n private typeBuffer = '';\n private typeTimer?: ReturnType<typeof setTimeout>;\n private typeAhead(char: string): void {\n clearTimeout(this.typeTimer);\n this.typeBuffer += char.toLowerCase();\n const opts = this.filteredOptions();\n const idx = opts.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (idx >= 0) {\n this.highlightedIndex.set(idx);\n this.scrollHighlightedIntoView();\n }\n this.typeTimer = setTimeout(() => (this.typeBuffer = ''), 600);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n const el = this.panelEl?.querySelector<HTMLElement>(\n `[data-index=\"${this.highlightedIndex()}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 240;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n clearTimeout(this.typeTimer);\n this.panelEl?.remove();\n }\n\n private setValue(v: unknown[]): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n // Chip display can change the trigger height while the panel is open.\n if (this.open()) setTimeout(() => this.positionPanel());\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: unknown[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown[] | null): void {\n this.value.set(Array.isArray(value) ? [...value] : []);\n }\n registerOnChange(fn: (value: unknown[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n}\n","/**\n * Curated country dataset for <sds-phone-input>. Dependency-free: each entry\n * carries the dial code, the valid national-significant digit length(s) used\n * for validation, a best-effort display mask (# = a digit) and an example.\n *\n * `lengths` are the number of significant national digits, i.e. excluding the\n * dial code and any leading trunk \"0\". Add or override entries as needed.\n */\nexport interface SdsPhoneCountry {\n /** ISO 3166-1 alpha-2 code, e.g. 'BE'. */\n iso2: string;\n /** Localised display name. */\n name: string;\n /** International dial code without '+', e.g. '32'. */\n dialCode: string;\n /** Valid national-significant digit counts (excluding dial/trunk). */\n lengths: number[];\n /** Display grouping mask; '#' is a digit placeholder, other chars are literal. */\n format: string;\n /** Example national-significant number (digits only) for the placeholder. */\n example: string;\n}\n\nexport const SDS_PHONE_COUNTRIES: readonly SdsPhoneCountry[] = [\n { iso2: 'BE', name: 'Belgique', dialCode: '32', lengths: [9], format: '### ## ## ##', example: '470123456' },\n { iso2: 'FR', name: 'France', dialCode: '33', lengths: [9], format: '# ## ## ## ##', example: '612345678' },\n { iso2: 'LU', name: 'Luxembourg', dialCode: '352', lengths: [9, 8, 6], format: '### ### ###', example: '628123456' },\n { iso2: 'NL', name: 'Pays-Bas', dialCode: '31', lengths: [9], format: '# ## ## ## ##', example: '612345678' },\n { iso2: 'DE', name: 'Allemagne', dialCode: '49', lengths: [10, 11], format: '#### #######', example: '15123456789' },\n { iso2: 'GB', name: 'Royaume-Uni', dialCode: '44', lengths: [10], format: '#### ######', example: '7400123456' },\n { iso2: 'IE', name: 'Irlande', dialCode: '353', lengths: [9], format: '## ### ####', example: '850123456' },\n { iso2: 'CH', name: 'Suisse', dialCode: '41', lengths: [9], format: '## ### ## ##', example: '781234567' },\n { iso2: 'ES', name: 'Espagne', dialCode: '34', lengths: [9], format: '### ## ## ##', example: '612345678' },\n { iso2: 'IT', name: 'Italie', dialCode: '39', lengths: [9, 10], format: '### ### ####', example: '3123456789' },\n { iso2: 'PT', name: 'Portugal', dialCode: '351', lengths: [9], format: '### ### ###', example: '912345678' },\n { iso2: 'AT', name: 'Autriche', dialCode: '43', lengths: [10, 11], format: '### #######', example: '6641234567' },\n { iso2: 'DK', name: 'Danemark', dialCode: '45', lengths: [8], format: '## ## ## ##', example: '20123456' },\n { iso2: 'SE', name: 'Suède', dialCode: '46', lengths: [9], format: '## ### ## ##', example: '701234567' },\n { iso2: 'NO', name: 'Norvège', dialCode: '47', lengths: [8], format: '### ## ###', example: '40612345' },\n { iso2: 'PL', name: 'Pologne', dialCode: '48', lengths: [9], format: '### ### ###', example: '512345678' },\n { iso2: 'US', name: 'États-Unis', dialCode: '1', lengths: [10], format: '(###) ###-####', example: '2015550123' },\n { iso2: 'CA', name: 'Canada', dialCode: '1', lengths: [10], format: '(###) ###-####', example: '2042345678' },\n { iso2: 'MA', name: 'Maroc', dialCode: '212', lengths: [9], format: '### ## ## ##', example: '612345678' },\n { iso2: 'TR', name: 'Turquie', dialCode: '90', lengths: [10], format: '### ### ## ##', example: '5012345678' },\n];\n\n/** Reduce raw input to national-significant digits (drops non-digits & leading trunk zeros). */\nexport function sdsNormalizeSignificant(raw: string): string {\n return (raw ?? '').replace(/\\D/g, '').replace(/^0+/, '');\n}\n\n/**\n * Group `digits` for display using `mask` ('#' = digit). Digits beyond the mask\n * are appended grouped in pairs; an incomplete number stops at the last digit.\n */\nexport function sdsFormatNational(digits: string, mask: string): string {\n if (!digits) return '';\n if (!mask) return digits.replace(/(\\d{2})(?=\\d)/g, '$1 ');\n\n let out = '';\n let di = 0;\n for (const ch of mask) {\n if (di >= digits.length) break;\n if (ch === '#') out += digits[di++];\n else out += ch;\n }\n if (di < digits.length) {\n out += ' ' + digits.slice(di).replace(/(\\d{2})(?=\\d)/g, '$1 ');\n }\n return out.trim();\n}\n\n/** Find the country whose dial code is the longest prefix of an E.164 digit string. */\nexport function sdsMatchDialCode(\n e164Digits: string,\n countries: readonly SdsPhoneCountry[],\n): SdsPhoneCountry | null {\n let best: SdsPhoneCountry | null = null;\n for (const c of countries) {\n if (e164Digits.startsWith(c.dialCode)) {\n if (!best || c.dialCode.length > best.dialCode.length) best = c;\n }\n }\n return best;\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SDS_PHONE_COUNTRIES,\n SdsPhoneCountry,\n sdsFormatNational,\n sdsMatchDialCode,\n sdsNormalizeSignificant,\n} from './phone-countries';\n\nexport type SdsPhoneInputSize = 'sm' | 'md' | 'lg';\n\n/** Payload of (phoneChange): the canonical and parsed parts of the number. */\nexport interface SdsPhoneValue {\n /** E.164 string, e.g. '+32470123456' (empty when no number is entered). */\n e164: string;\n /** Selected country ISO2 code. */\n country: string;\n /** Dial code without '+', e.g. '32'. */\n dialCode: string;\n /** National-significant digits, e.g. '470123456'. */\n national: string;\n /** Whether the national number matches an expected length for the country. */\n valid: boolean;\n}\n\nconst SIZES: Record<SdsPhoneInputSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * International phone number input: a country selector (ISO chip + dial code)\n * with a searchable, body-appended dropdown, plus a formatted national-number\n * field. Implements ControlValueAccessor (value is an E.164 string such as\n * '+32470123456') and Validator (national length is checked per country).\n *\n * @example\n * <sds-phone-input label=\"Téléphone\" defaultCountry=\"BE\"\n * [preferredCountries]=\"['BE','FR','LU']\"\n * [(ngModel)]=\"phone\" required />\n */\n@Component({\n selector: 'sds-phone-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsPhoneInput), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => SdsPhoneInput), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div\n #anchor\n class=\"relative flex items-stretch rounded-control border bg-surface transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n <!-- country selector -->\n <button\n type=\"button\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n aria-haspopup=\"listbox\"\n [attr.aria-label]=\"countryAriaLabel()\"\n class=\"flex shrink-0 items-center gap-1.5 rounded-l-control pl-2.5 pr-2 focus:outline-none\"\n [class.cursor-not-allowed]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"grid h-5 min-w-7 place-items-center rounded bg-muted px-1 text-[11px] font-semibold tracking-wide text-ink-soft\">\n {{ country().iso2 }}\n </span>\n <span class=\"text-ink-soft\">+{{ country().dialCode }}</span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n class=\"text-ink-faint transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n <div class=\"my-1.5 w-px shrink-0 bg-border\"></div>\n\n <!-- national number -->\n <input\n #field\n [id]=\"fieldId\"\n type=\"tel\"\n inputmode=\"tel\"\n autocomplete=\"tel-national\"\n [placeholder]=\"placeholderText()\"\n [disabled]=\"isDisabled()\"\n [value]=\"display()\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n class=\"w-full min-w-0 bg-transparent px-3 outline-none placeholder:text-ink-faint disabled:cursor-not-allowed\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n\n @if (clearable() && national() && !isDisabled()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"mr-1.5 inline-flex w-7 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div\n data-sds-phone-panel\n class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\"\n >\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n [attr.aria-controls]=\"listId\"\n [value]=\"filterText()\"\n [placeholder]=\"searchPlaceholder()\"\n [attr.aria-label]=\"searchLabel()\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n </div>\n\n <ul [id]=\"listId\" role=\"listbox\" class=\"max-h-64 overflow-auto py-1\">\n @for (c of filteredCountries(); track c.iso2; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"c.iso2 === country().iso2\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, c)\"\n (click)=\"selectCountry(c)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n <span class=\"grid h-5 min-w-7 place-items-center rounded bg-muted px-1 text-[11px] font-semibold tracking-wide text-ink-soft\">\n {{ c.iso2 }}\n </span>\n <span class=\"flex-1 truncate\">{{ c.name }}</span>\n <span class=\"text-ink-faint\">+{{ c.dialCode }}</span>\n </li>\n } @empty {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ noResultsLabel() }}</li>\n }\n </ul>\n </div>\n }\n\n @if (showError()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ errorMessage() }}\n </p>\n } @else if (hint() || autoHint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() || autoHint() }}\n </p>\n }\n `,\n})\nexport class SdsPhoneInput implements ControlValueAccessor, Validator, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly fieldId = `sds-phone-${nextId++}`;\n protected readonly listId = `${this.fieldId}-list`;\n\n readonly label = input<string>('');\n readonly hint = input<string>('');\n /** External error message; overrides the built-in validation message. */\n readonly error = input<string>('');\n readonly size = input<SdsPhoneInputSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Initial country (ISO2) when no value is written. */\n readonly defaultCountry = input<string>('BE');\n /** ISO2 codes shown first in the list. */\n readonly preferredCountries = input<string[]>([]);\n /** Restrict the list to these ISO2 codes (empty = all). */\n readonly onlyCountries = input<string[]>([]);\n /** Show an example number as a hint when no [hint] is provided. */\n readonly showExampleHint = input(true, { transform: booleanAttribute });\n readonly requiredMessage = input<string>('Numéro de téléphone requis');\n\n /**\n * Accessible name of the country selector. `{country}` is replaced with the selected country's\n * name. A token rather than a prefix because word order differs per language. French default so\n * existing consumers are unchanged; translate it in any app serving more than one language.\n *\n * Note the interpolated country NAME still comes from the library's built-in country table, which\n * is French-only — translating this template fixes the wrapper, not the name inside it.\n */\n readonly countryLabel = input<string>('Indicatif pays : {country}');\n\n /**\n * Accessible name for the clear button. It is icon-only, so this string is its ONLY accessible\n * name — a hardcoded French one is simply wrong in every other locale.\n */\n readonly clearLabel = input<string>('Effacer');\n\n /** Accessible name for the country-search field inside the dropdown. */\n readonly searchLabel = input<string>('Rechercher un pays');\n\n /** Placeholder text of the country-search field. */\n readonly searchPlaceholder = input<string>('Rechercher un pays…');\n\n /** Shown in place of the list when no country matches the filter. */\n readonly noResultsLabel = input<string>('Aucun pays');\n\n /**\n * Built-in validation messages. `{lengths}` is replaced with the country's accepted national\n * lengths, joined with {@link lengthSeparator}. Siblings of {@link requiredMessage}, which was\n * already translatable — these two were not, so an English or Dutch app showed French errors.\n */\n readonly incompleteMessage = input<string>('Numéro incomplet — {lengths} chiffres attendus');\n readonly invalidMessage = input<string>('Numéro invalide — {lengths} chiffres attendus');\n\n /** Joins the accepted lengths when a country allows more than one (e.g. \"8 ou 9\"). */\n readonly lengthSeparator = input<string>(' ou ');\n\n /**\n * Auto-generated example hint (see {@link showExampleHint}). `{number}` is replaced with the\n * formatted international example number.\n */\n readonly exampleHintTemplate = input<string>('Ex. {number}');\n\n /** Emitted with the parsed parts whenever the number or country changes. */\n readonly phoneChange = output<SdsPhoneValue>();\n\n protected readonly national = signal('');\n protected readonly countryIso = signal('');\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n protected readonly touched = signal(false);\n private readonly cvaDisabled = signal(false);\n\n private readonly anchor = viewChild<ElementRef<HTMLElement>>('anchor');\n private readonly field = viewChild<ElementRef<HTMLInputElement>>('field');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n /** Countries after applying [onlyCountries] and [preferredCountries] ordering. */\n protected readonly availableCountries = computed<SdsPhoneCountry[]>(() => {\n const only = this.onlyCountries().map((c) => c.toUpperCase());\n let list = SDS_PHONE_COUNTRIES.slice();\n if (only.length) list = list.filter((c) => only.includes(c.iso2));\n\n const preferred = this.preferredCountries().map((c) => c.toUpperCase());\n if (preferred.length) {\n const rank = (iso2: string) => {\n const i = preferred.indexOf(iso2);\n return i === -1 ? preferred.length : i;\n };\n list = list.slice().sort((a, b) => rank(a.iso2) - rank(b.iso2));\n }\n return list;\n });\n\n protected readonly country = computed<SdsPhoneCountry>(() => {\n const iso = this.countryIso() || this.defaultCountry().toUpperCase();\n return (\n this.availableCountries().find((c) => c.iso2 === iso) ??\n this.availableCountries()[0] ??\n SDS_PHONE_COUNTRIES[0]\n );\n });\n\n protected readonly filteredCountries = computed<SdsPhoneCountry[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.availableCountries();\n if (!f) return all;\n return all.filter(\n (c) =>\n c.name.toLowerCase().includes(f) ||\n c.iso2.toLowerCase().includes(f) ||\n c.dialCode.includes(f.replace('+', '')),\n );\n });\n\n protected readonly display = computed(() =>\n sdsFormatNational(this.national(), this.country().format),\n );\n\n protected readonly placeholderText = computed(() =>\n sdsFormatNational(this.country().example, this.country().format),\n );\n\n protected readonly autoHint = computed(() => {\n if (!this.showExampleHint()) return '';\n const c = this.country();\n const number = `+${c.dialCode} ${sdsFormatNational(c.example, c.format)}`;\n return this.exampleHintTemplate().replace('{number}', number);\n });\n\n protected readonly countryAriaLabel = computed(() =>\n this.countryLabel().replace('{country}', this.country().name),\n );\n\n protected readonly e164 = computed(() => {\n const d = this.national();\n return d ? `+${this.country().dialCode}${d}` : '';\n });\n\n /** Non-empty but national length is not valid for the country. */\n protected readonly invalid = computed(() => {\n const d = this.national();\n if (!d) return false;\n const lengths = this.country().lengths;\n return lengths.length > 0 && !lengths.includes(d.length);\n });\n\n protected readonly showError = computed(() => {\n if (this.error()) return true;\n if (!this.touched()) return false;\n if (this.required() && !this.national()) return true;\n return this.invalid();\n });\n\n protected readonly errorMessage = computed(() => {\n if (this.error()) return this.error();\n if (this.required() && !this.national()) return this.requiredMessage();\n const lengths = this.country().lengths;\n const expected = lengths.join(this.lengthSeparator());\n const len = this.national().length;\n const min = Math.min(...lengths);\n if (len < min) return this.incompleteMessage().replace('{lengths}', expected);\n return this.invalidMessage().replace('{lengths}', expected);\n });\n\n protected readonly describedBy = computed(() => {\n if (this.showError()) return `${this.fieldId}-err`;\n if (this.hint() || this.autoHint()) return `${this.fieldId}-hint`;\n return null;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.showError()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n return parts.join(' ');\n });\n\n protected optionId(i: number): string {\n return `${this.fieldId}-opt-${i}`;\n }\n\n protected optionClass(i: number, c: SdsPhoneCountry): string {\n const base = 'flex cursor-pointer items-center gap-2.5 px-3 py-2 text-sm text-ink';\n let cls = base;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (c.iso2 === this.country().iso2) cls += ' font-medium';\n return cls;\n }\n\n // --- national number input ---\n protected onInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n const max = Math.max(...this.country().lengths, 0) || 15;\n const next = sdsNormalizeSignificant(raw).slice(0, max);\n this.national.set(next);\n this.emit();\n }\n\n protected clear(): void {\n this.national.set('');\n this.markTouched();\n this.emit();\n this.field()?.nativeElement.focus();\n }\n\n // --- country dropdown ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.highlightedIndex.set(\n this.filteredCountries().findIndex((c) => c.iso2 === this.country().iso2),\n );\n this.open.set(true);\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[data-sds-phone-panel]');\n this.positionPanel();\n this.addReflowListeners();\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.anchor()?.nativeElement.querySelector('button')?.focus();\n }\n\n protected selectCountry(c: SdsPhoneCountry): void {\n const changed = c.iso2 !== this.country().iso2;\n this.countryIso.set(c.iso2);\n // Re-clamp the existing number to the new country's max length.\n const max = Math.max(...c.lengths, 0) || 15;\n if (this.national().length > max) this.national.set(this.national().slice(0, max));\n this.close(true);\n if (changed) this.emit();\n this.field()?.nativeElement.focus();\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightedIndex.set(this.filteredCountries().length ? 0 : -1);\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n this.handleNavKey(event);\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); break;\n case 'ArrowUp': event.preventDefault(); this.move(-1); break;\n case 'Home': event.preventDefault(); this.highlightedIndex.set(0); this.scrollHighlightedIntoView(); break;\n case 'End': event.preventDefault(); this.highlightedIndex.set(this.filteredCountries().length - 1); this.scrollHighlightedIntoView(); break;\n case 'Enter': {\n event.preventDefault();\n const c = this.filteredCountries()[this.highlightedIndex()];\n if (c) this.selectCountry(c);\n break;\n }\n case 'Escape': event.preventDefault(); this.close(true); break;\n case 'Tab': this.close(false); break;\n }\n }\n\n private move(delta: number): void {\n const list = this.filteredCountries();\n if (!list.length) return;\n const len = list.length;\n const i = (this.highlightedIndex() + delta + len) % len;\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n this.panelEl\n ?.querySelector<HTMLElement>(`[data-index=\"${this.highlightedIndex()}\"]`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const anchorEl = this.anchor()?.nativeElement;\n const panelEl = this.panelEl;\n if (!anchorEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = anchorEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 280;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n protected markTouched(): void {\n this.touched.set(true);\n this.onTouched();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private emit(): void {\n const value = this.e164();\n this.onChange(value);\n this.onValidatorChange();\n this.phoneChange.emit({\n e164: value,\n country: this.country().iso2,\n dialCode: this.country().dialCode,\n national: this.national(),\n valid: !!value && !this.invalid(),\n });\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n const raw = (value ?? '').trim();\n if (!raw) {\n this.national.set('');\n return;\n }\n if (raw.startsWith('+')) {\n const digits = raw.slice(1).replace(/\\D/g, '');\n const match = sdsMatchDialCode(digits, this.availableCountries());\n if (match) {\n this.countryIso.set(match.iso2);\n this.national.set(sdsNormalizeSignificant(digits.slice(match.dialCode.length)));\n return;\n }\n }\n // No '+' / unknown dial code: treat as a national number for the current country.\n this.national.set(sdsNormalizeSignificant(raw));\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n\n // --- Validator ---\n private onValidatorChange: () => void = () => {};\n\n validate(_control: AbstractControl): ValidationErrors | null {\n const d = this.national();\n if (!d) return this.required() ? { required: true } : null;\n const lengths = this.country().lengths;\n if (lengths.length && !lengths.includes(d.length)) {\n return {\n phoneInvalid: {\n country: this.country().iso2,\n expectedLengths: lengths,\n actualLength: d.length,\n },\n };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsSelect } from '../select/sds-select';\n\nexport type SdsPaginatorSize = 'sm' | 'md' | 'lg';\n\n/** Payload emitted by (pageChange) whenever the page or page size changes. */\nexport interface SdsPaginatorState {\n /** Zero-based index of the current page. */\n page: number;\n /** Zero-based index of the first record on the current page. */\n first: number;\n /** Rows displayed per page. */\n rows: number;\n /** Total number of pages. */\n pageCount: number;\n /** Total number of records. */\n totalRecords: number;\n}\n\nconst SIZES: Record<SdsPaginatorSize, string> = {\n sm: 'h-8 min-w-8 text-xs',\n md: 'h-9 min-w-9 text-sm',\n lg: 'h-11 min-w-11 text-base',\n};\n\nconst ICON_SIZES: Record<SdsPaginatorSize, number> = { sm: 15, md: 16, lg: 18 };\n\nconst BTN_BASE =\n 'inline-flex items-center justify-center rounded-control px-1.5 font-medium ' +\n 'transition-colors select-none focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-brand-500 focus-visible:ring-offset-1';\n\n/**\n * Pagination control (mirrors PrimeNG's paginator). Drives a sliding window of\n * page links with first/prev/next/last navigation, an optional rows-per-page\n * dropdown (reuses <sds-select>), a current-page report and a jump-to-page input.\n *\n * State is exposed as two-way models: [first] (zero-based index of the first\n * record on the page) and [rows] (page size). A combined (pageChange) event\n * carries the full {@link SdsPaginatorState} on every change.\n *\n * @example\n * <sds-paginator\n * [totalRecords]=\"120\"\n * [(first)]=\"first\"\n * [(rows)]=\"rows\"\n * [rowsPerPageOptions]=\"[10, 20, 50]\"\n * showCurrentPageReport\n * (pageChange)=\"load($event)\"\n * />\n */\n@Component({\n selector: 'sds-paginator',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, SdsIcon, SdsSelect],\n host: { '[class]': 'hostClass()' },\n template: `\n @if (showCurrentPageReport()) {\n <span class=\"text-sm text-ink-soft\">{{ reportText() }}</span>\n }\n\n <div class=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <!-- page navigation -->\n <nav class=\"flex items-center gap-1\" [attr.aria-label]=\"paginationLabel()\">\n @if (showFirstLastIcon()) {\n <button\n type=\"button\"\n [class]=\"navClass(firstDisabled())\"\n [disabled]=\"firstDisabled()\"\n [attr.aria-label]=\"firstPageLabel()\"\n (click)=\"firstPage()\"\n >\n <sds-icon name=\"chevrons-left\" [size]=\"iconSize()\" />\n </button>\n }\n <button\n type=\"button\"\n [class]=\"navClass(firstDisabled())\"\n [disabled]=\"firstDisabled()\"\n [attr.aria-label]=\"previousPageLabel()\"\n (click)=\"prevPage()\"\n >\n <sds-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n @if (showPageLinks()) {\n @for (p of pageLinks(); track $index) {\n <button\n type=\"button\"\n [class]=\"linkClass(p === page())\"\n [attr.aria-label]=\"pageLinkAriaLabel(p)\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n [disabled]=\"disabled()\"\n (click)=\"changePage(p)\"\n >\n {{ p + 1 }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n [class]=\"navClass(lastDisabled())\"\n [disabled]=\"lastDisabled()\"\n [attr.aria-label]=\"nextPageLabel()\"\n (click)=\"nextPage()\"\n >\n <sds-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n @if (showFirstLastIcon()) {\n <button\n type=\"button\"\n [class]=\"navClass(lastDisabled())\"\n [disabled]=\"lastDisabled()\"\n [attr.aria-label]=\"lastPageLabel()\"\n (click)=\"lastPage()\"\n >\n <sds-icon name=\"chevrons-right\" [size]=\"iconSize()\" />\n </button>\n }\n </nav>\n\n <!-- rows per page -->\n @if (rowsPerPageOptions().length) {\n <label class=\"flex items-center gap-2 text-sm text-ink-soft\">\n <span>{{ rowsPerPageLabel() }}</span>\n <span class=\"w-20\">\n <sds-select\n size=\"sm\"\n [ariaLabel]=\"rowsPerPageLabel()\"\n [options]=\"rowsPerPageOptions()\"\n [ngModel]=\"rows()\"\n (ngModelChange)=\"onRowsChange($event)\"\n [disabled]=\"disabled()\"\n />\n </span>\n </label>\n }\n\n <!-- jump to page -->\n @if (showJumpToPageInput()) {\n <label class=\"flex items-center gap-2 text-sm text-ink-soft\">\n <span>{{ jumpToPageLabel() }}</span>\n <input\n type=\"number\"\n min=\"1\"\n [max]=\"pageCount()\"\n [value]=\"page() + 1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"jumpToPageAriaLabel()\"\n (change)=\"onJump($event)\"\n class=\"h-9 w-16 rounded-control border border-border bg-surface px-2 text-center text-sm text-ink outline-none transition-colors focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25 disabled:opacity-60\"\n />\n </label>\n }\n </div>\n `,\n})\nexport class SdsPaginator {\n /** Total number of records to paginate. */\n readonly totalRecords = input(0, { transform: numberAttribute });\n /** Zero-based index of the first record on the current page (two-way). */\n readonly first = model(0);\n /** Rows displayed per page (two-way). */\n readonly rows = model(10);\n /** When non-empty, renders a rows-per-page dropdown with these choices. */\n readonly rowsPerPageOptions = input<number[]>([]);\n /** Maximum count of numbered page links shown in the sliding window. */\n readonly pageLinkSize = input(5, { transform: numberAttribute });\n readonly showFirstLastIcon = input(true, { transform: booleanAttribute });\n readonly showPageLinks = input(true, { transform: booleanAttribute });\n readonly showCurrentPageReport = input(false, { transform: booleanAttribute });\n /** Tokens: {first} {last} {totalRecords} {currentPage} {totalPages} {rows}. */\n readonly currentPageReportTemplate = input<string>('{first} – {last} of {totalRecords}');\n readonly showJumpToPageInput = input(false, { transform: booleanAttribute });\n readonly rowsPerPageLabel = input<string>('Rows per page');\n readonly jumpToPageLabel = input<string>('Go to');\n\n /**\n * Accessible name for the <nav> wrapping the page controls, and for the four icon-only\n * first/prev/next/last buttons. Those buttons have no text, so these strings are their ONLY\n * accessible names — the English defaults suit an English-first app, but an app serving more than\n * one language MUST pass translated values.\n */\n readonly paginationLabel = input<string>('Pagination');\n readonly firstPageLabel = input<string>('First page');\n readonly previousPageLabel = input<string>('Previous page');\n readonly nextPageLabel = input<string>('Next page');\n readonly lastPageLabel = input<string>('Last page');\n\n /**\n * Accessible name of a numbered page link. `{page}` is replaced with the 1-based page number —\n * a token rather than a prefix because word order is not the same in every language.\n */\n readonly pageLinkLabel = input<string>('Page {page}');\n\n /**\n * Accessible name of the jump-to-page field. Separate from the visible {@link jumpToPageLabel}\n * (\"Go to\") on purpose: the visible text is terse because it sits next to the field, while the\n * accessible name has to stand alone.\n */\n readonly jumpToPageAriaLabel = input<string>('Go to page');\n readonly size = input<SdsPaginatorSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Fires after any page or page-size change with the full paginator state. */\n readonly pageChange = output<SdsPaginatorState>();\n\n protected readonly pageCount = computed(() =>\n Math.max(1, Math.ceil(this.totalRecords() / Math.max(1, this.rows()))),\n );\n\n protected readonly page = computed(() =>\n Math.min(this.pageCount() - 1, Math.floor(this.first() / Math.max(1, this.rows()))),\n );\n\n protected readonly firstDisabled = computed(() => this.disabled() || this.page() <= 0);\n protected readonly lastDisabled = computed(\n () => this.disabled() || this.page() >= this.pageCount() - 1,\n );\n\n protected readonly iconSize = computed(() => ICON_SIZES[this.size()]);\n\n // Sliding window of zero-based page indices, centred on the current page.\n protected readonly pageLinks = computed<number[]>(() => {\n const pages = this.pageCount();\n const visible = Math.min(this.pageLinkSize(), pages);\n let start = Math.max(0, Math.ceil(this.page() - visible / 2));\n const end = Math.min(pages - 1, start + visible - 1);\n start = Math.max(0, start - (visible - (end - start + 1)));\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n });\n\n protected readonly reportText = computed(() => {\n const total = this.totalRecords();\n const first = total === 0 ? 0 : this.first() + 1;\n const last = Math.min(this.first() + this.rows(), total);\n return this.currentPageReportTemplate()\n .replace('{first}', String(first))\n .replace('{last}', String(last))\n .replace('{totalRecords}', String(total))\n .replace('{currentPage}', String(this.page() + 1))\n .replace('{totalPages}', String(this.pageCount()))\n .replace('{rows}', String(this.rows()));\n });\n\n protected readonly hostClass = computed(() => {\n const base = 'flex flex-wrap items-center gap-x-4 gap-y-3';\n const justify = this.showCurrentPageReport() ? 'justify-between' : 'justify-center';\n return `${base} ${justify}`;\n });\n\n protected pageLinkAriaLabel(page: number): string {\n return this.pageLinkLabel().replace('{page}', String(page + 1));\n }\n\n protected navClass(isDisabled: boolean): string {\n const cls = `${BTN_BASE} ${SIZES[this.size()]} px-0`;\n return isDisabled\n ? `${cls} text-ink-faint opacity-50 cursor-not-allowed`\n : `${cls} text-ink-soft hover:bg-muted cursor-pointer`;\n }\n\n protected linkClass(active: boolean): string {\n const cls = `${BTN_BASE} ${SIZES[this.size()]}`;\n if (this.disabled()) return `${cls} text-ink-faint opacity-50 cursor-not-allowed`;\n return active\n ? `${cls} bg-brand-600 text-white hover:bg-brand-700 cursor-pointer`\n : `${cls} text-ink-soft hover:bg-muted cursor-pointer`;\n }\n\n protected firstPage(): void {\n this.changePage(0);\n }\n protected prevPage(): void {\n this.changePage(this.page() - 1);\n }\n protected nextPage(): void {\n this.changePage(this.page() + 1);\n }\n protected lastPage(): void {\n this.changePage(this.pageCount() - 1);\n }\n\n protected changePage(target: number): void {\n if (this.disabled()) return;\n const next = Math.min(Math.max(target, 0), this.pageCount() - 1);\n const newFirst = next * this.rows();\n if (newFirst === this.first()) return;\n this.first.set(newFirst);\n this.emit();\n }\n\n protected onRowsChange(value: number): void {\n if (this.disabled()) return;\n const newRows = Math.max(1, Number(value) || 1);\n if (newRows === this.rows()) return;\n const anchor = this.first();\n this.rows.set(newRows);\n // Keep the first visible record anchored within the new page size.\n const clamped = Math.min(anchor, (this.pageCount() - 1) * newRows);\n this.first.set(Math.floor(clamped / newRows) * newRows);\n this.emit();\n }\n\n protected onJump(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!Number.isNaN(value)) this.changePage(value - 1);\n // Reflect the clamped page back into the field.\n input.value = String(this.page() + 1);\n }\n\n private emit(): void {\n this.pageChange.emit({\n page: this.page(),\n first: this.first(),\n rows: this.rows(),\n pageCount: this.pageCount(),\n totalRecords: this.totalRecords(),\n });\n }\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\n\n/** Identifier of a tab / panel pair. Keep types consistent across a tab set. */\nexport type SdsTabValue = string | number | null;\n\nlet nextId = 0;\n\n/**\n * Coordinates a single <sds-tabs> instance: holds the active value (shared from\n * the host's two-way model), tracks registered tabs for default selection and\n * generates the ARIA ids that link each tab to its panel.\n *\n * Provided at the <sds-tabs> component level so every tab set is isolated.\n */\n@Injectable()\nexport class SdsTabsStore {\n /** Unique base id used to link tabs and panels via ARIA. */\n readonly id = `sds-tabs-${nextId++}`;\n /** Whether the tab list scrolls horizontally (mirrors [scrollable]). */\n readonly scrollable = signal(false);\n\n private value!: WritableSignal<SdsTabValue>;\n private readonly registered = signal<SdsTabValue[]>([]);\n\n /** Called once by <sds-tabs> to share its two-way `value` signal. */\n connect(value: WritableSignal<SdsTabValue>): void {\n this.value = value;\n }\n\n activeValue(): SdsTabValue {\n return this.value();\n }\n\n isActive(value: SdsTabValue): boolean {\n return this.value() === value;\n }\n\n select(value: SdsTabValue): void {\n this.value.set(value);\n }\n\n registerTab(value: SdsTabValue): void {\n this.registered.update((list) => (list.includes(value) ? list : [...list, value]));\n // Default to the first registered tab when no value has been provided.\n if (this.value() == null) this.value.set(value);\n }\n\n unregisterTab(value: SdsTabValue): void {\n this.registered.update((list) => list.filter((v) => v !== value));\n }\n\n tabId(value: SdsTabValue): string {\n return `${this.id}-tab-${value}`;\n }\n\n panelId(value: SdsTabValue): string {\n return `${this.id}-panel-${value}`;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * Root of a tab set. Compose with <sds-tab-list> (headers) and <sds-tab-panels>\n * (content). The active tab is the [value], matched against each <sds-tab> /\n * <sds-tab-panel> [value]; it is two-way bindable via [(value)]. When omitted,\n * the first registered tab is selected.\n *\n * @example\n * <sds-tabs [(value)]=\"active\">\n * <sds-tab-list>\n * <sds-tab value=\"0\">Détails</sds-tab>\n * <sds-tab value=\"1\">Historique</sds-tab>\n * </sds-tab-list>\n * <sds-tab-panels>\n * <sds-tab-panel value=\"0\">…</sds-tab-panel>\n * <sds-tab-panel value=\"1\">…</sds-tab-panel>\n * </sds-tab-panels>\n * </sds-tabs>\n */\n@Component({\n selector: 'sds-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [SdsTabsStore],\n host: { class: 'block' },\n template: `<ng-content />`,\n})\nexport class SdsTabs {\n private readonly store = inject(SdsTabsStore);\n\n /** Value of the active tab (two-way). */\n readonly value = model<SdsTabValue>(null);\n /** Let the tab list scroll horizontally instead of overflowing. */\n readonly scrollable = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.store.connect(this.value);\n effect(() => this.store.scrollable.set(this.scrollable()));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { SdsTabsStore } from './sds-tabs-store';\n\n/**\n * Container (role=\"tablist\") for the <sds-tab> headers. Renders the bottom rule\n * and handles roving-focus keyboard navigation (Arrow keys, Home, End) with\n * automatic activation.\n */\n@Component({\n selector: 'sds-tab-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'tablist',\n '[class]': 'listClass()',\n '(keydown)': 'onKeydown($event)',\n },\n template: `<ng-content />`,\n})\nexport class SdsTabList {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly store = inject(SdsTabsStore);\n\n protected readonly listClass = computed(() => {\n const base = 'relative flex border-b border-border';\n return this.store.scrollable() ? `${base} overflow-x-auto` : base;\n });\n\n protected onKeydown(event: KeyboardEvent): void {\n const keys = ['ArrowRight', 'ArrowLeft', 'Home', 'End'];\n if (!keys.includes(event.key)) return;\n\n const tabs = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'),\n ).filter((b) => !b.disabled);\n if (!tabs.length) return;\n\n event.preventDefault();\n const current = tabs.indexOf(document.activeElement as HTMLButtonElement);\n let next: number;\n switch (event.key) {\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = tabs.length - 1;\n break;\n case 'ArrowRight':\n next = current < 0 ? 0 : (current + 1) % tabs.length;\n break;\n default: // ArrowLeft\n next = current <= 0 ? tabs.length - 1 : current - 1;\n break;\n }\n\n const el = tabs[next];\n el.focus();\n el.click(); // automatic activation\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * A single tab header (role=\"tab\"). Project the label and, optionally, an\n * <sds-icon> for an icon + text header. Set [disabled] to make it unselectable.\n */\n@Component({\n selector: 'sds-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'contents' },\n template: `\n <button\n type=\"button\"\n role=\"tab\"\n [id]=\"store.tabId(value())\"\n [attr.aria-selected]=\"active()\"\n [attr.aria-controls]=\"store.panelId(value())\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.tabindex]=\"active() && !disabled() ? 0 : -1\"\n [disabled]=\"disabled()\"\n [class]=\"tabClass()\"\n (click)=\"select()\"\n >\n <ng-content />\n </button>\n `,\n})\nexport class SdsTab implements OnInit, OnDestroy {\n protected readonly store = inject(SdsTabsStore);\n\n readonly value = input.required<SdsTabValue>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly active = computed(() => this.store.isActive(this.value()));\n\n ngOnInit(): void {\n this.store.registerTab(this.value());\n }\n\n ngOnDestroy(): void {\n this.store.unregisterTab(this.value());\n }\n\n protected select(): void {\n if (this.disabled()) return;\n this.store.select(this.value());\n }\n\n protected tabClass(): string {\n const base =\n 'relative -mb-px inline-flex items-center gap-2 whitespace-nowrap border-b-2 px-4 py-2.5 ' +\n 'text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-brand-500 focus-visible:ring-inset';\n if (this.disabled()) {\n return `${base} border-transparent text-ink-faint opacity-50 cursor-not-allowed`;\n }\n return this.active()\n ? `${base} border-brand-600 text-brand-700 cursor-pointer`\n : `${base} border-transparent text-ink-soft hover:border-border hover:text-ink cursor-pointer`;\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Wrapper for the <sds-tab-panel> content blocks of a tab set. */\n@Component({\n selector: 'sds-tab-panels',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div class=\"pt-4\">\n <ng-content />\n </div>\n `,\n})\nexport class SdsTabPanels {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * Content for one tab (role=\"tabpanel\"); shown only while its [value] matches\n * the active tab. Inactive panels are not rendered (their content is created\n * on activation), so panel state does not persist across switches.\n */\n@Component({\n selector: 'sds-tab-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n @if (active()) {\n <div\n role=\"tabpanel\"\n [id]=\"store.panelId(value())\"\n [attr.aria-labelledby]=\"store.tabId(value())\"\n tabindex=\"0\"\n class=\"rounded-control focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n >\n <ng-content />\n </div>\n }\n `,\n})\nexport class SdsTabPanel {\n protected readonly store = inject(SdsTabsStore);\n\n readonly value = input.required<SdsTabValue>();\n\n protected readonly active = computed(() => this.store.isActive(this.value()));\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\n\n/** Identifier of an accordion panel. Keep types consistent across a set. */\nexport type SdsAccordionValue = string | number;\n/** Active value(s): a single value (or null) normally, an array in multiple mode. */\nexport type SdsAccordionActive = SdsAccordionValue | SdsAccordionValue[] | null;\n\nlet nextId = 0;\n\n/**\n * Coordinates a single <sds-accordion>: holds the open value(s) (shared from the\n * host's two-way model), the multiple-open flag, and generates the ARIA ids that\n * link each header to its content region.\n *\n * Provided at the <sds-accordion> component level so every accordion is isolated.\n */\n@Injectable()\nexport class SdsAccordionStore {\n /** Unique base id used to link headers and content regions via ARIA. */\n readonly id = `sds-accordion-${nextId++}`;\n /** Whether more than one panel may be open at a time (mirrors [multiple]). */\n readonly multiple = signal(false);\n\n private value!: WritableSignal<SdsAccordionActive>;\n\n /** Called once by <sds-accordion> to share its two-way `value` signal. */\n connect(value: WritableSignal<SdsAccordionActive>): void {\n this.value = value;\n }\n\n isOpen(value: SdsAccordionValue): boolean {\n const current = this.value();\n return Array.isArray(current) ? current.includes(value) : current === value;\n }\n\n toggle(value: SdsAccordionValue): void {\n if (this.multiple()) {\n const current = this.asArray();\n this.value.set(\n current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value],\n );\n } else {\n // Single mode: clicking the open panel collapses it.\n this.value.set(this.value() === value ? null : value);\n }\n }\n\n headerId(value: SdsAccordionValue): string {\n return `${this.id}-header-${value}`;\n }\n\n contentId(value: SdsAccordionValue): string {\n return `${this.id}-content-${value}`;\n }\n\n private asArray(): SdsAccordionValue[] {\n const current = this.value();\n if (Array.isArray(current)) return current;\n return current == null ? [] : [current];\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SdsAccordionActive, SdsAccordionStore } from './sds-accordion-store';\n\n/**\n * Root of an accordion. Compose with <sds-accordion-panel> children, each\n * holding an <sds-accordion-header> and an <sds-accordion-content>. The open\n * panel is the [value], matched against each panel's [value]; it is two-way\n * bindable via [(value)]. With [multiple], several panels may be open at once\n * and [value] is an array.\n *\n * @example\n * <sds-accordion [(value)]=\"open\">\n * <sds-accordion-panel value=\"0\">\n * <sds-accordion-header>Section 1</sds-accordion-header>\n * <sds-accordion-content>…</sds-accordion-content>\n * </sds-accordion-panel>\n * </sds-accordion>\n */\n@Component({\n selector: 'sds-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [SdsAccordionStore],\n host: {\n class: 'block divide-y divide-border overflow-hidden rounded-card border border-border bg-surface',\n '(keydown)': 'onKeydown($event)',\n },\n template: `<ng-content />`,\n})\nexport class SdsAccordion {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly store = inject(SdsAccordionStore);\n\n /** Open panel value, or array of values in multiple mode (two-way). */\n readonly value = model<SdsAccordionActive>(null);\n /** Allow more than one panel open at a time. */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.store.connect(this.value);\n effect(() => this.store.multiple.set(this.multiple()));\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (!target?.matches?.('[data-sds-accordion-header]')) return;\n\n const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End'];\n if (!keys.includes(event.key)) return;\n\n const headers = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLButtonElement>('[data-sds-accordion-header]'),\n ).filter((b) => !b.disabled);\n if (!headers.length) return;\n\n event.preventDefault();\n const current = headers.indexOf(target as HTMLButtonElement);\n let next: number;\n switch (event.key) {\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = headers.length - 1;\n break;\n case 'ArrowDown':\n next = current < 0 ? 0 : (current + 1) % headers.length;\n break;\n default: // ArrowUp\n next = current <= 0 ? headers.length - 1 : current - 1;\n break;\n }\n headers[next].focus();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsAccordionStore, SdsAccordionValue } from './sds-accordion-store';\n\n/**\n * One accordion section. Holds the [value] and optional [disabled] state shared\n * with its projected <sds-accordion-header> and <sds-accordion-content>.\n */\n@Component({\n selector: 'sds-accordion-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `<ng-content />`,\n})\nexport class SdsAccordionPanel {\n private readonly store = inject(SdsAccordionStore);\n\n readonly value = input.required<SdsAccordionValue>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly open = computed(() => this.store.isOpen(this.value()));\n\n get headerId(): string {\n return this.store.headerId(this.value());\n }\n\n get contentId(): string {\n return this.store.contentId(this.value());\n }\n\n toggle(): void {\n if (!this.disabled()) this.store.toggle(this.value());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsAccordionPanel } from './sds-accordion-panel';\n\n/**\n * Clickable header of an accordion panel. Project the label text and,\n * optionally, an <sds-icon>. Renders a chevron that rotates when open.\n */\n@Component({\n selector: 'sds-accordion-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <button\n type=\"button\"\n data-sds-accordion-header\n [id]=\"panel.headerId\"\n [attr.aria-expanded]=\"panel.open()\"\n [attr.aria-controls]=\"panel.contentId\"\n [attr.aria-disabled]=\"panel.disabled() ? 'true' : null\"\n [disabled]=\"panel.disabled()\"\n [class]=\"headerClass()\"\n (click)=\"panel.toggle()\"\n >\n <span class=\"flex-1 text-left\"><ng-content /></span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"18\"\n class=\"shrink-0 transition-transform duration-200\"\n [class.rotate-180]=\"panel.open()\"\n />\n </button>\n `,\n})\nexport class SdsAccordionHeader {\n protected readonly panel = inject(SdsAccordionPanel);\n\n protected readonly headerClass = computed(() => {\n const base =\n 'flex w-full items-center gap-3 px-4 py-3.5 text-left text-sm font-medium ' +\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-inset focus-visible:ring-brand-500';\n if (this.panel.disabled()) {\n return `${base} text-ink-faint opacity-60 cursor-not-allowed`;\n }\n return this.panel.open()\n ? `${base} text-brand-700 hover:bg-muted cursor-pointer`\n : `${base} text-ink hover:bg-muted cursor-pointer`;\n });\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { SdsAccordionPanel } from './sds-accordion-panel';\n\n/**\n * Collapsible content region of an accordion panel. Animates open/closed with a\n * CSS grid-rows transition; while closed it is `inert` (not focusable, hidden\n * from assistive tech) but kept in the DOM, so its state persists.\n */\n@Component({\n selector: 'sds-accordion-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div\n role=\"region\"\n [id]=\"panel.contentId\"\n [attr.aria-labelledby]=\"panel.headerId\"\n [attr.inert]=\"panel.open() ? null : ''\"\n class=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n [style.grid-template-rows]=\"panel.open() ? '1fr' : '0fr'\"\n >\n <div class=\"overflow-hidden\">\n <div class=\"px-4 pb-4 pt-0 text-sm leading-relaxed text-ink-soft\">\n <ng-content />\n </div>\n </div>\n </div>\n `,\n})\nexport class SdsAccordionContent {\n protected readonly panel = inject(SdsAccordionPanel);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { SdsTableColumn } from './sds-table';\n\n/**\n * Typed context handed to a custom cell template. Pulled out so consumers can\n * destructure with `let-value`, `let-row`, `let-i=\"index\"`, etc., with full\n * type inference (see {@link SdsTableCell.ngTemplateContextGuard}).\n */\nexport interface SdsTableCellContext {\n /** Same as {@link value} — enables the `let-value` (implicit) binding. */\n $implicit: unknown;\n /** Resolved cell value for this column (via the table's getValue). */\n value: unknown;\n /** The full row object. */\n row: any;\n /** The column definition the cell belongs to. */\n column: SdsTableColumn;\n /** Zero-based index of the row within the currently displayed page. */\n index: number;\n}\n\n/**\n * Supplies a custom cell template for a single table column, matched by its\n * field key. Use as a structural template inside `<sds-table>`:\n *\n * @example\n * <sds-table [value]=\"rows\" [columns]=\"cols\">\n * <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n * <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n * </ng-template>\n * </sds-table>\n */\n@Directive({\n selector: 'ng-template[sdsCell]',\n standalone: true,\n})\nexport class SdsTableCell {\n /** The column `field` this template renders. */\n readonly column = input.required<string>({ alias: 'sdsCell' });\n\n /** The wrapped template, rendered by the host table via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsTableCellContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsTableCellContext. */\n static ngTemplateContextGuard(\n _dir: SdsTableCell,\n _ctx: unknown,\n ): _ctx is SdsTableCellContext {\n return true;\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Typed context handed to a row-expansion template. Pulled out so consumers can\n * destructure with `let-row`, `let-i=\"index\"`, etc., with full type inference\n * (see {@link SdsTableRowExpansion.ngTemplateContextGuard}).\n */\nexport interface SdsTableRowExpansionContext {\n /** Same as {@link row} — enables the `let-row` (implicit) binding. */\n $implicit: any;\n /** The full row object whose details are being shown. */\n row: any;\n /** Zero-based index of the row within the currently displayed page. */\n index: number;\n}\n\n/**\n * Supplies the detail template rendered beneath an expanded row when the host\n * `<sds-table>` has `expandable`. Use as a structural template inside the table:\n *\n * @example\n * <sds-table [value]=\"rows\" [columns]=\"cols\" expandable>\n * <ng-template sdsRowExpansion let-row>\n * <div>Détails de {{ row.nom }}</div>\n * </ng-template>\n * </sds-table>\n */\n@Directive({\n selector: 'ng-template[sdsRowExpansion]',\n standalone: true,\n})\nexport class SdsTableRowExpansion {\n /** The wrapped template, rendered by the host table via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsTableRowExpansionContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsTableRowExpansionContext. */\n static ngTemplateContextGuard(\n _dir: SdsTableRowExpansion,\n _ctx: unknown,\n ): _ctx is SdsTableRowExpansionContext {\n return true;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n input,\n model,\n numberAttribute,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsPaginator, SdsPaginatorState } from '../paginator/sds-paginator';\nimport { SdsTableCell, SdsTableCellContext } from './sds-table-cell';\nimport { SdsTableRowExpansion } from './sds-table-row-expansion';\n\n/** Column configuration. `field` may be a dot-path (e.g. `service.name`). */\nexport interface SdsTableColumn {\n /** Row field rendered in this column. Supports dot-paths. */\n field: string;\n /** Header label. */\n header: string;\n /** Allow sorting on this column (also requires the table's `sortable`). */\n sortable?: boolean;\n /** Text alignment for header + body cells. */\n align?: 'left' | 'center' | 'right';\n /** Fixed column width, e.g. `'120px'` or `'20%'`. */\n width?: string;\n}\n\nexport type SdsTableSize = 'sm' | 'md' | 'lg';\n/** 1 = ascending, -1 = descending, 0 = unsorted. */\nexport type SdsSortOrder = 1 | -1 | 0;\n\nexport interface SdsTableSortEvent {\n field: string;\n order: SdsSortOrder;\n}\n\n/** Emitted when `lazy` is true so the host can fetch the matching slice. */\nexport interface SdsTableLazyEvent {\n first: number;\n rows: number;\n sortField: string | null;\n sortOrder: SdsSortOrder;\n globalFilter: string;\n}\n\ntype SdsSelectionMode = 'single' | 'multiple' | null;\n\nconst SIZES: Record<SdsTableSize, { cell: string; head: string }> = {\n sm: { cell: 'px-3 py-2 text-sm', head: 'px-3 py-2' },\n md: { cell: 'px-4 py-2.5 text-sm', head: 'px-4 py-2.5' },\n lg: { cell: 'px-4 py-3 text-base', head: 'px-4 py-3' },\n};\n\nconst ALIGN: Record<NonNullable<SdsTableColumn['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n};\n\nlet nextId = 0;\n\n/**\n * Client-side data table mirroring PrimeNG's table, scoped to a strong local\n * feature set: sorting, pagination (reuses {@link SdsPaginator}), global filter,\n * single/multiple selection, custom cell templates (via {@link SdsTableCell}),\n * loading/empty states and visual variants. Set `lazy` to delegate\n * sort/filter/paging to the host through `(lazyLoad)`.\n *\n * @remarks\n * - **`dataKey` is strongly recommended** for sortable and/or selectable\n * tables: it gives each row a stable identity so `trackRow` reuses the\n * correct DOM node when rows reorder (otherwise tracking falls back to the\n * page-relative `$index`, which defeats row-identity animations and can\n * momentarily mis-associate a focused custom-cell control after a re-sort).\n * - The header **\"select all\" checkbox operates over the entire filtered set\n * across all pages**, not just the current page. Toggling it selects/clears\n * every filtered row regardless of pagination (this is an intentional\n * deviation from PrimeNG's per-page select-all).\n *\n * @example\n * <sds-table [value]=\"staff\" [columns]=\"cols\" dataKey=\"id\"\n * sortable paginator [rows]=\"10\" globalFilter\n * selectionMode=\"multiple\" [(selection)]=\"selected\">\n * <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n * <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n * </ng-template>\n * </sds-table>\n */\n@Component({\n selector: 'sds-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, SdsPaginator, NgTemplateOutlet],\n host: { class: 'block' },\n template: `\n <div class=\"rounded-card border border-border bg-surface overflow-hidden\">\n <!-- Toolbar: caption + global filter -->\n @if (caption() || globalFilter()) {\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\n @if (caption()) {\n <span [id]=\"tableId + '-caption'\" class=\"font-semibold text-ink\">{{ caption() }}</span>\n } @else {\n <span></span>\n }\n\n @if (globalFilter()) {\n <div\n class=\"relative flex h-9 items-center rounded-control border border-border bg-surface transition-colors focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25\"\n >\n <sds-icon\n name=\"search\"\n [size]=\"16\"\n class=\"pointer-events-none absolute left-2.5 text-ink-faint\"\n />\n <input\n type=\"search\"\n [id]=\"tableId + '-filter'\"\n [value]=\"filterText()\"\n [placeholder]=\"globalFilterPlaceholder()\"\n [attr.aria-label]=\"globalFilterAriaLabel()\"\n [disabled]=\"loading()\"\n [attr.aria-disabled]=\"loading() ? 'true' : null\"\n class=\"h-full w-56 max-w-full bg-transparent pl-8 pr-3 text-sm text-ink outline-none placeholder:text-ink-faint disabled:opacity-60\"\n (input)=\"onFilterInput($event)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- Scroll region -->\n <div\n class=\"relative overflow-x-auto\"\n [class.overflow-y-auto]=\"scrollHeight()\"\n [style.maxHeight]=\"scrollHeight() || null\"\n [attr.inert]=\"loading() ? '' : null\"\n >\n <table\n class=\"w-full border-collapse text-left\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [attr.aria-labelledby]=\"caption() ? tableId + '-caption' : null\"\n [attr.aria-label]=\"caption() ? null : ariaLabel()\"\n >\n <thead\n class=\"bg-muted text-xs font-semibold uppercase tracking-wide text-ink-soft\"\n >\n <tr [class]=\"gridlines() ? 'divide-x divide-border' : ''\">\n @if (expandable()) {\n <th\n scope=\"col\"\n class=\"w-px\"\n [class]=\"headCellClass()\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n >\n <span class=\"sr-only\">Détails</span>\n </th>\n }\n\n @if (showSelectionColumn()) {\n <th\n scope=\"col\"\n class=\"w-px\"\n [class]=\"headCellClass()\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n >\n @if (selectionMode() === 'multiple') {\n <button\n type=\"button\"\n role=\"checkbox\"\n [attr.aria-checked]=\"headerChecked() ? 'true' : (headerIndeterminate() ? 'mixed' : 'false')\"\n aria-label=\"Tout sélectionner\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(headerChecked(), headerIndeterminate())\"\n (click)=\"toggleAll()\"\n >\n @if (headerChecked()) {\n <sds-icon name=\"check\" [size]=\"12\" />\n } @else if (headerIndeterminate()) {\n <span class=\"h-0.5 w-2.5 rounded-full bg-white\"></span>\n }\n </button>\n } @else {\n <span class=\"sr-only\">Sélection</span>\n }\n </th>\n }\n\n @for (col of effectiveColumns(); track col.field; let i = $index) {\n <th\n scope=\"col\"\n class=\"relative\"\n [class]=\"headCellClass(col)\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n [class.cursor-move]=\"reorderableColumns()\"\n [style.width]=\"columnStyleWidth(col)\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.draggable]=\"reorderableColumns() ? 'true' : null\"\n (dragstart)=\"onColDragStart(i)\"\n (dragover)=\"onColDragOver($event)\"\n (drop)=\"onColDrop($event, i)\"\n (dragend)=\"onColDragEnd()\"\n >\n @if (isColumnSortable(col)) {\n <button\n type=\"button\"\n [disabled]=\"loading()\"\n class=\"inline-flex items-center gap-1.5 select-none rounded hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n (click)=\"onSort(col)\"\n >\n <span>{{ col.header }}</span>\n <sds-icon [name]=\"sortIcon(col)\" [size]=\"14\" class=\"text-ink-faint\" />\n </button>\n } @else {\n <span>{{ col.header }}</span>\n }\n\n @if (resizableColumns()) {\n <span\n class=\"absolute right-0 top-0 h-full w-1.5 cursor-col-resize select-none touch-none hover:bg-brand-300\"\n (pointerdown)=\"onResizeStart($event, col.field)\"\n (click)=\"$event.stopPropagation()\"\n ></span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-border\">\n @for (row of displayRows(); track trackRow($index, row); let i = $index) {\n <tr\n [class]=\"rowClass(row, i)\"\n [attr.tabindex]=\"selectionMode() === 'single' && !loading() ? 0 : null\"\n [attr.aria-selected]=\"selectionMode() === 'single' ? (isRowSelected(row) ? 'true' : 'false') : null\"\n (click)=\"onRowClick(row)\"\n (keydown.enter)=\"onRowKeydown($event, row)\"\n (keydown.space)=\"onRowKeydown($event, row)\"\n >\n @if (expandable()) {\n <td [class]=\"cellClass()\" class=\"w-px\">\n <button\n type=\"button\"\n [attr.aria-expanded]=\"isExpanded(row)\"\n [attr.aria-controls]=\"isExpanded(row) ? rowDetailId(row) : null\"\n [attr.aria-label]=\"isExpanded(row) ? 'Réduire la ligne' : 'Développer la ligne'\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded text-ink-soft hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n (click)=\"onExpanderClick($event, row)\"\n >\n <sds-icon\n name=\"chevron-right\"\n [size]=\"16\"\n class=\"transition-transform\"\n [class.rotate-90]=\"isExpanded(row)\"\n />\n </button>\n </td>\n }\n\n @if (showSelectionColumn()) {\n <td\n [class]=\"cellClass()\"\n class=\"w-px\"\n >\n @if (selectionMode() === 'multiple') {\n <button\n type=\"button\"\n role=\"checkbox\"\n [attr.aria-checked]=\"isRowSelected(row) ? 'true' : 'false'\"\n aria-label=\"Sélectionner la ligne\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(isRowSelected(row), false)\"\n (click)=\"onRowCheckboxClick($event, row)\"\n >\n @if (isRowSelected(row)) {\n <sds-icon name=\"check\" [size]=\"12\" />\n }\n </button>\n } @else if (selectionMode() === 'single') {\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"isRowSelected(row) ? 'true' : 'false'\"\n aria-label=\"Sélectionner la ligne\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded-full border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(isRowSelected(row), false)\"\n (click)=\"onRowCheckboxClick($event, row)\"\n >\n @if (isRowSelected(row)) {\n <span class=\"h-1.5 w-1.5 rounded-full bg-white\"></span>\n }\n </button>\n }\n </td>\n }\n\n @for (col of effectiveColumns(); track col.field) {\n <td\n [class]=\"cellClass(col)\"\n [style.width]=\"columnStyleWidth(col)\"\n >\n @if (templateFor(col.field); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, col, i)\"\n />\n } @else {\n {{ display(row, col.field) }}\n }\n </td>\n }\n </tr>\n\n @if (expandable() && isExpanded(row) && expansionTemplate()) {\n <tr>\n <td [id]=\"rowDetailId(row)\" [attr.colspan]=\"totalColumnCount()\" class=\"bg-muted/30 p-0\">\n <div class=\"px-4 py-3\">\n <ng-container\n [ngTemplateOutlet]=\"expansionTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, row, index: i }\"\n />\n </div>\n </td>\n </tr>\n }\n } @empty {\n @if (!loading()) {\n <tr>\n <td\n [attr.colspan]=\"totalColumnCount()\"\n class=\"py-10 text-center text-ink-faint\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n\n <!-- Loading overlay -->\n @if (loading()) {\n <div\n class=\"absolute inset-0 z-20 grid place-items-center bg-white/60\"\n aria-hidden=\"true\"\n >\n <div\n class=\"h-7 w-7 animate-spin rounded-full border-2 border-brand-200 border-t-brand-600\"\n ></div>\n </div>\n }\n </div>\n\n <!-- Paginator -->\n @if (paginator()) {\n <div class=\"border-t border-border px-4 py-2.5\">\n <sds-paginator\n [totalRecords]=\"totalForPaginator()\"\n [(first)]=\"first\"\n [(rows)]=\"pageRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [disabled]=\"loading()\"\n [currentPageReportTemplate]=\"currentPageReportTemplate()\"\n [rowsPerPageLabel]=\"rowsPerPageLabel()\"\n [paginationLabel]=\"paginationLabel()\"\n [firstPageLabel]=\"firstPageLabel()\"\n [previousPageLabel]=\"previousPageLabel()\"\n [nextPageLabel]=\"nextPageLabel()\"\n [lastPageLabel]=\"lastPageLabel()\"\n [pageLinkLabel]=\"pageLinkLabel()\"\n (pageChange)=\"onPageChange($event)\"\n />\n </div>\n }\n </div>\n `,\n})\nexport class SdsTable implements OnDestroy {\n protected readonly tableId = `sds-table-${nextId++}`;\n\n // --- inputs ---------------------------------------------------------------\n readonly value = input<readonly any[]>([]);\n readonly columns = input<SdsTableColumn[]>([]);\n readonly dataKey = input<string>('');\n readonly size = input<SdsTableSize>('md');\n readonly striped = input(false, { transform: booleanAttribute });\n readonly gridlines = input(false, { transform: booleanAttribute });\n readonly hoverable = input(true, { transform: booleanAttribute });\n /** Master sort switch; per-column `sortable` is still required. */\n readonly sortable = input(true, { transform: booleanAttribute });\n\n readonly paginator = input(false, { transform: booleanAttribute });\n readonly rows = input(10, { transform: numberAttribute });\n readonly rowsPerPageOptions = input<number[]>([10, 20, 50]);\n readonly showCurrentPageReport = input(true, { transform: booleanAttribute });\n\n /**\n * Paginator labels, forwarded to the inner <sds-paginator>. English defaults suit an English-first\n * app; an app serving more than one language MUST pass translated values (the four nav labels and\n * {@link pageLinkLabel} name icon-only controls, so they are their ONLY accessible name).\n * {@link currentPageReportTemplate} tokens: {first} {last} {totalRecords} {currentPage} {totalPages} {rows}.\n */\n readonly currentPageReportTemplate = input<string>('{first} – {last} of {totalRecords}');\n readonly rowsPerPageLabel = input<string>('Rows per page');\n readonly paginationLabel = input<string>('Pagination');\n readonly firstPageLabel = input<string>('First page');\n readonly previousPageLabel = input<string>('Previous page');\n readonly nextPageLabel = input<string>('Next page');\n readonly lastPageLabel = input<string>('Last page');\n /** Accessible name of a numbered page link; `{page}` is the 1-based page number. */\n readonly pageLinkLabel = input<string>('Page {page}');\n\n readonly globalFilter = input(false, { transform: booleanAttribute });\n readonly globalFilterPlaceholder = input<string>('Search…');\n /** Accessible name for the global-filter input. */\n readonly globalFilterAriaLabel = input<string>('Search the table');\n /** Fields searched by the global filter. Empty = every column field. */\n readonly globalFilterFields = input<string[]>([]);\n\n readonly selectionMode = input<SdsSelectionMode>(null);\n /** Two-way: a single row (single mode) or an array of rows (multiple). */\n readonly selection = model<any>(null);\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyMessage = input<string>('No data');\n readonly caption = input<string>('');\n /** Fallback accessible name for the `<table>` when no `caption` is set. */\n readonly ariaLabel = input<string>('Data table');\n /** When set, the body scrolls vertically with a sticky header, e.g. `'320px'`. */\n readonly scrollHeight = input<string>('');\n\n /** When true: skip internal sort/filter/slice; emit (lazyLoad) instead. */\n readonly lazy = input(false, { transform: booleanAttribute });\n /** Total records for the paginator when `lazy`. */\n readonly totalRecords = input(0, { transform: numberAttribute });\n\n /** Adds a leading expander column; details come from `<ng-template sdsRowExpansion>`. */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Drag the right edge of a column header to resize it. */\n readonly resizableColumns = input(false, { transform: booleanAttribute });\n /** Drag a column header to reorder columns. */\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n\n // --- outputs --------------------------------------------------------------\n readonly sortChange = output<SdsTableSortEvent>();\n readonly pageChange = output<SdsPaginatorState>();\n readonly rowSelect = output<any>();\n readonly rowUnselect = output<any>();\n readonly lazyLoad = output<SdsTableLazyEvent>();\n readonly rowClick = output<any>();\n /** Emitted with the row when its expander is opened. */\n readonly rowExpand = output<any>();\n /** Emitted with the row when its expander is closed. */\n readonly rowCollapse = output<any>();\n /** Emitted after a drag-reorder with the moved field and its old/new index. */\n readonly colReorder = output<{ field: string; fromIndex: number; toIndex: number }>();\n\n // --- custom cell templates ------------------------------------------------\n private readonly cellTemplates = contentChildren(SdsTableCell);\n\n private readonly templateMap = computed(() => {\n const map = new Map<string, SdsTableCell['template']>();\n for (const cell of this.cellTemplates()) map.set(cell.column(), cell.template);\n return map;\n });\n\n protected templateFor(field: string) {\n return this.templateMap().get(field) ?? null;\n }\n\n // --- row-expansion template -----------------------------------------------\n private readonly rowExpansion = contentChild(SdsTableRowExpansion);\n\n protected expansionTemplate() {\n return this.rowExpansion()?.template ?? null;\n }\n\n // --- pipeline state -------------------------------------------------------\n protected readonly filterText = signal('');\n protected readonly sortField = signal<string | null>(null);\n protected readonly sortOrder = signal<SdsSortOrder>(0);\n\n // Local paging signals kept in sync with the paginator's two-way models.\n protected readonly first = signal(0);\n protected readonly pageRows = signal(10);\n\n // Expanded-row identities (keyed via keyOf, like selection).\n private readonly expandedKeys = signal(new Set<unknown>());\n\n // Per-field pixel widths set by the resize handle (overrides col.width).\n private readonly columnWidths = signal<Record<string, number>>({});\n\n // Working column order while reorderableColumns is on; seeded from columns().\n private readonly columnOrder = signal<SdsTableColumn[]>([]);\n private readonly dragColIndex = signal<number | null>(null);\n\n constructor() {\n // Seed page size from the `rows` input (and keep it tracking until paged).\n effect(() => this.pageRows.set(this.rows()));\n // Reset the working order whenever the columns input changes.\n effect(() => this.columnOrder.set([...this.columns()]));\n }\n\n ngOnDestroy(): void {\n this.activeResizeCleanup?.();\n this.activeResizeCleanup = null;\n }\n\n // --- value resolution -----------------------------------------------------\n /** Resolve a (possibly dot-pathed) field on a row; null/undefined safe. */\n protected getValue(row: any, field: string): unknown {\n if (row == null || !field) return null;\n if (field.indexOf('.') === -1) return row[field];\n let acc: any = row;\n for (const part of field.split('.')) {\n if (acc == null) return null;\n acc = acc[part];\n }\n return acc;\n }\n\n /** String rendering of a cell value (null/undefined => ''). */\n protected display(row: any, field: string): string {\n const v = this.getValue(row, field);\n return v == null ? '' : String(v);\n }\n\n protected cellContext(row: any, column: SdsTableColumn, index: number): SdsTableCellContext {\n const value = this.getValue(row, column.field);\n return { $implicit: value, value, row, column, index };\n }\n\n // --- filter ---------------------------------------------------------------\n private readonly filtered = computed<readonly any[]>(() => {\n const data = this.value();\n if (this.lazy()) return data;\n const q = this.filterText().trim().toLowerCase();\n if (!this.globalFilter() || !q) return data;\n const fields = this.globalFilterFields().length\n ? this.globalFilterFields()\n : this.effectiveColumns().map((c) => c.field);\n return data.filter((row) =>\n fields.some((f) => {\n const v = this.getValue(row, f);\n return v != null && String(v).toLowerCase().includes(q);\n }),\n );\n });\n\n // --- sort -----------------------------------------------------------------\n private readonly sorted = computed<readonly any[]>(() => {\n const data = this.filtered();\n if (this.lazy()) return data;\n const field = this.sortField();\n const order = this.sortOrder();\n if (!field || order === 0) return data;\n // Stable sort: decorate with original index, compare, then strip.\n return data\n .map((row, index) => ({ row, index }))\n .sort((a, b) => {\n const cmp = this.compare(this.getValue(a.row, field), this.getValue(b.row, field));\n return cmp !== 0 ? cmp * order : a.index - b.index;\n })\n .map((d) => d.row);\n });\n\n private compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n // Booleans (and mixed types) fall through to a lexical compare:\n // `false` < `true`. Columns are expected to be type-homogeneous.\n return String(a).localeCompare(String(b));\n }\n\n // --- paginate -------------------------------------------------------------\n protected readonly displayRows = computed<readonly any[]>(() => {\n const data = this.sorted();\n if (this.lazy() || !this.paginator()) return data;\n const pageRows = Math.max(1, this.pageRows());\n // Clamp the page offset: if `value` shrinks (server refresh, deleted rows,\n // dataset switch) `first` may point past the new end, slicing to []. Snap\n // it back to the last valid page start, mirroring SdsPaginator.onRowsChange.\n const maxStart = Math.max(0, (Math.ceil(data.length / pageRows) - 1) * pageRows);\n const start = Math.min(this.first(), maxStart);\n return data.slice(start, start + pageRows);\n });\n\n protected readonly totalForPaginator = computed(() =>\n this.lazy() ? this.totalRecords() : this.filtered().length,\n );\n\n /** Columns in their current (possibly reordered) order. */\n protected readonly effectiveColumns = computed<SdsTableColumn[]>(() =>\n this.reorderableColumns() && this.columnOrder().length\n ? this.columnOrder()\n : this.columns(),\n );\n\n /** Leading non-data columns: the expander then the selection column. */\n protected readonly leadingColumnCount = computed(\n () => (this.expandable() ? 1 : 0) + (this.showSelectionColumn() ? 1 : 0),\n );\n\n protected readonly totalColumnCount = computed(\n () => this.effectiveColumns().length + this.leadingColumnCount(),\n );\n\n // --- sorting UI -----------------------------------------------------------\n protected isColumnSortable(col: SdsTableColumn): boolean {\n return this.sortable() && !!col.sortable;\n }\n\n protected sortIcon(col: SdsTableColumn) {\n if (this.sortField() !== col.field || this.sortOrder() === 0) {\n return 'chevrons-up-down' as const;\n }\n return this.sortOrder() === 1 ? ('arrow-up' as const) : ('arrow-down' as const);\n }\n\n protected ariaSort(col: SdsTableColumn): 'ascending' | 'descending' | 'none' | null {\n if (!this.isColumnSortable(col)) return null;\n if (this.sortField() !== col.field || this.sortOrder() === 0) return 'none';\n return this.sortOrder() === 1 ? 'ascending' : 'descending';\n }\n\n protected onSort(col: SdsTableColumn): void {\n if (!this.isColumnSortable(col)) return;\n // Cycle asc(1) -> desc(-1) -> none(0) for this single column.\n let order: SdsSortOrder;\n if (this.sortField() !== col.field) {\n order = 1;\n } else {\n order = this.sortOrder() === 1 ? -1 : this.sortOrder() === -1 ? 0 : 1;\n }\n this.sortField.set(order === 0 ? null : col.field);\n this.sortOrder.set(order);\n // A new sort means the first sorted records belong on page 1.\n this.first.set(0);\n this.sortChange.emit({ field: col.field, order });\n if (this.lazy()) this.emitLazy();\n }\n\n // --- selection ------------------------------------------------------------\n protected readonly showSelectionColumn = computed(() => this.selectionMode() != null);\n\n private equals(a: any, b: any): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return a[k] === b[k];\n }\n return a === b;\n }\n\n /** Identity used for O(1) membership tests: dataKey value when set, else the row itself. */\n private keyOf(row: any): unknown {\n const k = this.dataKey();\n return k && row && typeof row === 'object' ? row[k] : row;\n }\n\n /**\n * Set of selected identities, recomputed only when selection()/dataKey()\n * change. Lets isRowSelected/headerChecked/headerIndeterminate do O(1)\n * lookups instead of an O(selection) scan per row.\n */\n private readonly selectedKeys = computed(() => {\n const sel = this.selection();\n const list = Array.isArray(sel) ? sel : sel == null ? [] : [sel];\n return new Set(list.map((s) => this.keyOf(s)));\n });\n\n protected isRowSelected(row: any): boolean {\n if (this.selection() == null) return false;\n return this.selectedKeys().has(this.keyOf(row));\n }\n\n protected readonly headerChecked = computed(() => {\n if (this.selectionMode() !== 'multiple') return false;\n const rows = this.filtered();\n if (!rows.length) return false;\n const keys = this.selectedKeys();\n if (!keys.size) return false;\n return rows.every((r) => keys.has(this.keyOf(r)));\n });\n\n protected readonly headerIndeterminate = computed(() => {\n if (this.selectionMode() !== 'multiple') return false;\n const rows = this.filtered();\n const keys = this.selectedKeys();\n if (!keys.size) return false;\n const selectedCount = rows.reduce((n, r) => (keys.has(this.keyOf(r)) ? n + 1 : n), 0);\n return selectedCount > 0 && selectedCount < rows.length;\n });\n\n protected toggleAll(): void {\n if (this.selectionMode() !== 'multiple') return;\n const rows = this.filtered();\n if (this.headerChecked()) {\n // Deselect every currently-filtered row.\n const next = (this.selection() as any[]).filter(\n (s) => !rows.some((r) => this.equals(s, r)),\n );\n rows.forEach((r) => this.rowUnselect.emit(r));\n this.selection.set(next);\n } else {\n const current = Array.isArray(this.selection()) ? [...this.selection()] : [];\n for (const r of rows) {\n if (!current.some((s) => this.equals(s, r))) {\n current.push(r);\n this.rowSelect.emit(r);\n }\n }\n this.selection.set(current);\n }\n }\n\n protected onRowCheckboxClick(event: Event, row: any): void {\n event.stopPropagation();\n if (this.selectionMode() === 'single') {\n this.onRowClick(row);\n } else {\n this.toggleRowSelection(row);\n }\n }\n\n /** Enter/Space on a (single-mode) focusable row toggles its selection. */\n protected onRowKeydown(event: Event, row: any): void {\n if (this.selectionMode() !== 'single' || this.loading()) return;\n event.preventDefault();\n this.onRowClick(row);\n }\n\n private toggleRowSelection(row: any): void {\n const current = Array.isArray(this.selection()) ? [...this.selection()] : [];\n const idx = current.findIndex((s) => this.equals(s, row));\n if (idx >= 0) {\n current.splice(idx, 1);\n this.selection.set(current);\n this.rowUnselect.emit(row);\n } else {\n current.push(row);\n this.selection.set(current);\n this.rowSelect.emit(row);\n }\n }\n\n protected onRowClick(row: any): void {\n if (this.loading()) return;\n this.rowClick.emit(row);\n if (this.selectionMode() === 'single') {\n if (this.equals(this.selection(), row)) {\n this.selection.set(null);\n this.rowUnselect.emit(row);\n } else {\n this.selection.set(row);\n this.rowSelect.emit(row);\n }\n }\n }\n\n // --- paginator ------------------------------------------------------------\n protected onPageChange(state: SdsPaginatorState): void {\n this.pageChange.emit(state);\n if (this.lazy()) this.emitLazy();\n }\n\n private emitLazy(): void {\n this.lazyLoad.emit({\n first: this.first(),\n rows: this.pageRows(),\n sortField: this.sortField(),\n sortOrder: this.sortOrder(),\n globalFilter: this.filterText(),\n });\n }\n\n protected onFilterInput(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n // New query -> back to the first page.\n this.first.set(0);\n if (this.lazy()) this.emitLazy();\n }\n\n // --- row expansion --------------------------------------------------------\n protected isExpanded(row: any): boolean {\n return this.expandedKeys().has(this.keyOf(row));\n }\n\n protected toggleExpand(row: any): void {\n const key = this.keyOf(row);\n const next = new Set(this.expandedKeys());\n if (next.has(key)) {\n next.delete(key);\n this.expandedKeys.set(next);\n this.rowCollapse.emit(row);\n } else {\n next.add(key);\n this.expandedKeys.set(next);\n this.rowExpand.emit(row);\n }\n }\n\n protected onExpanderClick(event: Event, row: any): void {\n // Keep the expander from triggering single-select row click.\n event.stopPropagation();\n this.toggleExpand(row);\n }\n\n /**\n * Stable per-row id for the expansion region, derived from the row identity\n * (dataKey value when set, else the row itself). Mirrors the accordion's\n * contentId pattern so the expander's aria-controls can point at the detail\n * region. Using keyOf (not $index) keeps the id stable across reorders.\n */\n protected rowDetailId(row: any): string {\n return `${this.tableId}-detail-${String(this.keyOf(row))}`;\n }\n\n // --- resizable columns ----------------------------------------------------\n private activeResizeCleanup: (() => void) | null = null;\n\n /** px override from a resize drag, else the column's declared width, else null. */\n protected columnStyleWidth(col: SdsTableColumn): string | null {\n const px = this.columnWidths()[col.field];\n if (px != null) return px + 'px';\n return col.width || null;\n }\n\n protected onResizeStart(event: PointerEvent, field: string): void {\n event.preventDefault();\n event.stopPropagation();\n const th = (event.target as HTMLElement).closest('th');\n if (!th) return;\n const startX = event.clientX;\n const startW = th.getBoundingClientRect().width;\n const move = (e: PointerEvent) => {\n const w = Math.max(60, Math.round(startW + (e.clientX - startX)));\n this.columnWidths.update((m) => ({ ...m, [field]: w }));\n };\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n this.activeResizeCleanup = null;\n };\n // Track for ngOnDestroy in case the pointer-up never lands.\n this.activeResizeCleanup = up;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }\n\n // --- reorderable columns --------------------------------------------------\n protected onColDragStart(i: number): void {\n this.dragColIndex.set(i);\n }\n\n protected onColDragEnd(): void {\n this.dragColIndex.set(null);\n }\n\n protected onColDragOver(e: DragEvent): void {\n e.preventDefault();\n }\n\n protected onColDrop(e: DragEvent, toIndex: number): void {\n e.preventDefault();\n const from = this.dragColIndex();\n if (from == null || from === toIndex) return;\n const cols = [...this.effectiveColumns()];\n const [moved] = cols.splice(from, 1);\n cols.splice(toIndex, 0, moved);\n this.columnOrder.set(cols);\n this.dragColIndex.set(null);\n this.colReorder.emit({ field: moved.field, fromIndex: from, toIndex });\n }\n\n // --- trackBy --------------------------------------------------------------\n protected trackRow(index: number, row: any): unknown {\n const k = this.dataKey();\n if (k && row && typeof row === 'object' && row[k] != null) return row[k];\n return index;\n }\n\n // --- styling --------------------------------------------------------------\n protected headCellClass(col?: SdsTableColumn): string {\n const align = ALIGN[col?.align ?? 'left'];\n return `${SIZES[this.size()].head} ${align} font-semibold`;\n }\n\n protected cellClass(col?: SdsTableColumn): string {\n const align = ALIGN[col?.align ?? 'left'];\n return `${SIZES[this.size()].cell} ${align} text-ink align-middle`;\n }\n\n protected rowClass(row: any, index: number): string {\n const parts: string[] = ['transition-colors'];\n if (this.gridlines()) parts.push('divide-x divide-border');\n if (this.isRowSelected(row)) {\n parts.push('bg-brand-50');\n } else if (this.striped() && index % 2 === 1) {\n parts.push('bg-muted/40');\n }\n if (this.hoverable() && !this.isRowSelected(row)) parts.push('hover:bg-muted/60');\n if (this.selectionMode() === 'single') {\n parts.push(\n 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-brand-500',\n );\n }\n return parts.join(' ');\n }\n\n protected checkboxClass(checked: boolean, indeterminate: boolean): string {\n return checked || indeterminate\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface';\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\nexport type SdsToastKind = 'success' | 'error' | 'info';\n\nexport interface SdsToast {\n id: number;\n kind: SdsToastKind;\n text: string;\n}\n\n/**\n * A tiny transient-notification bus. Application code calls {@link success} / {@link error} / {@link info}\n * after an action; a single {@link SdsToastHost} mounted in the app shell renders the queue and each toast\n * auto-dismisses. Deliberately minimal — no positions, no actions-in-toast — because it exists to confirm\n * an action, not to be a notification centre.\n *\n * `providedIn: 'root'`, so injecting it anywhere shares one queue:\n *\n * ```ts\n * private readonly toasts = inject(SdsToastService);\n * this.toasts.success('Enregistré.');\n * ```\n *\n * Mount the host once (e.g. in the shell): `<sds-toast-host />`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SdsToastService {\n private seq = 0;\n readonly toasts = signal<SdsToast[]>([]);\n\n /** How long a toast stays, in ms, by kind. Errors linger; success/info are brief. */\n private static readonly TTL: Record<SdsToastKind, number> = {\n success: 3500,\n info: 3500,\n error: 6000,\n };\n\n success(text: string): void {\n this.push('success', text);\n }\n error(text: string): void {\n this.push('error', text);\n }\n info(text: string): void {\n this.push('info', text);\n }\n\n dismiss(id: number): void {\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n private push(kind: SdsToastKind, text: string): void {\n const id = ++this.seq;\n this.toasts.update((list) => [...list, { id, kind, text }]);\n setTimeout(() => this.dismiss(id), SdsToastService.TTL[kind]);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SdsToast, SdsToastKind, SdsToastService } from './sds-toast.service';\n\n/**\n * Renders the {@link SdsToastService} queue, fixed bottom-centre. Mount it once, in the app shell:\n * `<sds-toast-host />`. Application code pushes toasts through the injected service.\n *\n * Accessibility: the two live regions are ALWAYS in the DOM (even when empty), because a live region must\n * pre-exist for its later content changes to be announced. Errors go to an assertive `role=\"alert\"` region\n * so a failure interrupts; success/info go to a polite region so they queue.\n */\n@Component({\n selector: 'sds-toast-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, SdsIcon],\n template: `\n <div class=\"pointer-events-none fixed inset-x-0 bottom-6 z-[100] flex flex-col items-center gap-2 px-4\">\n <div role=\"alert\" aria-live=\"assertive\" class=\"flex w-full flex-col items-center gap-2\">\n @for (t of errors(); track t.id) {\n <ng-container [ngTemplateOutlet]=\"toast\" [ngTemplateOutletContext]=\"{ t }\" />\n }\n </div>\n <div aria-live=\"polite\" class=\"flex w-full flex-col items-center gap-2\">\n @for (t of notices(); track t.id) {\n <ng-container [ngTemplateOutlet]=\"toast\" [ngTemplateOutletContext]=\"{ t }\" />\n }\n </div>\n </div>\n\n <ng-template #toast let-t=\"t\">\n <div\n class=\"pointer-events-auto flex max-w-md items-start gap-2.5 rounded-card border bg-surface px-4 py-3 text-sm shadow-lg\"\n [class]=\"border(t.kind)\"\n >\n <sds-icon [name]=\"icon(t.kind)\" [size]=\"18\" class=\"mt-0.5 shrink-0\" [class]=\"tone(t.kind)\" />\n <span class=\"text-ink\">{{ t.text }}</span>\n <button\n type=\"button\"\n (click)=\"toasts.dismiss(t.id)\"\n [attr.aria-label]=\"closeLabel()\"\n class=\"ml-1 shrink-0 rounded p-0.5 text-ink-faint hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n </div>\n </ng-template>\n `,\n})\nexport class SdsToastHost {\n readonly toasts = inject(SdsToastService);\n\n /**\n * Accessible name for each toast's close button. French default so existing consumers are unchanged; the\n * button is icon-only, so an app serving more than one language MUST translate it.\n */\n readonly closeLabel = input<string>('Fermer');\n\n protected readonly errors = computed(() => this.toasts.toasts().filter((t) => t.kind === 'error'));\n protected readonly notices = computed(() => this.toasts.toasts().filter((t) => t.kind !== 'error'));\n\n protected icon(kind: SdsToastKind): SdsIconName {\n return kind === 'success' ? 'check-circle' : kind === 'error' ? 'alert-circle' : 'info';\n }\n protected tone(kind: SdsToastKind): string {\n return kind === 'success' ? 'text-success' : kind === 'error' ? 'text-danger' : 'text-accent-blue';\n }\n protected border(kind: SdsToast['kind']): string {\n const accent =\n kind === 'success' ? 'border-l-success' : kind === 'error' ? 'border-l-danger' : 'border-l-accent-blue';\n return `border-l-4 ${accent} border-y-border border-r-border`;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\n\nexport type SdsTheme = 'light' | 'dark';\n\nconst STORAGE_KEY = 'sds-theme';\n\n/**\n * Light/dark theme state for the whole app. It owns exactly one thing: the presence of the `.dark`\n * class on the document root, which flips every design token defined under `.dark` in the theme CSS\n * (base.css and the brand ramp). Because the library themes by ROLE, this single class re-themes the\n * entire component set — there is no per-component dark mode to wire.\n *\n * `providedIn: 'root'`, so the switcher, the shell and any feature share one source of truth:\n *\n * ```ts\n * private readonly theme = inject(SdsThemeService);\n * this.theme.toggle(); // flip\n * this.theme.isDark(); // read (a signal)\n * ```\n *\n * Initial value: a previously stored choice wins; otherwise the OS `prefers-color-scheme` is honoured,\n * so a first-time visitor already in dark at the OS level lands in dark. The choice is persisted to\n * `localStorage` and re-applied on the next visit. Every browser access is guarded, so the service is\n * safe under SSR / prerender (it simply no-ops without a DOM).\n */\n@Injectable({ providedIn: 'root' })\nexport class SdsThemeService {\n private readonly document = inject(DOCUMENT);\n\n readonly theme = signal<SdsTheme>(this.initialTheme());\n readonly isDark = computed(() => this.theme() === 'dark');\n\n constructor() {\n // Keep the DOM class and the stored preference in lockstep with the signal — one effect, so any\n // caller that sets the signal (toggle, setTheme, or a future settings screen) applies uniformly.\n effect(() => this.apply(this.theme()));\n }\n\n /** Flip between light and dark. */\n toggle(): void {\n this.theme.update((t) => (t === 'light' ? 'dark' : 'light'));\n }\n\n /** Set an explicit theme. */\n setTheme(theme: SdsTheme): void {\n this.theme.set(theme);\n }\n\n private initialTheme(): SdsTheme {\n try {\n const stored = this.readStorage()?.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark') return stored;\n const win = this.document.defaultView;\n if (win?.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';\n } catch {\n /* no storage / no matchMedia (SSR, privacy mode) — fall through to the light default */\n }\n return 'light';\n }\n\n private apply(theme: SdsTheme): void {\n const root = this.document.documentElement;\n root.classList.toggle('dark', theme === 'dark');\n // Let the UA paint form controls / scrollbars to match.\n root.style.colorScheme = theme;\n try {\n this.readStorage()?.setItem(STORAGE_KEY, theme);\n } catch {\n /* storage unavailable — the class is still applied; only persistence is skipped */\n }\n }\n\n private readStorage(): Storage | null {\n return this.document.defaultView?.localStorage ?? null;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsThemeService } from './sds-theme.service';\n\nexport type SdsThemeToggleAppearance = 'surface' | 'on-brand';\n\n/**\n * Icon button that flips the app between light and dark, backed by {@link SdsThemeService}. It shows the\n * destination, not the current state — a moon while you are in light (tap to go dark), a sun while you\n * are in dark — and its accessible name names the action, because an icon-only control's label is its\n * only name.\n *\n * Two appearances so it sits correctly on either bar: `surface` (default) for a light or glass top bar,\n * `on-brand` for the dark brand bar / sidebar.\n *\n * @example\n * <sds-theme-toggle />\n * <sds-theme-toggle appearance=\"on-brand\" [lightLabel]=\"'Passer en clair'\" [darkLabel]=\"'Passer en sombre'\" />\n */\n@Component({\n selector: 'sds-theme-toggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'inline-block' },\n template: `\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"buttonClasses()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-pressed]=\"isDark()\"\n [attr.title]=\"label()\"\n (click)=\"theme.toggle()\"\n >\n <sds-icon [name]=\"isDark() ? 'sun' : 'moon'\" [size]=\"iconSize()\" />\n </button>\n `,\n})\nexport class SdsThemeToggle {\n protected readonly theme = inject(SdsThemeService);\n protected readonly isDark = this.theme.isDark;\n\n /** Button box size in px (the icon scales with it). */\n readonly size = input<number>(40);\n\n /** `surface` for light/glass bars, `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsThemeToggleAppearance>('surface');\n\n /**\n * Accessible names for the two actions. French defaults keep existing consumers unchanged; a\n * multilingual app must pass translated values.\n */\n readonly darkLabel = input<string>('Passer en mode sombre');\n readonly lightLabel = input<string>('Passer en mode clair');\n\n protected readonly iconSize = computed(() => Math.round(this.size() * 0.5));\n protected readonly label = computed(() => (this.isDark() ? this.lightLabel() : this.darkLabel()));\n\n protected readonly buttonClasses = computed(() =>\n this.appearance() === 'on-brand'\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'bg-muted text-ink-soft hover:bg-brand-50 hover:text-brand-600 focus-visible:ring-brand-500/40',\n );\n}\n","import { Injectable, signal } from '@angular/core';\n\n/** How the rail is painted. `brand` is the dark brand rail; `surface` is a light rail with brand accents. */\nexport type SdsSidebarAppearance = 'brand' | 'surface';\n\n/**\n * Shared collapse state for the sidebar and its nav items.\n *\n * Provided in root so the sidebar, projected nav groups/items and any layout\n * code observe a single source of truth without prop-drilling. For apps with\n * multiple independent sidebars, provide it at a component level instead.\n */\n@Injectable({ providedIn: 'root' })\nexport class SidebarStore {\n /** Desktop rail state: collapsed to icon-only width (applies at ≥ lg). */\n readonly collapsed = signal(false);\n\n /**\n * The rail's paint, published by <sds-sidebar> so projected <sds-nav-item>/<sds-nav-group> pick the\n * matching state and hover colours (white-on-dark for `brand`, ink-and-brand for `surface`) without\n * every item taking an input. One rail, one appearance — set by the sidebar, read by its children.\n */\n readonly appearance = signal<SdsSidebarAppearance>('brand');\n\n /** Mobile drawer state: whether the off-canvas sidebar is slid in (< lg). */\n readonly mobileOpen = signal(false);\n\n /** Toggle the desktop icon-rail. */\n toggle(): void {\n this.collapsed.update((v) => !v);\n }\n\n setCollapsed(value: boolean): void {\n this.collapsed.set(value);\n }\n\n /** Open the mobile drawer. */\n openMobile(): void {\n this.mobileOpen.set(true);\n }\n\n /** Close the mobile drawer. */\n closeMobile(): void {\n this.mobileOpen.set(false);\n }\n\n /** Toggle the mobile drawer. */\n toggleMobile(): void {\n this.mobileOpen.update((v) => !v);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SidebarStore } from '../sidebar/sidebar-store';\n\nexport type SdsTopbarAppearance = 'brand' | 'surface' | 'glass';\n\n/**\n * Application top bar: a logo slot, the app name, and three slots the app fills.\n *\n * Three appearances. `brand` is the gradient-and-wave bar an internal tool wants. `surface` is white on\n * a hairline border, for a bar that has to sit under a customer-facing page without dominating it —\n * a storefront header is a bar, but it is not a banner. `glass` is a translucent, brand-tinted bar with\n * a blur behind it, for a dashboard that wants the brand present but light — it reads the brand from the\n * ramp, so it tints itself to whatever theme is loaded and flips with dark mode. The slots and the\n * layout are identical across all three; only the paint differs.\n *\n * `[decorations]` adds slow-drifting, brand-tinted blobs behind the bar (opt-in; they respect\n * prefers-reduced-motion). They pair with `glass`/`surface`; on `brand` the wave already fills that role.\n *\n * It deliberately owns NO account UI. It used to render the signed-in user and a logout button, which\n * forced every consumer into one shape — no dropdown, no email, no menu, no busy state, and an\n * icon-only button whose accessible name the library had to guess a language for. What an app needs\n * beside its own brand bar differs per app, so the bar supplies the surface and the app supplies the\n * contents: project them into `[sdsActions]`.\n *\n * Slots, left to right: `[sdsLogo]`, `[sdsLead]` (beside the name — a location or workspace picker),\n * `[sdsCenter]` (the flexible middle — a search field), `[sdsActions]` (the right edge).\n *\n * @example\n * <sds-topbar appName=\"Design system\">\n * <img sdsLogo src=\"logo.svg\" alt=\"\" />\n * <my-address-picker sdsLead />\n * <my-search sdsCenter />\n * <my-account-menu sdsActions />\n * </sds-topbar>\n */\n@Component({\n selector: 'sds-topbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <header class=\"relative z-30\" [class]=\"shellClasses()\" style=\"height: var(--sds-topbar-h)\">\n <!--\n Decorative wave. The clip lives HERE, on the wave's own wrapper, and not on the header.\n The header used to carry overflow-hidden, which also clipped anything projected into\n [sdsActions] — so an app menu or dropdown, the very thing that slot exists for, rendered as a\n 4px sliver. The wave still needs clipping; nothing else does.\n -->\n @if (appearance() === 'brand') {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <svg\n class=\"pointer-events-none absolute inset-y-0 right-0 h-full w-2/3 min-w-105\"\n viewBox=\"0 0 600 64\"\n preserveAspectRatio=\"none\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M0,64 C150,64 130,6 340,6 C470,6 480,64 600,64 Z\"\n fill=\"white\"\n fill-opacity=\"0.05\"\n />\n <path\n d=\"M40,64 C210,64 190,18 400,18 C520,18 540,64 660,64\"\n stroke=\"white\"\n stroke-opacity=\"0.13\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M130,64 C300,64 280,2 480,2 C580,2 600,40 680,64\"\n stroke=\"white\"\n stroke-opacity=\"0.10\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n }\n\n <!--\n Brand-tinted ambient blobs. Behind the content and non-interactive; the clip lives on this span,\n never on the header, so a projected menu/dropdown is not sliced. Colours come from the brand ramp,\n so they follow the active theme and dark mode.\n -->\n @if (decorations()) {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <span class=\"absolute -top-16 right-8 h-56 w-56 rounded-full bg-brand-300/25 blur-3xl animate-sds-ambient\"></span>\n <span class=\"absolute -top-10 right-[26%] h-40 w-40 rounded-full bg-brand-400/20 blur-3xl animate-sds-ambient [animation-delay:3s]\"></span>\n </span>\n }\n\n <!--\n The band is always full-bleed — the gradient and the wave span the viewport — while the\n CONTENTS are constrained by [contentWidth], so a bar over a centred page lines up with it\n instead of running to the edges. Empty (the default) leaves the contents full-bleed too,\n which is what a dashboard shell wants.\n -->\n <div\n class=\"relative mx-auto flex h-full items-center justify-between px-4 sm:px-6\"\n [class]=\"contentWidth()\"\n >\n <!-- Left: mobile menu button + logo + app name -->\n <div class=\"relative flex items-center gap-3\">\n @if (menuButton()) {\n <button\n type=\"button\"\n class=\"-ml-1 inline-flex h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:hidden\"\n [class]=\"menuButtonClasses()\"\n [attr.aria-label]=\"menuLabel()\"\n (click)=\"store.toggleMobile()\"\n >\n <sds-icon name=\"menu\" [size]=\"22\" />\n </button>\n }\n <ng-content select=\"[sdsLogo]\" />\n <!--\n The app name is hidden on phones (< sm) and shown from sm up: on a narrow bar carrying a logo,\n a search field and the account controls, the wordmark is what gives — the logo still answers\n \"which app\". shrink-0 + whitespace-nowrap keep it on one line at the widths where it does show.\n -->\n @if (appName()) {\n <span class=\"hidden h-7 w-px shrink-0 sm:block\" [class]=\"appearance() === 'brand' ? 'bg-white/30' : 'bg-border'\" [style.opacity]=\"appearance() === 'glass' ? 0.7 : null\"></span>\n <span class=\"hidden shrink-0 whitespace-nowrap text-xl font-bold tracking-tight sm:inline-block\">{{ appName() }}</span>\n }\n <ng-content select=\"[sdsLead]\" />\n </div>\n\n <!-- Flexible middle: takes the space the two ends leave, and is skipped entirely when empty. -->\n <div class=\"relative flex min-w-0 flex-1 items-center justify-center px-2\">\n <ng-content select=\"[sdsCenter]\" />\n </div>\n\n <!-- Right: whatever the app puts here -->\n <div class=\"relative flex items-center gap-3 sm:gap-4\">\n <ng-content select=\"[sdsActions]\" />\n </div>\n </div>\n </header>\n `,\n})\nexport class SdsTopbar {\n protected readonly store = inject(SidebarStore);\n\n readonly appName = input<string>('');\n\n /**\n * Width of the bar's CONTENTS, as Tailwind width utilities — e.g. `\"w-full max-w-7xl\"`.\n *\n * The coloured band always spans the viewport; this constrains only what sits on it, so the logo and\n * the actions line up with a page whose own content is centred at the same width. Default is empty,\n * i.e. contents run edge to edge, which is right for a full-bleed dashboard shell.\n *\n * A class string rather than an enum on purpose: apps already state their content width as a Tailwind\n * utility, and this way the bar is given the SAME string rather than a name that has to be kept in\n * sync with it.\n */\n readonly contentWidth = input<string>('w-full');\n /** Show the mobile hamburger that toggles the sidebar drawer (< lg). */\n readonly menuButton = input(true, { transform: booleanAttribute });\n\n /**\n * Accessible name for the hamburger. Defaults to French so nothing changes for existing consumers,\n * but any app serving more than one language MUST pass a translated value — an icon-only control's\n * aria-label is its only name, and a hardcoded one is simply wrong in every other locale.\n */\n readonly menuLabel = input<string>('Ouvrir le menu');\n\n /**\n * `brand` (default) paints the gradient and the wave; `surface` is white on a hairline border;\n * `glass` is a translucent, brand-tinted bar with a backdrop blur.\n */\n readonly appearance = input<SdsTopbarAppearance>('brand');\n\n /** Add slow-drifting brand-tinted blobs behind the bar (opt-in; pairs with `glass`/`surface`). */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly shellClasses = computed(() => {\n switch (this.appearance()) {\n case 'brand':\n return 'bg-linear-to-r from-brand-800 via-brand-700 to-brand-600 text-white';\n case 'glass':\n // Translucent so the blur shows the page tint through; the brand edge is read from the ramp.\n return 'border-b border-border bg-linear-to-r from-surface/85 via-surface/80 to-brand-100/70 text-ink backdrop-blur-xl';\n default:\n return 'border-b border-border bg-surface text-ink';\n }\n });\n\n protected readonly menuButtonClasses = computed(() =>\n this.appearance() === 'brand'\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40',\n );\n\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsShellBackground = 'plain' | 'gradient';\n\n/**\n * App layout shell: a full-height column with the top bar across the top and a\n * row below holding the sidebar and the scrollable main content.\n *\n * The content area is `plain` (flat canvas) by default. Set `[background]=\"'gradient'\"` for the soft\n * brand-tinted wash that pairs with the glass top bar and the surface sidebar, and add `[decorations]`\n * for the slow drifting brand blobs behind the page. Both read the brand ramp, so they follow the active\n * theme and dark mode, and the decorations respect prefers-reduced-motion.\n *\n * Page overlays (drawers, dialogs) can be rendered anywhere in the page: `<main>` is not a stacking\n * context, so a `fixed` overlay with a z-index above the top bar's (z-30) covers the top bar too.\n *\n * @example\n * <sds-shell background=\"gradient\" decorations>\n * <sds-topbar appearance=\"glass\" sdsTopbar … />\n * <sds-sidebar appearance=\"surface\" sdsSidebar> … </sds-sidebar>\n * <!-- routed page content -->\n * <router-outlet />\n * </sds-shell>\n */\n@Component({\n selector: 'sds-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div class=\"flex h-screen flex-col overflow-hidden\">\n <ng-content select=\"[sdsTopbar]\" />\n <div class=\"flex min-h-0 flex-1\">\n <ng-content select=\"[sdsSidebar]\" />\n <!--\n The content area carries the background and the ambient blobs; the scrolling <main> sits on top,\n transparent. <main> is positioned but never a stacking context (no isolate, no z-index): one would\n trap a page's own overlays — drawers, dialogs, fixed popovers — under the top bar (z-30) however\n high their z-index. Same pattern as the top bar and sidebar decorations: the blob layer comes first\n with no z-index, so the positioned <main> after it paints above it.\n -->\n <div class=\"relative flex min-w-0 flex-1\" [class]=\"areaClass()\">\n @if (decorations()) {\n <div class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <div class=\"absolute -left-32 top-10 h-96 w-96 rounded-full bg-brand-300/15 blur-3xl animate-sds-ambient\"></div>\n <div class=\"absolute -right-40 top-1/3 h-[28rem] w-[28rem] rounded-full bg-brand-400/12 blur-3xl animate-sds-ambient [animation-delay:4s]\"></div>\n <div class=\"absolute bottom-10 left-1/4 h-80 w-80 rounded-full bg-brand-200/20 blur-3xl animate-sds-ambient [animation-delay:7s]\"></div>\n </div>\n }\n <main class=\"relative min-w-0 flex-1 overflow-y-auto\">\n <ng-content />\n </main>\n </div>\n </div>\n </div>\n `,\n})\nexport class SdsShell {\n /** `plain` flat canvas (default) or a soft brand-tinted `gradient` wash. */\n readonly background = input<SdsShellBackground>('plain');\n\n /** Add slow-drifting brand-tinted blobs behind the page content (opt-in). They stay in place while the page scrolls. */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly areaClass = computed(() =>\n this.background() === 'gradient'\n ? 'bg-linear-to-br from-brand-50/50 via-canvas to-brand-100/40'\n : 'bg-canvas',\n );\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsSidebarAppearance, SidebarStore } from './sidebar-store';\n\n/**\n * Collapsible navigation rail. Project <sds-nav-group>/<sds-nav-item> as the\n * default content, and pin a footer (e.g. search + version badge) via the\n * [sdsFooter] slot. Collapse state is shared through SidebarStore.\n *\n * Two appearances. `brand` (default) is the dark brand rail. `surface` is a light rail with a faint\n * brand wash and brand-tinted active items — the counterpart to the glass top bar. The appearance is\n * published to SidebarStore so the projected nav items adopt the matching state colours from this one\n * input. `[decorations]` adds the same slow brand-tinted blobs the top bar and container use.\n *\n * Responsive: below `lg` it is a fixed off-canvas drawer opened by the top bar's hamburger; it is a\n * modal (scrim + trap), so while open Escape closes it, focus moves into it and is restored on close,\n * and Tab is kept inside. While closed it is `inert`, so its off-screen items are out of the tab order.\n * At `lg` and up it is the in-flow, collapsible rail.\n *\n * @example\n * <sds-sidebar appearance=\"surface\" decorations>\n * <sds-nav-group label=\"Membres\">\n * <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" link=\"/membres/new\" />\n * </sds-nav-group>\n * <div sdsFooter>…</div>\n * </sds-sidebar>\n */\n@Component({\n selector: 'sds-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'block h-full',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <!-- Mobile backdrop (only when the drawer is open, < lg) -->\n @if (mobileOpen()) {\n <div\n class=\"fixed inset-0 z-40 bg-black/50 lg:hidden\"\n (click)=\"store.closeMobile()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!--\n Mobile (< lg): fixed off-canvas drawer that slides in from the left, and is inert while closed so\n its off-screen controls leave the tab order. Desktop (>= lg): the in-flow collapsible icon-rail. It\n is lg:relative (not static) so the ambient blobs, which are absolutely positioned, anchor to it.\n -->\n <aside\n #drawer\n class=\"fixed inset-y-0 left-0 z-50 flex h-full w-[var(--sds-sidebar-w)] flex-col transition-transform duration-200 ease-out lg:relative lg:z-auto lg:w-[var(--sds-rail)] lg:translate-x-0 lg:transition-[width]\"\n [class]=\"asideClass()\"\n [style.--sds-rail]=\"railWidth()\"\n [inert]=\"belowLg() && !mobileOpen()\"\n [attr.role]=\"belowLg() && mobileOpen() ? 'dialog' : null\"\n [attr.aria-modal]=\"belowLg() && mobileOpen() ? 'true' : null\"\n (keydown)=\"onDrawerKeydown($event)\"\n >\n @if (decorations()) {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <span class=\"absolute -top-16 -left-16 h-56 w-56 rounded-full bg-brand-300/20 blur-3xl animate-sds-ambient\"></span>\n <span class=\"absolute -bottom-24 -right-16 h-64 w-64 rounded-full bg-brand-400/15 blur-3xl animate-sds-ambient [animation-delay:4s]\"></span>\n </span>\n }\n\n <!-- Header: collapse toggle (desktop) / close (mobile) -->\n <div\n class=\"relative flex items-center px-3\"\n style=\"height: 52px\"\n [class]=\"collapsed() ? 'justify-end lg:justify-center' : 'justify-end'\"\n >\n <button\n type=\"button\"\n class=\"hidden h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:inline-flex\"\n [class]=\"railBtnClass()\"\n [attr.aria-label]=\"collapsed() ? expandLabel() : collapseLabel()\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"store.toggle()\"\n >\n <sds-icon\n [name]=\"collapsed() ? 'panel-left-open' : 'panel-left-close'\"\n [size]=\"20\"\n />\n </button>\n <button\n #closeBtn\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:hidden\"\n [class]=\"railBtnClass()\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"store.closeMobile()\"\n >\n <sds-icon name=\"x\" [size]=\"20\" />\n </button>\n </div>\n\n <!-- Navigation -->\n <nav class=\"relative flex-1 overflow-y-auto overflow-x-hidden px-3 pb-4\">\n <ng-content />\n </nav>\n\n <!-- Footer (search, version, …) -->\n <div class=\"relative px-3 pb-4 pt-2\">\n <ng-content select=\"[sdsFooter]\" />\n </div>\n </aside>\n `,\n})\nexport class SdsSidebar {\n protected readonly store = inject(SidebarStore);\n private readonly document = inject(DOCUMENT);\n\n private readonly drawer = viewChild<ElementRef<HTMLElement>>('drawer');\n private readonly closeBtn = viewChild<ElementRef<HTMLButtonElement>>('closeBtn');\n\n /** True below the `lg` breakpoint — where the rail is the off-canvas modal drawer. */\n protected readonly belowLg = signal(false);\n /** The element focused before the drawer opened, restored to it on close. */\n private restoreFocusTo: HTMLElement | null = null;\n\n constructor() {\n // Publish the rail's paint so projected nav items match it.\n effect(() => this.store.appearance.set(this.appearance()));\n\n const view = this.document.defaultView;\n const mql = view?.matchMedia('(max-width: 1023.98px)');\n if (mql) {\n this.belowLg.set(mql.matches);\n mql.addEventListener('change', (e) => this.belowLg.set(e.matches));\n }\n\n // Modal focus handling for the mobile drawer: on open, remember what was focused (the hamburger) and\n // move focus to the close button; on close, restore it. A no-op at ≥ lg, where the rail is not modal.\n effect(() => {\n const open = this.mobileOpen();\n if (!this.belowLg()) return;\n if (open) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement | null;\n this.closeBtn()?.nativeElement.focus();\n } else if (this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n });\n }\n\n /**\n * Accessible names for the rail's three icon-only controls. French defaults keep existing consumers\n * unchanged; a multilingual app must pass translated values.\n */\n readonly collapseLabel = input<string>('Replier le menu');\n readonly expandLabel = input<string>('Déplier le menu');\n readonly closeLabel = input<string>('Fermer le menu');\n\n /** `brand` (default) is the dark rail; `surface` is a light rail with brand accents. */\n readonly appearance = input<SdsSidebarAppearance>('brand');\n\n /** Add slow-drifting brand-tinted blobs behind the rail (opt-in). */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly collapsed = this.store.collapsed;\n protected readonly mobileOpen = this.store.mobileOpen;\n\n protected readonly asideClass = computed(() => {\n // The rail must stay OPAQUE: as a mobile drawer it slides over page content, so a translucent stop\n // (e.g. to-brand-50/50) would let that content bleed through. All gradient stops are opaque; the\n // wash is a subtle surface->brand-50 tint, not a transparency.\n const paint =\n this.appearance() === 'surface'\n ? 'bg-surface bg-linear-to-b from-surface via-surface to-brand-50 text-ink border-r border-border'\n : 'bg-brand-900 text-white';\n const slide = this.mobileOpen() ? 'translate-x-0' : '-translate-x-full';\n return `${paint} ${slide}`;\n });\n\n /** The two header icon buttons, painted for the active rail. */\n protected readonly railBtnClass = computed(() =>\n this.appearance() === 'surface'\n ? 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40'\n : 'text-white/70 hover:bg-white/10 hover:text-white focus-visible:ring-white/40',\n );\n\n /** Desktop rail width (full vs. collapsed); mobile always uses full width. */\n protected readonly railWidth = computed(() =>\n this.collapsed()\n ? 'var(--sds-sidebar-w-collapsed)'\n : 'var(--sds-sidebar-w)',\n );\n\n protected onEscape(): void {\n if (this.mobileOpen()) this.store.closeMobile();\n }\n\n /** Keep Tab inside the open mobile drawer (a modal must not leak focus to the page behind the scrim). */\n protected onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.mobileOpen() || !this.belowLg()) return;\n const focusables = this.focusableEls();\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private focusableEls(): HTMLElement[] {\n const root = this.drawer()?.nativeElement;\n if (!root) return [];\n const sel =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n return Array.from(root.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null || el === this.document.activeElement,\n );\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SidebarStore } from './sidebar-store';\n\n/**\n * Groups nav items under an optional uppercase section label.\n *\n * Two modes:\n * - **Section** (default) — a static label over its items. The label is replaced by a divider when\n * the rail is collapsed.\n * - **Collapsible** (`[collapsible]`) — the label becomes a button that expands and collapses the\n * group. Set `[basePath]` and the group opens itself whenever the active route is inside it, so a\n * deep link or a browser Back lands with the right section already open instead of the person\n * having to find and re-open it.\n *\n * Collapsible mode exists because a flat rail stops scaling somewhere around a dozen destinations,\n * and the alternative — showing every child of every section at once — buries the ones in use.\n *\n * On the collapsed desktop rail there is nowhere to put a header, so a collapsible group renders\n * exactly like a section: divider, children visible. Hiding them there would leave the rail with\n * unreachable destinations and no affordance to reveal them.\n */\n@Component({\n selector: 'sds-nav-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div class=\"mt-5 first:mt-3\">\n @if (label()) {\n @if (collapsible()) {\n <!--\n A collapsible header is styled as a NAV ROW, not as a section caption. A small uppercase\n caption says \"everything under me belongs to me\" — which is a lie the moment the group is\n collapsed and the next section's items sit directly beneath it. At row scale, with an icon\n and a chevron, it reads as the control it is.\n\n It renders on the collapsed rail too, as an icon alone, because there it is the group's\n ONLY representation: the children are hidden (a child with no icon of its own would be a\n blank row), so the app is expected to treat the toggle as \"take me into this section\" —\n which is what expandedChange already means.\n -->\n <button\n type=\"button\"\n [class]=\"headerClass()\"\n [attr.aria-expanded]=\"collapsed() ? null : expanded()\"\n [attr.title]=\"collapsed() ? label() : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"20\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate text-left\" [class.lg:hidden]=\"collapsed()\">\n {{ label() }}\n </span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n [class]=\"chevronClass()\"\n [class.lg:hidden]=\"collapsed()\"\n [class.rotate-180]=\"expanded()\"\n />\n </button>\n } @else if (collapsed()) {\n <div [class]=\"dividerClass()\"></div>\n } @else {\n <p [class]=\"captionClass()\">\n {{ label() }}\n </p>\n }\n }\n\n <div [class]=\"childrenClass()\">\n <ng-content />\n </div>\n </div>\n `,\n})\nexport class SdsNavGroup {\n private readonly store = inject(SidebarStore);\n private readonly router = inject(Router);\n\n readonly label = input<string>('');\n\n /** Turn the label into an expand/collapse control. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n\n /** Icon for a collapsible header, so it reads at the same weight as the items it sits among. */\n readonly icon = input<SdsIconName | null>(null);\n\n /**\n * URL prefix owned by this group, e.g. `/payments`. While the active route starts with it the\n * group counts as active and opens itself — unless the person has explicitly toggled it since.\n */\n readonly basePath = input<string | null>(null);\n\n /** Emits the new state on every manual toggle. Not emitted for route-driven auto-expansion. */\n readonly expandedChange = output<boolean>();\n\n /** Explicit user choice; null means \"follow the route\". */\n private readonly manual = signal<boolean | null>(null);\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map((e) => e.urlAfterRedirects),\n ),\n { initialValue: this.router.url },\n );\n\n /**\n * True while the active route lives inside this group. Matches on segment boundaries, not a raw string\n * prefix, so `/users/42` does NOT activate a group whose basePath is `/user` (query/hash are stripped\n * first).\n */\n protected readonly routeActive = computed(() => {\n const base = this.basePath();\n if (!base) return false;\n const path = this.url().split(/[?#]/)[0];\n return path === base || path.startsWith(base + '/');\n });\n\n protected readonly expanded = computed(() => this.manual() ?? this.routeActive());\n\n protected readonly collapsed = this.store.collapsed;\n\n /** Rail paint, shared via the store — see SidebarStore.appearance. Drives the header/caption tones. */\n private readonly surface = computed(() => this.store.appearance() === 'surface');\n\n /** Collapsible header, painted for the active rail (ink+brand on `surface`, white on `brand`). */\n protected readonly headerClass = computed(() => {\n const s = this.surface();\n const base =\n 'mb-1 flex h-10 w-full items-center gap-3 rounded-control px-3 text-sm font-medium ' +\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n (this.collapsed() ? 'lg:justify-center ' : '') +\n (s\n ? 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40'\n : 'text-white/70 hover:bg-white/8 hover:text-white focus-visible:ring-white/40');\n // text-ink (not brand-700) stays readable in dark, where the grayscale brand-700 is near-black.\n const active = this.routeActive() ? (s ? ' text-ink' : ' text-white') : '';\n return base + active;\n });\n\n protected readonly chevronClass = computed(\n () => 'shrink-0 transition-transform ' + (this.surface() ? 'text-ink-faint' : 'text-white/50'),\n );\n\n protected readonly dividerClass = computed(\n () => 'mx-3 mb-2 mt-2 h-px ' + (this.surface() ? 'bg-border' : 'bg-white/10'),\n );\n\n protected readonly captionClass = computed(\n () =>\n 'mb-1.5 px-3 text-[11px] font-semibold uppercase tracking-wider ' +\n (this.surface() ? 'text-ink-faint' : 'text-white/60'),\n );\n\n /**\n * A plain section always shows its items — they carry their own icons, so they survive the collapsed\n * rail. A collapsible group hides its children there instead: its children are sub-destinations and\n * typically have no icon, which on an icon-only rail is a row with nothing in it.\n */\n protected readonly childrenVisible = computed(\n () => !this.collapsible() || (!this.collapsed() && this.expanded()),\n );\n\n /**\n * One binding rather than `[class]` alongside `[class.hidden]` — mixing a whole-list binding with a\n * single-class toggle on the same element depends on Angular's styling precedence to resolve, which\n * is a subtlety no template should rest on.\n *\n * The indent rule appears only on an expanded collapsible group on the full-width rail: it is what\n * shows the children belong to the header above them.\n */\n protected readonly childrenClass = computed(() => {\n const parts = ['flex flex-col gap-1'];\n if (!this.childrenVisible()) {\n parts.push('hidden');\n }\n if (this.collapsible() && !this.collapsed()) {\n parts.push(this.surface() ? 'ml-5 border-l border-border pl-3' : 'ml-5 border-l border-white/10 pl-3');\n }\n return parts.join(' ');\n });\n\n /**\n * On the collapsed rail there is nothing to expand into, so the toggle always reports \"opening\" —\n * the app's handler takes that as the cue to navigate into the section, which is the only useful\n * meaning the control can have there.\n */\n protected toggle(): void {\n const next = this.collapsed() ? true : !this.expanded();\n this.manual.set(next);\n this.expandedChange.emit(next);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SidebarStore } from './sidebar-store';\n\n/**\n * A single sidebar navigation entry. Renders an anchor when [link] is set\n * (with automatic active state via routerLinkActive) or a button otherwise.\n *\n * Requires the host application to provide the Angular Router (`provideRouter`),\n * as it depends on RouterLink/RouterLinkActive even when used as a button.\n *\n * @example\n * <sds-nav-item icon=\"home\" label=\"Accueil\" link=\"/\" [exact]=\"true\" />\n */\n@Component({\n selector: 'sds-nav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, SdsIcon],\n host: { class: 'block' },\n template: `\n @if (link() !== null) {\n <a\n [routerLink]=\"link()\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"{ exact: exact() }\"\n [class]=\"itemClass(rla.isActive || active())\"\n [attr.title]=\"collapsed() ? label() : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n [attr.aria-current]=\"rla.isActive || active() ? 'page' : null\"\n (click)=\"store.closeMobile()\"\n >\n @if (rla.isActive || active()) {\n <span [class]=\"accentBarClass()\" aria-hidden=\"true\"></span>\n }\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <button\n type=\"button\"\n [class]=\"itemClass(active())\"\n [attr.title]=\"collapsed() ? label() : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n [attr.aria-current]=\"active() ? 'page' : null\"\n (click)=\"select.emit(); store.closeMobile()\"\n >\n @if (active()) {\n <span [class]=\"accentBarClass()\" aria-hidden=\"true\"></span>\n }\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n }\n\n <ng-template #content>\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"20\" class=\"shrink-0\" />\n }\n <!-- Label is hidden only on the collapsed desktop rail; always shown in the mobile drawer. -->\n <span class=\"truncate\" [class]=\"collapsed() ? 'lg:hidden' : ''\">{{ label() }}</span>\n </ng-template>\n `,\n})\nexport class SdsNavItem {\n protected readonly store = inject(SidebarStore);\n\n readonly icon = input<SdsIconName | null>(null);\n readonly label = input.required<string>();\n /** Router link target; when null, the item behaves as a button. */\n readonly link = input<string | unknown[] | null>(null);\n readonly exact = input(false, { transform: booleanAttribute });\n /** Manual active state (combined with routerLinkActive when a link is set). */\n readonly active = input(false, { transform: booleanAttribute });\n\n readonly select = output<void>();\n\n protected readonly collapsed = this.store.collapsed;\n\n protected itemClass(isActive: boolean): string {\n // A `surface` rail is light: an active item is a brand-tinted pill with a left accent bar, brand\n // text and a soft shadow (matching the certicheck reference); inactive is muted ink that lifts on\n // hover. A `brand` rail is dark, so an active item is a solid brand-500 pill in white. Read from the\n // shared store so the whole rail switches from one input on <sds-sidebar>.\n const surface = this.store.appearance() === 'surface';\n const base =\n 'group relative flex w-full items-center gap-3 rounded-control px-3 text-sm font-medium ' +\n 'transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 ' +\n (surface ? 'focus-visible:ring-brand-500/40 ' : 'focus-visible:ring-white/40 ') +\n (this.collapsed() ? 'h-10 lg:justify-center' : 'h-10');\n const state = isActive\n ? surface\n ? 'bg-linear-to-r from-brand-500/15 to-brand-500/5 text-ink shadow-sm'\n : 'bg-brand-500 text-white shadow-sm'\n : surface\n ? 'text-ink-soft hover:bg-brand-500/8 hover:text-ink'\n : 'text-white/70 hover:bg-white/8 hover:text-white';\n return `${base} ${state}`;\n }\n\n /**\n * The left accent bar on an active item — the strongest \"selected\" cue, and the one that survives a\n * grayscale brand where a tinted pill alone is nearly invisible. brand-600 on the light rail, white on\n * the dark one; on a coloured brand it is the brand colour, matching the certicheck accent bar.\n */\n protected readonly accentBarClass = computed(\n () =>\n 'pointer-events-none absolute left-1 top-1/2 h-5 w-1 -translate-y-1/2 rounded-full ' +\n (this.store.appearance() === 'surface' ? 'bg-brand-500' : 'bg-white'),\n );\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsAvatar, SdsAvatarStatus } from '../avatar/sds-avatar';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsUserMenuAppearance = 'surface' | 'on-brand';\nexport type SdsUserMenuAlign = 'start' | 'end';\n\n/**\n * The signed-in user's trigger and dropdown for the top bar: an avatar (with the name and email beside\n * it on wider screens) that opens a panel with a gradient header and whatever menu rows the app projects\n * — profile, settings, sign out. The library deliberately owns no fixed set of actions, because what\n * belongs here differs per app; project <sds-menu-item> (or any markup) into the default slot.\n *\n * It manages its own open state, closes on outside click, on Escape, and whenever a menu row is\n * activated, restoring focus to the trigger. Two appearances so the trigger sits correctly on either\n * bar: `surface` (default) for a light / glass bar, `on-brand` for the dark brand bar — the same default\n * as its top-bar siblings sds-theme-toggle and sds-search-command.\n *\n * It is a disclosure (aria-haspopup + aria-expanded on the trigger), not an ARIA menu widget: the rows\n * are ordinary links/buttons the app projects, navigated with Tab like any popover.\n *\n * @example\n * <sds-user-menu name=\"Souhail AIT SAID\" email=\"souhail@example.com\" status=\"online\" appearance=\"surface\">\n * <sds-menu-item icon=\"user\" label=\"Profil\" link=\"/profile\" />\n * <sds-menu-item icon=\"settings\" label=\"Paramètres\" link=\"/settings\" />\n * <sds-menu-item icon=\"log-out\" label=\"Se déconnecter\" tone=\"danger\" (select)=\"signOut()\" />\n * </sds-user-menu>\n */\n@Component({\n selector: 'sds-user-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsAvatar, SdsIcon],\n host: {\n class: 'relative inline-block',\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"flex items-center gap-2.5 rounded-control py-1.5 pl-1.5 pr-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"triggerClass()\"\n [attr.aria-label]=\"menuLabel()\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <sds-avatar\n [name]=\"name()\"\n [initials]=\"initials()\"\n [src]=\"src()\"\n [status]=\"status()\"\n [size]=\"avatarSize()\"\n [bgClass]=\"resolvedAvatarBg()\"\n />\n @if (showDetails()) {\n <span class=\"hidden min-w-0 flex-col items-start text-left leading-tight sm:flex\">\n <span class=\"max-w-40 truncate text-sm font-semibold\" [class]=\"nameClass()\">{{ name() }}</span>\n @if (email()) {\n <span class=\"max-w-40 truncate text-xs\" [class]=\"emailClass()\">{{ email() }}</span>\n }\n </span>\n }\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n class=\"hidden shrink-0 transition-transform sm:block\"\n [class]=\"chevronClass()\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n @if (open()) {\n <div\n class=\"absolute top-full z-50 mt-2 w-64 overflow-hidden rounded-card border border-border bg-surface shadow-xl animate-sds-menu\"\n [class]=\"align() === 'end' ? 'right-0' : 'left-0'\"\n (click)=\"onPanelClick($event)\"\n >\n <!-- Header: identity, on a soft brand wash. -->\n <div class=\"flex items-center gap-3 border-b border-border bg-linear-to-br from-brand-50 via-surface to-brand-100/40 p-4\">\n <sds-avatar\n [name]=\"name()\"\n [initials]=\"initials()\"\n [src]=\"src()\"\n [size]=\"44\"\n [bgClass]=\"headerAvatarBg()\"\n />\n <div class=\"min-w-0\">\n <p class=\"truncate text-sm font-semibold text-ink\">{{ name() }}</p>\n @if (email()) {\n <p class=\"mt-0.5 truncate text-xs text-ink-faint\">{{ email() }}</p>\n }\n </div>\n </div>\n\n <!-- Actions projected by the app. -->\n <div class=\"py-1.5\">\n <ng-content />\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-menu {\n animation: sds-menu-in 0.14s ease-out;\n }\n @keyframes sds-menu-in {\n from {\n opacity: 0;\n transform: translateY(-6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-menu {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsUserMenu {\n private readonly el = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n readonly name = input<string>('');\n readonly email = input<string>('');\n readonly initials = input<string>('');\n readonly src = input<string | null>(null);\n readonly status = input<SdsAvatarStatus | null>(null);\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsUserMenuAppearance>('surface');\n\n /** Which edge the panel aligns to. `end` (default) hangs the panel from the right of the trigger. */\n readonly align = input<SdsUserMenuAlign>('end');\n\n /** Show the name/email beside the avatar (≥ sm). Turn off for an avatar-only trigger. */\n readonly showDetails = input(true, { transform: booleanAttribute });\n\n /** Trigger avatar box size in px. */\n readonly avatarSize = input<number>(36);\n\n /** Override the trigger avatar's initials background; defaults per appearance. */\n readonly avatarBgClass = input<string | null>(null);\n\n /** Accessible name for the trigger (icon/avatar only when details are hidden). */\n readonly menuLabel = input<string>('Menu du compte');\n\n readonly openChange = output<boolean>();\n\n protected readonly open = signal(false);\n\n protected toggle(): void {\n this.open.update((v) => !v);\n this.openChange.emit(this.open());\n }\n\n protected close(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.openChange.emit(false);\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (this.open() && !this.el.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected onEscape(): void {\n if (!this.open()) return;\n this.close();\n // Keyboard dismissal returns focus to the trigger (a click-away deliberately does not).\n this.trigger()?.nativeElement.focus();\n }\n\n /** Close when any actionable row (link or button) inside the panel is activated. */\n protected onPanelClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).closest('a,button')) {\n this.close();\n this.trigger()?.nativeElement.focus();\n }\n }\n\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly resolvedAvatarBg = computed(\n () => this.avatarBgClass() ?? (this.onBrand() ? 'bg-white/15' : 'bg-brand-500'),\n );\n protected readonly headerAvatarBg = computed(() => 'bg-brand-500');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'hover:bg-white/10 focus-visible:ring-white/40'\n : 'hover:bg-muted focus-visible:ring-brand-500/40',\n );\n protected readonly nameClass = computed(() => (this.onBrand() ? 'text-white' : 'text-ink'));\n protected readonly emailClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n protected readonly chevronClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsMenuItemTone = 'default' | 'danger';\n\n/**\n * A single row inside a menu surface (the {@link SdsUserMenu} dropdown, or any custom popover). Renders,\n * in order of precedence: a plain anchor when [href] is set (an EXTERNAL or cross-origin URL), a\n * Router anchor when [link] is set (an in-app route), or a button otherwise. It always emits\n * {@link select} on activation. The parent menu closes itself when an item is activated, so an item\n * never has to reach back into the menu.\n *\n * `tone=\"danger\"` paints a destructive action (sign out, delete). Trailing content (a shortcut hint, a\n * count) projects into the default slot after the label.\n *\n * @example\n * <sds-menu-item icon=\"user\" label=\"Profil\" link=\"/profile\" /> <!-- in-app route -->\n * <sds-menu-item icon=\"external-link\" label=\"Site public\" href=\"https://…\" target=\"_blank\" />\n * <sds-menu-item icon=\"log-out\" label=\"Se déconnecter\" tone=\"danger\" (select)=\"signOut()\" />\n */\n@Component({\n selector: 'sds-menu-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterLink, SdsIcon],\n host: { class: 'block' },\n template: `\n @if (href() !== null) {\n <a\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"resolvedRel()\"\n [class]=\"rowClass()\"\n (click)=\"select.emit()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else if (link() !== null) {\n <a [routerLink]=\"link()\" [class]=\"rowClass()\" (click)=\"select.emit()\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <button type=\"button\" [class]=\"rowClass()\" [disabled]=\"disabled()\" (click)=\"select.emit()\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n }\n\n <ng-template #content>\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"18\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate text-left\">{{ label() }}</span>\n <ng-content />\n </ng-template>\n `,\n})\nexport class SdsMenuItem {\n readonly icon = input<SdsIconName | null>(null);\n readonly label = input.required<string>();\n /** Router link target for an in-app route; when null (default) the item is not a Router link. */\n readonly link = input<string | unknown[] | null>(null);\n /**\n * External / cross-origin URL. When set, the item renders a plain `<a [href]>` (NOT a Router link),\n * so it works for another app's origin. Takes precedence over {@link link}.\n */\n readonly href = input<string | null>(null);\n /** Anchor target for {@link href}, e.g. `_blank` to open the destination in a new tab. */\n readonly target = input<string | null>(null);\n /**\n * `rel` for {@link href}. Defaults to `noopener noreferrer` when {@link target} is `_blank` (the safe\n * default for a new-tab external link); pass a value to override, or `''` to clear it.\n */\n readonly rel = input<string | null>(null);\n readonly tone = input<SdsMenuItemTone>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly select = output<void>();\n\n /** `noopener noreferrer` is forced for a `_blank` external link unless the consumer set `rel` explicitly. */\n protected readonly resolvedRel = computed(() =>\n this.rel() !== null ? this.rel() : this.target() === '_blank' ? 'noopener noreferrer' : null,\n );\n\n protected readonly rowClass = computed(() => {\n const base =\n 'flex w-full items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset ' +\n 'disabled:opacity-50 disabled:pointer-events-none';\n const tone =\n this.tone() === 'danger'\n ? 'text-danger hover:bg-danger/10 focus-visible:ring-danger/40'\n : 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40';\n return `${base} ${tone}`;\n });\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** One searchable entry. `group` buckets it under a heading; `keywords` widen what the filter matches. */\nexport interface SdsSearchItem {\n /** Stable identity, also used to build the option's DOM id. */\n id: string;\n label: string;\n icon?: SdsIconName;\n /** Optional section heading; items sharing a group render together. */\n group?: string;\n /** Extra terms the filter should match beyond the label (synonyms, a route, an acronym). */\n keywords?: string;\n disabled?: boolean;\n}\n\nexport type SdsSearchAppearance = 'surface' | 'on-brand';\n\ninterface Section {\n label: string;\n items: SdsSearchItem[];\n}\n\nconst norm = (s: string): string =>\n s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/**\n * A command-palette search: a trigger pill (search icon, placeholder, a ⌘K hint) that opens a modal with\n * a search field, grouped results and keyboard navigation. It is data-driven — the app passes `[items]`\n * and handles `(select)` — so the library stays router-agnostic; ⌘K / Ctrl-K opens it from anywhere.\n *\n * When the field is empty the items show as quick navigation; typing filters by label and keywords\n * (accent-insensitive). Arrow keys move the highlight, Enter selects, Escape closes. Hide the built-in\n * pill with `[showTrigger]=\"false\"` and drive it from your own control via a template ref: `cmd.open()`.\n *\n * @example\n * <sds-search-command\n * #cmd\n * appearance=\"surface\"\n * [items]=\"navItems\"\n * (select)=\"router.navigateByUrl($event.id)\"\n * />\n */\n@Component({\n selector: 'sds-search-command',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'block',\n '(document:keydown)': 'onGlobalKeydown($event)',\n },\n template: `\n @if (showTrigger()) {\n <!--\n Responsive trigger: a 40px icon-only button on phones (< sm), the full pill (placeholder + ⌘K\n hint, with a minimum width so it does not collapse in a flexible slot) from sm up. The min-width\n is carried in a CSS var so it can be applied at sm+ only, never squeezing the mobile square.\n -->\n <button\n type=\"button\"\n class=\"flex h-10 w-10 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 sm:w-auto sm:justify-between sm:gap-2 sm:px-3 sm:min-w-[var(--sds-search-minw)]\"\n [class]=\"triggerClass()\"\n [style.--sds-search-minw]=\"triggerMinWidth() + 'px'\"\n [attr.aria-label]=\"searchLabel()\"\n (click)=\"open()\"\n >\n <span class=\"flex min-w-0 items-center gap-2\" [class]=\"triggerTextClass()\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"shrink-0\" />\n <span class=\"hidden truncate text-sm sm:inline\">{{ placeholder() }}</span>\n </span>\n <kbd class=\"hidden shrink-0 rounded border px-1.5 py-0.5 text-[11px] font-semibold sm:inline-block\" [class]=\"kbdClass()\">{{ hotkeyLabel() }}</kbd>\n </button>\n }\n\n @if (isOpen()) {\n <div #overlay class=\"fixed inset-0 z-[100] flex items-start justify-center p-4 pt-[12vh]\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-black/40 backdrop-blur-sm\" (click)=\"close()\" aria-hidden=\"true\"></div>\n\n <!-- Panel -->\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"searchLabel()\"\n class=\"relative flex w-full max-w-xl flex-col overflow-hidden rounded-card border border-border bg-surface shadow-2xl animate-sds-cmd\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <!-- Search field -->\n <div class=\"flex items-center gap-3 border-b border-border px-4 py-3.5\">\n <sds-icon name=\"search\" [size]=\"20\" class=\"shrink-0 text-ink-faint\" />\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-controls=\"sds-cmd-list\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-label]=\"searchLabel()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n class=\"min-w-0 flex-1 bg-transparent text-base text-ink outline-none placeholder:text-ink-faint\"\n />\n @if (query()) {\n <button\n type=\"button\"\n class=\"rounded p-1 text-ink-faint transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500/40\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"18\" />\n </button>\n }\n <kbd class=\"hidden shrink-0 rounded bg-muted px-2 py-1 text-[11px] font-semibold text-ink-faint sm:inline-block\">ESC</kbd>\n </div>\n\n <!-- Results -->\n <div id=\"sds-cmd-list\" #list role=\"listbox\" [attr.aria-label]=\"searchLabel()\" class=\"max-h-[min(60vh,420px)] overflow-y-auto p-2\">\n @if (sections().length) {\n @for (section of sections(); track section.label) {\n @if (section.label) {\n <p class=\"px-3 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-wider text-ink-faint\">{{ section.label }}</p>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n role=\"option\"\n [id]=\"optionId(item)\"\n [attr.aria-selected]=\"activeId() === optionId(item)\"\n [disabled]=\"item.disabled\"\n class=\"flex w-full items-center gap-3 rounded-control px-3 py-2.5 text-left text-sm font-medium transition-colors focus-visible:outline-none disabled:opacity-50\"\n [class]=\"activeId() === optionId(item) ? 'bg-brand-500/15 text-ink' : 'text-ink-soft hover:bg-muted hover:text-ink'\"\n (click)=\"choose(item)\"\n (mousemove)=\"setActiveById(optionId(item))\"\n >\n @if (item.icon) {\n <sds-icon [name]=\"item.icon\" [size]=\"18\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate\">{{ item.label }}</span>\n </button>\n }\n }\n } @else {\n <div class=\"px-6 py-10 text-center\">\n <sds-icon name=\"search-x\" [size]=\"40\" class=\"mx-auto mb-3 text-ink-faint\" />\n <p class=\"text-sm text-ink-soft\">{{ emptyLabel() }}</p>\n </div>\n }\n </div>\n\n <!-- Footer hints -->\n <div class=\"flex items-center justify-center gap-4 border-t border-border bg-muted px-3 py-2.5 text-xs text-ink-faint\">\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">↵</kbd> {{ selectHint() }}</span>\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">↑↓</kbd> {{ navigateHint() }}</span>\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">ESC</kbd> {{ closeHint() }}</span>\n </div>\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-cmd {\n animation: sds-cmd-in 0.16s ease-out;\n }\n @keyframes sds-cmd-in {\n from {\n opacity: 0;\n transform: translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-cmd {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsSearchCommand {\n private readonly document = inject(DOCUMENT);\n private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly overlay = viewChild<ElementRef<HTMLElement>>('overlay');\n\n /** The searchable entries. Order is preserved; when the field is empty they show as quick navigation. */\n readonly items = input<SdsSearchItem[]>([]);\n\n /** Placeholder on the trigger pill and the search field. */\n readonly placeholder = input<string>('Rechercher…');\n\n /** Show the built-in trigger pill. Turn off to drive the palette from your own control (`cmd.open()`). */\n readonly showTrigger = input(true, { transform: booleanAttribute });\n\n /** Enable the global ⌘K / Ctrl-K shortcut. */\n readonly hotkey = input(true, { transform: booleanAttribute });\n\n /** Trigger pill minimum width in px, so it does not collapse in a flexible top-bar slot. */\n readonly triggerMinWidth = input<number>(220);\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsSearchAppearance>('surface');\n\n /**\n * User-facing copy. French defaults; a multilingual app passes translated values (the trigger and the\n * field share `placeholder`, and `searchLabel` is the accessible name for both).\n */\n readonly searchLabel = input<string>('Rechercher');\n readonly clearLabel = input<string>('Effacer');\n readonly emptyLabel = input<string>('Aucun résultat');\n readonly selectHint = input<string>('Sélectionner');\n readonly navigateHint = input<string>('Naviguer');\n readonly closeHint = input<string>('Fermer');\n\n readonly select = output<SdsSearchItem>();\n readonly openChange = output<boolean>();\n\n protected readonly isOpen = signal(false);\n protected readonly query = signal('');\n /** DOM id of the highlighted option, or null. Kept as the id (not an index) so the list can regroup. */\n protected readonly activeId = signal<string | null>(null);\n /** The element focused before the palette opened, restored to it on close (WAI-ARIA dialog pattern). */\n private restoreFocusTo: HTMLElement | null = null;\n\n constructor() {\n // On open: move the overlay to <body> so it escapes any ancestor that is a containing block for\n // fixed positioning (a `backdrop-filter` on the glass top bar is exactly such an ancestor), then\n // focus the field and lock background scroll. Angular still owns the moved node — its bindings and\n // listeners keep working, and @if removes it on close.\n effect(() => {\n const open = this.isOpen();\n const overlay = this.overlay();\n const input = this.searchInput();\n this.document.body.style.overflow = open ? 'hidden' : '';\n if (open && overlay) this.document.body.appendChild(overlay.nativeElement);\n if (open && input) input.nativeElement.focus();\n });\n\n // Keep a valid highlight as the results change: default to the first option; drop it if empty.\n // activeId is read untracked so writing it here does not retrigger this effect.\n effect(() => {\n const flat = this.flat();\n const current = untracked(this.activeId);\n if (!flat.length) {\n if (current !== null) this.activeId.set(null);\n return;\n }\n if (!current || !flat.some((i) => this.optionId(i) === current)) {\n this.activeId.set(this.optionId(flat[0]));\n }\n });\n\n // A palette destroyed while open must not leave the page unscrollable.\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n });\n }\n\n // --- public control (also reachable via a template ref) ---\n open(): void {\n if (this.isOpen()) return;\n // Remember what was focused (the trigger pill, or wherever ⌘K was pressed) to restore on close.\n this.restoreFocusTo = this.document.activeElement as HTMLElement | null;\n this.isOpen.set(true);\n this.openChange.emit(true);\n }\n\n close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.query.set('');\n this.openChange.emit(false);\n // Return focus to the invoker so keyboard/AT users are not dropped onto <body>.\n this.restoreFocusTo?.focus();\n this.restoreFocusTo = null;\n }\n\n toggle(): void {\n this.isOpen() ? this.close() : this.open();\n }\n\n // --- filtering ---\n private readonly filtered = computed(() => {\n const q = norm(this.query().trim());\n if (!q) return this.items();\n return this.items().filter((i) => norm(`${i.label} ${i.keywords ?? ''}`).includes(q));\n });\n\n protected readonly sections = computed<Section[]>(() => {\n const list = this.filtered();\n if (!list.length) return [];\n const anyGroup = list.some((i) => i.group);\n if (!anyGroup) {\n return [{ label: '', items: list }];\n }\n const order: string[] = [];\n const map = new Map<string, SdsSearchItem[]>();\n for (const item of list) {\n const g = item.group ?? '';\n if (!map.has(g)) {\n map.set(g, []);\n order.push(g);\n }\n map.get(g)!.push(item);\n }\n return order.map((label) => ({ label, items: map.get(label)! }));\n });\n\n private readonly flat = computed(() => this.sections().flatMap((s) => s.items.filter((i) => !i.disabled)));\n\n // --- interaction ---\n protected optionId(item: SdsSearchItem): string {\n return `sds-cmd-opt-${item.id}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n }\n\n protected clear(): void {\n this.query.set('');\n this.searchInput()?.nativeElement.focus();\n }\n\n protected setActiveById(id: string): void {\n this.activeId.set(id);\n }\n\n protected choose(item: SdsSearchItem): void {\n if (item.disabled) return;\n this.select.emit(item);\n this.close();\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.close();\n return;\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n return;\n case 'Enter': {\n event.preventDefault();\n const current = this.flat().find((i) => this.optionId(i) === this.activeId());\n if (current) this.choose(current);\n return;\n }\n case 'Tab':\n // Keep focus inside the modal (aria-modal must not leak focus to the page behind the backdrop).\n this.trapTab(event);\n return;\n }\n }\n\n protected onGlobalKeydown(event: KeyboardEvent): void {\n if (this.hotkey() && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n this.toggle();\n return;\n }\n // Fallback: close on Escape even if focus somehow left the panel.\n if (this.isOpen() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n private trapTab(event: KeyboardEvent): void {\n const root = this.overlay()?.nativeElement;\n if (!root) return;\n const sel =\n 'a[href],button:not([disabled]),input:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n const focusables = Array.from(root.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null || el === this.document.activeElement,\n );\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private move(delta: number): void {\n const flat = this.flat();\n if (!flat.length) return;\n const currentIndex = flat.findIndex((i) => this.optionId(i) === this.activeId());\n const next = Math.min(flat.length - 1, Math.max(0, (currentIndex < 0 ? 0 : currentIndex) + delta));\n const id = this.optionId(flat[next]);\n this.activeId.set(id);\n // Positions are static, so scrolling the element into view needs no rendered highlight.\n this.document.getElementById(id)?.scrollIntoView({ block: 'nearest' });\n }\n\n // --- trigger appearance ---\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'bg-white/10 hover:bg-white/15 focus-visible:ring-white/40'\n : 'bg-muted hover:bg-brand-50 border border-transparent hover:border-brand-200 focus-visible:ring-brand-500/40',\n );\n protected readonly triggerTextClass = computed(() => (this.onBrand() ? 'text-white/80' : 'text-ink-faint'));\n protected readonly kbdClass = computed(() =>\n this.onBrand() ? 'border-white/25 text-white/70' : 'border-border bg-surface text-ink-faint',\n );\n\n protected readonly hotkeyLabel = computed(() => {\n const platform = this.document.defaultView?.navigator?.platform ?? '';\n return /mac|iphone|ipad/i.test(platform) ? '⌘K' : 'Ctrl K';\n });\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsLanguageSwitcherAppearance = 'surface' | 'on-brand';\nexport type SdsLanguageSwitcherAlign = 'start' | 'end';\nexport type SdsLanguageSwitcherDirection = 'down' | 'up';\n\n/**\n * One selectable language. Pass either this shape or a bare code string in [languages].\n */\nexport interface SdsLanguageOption {\n /** Language code, e.g. 'fr', 'de', 'en'. Shown uppercased in the trigger. */\n code: string;\n /** Human-readable name shown in the list, e.g. 'Français'. Defaults to `code.toUpperCase()`. */\n label?: string;\n}\n\nlet nextId = 0;\n\n/**\n * The language picker for the top bar: a compact pill (globe icon + the active code) that opens a panel\n * listing exactly the languages the app supports, each row marked selected for the current one.\n *\n * The library owns no i18n engine — every app uses a different one (ngx-translate, Transloco, per-locale\n * URLs). So this is a pure, controlled control: the app passes the supported [languages] and the [current]\n * code, and reacts to the choice. `current` is a two-way `model`, so bind `[(current)]=\"lang\"` for optimistic\n * echo, or just listen to `(currentChange)` and call your own `translate.use($event)`. Rows show each\n * language's human label (pass it in the option, or let it default to the uppercased code).\n *\n * It is a sibling of sds-user-menu / sds-theme-toggle / sds-search-command and shares their chrome: the same\n * two appearances (`surface` default for a light/glass bar, `on-brand` for the dark brand bar), the same\n * disclosure mechanics (closes on outside click, on Escape, and on selection, restoring focus to the trigger),\n * and the same panel styling and open animation — so the three top-bar controls read as one set.\n *\n * The panel is appended to `document.body` while open and positioned against the trigger (like sds-select),\n * so a clipping ancestor — a bar with `overflow:hidden`, or a `glass` bar whose `backdrop-filter` is a\n * containing block — can never cut it off or paint over it. It repositions on scroll/resize and is removed\n * on close. Accessibility follows the APG select-only combobox: focus stays on the trigger, and Arrow/Home/\n * End/Enter/Escape drive a highlighted option surfaced via `aria-activedescendant` (works even though the\n * listbox lives in `<body>`).\n *\n * @example\n * <sds-language-switcher\n * [languages]=\"[{ code: 'fr', label: 'Français' }, { code: 'de', label: 'Deutsch' }, { code: 'en', label: 'English' }]\"\n * [current]=\"lang()\"\n * menuLabel=\"Changer de langue\"\n * (currentChange)=\"translate.use($event)\"\n * />\n *\n * @example\n * <!-- Bare codes are fine; rows fall back to the uppercased code. -->\n * <sds-language-switcher [languages]=\"['fr', 'de', 'en']\" [(current)]=\"lang\" />\n */\n@Component({\n selector: 'sds-language-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'relative inline-block',\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <button\n #trigger\n type=\"button\"\n role=\"combobox\"\n class=\"flex h-10 items-center gap-1.5 rounded-control px-3 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"triggerClass()\"\n [attr.aria-label]=\"menuLabel()\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <sds-icon name=\"languages\" [size]=\"16\" class=\"shrink-0\" />\n <span>{{ currentCode() }}</span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"14\"\n class=\"shrink-0 transition-transform\"\n [class]=\"chevronClass()\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel) so no ancestor can clip it. -->\n <div\n data-sds-language-panel\n [id]=\"panelId\"\n role=\"listbox\"\n [attr.aria-label]=\"menuLabel()\"\n class=\"fixed z-[1000] min-w-44 overflow-hidden rounded-card border border-border bg-surface shadow-xl animate-sds-menu\"\n >\n @if (heading(); as h) {\n <p class=\"border-b border-border px-4 pb-2 pt-3 text-[0.68rem] font-semibold uppercase tracking-wider text-ink-faint\">\n {{ h }}\n </p>\n }\n <div class=\"max-h-[60vh] overflow-auto py-1.5\">\n @for (opt of options(); track opt.code; let i = $index) {\n <div\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.data-index]=\"i\"\n [attr.aria-selected]=\"opt.code === effectiveCode()\"\n [class]=\"rowClass(i, opt.code === effectiveCode())\"\n (click)=\"choose(opt.code)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n <span class=\"flex-1 truncate text-left\">{{ opt.label }}</span>\n <span\n class=\"shrink-0 text-[0.7rem] font-semibold uppercase tracking-wide\"\n [class]=\"opt.code === effectiveCode() ? 'text-brand-600' : 'text-ink-faint'\"\n >{{ opt.code }}</span\n >\n @if (opt.code === effectiveCode()) {\n <sds-icon name=\"check\" [size]=\"16\" class=\"shrink-0 text-brand-600\" />\n } @else {\n <span class=\"w-4 shrink-0\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-menu {\n animation: sds-menu-in 0.14s ease-out;\n }\n @keyframes sds-menu-in {\n from {\n opacity: 0;\n transform: translateY(-6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-menu {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsLanguageSwitcher implements OnDestroy {\n private readonly el = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly injector = inject(Injector);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n protected readonly panelId = `sds-language-panel-${nextId++}`;\n\n /** The supported languages — either `{ code, label }` options or bare code strings. */\n readonly languages = input<ReadonlyArray<SdsLanguageOption | string>>([]);\n\n /** The active language code. Two-way: `[(current)]` echoes the choice, or listen to `(currentChange)`. */\n readonly current = model<string>('');\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsLanguageSwitcherAppearance>('surface');\n\n /** Which edge the panel aligns to. `end` (default) hangs it from the right of the trigger. */\n readonly align = input<SdsLanguageSwitcherAlign>('end');\n\n /** `up` prefers opening the panel above the trigger — for a switcher near the bottom of the page. */\n readonly direction = input<SdsLanguageSwitcherDirection>('down');\n\n /** Accessible name for the trigger and panel. */\n readonly menuLabel = input<string>('Choisir la langue');\n\n /** Optional visible header above the list (e.g. \"Langue\"). Omitted when empty. */\n readonly heading = input<string>('');\n\n readonly openChange = output<boolean>();\n\n protected readonly open = signal(false);\n protected readonly highlightedIndex = signal(-1);\n private panelEl: HTMLElement | null = null;\n\n /** Normalise the mixed `languages` input to `{ code, label }`, defaulting the label to the code. */\n protected readonly options = computed<SdsLanguageOption[]>(() =>\n this.languages().map((l) =>\n typeof l === 'string'\n ? { code: l, label: l.toUpperCase() }\n : { code: l.code, label: l.label ?? l.code.toUpperCase() },\n ),\n );\n\n /**\n * The code treated as active everywhere — trigger label AND the selected row. Falls back to the first\n * option when `current` is unset, so the pill and the checked row can never disagree.\n */\n protected readonly effectiveCode = computed(() => this.current() || this.options()[0]?.code || '');\n\n /** Uppercased code shown in the trigger. */\n protected readonly currentCode = computed(() => this.effectiveCode().toUpperCase());\n\n protected readonly activeOptionId = computed(() =>\n this.highlightedIndex() >= 0 ? this.optionId(this.highlightedIndex()) : null,\n );\n\n protected optionId(i: number): string {\n return `${this.panelId}-opt-${i}`;\n }\n\n protected toggle(): void {\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n this.open.set(true);\n this.openChange.emit(true);\n this.initHighlight();\n // After the panel renders inside the host, portal it to <body> and anchor it to the trigger, so no\n // clipping/stacking ancestor (an overflow:hidden bar, a backdrop-filter glass bar) can cut it off.\n // Focus stays on the trigger (combobox model); the active row is surfaced via aria-activedescendant.\n afterNextRender(\n () => {\n this.panelEl = this.el.nativeElement.querySelector<HTMLElement>('[data-sds-language-panel]');\n this.positionPanel();\n this.addReflowListeners();\n this.trigger()?.nativeElement.focus();\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n // Remove the portalled node ourselves before Angular tears the view down (it lives in <body> now).\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n this.openChange.emit(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected choose(code: string): void {\n this.current.set(code);\n // Pointer/keyboard selection returns focus to the trigger, like the other top-bar disclosures.\n this.close(true);\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inHost = this.el.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inHost && !inPanel) this.close();\n }\n\n protected onEscape(): void {\n if (!this.open()) return;\n this.close(true);\n }\n\n // --- keyboard (APG select-only combobox: focus stays on the trigger) ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); break;\n case 'ArrowUp': event.preventDefault(); this.move(-1); break;\n case 'Home': event.preventDefault(); this.highlight(0); break;\n case 'End': event.preventDefault(); this.highlight(this.options().length - 1); break;\n case 'Enter':\n case ' ': event.preventDefault(); this.chooseHighlighted(); break;\n case 'Escape': event.preventDefault(); this.close(true); break;\n case 'Tab': this.close(false); break;\n default: break;\n }\n }\n\n private initHighlight(): void {\n const idx = this.options().findIndex((o) => o.code === this.effectiveCode());\n this.highlightedIndex.set(idx >= 0 ? idx : this.options().length ? 0 : -1);\n }\n\n private move(delta: number): void {\n const n = this.options().length;\n if (!n) return;\n const from = this.highlightedIndex();\n this.highlight(((from < 0 ? 0 : from) + delta + n) % n);\n }\n\n private highlight(i: number): void {\n if (i < 0 || i >= this.options().length) return;\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n }\n\n private chooseHighlighted(): void {\n const opt = this.options()[this.highlightedIndex()];\n if (opt) this.choose(opt.code);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n this.panelEl\n ?.querySelector<HTMLElement>(`[data-index=\"${this.highlightedIndex()}\"]`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select / sds-date-picker) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n const pw = panelEl.offsetWidth || 176;\n const ph = panelEl.offsetHeight || 200;\n\n // Vertical: below by default; open above when asked (direction='up') and there is room, or when there\n // isn't room below but there is above. The panel height is bounded by the list's max-h, but clamp\n // defensively so top can never be pushed off the top edge.\n const roomBelow = window.innerHeight - r.bottom - gap;\n const roomAbove = r.top - gap;\n let top =\n (this.direction() === 'up' && roomAbove >= ph) || (roomBelow < ph && roomAbove > roomBelow)\n ? r.top - gap - ph\n : r.bottom + gap;\n if (top + ph > window.innerHeight - margin) top = window.innerHeight - margin - ph;\n if (top < margin) top = margin;\n\n // Horizontal: align the panel's end (right) or start (left) edge to the trigger, then clamp.\n let left = this.align() === 'end' ? r.right - pw : r.left;\n left = Math.min(left, window.innerWidth - margin - pw);\n left = Math.max(margin, left);\n\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'bg-muted text-ink-soft hover:bg-brand-50 hover:text-brand-600 focus-visible:ring-brand-500/40',\n );\n\n protected readonly chevronClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n\n protected rowClass(index: number, selected: boolean): string {\n const base =\n 'flex w-full cursor-pointer items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors';\n const highlighted = this.highlightedIndex() === index;\n let state: string;\n if (selected) {\n state = highlighted ? 'bg-brand-500/25 text-ink' : 'bg-brand-500/15 text-ink';\n } else {\n state = highlighted ? 'bg-muted text-ink' : 'text-ink-soft';\n }\n return `${base} ${state}`;\n }\n}\n","/*\n * Public API Surface of saitech-design-system — the Saitech / App design system.\n */\n\n// Primitives\nexport * from './lib/icon/icon-registry';\nexport * from './lib/icon/sds-icon';\nexport * from './lib/button/sds-button';\nexport * from './lib/input/sds-input';\nexport * from './lib/input-number/sds-input-number';\nexport * from './lib/localized-input/sds-localized-input';\nexport * from './lib/otp-input/sds-otp-input';\nexport * from './lib/textarea/sds-textarea';\nexport * from './lib/toggle-switch/sds-toggle-switch';\nexport * from './lib/checkbox/sds-checkbox';\nexport * from './lib/radio/sds-radio';\nexport * from './lib/avatar/sds-avatar';\nexport * from './lib/badge/sds-badge';\nexport * from './lib/card/sds-card';\nexport * from './lib/datepicker/date-utils';\nexport * from './lib/datepicker/sds-calendar';\nexport * from './lib/datepicker/sds-date-picker';\nexport * from './lib/select/sds-select';\nexport * from './lib/select/sds-multi-select';\nexport * from './lib/select/sds-select-templates';\nexport * from './lib/phone-input/phone-countries';\nexport * from './lib/phone-input/sds-phone-input';\nexport * from './lib/paginator/sds-paginator';\nexport * from './lib/tabs/sds-tabs-store';\nexport * from './lib/tabs/sds-tabs';\nexport * from './lib/tabs/sds-tab-list';\nexport * from './lib/tabs/sds-tab';\nexport * from './lib/tabs/sds-tab-panels';\nexport * from './lib/tabs/sds-tab-panel';\nexport * from './lib/accordion/sds-accordion-store';\nexport * from './lib/accordion/sds-accordion';\nexport * from './lib/accordion/sds-accordion-panel';\nexport * from './lib/accordion/sds-accordion-header';\nexport * from './lib/accordion/sds-accordion-content';\nexport * from './lib/table/sds-table-cell';\nexport * from './lib/table/sds-table-row-expansion';\nexport * from './lib/table/sds-table';\nexport * from './lib/toast/sds-toast.service';\nexport * from './lib/toast/sds-toast-host';\n\n// Theme\nexport * from './lib/theme/sds-theme.service';\nexport * from './lib/theme/sds-theme-toggle';\n\n// Layout\nexport * from './lib/topbar/sds-topbar';\nexport * from './lib/shell/sds-shell';\nexport * from './lib/sidebar/sidebar-store';\nexport * from './lib/sidebar/sds-sidebar';\nexport * from './lib/sidebar/sds-nav-group';\nexport * from './lib/sidebar/sds-nav-item';\nexport * from './lib/user-menu/sds-user-menu';\nexport * from './lib/user-menu/sds-menu-item';\nexport * from './lib/search/sds-search-command';\nexport * from './lib/language-switcher/sds-language-switcher';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["VARIANTS","SIZES","nextId"],"mappings":"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,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA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"}
1
+ {"version":3,"file":"besaitech-ng-design-system.mjs","sources":["../../../projects/saitech-design-system/src/lib/icon/icon-registry.ts","../../../projects/saitech-design-system/src/lib/icon/sds-icon.ts","../../../projects/saitech-design-system/src/lib/button/sds-button.ts","../../../projects/saitech-design-system/src/lib/input/sds-input.ts","../../../projects/saitech-design-system/src/lib/input-number/sds-input-number.ts","../../../projects/saitech-design-system/src/lib/localized-input/sds-localized-input.ts","../../../projects/saitech-design-system/src/lib/otp-input/sds-otp-input.ts","../../../projects/saitech-design-system/src/lib/textarea/sds-textarea.ts","../../../projects/saitech-design-system/src/lib/toggle-switch/sds-toggle-switch.ts","../../../projects/saitech-design-system/src/lib/checkbox/sds-checkbox.ts","../../../projects/saitech-design-system/src/lib/radio/sds-radio.ts","../../../projects/saitech-design-system/src/lib/avatar/sds-avatar.ts","../../../projects/saitech-design-system/src/lib/badge/sds-badge.ts","../../../projects/saitech-design-system/src/lib/card/sds-card.ts","../../../projects/saitech-design-system/src/lib/allergen/sds-allergen-icon.ts","../../../projects/saitech-design-system/src/lib/tri-state-chip/sds-tri-state-chip.ts","../../../projects/saitech-design-system/src/lib/segmented/sds-segmented.ts","../../../projects/saitech-design-system/src/lib/checklist/sds-checklist-row.ts","../../../projects/saitech-design-system/src/lib/score/sds-score.ts","../../../projects/saitech-design-system/src/lib/status-tile/sds-status-tile.ts","../../../projects/saitech-design-system/src/lib/menu/sds-menu.ts","../../../projects/saitech-design-system/src/lib/bulk-bar/sds-bulk-bar.ts","../../../projects/saitech-design-system/src/lib/sortable-list/sds-sortable-list.ts","../../../projects/saitech-design-system/src/lib/file-drop/sds-file-drop.ts","../../../projects/saitech-design-system/src/lib/image-cropper/sds-image-cropper.ts","../../../projects/saitech-design-system/src/lib/datepicker/date-utils.ts","../../../projects/saitech-design-system/src/lib/datepicker/sds-calendar.ts","../../../projects/saitech-design-system/src/lib/datepicker/sds-date-picker.ts","../../../projects/saitech-design-system/src/lib/select/sds-select-templates.ts","../../../projects/saitech-design-system/src/lib/select/sds-select.ts","../../../projects/saitech-design-system/src/lib/select/sds-multi-select.ts","../../../projects/saitech-design-system/src/lib/phone-input/phone-countries.ts","../../../projects/saitech-design-system/src/lib/phone-input/sds-phone-input.ts","../../../projects/saitech-design-system/src/lib/paginator/sds-paginator.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tabs-store.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tabs.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-list.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-panels.ts","../../../projects/saitech-design-system/src/lib/tabs/sds-tab-panel.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-store.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-panel.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-header.ts","../../../projects/saitech-design-system/src/lib/accordion/sds-accordion-content.ts","../../../projects/saitech-design-system/src/lib/table/sds-table-cell.ts","../../../projects/saitech-design-system/src/lib/table/sds-table-row-expansion.ts","../../../projects/saitech-design-system/src/lib/table/sds-table.ts","../../../projects/saitech-design-system/src/lib/toast/sds-toast.service.ts","../../../projects/saitech-design-system/src/lib/toast/sds-toast-host.ts","../../../projects/saitech-design-system/src/lib/theme/sds-theme.service.ts","../../../projects/saitech-design-system/src/lib/theme/sds-theme-toggle.ts","../../../projects/saitech-design-system/src/lib/sidebar/sidebar-store.ts","../../../projects/saitech-design-system/src/lib/topbar/sds-topbar.ts","../../../projects/saitech-design-system/src/lib/shell/sds-shell.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-sidebar.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-nav-group.ts","../../../projects/saitech-design-system/src/lib/sidebar/sds-nav-item.ts","../../../projects/saitech-design-system/src/lib/user-menu/sds-user-menu.ts","../../../projects/saitech-design-system/src/lib/user-menu/sds-menu-item.ts","../../../projects/saitech-design-system/src/lib/search/sds-search-command.ts","../../../projects/saitech-design-system/src/lib/language-switcher/sds-language-switcher.ts","../../../projects/saitech-design-system/src/public-api.ts","../../../projects/saitech-design-system/src/besaitech-ng-design-system.ts"],"sourcesContent":["/**\n * Curated set of line icons (Lucide-style, 24x24 viewBox, stroke-based).\n * Each entry holds only the inner SVG markup; the <sds-icon> component wraps it.\n * Add new icons here and they become available everywhere via name=\"...\".\n */\nexport const SDS_ICONS = {\n // Added for the Belvigo merchant shell (nav + header). Lucide 24x24 stroke paths, matching the\n // set the app already used before it moved onto this library.\n 'chart-column':\n '<path d=\"M3 3v16a2 2 0 0 0 2 2h16\"/><path d=\"M18 17V9\"/><path d=\"M13 17V5\"/><path d=\"M8 17v-3\"/>',\n 'clipboard-list':\n '<rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"/><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\"/><path d=\"M12 11h4\"/><path d=\"M12 16h4\"/><path d=\"M8 11h.01\"/><path d=\"M8 16h.01\"/>',\n 'credit-card':\n '<rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\"/><line x1=\"2\" x2=\"22\" y1=\"10\" y2=\"10\"/>',\n 'external-link':\n '<path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>',\n 'languages':\n '<path d=\"m5 8 6 6\"/><path d=\"m4 14 6-6 2-3\"/><path d=\"M2 5h12\"/><path d=\"M7 2h1\"/><path d=\"m22 22-5-10-5 10\"/><path d=\"M14 18h6\"/>',\n 'megaphone':\n '<path d=\"m3 11 18-5v12L3 14v-3z\"/><path d=\"M11.6 16.8a3 3 0 1 1-5.8-1.6\"/>',\n 'monitor':\n '<rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/>',\n 'store':\n '<path d=\"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7\"/><path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\"/><path d=\"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4\"/><path d=\"M2 7h20\"/><path d=\"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7\"/>',\n 'user-round':\n '<circle cx=\"12\" cy=\"8\" r=\"5\"/><path d=\"M20 21a8 8 0 0 0-16 0\"/>',\n home: '<path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><polyline points=\"9 22 9 12 15 12 15 22\"/>',\n 'user-plus':\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><line x1=\"19\" x2=\"19\" y1=\"8\" y2=\"14\"/><line x1=\"22\" x2=\"16\" y1=\"11\" y2=\"11\"/>',\n 'user-check':\n '<path d=\"m16 11 2 2 4-4\"/><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/>',\n hand: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-hand-icon lucide-hand\"><path d=\"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\"/><path d=\"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\"/><path d=\"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\"/><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"/></svg>',\n users:\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/>',\n // Couriers. The back-office and the courier-facing screens both name a rider, and every Belvigo\n // surface that does should draw the same one.\n bike: '<circle cx=\"18.5\" cy=\"17.5\" r=\"3.5\"/><circle cx=\"5.5\" cy=\"17.5\" r=\"3.5\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><path d=\"M12 17.5V14l-3-3 4-3 2 3h2\"/>',\n 'building-2':\n '<path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\"/><path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\"/><path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\"/><path d=\"M10 6h4\"/><path d=\"M10 10h4\"/><path d=\"M10 14h4\"/><path d=\"M10 18h4\"/>',\n package:\n '<path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\"/><path d=\"M12 22V12\"/><polyline points=\"3.29 7 12 12 20.71 7\"/><path d=\"m7.5 4.27 9 5.15\"/>',\n 'package-plus':\n '<path d=\"M16 16h6\"/><path d=\"M19 13v6\"/><path d=\"M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0\"/><path d=\"m7.5 4.27 9 5.15\"/><polyline points=\"3.29 7 12 12 20.71 7\"/><path d=\"M12 22V12\"/>',\n 'package-open':\n '<path d=\"M12 22v-9\"/><path d=\"M15.17 2.21a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.655 1.655 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z\"/><path d=\"M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13\"/><path d=\"M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36z\"/>',\n 'rotate-ccw':\n '<path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/><path d=\"M3 3v5h5\"/>',\n 'bar-chart-3':\n '<path d=\"M3 3v18h18\"/><path d=\"M18 17V9\"/><path d=\"M13 17V5\"/><path d=\"M8 17v-3\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n 'log-out':\n '<path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\"/>',\n 'panel-left-close':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/><path d=\"m16 15-3-3 3-3\"/>',\n 'panel-left-open':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/><path d=\"m14 9 3 3-3 3\"/>',\n 'panel-left':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M9 3v18\"/>',\n calendar:\n '<path d=\"M8 2v4\"/><path d=\"M16 2v4\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"/><path d=\"M3 10h18\"/>',\n 'chevron-right': '<path d=\"m9 18 6-6-6-6\"/>',\n 'chevron-left': '<path d=\"m15 18-6-6 6-6\"/>',\n 'chevron-down': '<path d=\"m6 9 6 6 6-6\"/>',\n // Stepper glyphs for sds-input-number: chevrons for the stacked spinner, plus/minus for the\n // horizontal/vertical layouts.\n 'chevron-up': '<path d=\"m18 15-6-6-6 6\"/>',\n plus: '<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n 'chevrons-left': '<path d=\"m11 17-5-5 5-5\"/><path d=\"m18 17-5-5 5-5\"/>',\n 'chevrons-right': '<path d=\"m6 17 5-5-5-5\"/><path d=\"m13 17 5-5-5-5\"/>',\n x: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n check: '<path d=\"M20 6 9 17l-5-5\"/>',\n 'alert-circle':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/>',\n copy: '<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>',\n type: '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\"/><line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\"/>',\n tag: '<path d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/>',\n ticket:\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\"/><path d=\"M13 5v2\"/><path d=\"M13 17v2\"/><path d=\"M13 11v2\"/>',\n square: '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>',\n 'square-check': '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"m9 12 2 2 4-4\"/>',\n 'circle-dot': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/>',\n 'circle-user':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662\"/>',\n 'layout-grid':\n '<rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/>',\n 'panels-top-left':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M9 21V9\"/>',\n 'panel-top': '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/>',\n 'rows-3':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/>',\n 'book-open':\n '<path d=\"M12 7v14\"/><path d=\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/>',\n palette:\n '<circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/><circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\"/><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z\"/>',\n bell: '<path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\"/><path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\"/>',\n phone:\n '<path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"/>',\n settings:\n '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n 'align-left': '<path d=\"M15 12H3\"/><path d=\"M17 18H3\"/><path d=\"M21 6H3\"/>',\n 'toggle-left':\n '<rect width=\"20\" height=\"12\" x=\"2\" y=\"6\" rx=\"6\" ry=\"6\"/><circle cx=\"8\" cy=\"12\" r=\"2\"/>',\n 'arrow-up': '<path d=\"m5 12 7-7 7 7\"/><path d=\"M12 19V5\"/>',\n 'arrow-down': '<path d=\"M12 5v14\"/><path d=\"m19 12-7 7-7-7\"/>',\n 'chevrons-up-down': '<path d=\"m7 15 5 5 5-5\"/><path d=\"m7 9 5-5 5 5\"/>',\n filter: '<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>',\n table:\n '<path d=\"M12 3v18\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/>',\n // Contactless ordering: every restaurant table gets its own QR code (Belvigo merchant nav).\n 'qr-code':\n '<rect width=\"5\" height=\"5\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"5\" height=\"5\" x=\"16\" y=\"3\" rx=\"1\"/><rect width=\"5\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\"/><path d=\"M21 16h-3a2 2 0 0 0-2 2v3\"/><path d=\"M21 21v.01\"/><path d=\"M12 7v3a2 2 0 0 1-2 2H7\"/><path d=\"M3 12h.01\"/><path d=\"M12 3h.01\"/><path d=\"M12 16v.01\"/><path d=\"M16 12h1\"/><path d=\"M21 12v.01\"/><path d=\"M12 21v-1\"/>',\n eye: '<path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n // Pairs with `eye` for password reveal. Without it a show/hide toggle has no second state to draw,\n // and aria-pressed alone leaves sighted users with no visible change.\n 'eye-off':\n '<path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><path d=\"m2 2 20 20\"/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"/>',\n user: '<path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>',\n 'check-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/>',\n 'arrows-clockwise':\n '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/>',\n menu: '<line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\"/><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/><line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\"/>',\n 'file-text':\n '<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/><path d=\"M10 9H8\"/><path d=\"M16 13H8\"/><path d=\"M16 17H8\"/>',\n hash: '<line x1=\"4\" x2=\"20\" y1=\"9\" y2=\"9\"/><line x1=\"4\" x2=\"20\" y1=\"15\" y2=\"15\"/><line x1=\"10\" x2=\"8\" y1=\"3\" y2=\"21\"/><line x1=\"16\" x2=\"14\" y1=\"3\" y2=\"21\"/>',\n 'map-pin':\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\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/>',\n inbox:\n '<polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\"/><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 'arrow-right': '<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>',\n 'refresh-cw':\n '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/>',\n 'loader-circle': '<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>',\n bug: '<path d=\"M12 20v-9\"/><path d=\"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\"/><path d=\"M14.12 3.88 16 2\"/><path d=\"M21 21a4 4 0 0 0-3.81-4\"/><path d=\"M21 5a4 4 0 0 1-3.55 3.97\"/><path d=\"M22 13h-4\"/><path d=\"M3 21a4 4 0 0 1 3.81-4\"/><path d=\"M3 5a4 4 0 0 0 3.55 3.97\"/><path d=\"M6 13H2\"/><path d=\"m8 2 1.88 1.88\"/><path d=\"M9 7.13V6a3 3 0 1 1 6 0v1.13\"/>',\n 'scroll-text':\n '<path d=\"M15 12h-5\"/><path d=\"M15 8h-5\"/><path d=\"M19 17V5a2 2 0 0 0-2-2H4\"/><path d=\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"/>',\n // Added for the dark/light switcher (sds-theme-toggle) and the command palette (sds-search-command).\n moon: '<path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/>',\n 'search-x':\n '<path d=\"m13.5 8.5-5 5\"/><path d=\"m8.5 8.5 5 5\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n command:\n '<path d=\"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3\"/>',\n sparkles:\n '<path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\"/><path d=\"M20 3v4\"/><path d=\"M22 5h-4\"/><path d=\"M4 17v2\"/><path d=\"M5 18H3\"/>',\n // Added for 0.0.53 (Lucide 24x24 stroke paths): status glyphs for sds-checklist-row / sds-score /\n // sds-status-tile (distinct SHAPES per status, so status never rides on colour), the sds-menu trigger\n // ellipses, the sds-sortable-list grip, sds-file-drop / sds-image-cropper glyphs, and common row actions.\n 'triangle-alert':\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\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/>',\n 'octagon-x':\n '<path d=\"m15 9-6 6\"/><path d=\"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 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-.586z\"/><path d=\"m9 9 6 6\"/>',\n 'ban':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m4.9 4.9 14.2 14.2\"/>',\n 'ellipsis':\n '<circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/>',\n 'ellipsis-vertical':\n '<circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"5\" r=\"1\"/><circle cx=\"12\" cy=\"19\" r=\"1\"/>',\n 'grip-vertical':\n '<circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/>',\n 'upload':\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\"/>',\n 'image':\n '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/>',\n 'zoom-in':\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\"/><line x1=\"11\" x2=\"11\" y1=\"8\" y2=\"14\"/><line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\"/>',\n 'zoom-out':\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" x2=\"16.65\" y1=\"21\" y2=\"16.65\"/><line x1=\"8\" x2=\"14\" y1=\"11\" y2=\"11\"/>',\n 'trash-2':\n '<path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\"/><line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\"/>',\n 'clock':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/>',\n 'pencil':\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\"/><path d=\"m15 5 4 4\"/>',\n // A question mark in a circle: the \"may contain\" mark on sds-tri-state-chip, and a generic help glyph.\n 'circle-help':\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><path d=\"M12 17h.01\"/>',\n // Stock / inventory (the kitchen stock board, the sold-out toolkit). Original glyph: three stacked boxes.\n stock:\n '<rect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\"/><rect x=\"8\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M6 13v2.5h2V13\"/><path d=\"M16 13v2.5h2V13\"/><path d=\"M11 3v2.5h2V3\"/>',\n // The 14 EU allergens of Regulation (EU) 1169/2011 Annex II, in Annex order. Original Belvigo drawings\n // (Lucide has none), same grammar as the rest of the set: 24x24, stroke only, 2px, round caps/joins.\n // Names mirror the API enum (CEREALS_GLUTEN -> allergen-cereals-gluten); sds-allergen-icon maps them.\n 'allergen-cereals-gluten':\n '<path d=\"M12 22V8\"/><path d=\"M12 8c-1.6-1.6-1.6-4.2 0-6 1.6 1.8 1.6 4.4 0 6z\"/><path d=\"M12 13c-2.6 0-4.6-1.6-5.2-4.2 2.6 0 4.6 1.6 5.2 4.2z\"/><path d=\"M12 13c2.6 0 4.6-1.6 5.2-4.2-2.6 0-4.6 1.6-5.2 4.2z\"/><path d=\"M12 18c-2.6 0-4.6-1.6-5.2-4.2 2.6 0 4.6 1.6 5.2 4.2z\"/><path d=\"M12 18c2.6 0 4.6-1.6 5.2-4.2-2.6 0-4.6 1.6-5.2 4.2z\"/>',\n 'allergen-crustaceans':\n '<ellipse cx=\"12\" cy=\"15\" rx=\"6\" ry=\"4\"/><path d=\"M3.5 4a2.5 2.5 0 1 0 5 0\"/><path d=\"M15.5 4a2.5 2.5 0 1 0 5 0\"/><path d=\"M6 6.5 8.5 11.8\"/><path d=\"M18 6.5 15.5 11.8\"/><path d=\"M6 15H3\"/><path d=\"M18 15h3\"/><path d=\"M7.3 17.5 4.5 20\"/><path d=\"M16.7 17.5 19.5 20\"/><path d=\"M10.5 11.2V9.5\"/><path d=\"M13.5 11.2V9.5\"/>',\n 'allergen-eggs':\n '<path d=\"M12 2.5c-3.6 0-6.5 5.5-6.5 10.5a6.5 6.5 0 0 0 13 0c0-5-2.9-10.5-6.5-10.5z\"/><path d=\"M9 13.5a3 3 0 0 0 2.5 3\"/>',\n 'allergen-fish':\n '<path d=\"M2.5 12c2-3.5 5-5.5 8.5-5.5 3 0 5.5 2 7 5.5-1.5 3.5-4 5.5-7 5.5-3.5 0-6.5-2-8.5-5.5z\"/><path d=\"M18 12l3.5-3.5v7z\"/><path d=\"M10 9a4.5 4.5 0 0 1 0 6\"/><path d=\"M6.5 11h.01\"/>',\n 'allergen-peanuts':\n '<path d=\"M8.8 12a5 5 0 1 1 6.4 0 5 5 0 1 1-6.4 0z\"/><path d=\"M10.5 6.5h.01\"/><path d=\"M13.5 8.5h.01\"/><path d=\"M10.5 15.5h.01\"/><path d=\"M13.5 17.5h.01\"/>',\n 'allergen-soybeans':\n '<path d=\"M15.88 3.88 3.88 15.88a3 3 0 0 0 4.24 4.24L20.12 8.12a3 3 0 0 0-4.24-4.24z\"/><circle cx=\"8.5\" cy=\"15.5\" r=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1.5\"/><path d=\"M20.5 3.5 22 2\"/>',\n 'allergen-milk':\n '<path d=\"M6 10v10.5A1.5 1.5 0 0 0 7.5 22h9a1.5 1.5 0 0 0 1.5-1.5V10\"/><path d=\"M6 10l3-5h6l3 5z\"/><path d=\"M9 5V2.5h6V5\"/><path d=\"M12 13.5c-1 1.3-1.5 2.1-1.5 2.8a1.5 1.5 0 0 0 3 0c0-.7-.5-1.5-1.5-2.8z\"/>',\n 'allergen-nuts':\n '<path d=\"M5 9.5C5 6.5 8 4 12 4s7 2.5 7 5.5z\"/><path d=\"M6.5 9.5v1.5c0 4.5 2.5 8.5 5.5 10 3-1.5 5.5-5.5 5.5-10V9.5\"/><path d=\"M12 4c0-1 .5-1.7 1.5-2\"/>',\n 'allergen-celery':\n '<path d=\"M7 22c-.8-4-.5-8.5 1-12.5h8c1.5 4 1.8 8.5 1 12.5z\"/><path d=\"M10.5 22c-.3-4-.2-8.5.5-12.5\"/><path d=\"M13.5 22c.3-4 .2-8.5-.5-12.5\"/><path d=\"M9.5 9.5 7.5 6.5\"/><path d=\"M12 9.5V5\"/><path d=\"M14.5 9.5l2-3\"/><circle cx=\"6.5\" cy=\"5\" r=\"1.5\"/><circle cx=\"12\" cy=\"3.5\" r=\"1.5\"/><circle cx=\"17.5\" cy=\"5\" r=\"1.5\"/>',\n 'allergen-mustard':\n '<rect x=\"5\" y=\"7\" width=\"14\" height=\"3\" rx=\"1\"/><path d=\"M6 10v8.5A3.5 3.5 0 0 0 9.5 22h5a3.5 3.5 0 0 0 3.5-3.5V10\"/><path d=\"M13.5 7l3-4.5\"/><rect x=\"9\" y=\"13\" width=\"6\" height=\"5\" rx=\"1\"/>',\n 'allergen-sesame':\n '<path d=\"M7 3c1.2 1.2 1.8 2.5 1.8 3.5a1.8 1.8 0 0 1-3.6 0C5.2 5.5 5.8 4.2 7 3z\" transform=\"rotate(-25 7 6)\"/><path d=\"M16.5 3.5c1.2 1.2 1.8 2.5 1.8 3.5a1.8 1.8 0 0 1-3.6 0c0-1 .6-2.3 1.8-3.5z\" transform=\"rotate(30 16.5 6.5)\"/><path d=\"M8.5 13c1.2 1.2 1.8 2.5 1.8 3.5a1.8 1.8 0 0 1-3.6 0c0-1 .6-2.3 1.8-3.5z\" transform=\"rotate(15 8.5 16)\"/><path d=\"M17 12c1.2 1.2 1.8 2.5 1.8 3.5a1.8 1.8 0 0 1-3.6 0c0-1 .6-2.3 1.8-3.5z\" transform=\"rotate(-20 17 15)\"/>',\n 'allergen-sulphites':\n '<path d=\"M7.5 3h9c.3 1.5.5 3 .5 4.5a5 5 0 0 1-10 0c0-1.5.2-3 .5-4.5z\"/><path d=\"M12 12.5V21\"/><path d=\"M8.5 21h7\"/><path d=\"M7.2 7h9.6\"/>',\n 'allergen-lupin':\n '<path d=\"M12 2.5a1.7 1.7 0 0 1 1.2 3 1.8 1.8 0 0 1 .8 3 1.9 1.9 0 0 1 .8 3 2 2 0 0 1-.3 2.8H9.5a2 2 0 0 1-.3-2.8 1.9 1.9 0 0 1 .8-3 1.8 1.8 0 0 1 .8-3 1.7 1.7 0 0 1 1.2-3z\"/><path d=\"M10.8 8.5h2.4\"/><path d=\"M10.2 11.5h3.6\"/><path d=\"M12 14.3V22\"/><path d=\"M12 19.5 7 17.5\"/><path d=\"M12 19.5 8.5 16\"/><path d=\"M12 19.5l5-2\"/><path d=\"M12 19.5l3.5-3.5\"/>',\n 'allergen-molluscs':\n '<path d=\"M12 19 4.5 11a7.5 7.5 0 0 1 15 0z\"/><path d=\"M12 19V3.5\"/><path d=\"M12 19 7.2 5.2\"/><path d=\"M12 19l4.8-13.8\"/><path d=\"M9.5 22 12 19l2.5 3z\"/>',\n} as const;\n\nexport type SdsIconName = keyof typeof SDS_ICONS;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { SDS_ICONS, SdsIconName } from './icon-registry';\n\nexport type SdsIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\nconst SIZE_PX: Record<SdsIconSize, number> = { sm: 16, md: 20, lg: 24, xl: 32 };\n\n/** Accept a pixel number, a numeric string (\"18\"), or a size keyword (\"sm\"). */\nfunction toIconPx(value: number | string): number {\n if (typeof value === 'number') return value;\n const n = Number(value);\n return Number.isNaN(n) ? (SIZE_PX[value as SdsIconSize] ?? 20) : n;\n}\n\n/**\n * Inline SVG icon backed by a curated, dependency-free registry.\n *\n * @example\n * <sds-icon name=\"search\" />\n * <sds-icon name=\"home\" [size]=\"18\" />\n */\n@Component({\n selector: 'sds-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '',\n host: {\n class: 'sds-icon inline-flex shrink-0 items-center justify-center',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n '[innerHTML]': 'svg()',\n '[attr.aria-hidden]': '\"true\"',\n },\n})\nexport class SdsIcon {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Icon identifier from the registry. */\n readonly name = input.required<SdsIconName>();\n /** Square size: a pixel number, a numeric string, or a keyword (sm·md·lg·xl). */\n readonly size = input(20, { transform: toIconPx });\n /** Stroke width of the line icon. */\n readonly strokeWidth = input<number>(2);\n\n protected readonly svg = computed<SafeHtml>(() => {\n const inner = SDS_ICONS[this.name()] ?? '';\n const markup =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" ` +\n `width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"currentColor\" ` +\n `stroke-width=\"${this.strokeWidth()}\" stroke-linecap=\"round\" ` +\n `stroke-linejoin=\"round\">${inner}</svg>`;\n return this.sanitizer.bypassSecurityTrustHtml(markup);\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n isDevMode,\n} from '@angular/core';\n\nexport type SdsButtonVariant =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'ghost'\n | 'danger';\nexport type SdsButtonSize = 'sm' | 'md' | 'lg';\nexport type SdsButtonShape = 'control' | 'pill';\n\nconst BASE =\n 'inline-flex items-center justify-center gap-2 font-medium ' +\n 'transition-colors duration-150 select-none whitespace-nowrap cursor-pointer ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-surface focus-visible:ring-brand-500 ' +\n 'disabled:opacity-50 disabled:pointer-events-none';\n\n/**\n * Dark mode has its own fills. A monochrome brand's dark 600 step is a mid-dark grey: as a primary fill\n * it read as disabled, and at `disabled:opacity-50` the real disabled state looked the same. So the dark\n * primary is the inverted light fill (`ink` on `surface`); tertiary and ghost swap their black/brand-50\n * tints for white ones, which show on a dark surface.\n */\nconst VARIANTS: Record<SdsButtonVariant, string> = {\n primary:\n 'bg-brand-600 text-white shadow-sm hover:bg-brand-700 active:bg-brand-800 ' +\n 'dark:bg-ink dark:text-surface dark:hover:bg-ink/90 dark:active:bg-ink/80',\n secondary:\n 'bg-surface text-ink border border-border shadow-sm hover:bg-muted active:bg-brand-50',\n tertiary:\n 'bg-brand-50 text-brand-700 hover:bg-brand-100 active:bg-brand-200/70 ' +\n 'dark:bg-white/10 dark:text-ink dark:hover:bg-white/15 dark:active:bg-white/20',\n ghost:\n 'bg-transparent text-ink-soft hover:bg-black/5 active:bg-black/10 ' +\n 'dark:hover:bg-white/10 dark:active:bg-white/15',\n danger: 'bg-danger text-white shadow-sm hover:brightness-95 active:brightness-90',\n};\n\nconst SIZES: Record<SdsButtonSize, string> = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-5 text-base',\n};\n\nconst ICON_ONLY: Record<SdsButtonSize, string> = {\n sm: 'w-8 px-0',\n md: 'w-10 px-0',\n lg: 'w-12 px-0',\n};\n\n/**\n * Brand button. Project an <sds-icon sdsIconLeading/> or <sds-icon sdsIconTrailing/>\n * for icons, or set [iconOnly]=\"true\" for a square icon button.\n *\n * @example\n * <sds-button variant=\"primary\" (click)=\"save()\">Enregistrer</sds-button>\n */\n@Component({\n selector: 'sds-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n '[attr.aria-disabled]': '(disabled() || loading()) ? \"true\" : null',\n '[style.pointer-events]': '(disabled() || loading()) ? \"none\" : null',\n '(click)': 'onHostClick($event)',\n },\n template: `\n <button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [class]=\"classes()\"\n >\n @if (loading()) {\n <span class=\"sds-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content select=\"[sdsIconLeading]\" />\n }\n <ng-content />\n <ng-content select=\"[sdsIconTrailing]\" />\n </button>\n `,\n styles: `\n .sds-spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-right-color: transparent;\n border-radius: 9999px;\n animation: sds-spin 0.6s linear infinite;\n }\n @keyframes sds-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `,\n})\nexport class SdsButton {\n readonly variant = input<SdsButtonVariant>('primary');\n readonly size = input<SdsButtonSize>('md');\n\n /**\n * `pill` fully rounds the button. It is the shape a consumer-facing surface tends to want for its\n * primary action, and the same axis {@link SdsInput} exposes — a design system with pill inputs and\n * no pill buttons would force any app that wants one back onto hand-rolled classes for its single\n * most important control.\n */\n readonly shape = input<SdsButtonShape>('control');\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n /** Full-width button. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Square icon-only button (provide [ariaLabel] for accessibility). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n\n constructor() {\n // Dev-only guard: icon-only buttons need an explicit accessible name\n // (the projected icon is aria-hidden, so there is no other source).\n if (isDevMode()) {\n effect(() => {\n if (this.iconOnly() && !this.ariaLabel()) {\n console.warn(\n 'sds-button: icon-only buttons require [ariaLabel] for an accessible name.',\n );\n }\n });\n }\n }\n\n /** Block the documented host-bound (click)/routerLink when inert. */\n protected onHostClick(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n }\n\n protected readonly hostClass = computed(() =>\n this.block() ? 'flex w-full' : 'inline-flex',\n );\n\n protected readonly classes = computed(() => {\n const size = this.size();\n return [\n BASE,\n this.shape() === 'pill' ? 'rounded-full' : 'rounded-control',\n VARIANTS[this.variant()],\n SIZES[size],\n this.iconOnly() ? ICON_ONLY[size] : '',\n this.block() ? 'w-full' : '',\n ]\n .filter(Boolean)\n .join(' ');\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsInputSize = 'sm' | 'md' | 'lg';\nexport type SdsInputAppearance = 'default' | 'filled' | 'on-brand';\nexport type SdsInputShape = 'control' | 'pill';\nexport type SdsInputType =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'search'\n | 'url';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsInputSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\n/**\n * Text input with label, hint/error, optional leading/trailing icons and a\n * clear button. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)]. The `on-brand` appearance is tuned for dark surfaces (e.g. the\n * sidebar search field).\n */\n@Component({\n selector: 'sds-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n styles: `\n /*\n * Chrome paints an opaque autofill background on the INPUT element. This input is deliberately\n * bg-transparent inside a themed wrapper that owns the field's background, border and radius — so\n * the autofill paint lands as a square block sitting inside the field's rounded, coloured box,\n * and on a filled or on-brand field it is a differently-coloured block at that.\n *\n * The long transition delay is the standard way to suppress it: the UA sets the background\n * through an internal rule no stylesheet can override, but it is still a transition-able\n * property, so deferring the transition indefinitely means it is never painted. The field stays\n * autofilled and the password manager still works — only the paint is suppressed.\n *\n * -webkit-text-fill-color keeps the VALUE readable, since the UA also forces a text colour to\n * match the background it just painted.\n */\n input:-webkit-autofill,\n input:-webkit-autofill:hover,\n input:-webkit-autofill:focus,\n input:-webkit-autofill:active {\n transition: background-color 100000s ease-in-out 0s;\n -webkit-text-fill-color: currentColor;\n caret-color: currentColor;\n }\n `,\n template: `\n @if (label()) {\n <label\n [for]=\"inputId\"\n class=\"mb-1.5 block text-sm font-medium\"\n [class]=\"onBrand() ? 'text-white/90' : 'text-ink'\"\n >\n {{ label() }}\n </label>\n }\n\n <div\n class=\"relative flex items-center border transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n @if (leadingIcon()) {\n <!-- A pill needs its icon further in: on a fully-rounded field an icon at left-3 sits over\n the curve rather than inside the field. -->\n <sds-icon\n [name]=\"leadingIcon()!\"\n [size]=\"18\"\n class=\"pointer-events-none absolute opacity-70\"\n [class]=\"pill() ? 'left-4' : 'left-3'\"\n />\n }\n\n <input\n [id]=\"inputId\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"value()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.maxlength]=\"maxLength() || null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n class=\"w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed\n [&::-webkit-search-cancel-button]:appearance-none\n [&::-webkit-search-decoration]:appearance-none\"\n [class]=\"fieldPadding()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n\n @if (clearable() && value() && !isDisabled()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-2.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:opacity-100 hover:bg-black/5\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n } @else if (trailingAction()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"trailingActionLabel() || null\"\n [attr.aria-pressed]=\"trailingActionPressed()\"\n [attr.aria-controls]=\"inputId\"\n class=\"absolute right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full\n opacity-70 hover:opacity-100 hover:bg-black/5\"\n (click)=\"trailingActionClick.emit()\"\n >\n <sds-icon [name]=\"trailingAction()!\" [size]=\"18\" />\n </button>\n } @else if (trailingIcon()) {\n <sds-icon\n [name]=\"trailingIcon()!\"\n [size]=\"18\"\n class=\"pointer-events-none absolute right-3 opacity-70\"\n />\n }\n </div>\n\n @if (error()) {\n <p [id]=\"inputId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p\n [id]=\"inputId + '-hint'\"\n class=\"mt-1.5 text-xs\"\n [class]=\"onBrand() ? 'text-white/60' : 'text-ink-faint'\"\n >\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsInput implements ControlValueAccessor {\n readonly inputId = `sds-input-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n /**\n * `search` is the semantically right type for a search field, and the template strips the WebKit\n * search decorations that come with it. Without that, a `search` field with {@link clearable} draws\n * TWO clear buttons — the component's and the browser's own, which no stylesheet can reach and which\n * sits outside the field's own padding.\n */\n readonly type = input<SdsInputType>('text');\n readonly size = input<SdsInputSize>('md');\n /**\n * `filled` is a borderless field on a muted ground, for a search box that has to sit inside a page\n * rather than announce itself as a form control — a storefront's search pill above all.\n * `on-brand` is the same field tuned for a dark surface.\n */\n readonly appearance = input<SdsInputAppearance>('default');\n\n /**\n * `pill` fully rounds the field. Separate from {@link appearance} on purpose: a bordered pill and a\n * filled box are both real designs, and folding the two axes into one enum would forbid half of them.\n */\n readonly shape = input<SdsInputShape>('control');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n\n /**\n * The native `autocomplete` token (`name`, `tel`, `email`, `new-password`, `one-time-code`…). Empty\n * leaves the browser's default. Checkout and sign-up fields need it: browsers autofill from it, and\n * password managers only offer a generated password for `new-password`.\n */\n readonly autocomplete = input<string>('');\n\n /** Hard character cap on the native field; 0 means no limit. */\n readonly maxLength = input(0, { transform: numberAttribute });\n\n /**\n * Accessible name for the clear button. French default so existing consumers are unchanged, but an\n * app serving more than one language MUST translate it — it is an icon-only control, so this string\n * is its only name.\n */\n readonly clearLabel = input<string>('Effacer');\n readonly leadingIcon = input<SdsIconName | null>(null);\n readonly trailingIcon = input<SdsIconName | null>(null);\n\n /**\n * A CLICKABLE trailing icon, for the affordances that belong to the field itself — password reveal\n * above all. Distinct from {@link trailingIcon}, which is decorative and explicitly\n * `pointer-events-none`; a consumer who needed a working control previously had to abandon\n * `sds-input` and rebuild the whole field, losing the label/error/aria wiring with it.\n *\n * Always pair it with {@link trailingActionLabel} — an icon-only button with no accessible name is\n * unusable by a screen reader. For a toggle, also bind {@link trailingActionPressed}.\n */\n readonly trailingAction = input<SdsIconName | null>(null);\n\n /** Accessible name for {@link trailingAction}. Translate it in the consuming app. */\n readonly trailingActionLabel = input<string>('');\n\n /** `aria-pressed` for a toggling action (e.g. show/hide password). Null renders no attribute. */\n readonly trailingActionPressed = input<boolean | null>(null);\n\n readonly trailingActionClick = output<void>();\n\n /** Current value (driven by CVA + user input). */\n protected readonly value = signal('');\n private readonly cvaDisabled = signal(false);\n\n protected readonly onBrand = computed(() => this.appearance() === 'on-brand');\n protected readonly filled = computed(() => this.appearance() === 'filled');\n protected readonly pill = computed(() => this.shape() === 'pill');\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.inputId}-err`;\n if (this.hint()) return `${this.inputId}-hint`;\n return null;\n });\n\n protected readonly fieldPadding = computed(() => {\n const inset = this.pill() ? 'pl-11' : 'pl-10';\n const bare = this.pill() ? 'pl-5' : 'pl-3.5';\n const left = this.leadingIcon() ? inset : bare;\n const right =\n this.trailingIcon() || this.clearable() || this.trailingAction()\n ? 'pr-10'\n : this.pill()\n ? 'pr-5'\n : 'pr-3.5';\n return `${left} ${right}`;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()], this.pill() ? 'rounded-full' : 'rounded-control'];\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n if (this.filled()) {\n // border-transparent, not border-0: the border box is what keeps a filled field the same height\n // as a bordered one, so the two sit level when a toolbar mixes them.\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n } else if (this.onBrand()) {\n parts.push('bg-white/10 text-white');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'border-white/15 focus-within:border-white/40 focus-within:ring-2 focus-within:ring-white/20',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n }\n return parts.join(' ');\n });\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).value;\n this.value.set(next);\n this.onChange(next);\n }\n\n protected clear(): void {\n this.value.set('');\n this.onChange('');\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsInputNumberSize = 'sm' | 'md' | 'lg';\nexport type SdsInputNumberAppearance = 'default' | 'filled';\n\n/**\n * Formatting behaviour, backed by `Intl.NumberFormat`:\n * - `decimal` — a plain grouped number (`42 723`).\n * - `currency` — a monetary amount; pair with {@link SdsInputNumber.currency} (ISO 4217).\n *\n * For percentages, units or any other affix, use {@link SdsInputNumber.prefix} /\n * {@link SdsInputNumber.suffix} on top of `decimal` — the stored value then stays the plain magnitude.\n */\nexport type SdsInputNumberMode = 'decimal' | 'currency';\n\n/** How the currency is shown in `currency` mode — a symbol (€), the ISO code (EUR) or the name (euros). */\nexport type SdsInputNumberCurrencyDisplay = 'symbol' | 'code' | 'name';\n\n/**\n * Placement of the increment/decrement spinner buttons:\n * - `stacked` — a two-button column at the trailing edge (chevrons).\n * - `horizontal` — a minus button before and a plus button after the field.\n * - `vertical` — a plus button above and a minus button below the field.\n */\nexport type SdsInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical';\n\nlet nextId = 0;\n\nconst HEIGHTS: Record<SdsInputNumberSize, string> = {\n sm: 'h-9',\n md: 'h-10',\n lg: 'h-12',\n};\n\nconst TEXT: Record<SdsInputNumberSize, string> = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n};\n\n/** The numeric fragments pulled out of a partially-typed, formatted string. */\ninterface Parsed {\n negative: boolean;\n intDigits: string;\n fracDigits: string;\n /** The user has typed the decimal separator (even if no fraction digits follow yet). */\n hadDecimal: boolean;\n}\n\n/**\n * Numeric input with locale-aware formatting, optional currency, prefix/suffix affixes, min/max/step\n * boundaries and spinner buttons — the design-system counterpart of PrimeNG's `InputNumber`.\n *\n * The value is a `number | null` bound through ControlValueAccessor, so it works with reactive forms\n * or `[(ngModel)]`: `<sds-input-number [(ngModel)]=\"amount\" mode=\"currency\" currency=\"EUR\" />`.\n *\n * The field formats **live as you type**: the currency symbol, grouping separators and prefix/suffix\n * stay visible on every keystroke, and the caret is kept where it belongs. The value is clamped to\n * {@link min}/{@link max} on blur and on every spinner step; ArrowUp / ArrowDown also step it.\n */\n@Component({\n selector: 'sds-input-number',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsInputNumber),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"inputId\" class=\"mb-1.5 block text-sm font-medium text-ink\">{{ label() }}</label>\n }\n\n <div class=\"relative border transition-colors\" [class]=\"wrapperClasses()\">\n <!-- Horizontal: minus before the field. Vertical: plus above it. -->\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"border-r\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"16\" />\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"w-full border-b\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"16\" />\n </button>\n }\n\n <div class=\"relative flex min-w-0 flex-1 items-center\" [class]=\"fieldCellClasses()\">\n <input\n #field\n [id]=\"inputId\"\n type=\"text\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n class=\"w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n [class]=\"inputClasses()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n @if (clearVisible()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:bg-black/5 hover:opacity-100\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n </div>\n\n <!-- Horizontal: plus after the field. Vertical: minus below it. -->\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"border-l\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"16\" />\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"w-full border-t\"\n [class]=\"edgeButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"16\" />\n </button>\n }\n\n <!-- Stacked: a chevron column at the trailing edge. -->\n @if (showButtons() && buttonLayout() === 'stacked') {\n <div class=\"flex w-9 shrink-0 flex-col divide-y divide-border border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement()\"\n class=\"min-h-0 flex-1\"\n [class]=\"stackedButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(1)\"\n >\n <sds-icon [name]=\"incrementIconName()\" [size]=\"14\" />\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement()\"\n class=\"min-h-0 flex-1\"\n [class]=\"stackedButtonClasses()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"spin(-1)\"\n >\n <sds-icon [name]=\"decrementIconName()\" [size]=\"14\" />\n </button>\n </div>\n }\n </div>\n\n @if (error()) {\n <p [id]=\"inputId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n } @else if (hint()) {\n <p [id]=\"inputId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsInputNumber implements ControlValueAccessor {\n readonly inputId = `sds-input-number-${nextId++}`;\n\n private readonly fieldRef = viewChild<ElementRef<HTMLInputElement>>('field');\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n\n readonly size = input<SdsInputNumberSize>('md');\n /** `filled` is a borderless field on a muted ground; `default` is the bordered white field. */\n readonly appearance = input<SdsInputNumberAppearance>('default');\n\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Read-only: the value is shown and selectable but cannot be typed or stepped. */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n // --- Formatting -----------------------------------------------------------\n readonly mode = input<SdsInputNumberMode>('decimal');\n /** BCP 47 locale for grouping/decimal symbols (e.g. `fr-FR`). Empty follows the runtime locale. */\n readonly locale = input<string>('');\n /** ISO 4217 code, required when {@link mode} is `currency` (e.g. `EUR`, `USD`). */\n readonly currency = input<string>('');\n readonly currencyDisplay = input<SdsInputNumberCurrencyDisplay>('symbol');\n /** Thousands/grouping separators. */\n readonly useGrouping = input(true, { transform: booleanAttribute });\n readonly minFractionDigits = input<number | null>(null);\n readonly maxFractionDigits = input<number | null>(null);\n /** Text shown before the value (e.g. `↑ `). */\n readonly prefix = input<string>('');\n /** Text shown after the value (e.g. ` kg`, `%`). */\n readonly suffix = input<string>('');\n\n // --- Boundaries & spinner -------------------------------------------------\n readonly min = input<number | null>(null);\n readonly max = input<number | null>(null);\n readonly step = input(1, { transform: numberAttribute });\n /** Show the increment/decrement spinner buttons. */\n readonly showButtons = input(false, { transform: booleanAttribute });\n readonly buttonLayout = input<SdsInputNumberButtonLayout>('stacked');\n /** Override the increment button icon (defaults: chevron-up when stacked, plus otherwise). */\n readonly incrementIcon = input<SdsIconName | null>(null);\n /** Override the decrement button icon (defaults: chevron-down when stacked, minus otherwise). */\n readonly decrementIcon = input<SdsIconName | null>(null);\n /** Allow an empty (null) value. When false, blurring an empty field falls back to {@link min} or 0. */\n readonly allowEmpty = input(true, { transform: booleanAttribute });\n\n readonly clearable = input(false, { transform: booleanAttribute });\n /**\n * Accessible names for the icon-only controls. French defaults so existing consumers are unchanged;\n * translate them in a multi-language app.\n */\n readonly clearLabel = input<string>('Effacer');\n readonly incrementLabel = input<string>('Augmenter');\n readonly decrementLabel = input<string>('Diminuer');\n\n /** The committed numeric value (driven by CVA + user input). */\n protected readonly value = signal<number | null>(null);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.inputId}-err`;\n if (this.hint()) return `${this.inputId}-hint`;\n return null;\n });\n\n protected readonly clearVisible = computed(\n () => this.clearable() && this.value() !== null && !this.isDisabled() && !this.readonly(),\n );\n\n protected readonly incrementIconName = computed<SdsIconName>(\n () => this.incrementIcon() ?? (this.buttonLayout() === 'stacked' ? 'chevron-up' : 'plus'),\n );\n protected readonly decrementIconName = computed<SdsIconName>(\n () => this.decrementIcon() ?? (this.buttonLayout() === 'stacked' ? 'chevron-down' : 'minus'),\n );\n\n protected readonly canIncrement = computed(() => {\n if (this.isDisabled() || this.readonly()) return false;\n const max = this.max();\n return max === null || (this.value() ?? this.min() ?? 0) < max;\n });\n protected readonly canDecrement = computed(() => {\n if (this.isDisabled() || this.readonly()) return false;\n const min = this.min();\n return min === null || (this.value() ?? min ?? 0) > min;\n });\n\n /** Locale grouping/decimal separators, derived from Intl so parsing matches formatting. */\n private readonly separators = computed(() => {\n const sample = new Intl.NumberFormat(this.locale() || undefined, {\n useGrouping: true,\n }).formatToParts(1234567.8);\n return {\n group: sample.find((p) => p.type === 'group')?.value ?? ',',\n decimal: sample.find((p) => p.type === 'decimal')?.value ?? '.',\n };\n });\n\n /** Base Intl options (style/currency/grouping) without any fraction-digit constraints. */\n private baseOptions(): Intl.NumberFormatOptions {\n const opts: Intl.NumberFormatOptions = { useGrouping: this.useGrouping() };\n if (this.mode() === 'currency') {\n opts.style = 'currency';\n opts.currency = this.currency() || 'USD';\n opts.currencyDisplay = this.currencyDisplay();\n } else {\n opts.style = 'decimal';\n }\n return opts;\n }\n\n private readonly committedOptions = computed<Intl.NumberFormatOptions>(() => {\n const opts = this.baseOptions();\n const min = this.minFractionDigits();\n const max = this.maxFractionDigits();\n if (min !== null) opts.minimumFractionDigits = min;\n if (max !== null) opts.maximumFractionDigits = min !== null ? Math.max(max, min) : max;\n return opts;\n });\n\n /** The most fraction digits the field will keep — the resolved Intl maximum (2 for USD, 0 for JPY…). */\n private readonly maxFrac = computed(() => {\n const fallback = this.maxFractionDigits() ?? (this.mode() === 'currency' ? 2 : 3);\n try {\n const resolved = new Intl.NumberFormat(\n this.locale() || undefined,\n this.committedOptions(),\n ).resolvedOptions().maximumFractionDigits;\n return resolved ?? fallback;\n } catch {\n return fallback;\n }\n });\n\n protected readonly wrapperClasses = computed(() => {\n const vertical = this.buttonLayout() === 'vertical' && this.showButtons();\n const parts = [\n 'overflow-hidden rounded-control',\n vertical ? 'flex flex-col' : `flex items-stretch ${HEIGHTS[this.size()]}`,\n ];\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n if (this.appearance() === 'filled') {\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'\n : 'focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n }\n return parts.join(' ');\n });\n\n protected readonly fieldCellClasses = computed(() =>\n this.buttonLayout() === 'vertical' && this.showButtons() ? HEIGHTS[this.size()] : 'h-full',\n );\n\n protected readonly inputClasses = computed(() => {\n const parts = [TEXT[this.size()], 'pl-3.5', this.clearVisible() ? 'pr-9' : 'pr-3.5'];\n if (this.showButtons() && this.buttonLayout() !== 'stacked') parts.push('text-center');\n return parts.join(' ');\n });\n\n private readonly buttonBase =\n 'inline-flex shrink-0 items-center justify-center text-ink-soft transition-colors ' +\n 'hover:bg-muted hover:text-ink disabled:cursor-not-allowed disabled:opacity-40 select-none';\n\n protected readonly edgeButtonClasses = computed(() =>\n this.buttonLayout() === 'vertical'\n ? `${this.buttonBase} ${HEIGHTS[this.size()]} border-border`\n : `${this.buttonBase} w-10 border-border`,\n );\n protected readonly stackedButtonClasses = computed(() => this.buttonBase);\n\n constructor() {\n // Reflect the committed value into the field whenever it — or a formatting input — changes from\n // OUTSIDE typing (initial render, writeValue, a spin while blurred, a currency/locale switch).\n // While the field is the active element the input handler owns the DOM value and its caret, so this\n // stands down: gating on the live `document.activeElement` (not a signal) is immune to focus-event\n // timing, which is what makes live formatting safe.\n effect(() => {\n const el = this.fieldRef()?.nativeElement;\n const v = this.value();\n // Touch the formatting inputs so a currency/locale/affix change repaints a blurred field.\n this.committedOptions();\n this.prefix();\n this.suffix();\n if (!el || this.isActive(el)) return;\n el.value = v === null ? '' : this.format(v);\n });\n }\n\n /**\n * Focus the field, painting the current value into it first (the live-format effect stands down while\n * the field is focused, so a value written just before focusing would otherwise not show). With\n * `select`, the text is selected — handy for an in-cell editor.\n */\n focus(options: { select?: boolean } = {}): void {\n const el = this.fieldRef()?.nativeElement;\n if (!el) return;\n this.paintCommitted();\n el.focus();\n if (options.select) el.select();\n }\n\n private isActive(el: HTMLInputElement): boolean {\n return typeof document !== 'undefined' && document.activeElement === el;\n }\n\n /** Paint the committed value into the field imperatively (used by spin/clear/blur). */\n private paintCommitted(): void {\n const el = this.fieldRef()?.nativeElement;\n if (!el) return;\n const v = this.value();\n el.value = v === null ? '' : this.format(v);\n }\n\n // --- Formatting / parsing helpers -----------------------------------------\n /** Format a committed value with the configured min/max fraction digits (used at rest and on blur). */\n private format(n: number): string {\n try {\n const body = new Intl.NumberFormat(this.locale() || undefined, this.committedOptions()).format(n);\n return `${this.prefix()}${body}${this.suffix()}`;\n } catch {\n return `${this.prefix()}${n}${this.suffix()}`;\n }\n }\n\n /**\n * Format a partially-typed value, keeping exactly the fraction digits the user has entered (so\n * trailing zeros and a lone decimal separator survive) while still grouping the integer part and\n * showing the currency symbol / affixes.\n */\n private formatLive(p: Parsed): string {\n const locale = this.locale() || undefined;\n const fracCount = p.fracDigits.length;\n const num = this.toNumber(p) ?? 0;\n\n if (fracCount > 0 || !p.hadDecimal) {\n try {\n const body = new Intl.NumberFormat(locale, {\n ...this.baseOptions(),\n minimumFractionDigits: fracCount,\n maximumFractionDigits: fracCount,\n }).format(num);\n return `${this.prefix()}${body}${this.suffix()}`;\n } catch {\n return `${this.prefix()}${num}${this.suffix()}`;\n }\n }\n\n // A lone decimal separator was just typed (\"1234,\"): format the integer, then splice the separator\n // in right after the integer digits — which, for a trailing-symbol currency, is NOT the string end.\n const dec = this.separators().decimal;\n let out = '';\n let inserted = false;\n try {\n const parts = new Intl.NumberFormat(locale, {\n ...this.baseOptions(),\n maximumFractionDigits: 0,\n }).formatToParts(num);\n parts.forEach((part, i) => {\n out += part.value;\n const here = part.type === 'integer' || part.type === 'group';\n const next = parts[i + 1];\n const nextHere = next && (next.type === 'integer' || next.type === 'group');\n if (here && !nextHere && !inserted) {\n out += dec;\n inserted = true;\n }\n });\n } catch {\n out = `${num}${dec}`;\n inserted = true;\n }\n if (!inserted) out += dec;\n return `${this.prefix()}${out}${this.suffix()}`;\n }\n\n private toNumber(p: Parsed): number | null {\n const s = `${p.negative ? '-' : ''}${p.intDigits || '0'}${p.fracDigits ? '.' + p.fracDigits : ''}`;\n const n = Number(s);\n return Number.isFinite(n) ? n : null;\n }\n\n /** Pull the sign / integer / fraction fragments out of a formatted, partially-typed string. */\n private parseInput(raw: string): Parsed {\n const { group, decimal } = this.separators();\n let t = raw;\n const prefix = this.prefix();\n const suffix = this.suffix();\n if (prefix && t.startsWith(prefix)) t = t.slice(prefix.length);\n if (suffix && t.endsWith(suffix)) t = t.slice(0, t.length - suffix.length);\n if (group) t = t.split(group).join('');\n if (decimal && decimal !== '.') t = t.split(decimal).join('.');\n t = t.replace(/[^0-9.\\-]/g, '');\n\n const negative = t.includes('-');\n t = t.replace(/-/g, '');\n const dot = t.indexOf('.');\n const hadDecimal = dot !== -1 && this.maxFrac() > 0;\n let intDigits = (hadDecimal ? t.slice(0, dot) : t.replace(/\\./g, '')).replace(/\\D/g, '');\n let fracDigits = hadDecimal ? t.slice(dot + 1).replace(/\\D/g, '') : '';\n // Strip a leading run of zeros (\"007\" -> \"7\") but keep a lone \"0\".\n intDigits = intDigits.replace(/^0+(?=\\d)/, '');\n fracDigits = fracDigits.slice(0, this.maxFrac());\n return { negative, intDigits, fracDigits, hadDecimal };\n }\n\n /** Characters that \"carry meaning\" for caret placement (digits, minus, the decimal separator). */\n private isSignificant(ch: string): boolean {\n return (ch >= '0' && ch <= '9') || ch === '-' || ch === this.separators().decimal;\n }\n\n private significantBefore(s: string, upto: number): number {\n let n = 0;\n for (let i = 0; i < upto && i < s.length; i++) if (this.isSignificant(s[i])) n++;\n return n;\n }\n\n /** The caret index in `formatted` that sits just after `target` significant characters. */\n private caretAfter(formatted: string, target: number): number {\n if (target <= 0) {\n for (let i = 0; i < formatted.length; i++) if (this.isSignificant(formatted[i])) return i;\n return formatted.length;\n }\n let n = 0;\n for (let i = 0; i < formatted.length; i++) {\n if (this.isSignificant(formatted[i]) && ++n === target) return i + 1;\n }\n return formatted.length;\n }\n\n private clamp(n: number): number {\n const min = this.min();\n const max = this.max();\n if (min !== null && n < min) n = min;\n if (max !== null && n > max) n = max;\n return n;\n }\n\n /** Trim binary-float drift (0.1 + 0.2) back to a clean decimal. */\n private tidy(n: number): number {\n return Math.round(n * 1e10) / 1e10;\n }\n\n // --- Interaction ----------------------------------------------------------\n protected onInput(event: Event): void {\n const el = event.target as HTMLInputElement;\n const raw = el.value;\n const caret = el.selectionStart ?? raw.length;\n const target = this.significantBefore(raw, caret);\n\n const parsed = this.parseInput(raw);\n if (parsed.intDigits === '' && parsed.fracDigits === '' && !parsed.hadDecimal) {\n // Nothing numeric left — allow a lone \"-\" mid-entry, otherwise empty.\n const text = parsed.negative ? '-' : '';\n el.value = text;\n el.setSelectionRange(text.length, text.length);\n this.value.set(null);\n this.onChange(null);\n return;\n }\n\n const num = this.toNumber(parsed);\n const formatted = this.formatLive(parsed);\n el.value = formatted;\n const next = this.caretAfter(formatted, target);\n el.setSelectionRange(next, next);\n\n this.value.set(num);\n this.onChange(num);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.spin(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.spin(-1);\n }\n }\n\n protected onBlur(): void {\n let v = this.value();\n if (v === null && !this.allowEmpty()) v = this.min() ?? 0;\n if (v !== null) v = this.clamp(this.tidy(v));\n // Re-render through the committed formatter (applies min-fraction padding + clamping).\n this.value.set(v);\n this.paintCommitted();\n this.onChange(v);\n this.onTouched();\n }\n\n protected spin(direction: 1 | -1): void {\n if (this.isDisabled() || this.readonly()) return;\n const base = this.value() ?? this.min() ?? 0;\n const nextValue = this.clamp(this.tidy(base + direction * this.step()));\n this.value.set(nextValue);\n this.onChange(nextValue);\n this.onTouched();\n // Paint the stepped value ourselves — the effect stands down while the field is focused.\n const el = this.fieldRef()?.nativeElement;\n if (el) {\n const text = this.format(nextValue);\n el.value = text;\n if (this.isActive(el)) el.setSelectionRange(text.length, text.length);\n }\n }\n\n protected clear(): void {\n this.value.set(null);\n this.onChange(null);\n this.onTouched();\n const el = this.fieldRef()?.nativeElement;\n if (el) el.value = '';\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: number | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: number | null): void {\n this.value.set(typeof value === 'number' && Number.isFinite(value) ? value : null);\n }\n registerOnChange(fn: (value: number | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** A translatable string held per language code — e.g. `{ fr: 'Titre', nl: 'Titel' }`. */\nexport type SdsLocalizedValue = Record<string, string>;\n\nexport type SdsLocalizedInputSize = 'sm' | 'md' | 'lg';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsLocalizedInputSize, string> = {\n sm: 'min-h-9 text-sm',\n md: 'min-h-10 text-sm',\n lg: 'min-h-12 text-base',\n};\n\n/**\n * One language-aware text field for editing a translated value (a {@link SdsLocalizedValue} — a title,\n * label or description in several languages). Only one language is edited at a time; a compact switcher\n * sitting **inside the field** flips which translation you are editing, and a dot marks the languages that\n * already have content, so a partially-translated value is obvious at a glance.\n *\n * The active language defaults to {@link currentLanguage} when it is one of {@link languages}, otherwise the\n * first accepted language — so the field \"opens on the language you are working in\". Empty translations are\n * pruned from the emitted value, keeping the stored map clean.\n *\n * Implements ControlValueAccessor over the map — use with reactive forms or `[(ngModel)]`:\n * `<sds-localized-input [languages]=\"['fr','nl','en']\" [(ngModel)]=\"title\" />`.\n */\n@Component({\n selector: 'sds-localized-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsLocalizedInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"inputId\" class=\"mb-1.5 block text-sm font-medium text-ink\">{{ label() }}</label>\n }\n\n <div\n class=\"relative flex items-stretch rounded-control border bg-surface text-ink transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n @if (multiline()) {\n <textarea\n [id]=\"inputId\"\n [rows]=\"rows()\"\n [placeholder]=\"fieldPlaceholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"current()\"\n (input)=\"write($event)\"\n (blur)=\"onTouched()\"\n class=\"min-w-0 flex-1 resize-y bg-transparent px-3.5 py-2 outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n ></textarea>\n } @else {\n <input\n [id]=\"inputId\"\n [placeholder]=\"fieldPlaceholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"current()\"\n (input)=\"write($event)\"\n (blur)=\"onTouched()\"\n class=\"min-w-0 flex-1 bg-transparent px-3.5 outline-none placeholder:text-current/50 disabled:cursor-not-allowed\"\n />\n }\n\n @if (languages().length > 1) {\n <div\n class=\"flex shrink-0 items-center gap-0.5 self-start p-1\"\n [class]=\"multiline() ? '' : 'self-center'\"\n role=\"tablist\"\n [attr.aria-label]=\"languageSwitcherLabel()\"\n >\n @for (lang of languages(); track lang) {\n <button\n type=\"button\"\n role=\"tab\"\n tabindex=\"-1\"\n [disabled]=\"isDisabled()\"\n (click)=\"select(lang)\"\n [attr.aria-selected]=\"activeLang() === lang\"\n [attr.title]=\"lang.toUpperCase() + (filled(lang) ? '' : ' — ' + untranslatedLabel())\"\n class=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-[11px] font-semibold uppercase leading-none transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n [class]=\"\n activeLang() === lang\n ? 'bg-brand-50 text-brand-700'\n : 'text-ink-faint hover:bg-muted hover:text-ink-soft'\n \"\n >\n {{ lang }}\n <span\n class=\"inline-block h-1 w-1 rounded-full\"\n [class]=\"filled(lang) ? 'bg-success' : 'bg-current/30'\"\n ></span>\n </button>\n }\n </div>\n }\n </div>\n\n @if (hint()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsLocalizedInput implements ControlValueAccessor {\n readonly inputId = `sds-localized-input-${nextId++}`;\n\n readonly label = input<string>('');\n readonly hint = input<string>('');\n readonly placeholder = input<string>('');\n\n /** The accepted language codes, in display order (e.g. `['fr','nl','en']`). */\n readonly languages = input<string[]>([]);\n\n /** Language to pre-select; used when it is one of {@link languages}, else the first accepted language. */\n readonly currentLanguage = input<string | null>(null);\n\n readonly multiline = input(false, { transform: booleanAttribute });\n readonly rows = input(3, { transform: numberAttribute });\n readonly size = input<SdsLocalizedInputSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Accessible name for the in-field language switcher, and the \"no translation yet\" title suffix on each\n * language button. French defaults so existing consumers are unchanged; translate them in a multi-language\n * app (the buttons are letter-only, so the title carries their meaning).\n */\n readonly languageSwitcherLabel = input<string>('Langue');\n readonly untranslatedLabel = input<string>('à traduire');\n\n private readonly valueMap = signal<SdsLocalizedValue>({});\n /** Language chosen via the switcher; null means \"follow currentLanguage / the first language\". */\n private readonly manual = signal<string | null>(null);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.isDisabled()\n ? 'border-border opacity-60 cursor-not-allowed'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n return parts.join(' ');\n });\n\n /** The language currently being edited. */\n protected readonly activeLang = computed(() => {\n const langs = this.languages();\n if (!langs.length) {\n return '';\n }\n const manual = this.manual();\n if (manual && langs.includes(manual)) {\n return manual;\n }\n const preferred = this.currentLanguage();\n return preferred && langs.includes(preferred) ? preferred : langs[0];\n });\n\n protected readonly current = computed(() => this.valueMap()[this.activeLang()] ?? '');\n\n protected filled(lang: string): boolean {\n const text = this.valueMap()[lang];\n return !!text && text.trim().length > 0;\n }\n\n protected fieldPlaceholder(): string {\n const base = this.placeholder();\n const lang = this.activeLang().toUpperCase();\n if (base) {\n return lang ? `${base} (${lang})` : base;\n }\n return lang ? `(${lang})` : '';\n }\n\n protected select(lang: string): void {\n this.manual.set(lang);\n this.onTouched();\n }\n\n protected write(event: Event): void {\n const lang = this.activeLang();\n if (!lang) {\n return;\n }\n const text = (event.target as HTMLInputElement | HTMLTextAreaElement).value;\n const next: SdsLocalizedValue = { ...this.valueMap() };\n if (text) {\n next[lang] = text;\n } else {\n delete next[lang];\n }\n this.valueMap.set(next);\n this.onChange(next);\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: SdsLocalizedValue) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: SdsLocalizedValue | null): void {\n this.valueMap.set(value ? { ...value } : {});\n }\n registerOnChange(fn: (value: SdsLocalizedValue) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nexport type SdsOtpInputSize = 'md' | 'lg';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsOtpInputSize, string> = {\n md: 'h-12 w-11 text-lg',\n lg: 'h-14 w-12 text-xl',\n};\n\n/**\n * A segmented one-time-code field: one box per character, for the short numeric codes emailed or\n * texted for sign-in and verification. Implements ControlValueAccessor — bind\n * `formControlName`/`[(ngModel)]`; the value is the concatenated string (e.g. `\"483920\"`), and\n * {@link completed} fires the moment every box is filled.\n *\n * <p>Only digits are accepted (`inputMode` is `numeric` by default). Typing auto-advances,\n * Backspace steps back and clears, the arrow keys move between boxes, and pasting a whole code\n * distributes it across the boxes from the focused one — so a user can paste `483920` into the\n * first box and have it land correctly.\n */\n@Component({\n selector: 'sds-otp-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsOtpInput),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [id]=\"groupId + '-label'\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div\n class=\"flex items-center gap-2\"\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? groupId + '-label' : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-describedby]=\"describedBy()\"\n >\n @for (i of indexes(); track i) {\n <input\n #cell\n type=\"text\"\n [attr.data-index]=\"i\"\n [inputMode]=\"inputMode()\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n [value]=\"charAt(i)\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"cellLabel() + ' ' + (i + 1)\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n class=\"bg-surface text-center font-semibold tabular-nums outline-none transition-colors\n disabled:cursor-not-allowed\"\n [class]=\"cellClasses()\"\n (input)=\"onInput($event, i)\"\n (keydown)=\"onKeydown($event, i)\"\n (paste)=\"onPaste($event, i)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onTouched()\"\n />\n }\n </div>\n\n @if (error()) {\n <p [id]=\"groupId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n } @else if (hint()) {\n <p [id]=\"groupId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n `,\n})\nexport class SdsOtpInput implements ControlValueAccessor {\n readonly groupId = `sds-otp-${nextId++}`;\n\n /** How many boxes / characters the code has. */\n readonly length = input(6, { transform: numberAttribute });\n readonly label = input<string>('');\n /** Accessible name for the whole group when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsOtpInputSize>('md');\n /** `numeric` for digit codes (the default); `text` for alphanumeric codes. */\n readonly inputMode = input<'numeric' | 'text'>('numeric');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Focus the first box on first render. */\n readonly autoFocus = input(false, { transform: booleanAttribute });\n\n /**\n * Accessible name for an individual box, suffixed with its 1-based position (\"Digit 1\", \"Digit\n * 2\", …). French default so existing consumers are unchanged; translate it in an app serving more\n * than one language, since each box is an icon-less control whose only name this is.\n */\n readonly cellLabel = input<string>('Chiffre');\n\n /** Emitted with the full value the moment the last box is filled. */\n readonly completed = output<string>();\n\n private readonly cells = viewChildren<ElementRef<HTMLInputElement>>('cell');\n\n /** One entry per box; the source of truth, kept exactly {@link length} long. */\n private readonly chars = signal<string[]>([]);\n private readonly cvaDisabled = signal(false);\n\n protected readonly indexes = computed(() =>\n Array.from({ length: this.length() }, (_, i) => i),\n );\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.groupId}-err`;\n if (this.hint()) return `${this.groupId}-hint`;\n return null;\n });\n\n protected readonly cellClasses = computed(() => {\n const parts = ['rounded-control border', SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border text-ink focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60');\n return parts.join(' ');\n });\n\n constructor() {\n // Autofocus once the boxes are in the DOM. afterRenderEffect re-runs on signal reads, but the\n // guard keeps it to the first paint — refocusing on every value change would fight the user.\n let focused = false;\n afterRenderEffect(() => {\n if (this.autoFocus() && !focused && !this.isDisabled()) {\n this.cells()[0]?.nativeElement.focus();\n focused = true;\n }\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n // Programmatic set never emits — CVA writeValue must not call onChange.\n this.chars.set(this.spread(value ?? ''));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n // --- events ---------------------------------------------------------------\n\n protected charAt(index: number): string {\n return this.chars()[index] ?? '';\n }\n\n protected onInput(event: Event, index: number): void {\n const el = event.target as HTMLInputElement;\n const raw = el.value;\n const digits = this.sanitize(raw);\n if (digits.length === 0) {\n if (raw.length === 0) {\n // Genuinely emptied (cut, or a deletion the keydown handler did not catch) — clear the box.\n this.setChar(index, '');\n } else {\n // A rejected character (letter, symbol) — reassert the box's real content, since the\n // [value] binding will not repaint an unchanged signal.\n el.value = this.charAt(index);\n }\n return;\n }\n if (digits.length > 1) {\n // Fast typing or an autofill dropped several characters into one box — spread them.\n this.fill(digits, index);\n return;\n }\n this.setChar(index, digits);\n this.focusIndex(index + 1);\n }\n\n protected onKeydown(event: KeyboardEvent, index: number): void {\n switch (event.key) {\n case 'Backspace':\n event.preventDefault();\n if (this.charAt(index)) {\n this.setChar(index, '');\n } else if (index > 0) {\n this.setChar(index - 1, '');\n this.focusIndex(index - 1);\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.focusIndex(index - 1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.focusIndex(index + 1);\n break;\n case 'Delete':\n event.preventDefault();\n this.setChar(index, '');\n break;\n default:\n break;\n }\n }\n\n protected onPaste(event: ClipboardEvent, index: number): void {\n const digits = this.sanitize(event.clipboardData?.getData('text') ?? '');\n if (!digits) return;\n event.preventDefault();\n this.fill(digits, index);\n }\n\n protected onFocus(event: FocusEvent): void {\n // Select the box's content so a keystroke overwrites rather than being rejected by maxlength.\n (event.target as HTMLInputElement).select();\n }\n\n // --- internals ------------------------------------------------------------\n\n private sanitize(raw: string): string {\n return this.inputMode() === 'numeric'\n ? raw.replace(/\\D/g, '')\n : raw.replace(/[^A-Za-z0-9]/g, '');\n }\n\n /** Normalize any input string into an array exactly {@link length} long. */\n private spread(raw: string): string[] {\n const cleaned = this.sanitize(raw).slice(0, this.length());\n return Array.from({ length: this.length() }, (_, i) => cleaned[i] ?? '');\n }\n\n private setChar(index: number, value: string): void {\n const next = this.normalized();\n next[index] = value;\n this.commit(next);\n }\n\n /** Write `digits` across the boxes starting at `start`, then focus the next empty box. */\n private fill(digits: string, start: number): void {\n const next = this.normalized();\n let cursor = start;\n for (const ch of digits) {\n if (cursor >= this.length()) break;\n next[cursor] = ch;\n cursor += 1;\n }\n this.commit(next);\n this.focusIndex(Math.min(cursor, this.length() - 1));\n }\n\n private commit(next: string[]): void {\n this.chars.set(next);\n const value = next.join('');\n this.onChange(value);\n if (next.every((c) => c !== '')) {\n this.completed.emit(value);\n }\n }\n\n /** The current boxes as a fresh, correctly-sized array to mutate. */\n private normalized(): string[] {\n const current = this.chars();\n return Array.from({ length: this.length() }, (_, i) => current[i] ?? '');\n }\n\n private focusIndex(index: number): void {\n const clamped = Math.max(0, Math.min(index, this.length() - 1));\n const cell = this.cells()[clamped]?.nativeElement;\n if (cell) {\n cell.focus();\n cell.select();\n }\n }\n}\n","import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nexport type SdsTextareaSize = 'sm' | 'md' | 'lg';\nexport type SdsTextareaResize = 'none' | 'vertical' | 'both';\nexport type SdsTextareaAppearance = 'default' | 'filled';\n\nlet nextId = 0;\n\nconst SIZES: Record<SdsTextareaSize, string> = {\n sm: 'text-sm px-3 py-2',\n md: 'text-sm px-3.5 py-2.5',\n lg: 'text-base px-4 py-3',\n};\n\n/**\n * Multi-line text field with label, hint/error, character counter and optional\n * auto-resize. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)].\n */\n@Component({\n selector: 'sds-textarea',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsTextarea),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <textarea\n #field\n [id]=\"fieldId\"\n [value]=\"value()\"\n [rows]=\"rows()\"\n [placeholder]=\"placeholder()\"\n [attr.maxlength]=\"maxLength() || null\"\n [readonly]=\"readonly() || null\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [style.resize]=\"autoResize() ? 'none' : resize()\"\n [class]=\"fieldClasses()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n @if (hasCounter()) {\n <div class=\"mt-1.5 flex items-start gap-2 text-xs\">\n @if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"flex-1 font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"flex-1 text-ink-faint\">\n {{ hint() }}\n </p>\n } @else {\n <span class=\"flex-1\"></span>\n }\n <span\n [id]=\"fieldId + '-count'\"\n aria-live=\"polite\"\n [attr.aria-label]=\"countLabel()\"\n class=\"shrink-0 tabular-nums text-ink-faint\"\n >\n {{ count() }}{{ maxLength() ? ' / ' + maxLength() : '' }}\n </span>\n </div>\n } @else if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsTextarea implements ControlValueAccessor {\n readonly fieldId = `sds-textarea-${nextId++}`;\n\n private readonly field =\n viewChild<ElementRef<HTMLTextAreaElement>>('field');\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsTextareaSize>('md');\n /**\n * `filled` is a borderless field on a muted ground — the textarea counterpart of `sds-input`'s\n * `filled`, so a form that uses filled inputs keeps one look down to its notes field.\n */\n readonly appearance = input<SdsTextareaAppearance>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Minimum visible rows. */\n readonly rows = input(3, { transform: numberAttribute });\n /** Grow the field to fit its content as the user types. */\n readonly autoResize = input(false, { transform: booleanAttribute });\n /** Hard character cap; 0 means no limit. */\n readonly maxLength = input(0, { transform: numberAttribute });\n /** Show a character counter row. */\n readonly showCount = input(false, { transform: booleanAttribute });\n readonly resize = input<SdsTextareaResize>('vertical');\n\n /** Current value (driven by CVA + user input). */\n protected readonly value = signal('');\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly count = computed(() => this.value().length);\n\n protected readonly hasCounter = computed(\n () => this.showCount() || this.maxLength() > 0,\n );\n\n /** Spoken description of the counter for assistive tech. */\n protected readonly countLabel = computed(() =>\n this.maxLength()\n ? `${this.count()} sur ${this.maxLength()} caractères utilisés`\n : `${this.count()} caractère(s)`,\n );\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.error()) ids.push(`${this.fieldId}-err`);\n else if (this.hint()) ids.push(`${this.fieldId}-hint`);\n if (this.hasCounter()) ids.push(`${this.fieldId}-count`);\n return ids.length ? ids.join(' ') : null;\n });\n\n protected readonly fieldClasses = computed(() => {\n const parts = [\n 'block w-full rounded-control border text-ink outline-none transition-colors placeholder:text-ink-faint',\n SIZES[this.size()],\n ];\n\n if (this.autoResize()) parts.push('overflow-hidden');\n\n if (this.appearance() === 'filled') {\n // border-transparent, not border-0, for the same reason as sds-input's filled: one box model.\n parts.push('bg-muted');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/30'\n : 'border-transparent focus:ring-2 focus:ring-brand-500/25',\n );\n } else {\n parts.push('bg-surface');\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n }\n\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n\n return parts.join(' ');\n });\n\n constructor() {\n // Drive auto-resize reactively from the value signal. This runs once after\n // the initial render and again whenever the value changes (user input or\n // programmatic writeValue), without accumulating one-shot render hooks.\n afterRenderEffect(() => {\n this.value();\n if (this.autoResize()) this.resizeToContent();\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n // Auto-resize is handled reactively by the afterRenderEffect in the\n // constructor, which re-runs whenever this signal changes.\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLTextAreaElement).value;\n this.value.set(next);\n this.onChange(next);\n if (this.autoResize()) this.resizeToContent();\n }\n\n private resizeToContent(): void {\n const el = this.field()?.nativeElement;\n if (!el) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n isDevMode,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsToggleSwitchSize = 'sm' | 'md' | 'lg';\n\nlet nextId = 0;\n\ninterface ToggleSizing {\n /** Track width/height. */\n track: string;\n /** Knob width/height. */\n knob: string;\n /** Knob translate distance when checked. */\n on: string;\n /** Icon size in pixels. */\n icon: number;\n}\n\nconst SIZES: Record<SdsToggleSwitchSize, ToggleSizing> = {\n sm: { track: 'h-5 w-9', knob: 'h-4 w-4', on: 'translate-x-4', icon: 11 },\n md: { track: 'h-6 w-11', knob: 'h-5 w-5', on: 'translate-x-5', icon: 13 },\n lg: { track: 'h-7 w-[3.4rem]', knob: 'h-6 w-6', on: 'translate-x-7', icon: 15 },\n};\n\n/**\n * On/off switch styled as a sliding toggle. Implements ControlValueAccessor —\n * use with reactive forms or [(ngModel)]. Supports an optional visible label,\n * custom `trueValue`/`falseValue`, and optional knob icons for the on/off\n * states.\n */\n@Component({\n selector: 'sds-toggle-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsToggleSwitch),\n multi: true,\n },\n ],\n host: { class: 'block' },\n template: `\n <div class=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n [id]=\"fieldId\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() || null) : null\"\n [attr.aria-labelledby]=\"label() ? fieldId + '-label' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n class=\"relative inline-flex shrink-0 cursor-pointer items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-60\"\n [class]=\"trackClasses()\"\n (click)=\"toggle()\"\n (keydown.space)=\"onSpace($event)\"\n >\n <span\n class=\"pointer-events-none inline-flex items-center justify-center rounded-full shadow-sm transition-[transform,background-color]\"\n [class]=\"knobClasses()\"\n >\n @if (checked() && onIcon()) {\n <sds-icon\n [name]=\"onIcon()!\"\n [size]=\"sizing().icon\"\n class=\"text-brand-600 dark:text-ink\"\n />\n } @else if (!checked() && offIcon()) {\n <sds-icon\n [name]=\"offIcon()!\"\n [size]=\"sizing().icon\"\n class=\"text-ink-faint dark:text-surface\"\n />\n }\n </span>\n </button>\n\n @if (label()) {\n <span\n [id]=\"fieldId + '-label'\"\n class=\"select-none text-sm font-medium text-ink\"\n [class.cursor-pointer]=\"!isDisabled()\"\n [class.cursor-not-allowed]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n {{ label() }}\n </span>\n }\n </div>\n\n @if (error()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ error() }}\n </p>\n } @else if (hint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() }}\n </p>\n }\n `,\n})\nexport class SdsToggleSwitch implements ControlValueAccessor {\n readonly fieldId = `sds-toggle-switch-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly size = input<SdsToggleSwitchSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Value emitted/stored when the switch is on. */\n readonly trueValue = input<unknown>(true);\n /** Value emitted/stored when the switch is off. */\n readonly falseValue = input<unknown>(false);\n /** Icon shown on the knob when checked. */\n readonly onIcon = input<SdsIconName | null>(null);\n /** Icon shown on the knob when unchecked. */\n readonly offIcon = input<SdsIconName | null>(null);\n readonly hint = input<string>('');\n readonly error = input<string>('');\n\n /**\n * Current value (driven by CVA). Initialized to a stable literal off-state\n * rather than reading falseValue() in the field initializer — a signal input\n * read here always returns its declared default, so capturing it would ignore\n * a custom [falseValue] and is non-reactive. The off-state is resolved live\n * against trueValue() in checked() and against falseValue() in toggle().\n */\n protected readonly value = signal<unknown>(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly checked = computed(\n () => this.value() === this.trueValue(),\n );\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n\n protected readonly sizing = computed(() => SIZES[this.size()]);\n\n protected readonly describedBy = computed(() => {\n if (this.error()) return `${this.fieldId}-err`;\n if (this.hint()) return `${this.fieldId}-hint`;\n return null;\n });\n\n /**\n * On/off must read at a glance in both modes. In light mode the brand track against a pale grey one does\n * it. In dark mode a monochrome brand's 600 step is a mid-dark grey, as dim as the off track, so there\n * \"on\" flips to a light track with a dark knob and \"off\" keeps a dim track with a muted knob. `ink` (not\n * black) tints the off track so it stays visible on dark surfaces too.\n */\n protected readonly trackClasses = computed(() => {\n const parts = [this.sizing().track];\n parts.push(this.checked() ? 'bg-brand-600 dark:bg-ink' : 'bg-ink/15');\n return parts.join(' ');\n });\n\n protected readonly knobClasses = computed(() => {\n const parts = [this.sizing().knob];\n parts.push(this.checked() ? this.sizing().on : 'translate-x-0.5');\n parts.push(this.checked() ? 'bg-white dark:bg-surface' : 'bg-white dark:bg-ink-soft');\n return parts.join(' ');\n });\n\n constructor() {\n // Dev-only guard: a toggle is effectively icon-only (no intrinsic text), so\n // without a visible [label] or an explicit [ariaLabel] the switch ships with\n // no accessible name. Mirrors the sds-button icon-only guard.\n if (isDevMode()) {\n effect(() => {\n if (!this.label() && !this.ariaLabel()) {\n console.warn(\n 'sds-toggle-switch: provide [label] or [ariaLabel] for an accessible name.',\n );\n }\n });\n }\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n // A null/undefined write (initial bind with no model, or reset()) means the\n // control is unset — resolve it to the configured off value so a custom\n // [falseValue] is honored and checked() renders off consistently.\n this.value.set(value ?? this.falseValue());\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.setValue(this.checked() ? this.falseValue() : this.trueValue());\n }\n\n protected onSpace(event: Event): void {\n event.preventDefault();\n this.toggle();\n }\n\n private setValue(next: unknown): void {\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsCheckboxSize = 'sm' | 'md';\n\nlet nextId = 0;\n\n/**\n * Boolean checkbox. Implements ControlValueAccessor — use with reactive forms\n * or `[(ngModel)]`. Renders a styled box (brand-filled with a check when on)\n * and an optional inline label. Without a visible `label` it renders no `<label>`\n * of its own, so it can sit inside the consumer's `<label>` (a whole clickable\n * row), whose text then names it.\n *\n * @example\n * <sds-checkbox label=\"Fusion automatique\" [(ngModel)]=\"autoMerge\" />\n */\n@Component({\n selector: 'sds-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsCheckbox),\n multi: true,\n },\n ],\n host: { class: 'inline-flex' },\n template: `\n <!-- With a visible label the whole thing is a <label>. Without one it is a plain span, so the box can\n sit inside the consumer's own <label> (a clickable row, say) without nesting labels. -->\n @if (label()) {\n <label class=\"inline-flex select-none items-center gap-2\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"box\" />\n <span class=\"text-sm text-ink\">{{ label() }}</span>\n </label>\n } @else {\n <span class=\"inline-flex select-none items-center\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"box\" />\n </span>\n }\n\n <ng-template #box>\n <span\n class=\"relative inline-flex shrink-0 items-center justify-center rounded-control border transition-colors\"\n [class]=\"boxClasses()\"\n >\n <input\n type=\"checkbox\"\n class=\"absolute inset-0 m-0 cursor-[inherit] opacity-0\"\n [id]=\"id\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (change)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n @if (checked()) {\n <sds-icon name=\"check\" [size]=\"iconSize()\" [strokeWidth]=\"3\" />\n }\n </span>\n </ng-template>\n `,\n})\nexport class SdsCheckbox implements ControlValueAccessor {\n readonly id = `sds-checkbox-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n readonly size = input<SdsCheckboxSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly checked = signal(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n protected readonly iconSize = computed(() => (this.size() === 'sm' ? 11 : 13));\n protected readonly stateClasses = computed(() =>\n this.isDisabled() ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n );\n\n protected readonly boxClasses = computed(() => {\n const size = this.size() === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n const state = this.checked()\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface text-transparent';\n const focus =\n 'focus-within:ring-2 focus-within:ring-brand-500/30 focus-within:border-brand-500';\n return `${size} ${state} ${focus}`;\n });\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: boolean | null): void {\n this.checked.set(!!value);\n }\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).checked;\n this.checked.set(next);\n this.onChange(next);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type SdsRadioSize = 'sm' | 'md';\n\nlet nextId = 0;\n\n/**\n * Mounted radios by group name. A pick updates the rest of its group, because a native radio says\n * nothing when the browser unchecks it — without this a reactive form would leave the old choice drawn.\n */\nconst groups = new Map<string, Set<SdsRadio>>();\n\n/**\n * One option of a single-choice group: a styled circle (brand-filled with a dot when on) over a native\n * radio input, so grouping and keyboard behaviour stay the browser's — radios that share a `name`\n * move with the arrow keys and only one of them is on.\n *\n * Two ways to bind it:\n * - with forms: every radio of the group gets the same `[(ngModel)]` / `formControlName`, the same\n * `name` and its own `[value]`; the control holds the value of the selected radio\n * (ControlValueAccessor, like a native radio);\n * - without forms: drive `[checked]` yourself and update it from `(selected)`, which emits this radio's\n * value when the user picks it.\n *\n * Like `sds-checkbox`, without a visible `label` it renders no `<label>` of its own, so it can sit\n * inside the consumer's `<label>` (a whole clickable row), whose text then names it.\n *\n * @example\n * <sds-radio name=\"size\" value=\"small\" label=\"Petit\" [(ngModel)]=\"size\" />\n * <sds-radio name=\"size\" value=\"large\" label=\"Grand\" [(ngModel)]=\"size\" />\n */\n@Component({\n selector: 'sds-radio',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SdsRadio),\n multi: true,\n },\n ],\n host: { class: 'inline-flex' },\n template: `\n @if (label()) {\n <label class=\"inline-flex select-none items-center gap-2\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"circle\" />\n <span class=\"text-sm text-ink\">{{ label() }}</span>\n </label>\n } @else {\n <span class=\"inline-flex select-none items-center\" [class]=\"stateClasses()\">\n <ng-container [ngTemplateOutlet]=\"circle\" />\n </span>\n }\n\n <ng-template #circle>\n <span\n class=\"relative inline-flex shrink-0 items-center justify-center rounded-full border transition-colors\"\n [class]=\"circleClasses()\"\n >\n <input\n type=\"radio\"\n class=\"absolute inset-0 m-0 cursor-[inherit] opacity-0\"\n [id]=\"id\"\n [attr.name]=\"name() || null\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (change)=\"onPick()\"\n (blur)=\"onTouched()\"\n />\n @if (isChecked()) {\n <span\n class=\"pointer-events-none rounded-full bg-white\"\n [class]=\"dotClasses()\"\n aria-hidden=\"true\"\n ></span>\n }\n </span>\n </ng-template>\n `,\n})\nexport class SdsRadio implements ControlValueAccessor {\n readonly id = `sds-radio-${nextId++}`;\n\n readonly label = input<string>('');\n /** Accessible name used when no visible [label] is provided. */\n readonly ariaLabel = input<string>('');\n /** The group's name, shared by all its radios (native grouping, arrow keys, and form syncing). */\n readonly name = input<string>('');\n /** What this option stands for: a form control bound to the group holds it while this radio is on. */\n readonly value = input<unknown>(null);\n /** On/off when used without forms. Ignored once a form control is bound. */\n readonly checked = input(false, { transform: booleanAttribute });\n readonly size = input<SdsRadioSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emits this radio's value when the user picks it. */\n readonly selected = output<unknown>();\n\n /** The group's current value, once a form control is bound (see {@link registerOnChange}). */\n private readonly modelValue = signal<unknown>(undefined);\n private readonly formBound = signal(false);\n private readonly cvaDisabled = signal(false);\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isChecked = computed(() =>\n this.formBound() ? Object.is(this.modelValue(), this.value()) : this.checked(),\n );\n protected readonly stateClasses = computed(() =>\n this.isDisabled() ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n );\n protected readonly circleClasses = computed(() => {\n const size = this.size() === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n const state = this.isChecked() ? 'border-brand-600 bg-brand-600' : 'border-border bg-surface';\n const focus =\n 'focus-within:ring-2 focus-within:ring-brand-500/30 focus-within:border-brand-500';\n return `${size} ${state} ${focus}`;\n });\n protected readonly dotClasses = computed(() =>\n this.size() === 'sm' ? 'h-1.5 w-1.5' : 'h-2 w-2',\n );\n\n constructor() {\n effect((onCleanup) => {\n const name = this.name();\n if (!name) {\n return;\n }\n let group = groups.get(name);\n if (!group) {\n group = new Set();\n groups.set(name, group);\n }\n group.add(this);\n onCleanup(() => {\n group.delete(this);\n if (group.size === 0) {\n groups.delete(name);\n }\n });\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.modelValue.set(value);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n this.formBound.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n /** A native radio only fires `change` when it turns on. */\n protected onPick(): void {\n const value = this.value();\n if (this.formBound()) {\n const name = this.name();\n for (const radio of (name && groups.get(name)) || [this]) {\n radio.modelValue.set(value);\n }\n this.onChange(value);\n }\n this.selected.emit(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsAvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\nconst STATUS_COLOR: Record<SdsAvatarStatus, string> = {\n online: 'bg-success',\n offline: 'bg-ink-faint',\n busy: 'bg-danger',\n away: 'bg-warning',\n};\n\n/**\n * Circular avatar showing an image or initials, with an optional status dot.\n */\n@Component({\n selector: 'sds-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'inline-block shrink-0 align-middle' },\n template: `\n <div\n class=\"relative grid place-items-center overflow-hidden rounded-full font-semibold text-white ring-2 ring-white/20\"\n [class]=\"bgClass()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [style.fontSize.px]=\"size() * 0.4\"\n >\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"name()\" class=\"h-full w-full object-cover\" />\n } @else {\n <span>{{ resolvedInitials() }}</span>\n }\n\n @if (status()) {\n <span\n class=\"absolute bottom-0 right-0 rounded-full ring-2 ring-white\"\n [class]=\"statusColor()\"\n [style.width.px]=\"dotSize()\"\n [style.height.px]=\"dotSize()\"\n ></span>\n }\n </div>\n `,\n})\nexport class SdsAvatar {\n readonly name = input<string>('');\n readonly initials = input<string>('');\n readonly src = input<string | null>(null);\n readonly size = input<number>(36);\n readonly status = input<SdsAvatarStatus | null>(null);\n /** Tailwind bg utility for the initials background. */\n readonly bgClass = input<string>('bg-brand-400');\n\n protected readonly dotSize = computed(() =>\n Math.max(8, Math.round(this.size() * 0.28)),\n );\n\n protected readonly statusColor = computed(() =>\n this.status() ? STATUS_COLOR[this.status()!] : '',\n );\n\n protected readonly resolvedInitials = computed(() => {\n if (this.initials()) return this.initials().slice(0, 2).toUpperCase();\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsBadgeVariant =\n | 'neutral'\n | 'brand'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger';\nexport type SdsBadgeSize = 'sm' | 'md';\n\nconst VARIANTS: Record<SdsBadgeVariant, string> = {\n neutral: 'bg-muted text-ink-soft border-border',\n brand: 'bg-brand-50 text-brand-700 border-brand-100',\n info: 'bg-accent-blue-soft text-accent-blue border-transparent',\n success: 'bg-accent-green-soft text-accent-green border-transparent',\n warning: 'bg-accent-amber-soft text-accent-amber border-transparent',\n danger: 'bg-accent-red-soft text-accent-red border-transparent',\n};\n\nconst DOT: Record<SdsBadgeVariant, string> = {\n neutral: 'bg-ink-faint',\n brand: 'bg-brand-500',\n info: 'bg-accent-blue',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n};\n\n/**\n * Small status/label pill. Used e.g. for the \"TEST V.1.0.0\" version chip.\n */\n@Component({\n selector: 'sds-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'inline-flex' },\n template: `\n <span\n class=\"inline-flex items-center gap-1.5 rounded-full border font-semibold uppercase tracking-wide\"\n [class]=\"classes()\"\n >\n @if (dot()) {\n <span class=\"h-1.5 w-1.5 rounded-full\" [class]=\"dotClass()\"></span>\n }\n <ng-content />\n </span>\n `,\n})\nexport class SdsBadge {\n readonly variant = input<SdsBadgeVariant>('neutral');\n readonly size = input<SdsBadgeSize>('md');\n readonly dot = input(false, { transform: booleanAttribute });\n\n protected readonly classes = computed(() => {\n const size =\n this.size() === 'sm'\n ? 'px-2 py-0.5 text-[10px]'\n : 'px-2.5 py-1 text-[11px]';\n return `${VARIANTS[this.variant()]} ${size}`;\n });\n\n protected readonly dotClass = computed(() => DOT[this.variant()]);\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsCardVariant = 'elevated' | 'outlined' | 'subtle';\n\nconst VARIANTS: Record<SdsCardVariant, string> = {\n elevated: 'bg-surface border border-border shadow-sm',\n outlined: 'bg-surface border border-border',\n subtle: 'bg-muted border border-border',\n};\n\n/**\n * Generic surface container. Set [interactive]=\"true\" for hover affordance\n * (used by the dashboard action cards).\n */\n@Component({\n selector: 'sds-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClass()' },\n template: `<ng-content />`,\n})\nexport class SdsCard {\n readonly variant = input<SdsCardVariant>('elevated');\n /** Inner padding utility (override with e.g. \"p-4\"). */\n readonly padding = input<string>('p-5');\n readonly interactive = input(false, { transform: booleanAttribute });\n\n protected readonly hostClass = computed(() => {\n const parts = ['block rounded-card', VARIANTS[this.variant()], this.padding()];\n if (this.interactive()) {\n parts.push(\n 'cursor-pointer transition-all duration-150 hover:border-brand-300 hover:shadow-md',\n );\n }\n return parts.join(' ');\n });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n isDevMode,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/**\n * The 14 allergens of Regulation (EU) No 1169/2011, Annex II, spelled exactly like the API enum\n * (`be.saitech.belvigo.catalog.domain.Allergen`), so a DTO value binds straight to the component.\n */\nexport type SdsAllergen =\n | 'CEREALS_GLUTEN'\n | 'CRUSTACEANS'\n | 'EGGS'\n | 'FISH'\n | 'PEANUTS'\n | 'SOYBEANS'\n | 'MILK'\n | 'NUTS'\n | 'CELERY'\n | 'MUSTARD'\n | 'SESAME'\n | 'SULPHITES'\n | 'LUPIN'\n | 'MOLLUSCS';\n\n/** Every allergen in Annex II order — iterate it to render a declaration grid of 14. */\nexport const SDS_ALLERGENS: readonly SdsAllergen[] = [\n 'CEREALS_GLUTEN',\n 'CRUSTACEANS',\n 'EGGS',\n 'FISH',\n 'PEANUTS',\n 'SOYBEANS',\n 'MILK',\n 'NUTS',\n 'CELERY',\n 'MUSTARD',\n 'SESAME',\n 'SULPHITES',\n 'LUPIN',\n 'MOLLUSCS',\n];\n\n/** Registry icon for each allergen. */\nexport const SDS_ALLERGEN_ICONS: Readonly<Record<SdsAllergen, SdsIconName>> = {\n CEREALS_GLUTEN: 'allergen-cereals-gluten',\n CRUSTACEANS: 'allergen-crustaceans',\n EGGS: 'allergen-eggs',\n FISH: 'allergen-fish',\n PEANUTS: 'allergen-peanuts',\n SOYBEANS: 'allergen-soybeans',\n MILK: 'allergen-milk',\n NUTS: 'allergen-nuts',\n CELERY: 'allergen-celery',\n MUSTARD: 'allergen-mustard',\n SESAME: 'allergen-sesame',\n SULPHITES: 'allergen-sulphites',\n LUPIN: 'allergen-lupin',\n MOLLUSCS: 'allergen-molluscs',\n};\n\n/**\n * English names, as a fallback and for the showcase. An app serving more than one language passes its\n * own translated name through [label] — the library never picks a language for you.\n */\nexport const SDS_ALLERGEN_LABELS_EN: Readonly<Record<SdsAllergen, string>> = {\n CEREALS_GLUTEN: 'Cereals containing gluten',\n CRUSTACEANS: 'Crustaceans',\n EGGS: 'Eggs',\n FISH: 'Fish',\n PEANUTS: 'Peanuts',\n SOYBEANS: 'Soybeans',\n MILK: 'Milk',\n NUTS: 'Nuts',\n CELERY: 'Celery',\n MUSTARD: 'Mustard',\n SESAME: 'Sesame',\n SULPHITES: 'Sulphites',\n LUPIN: 'Lupin',\n MOLLUSCS: 'Molluscs',\n};\n\n/** Accepts the enum spelling, and tolerates `milk` / `cereals-gluten` so a hand-typed value still resolves. */\nfunction normalize(value: string | null | undefined): SdsAllergen | null {\n if (!value) return null;\n const key = String(value).trim().toUpperCase().replace(/-/g, '_');\n return key in SDS_ALLERGEN_ICONS ? (key as SdsAllergen) : null;\n}\n\n/**\n * The pictogram for one EU allergen, taking the API enum value directly. With a [label] it is an image\n * with that accessible name (role=\"img\"); without one it is decorative (aria-hidden), for when visible\n * text beside it already names the allergen.\n *\n * @example\n * <sds-allergen-icon allergen=\"MILK\" label=\"Milk\" />\n * <sds-allergen-icon [allergen]=\"a\" [size]=\"16\" /> <!-- decorative: text next to it names it -->\n */\n@Component({\n selector: 'sds-allergen-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'inline-flex shrink-0',\n '[attr.role]': 'label() ? \"img\" : null',\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-hidden]': 'label() ? null : \"true\"',\n '[attr.title]': 'showTitle() && label() ? label() : null',\n },\n template: `\n @if (iconName(); as name) {\n <sds-icon [name]=\"name\" [size]=\"size()\" [strokeWidth]=\"strokeWidth()\" />\n }\n `,\n})\nexport class SdsAllergenIcon {\n /** The allergen, as the API enum value (`MILK`, `CEREALS_GLUTEN`, …). */\n readonly allergen = input.required<SdsAllergen>();\n /** Accessible name. Empty (default) = decorative, hidden from assistive tech. */\n readonly label = input<string>('');\n /** Also show the [label] as a native tooltip on hover. */\n readonly showTitle = input(false, { transform: booleanAttribute });\n /** Square size: a pixel number, a numeric string, or a keyword (sm·md·lg·xl). */\n readonly size = input<number | string>(20);\n /** Stroke width of the line icon. */\n readonly strokeWidth = input<number>(2);\n\n protected readonly iconName = computed<SdsIconName | null>(() => {\n const key = normalize(this.allergen());\n return key ? SDS_ALLERGEN_ICONS[key] : null;\n });\n\n constructor() {\n if (isDevMode()) {\n effect(() => {\n if (!this.iconName()) {\n console.warn(`sds-allergen-icon: unknown allergen \"${this.allergen()}\".`);\n }\n });\n }\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** The three states of a declaration chip. */\nexport type SdsTriState = 'none' | 'contains' | 'may-contain';\nexport type SdsTriStateChipSize = 'sm' | 'md';\n\n/** Activation order: none → contains → may-contain → none. */\nconst ORDER: readonly SdsTriState[] = ['none', 'contains', 'may-contain'];\n\nlet nextId = 0;\n\n/**\n * A chip that cycles through three states — `none`, `contains`, `may-contain` — built for the 14-tile\n * allergen declaration grid, but generic (any \"no / yes / maybe\" declaration).\n *\n * **The state never relies on colour alone.** Each state has its own border (thin solid · thick solid\n * and filled · thick dashed), its own mark (none · a check · a question mark), a visible state caption\n * (turn off with `showState`), and the state text is part of the button's accessible name.\n *\n * Interaction: click, Enter or Space moves to the next state; Shift+Enter / Shift+Space moves back;\n * Delete or Backspace resets to `none`. A polite live region announces the new state after a change.\n * The value is a two-way `model` — bind `[(value)]`.\n *\n * All visible and spoken text comes from inputs with English defaults; pass translated labels.\n *\n * @example\n * <sds-tri-state-chip label=\"Milk\" icon=\"allergen-milk\" [(value)]=\"state.MILK\"\n * containsLabel=\"Contains\" mayContainLabel=\"May contain\" noneLabel=\"Not present\" />\n */\n@Component({\n selector: 'sds-tri-state-chip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'inline-flex min-w-0' },\n template: `\n <button\n type=\"button\"\n [id]=\"chipId\"\n [class]=\"chipClass()\"\n [disabled]=\"disabled()\"\n [attr.data-state]=\"value()\"\n [attr.aria-describedby]=\"hint() ? chipId + '-hint' : null\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"size() === 'sm' ? 18 : 22\" class=\"shrink-0\" />\n }\n\n <span class=\"flex min-w-0 flex-1 flex-col text-left leading-tight\">\n <!-- Up to two lines, so \"Cereals containing gluten\" stays readable in a narrow grid cell. -->\n <span\n class=\"line-clamp-2 break-words font-semibold\"\n [class]=\"size() === 'sm' ? 'text-xs' : 'text-sm'\"\n >{{ label() }}</span\n >\n @if (showState()) {\n <span\n class=\"truncate text-[11px] font-medium\"\n [class]=\"captionClass()\"\n aria-hidden=\"true\"\n >{{ stateText() }}</span\n >\n }\n </span>\n <!-- The state is part of the accessible name (\"Milk, may contain\"), visible caption or not. -->\n <span class=\"sr-only\">, {{ stateText() }}</span>\n\n <!-- Non-colour mark: nothing / a check / a question mark. The slot keeps its width in every\n state so the chip never shifts when cycled. -->\n <span\n class=\"grid shrink-0 place-items-center\"\n [class]=\"size() === 'sm' ? 'h-4 w-4' : 'h-5 w-5'\"\n aria-hidden=\"true\"\n >\n @switch (value()) {\n @case ('contains') {\n <sds-icon name=\"check\" [size]=\"size() === 'sm' ? 14 : 18\" [strokeWidth]=\"3\" />\n }\n @case ('may-contain') {\n <sds-icon name=\"circle-help\" [size]=\"size() === 'sm' ? 15 : 19\" />\n }\n }\n </span>\n </button>\n\n @if (hint()) {\n <span [id]=\"chipId + '-hint'\" class=\"sr-only\">{{ hint() }}</span>\n }\n <span class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">{{ announcement() }}</span>\n `,\n})\nexport class SdsTriStateChip {\n protected readonly chipId = `sds-tri-state-chip-${nextId++}`;\n\n /** Current state. Two-way: `[(value)]`. */\n readonly value = model<SdsTriState>('none');\n /** Visible name (e.g. the allergen). Required — the chip has no other accessible name. */\n readonly label = input.required<string>();\n /** Optional leading registry icon, e.g. an `allergen-*` pictogram. */\n readonly icon = input<SdsIconName | null>(null);\n readonly size = input<SdsTriStateChipSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Show the state as a small visible caption under the label. */\n readonly showState = input(true, { transform: booleanAttribute });\n\n /** State text for `none` (visible caption and spoken). */\n readonly noneLabel = input<string>('Not present');\n /** State text for `contains`. */\n readonly containsLabel = input<string>('Contains');\n /** State text for `may-contain`. */\n readonly mayContainLabel = input<string>('May contain');\n /**\n * Optional usage hint read after the name, e.g. \"Press to change\". Off by default: a button that\n * announces its state and changes on activation is self-explanatory to most users.\n */\n readonly hint = input<string>('');\n\n /** Last user-driven change, spoken by the live region. Programmatic writes stay silent. */\n protected readonly announcement = signal('');\n\n protected readonly stateText = computed(() => this.textFor(this.value()));\n\n protected readonly chipClass = computed(() => {\n const sm = this.size() === 'sm';\n const base =\n 'relative flex w-full min-w-0 cursor-pointer select-none items-center rounded-control border-2 ' +\n 'text-left transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-brand-500 focus-visible:ring-offset-2 focus-visible:ring-offset-surface ' +\n 'disabled:cursor-not-allowed disabled:opacity-60 ' +\n (sm ? 'min-h-9 gap-2 px-2 py-1' : 'min-h-12 gap-2.5 px-3 py-2');\n switch (this.value()) {\n case 'contains':\n // Filled + solid thick border + check. In dark mode a monochrome brand-600 is a dim grey, so the\n // fill inverts to ink/surface (the same rule as sds-toggle-switch and sds-button primary).\n return (\n `${base} border-brand-600 bg-brand-600 text-white ` +\n 'dark:border-ink dark:bg-ink dark:text-surface hover:bg-brand-700 dark:hover:bg-ink-soft'\n );\n case 'may-contain':\n // Unfilled + DASHED thick border + question mark.\n return (\n `${base} border-dashed border-brand-600 bg-brand-50 text-ink ` +\n 'dark:border-ink-soft dark:bg-muted hover:bg-brand-100 dark:hover:bg-surface'\n );\n default:\n return `${base} border-border bg-surface text-ink-soft hover:border-ink-faint hover:text-ink`;\n }\n });\n\n protected readonly captionClass = computed(() => {\n switch (this.value()) {\n case 'contains':\n return 'text-white/85 dark:text-surface/85';\n case 'may-contain':\n return 'text-ink-soft';\n default:\n return 'text-ink-faint';\n }\n });\n\n protected onClick(event: MouseEvent): void {\n if (this.disabled()) return;\n // A real Shift+click steps back too; keyboard activation is handled in onKeydown.\n this.step(event.shiftKey ? -1 : 1);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n if ((event.key === 'Enter' || event.key === ' ') && event.shiftKey) {\n // Handle it here so the native button click (always \"forward\") does not also fire.\n event.preventDefault();\n this.step(-1);\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n event.preventDefault();\n this.set('none');\n }\n }\n\n private step(delta: 1 | -1): void {\n const i = ORDER.indexOf(this.value());\n const next = ORDER[(Math.max(0, i) + delta + ORDER.length) % ORDER.length];\n this.set(next);\n }\n\n private set(next: SdsTriState): void {\n if (next === this.value()) return;\n this.value.set(next);\n this.announcement.set(`${this.label()}: ${this.textFor(next)}`);\n }\n\n private textFor(state: SdsTriState): string {\n switch (state) {\n case 'contains':\n return this.containsLabel();\n case 'may-contain':\n return this.mayContainLabel();\n default:\n return this.noneLabel();\n }\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** One segment. A bare string/number option is used as both value and label. */\nexport interface SdsSegmentedOption<T = unknown> {\n value: T;\n label: string;\n icon?: SdsIconName;\n disabled?: boolean;\n}\n\nexport type SdsSegmentedSize = 'sm' | 'md';\n\ninterface NormSegment {\n value: unknown;\n label: string;\n icon: SdsIconName | null;\n disabled: boolean;\n}\n\nlet nextId = 0;\n\n/**\n * Segmented control: a small set of mutually exclusive options shown side by side (e.g. \"Pick exactly /\n * at least / up to\"). Radio-group semantics: `role=\"radiogroup\"` with `role=\"radio\"` segments, one tab\n * stop, and the arrow keys (with Home/End) move AND select, like native radios. Disabled segments are\n * skipped.\n *\n * The value is a two-way `model` — bind `[(value)]`. Give the group a name with [ariaLabel] (or\n * [ariaLabelledby]); with [iconOnly] each segment keeps its label as its accessible name.\n *\n * @example\n * <sds-segmented ariaLabel=\"Rule\" [options]=\"[{ value: 'exactly', label: 'Exactly' }, { value: 'upTo', label: 'Up to' }]\"\n * [(value)]=\"rule\" />\n */\n@Component({\n selector: 'sds-segmented',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'inline-flex max-w-full', '[class.w-full]': 'fullWidth()' },\n template: `\n <div\n role=\"radiogroup\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n class=\"flex max-w-full items-stretch gap-0.5 overflow-x-auto rounded-control border border-border bg-muted p-0.5\"\n [class.w-full]=\"fullWidth()\"\n (keydown)=\"onKeydown($event)\"\n >\n @for (seg of segments(); track $index; let i = $index) {\n <button\n type=\"button\"\n role=\"radio\"\n [id]=\"segmentId(i)\"\n [attr.aria-checked]=\"isSelected(seg)\"\n [attr.aria-label]=\"iconOnly() ? seg.label : null\"\n [attr.title]=\"iconOnly() ? seg.label : null\"\n [attr.tabindex]=\"i === tabStop() ? 0 : -1\"\n [attr.data-index]=\"i\"\n [disabled]=\"disabled() || seg.disabled\"\n [class]=\"segmentClass(seg)\"\n (click)=\"choose(i)\"\n >\n @if (seg.icon) {\n <sds-icon [name]=\"seg.icon\" [size]=\"size() === 'sm' ? 15 : 17\" class=\"shrink-0\" />\n }\n @if (!iconOnly()) {\n <span class=\"truncate\">{{ seg.label }}</span>\n }\n </button>\n }\n </div>\n `,\n})\nexport class SdsSegmented {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly baseId = `sds-segmented-${nextId++}`;\n\n /** Options: `{ value, label, icon?, disabled? }` objects, or bare strings/numbers. */\n readonly options = input<readonly (SdsSegmentedOption | string | number)[]>([]);\n /** Selected value. Two-way: `[(value)]`. */\n readonly value = model<unknown>(null);\n readonly size = input<SdsSegmentedSize>('md');\n /** Accessible name of the group. */\n readonly ariaLabel = input<string>('');\n /** Id of an element that names the group (alternative to [ariaLabel]). */\n readonly ariaLabelledby = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Stretch to the container width, segments sharing it equally. */\n readonly fullWidth = input(false, { transform: booleanAttribute });\n /** Show icons only; labels stay as accessible names and tooltips. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n protected readonly segments = computed<NormSegment[]>(() =>\n this.options().map((o) =>\n o !== null && typeof o === 'object'\n ? { value: o.value, label: o.label, icon: o.icon ?? null, disabled: !!o.disabled }\n : { value: o, label: String(o), icon: null, disabled: false },\n ),\n );\n\n private readonly selectedIndex = computed(() =>\n this.segments().findIndex((s) => s.value === this.value()),\n );\n\n /** Roving tab stop: the selected segment, else the first enabled one. */\n protected readonly tabStop = computed(() => {\n const sel = this.selectedIndex();\n if (sel >= 0 && !this.segments()[sel].disabled) return sel;\n return this.segments().findIndex((s) => !s.disabled);\n });\n\n protected isSelected(seg: NormSegment): boolean {\n return seg.value === this.value();\n }\n\n protected segmentId(i: number): string {\n return `${this.baseId}-${i}`;\n }\n\n protected segmentClass(seg: NormSegment): string {\n const sm = this.size() === 'sm';\n const base =\n 'inline-flex min-w-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-control)-2px)] ' +\n 'font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 ' +\n 'disabled:cursor-not-allowed disabled:opacity-50 ' +\n (sm ? 'h-7 px-2.5 text-xs' : 'h-8 px-3.5 text-sm') +\n (this.fullWidth() ? ' flex-1' : '') +\n (this.iconOnly() ? (sm ? ' w-8 px-0' : ' w-9 px-0') : '');\n // Selected: raised surface, ring and bold text — more than a tint, so it reads in greyscale too.\n return this.isSelected(seg)\n ? `${base} bg-surface font-semibold text-ink shadow-sm ring-1 ring-border dark:bg-border`\n : `${base} cursor-pointer text-ink-soft hover:bg-surface/60 hover:text-ink`;\n }\n\n protected choose(i: number): void {\n const seg = this.segments()[i];\n if (!seg || seg.disabled || this.disabled()) return;\n this.value.set(seg.value);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const segs = this.segments();\n if (!segs.length) return;\n const current = Number((event.target as HTMLElement).dataset['index'] ?? this.tabStop());\n let next: number | null = null;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = this.step(current, 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = this.step(current, -1);\n break;\n case 'Home':\n next = segs.findIndex((s) => !s.disabled);\n break;\n case 'End':\n for (let i = segs.length - 1; i >= 0; i--) {\n if (!segs[i].disabled) {\n next = i;\n break;\n }\n }\n break;\n default:\n return;\n }\n event.preventDefault();\n if (next === null || next < 0) return;\n this.choose(next);\n this.host.nativeElement.querySelector<HTMLElement>(`#${this.segmentId(next)}`)?.focus();\n }\n\n private step(from: number, delta: 1 | -1): number | null {\n const segs = this.segments();\n let i = from;\n for (let n = 0; n < segs.length; n++) {\n i = (i + delta + segs.length) % segs.length;\n if (!segs[i].disabled) return i;\n }\n return null;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** Severity of a checklist row. `blocker` stops customers, `warning` costs sales, `info` is polish. */\nexport type SdsChecklistStatus = 'done' | 'warning' | 'blocker' | 'info';\n\ninterface StatusStyle {\n icon: SdsIconName;\n tile: string;\n label: string;\n}\n\n/**\n * Each status has its own glyph SHAPE (circle-check, triangle, octagon, circle-i) as well as its own\n * tint, so the row still reads in greyscale or for a colour-blind reader. `label` is the English\n * default of the spoken status; override it with [statusLabel].\n */\nconst STATUS: Record<SdsChecklistStatus, StatusStyle> = {\n done: { icon: 'check-circle', tile: 'bg-accent-green-soft text-accent-green', label: 'Done' },\n warning: { icon: 'triangle-alert', tile: 'bg-accent-amber-soft text-accent-amber', label: 'Warning' },\n blocker: { icon: 'octagon-x', tile: 'bg-accent-red-soft text-accent-red', label: 'Blocking' },\n info: { icon: 'info', tile: 'bg-muted text-ink-soft', label: 'Info' },\n};\n\n/**\n * One line of a readiness checklist or health report: a status glyph, a title, an optional\n * description, an optional count pill and an action (a projected `[sdsChecklistAction]` element, or\n * the built-in button from [actionLabel] that emits `(action)`).\n *\n * The status is announced as text before the title (\"Blocking: 3 items have no price\"), never by\n * colour alone. Put rows in a list for screen readers: `<ul role=\"list\">` with each row wrapped in\n * an `<li>`, or give the container `role=\"list\"` and each row `role=\"listitem\"`.\n *\n * @example\n * <sds-checklist-row status=\"blocker\" title=\"3 items have no price\" description=\"Customers can't order them.\"\n * [count]=\"3\" actionLabel=\"Fix\" (action)=\"openFilter('no-price')\" />\n */\n@Component({\n selector: 'sds-checklist-row',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n class=\"flex items-start gap-3 rounded-control px-3 py-3\"\n [class.opacity-80]=\"status() === 'done'\"\n [attr.data-status]=\"status()\"\n >\n <span\n class=\"mt-0.5 grid h-8 w-8 shrink-0 place-items-center rounded-full\"\n [class]=\"style().tile\"\n aria-hidden=\"true\"\n >\n <sds-icon [name]=\"style().icon\" [size]=\"18\" />\n </span>\n\n <div class=\"min-w-0 flex-1\">\n <p class=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm font-semibold text-ink\">\n <span class=\"sr-only\">{{ resolvedStatusLabel() }}:</span>\n <span [class.line-through]=\"status() === 'done' && strikeDone()\">{{ title() }}</span>\n @if (count() !== null) {\n <span\n class=\"inline-flex min-w-6 items-center justify-center rounded-full border border-border bg-muted px-1.5 text-xs font-semibold tabular-nums text-ink-soft\"\n aria-hidden=\"true\"\n >{{ count() }}</span\n >\n <span class=\"sr-only\">({{ countText() }})</span>\n }\n </p>\n @if (description()) {\n <p class=\"mt-0.5 text-sm text-ink-soft\">{{ description() }}</p>\n }\n <ng-content />\n </div>\n\n <div class=\"flex shrink-0 items-center gap-2 self-center\">\n <ng-content select=\"[sdsChecklistAction]\" />\n @if (actionLabel()) {\n <button\n type=\"button\"\n class=\"inline-flex h-9 items-center gap-1.5 rounded-control border border-border bg-surface px-3 text-sm font-semibold text-ink transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n [attr.aria-label]=\"actionAriaLabel() || null\"\n (click)=\"action.emit()\"\n >\n {{ actionLabel() }}\n <sds-icon name=\"chevron-right\" [size]=\"16\" class=\"text-ink-faint\" />\n </button>\n }\n </div>\n </div>\n `,\n})\nexport class SdsChecklistRow {\n readonly status = input<SdsChecklistStatus>('info');\n readonly title = input.required<string>();\n readonly description = input<string>('');\n /** Optional number of affected things, shown as a pill after the title. Null hides it. */\n readonly count = input<number | null>(null);\n /**\n * Accessible text for the count pill; `{count}` is replaced. Default `'{count} items'` — pass a\n * translated one.\n */\n readonly countLabel = input<string>('{count} items');\n /** Spoken status prefix. Defaults per status: Done · Warning · Blocking · Info (English). */\n readonly statusLabel = input<string>('');\n /** Label of the built-in action button. Empty hides it (project `[sdsChecklistAction]` instead). */\n readonly actionLabel = input<string>('');\n /**\n * Full accessible name for the action button when its visible label is terse (\"Fix\") — e.g.\n * \"Fix: 3 items have no price\".\n */\n readonly actionAriaLabel = input<string>('');\n /** Strike the title through when the row is done. */\n readonly strikeDone = input(false, { transform: booleanAttribute });\n\n /** Emitted when the built-in action button is pressed. */\n readonly action = output<void>();\n\n protected readonly style = computed(() => STATUS[this.status()] ?? STATUS.info);\n protected readonly resolvedStatusLabel = computed(\n () => this.statusLabel() || this.style().label,\n );\n protected readonly countText = computed(() =>\n this.countLabel().replace('{count}', String(this.count() ?? '')),\n );\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsScoreVariant = 'ring' | 'bar';\nexport type SdsScoreSize = 'sm' | 'md' | 'lg';\n/** Tier the value falls in, from the [fairFrom] / [goodFrom] thresholds. */\nexport type SdsScoreTier = 'poor' | 'fair' | 'good';\n\ninterface TierStyle {\n icon: SdsIconName;\n text: string;\n stroke: string;\n fill: string;\n}\n\nconst TIERS: Record<SdsScoreTier, TierStyle> = {\n good: { icon: 'check-circle', text: 'text-accent-green', stroke: 'stroke-success', fill: 'bg-success' },\n fair: { icon: 'triangle-alert', text: 'text-accent-amber', stroke: 'stroke-warning', fill: 'bg-warning' },\n poor: { icon: 'octagon-x', text: 'text-accent-red', stroke: 'stroke-danger', fill: 'bg-danger' },\n};\n\nconst RING: Record<SdsScoreSize, { box: number; stroke: number; value: string; max: string }> = {\n sm: { box: 48, stroke: 5, value: 'text-sm', max: 'text-[9px]' },\n md: { box: 72, stroke: 7, value: 'text-xl', max: 'text-[10px]' },\n lg: { box: 96, stroke: 9, value: 'text-3xl', max: 'text-xs' },\n};\n\nconst BAR_H: Record<SdsScoreSize, string> = { sm: 'h-1.5', md: 'h-2', lg: 'h-3' };\n\n/**\n * A 0–100 score as a ring or a bar, tinted by tier (poor · fair · good). The tier is also written out\n * in words with its own glyph, and the whole thing is a `role=\"meter\"` with a spoken value text — so\n * the score is never conveyed by colour alone.\n *\n * @example\n * <sds-score [value]=\"64\" label=\"Menu health\" />\n * <sds-score [value]=\"health()\" variant=\"bar\" label=\"Menu health\" goodLabel=\"Great\" />\n */\n@Component({\n selector: 'sds-score',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n role=\"meter\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"clamped()\"\n [attr.aria-valuetext]=\"valueText()\"\n [attr.aria-label]=\"label() || null\"\n [attr.data-tier]=\"tier()\"\n >\n @if (variant() === 'ring') {\n <div class=\"flex items-center gap-3\" aria-hidden=\"true\">\n <div class=\"relative shrink-0\" [style.width.px]=\"ring().box\" [style.height.px]=\"ring().box\">\n <svg [attr.viewBox]=\"'0 0 ' + ring().box + ' ' + ring().box\" class=\"-rotate-90\" width=\"100%\" height=\"100%\">\n <circle\n [attr.cx]=\"ring().box / 2\"\n [attr.cy]=\"ring().box / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n class=\"stroke-border\"\n [attr.stroke-width]=\"ring().stroke\"\n />\n <circle\n [attr.cx]=\"ring().box / 2\"\n [attr.cy]=\"ring().box / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n class=\"transition-[stroke-dashoffset] duration-500\"\n [class]=\"tierStyle().stroke\"\n [attr.stroke-width]=\"ring().stroke\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"dashOffset()\"\n />\n </svg>\n <div class=\"absolute inset-0 flex flex-col items-center justify-center leading-none\">\n <span class=\"font-extrabold tabular-nums text-ink\" [class]=\"ring().value\">{{ clamped() }}</span>\n @if (size() !== 'sm') {\n <span class=\"mt-0.5 font-medium text-ink-faint\" [class]=\"ring().max\">/100</span>\n }\n </div>\n </div>\n @if (label() || showTier()) {\n <div class=\"min-w-0\">\n @if (label()) {\n <p class=\"truncate text-sm font-semibold text-ink\">{{ label() }}</p>\n }\n @if (showTier()) {\n <p class=\"mt-0.5 flex items-center gap-1 text-sm font-medium\" [class]=\"tierStyle().text\">\n <sds-icon [name]=\"tierStyle().icon\" [size]=\"15\" />\n {{ tierText() }}\n </p>\n }\n </div>\n }\n </div>\n } @else {\n <div aria-hidden=\"true\">\n <div class=\"mb-1.5 flex items-baseline justify-between gap-3\">\n <span class=\"truncate text-sm font-semibold text-ink\">{{ label() }}</span>\n <span class=\"flex shrink-0 items-center gap-1.5 text-sm\">\n <span class=\"font-bold tabular-nums text-ink\">{{ clamped() }}<span class=\"text-ink-faint\">/100</span></span>\n @if (showTier()) {\n <span class=\"flex items-center gap-1 font-medium\" [class]=\"tierStyle().text\">\n <sds-icon [name]=\"tierStyle().icon\" [size]=\"14\" />\n {{ tierText() }}\n </span>\n }\n </span>\n </div>\n <div class=\"w-full overflow-hidden rounded-full bg-border\" [class]=\"barHeight()\">\n <div\n class=\"h-full rounded-full transition-[width] duration-500\"\n [class]=\"tierStyle().fill\"\n [style.width.%]=\"clamped()\"\n ></div>\n </div>\n </div>\n }\n </div>\n `,\n})\nexport class SdsScore {\n /** The score, 0–100 (clamped; non-numbers read as 0). */\n readonly value = input(0, { transform: numberAttribute });\n readonly variant = input<SdsScoreVariant>('ring');\n readonly size = input<SdsScoreSize>('md');\n /** Visible caption and the meter's accessible name, e.g. \"Menu health\". */\n readonly label = input<string>('');\n /** Show the tier in words (with its glyph). */\n readonly showTier = input(true, { transform: booleanAttribute });\n /** Lowest value that counts as `fair`. */\n readonly fairFrom = input(50, { transform: numberAttribute });\n /** Lowest value that counts as `good`. */\n readonly goodFrom = input(80, { transform: numberAttribute });\n readonly poorLabel = input<string>('Needs work');\n readonly fairLabel = input<string>('Fair');\n readonly goodLabel = input<string>('Good');\n /** Spoken value; tokens `{value}` and `{tier}`. */\n readonly valueTextTemplate = input<string>('{value} out of 100, {tier}');\n\n protected readonly clamped = computed(() => {\n const v = this.value();\n return Number.isFinite(v) ? Math.round(Math.min(100, Math.max(0, v))) : 0;\n });\n\n readonly tier = computed<SdsScoreTier>(() => {\n const v = this.clamped();\n if (v >= this.goodFrom()) return 'good';\n if (v >= this.fairFrom()) return 'fair';\n return 'poor';\n });\n\n protected readonly tierStyle = computed(() => TIERS[this.tier()]);\n protected readonly tierText = computed(() =>\n this.tier() === 'good' ? this.goodLabel() : this.tier() === 'fair' ? this.fairLabel() : this.poorLabel(),\n );\n protected readonly valueText = computed(() =>\n this.valueTextTemplate()\n .replace('{value}', String(this.clamped()))\n .replace('{tier}', this.tierText()),\n );\n\n protected readonly ring = computed(() => RING[this.size()]);\n protected readonly radius = computed(() => (this.ring().box - this.ring().stroke) / 2);\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\n protected readonly dashOffset = computed(\n () => this.circumference() * (1 - this.clamped() / 100),\n );\n protected readonly barHeight = computed(() => BAR_H[this.size()]);\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** Availability of the thing a tile stands for (a menu item on the kitchen stock board). */\nexport type SdsStatusTileState = 'available' | 'sold-out' | 'hidden';\n\ninterface StateStyle {\n icon: SdsIconName;\n frame: string;\n badge: string;\n}\n\nconst STATES: Record<SdsStatusTileState, StateStyle> = {\n available: {\n icon: 'check-circle',\n frame: 'border-border bg-surface',\n badge: 'bg-accent-green-soft text-accent-green',\n },\n 'sold-out': {\n icon: 'ban',\n frame: 'border-danger bg-accent-red-soft',\n badge: 'bg-danger text-white',\n },\n hidden: {\n icon: 'eye-off',\n frame: 'border-dashed border-ink-faint bg-muted',\n badge: 'bg-ink/10 text-ink-soft',\n },\n};\n\n/**\n * Touch-first square tile for a stock board: a big press target (the whole tile) with a title,\n * optional subtitle, optional photo and a state — available · sold out · hidden.\n *\n * The state is never colour-only: each has its own glyph and word in a badge (check / \"Available\",\n * a no-entry sign / \"Sold out\", a crossed eye / \"Hidden\"), sold-out tiles get a diagonal hatch and a\n * struck-through title, hidden tiles a dashed frame. Pressing gives a visible pressed state.\n *\n * The tile is one `<button>` that emits `(activate)`. Pass [selected] (true/false) to make it a toggle\n * for multi-select (\"select all matches\"): it then carries `aria-pressed` and a corner check. [busy]\n * shows a spinner and sets `aria-busy` while a save is in flight.\n *\n * @example\n * <sds-status-tile title=\"Bacon\" subtitle=\"Extras\" state=\"sold-out\" note=\"Back at 22:00\"\n * soldOutLabel=\"Sold out\" (activate)=\"toggle(item)\" />\n */\n@Component({\n selector: 'sds-status-tile',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <button\n type=\"button\"\n [class]=\"tileClass()\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"selected() === null ? null : selected()\"\n [attr.aria-busy]=\"busy() ? 'true' : null\"\n [attr.data-state]=\"state()\"\n [style.background-image]=\"hatch()\"\n (click)=\"activate.emit()\"\n >\n @if (image()) {\n <span class=\"relative block h-[45%] w-full shrink-0 overflow-hidden bg-muted\">\n <img\n [src]=\"image()\"\n [alt]=\"imageAlt()\"\n class=\"h-full w-full object-cover\"\n [class.grayscale]=\"state() !== 'available'\"\n [class.opacity-60]=\"state() !== 'available'\"\n loading=\"lazy\"\n draggable=\"false\"\n />\n </span>\n }\n\n <span class=\"flex min-h-0 w-full flex-1 flex-col gap-1 p-3 text-left\">\n <span\n class=\"line-clamp-2 break-words font-bold leading-tight text-ink\"\n [class]=\"image() ? 'text-base' : 'text-lg'\"\n [class.line-through]=\"state() === 'sold-out'\"\n [class.decoration-2]=\"state() === 'sold-out'\"\n >{{ title() }}</span\n >\n @if (subtitle()) {\n <span class=\"truncate text-xs text-ink-soft\">{{ subtitle() }}</span>\n }\n\n <span class=\"mt-auto flex flex-wrap items-center gap-1.5 pt-1\">\n <span\n class=\"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-bold\"\n [class]=\"style().badge\"\n >\n <sds-icon [name]=\"style().icon\" [size]=\"14\" [strokeWidth]=\"2.5\" />\n {{ stateText() }}\n </span>\n @if (note()) {\n <span class=\"truncate text-xs font-medium text-ink-soft\">{{ note() }}</span>\n }\n </span>\n </span>\n\n @if (selected()) {\n <span\n class=\"absolute right-2 top-2 grid h-7 w-7 place-items-center rounded-full bg-brand-600 text-white shadow ring-2 ring-surface dark:bg-ink dark:text-surface\"\n aria-hidden=\"true\"\n >\n <sds-icon name=\"check\" [size]=\"16\" [strokeWidth]=\"3\" />\n </span>\n } @else if (selected() === false) {\n <span\n class=\"absolute right-2 top-2 h-7 w-7 rounded-full border-2 border-ink-faint bg-surface/80\"\n aria-hidden=\"true\"\n ></span>\n }\n\n @if (busy()) {\n <span class=\"absolute inset-0 grid place-items-center bg-surface/60\" aria-hidden=\"true\">\n <span class=\"h-7 w-7 animate-spin rounded-full border-2 border-brand-200 border-t-brand-600\"></span>\n </span>\n }\n </button>\n `,\n})\nexport class SdsStatusTile {\n readonly title = input.required<string>();\n readonly subtitle = input<string>('');\n /** Optional photo URL, shown across the top of the tile. */\n readonly image = input<string | null>(null);\n /** Alt text for the photo. Empty (default) marks it decorative — the title already names the tile. */\n readonly imageAlt = input<string>('');\n readonly state = input<SdsStatusTileState>('available');\n /** Short extra line next to the state, e.g. \"Back at 22:00\". */\n readonly note = input<string>('');\n /** `null` (default): a plain action tile. `true`/`false`: a toggle for multi-select (`aria-pressed`). */\n readonly selected = input<boolean | null>(null);\n /** A save is in flight: spinner + `aria-busy`. */\n readonly busy = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly availableLabel = input<string>('Available');\n readonly soldOutLabel = input<string>('Sold out');\n readonly hiddenLabel = input<string>('Hidden');\n\n /** The tile was pressed (click, tap, Enter or Space). */\n readonly activate = output<void>();\n\n protected readonly style = computed(() => STATES[this.state()] ?? STATES.available);\n\n protected readonly stateText = computed(() => {\n switch (this.state()) {\n case 'sold-out':\n return this.soldOutLabel();\n case 'hidden':\n return this.hiddenLabel();\n default:\n return this.availableLabel();\n }\n });\n\n /** Diagonal hatch on sold-out tiles — a pattern cue on top of the colour. */\n protected readonly hatch = computed(() =>\n this.state() === 'sold-out'\n ? 'repeating-linear-gradient(135deg, transparent 0 12px, color-mix(in srgb, var(--color-danger) 10%, transparent) 12px 24px)'\n : null,\n );\n\n protected readonly tileClass = computed(() => {\n const ring = this.selected()\n ? ' ring-2 ring-brand-500 ring-offset-2 ring-offset-canvas dark:ring-ink'\n : '';\n return (\n 'relative flex aspect-square w-full min-h-32 cursor-pointer select-none flex-col overflow-hidden ' +\n 'rounded-card border-2 text-left shadow-sm transition-[transform,box-shadow] duration-100 ' +\n 'hover:shadow-md active:scale-[0.97] active:shadow-none focus-visible:outline-none ' +\n 'focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-canvas disabled:cursor-not-allowed disabled:opacity-60 ' +\n 'touch-manipulation ' +\n this.style().frame +\n (this.state() === 'hidden' ? ' opacity-80' : '') +\n ring\n );\n });\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n OnDestroy,\n output,\n untracked,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** An actionable row. */\nexport interface SdsMenuAction {\n /** Optional stable id, handy in the `(select)` handler. */\n id?: string;\n label: string;\n /** Second line under the label (e.g. \"Back at 22:00\"). */\n description?: string;\n icon?: SdsIconName;\n /** Destructive action (delete, hide…): drawn in the danger colour. */\n danger?: boolean;\n disabled?: boolean;\n}\n\n/** A divider between groups of actions. */\nexport interface SdsMenuSeparator {\n separator: true;\n}\n\nexport type SdsMenuEntry = SdsMenuAction | SdsMenuSeparator;\nexport type SdsMenuAlign = 'start' | 'end';\n\nlet nextId = 0;\n\n/**\n * Marks the element inside `<sds-menu>` that opens it. It may be a native button or a component that\n * renders one (e.g. `<sds-button sdsMenuTrigger>`): the menu wires `aria-haspopup`, `aria-expanded` and\n * `aria-controls` onto the first focusable element it finds there.\n */\n@Directive({\n selector: '[sdsMenuTrigger]',\n standalone: true,\n})\nexport class SdsMenuTrigger {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n\n/**\n * Action menu (menu button + popover). The panel is appended to `<body>` and positioned against the\n * trigger, flipping above it when there is no room below — so it is never clipped by a drawer, a dialog\n * or a scrolling table, and it sits above them (z 1100).\n *\n * Items come from [items]: actions (`{ label, description?, icon?, danger?, disabled? }`) and\n * `{ separator: true }` dividers. Activating one emits `(select)` with it and closes the menu.\n *\n * Trigger: project your own element marked `sdsMenuTrigger`, or let the menu render a compact icon\n * button (`triggerIcon`, default a horizontal ellipsis) named by [triggerLabel].\n *\n * Keyboard (WAI-ARIA menu button): Enter / Space / ArrowDown open on the first item, ArrowUp on the\n * last; ArrowUp/Down move (wrapping, skipping disabled items), Home/End jump, a letter jumps to the next\n * item starting with it, Enter/Space activate. **Escape closes only the menu** — the key event is\n * stopped, so an enclosing drawer or dialog stays open — and focus returns to the trigger. Tab closes it\n * too. A click outside closes it.\n *\n * @example\n * <sds-menu [items]=\"[{ id: 'sold', label: 'Mark sold out', icon: 'ban' }, { separator: true },\n * { id: 'del', label: 'Delete', icon: 'trash-2', danger: true }]\"\n * triggerLabel=\"Item actions\" (select)=\"onAction($event)\" />\n *\n * @example\n * <sds-menu [items]=\"durations\" (select)=\"snooze($event)\">\n * <sds-button sdsMenuTrigger variant=\"secondary\">Mark sold out</sds-button>\n * </sds-menu>\n */\n@Component({\n selector: 'sds-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'relative inline-flex',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n <span\n #slot\n class=\"inline-flex\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <ng-content select=\"[sdsMenuTrigger]\" />\n @if (!projectedTrigger()) {\n <button\n type=\"button\"\n [id]=\"triggerId\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center gap-1.5 rounded-control px-2 text-sm font-medium text-ink-soft transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-50\"\n [class.bg-muted]=\"open()\"\n [attr.aria-label]=\"triggerText() ? null : triggerLabel()\"\n [disabled]=\"disabled()\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? menuId : null\"\n >\n <sds-icon [name]=\"triggerIcon()\" [size]=\"18\" />\n @if (triggerText()) {\n <span>{{ triggerText() }}</span>\n }\n </button>\n }\n </span>\n\n @if (open()) {\n <div\n data-sds-menu-panel\n role=\"menu\"\n [id]=\"menuId\"\n [attr.aria-label]=\"ariaLabel() || null\"\n class=\"fixed z-[1100] min-w-52 max-w-80 overflow-y-auto rounded-card border border-border bg-surface py-1.5 shadow-xl outline-none animate-sds-menu\"\n [style.max-height]=\"'min(24rem, calc(100vh - 16px))'\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (entry of items(); track $index; let i = $index) {\n @if (isSeparator(entry)) {\n <div role=\"separator\" class=\"my-1.5 border-t border-border\"></div>\n } @else {\n <button\n type=\"button\"\n role=\"menuitem\"\n tabindex=\"-1\"\n [attr.data-index]=\"i\"\n [attr.aria-disabled]=\"entry.disabled ? 'true' : null\"\n [attr.aria-describedby]=\"entry.description ? descId(i) : null\"\n [class]=\"itemClass(entry)\"\n (click)=\"activate(entry, $event)\"\n (mouseenter)=\"entry.disabled ? null : focusIndex(i)\"\n >\n @if (entry.icon) {\n <sds-icon [name]=\"entry.icon\" [size]=\"18\" class=\"mt-px shrink-0\" />\n }\n <span class=\"min-w-0 flex-1 text-left\">\n <span class=\"block truncate text-sm font-medium\">{{ entry.label }}</span>\n @if (entry.description) {\n <span\n [id]=\"descId(i)\"\n class=\"mt-0.5 block text-xs\"\n [class]=\"entry.danger ? 'text-danger/80' : 'text-ink-faint'\"\n >{{ entry.description }}</span\n >\n }\n </span>\n </button>\n }\n }\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-menu {\n animation: sds-menu-pop 0.12s ease-out;\n }\n @keyframes sds-menu-pop {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-menu {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsMenu implements OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly menuId = `sds-menu-${nextId++}`;\n protected readonly triggerId = `${this.menuId}-trigger`;\n\n /** Actions and separators, in order. */\n readonly items = input<readonly SdsMenuEntry[]>([]);\n /** Open state. Two-way: `[(open)]` — set it to open the menu from code. */\n readonly open = model(false);\n /** Which edge of the trigger the panel lines up with. */\n readonly align = input<SdsMenuAlign>('start');\n /** Accessible name of the built-in icon trigger (required when there is no [triggerText]). */\n readonly triggerLabel = input<string>('More actions');\n /** Icon of the built-in trigger. */\n readonly triggerIcon = input<SdsIconName>('ellipsis');\n /** Optional visible text on the built-in trigger (then it is its name). */\n readonly triggerText = input<string>('');\n /** Accessible name of the menu itself; defaults to the trigger's name. */\n readonly ariaLabel = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Keep the menu open after an item is activated (e.g. toggles). */\n readonly keepOpen = input(false, { transform: booleanAttribute });\n\n /** An action was activated. */\n readonly select = output<SdsMenuAction>();\n\n protected readonly projectedTrigger = contentChild(SdsMenuTrigger);\n\n private panelEl: HTMLElement | null = null;\n /** Which item gets focus when the panel opens: 'first' | 'last' | 'none'. */\n private focusOnOpen: 'first' | 'last' = 'first';\n private typeBuffer = '';\n private typeTimer?: ReturnType<typeof setTimeout>;\n\n private readonly enabledIndexes = computed(() =>\n this.items()\n .map((e, i) => (this.isSeparator(e) || e.disabled ? -1 : i))\n .filter((i) => i >= 0),\n );\n\n constructor() {\n // Wire ARIA onto a projected trigger's focusable element (the built-in one binds it in the template).\n effect(() => {\n const isOpen = this.open();\n const trigger = this.projectedTrigger();\n if (!trigger) return;\n const el = this.findFocusable(trigger.el.nativeElement);\n if (!el) return;\n if (!el.id) el.id = this.triggerId;\n el.setAttribute('aria-haspopup', 'menu');\n el.setAttribute('aria-expanded', String(isOpen));\n if (isOpen) el.setAttribute('aria-controls', this.menuId);\n else el.removeAttribute('aria-controls');\n });\n\n // Open/close side effects: move the panel to <body>, position it, focus an item; clean up on close.\n effect(() => {\n if (this.open()) {\n untracked(() =>\n afterNextRender(() => this.afterOpen(), { injector: this.injector }),\n );\n } else {\n untracked(() => this.teardown());\n }\n });\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.typeTimer);\n this.teardown();\n }\n\n // --- helpers ----------------------------------------------------------------\n protected isSeparator(entry: SdsMenuEntry): entry is SdsMenuSeparator {\n return (entry as SdsMenuSeparator).separator === true;\n }\n\n protected descId(i: number): string {\n return `${this.menuId}-desc-${i}`;\n }\n\n protected itemClass(entry: SdsMenuAction): string {\n const base =\n 'flex w-full items-start gap-3 px-3.5 py-2 text-left transition-colors outline-none ' +\n 'focus-visible:ring-2 focus-visible:ring-inset ';\n if (entry.disabled) return `${base} cursor-not-allowed text-ink-faint opacity-60`;\n return entry.danger\n ? `${base} cursor-pointer text-danger hover:bg-danger/10 focus:bg-danger/10 focus-visible:ring-danger/40`\n : `${base} cursor-pointer text-ink hover:bg-muted focus:bg-muted focus-visible:ring-brand-500/40`;\n }\n\n private findFocusable(root: HTMLElement): HTMLElement | null {\n if (root.matches('button, a[href], [tabindex]')) return root;\n return root.querySelector<HTMLElement>('button, a[href], [tabindex]:not([tabindex=\"-1\"])');\n }\n\n private triggerEl(): HTMLElement | null {\n const projected = this.projectedTrigger();\n if (projected) return this.findFocusable(projected.el.nativeElement);\n return this.host.nativeElement.querySelector<HTMLElement>(`#${this.triggerId}`);\n }\n\n private isTriggerDisabled(): boolean {\n const el = this.triggerEl();\n return this.disabled() || !!(el as HTMLButtonElement | null)?.disabled;\n }\n\n // --- open / close ---------------------------------------------------------\n private show(focus: 'first' | 'last'): void {\n if (this.isTriggerDisabled()) return;\n this.focusOnOpen = focus;\n if (this.open()) {\n this.focusItemAt(focus);\n return;\n }\n this.open.set(true);\n }\n\n /** Close the menu; with `returnFocus`, focus goes back to the trigger. */\n close(returnFocus = false): void {\n if (!this.open()) return;\n this.open.set(false);\n this.teardown();\n if (returnFocus) this.triggerEl()?.focus();\n }\n\n private afterOpen(): void {\n if (!this.open()) return;\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[data-sds-menu-panel]');\n if (!this.panelEl) return;\n if (this.panelEl.parentElement !== document.body) document.body.appendChild(this.panelEl);\n // Name the menu after its trigger unless an explicit [ariaLabel] was given.\n const trigger = this.triggerEl();\n if (!this.ariaLabel() && trigger?.id) this.panelEl.setAttribute('aria-labelledby', trigger.id);\n this.position();\n this.addReflowListeners();\n this.focusItemAt(this.focusOnOpen);\n }\n\n private teardown(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n }\n\n // --- trigger events -------------------------------------------------------\n protected onTriggerClick(event: MouseEvent): void {\n if (!(event.target as HTMLElement).closest('button, a, [tabindex]')) return;\n if (this.open()) this.close(false);\n else this.show('first');\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.show('first');\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.show('last');\n }\n }\n\n // --- menu keyboard --------------------------------------------------------\n protected onMenuKeydown(event: KeyboardEvent): void {\n const idx = this.enabledIndexes();\n const current = Number((document.activeElement as HTMLElement | null)?.dataset?.['index'] ?? -1);\n const pos = idx.indexOf(current);\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (idx.length) this.focusIndex(idx[(pos + 1 + idx.length) % idx.length]);\n return;\n case 'ArrowUp':\n event.preventDefault();\n if (idx.length) this.focusIndex(idx[pos <= 0 ? idx.length - 1 : pos - 1]);\n return;\n case 'Home':\n event.preventDefault();\n this.focusItemAt('first');\n return;\n case 'End':\n event.preventDefault();\n this.focusItemAt('last');\n return;\n case 'Escape':\n // Close ONLY the menu: stop the event so a drawer/dialog listening for Escape stays open.\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n this.close(true);\n return;\n case 'Tab':\n event.preventDefault();\n this.close(true);\n return;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const entry = this.items()[current];\n if (entry && !this.isSeparator(entry)) this.activate(entry);\n return;\n }\n default:\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.typeAhead(event.key, current);\n }\n }\n }\n\n private typeAhead(char: string, current: number): void {\n clearTimeout(this.typeTimer);\n this.typeBuffer += char.toLowerCase();\n // \"d\", \"d\", \"d\" cycles through the items starting with d; \"de\" narrows to \"Delete\".\n const repeated = [...this.typeBuffer].every((c) => c === this.typeBuffer[0]);\n const query = repeated ? this.typeBuffer[0] : this.typeBuffer;\n const items = this.items();\n const idx = this.enabledIndexes();\n const start = Math.max(0, idx.indexOf(current));\n const from = query.length === 1 ? start + 1 : start;\n const ordered = [...idx.slice(from), ...idx.slice(0, from)];\n const hit = ordered.find((i) =>\n (items[i] as SdsMenuAction).label.toLowerCase().startsWith(query),\n );\n if (hit !== undefined) this.focusIndex(hit);\n this.typeTimer = setTimeout(() => (this.typeBuffer = ''), 600);\n }\n\n protected focusIndex(i: number): void {\n this.panelEl?.querySelector<HTMLElement>(`[data-index=\"${i}\"]`)?.focus();\n }\n\n private focusItemAt(where: 'first' | 'last'): void {\n const idx = this.enabledIndexes();\n if (!idx.length) {\n this.panelEl?.focus();\n return;\n }\n this.focusIndex(where === 'first' ? idx[0] : idx[idx.length - 1]);\n }\n\n protected activate(entry: SdsMenuAction, event?: Event): void {\n event?.stopPropagation();\n if (entry.disabled) return;\n this.select.emit(entry);\n if (!this.keepOpen()) this.close(true);\n }\n\n // --- outside click ----------------------------------------------------------\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n if (this.host.nativeElement.contains(target)) return;\n if (this.panelEl?.contains(target)) return;\n this.close(false);\n }\n\n // --- positioning (body-appended, mirrors sds-select) ------------------------\n private readonly reflow = (): void => this.position();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private position(): void {\n const trigger = this.triggerEl();\n const panel = this.panelEl;\n if (!trigger || !panel) return;\n const r = trigger.getBoundingClientRect();\n const pw = panel.offsetWidth;\n const ph = panel.offsetHeight;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n top = Math.max(margin, Math.min(top, window.innerHeight - margin - ph));\n\n let left = this.align() === 'end' ? r.right - pw : r.left;\n left = Math.max(margin, Math.min(left, window.innerWidth - margin - pw));\n\n panel.style.top = `${Math.round(top)}px`;\n panel.style.left = `${Math.round(left)}px`;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\n/** Where the bar sits: pinned to the bottom (default) or top of its scroll container, or in flow. */\nexport type SdsBulkBarPosition = 'bottom' | 'top' | 'static';\n\n/**\n * Selection toolbar for bulk editing: \"N selected\", the actions the app projects, and a clear-selection\n * button. It shows only while something is selected (`count > 0`) and sticks to the bottom of its\n * scroll container by default, so it stays in reach while the list scrolls.\n *\n * A `role=\"toolbar\"` named by [ariaLabel]; the count sits in a polite live region that exists even\n * while the bar is hidden, so \"3 selected\" is announced as the selection changes. Every visible and\n * spoken string is an input (English defaults).\n *\n * @example\n * <sds-bulk-bar [count]=\"selected().length\" countLabel=\"{count} selected\" (clear)=\"selected.set([])\">\n * <sds-button size=\"sm\" variant=\"secondary\" (click)=\"bulkPrice()\">Change price</sds-button>\n * <sds-button size=\"sm\" variant=\"secondary\" (click)=\"bulkSoldOut()\">Mark sold out</sds-button>\n * </sds-bulk-bar>\n */\n@Component({\n selector: 'sds-bulk-bar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'block',\n '[class.sticky]': \"position() !== 'static' && count() > 0\",\n '[class.bottom-3]': \"position() === 'bottom'\",\n '[class.top-3]': \"position() === 'top'\",\n '[class.z-30]': \"position() !== 'static'\",\n },\n template: `\n <!-- Always present so screen readers hear the count change, including back to zero. -->\n <span class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">{{ count() > 0 ? countText() : '' }}</span>\n\n @if (count() > 0) {\n <div\n role=\"toolbar\"\n [attr.aria-label]=\"ariaLabel()\"\n class=\"flex flex-wrap items-center gap-x-3 gap-y-2 rounded-card border border-border bg-surface px-3 py-2 shadow-xl animate-sds-bulk\"\n >\n <span class=\"inline-flex items-center gap-2 pr-1 text-sm font-semibold text-ink\">\n <span\n class=\"inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-brand-600 px-1.5 text-xs font-bold tabular-nums text-white dark:bg-ink dark:text-surface\"\n >{{ count() }}</span\n >\n {{ countWords() }}\n </span>\n\n <span class=\"hidden h-6 w-px bg-border sm:block\" aria-hidden=\"true\"></span>\n\n <div class=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <ng-content />\n </div>\n\n <button\n type=\"button\"\n class=\"ml-auto inline-flex h-9 items-center gap-1.5 rounded-control px-2.5 text-sm font-medium text-ink-soft transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n (click)=\"clear.emit()\"\n >\n <sds-icon name=\"x\" [size]=\"16\" />\n <span>{{ clearLabel() }}</span>\n </button>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-bulk {\n animation: sds-bulk-in 0.16s ease-out;\n }\n @keyframes sds-bulk-in {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-bulk {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsBulkBar {\n /** Number of selected things. The bar is hidden at 0. */\n readonly count = input(0, { transform: numberAttribute });\n /** \"{count} selected\" — `{count}` is replaced. Pass a translated string. */\n readonly countLabel = input<string>('{count} selected');\n /** Text of the clear-selection button. */\n readonly clearLabel = input<string>('Clear selection');\n /** Accessible name of the toolbar. */\n readonly ariaLabel = input<string>('Bulk actions');\n readonly position = input<SdsBulkBarPosition>('bottom');\n\n /** The clear-selection button was pressed. */\n readonly clear = output<void>();\n\n protected readonly countText = computed(() =>\n this.countLabel().replace('{count}', String(this.count())),\n );\n\n /** The label without the number, shown next to the count pill (\"selected\"). */\n protected readonly countWords = computed(() =>\n this.countLabel().replace('{count}', '').replace(/\\s+/g, ' ').trim(),\n );\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n output,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\n/** Context handed to the item and handle templates. */\nexport interface SdsSortableItemContext<T = any> {\n /** The item — enables `let-item`. */\n $implicit: T;\n item: T;\n /** Zero-based position in the list. */\n index: number;\n /** True while this item is picked up (keyboard) or dragged (pointer). */\n grabbed: boolean;\n}\n\n/**\n * Template for one row's content inside `<sds-sortable-list>`.\n *\n * @example\n * <ng-template sdsSortableItem let-item let-i=\"index\">{{ item.name }}</ng-template>\n */\n@Directive({\n selector: 'ng-template[sdsSortableItem]',\n standalone: true,\n})\nexport class SdsSortableItem {\n readonly template = inject<TemplateRef<SdsSortableItemContext>>(TemplateRef);\n\n static ngTemplateContextGuard(_dir: SdsSortableItem, _ctx: unknown): _ctx is SdsSortableItemContext {\n return true;\n }\n}\n\n/**\n * Optional template for the drag handle's content (replaces the default grip icon). The handle itself\n * stays a library-owned button, so it keeps its accessible name and keyboard behaviour.\n */\n@Directive({\n selector: 'ng-template[sdsSortableHandle]',\n standalone: true,\n})\nexport class SdsSortableHandle {\n readonly template = inject<TemplateRef<SdsSortableItemContext>>(TemplateRef);\n\n static ngTemplateContextGuard(_dir: SdsSortableHandle, _ctx: unknown): _ctx is SdsSortableItemContext {\n return true;\n }\n}\n\n/** Emitted once per completed move (pointer drop or keyboard drop). */\nexport interface SdsSortableReorderEvent<T = any> {\n previousIndex: number;\n currentIndex: number;\n item: T;\n /** The whole list in its new order. */\n items: T[];\n}\n\nexport type SdsSortableAppearance = 'card' | 'plain';\n\ntype DragMode = 'keyboard' | 'pointer';\n\nlet nextId = 0;\n\n/** Move one entry of `list` from `from` to `to`, returning a new array. */\nfunction moveItem<T>(list: readonly T[], from: number, to: number): T[] {\n const next = [...list];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n}\n\n/**\n * Accessible reorderable list, with no `@angular/cdk` dependency.\n *\n * - **Pointer** (mouse, pen, touch): drag an item by its handle. The handle has `touch-action: none`, so\n * a finger drags instead of scrolling the page; the rest of the row still scrolls normally.\n * - **Keyboard**: focus a handle, **Space/Enter** picks the item up, **↑/↓** (and Home/End) move it,\n * **Space/Enter** drops it, **Escape** cancels (the event is stopped, so an enclosing drawer stays open).\n * Moving focus away also cancels.\n * - **Screen readers**: every handle is named (\"Reorder Burgers\") and described by the instructions; an\n * assertive live region announces pick-up, each move (\"moved to position 3 of 8\"), the drop and a cancel.\n *\n * Nothing is committed until the drop: while dragging, the other rows slide to make room. The drop\n * updates the two-way `[(items)]` model and emits `(reorder)` with the old/new index and the new array.\n * Items for which [itemDisabled] returns true cannot be picked up (they still shift when others pass).\n *\n * Row content comes from `<ng-template sdsSortableItem let-item>`; without one the item's label is shown.\n * All spoken text is set through inputs (English defaults, `{item}` `{position}` `{total}` tokens).\n *\n * @example\n * <sds-sortable-list [(items)]=\"categories\" dataKey=\"id\" labelField=\"name\" ariaLabel=\"Categories\"\n * (reorder)=\"save($event)\">\n * <ng-template sdsSortableItem let-cat>{{ cat.name }} <span>{{ cat.count }} items</span></ng-template>\n * </sds-sortable-list>\n */\n@Component({\n selector: 'sds-sortable-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, SdsIcon],\n host: { class: 'block' },\n template: `\n <ul\n role=\"list\"\n [attr.aria-label]=\"ariaLabel() || null\"\n class=\"flex flex-col\"\n [class.gap-2]=\"appearance() === 'card'\"\n [class.divide-y]=\"appearance() === 'plain'\"\n [class.divide-border]=\"appearance() === 'plain'\"\n (focusout)=\"onFocusOut($event)\"\n >\n @for (item of working(); track trackKey(item, $index); let i = $index) {\n <li\n [attr.data-sortable-index]=\"i\"\n [class]=\"rowClass(i)\"\n [style.transform]=\"transformFor(i)\"\n >\n <button\n type=\"button\"\n [class]=\"handleClass(item)\"\n [attr.aria-label]=\"handleText(item)\"\n [attr.aria-describedby]=\"instructionsId\"\n [attr.aria-pressed]=\"mode() === 'keyboard' && active() === i ? 'true' : 'false'\"\n [attr.data-sortable-handle]=\"i\"\n [disabled]=\"disabled() || isItemDisabled(item)\"\n (keydown)=\"onHandleKeydown($event, i)\"\n (pointerdown)=\"onPointerDown($event, i)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel()\"\n >\n @if (handleTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"handleTpl()!.template\"\n [ngTemplateOutletContext]=\"context(item, i)\"\n />\n } @else {\n <sds-icon name=\"grip-vertical\" [size]=\"18\" />\n }\n </button>\n\n <div class=\"min-w-0 flex-1\">\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.template\"\n [ngTemplateOutletContext]=\"context(item, i)\"\n />\n } @else {\n <span class=\"text-sm text-ink\">{{ labelOf(item) }}</span>\n }\n </div>\n </li>\n }\n </ul>\n\n <p [id]=\"instructionsId\" class=\"sr-only\">{{ instructions() }}</p>\n <div class=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ liveMessage() }}</div>\n `,\n})\nexport class SdsSortableList<T = any> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n protected readonly instructionsId = `sds-sortable-${nextId++}-help`;\n\n /** The items, in order. Two-way: `[(items)]` receives the new order on drop. */\n readonly items = model<readonly T[]>([]);\n /** Property used as a stable identity for rows (strongly recommended). */\n readonly dataKey = input<string>('');\n /** Property holding the item's name, for the default row, the handle name and announcements. */\n readonly labelField = input<string>('label');\n /** Function returning the item's name; takes precedence over [labelField]. */\n readonly itemLabel = input<((item: T) => string) | null>(null);\n /** Items for which this returns true cannot be picked up. */\n readonly itemDisabled = input<((item: T) => boolean) | null>(null);\n /** Disable reordering for the whole list. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** `card` (default): bordered rows with a gap. `plain`: rows separated by dividers. */\n readonly appearance = input<SdsSortableAppearance>('card');\n /** Accessible name of the list. */\n readonly ariaLabel = input<string>('');\n\n /** Name of each handle; `{item}` is the item's label. */\n readonly handleLabel = input<string>('Reorder {item}');\n /** Read after a handle's name (aria-describedby). */\n readonly instructions = input<string>(\n 'Press Space or Enter to pick up. Use the arrow keys to move, Space or Enter to drop, Escape to cancel.',\n );\n readonly pickedUpMessage = input<string>('{item} picked up. Position {position} of {total}.');\n readonly movedMessage = input<string>('{item} moved to position {position} of {total}.');\n readonly droppedMessage = input<string>('{item} dropped at position {position} of {total}.');\n readonly cancelledMessage = input<string>(\n 'Reorder cancelled. {item} is back at position {position} of {total}.',\n );\n\n /** A move was completed. */\n readonly reorder = output<SdsSortableReorderEvent<T>>();\n\n protected readonly itemTpl = contentChild(SdsSortableItem);\n protected readonly handleTpl = contentChild(SdsSortableHandle);\n\n /** Rendered order: follows [items] until a drop commits a new one. */\n protected readonly working = linkedSignal(() => [...this.items()]);\n\n // --- drag state -------------------------------------------------------------\n /** Index (in `working`) of the item being moved, or null. */\n protected readonly active = signal<number | null>(null);\n /** Where it would land if dropped now. */\n private readonly target = signal<number | null>(null);\n protected readonly mode = signal<DragMode | null>(null);\n /** Pointer-mode vertical offset of the dragged row. */\n private readonly pointerDy = signal(0);\n /** No transitions for one frame while a drop re-renders the new order in place. */\n private readonly settling = signal(false);\n protected readonly liveMessage = signal('');\n\n /** Row boxes measured at drag start (top/height), plus the gap between rows. */\n private rects: { top: number; height: number }[] = [];\n private gap = 0;\n private pointerId: number | null = null;\n private startY = 0;\n\n /** Per-row offsets that open a gap where the moving row will land. */\n private readonly shifts = computed(() => {\n const a = this.active();\n const t = this.target();\n const n = this.working().length;\n const out = new Array<number>(n).fill(0);\n if (a === null || t === null || !this.rects[a]) return out;\n const step = this.rects[a].height + this.gap;\n for (let j = 0; j < n; j++) {\n if (j === a) continue;\n if (a < t && j > a && j <= t) out[j] = -step;\n else if (t < a && j >= t && j < a) out[j] = step;\n }\n return out;\n });\n\n /** Offset of the moving row: follows the pointer, or jumps slot to slot with the keyboard. */\n private readonly activeOffset = computed(() => {\n const a = this.active();\n const t = this.target();\n if (a === null || t === null) return 0;\n if (this.mode() === 'pointer') return this.pointerDy();\n let d = 0;\n if (t > a) for (let j = a + 1; j <= t; j++) d += (this.rects[j]?.height ?? 0) + this.gap;\n else for (let j = t; j < a; j++) d -= (this.rects[j]?.height ?? 0) + this.gap;\n return d;\n });\n\n // --- rendering helpers ------------------------------------------------------\n protected trackKey(item: T, index: number): unknown {\n const k = this.dataKey();\n if (k && item && typeof item === 'object') return (item as Record<string, unknown>)[k] ?? index;\n return item ?? index;\n }\n\n protected labelOf(item: T): string {\n const fn = this.itemLabel();\n if (fn) return fn(item);\n if (item && typeof item === 'object') {\n const v = (item as Record<string, unknown>)[this.labelField()];\n return v == null ? '' : String(v);\n }\n return String(item);\n }\n\n protected isItemDisabled(item: T): boolean {\n return this.itemDisabled()?.(item) ?? false;\n }\n\n protected context(item: T, index: number): SdsSortableItemContext<T> {\n return { $implicit: item, item, index, grabbed: this.active() === index };\n }\n\n protected handleText(item: T): string {\n return this.handleLabel().replace('{item}', this.labelOf(item));\n }\n\n protected transformFor(i: number): string | null {\n if (this.active() === null) return null;\n const y = i === this.active() ? this.activeOffset() : this.shifts()[i];\n return y ? `translate3d(0, ${y}px, 0)` : null;\n }\n\n protected rowClass(i: number): string {\n const isActive = this.active() === i;\n const moving = this.active() !== null;\n const card = this.appearance() === 'card';\n const parts = ['relative flex items-center gap-2'];\n parts.push(card ? 'rounded-control border border-border bg-surface px-2 py-2' : 'bg-surface px-1 py-2');\n // Neighbours glide; the dragged row tracks the pointer 1:1 (no easing), and nothing animates\n // during the settle frame after a drop.\n if (moving && !this.settling() && !(isActive && this.mode() === 'pointer')) {\n parts.push('transition-transform duration-150 ease-out');\n }\n if (isActive) parts.push('z-10 shadow-lg ring-2 ring-brand-500');\n return parts.join(' ');\n }\n\n protected handleClass(item: T): string {\n const base =\n 'grid h-9 w-8 shrink-0 place-items-center rounded-control text-ink-faint transition-colors ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 ' +\n 'disabled:cursor-not-allowed disabled:opacity-40 touch-none select-none';\n return this.disabled() || this.isItemDisabled(item)\n ? base\n : `${base} cursor-grab hover:bg-muted hover:text-ink active:cursor-grabbing`;\n }\n\n // --- keyboard ---------------------------------------------------------------\n protected onHandleKeydown(event: KeyboardEvent, i: number): void {\n if (this.mode() === 'pointer') return;\n const a = this.active();\n if (a === null) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.begin(i, 'keyboard');\n this.announce(this.pickedUpMessage(), i);\n }\n return;\n }\n const last = this.working().length - 1;\n const t = this.target() ?? a;\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault();\n this.keyMove(Math.max(0, t - 1));\n return;\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault();\n this.keyMove(Math.min(last, t + 1));\n return;\n case 'Home':\n event.preventDefault();\n this.keyMove(0);\n return;\n case 'End':\n event.preventDefault();\n this.keyMove(last);\n return;\n case ' ':\n case 'Enter':\n event.preventDefault();\n this.commit();\n return;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.cancel();\n return;\n case 'Tab':\n this.cancel();\n return;\n }\n }\n\n private keyMove(to: number): void {\n if (to === this.target()) return;\n this.target.set(to);\n this.announce(this.movedMessage(), to);\n }\n\n /** Focus leaving the list while an item is picked up cancels the move. */\n protected onFocusOut(event: FocusEvent): void {\n if (this.mode() !== 'keyboard') return;\n const next = event.relatedTarget as Node | null;\n if (next && this.host.nativeElement.contains(next)) return;\n this.cancel();\n }\n\n // --- pointer ------------------------------------------------------------------\n protected onPointerDown(event: PointerEvent, i: number): void {\n if (this.active() !== null || event.button !== 0) return;\n const item = this.working()[i];\n if (this.disabled() || this.isItemDisabled(item)) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n (event.currentTarget as HTMLElement).focus({ preventScroll: true });\n this.pointerId = event.pointerId;\n this.startY = event.clientY;\n this.pointerDy.set(0);\n this.begin(i, 'pointer');\n }\n\n protected onPointerMove(event: PointerEvent): void {\n if (this.mode() !== 'pointer' || event.pointerId !== this.pointerId) return;\n const a = this.active();\n if (a === null) return;\n const dy = event.clientY - this.startY;\n this.pointerDy.set(dy);\n const center = this.rects[a].top + this.rects[a].height / 2 + dy;\n let t = 0;\n this.rects.forEach((r, j) => {\n if (j !== a && r.top + r.height / 2 < center) t++;\n });\n this.target.set(t);\n }\n\n protected onPointerUp(event: PointerEvent): void {\n if (this.mode() !== 'pointer' || event.pointerId !== this.pointerId) return;\n this.commit();\n }\n\n protected onPointerCancel(): void {\n if (this.mode() === 'pointer') this.cancel(false);\n }\n\n // --- lifecycle of a move -------------------------------------------------------\n private begin(i: number, mode: DragMode): void {\n this.measure();\n this.active.set(i);\n this.target.set(i);\n this.mode.set(mode);\n }\n\n private measure(): void {\n const rows = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLElement>('li[data-sortable-index]'),\n );\n this.rects = rows.map((r) => {\n const b = r.getBoundingClientRect();\n return { top: b.top, height: b.height };\n });\n this.gap =\n this.rects.length > 1\n ? Math.max(0, this.rects[1].top - (this.rects[0].top + this.rects[0].height))\n : 0;\n }\n\n private commit(): void {\n const from = this.active();\n const to = this.target();\n const mode = this.mode();\n if (from === null || to === null) return this.reset();\n const item = this.working()[from];\n if (to === from) {\n this.reset();\n this.announce(this.droppedMessage(), to, item);\n if (mode === 'keyboard') this.focusHandle(to);\n return;\n }\n const next = moveItem(this.working(), from, to);\n // Swap order and clear the offsets in the same frame, with transitions off, so rows don't jump.\n this.settling.set(true);\n this.reset();\n this.working.set(next);\n this.items.set(next);\n this.reorder.emit({ previousIndex: from, currentIndex: to, item, items: next });\n this.announce(this.droppedMessage(), to, item);\n this.focusHandle(to);\n }\n\n /** Nothing was moved in the DOM while dragging, so focus is still where it should be. */\n private cancel(announce = true): void {\n const from = this.active();\n if (from === null) return;\n this.reset();\n if (announce) this.announce(this.cancelledMessage(), from);\n }\n\n private reset(): void {\n this.active.set(null);\n this.target.set(null);\n this.mode.set(null);\n this.pointerDy.set(0);\n this.pointerId = null;\n }\n\n private focusHandle(index: number): void {\n afterNextRender(\n () => {\n this.settling.set(false);\n this.host.nativeElement\n .querySelector<HTMLElement>(`[data-sortable-handle=\"${index}\"]`)\n ?.focus({ preventScroll: false });\n },\n { injector: this.injector },\n );\n }\n\n private announce(template: string, position: number, item?: T): void {\n const it = item ?? this.working()[this.active() ?? position];\n const text = template\n .replace('{item}', it === undefined ? '' : this.labelOf(it))\n .replace('{position}', String(position + 1))\n .replace('{total}', String(this.working().length));\n // Re-set even when unchanged, so a repeated message is re-announced.\n this.liveMessage.set('');\n queueMicrotask(() => this.liveMessage.set(text));\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\n/** Why a file was turned away. */\nexport type SdsFileRejectionReason = 'type' | 'size' | 'count';\n\nexport interface SdsFileRejection {\n file: File;\n reason: SdsFileRejectionReason;\n /** The rendered, human-readable message (from the matching *Message input). */\n message: string;\n}\n\nlet nextId = 0;\n\n/** \"1.5 MB\" style size (decimal units, like file managers show them), for messages. */\nexport function sdsFormatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '';\n if (bytes < 1000) return `${bytes} B`;\n const units = ['kB', 'MB', 'GB'];\n let v = bytes / 1000;\n let u = 0;\n while (v >= 1000 && u < units.length - 1) {\n v /= 1000;\n u++;\n }\n return `${v >= 10 || Number.isInteger(v) ? Math.round(v) : v.toFixed(1)} ${units[u]}`;\n}\n\n/** Does `file` match an `accept` string (\".jpg,image/png,image/*\")? Empty accepts everything. */\nexport function sdsFileMatchesAccept(file: File, accept: string): boolean {\n const rules = accept\n .split(',')\n .map((r) => r.trim().toLowerCase())\n .filter(Boolean);\n if (!rules.length) return true;\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n return rules.some((rule) => {\n if (rule.startsWith('.')) return name.endsWith(rule);\n if (rule.endsWith('/*')) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n });\n}\n\n/**\n * Drop zone plus a \"Browse\" button for picking files. Filters by [accept] (same syntax as the native\n * input: `.csv`, `image/*`, `image/png`), [maxSize] (bytes) and [maxFiles]; emits the accepted files as\n * `(files)` and the rest as `(rejected)` with a reason and a readable message, which is also shown\n * under the zone and announced.\n *\n * Keyboard and screen-reader users use the native Browse button (the zone itself is a pointer\n * affordance); clicking anywhere on the zone opens the picker too. All text is set through inputs with\n * English defaults.\n *\n * @example\n * <sds-file-drop accept=\"image/jpeg,image/png,image/webp\" multiple [maxSize]=\"10_000_000\"\n * label=\"Drop photos here\" browseLabel=\"Choose photos\"\n * (files)=\"upload($event)\" (rejected)=\"onRejected($event)\" />\n */\n@Component({\n selector: 'sds-file-drop',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n [class]=\"zoneClass()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.data-dragging]=\"dragging() ? 'true' : null\"\n (click)=\"onZoneClick($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <span\n class=\"grid h-11 w-11 place-items-center rounded-full bg-surface text-ink-soft shadow-sm ring-1 ring-border\"\n aria-hidden=\"true\"\n >\n <sds-icon [name]=\"dragging() ? 'upload' : icon()\" [size]=\"22\" />\n </span>\n <p class=\"text-sm font-semibold text-ink\" [id]=\"zoneId + '-label'\">\n {{ dragging() ? dropLabel() : label() }}\n </p>\n @if (hint()) {\n <p class=\"text-xs text-ink-faint\" [id]=\"zoneId + '-hint'\">{{ hint() }}</p>\n }\n <button\n type=\"button\"\n class=\"mt-1 inline-flex h-9 items-center gap-1.5 rounded-control border border-border bg-surface px-3.5 text-sm font-semibold text-ink shadow-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-60\"\n [disabled]=\"disabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"browse($event)\"\n >\n <sds-icon name=\"upload\" [size]=\"16\" />\n {{ browseLabel() }}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange($event)\"\n />\n </div>\n\n <div aria-live=\"polite\" aria-atomic=\"true\">\n @if (errors().length) {\n <ul [id]=\"zoneId + '-errors'\" class=\"mt-2 space-y-1\">\n @for (err of errors(); track $index) {\n <li class=\"flex items-start gap-1.5 text-xs font-medium text-danger\">\n <sds-icon name=\"alert-circle\" [size]=\"14\" class=\"mt-px shrink-0\" />\n <span>{{ err }}</span>\n </li>\n }\n </ul>\n }\n </div>\n `,\n})\nexport class SdsFileDrop {\n protected readonly zoneId = `sds-file-drop-${nextId++}`;\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n /** Accepted types, native `accept` syntax. Empty = anything. */\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Largest accepted file in bytes. Null = no limit. */\n readonly maxSize = input<number | null>(null);\n /** Most files accepted in one pick/drop. Null = no limit (1 when not [multiple]). */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Icon in the zone at rest. */\n readonly icon = input<'upload' | 'image' | 'file-text'>('upload');\n\n readonly label = input<string>('Drag and drop files here');\n /** Shown while files are dragged over the zone. */\n readonly dropLabel = input<string>('Drop to add');\n readonly browseLabel = input<string>('Browse files');\n /** Extra line under the label, e.g. \"JPEG or PNG, up to 10 MB\". */\n readonly hint = input<string>('');\n /** Tokens: `{name}`. */\n readonly wrongTypeMessage = input<string>('{name}: this file type is not accepted.');\n /** Tokens: `{name}`, `{max}` (formatted size). */\n readonly tooLargeMessage = input<string>('{name}: larger than {max}.');\n /** Tokens: `{name}`, `{max}` (file count). */\n readonly tooManyMessage = input<string>('{name}: only {max} file(s) can be added at once.');\n\n /** Files that passed every check, in pick/drop order. */\n readonly files = output<File[]>();\n /** Files that were turned away, with the reason. */\n readonly rejected = output<SdsFileRejection[]>();\n\n protected readonly dragging = signal(false);\n protected readonly errors = signal<string[]>([]);\n private dragDepth = 0;\n\n protected readonly describedBy = computed(() => {\n const ids = [`${this.zoneId}-label`];\n if (this.hint()) ids.push(`${this.zoneId}-hint`);\n if (this.errors().length) ids.push(`${this.zoneId}-errors`);\n return ids.join(' ');\n });\n\n protected readonly zoneClass = computed(() => {\n const base =\n 'flex flex-col items-center justify-center gap-2 rounded-card border-2 border-dashed px-6 py-8 ' +\n 'text-center transition-colors';\n if (this.disabled()) return `${base} cursor-not-allowed border-border bg-muted opacity-60`;\n return this.dragging()\n ? `${base} cursor-copy border-brand-500 bg-brand-50 dark:bg-muted`\n : `${base} cursor-pointer border-border bg-muted/50 hover:border-ink-faint`;\n });\n\n /** Open the native file picker. */\n browse(event?: Event): void {\n event?.stopPropagation();\n if (this.disabled()) return;\n this.fileInput()?.nativeElement.click();\n }\n\n protected onZoneClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).closest('button, input')) return;\n this.browse();\n }\n\n protected onDragEnter(event: DragEvent): void {\n if (this.disabled() || !this.hasFiles(event)) return;\n event.preventDefault();\n this.dragDepth++;\n this.dragging.set(true);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.disabled() || !this.hasFiles(event)) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n }\n\n protected onDragLeave(event: DragEvent): void {\n if (this.disabled() || !this.hasFiles(event)) return;\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) this.dragging.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n if (this.disabled()) return;\n event.preventDefault();\n this.dragDepth = 0;\n this.dragging.set(false);\n this.handle(Array.from(event.dataTransfer?.files ?? []));\n }\n\n protected onInputChange(event: Event): void {\n const el = event.target as HTMLInputElement;\n this.handle(Array.from(el.files ?? []));\n // Reset so picking the same file again still fires `change`.\n el.value = '';\n }\n\n private hasFiles(event: DragEvent): boolean {\n return Array.from(event.dataTransfer?.types ?? []).includes('Files');\n }\n\n private handle(list: File[]): void {\n if (!list.length) return;\n const accepted: File[] = [];\n const rejected: SdsFileRejection[] = [];\n const max = this.maxFiles() ?? (this.multiple() ? null : 1);\n const maxSize = this.maxSize();\n\n for (const file of list) {\n if (!sdsFileMatchesAccept(file, this.accept())) {\n rejected.push({ file, reason: 'type', message: this.render(this.wrongTypeMessage(), file) });\n } else if (maxSize !== null && file.size > maxSize) {\n rejected.push({\n file,\n reason: 'size',\n message: this.render(this.tooLargeMessage(), file, sdsFormatBytes(maxSize)),\n });\n } else if (max !== null && accepted.length >= max) {\n rejected.push({\n file,\n reason: 'count',\n message: this.render(this.tooManyMessage(), file, String(max)),\n });\n } else {\n accepted.push(file);\n }\n }\n\n this.errors.set(rejected.map((r) => r.message));\n if (accepted.length) this.files.emit(accepted);\n if (rejected.length) this.rejected.emit(rejected);\n }\n\n private render(template: string, file: File, max = ''): string {\n return template.replace('{name}', file.name).replace('{max}', max);\n }\n\n /** Clear the error messages under the zone. */\n clearErrors(): void {\n this.errors.set([]);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n numberAttribute,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\n/** A crop rectangle in the SOURCE image's natural pixels. */\nexport interface SdsCropRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface SdsImageCropperBlobOptions {\n /** MIME type of the output. Default `image/jpeg`. */\n type?: string;\n /** 0–1 quality for lossy types. Default 0.9. */\n quality?: number;\n /** Output width in px (height follows the aspect ratio). Default: the crop's natural width. */\n width?: number;\n}\n\nexport type SdsImageCropperShape = 'rect' | 'round';\n\nlet nextId = 0;\n\n/**\n * Crops an image to a FIXED aspect ratio (e.g. the shop's card ratio): the frame is fixed and the image\n * moves and zooms behind it, always covering the frame, so every crop is valid.\n *\n * - Pointer: drag to move; wheel or pinch to zoom around the pointer; a zoom slider and ± buttons.\n * - Keyboard (focus the frame): arrow keys nudge the image (Shift = 10×), `+`/`-` zoom, `0` resets.\n * - `(cropChange)` emits the crop in the source image's natural pixels after every change;\n * {@link toBlob} renders it through a canvas (optionally resized) for upload.\n *\n * `src` takes a URL or a Blob/File (an object URL is managed for you). For a cross-origin URL the server\n * must send CORS headers and [crossOrigin] must be set, or the canvas is tainted and toBlob() rejects.\n *\n * @example\n * <sds-image-cropper [src]=\"file\" [aspectRatio]=\"4 / 3\" (cropChange)=\"crop = $event\" #cropper />\n * <sds-button (click)=\"upload(await cropper.toBlob({ width: 1600 }))\">Save</sds-button>\n */\n@Component({\n selector: 'sds-image-cropper',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n #viewport\n class=\"relative w-full touch-none select-none overflow-hidden rounded-card bg-ink/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 focus-visible:ring-offset-surface\"\n [class.cursor-grab]=\"loaded() && !dragging()\"\n [class.cursor-grabbing]=\"dragging()\"\n [style.aspect-ratio]=\"aspectRatio()\"\n role=\"application\"\n [attr.aria-roledescription]=\"roleDescription()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"helpId\"\n tabindex=\"0\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (wheel)=\"onWheel($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (objectUrl()) {\n <img\n [src]=\"objectUrl()\"\n [attr.crossorigin]=\"crossOrigin()\"\n alt=\"\"\n draggable=\"false\"\n class=\"pointer-events-none absolute left-0 top-0 max-w-none origin-top-left\"\n [class.invisible]=\"!loaded()\"\n [style.width.px]=\"displayW()\"\n [style.height.px]=\"displayH()\"\n [style.transform]=\"'translate3d(' + tx() + 'px,' + ty() + 'px,0)'\"\n (load)=\"onLoad($event)\"\n (error)=\"onError()\"\n />\n }\n @if (shape() === 'round') {\n <div\n class=\"pointer-events-none absolute inset-0 rounded-full shadow-[0_0_0_9999px_rgba(0,0,0,0.45)]\"\n aria-hidden=\"true\"\n ></div>\n }\n <!-- Rule-of-thirds guides. -->\n <div class=\"pointer-events-none absolute inset-0\" aria-hidden=\"true\">\n <div class=\"absolute inset-y-0 left-1/3 w-px bg-white/30\"></div>\n <div class=\"absolute inset-y-0 left-2/3 w-px bg-white/30\"></div>\n <div class=\"absolute inset-x-0 top-1/3 h-px bg-white/30\"></div>\n <div class=\"absolute inset-x-0 top-2/3 h-px bg-white/30\"></div>\n </div>\n @if (!loaded()) {\n <div class=\"absolute inset-0 grid place-items-center text-white/70\" aria-hidden=\"true\">\n <sds-icon name=\"image\" [size]=\"32\" />\n </div>\n }\n </div>\n <p [id]=\"helpId\" class=\"sr-only\">{{ instructions() }}</p>\n\n <div class=\"mt-3 flex items-center gap-2\">\n <button\n type=\"button\"\n class=\"grid h-9 w-9 shrink-0 place-items-center rounded-control text-ink-soft hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:opacity-40\"\n [attr.aria-label]=\"zoomOutLabel()\"\n [disabled]=\"!loaded() || zoom() <= 1\"\n (click)=\"zoomBy(-zoomStep())\"\n >\n <sds-icon name=\"zoom-out\" [size]=\"18\" />\n </button>\n <input\n type=\"range\"\n class=\"h-2 min-w-0 flex-1 cursor-pointer accent-brand-600\"\n min=\"1\"\n [max]=\"maxZoom()\"\n step=\"0.01\"\n [value]=\"zoom()\"\n [disabled]=\"!loaded()\"\n [attr.aria-label]=\"zoomLabel()\"\n [attr.aria-valuetext]=\"zoomText()\"\n (input)=\"onSlider($event)\"\n />\n <button\n type=\"button\"\n class=\"grid h-9 w-9 shrink-0 place-items-center rounded-control text-ink-soft hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:opacity-40\"\n [attr.aria-label]=\"zoomInLabel()\"\n [disabled]=\"!loaded() || zoom() >= maxZoom()\"\n (click)=\"zoomBy(zoomStep())\"\n >\n <sds-icon name=\"zoom-in\" [size]=\"18\" />\n </button>\n </div>\n `,\n})\nexport class SdsImageCropper implements OnDestroy {\n protected readonly helpId = `sds-image-cropper-${nextId++}-help`;\n private readonly viewport = viewChild<ElementRef<HTMLElement>>('viewport');\n\n /** Image to crop: a URL, or a Blob/File. */\n readonly src = input<string | Blob | null>(null);\n /** Frame width ÷ height, e.g. `1`, `4 / 3`, `16 / 9`. */\n readonly aspectRatio = input(1, { transform: numberAttribute });\n /** Largest zoom factor relative to \"cover\". */\n readonly maxZoom = input(4, { transform: numberAttribute });\n /** Zoom change per button press / key press. */\n readonly zoomStep = input(0.1, { transform: numberAttribute });\n /** Visual mask only (the output is always the rectangle). */\n readonly shape = input<SdsImageCropperShape>('rect');\n /** `crossorigin` for URL sources, needed for toBlob() on a cross-origin image. */\n readonly crossOrigin = input<'anonymous' | 'use-credentials' | null>(null);\n\n readonly label = input<string>('Crop area');\n readonly roleDescription = input<string>('image cropper');\n readonly instructions = input<string>(\n 'Drag, or use the arrow keys, to move the image. Use plus and minus to zoom, 0 to reset.',\n );\n readonly zoomLabel = input<string>('Zoom');\n readonly zoomInLabel = input<string>('Zoom in');\n readonly zoomOutLabel = input<string>('Zoom out');\n\n /** The crop, in natural pixels, after every change. */\n readonly cropChange = output<SdsCropRect>();\n /** The image loaded; natural size. */\n readonly imageLoad = output<{ width: number; height: number }>();\n /** The image failed to load. */\n readonly imageError = output<void>();\n\n protected readonly objectUrl = signal<string | null>(null);\n private ownedUrl: string | null = null;\n private imgEl: HTMLImageElement | null = null;\n\n protected readonly loaded = signal(false);\n private readonly naturalW = signal(0);\n private readonly naturalH = signal(0);\n /** Frame size in CSS px (tracked with a ResizeObserver). */\n private readonly frameW = signal(0);\n private readonly frameH = signal(0);\n protected readonly zoom = signal(1);\n protected readonly tx = signal(0);\n protected readonly ty = signal(0);\n protected readonly dragging = signal(false);\n\n /** Scale that makes the image just cover the frame (zoom 1). */\n private readonly coverScale = computed(() => {\n const w = this.naturalW();\n const h = this.naturalH();\n if (!w || !h || !this.frameW() || !this.frameH()) return 1;\n return Math.max(this.frameW() / w, this.frameH() / h);\n });\n private readonly scale = computed(() => this.coverScale() * this.zoom());\n protected readonly displayW = computed(() => this.naturalW() * this.scale());\n protected readonly displayH = computed(() => this.naturalH() * this.scale());\n protected readonly zoomText = computed(() => `${Math.round(this.zoom() * 100)}%`);\n\n /** The current crop in natural pixels. */\n readonly crop = computed<SdsCropRect>(() => {\n const s = this.scale();\n if (!this.loaded() || !s) return { x: 0, y: 0, width: 0, height: 0 };\n const x = -this.tx() / s;\n const y = -this.ty() / s;\n const width = Math.min(this.naturalW(), this.frameW() / s);\n const height = Math.min(this.naturalH(), this.frameH() / s);\n return {\n x: Math.max(0, Math.round(x)),\n y: Math.max(0, Math.round(y)),\n width: Math.round(width),\n height: Math.round(height),\n };\n });\n\n private resizeObserver: ResizeObserver | null = null;\n private pointers = new Map<number, { x: number; y: number }>();\n private lastPinch = 0;\n\n constructor() {\n // Source → object URL (for Blobs), reset state.\n effect(() => {\n const src = this.src();\n untracked(() => {\n this.revoke();\n this.loaded.set(false);\n if (src instanceof Blob) {\n this.ownedUrl = URL.createObjectURL(src);\n this.objectUrl.set(this.ownedUrl);\n } else {\n this.objectUrl.set(src || null);\n }\n });\n });\n\n // Track the frame size; keep the image covering it (and the crop centre stable) on resize.\n effect((onCleanup) => {\n const el = this.viewport()?.nativeElement;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => this.measureFrame());\n ro.observe(el);\n this.resizeObserver = ro;\n onCleanup(() => ro.disconnect());\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.revoke();\n }\n\n // --- loading -------------------------------------------------------------------\n protected onLoad(event: Event): void {\n const img = event.target as HTMLImageElement;\n this.imgEl = img;\n this.naturalW.set(img.naturalWidth);\n this.naturalH.set(img.naturalHeight);\n this.measureFrame();\n this.loaded.set(true);\n this.reset();\n this.imageLoad.emit({ width: img.naturalWidth, height: img.naturalHeight });\n }\n\n protected onError(): void {\n this.loaded.set(false);\n this.imageError.emit();\n }\n\n private revoke(): void {\n if (this.ownedUrl) URL.revokeObjectURL(this.ownedUrl);\n this.ownedUrl = null;\n }\n\n private measureFrame(): void {\n const el = this.viewport()?.nativeElement;\n if (!el) return;\n const prevW = this.frameW();\n const w = el.clientWidth;\n const h = el.clientHeight || w / (this.aspectRatio() || 1);\n if (w === prevW && h === this.frameH()) return;\n // Keep the same point of the image under the frame centre across a resize.\n const s = this.scale();\n const cx = s ? (this.frameW() / 2 - this.tx()) / s : 0;\n const cy = s ? (this.frameH() / 2 - this.ty()) / s : 0;\n this.frameW.set(w);\n this.frameH.set(h);\n if (this.loaded() && prevW) {\n const ns = this.scale();\n this.setOffset(w / 2 - cx * ns, h / 2 - cy * ns);\n this.emit();\n }\n }\n\n // --- geometry ------------------------------------------------------------------\n /** Centre the image at zoom 1. */\n reset(): void {\n this.zoom.set(1);\n this.setOffset((this.frameW() - this.displayW()) / 2, (this.frameH() - this.displayH()) / 2);\n this.emit();\n }\n\n private setOffset(x: number, y: number): void {\n const minX = Math.min(0, this.frameW() - this.displayW());\n const minY = Math.min(0, this.frameH() - this.displayH());\n this.tx.set(Math.min(0, Math.max(minX, x)));\n this.ty.set(Math.min(0, Math.max(minY, y)));\n }\n\n /** Zoom to `next`, keeping the frame point (px, py) fixed (defaults to the centre). */\n private zoomTo(next: number, px = this.frameW() / 2, py = this.frameH() / 2): void {\n const z = Math.min(this.maxZoom(), Math.max(1, next));\n const s = this.scale();\n const ix = (px - this.tx()) / s;\n const iy = (py - this.ty()) / s;\n this.zoom.set(z);\n const ns = this.scale();\n this.setOffset(px - ix * ns, py - iy * ns);\n this.emit();\n }\n\n /** Zoom in (+) or out (−) by `delta`. */\n zoomBy(delta: number): void {\n if (!this.loaded()) return;\n this.zoomTo(this.zoom() + delta);\n }\n\n private emit(): void {\n if (this.loaded()) this.cropChange.emit(this.crop());\n }\n\n // --- pointer ---------------------------------------------------------------------\n protected onPointerDown(event: PointerEvent): void {\n if (!this.loaded()) return;\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n this.pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n this.dragging.set(true);\n if (this.pointers.size === 2) this.lastPinch = this.pinchDistance();\n }\n\n protected onPointerMove(event: PointerEvent): void {\n const prev = this.pointers.get(event.pointerId);\n if (!prev) return;\n const cur = { x: event.clientX, y: event.clientY };\n this.pointers.set(event.pointerId, cur);\n if (this.pointers.size >= 2) {\n const d = this.pinchDistance();\n if (this.lastPinch > 0) {\n const rect = this.viewport()!.nativeElement.getBoundingClientRect();\n const pts = [...this.pointers.values()];\n const mx = (pts[0].x + pts[1].x) / 2 - rect.left;\n const my = (pts[0].y + pts[1].y) / 2 - rect.top;\n this.zoomTo(this.zoom() * (d / this.lastPinch), mx, my);\n }\n this.lastPinch = d;\n return;\n }\n this.setOffset(this.tx() + (cur.x - prev.x), this.ty() + (cur.y - prev.y));\n }\n\n protected onPointerUp(event: PointerEvent): void {\n if (!this.pointers.delete(event.pointerId)) return;\n if (this.pointers.size < 2) this.lastPinch = 0;\n if (this.pointers.size === 0) {\n this.dragging.set(false);\n this.emit();\n }\n }\n\n private pinchDistance(): number {\n const [a, b] = [...this.pointers.values()];\n return a && b ? Math.hypot(a.x - b.x, a.y - b.y) : 0;\n }\n\n protected onWheel(event: WheelEvent): void {\n if (!this.loaded()) return;\n event.preventDefault();\n const rect = this.viewport()!.nativeElement.getBoundingClientRect();\n const factor = Math.exp(-event.deltaY * 0.0015);\n this.zoomTo(this.zoom() * factor, event.clientX - rect.left, event.clientY - rect.top);\n }\n\n protected onSlider(event: Event): void {\n this.zoomTo(Number((event.target as HTMLInputElement).value));\n }\n\n // --- keyboard ---------------------------------------------------------------------\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.loaded()) return;\n const step = event.shiftKey ? 10 : 1;\n let handled = true;\n switch (event.key) {\n // Arrow keys move the IMAGE in that direction under the fixed frame.\n case 'ArrowLeft':\n this.setOffset(this.tx() - step, this.ty());\n break;\n case 'ArrowRight':\n this.setOffset(this.tx() + step, this.ty());\n break;\n case 'ArrowUp':\n this.setOffset(this.tx(), this.ty() - step);\n break;\n case 'ArrowDown':\n this.setOffset(this.tx(), this.ty() + step);\n break;\n case '+':\n case '=':\n this.zoomBy(this.zoomStep());\n return event.preventDefault();\n case '-':\n case '_':\n this.zoomBy(-this.zoomStep());\n return event.preventDefault();\n case '0':\n this.reset();\n return event.preventDefault();\n default:\n handled = false;\n }\n if (handled) {\n event.preventDefault();\n this.emit();\n }\n }\n\n // --- output -------------------------------------------------------------------------\n /**\n * Render the current crop to a canvas (natural resolution, or scaled to `width`). Returns null\n * before an image has loaded.\n */\n toCanvas(width?: number): HTMLCanvasElement | null {\n const img = this.imgEl;\n const c = this.crop();\n if (!img || !this.loaded() || !c.width || !c.height) return null;\n const outW = Math.max(1, Math.round(width ?? c.width));\n const outH = Math.max(1, Math.round(outW / (this.aspectRatio() || c.width / c.height)));\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n ctx.imageSmoothingQuality = 'high';\n ctx.drawImage(img, c.x, c.y, c.width, c.height, 0, 0, outW, outH);\n return canvas;\n }\n\n /** Encode the current crop as a Blob (JPEG 0.9 by default). */\n toBlob(options: SdsImageCropperBlobOptions = {}): Promise<Blob | null> {\n const canvas = this.toCanvas(options.width);\n if (!canvas) return Promise.resolve(null);\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob((b) => resolve(b), options.type ?? 'image/jpeg', options.quality ?? 0.9);\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n","/** Small, dependency-free date helpers (day-granularity, local time). */\n\nexport function startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Zero-pad a number to two digits (e.g. 9 → \"09\"). */\nexport function pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/** Format a date's time-of-day as HH:mm (24h, local time). */\nexport function formatHhMm(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function addDays(d: Date, n: number): Date {\n const r = new Date(d);\n r.setDate(r.getDate() + n);\n return r;\n}\n\nexport function addMonths(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth() + n, 1);\n}\n\n/** Add `n` months, keeping the day-of-month but clamping to the target month's length. */\nexport function addMonthsKeepDay(d: Date, n: number): Date {\n const t = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const lastDay = new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();\n t.setDate(Math.min(d.getDate(), lastDay));\n return t;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n return (\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/** True when `d` falls outside the inclusive [min, max] day range. */\nexport function isOutOfRange(d: Date, min: Date | null, max: Date | null): boolean {\n const day = startOfDay(d).getTime();\n if (min && day < startOfDay(min).getTime()) return true;\n if (max && day > startOfDay(max).getTime()) return true;\n return false;\n}\n\nexport function isoDay(d: Date): string {\n const p = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n/** Format a date as dd/MM/yyyy (default display format). */\nexport function formatDdMmYyyy(d: Date): string {\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()}`;\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n addDays,\n addMonths,\n addMonthsKeepDay,\n isOutOfRange,\n isSameDay,\n isoDay,\n pad2,\n startOfDay,\n startOfMonth,\n} from './date-utils';\n\ntype CalView = 'day' | 'month' | 'year';\n\ninterface DayCell {\n date: Date;\n day: number;\n otherMonth: boolean;\n today: boolean;\n selected: boolean;\n disabled: boolean;\n focused: boolean;\n}\n\n/**\n * Inline month calendar with day → month → year drill-down navigation,\n * min/max bounds and keyboard support. Used standalone (inline) or inside\n * <sds-date-picker>.\n */\n@Component({\n selector: 'sds-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div\n class=\"w-[20rem] select-none rounded-card border border-border bg-surface p-3 shadow-lg\"\n role=\"group\"\n [attr.aria-label]=\"calendarLabel()\"\n >\n <!-- Header -->\n <div class=\"mb-2 flex items-center justify-between\">\n <button type=\"button\" [class]=\"navBtn\" [attr.aria-label]=\"previousLabel()\" (click)=\"prev()\">\n <sds-icon name=\"chevron-left\" [size]=\"18\" />\n </button>\n\n <div class=\"flex items-center gap-1 text-sm font-semibold text-ink\">\n @switch (view()) {\n @case ('day') {\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('month')\">\n {{ monthLong() }}\n </button>\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('year')\">\n {{ yearLabel() }}\n </button>\n }\n @case ('month') {\n <button type=\"button\" [class]=\"titleBtn\" (click)=\"view.set('year')\">\n {{ yearLabel() }}\n </button>\n }\n @case ('year') {\n <span class=\"px-1\">{{ decadeStart() }} – {{ decadeStart() + 11 }}</span>\n }\n }\n </div>\n\n <button type=\"button\" [class]=\"navBtn\" [attr.aria-label]=\"nextLabel()\" (click)=\"next()\">\n <sds-icon name=\"chevron-right\" [size]=\"18\" />\n </button>\n </div>\n\n <!-- Day view -->\n @if (view() === 'day') {\n <table class=\"w-full border-collapse\" role=\"grid\">\n <thead>\n <tr>\n @for (wd of weekdayLabels(); track $index) {\n <th scope=\"col\" class=\"pb-1 text-[11px] font-medium uppercase text-ink-faint\">\n {{ wd }}\n </th>\n }\n </tr>\n </thead>\n <tbody (keydown)=\"onGridKeydown($event)\">\n @for (week of weeks(); track $index) {\n <tr>\n @for (cell of week; track cell.date.getTime()) {\n <td class=\"p-0.5 text-center\">\n <button\n type=\"button\"\n [attr.data-date]=\"iso(cell.date)\"\n [tabindex]=\"cell.focused ? 0 : -1\"\n [disabled]=\"cell.disabled\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-current]=\"cell.today ? 'date' : null\"\n [attr.aria-label]=\"fullLabel(cell.date)\"\n [class]=\"dayClass(cell)\"\n (click)=\"selectDay(cell.date)\"\n >\n {{ cell.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Month view -->\n @if (view() === 'month') {\n <div class=\"grid grid-cols-3 gap-1.5\">\n @for (m of monthsGrid(); track m.month) {\n <button\n type=\"button\"\n [disabled]=\"m.disabled\"\n [class]=\"cellClass(m.selected, m.current, m.disabled)\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.label }}\n </button>\n }\n </div>\n }\n\n <!-- Year view -->\n @if (view() === 'year') {\n <div class=\"grid grid-cols-3 gap-1.5\">\n @for (y of yearsGrid(); track y.year) {\n <button\n type=\"button\"\n [disabled]=\"y.disabled\"\n [class]=\"cellClass(y.selected, y.current, y.disabled)\"\n (click)=\"selectYear(y.year)\"\n >\n {{ y.year }}\n </button>\n }\n </div>\n }\n\n <!-- Time editor -->\n @if (showTime()) {\n <div class=\"mt-2 flex items-center gap-2 border-t border-border pt-2\">\n <span class=\"text-xs font-medium text-ink-soft\">{{ timeLabel() }}</span>\n <div class=\"ml-auto inline-flex items-center gap-1.5\">\n <div class=\"inline-flex items-center rounded-control border border-border bg-surface\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"hoursText()\"\n [disabled]=\"!value()\"\n [attr.aria-label]=\"hoursLabel()\"\n (change)=\"setHours($any($event.target).value)\"\n (blur)=\"$any($event.target).value = hoursText()\"\n (keydown.arrowup)=\"stepHours(1); $event.preventDefault()\"\n (keydown.arrowdown)=\"stepHours(-1); $event.preventDefault()\"\n [class]=\"timeInput\"\n />\n <div class=\"flex flex-col border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepHours(1)\"\n >\n <span class=\"inline-flex rotate-180\"\n ><sds-icon name=\"chevron-down\" [size]=\"11\"\n /></span>\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepHours(-1)\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"11\" />\n </button>\n </div>\n </div>\n <span class=\"text-sm font-semibold text-ink-soft\">:</span>\n <div class=\"inline-flex items-center rounded-control border border-border bg-surface\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"minutesText()\"\n [disabled]=\"!value()\"\n [attr.aria-label]=\"minutesLabel()\"\n (change)=\"setMinutes($any($event.target).value)\"\n (blur)=\"$any($event.target).value = minutesText()\"\n (keydown.arrowup)=\"stepMinutes(1); $event.preventDefault()\"\n (keydown.arrowdown)=\"stepMinutes(-1); $event.preventDefault()\"\n [class]=\"timeInput\"\n />\n <div class=\"flex flex-col border-l border-border\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepMinutes(1)\"\n >\n <span class=\"inline-flex rotate-180\"\n ><sds-icon name=\"chevron-down\" [size]=\"11\"\n /></span>\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [disabled]=\"!value()\"\n [class]=\"stepBtn\"\n (click)=\"stepMinutes(-1)\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"11\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Actions -->\n @if (showActions() || showDone()) {\n <div class=\"mt-2 flex items-center justify-between border-t border-border pt-2\">\n <div class=\"flex items-center gap-1\">\n @if (showActions()) {\n <button\n type=\"button\"\n [class]=\"actionBtn\"\n [disabled]=\"todayDisabled()\"\n (click)=\"goToday()\"\n >\n {{ todayActionLabel() }}\n </button>\n <button type=\"button\" [class]=\"actionBtn\" (click)=\"clear()\">\n {{ clearActionLabel() }}\n </button>\n }\n </div>\n @if (showDone()) {\n <button type=\"button\" [class]=\"doneBtn\" (click)=\"done.emit()\">{{ doneLabel() }}</button>\n }\n </div>\n }\n </div>\n `,\n})\nexport class SdsCalendar {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly value = model<Date | null>(null);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n /** 0 = Sunday, 1 = Monday (default, European). */\n readonly firstDayOfWeek = input<0 | 1>(1);\n readonly locale = input<string>('fr-FR');\n readonly showActions = input<boolean>(true);\n\n /** When true, a time editor (HH:mm, 24h) is shown and the value keeps its time-of-day. */\n readonly showTime = input(false, { transform: booleanAttribute });\n /** When true, a \"done\" action is shown (used by the overlay picker to close the panel). */\n readonly showDone = input(false, { transform: booleanAttribute });\n\n /** Visible label of the time editor. Translate it in the consuming app. */\n readonly timeLabel = input<string>('Heure');\n /** Accessible name of the hours field (it is a bare numeric input). */\n readonly hoursLabel = input<string>('Heures');\n /** Accessible name of the minutes field. */\n readonly minutesLabel = input<string>('Minutes');\n /** Visible text of the \"done\" action (shown when {@link showDone} is true). */\n readonly doneLabel = input<string>('Terminé');\n\n /**\n * Accessible name for the calendar container. French default so existing consumers are unchanged,\n * but an app serving more than one language MUST translate it.\n */\n readonly calendarLabel = input<string>('Calendrier');\n\n /**\n * Accessible name for the \"previous\" nav button. It is icon-only, so this string is its ONLY\n * accessible name — a hardcoded French one is simply wrong in every other locale. Translate it in\n * the consuming app.\n */\n readonly previousLabel = input<string>('Précédent');\n\n /** Accessible name for the icon-only \"next\" nav button. See {@link previousLabel}. */\n readonly nextLabel = input<string>('Suivant');\n\n /**\n * Visible text of the \"today\" action (shown when {@link showActions} is true). Translate it in the\n * consuming app — the library ships no i18n of its own.\n */\n readonly todayActionLabel = input<string>(\"Aujourd'hui\");\n\n /** Visible text of the \"clear\" action. See {@link todayActionLabel}. */\n readonly clearActionLabel = input<string>('Effacer');\n\n /** Emitted when a concrete date is picked (day click or \"Aujourd'hui\"). */\n readonly dateSelect = output<Date>();\n /** Emitted when the \"done\" action is used (see {@link showDone}). */\n readonly done = output<void>();\n\n protected readonly view = signal<CalView>('day');\n protected readonly viewDate = signal<Date>(startOfMonth(new Date()));\n protected readonly focusedDate = signal<Date>(startOfDay(new Date()));\n\n constructor() {\n // Keep the displayed month in sync with the value (e.g. when a form writes\n // a value, including while the panel is open). Plain navigation does not\n // change the value, so this does not fight the user.\n effect(() => {\n const v = this.value();\n if (v) this.viewDate.set(startOfMonth(v));\n });\n }\n\n /** Today falls outside [min, max] — used to disable the \"Today\" action. */\n protected readonly todayDisabled = computed(() =>\n isOutOfRange(new Date(), this.min(), this.max()),\n );\n\n // --- styling helpers ---\n protected readonly navBtn =\n 'inline-flex h-8 w-8 items-center justify-center rounded-control text-ink-soft hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly titleBtn =\n 'rounded-control px-2 py-1 capitalize hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly actionBtn =\n 'rounded-control px-2 py-1 text-xs font-medium text-brand-700 hover:bg-brand-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n protected readonly doneBtn =\n 'rounded-control bg-brand-600 px-3 py-1 text-xs font-semibold text-white hover:bg-brand-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500';\n protected readonly timeInput =\n 'w-8 bg-transparent py-1 text-center text-sm text-ink outline-none disabled:cursor-not-allowed disabled:opacity-40';\n protected readonly stepBtn =\n 'flex h-3.5 w-5 items-center justify-center text-ink-faint transition-colors hover:text-ink focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-30';\n\n // --- labels ---\n protected readonly monthLong = computed(() =>\n new Intl.DateTimeFormat(this.locale(), { month: 'long' }).format(this.viewDate()),\n );\n protected readonly yearLabel = computed(() => this.viewDate().getFullYear());\n protected readonly decadeStart = computed(() => {\n const y = this.viewDate().getFullYear();\n return y - (y % 10);\n });\n\n protected readonly weekdayLabels = computed(() => {\n const fmt = new Intl.DateTimeFormat(this.locale(), { weekday: 'short' });\n const sunday = new Date(2023, 0, 1); // a known Sunday\n return Array.from({ length: 7 }, (_, i) =>\n fmt.format(addDays(sunday, (this.firstDayOfWeek() + i) % 7)),\n );\n });\n\n protected readonly weeks = computed<DayCell[][]>(() => {\n const vd = this.viewDate();\n const first = startOfMonth(vd);\n const offset = (first.getDay() - this.firstDayOfWeek() + 7) % 7;\n const start = addDays(first, -offset);\n const today = startOfDay(new Date());\n const val = this.value();\n const min = this.min();\n const max = this.max();\n const focused = this.focusedDate();\n\n const out: DayCell[][] = [];\n let cur = start;\n for (let w = 0; w < 6; w++) {\n const row: DayCell[] = [];\n for (let i = 0; i < 7; i++) {\n row.push({\n date: cur,\n day: cur.getDate(),\n otherMonth: cur.getMonth() !== vd.getMonth(),\n today: isSameDay(cur, today),\n selected: isSameDay(cur, val),\n disabled: isOutOfRange(cur, min, max),\n focused: isSameDay(cur, focused),\n });\n cur = addDays(cur, 1);\n }\n out.push(row);\n }\n return out;\n });\n\n protected readonly monthsGrid = computed(() => {\n const fmt = new Intl.DateTimeFormat(this.locale(), { month: 'short' });\n const y = this.viewDate().getFullYear();\n const val = this.value();\n const today = new Date();\n const min = this.min();\n const max = this.max();\n return Array.from({ length: 12 }, (_, m) => ({\n month: m,\n label: fmt.format(new Date(y, m, 1)),\n selected: !!val && val.getFullYear() === y && val.getMonth() === m,\n current: today.getFullYear() === y && today.getMonth() === m,\n disabled:\n (!!max && new Date(y, m, 1) > startOfMonth(max)) ||\n (!!min && new Date(y, m + 1, 0) < startOfDay(min)),\n }));\n });\n\n protected readonly yearsGrid = computed(() => {\n const start = this.decadeStart();\n const val = this.value();\n const thisYear = new Date().getFullYear();\n const min = this.min();\n const max = this.max();\n return Array.from({ length: 12 }, (_, i) => {\n const year = start + i;\n return {\n year,\n selected: !!val && val.getFullYear() === year,\n current: thisYear === year,\n disabled: (!!max && year > max.getFullYear()) || (!!min && year < min.getFullYear()),\n };\n });\n });\n\n // --- navigation ---\n protected prev(): void {\n const v = this.view();\n if (v === 'day') this.viewDate.set(addMonths(this.viewDate(), -1));\n else if (v === 'month') this.viewDate.set(new Date(this.viewDate().getFullYear() - 1, 0, 1));\n else this.viewDate.set(new Date(this.viewDate().getFullYear() - 10, 0, 1));\n }\n protected next(): void {\n const v = this.view();\n if (v === 'day') this.viewDate.set(addMonths(this.viewDate(), 1));\n else if (v === 'month') this.viewDate.set(new Date(this.viewDate().getFullYear() + 1, 0, 1));\n else this.viewDate.set(new Date(this.viewDate().getFullYear() + 10, 0, 1));\n }\n\n protected selectDay(d: Date): void {\n if (isOutOfRange(d, this.min(), this.max())) return;\n // showTime keeps the current time-of-day (or 00:00 when nothing was set yet); otherwise midnight.\n const day = this.applyTime(startOfDay(d));\n this.value.set(day);\n this.viewDate.set(startOfMonth(day));\n this.focusedDate.set(startOfDay(day));\n this.dateSelect.emit(day);\n }\n\n /** Carry the previously-selected time-of-day onto a freshly-picked day (only when showTime). */\n private applyTime(day: Date): Date {\n if (!this.showTime()) return day;\n const prev = this.value();\n if (!prev) return day; // no prior time → keep 00:00\n const d = new Date(day);\n d.setHours(prev.getHours(), prev.getMinutes(), 0, 0);\n return d;\n }\n protected selectMonth(m: number): void {\n this.viewDate.set(new Date(this.viewDate().getFullYear(), m, 1));\n this.view.set('day');\n }\n protected selectYear(y: number): void {\n this.viewDate.set(new Date(y, this.viewDate().getMonth(), 1));\n this.view.set('month');\n }\n\n protected goToday(): void {\n this.view.set('day');\n this.selectDay(new Date());\n }\n protected clear(): void {\n this.value.set(null);\n }\n\n // --- time editor (only rendered when showTime) ---\n protected readonly hoursText = computed(() => {\n const v = this.value();\n return v ? pad2(v.getHours()) : '';\n });\n protected readonly minutesText = computed(() => {\n const v = this.value();\n return v ? pad2(v.getMinutes()) : '';\n });\n\n protected setHours(raw: string): void {\n const v = this.value();\n if (!v) return;\n const n = parseInt(raw, 10);\n if (Number.isNaN(n)) return;\n const d = new Date(v);\n d.setHours(Math.min(23, Math.max(0, n)));\n this.value.set(d);\n }\n protected setMinutes(raw: string): void {\n const v = this.value();\n if (!v) return;\n const n = parseInt(raw, 10);\n if (Number.isNaN(n)) return;\n const d = new Date(v);\n d.setMinutes(Math.min(59, Math.max(0, n)));\n this.value.set(d);\n }\n /** Wrap hours within 0–23; never carries into the day. */\n protected stepHours(delta: number): void {\n const v = this.value();\n if (!v) return;\n const d = new Date(v);\n d.setHours((d.getHours() + delta + 24) % 24);\n this.value.set(d);\n }\n /** Wrap minutes within 0–59; never carries into the hour. */\n protected stepMinutes(delta: number): void {\n const v = this.value();\n if (!v) return;\n const d = new Date(v);\n d.setMinutes((d.getMinutes() + delta + 60) % 60);\n this.value.set(d);\n }\n\n // --- keyboard (day grid) ---\n protected onGridKeydown(e: KeyboardEvent): void {\n let f = this.focusedDate();\n switch (e.key) {\n case 'ArrowLeft':\n f = addDays(f, -1);\n break;\n case 'ArrowRight':\n f = addDays(f, 1);\n break;\n case 'ArrowUp':\n f = addDays(f, -7);\n break;\n case 'ArrowDown':\n f = addDays(f, 7);\n break;\n case 'Home':\n f = addDays(f, -((f.getDay() - this.firstDayOfWeek() + 7) % 7));\n break;\n case 'End':\n f = addDays(f, 6 - ((f.getDay() - this.firstDayOfWeek() + 7) % 7));\n break;\n case 'PageUp':\n f = addMonthsKeepDay(f, -1);\n break;\n case 'PageDown':\n f = addMonthsKeepDay(f, 1);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.selectDay(f);\n return;\n default:\n return;\n }\n e.preventDefault();\n if (\n f.getMonth() !== this.viewDate().getMonth() ||\n f.getFullYear() !== this.viewDate().getFullYear()\n ) {\n this.viewDate.set(startOfMonth(f));\n }\n this.focusedDate.set(f);\n this.focusCell(f);\n }\n\n /** Move focus to the active day cell (called when the panel opens). */\n focusActiveCell(): void {\n const target = this.value() ?? new Date();\n this.view.set('day');\n this.viewDate.set(startOfMonth(target));\n this.focusedDate.set(startOfDay(target));\n this.focusCell(target);\n }\n\n private focusHandle?: ReturnType<typeof setTimeout>;\n private focusCell(d: Date): void {\n clearTimeout(this.focusHandle);\n this.focusHandle = setTimeout(() => {\n const el = this.host.nativeElement.querySelector<HTMLElement>(`[data-date=\"${isoDay(d)}\"]`);\n el?.focus();\n });\n }\n\n // --- template helpers ---\n protected iso(d: Date): string {\n return isoDay(d);\n }\n protected fullLabel(d: Date): string {\n return new Intl.DateTimeFormat(this.locale(), {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(d);\n }\n\n protected dayClass(cell: DayCell): string {\n const base =\n 'inline-flex h-9 w-9 items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n if (cell.selected) return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;\n let cls = `${base} hover:bg-brand-50`;\n if (cell.otherMonth) cls += ' text-ink-faint';\n else cls += ' text-ink';\n if (cell.today) cls += ' font-bold text-brand-600 ring-1 ring-inset ring-brand-300';\n return cls;\n }\n\n protected cellClass(selected: boolean, current: boolean, disabled: boolean): string {\n const base =\n 'h-10 rounded-control text-sm capitalize transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40';\n if (selected) return `${base} bg-brand-600 font-semibold text-white hover:bg-brand-700`;\n let cls = `${base} text-ink hover:bg-brand-50`;\n if (current) cls += ' font-semibold text-brand-600';\n return cls;\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsCalendar } from './sds-calendar';\nimport { formatDdMmYyyy, formatHhMm } from './date-utils';\n\nexport type SdsDatePickerSize = 'sm' | 'md' | 'lg';\n\nconst SIZES: Record<SdsDatePickerSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\n/**\n * Date picker: a read-only field that opens a calendar overlay, or an inline\n * calendar. Implements ControlValueAccessor — use with reactive forms or\n * [(ngModel)]; the value is a `Date | null`.\n *\n * @example\n * <sds-date-picker label=\"Date de garde\" [(ngModel)]=\"date\" />\n */\n@Component({\n selector: 'sds-date-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, SdsCalendar],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsDatePicker), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'onEscape($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n @if (inline()) {\n <sds-calendar\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [showActions]=\"showActions()\"\n [showTime]=\"showTime()\"\n [timeLabel]=\"timeLabel()\"\n [hoursLabel]=\"hoursLabel()\"\n [minutesLabel]=\"minutesLabel()\"\n [calendarLabel]=\"calendarLabel()\"\n [previousLabel]=\"previousLabel()\"\n [nextLabel]=\"nextLabel()\"\n [todayActionLabel]=\"todayActionLabel()\"\n [clearActionLabel]=\"clearActionLabel()\"\n (valueChange)=\"onCalendarValue($event)\"\n />\n } @else {\n <div class=\"relative\">\n <div\n #trigger\n class=\"relative flex items-center rounded-control border bg-surface transition-colors\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n >\n <input\n [id]=\"fieldId\"\n type=\"text\"\n readonly\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n (keydown.enter)=\"onTriggerKeydown($event)\"\n (keydown.space)=\"onTriggerKeydown($event)\"\n (keydown.arrowdown)=\"onTriggerKeydown($event)\"\n class=\"w-full cursor-pointer bg-transparent pl-3.5 text-ink outline-none placeholder:text-ink-faint disabled:cursor-not-allowed\"\n [class.pr-20]=\"showClear()\"\n [class.pr-11]=\"!showClear()\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"absolute right-10 inline-flex h-6 w-6 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"open() ? closeCalendarLabel() : openCalendarLabel()\"\n class=\"absolute right-2 inline-flex h-7 w-7 items-center justify-center rounded-control text-ink-soft hover:bg-muted\"\n (click)=\"toggle($event)\"\n >\n <sds-icon name=\"calendar\" [size]=\"18\" />\n </button>\n </div>\n\n @if (open()) {\n <!-- Relocated to document.body on open (appendTo body) to escape\n ancestor overflow/stacking; positioned via positionPanel(). -->\n <div\n class=\"fixed z-[1000]\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown.escape)=\"onEscape($event)\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <sds-calendar\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [showActions]=\"showActions()\"\n [showTime]=\"showTime()\"\n [showDone]=\"showTime()\"\n [timeLabel]=\"timeLabel()\"\n [hoursLabel]=\"hoursLabel()\"\n [minutesLabel]=\"minutesLabel()\"\n [doneLabel]=\"doneLabel()\"\n [calendarLabel]=\"calendarLabel()\"\n [previousLabel]=\"previousLabel()\"\n [nextLabel]=\"nextLabel()\"\n [todayActionLabel]=\"todayActionLabel()\"\n [clearActionLabel]=\"clearActionLabel()\"\n (valueChange)=\"onCalendarValue($event)\"\n (dateSelect)=\"onDateSelect()\"\n (done)=\"close(true)\"\n />\n </div>\n }\n </div>\n }\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsDatePicker implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n protected readonly fieldId = `sds-date-${nextId++}`;\n\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly placeholder = input<string>('jj/mm/aaaa');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsDatePickerSize>('md');\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly firstDayOfWeek = input<0 | 1>(1);\n readonly locale = input<string>('fr-FR');\n readonly inline = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly showActions = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * When true, the calendar shows a time editor (HH:mm, 24h), the value keeps its time-of-day, and\n * the field displays date + time. The overlay stays open on day-select so the time can be set;\n * a \"done\" action (and click-away / Escape) closes it.\n */\n readonly showTime = input(false, { transform: booleanAttribute });\n /** Custom display formatter for the DATE part (default dd/MM/yyyy). The time is appended as HH:mm. */\n readonly format = input<(d: Date) => string>(formatDdMmYyyy);\n\n /** Visible label of the time editor (forwarded to the calendar). See {@link showTime}. */\n readonly timeLabel = input<string>('Heure');\n /** Accessible name of the hours field (forwarded to the calendar). */\n readonly hoursLabel = input<string>('Heures');\n /** Accessible name of the minutes field (forwarded to the calendar). */\n readonly minutesLabel = input<string>('Minutes');\n /** Visible text of the calendar's \"done\" action, shown in the overlay when {@link showTime}. */\n readonly doneLabel = input<string>('Terminé');\n\n /**\n * Accessible name for the clear button. French default so existing consumers are unchanged, but an\n * app serving more than one language MUST translate it — it is an icon-only control, so this string\n * is its only name.\n */\n readonly clearLabel = input<string>('Effacer la date');\n\n /**\n * Accessible name for the icon-only calendar toggle while the panel is CLOSED. See\n * {@link clearLabel} for why this has to be translatable.\n */\n readonly openCalendarLabel = input<string>('Ouvrir le calendrier');\n\n /** Accessible name for the calendar toggle while the panel is OPEN. See {@link openCalendarLabel}. */\n readonly closeCalendarLabel = input<string>('Fermer le calendrier');\n\n /** Accessible name for the overlay dialog that holds the calendar. */\n readonly panelLabel = input<string>('Sélection de date');\n\n /**\n * Labels forwarded to the embedded <sds-calendar>. They live here because the picker is how the\n * calendar is normally reached — without forwarding, a consumer could translate the field but not\n * the panel it opens. Defaults match SdsCalendar's own, so nothing changes for existing consumers.\n */\n readonly calendarLabel = input<string>('Calendrier');\n readonly previousLabel = input<string>('Précédent');\n readonly nextLabel = input<string>('Suivant');\n readonly todayActionLabel = input<string>(\"Aujourd'hui\");\n readonly clearActionLabel = input<string>('Effacer');\n\n protected readonly value = signal<Date | null>(null);\n protected readonly open = signal(false);\n private readonly cvaDisabled = signal(false);\n private readonly calendar = viewChild(SdsCalendar);\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n /** The overlay panel, relocated to document.body while open. */\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly displayValue = computed(() => {\n const v = this.value();\n if (!v) return '';\n return this.showTime() ? `${this.format()(v)} ${formatHhMm(v)}` : this.format()(v);\n });\n /** Whether the clear button is shown (affects the field's right padding). */\n protected readonly showClear = computed(\n () => this.clearable() && !!this.value() && !this.isDisabled(),\n );\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed pointer-events-none');\n else parts.push('cursor-pointer');\n return parts.join(' ');\n });\n\n protected toggle(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.open.set(true);\n this.onTouched();\n // Run after the overlay is rendered, then relocate it to <body>.\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[role=\"dialog\"]');\n this.positionPanel(); // also relocates to document.body\n this.addReflowListeners();\n this.calendar()?.focusActiveCell();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove(); // pull the body-relocated node before destroying the view\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) {\n this.host.nativeElement.querySelector<HTMLInputElement>('input')?.focus();\n }\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue(null);\n }\n\n protected onCalendarValue(v: Date | null): void {\n this.setValue(v);\n }\n\n /**\n * A day was clicked in the overlay. Without a time editor, a day click is the whole selection, so\n * close. With showTime, the user still needs to set the time, so keep the panel open (they close it\n * with the \"done\" action, a click away, or Escape).\n */\n protected onDateSelect(): void {\n if (!this.showTime()) this.close(true);\n }\n\n /**\n * Escape closes the panel and consumes the event while the panel is open, so an ancestor modal does\n * not also dismiss on the same keystroke (mirrors sds-select). When the panel is already closed, the\n * event passes through so Escape can dismiss whatever contains the field.\n */\n protected onEscape(event: Event): void {\n if (!this.open()) return;\n event.preventDefault();\n this.close(true);\n }\n\n /** The readonly trigger is not a button, so open the overlay on Enter / Space / ArrowDown too. */\n protected onTriggerKeydown(event: Event): void {\n event.preventDefault(); // stop Space/ArrowDown scrolling and Enter submitting an enclosing form\n if (!this.isDisabled() && !this.open()) this.openPanel();\n }\n\n /**\n * Self-contained Tab trap for the overlay. The panel is relocated to document.body, so it sits\n * outside any ancestor modal's focus trap; without this, tabbing off the last control would land on\n * the page behind the dialog. Keeps Tab / Shift+Tab cycling within the panel's own focusables.\n */\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.panelEl) return;\n const sel =\n 'a[href],button:not([disabled]):not([tabindex=\"-1\"]),input:not([disabled]),' +\n '[tabindex]:not([tabindex=\"-1\"])';\n const items = Array.from(this.panelEl.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null,\n );\n if (items.length === 0) return;\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (event.shiftKey && (active === first || !this.panelEl.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n // --- body-appended overlay positioning ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n // capture=true so scrolling any ancestor scroll container repositions.\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n\n // appendTo body: relocate out of any clipping/stacking ancestor.\n if (panelEl.parentElement !== document.body) {\n document.body.appendChild(panelEl);\n }\n\n const r = triggerEl.getBoundingClientRect();\n const ph = panelEl.offsetHeight || 360;\n const pw = panelEl.offsetWidth || 296;\n const gap = 6;\n const margin = 8;\n\n // Below the field by default; flip above when there isn't room.\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n // Align to the field's left, but keep it within the viewport.\n let left = r.left;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n\n // Set directly (position: fixed → viewport coordinates) to avoid a flash.\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private setValue(v: Date | null): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: Date | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: Date | string | number | null): void {\n if (value === null || value === undefined || value === '') {\n this.value.set(null);\n return;\n }\n const d = value instanceof Date ? value : new Date(value);\n this.value.set(isNaN(d.getTime()) ? null : d);\n }\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\nlet nextId = 0;\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Context handed to a custom option template. Lets consumers destructure with\n * `let-option`, `let-selected=\"selected\"`, `let-label=\"label\"`, etc., with full\n * type inference (see {@link SdsSelectOption.ngTemplateContextGuard}).\n */\nexport interface SdsSelectOptionContext {\n /** Same as {@link option} — enables the implicit `let-option` binding. Typed `any` so consumer templates\n * can read their own option fields (e.g. `option.color`) without casting. */\n $implicit: any;\n /** The raw option object (or primitive) from the `options` array. */\n option: any;\n /** The resolved display label (via optionLabel). */\n label: string;\n /** The resolved option value (via optionValue). */\n value: unknown;\n /** Whether this option is currently selected. */\n selected: boolean;\n /** Whether this option is disabled. */\n disabled: boolean;\n /** Zero-based index within the currently displayed (filtered) options. */\n index: number;\n}\n\n/**\n * Supplies a custom template for each option row (and the selected value shown\n * in the trigger) of an `<sds-select>` / `<sds-multi-select>`. Use as a\n * structural template projected into the select:\n *\n * @example\n * <sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"catId\">\n * <ng-template sdsSelectOption let-option let-selected=\"selected\">\n * <span class=\"dot\" [style.background]=\"option.color\"></span>\n * <span class=\"truncate\">{{ option.name }}</span>\n * </ng-template>\n * </sds-select>\n */\n@Directive({\n selector: 'ng-template[sdsSelectOption]',\n standalone: true,\n})\nexport class SdsSelectOption {\n /** The wrapped template, rendered by the host select via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsSelectOptionContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsSelectOptionContext. */\n static ngTemplateContextGuard(\n _dir: SdsSelectOption,\n _ctx: unknown,\n ): _ctx is SdsSelectOptionContext {\n return true;\n }\n}\n\n/** Context handed to a custom empty-state template. */\nexport interface SdsSelectEmptyContext {\n /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */\n $implicit: string;\n /** The current filter query (empty when the field isn't filterable or is blank). */\n filterText: string;\n}\n\n/**\n * Supplies a custom template shown in place of the default \"no results\" message\n * when a select has no (matching) options.\n *\n * @example\n * <ng-template sdsSelectEmpty let-q>No category matches \"{{ q }}\".</ng-template>\n */\n@Directive({\n selector: 'ng-template[sdsSelectEmpty]',\n standalone: true,\n})\nexport class SdsSelectEmpty {\n readonly template = inject<TemplateRef<SdsSelectEmptyContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: SdsSelectEmpty,\n _ctx: unknown,\n ): _ctx is SdsSelectEmptyContext {\n return true;\n }\n}\n\n/** Context handed to a custom footer template. */\nexport interface SdsSelectFooterContext {\n /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */\n $implicit: string;\n /** The current filter query. */\n filterText: string;\n /** Closes the open panel — handy for a footer action (e.g. \"+ New…\"). */\n close: () => void;\n}\n\n/**\n * Supplies a custom sticky footer rendered below the option list — e.g. a\n * \"+ Create new\" action. The `close` context callback dismisses the panel.\n *\n * @example\n * <ng-template sdsSelectFooter let-close=\"close\">\n * <button (click)=\"createCategory(); close()\">+ New category</button>\n * </ng-template>\n */\n@Directive({\n selector: 'ng-template[sdsSelectFooter]',\n standalone: true,\n})\nexport class SdsSelectFooter {\n readonly template = inject<TemplateRef<SdsSelectFooterContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _dir: SdsSelectFooter,\n _ctx: unknown,\n ): _ctx is SdsSelectFooterContext {\n return true;\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SdsSelectEmpty,\n SdsSelectFooter,\n SdsSelectOption,\n SdsSelectOptionContext,\n} from './sds-select-templates';\n\nexport type SdsSelectSize = 'sm' | 'md' | 'lg';\n/** Field skin. `filled` is borderless on a muted ground (to sit inside a page, matching sds-input's\n * filled appearance); `on-brand` is tuned for a dark surface. */\nexport type SdsSelectAppearance = 'default' | 'filled' | 'on-brand';\n\ninterface NormOption {\n label: string;\n value: unknown;\n disabled: boolean;\n /** The original option (object or primitive), passed to a custom option template. */\n raw: unknown;\n}\n\nconst SIZES: Record<SdsSelectSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * Single-select dropdown. Options may be primitives or objects (configure via\n * [optionLabel]/[optionValue]/[optionDisabled]). The overlay is appended to\n * <body>. Supports filtering, clearing, and full keyboard navigation.\n * Implements ControlValueAccessor — use with reactive forms or [(ngModel)].\n *\n * For object options, set [optionValue] or [dataKey] so written values match by\n * key; otherwise selection matching falls back to reference equality (a written\n * copy of an option will not match).\n *\n * Options render as plain text by default. To render richer options (an icon,\n * an avatar, a two-line row…) project template directives — the same content\n * also renders in the trigger for the selected value:\n * - `<ng-template sdsSelectOption let-option>` — one option row (see {@link SdsSelectOption});\n * context: the raw `option` (implicit), plus `label`, `value`, `selected`, `disabled`, `index`.\n * - `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n * - `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action, e.g. \"+ New…\"\n * (see {@link SdsSelectFooter}); `close()` dismisses the panel.\n *\n * @example\n * <sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"id\"\n * placeholder=\"Choisir un service\" [(ngModel)]=\"serviceId\" filter clearable />\n *\n * @example\n * <sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"categoryId\">\n * <ng-template sdsSelectOption let-option>\n * <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n * </ng-template>\n * </sds-select>\n */\n@Component({\n selector: 'sds-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsSelect), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"selectId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div class=\"relative\">\n <div\n #trigger\n [id]=\"selectId\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-activedescendant]=\"open() ? activeDescId() : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n class=\"relative flex items-center rounded-control border transition-colors focus:outline-none\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (optionTpl() && selectedOption()) {\n <span class=\"flex flex-1 items-center gap-2 truncate pl-3.5 text-ink\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"triggerContext()!\"\n />\n </span>\n } @else {\n <span\n class=\"flex-1 truncate pl-3.5\"\n [class]=\"selectedOption() ? 'text-ink' : 'text-ink-faint'\"\n >\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n }\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Effacer la sélection\"\n class=\"mr-1 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <span\n class=\"mr-3 ml-1 inline-flex shrink-0 items-center justify-center text-ink-soft transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"18\" />\n </span>\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div data-sds-select-panel class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\">\n @if (filter()) {\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n role=\"combobox\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeDescId()\"\n [placeholder]=\"filterPlaceholder()\"\n [value]=\"filterText()\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n aria-label=\"Rechercher\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n />\n </div>\n </div>\n }\n\n <ul [id]=\"listId\" role=\"listbox\" class=\"max-h-60 overflow-auto py-1\">\n @for (opt of filteredOptions(); track $index; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? 'true' : null\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, opt)\"\n (click)=\"opt.disabled ? null : selectOption(opt)\"\n (mouseenter)=\"opt.disabled ? null : highlightedIndex.set(i)\"\n >\n @if (optionTpl()) {\n <span class=\"flex min-w-0 flex-1 items-center gap-2\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"optionContext(opt, i)\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{ opt.label }}</span>\n }\n @if (isSelected(opt.value)) {\n <sds-icon name=\"check\" [size]=\"16\" class=\"shrink-0 text-brand-600\" />\n }\n </li>\n } @empty {\n @if (emptyTpl()) {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">\n <ng-container\n [ngTemplateOutlet]=\"emptyTpl()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: filterText(), filterText: filterText() }\"\n />\n </li>\n } @else {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ emptyMessage() }}</li>\n }\n }\n </ul>\n\n @if (footerTpl()) {\n <div class=\"border-t border-border\">\n <ng-container\n [ngTemplateOutlet]=\"footerTpl()!.template\"\n [ngTemplateOutletContext]=\"footerContext()\"\n />\n </div>\n }\n </div>\n }\n </div>\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsSelect implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly selectId = `sds-select-${nextId++}`;\n protected readonly listId = `${this.selectId}-list`;\n\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<string>('label');\n readonly optionValue = input<string>('');\n readonly optionDisabled = input<string>('disabled');\n /** Key used to compare object values for selection equality. */\n readonly dataKey = input<string>('');\n readonly placeholder = input<string>('Sélectionner…');\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsSelectSize>('md');\n readonly appearance = input<SdsSelectAppearance>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly filter = input(false, { transform: booleanAttribute });\n readonly filterPlaceholder = input<string>('Rechercher…');\n readonly emptyMessage = input<string>('Aucun résultat');\n\n /** Optional projected `<ng-template sdsSelectOption>` — custom option + selected-value rendering. */\n protected readonly optionTpl = contentChild(SdsSelectOption);\n /** Optional projected `<ng-template sdsSelectEmpty>` — custom no-results content. */\n protected readonly emptyTpl = contentChild(SdsSelectEmpty);\n /** Optional projected `<ng-template sdsSelectFooter>` — a sticky footer action. */\n protected readonly footerTpl = contentChild(SdsSelectFooter);\n\n protected readonly value = signal<unknown>(null);\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n private readonly cvaDisabled = signal(false);\n\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly filled = computed(() => this.appearance() === 'filled');\n protected readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly normalizedOptions = computed<NormOption[]>(() =>\n this.options().map((o) => this.norm(o)),\n );\n\n protected readonly filteredOptions = computed<NormOption[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.normalizedOptions();\n if (!this.filter() || !f) return all;\n return all.filter((o) => o.label.toLowerCase().includes(f));\n });\n\n protected readonly selectedOption = computed<NormOption | null>(\n () => this.normalizedOptions().find((o) => this.equals(o.value, this.value())) ?? null,\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && this.value() != null && !this.isDisabled(),\n );\n\n protected readonly activeDescId = computed(() =>\n this.highlightedIndex() >= 0 ? this.optionId(this.highlightedIndex()) : null,\n );\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n if (this.filled()) {\n // border-transparent (not border-0) so a filled field is the same height as a bordered one when a\n // form mixes them — mirrors sds-input's filled appearance.\n parts.push('border-transparent bg-muted text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/25'\n : 'focus:ring-2 focus:ring-brand-500/25',\n );\n } else if (this.onBrand()) {\n parts.push('bg-white/10 text-white');\n parts.push(\n this.error()\n ? 'border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-white/15 focus:border-white/40 focus:ring-2 focus:ring-white/20',\n );\n } else {\n parts.push('bg-surface text-ink');\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n }\n parts.push(\n this.isDisabled()\n ? 'opacity-60 cursor-not-allowed pointer-events-none'\n : 'cursor-pointer',\n );\n return parts.join(' ');\n });\n\n // --- option normalization & equality ---\n private norm(raw: unknown): NormOption {\n if (raw !== null && typeof raw === 'object') {\n const o = raw as Record<string, unknown>;\n const labelKey = this.optionLabel();\n const label =\n labelKey && labelKey in o ? String(o[labelKey]) : String(o['label'] ?? raw);\n const value = this.optionValue() ? o[this.optionValue()] : raw;\n const disabled = this.optionDisabled() ? !!o[this.optionDisabled()] : !!o['disabled'];\n return { label, value, disabled, raw };\n }\n return { label: String(raw), value: raw, disabled: false, raw };\n }\n\n /** Context for a projected option template (an option row). */\n protected optionContext(opt: NormOption, index: number): SdsSelectOptionContext {\n return {\n $implicit: opt.raw,\n option: opt.raw,\n label: opt.label,\n value: opt.value,\n selected: this.isSelected(opt.value),\n disabled: opt.disabled,\n index,\n };\n }\n\n /** Context for the option template reused in the trigger to render the selected value. */\n protected readonly triggerContext = computed<SdsSelectOptionContext | null>(() => {\n const sel = this.selectedOption();\n return sel ? this.optionContext(sel, -1) : null;\n });\n\n /** Context for a projected footer template. */\n protected footerContext() {\n return { $implicit: this.filterText(), filterText: this.filterText(), close: () => this.close(true) };\n }\n\n private equals(a: unknown, b: unknown): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k];\n }\n return a === b;\n }\n\n protected isSelected(v: unknown): boolean {\n return this.value() != null && this.equals(v, this.value());\n }\n\n protected optionId(i: number): string {\n return `${this.selectId}-opt-${i}`;\n }\n\n protected optionClass(i: number, opt: NormOption): string {\n const base = 'flex cursor-pointer items-center justify-between gap-2 px-3 py-2 text-sm';\n if (opt.disabled) return `${base} cursor-not-allowed text-ink-faint opacity-60`;\n let cls = `${base} text-ink`;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (this.isSelected(opt.value)) cls += ' font-medium text-brand-700';\n return cls;\n }\n\n // --- open / close ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.open.set(true);\n this.onTouched();\n this.initHighlight();\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>(\n '[data-sds-select-panel]',\n );\n this.positionPanel();\n this.addReflowListeners();\n if (this.filter()) {\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n } else {\n this.trigger()?.nativeElement.focus();\n }\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue(null);\n }\n\n protected selectOption(opt: NormOption): void {\n this.setValue(opt.value);\n this.close(true);\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightFirst();\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n if (this.handleNavKey(event)) return;\n // Type-ahead (no-filter mode keeps focus on the trigger).\n if (\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n this.typeAhead(event.key);\n }\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): boolean {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); return true;\n case 'ArrowUp': event.preventDefault(); this.move(-1); return true;\n case 'Home': event.preventDefault(); this.highlightFirst(); return true;\n case 'End': event.preventDefault(); this.highlightLast(); return true;\n case 'Enter': event.preventDefault(); this.selectHighlighted(); return true;\n case 'Escape': event.preventDefault(); this.close(true); return true;\n case 'Tab': this.close(false); return true;\n default: return false;\n }\n }\n\n private initHighlight(): void {\n const opts = this.filteredOptions();\n const sel = opts.findIndex((o) => !o.disabled && this.equals(o.value, this.value()));\n this.highlightedIndex.set(sel >= 0 ? sel : this.firstEnabled(opts));\n }\n\n private firstEnabled(opts: NormOption[]): number {\n return opts.findIndex((o) => !o.disabled);\n }\n\n private move(delta: number): void {\n const opts = this.filteredOptions();\n if (!opts.length) return;\n let i = this.highlightedIndex();\n for (let step = 0; step < opts.length; step++) {\n i = (i + delta + opts.length) % opts.length;\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private highlightFirst(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n this.scrollHighlightedIntoView();\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private selectHighlighted(): void {\n const opt = this.filteredOptions()[this.highlightedIndex()];\n if (opt && !opt.disabled) this.selectOption(opt);\n }\n\n private typeBuffer = '';\n private typeTimer?: ReturnType<typeof setTimeout>;\n private typeAhead(char: string): void {\n clearTimeout(this.typeTimer);\n this.typeBuffer += char.toLowerCase();\n const opts = this.filteredOptions();\n const idx = opts.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (idx >= 0) {\n this.highlightedIndex.set(idx);\n this.scrollHighlightedIntoView();\n }\n this.typeTimer = setTimeout(() => (this.typeBuffer = ''), 600);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n const el = this.panelEl?.querySelector<HTMLElement>(\n `[data-index=\"${this.highlightedIndex()}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-date-picker) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 240;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n clearTimeout(this.typeTimer);\n this.panelEl?.remove();\n }\n\n private setValue(v: unknown): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: unknown) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.value.set(value ?? null);\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n numberAttribute,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SdsSelectEmpty,\n SdsSelectFooter,\n SdsSelectOption,\n SdsSelectOptionContext,\n} from './sds-select-templates';\n\nexport type SdsMultiSelectSize = 'sm' | 'md' | 'lg';\nexport type SdsMultiSelectDisplay = 'comma' | 'chip';\n\ninterface NormOption {\n label: string;\n value: unknown;\n disabled: boolean;\n /** The original option (object or primitive), passed to a custom option template. */\n raw: unknown;\n}\n\nconst SIZES: Record<SdsMultiSelectSize, string> = {\n sm: 'min-h-9 text-sm',\n md: 'min-h-10 text-sm',\n lg: 'min-h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * Multi-select dropdown (value is an array). Options may be primitives or\n * objects (configure via [optionLabel]/[optionValue]/[optionDisabled]). The\n * overlay is appended to <body>. Supports a \"select all\" toggle, per-option\n * checkboxes, chip or comma display, filtering, clearing and keyboard nav.\n * Implements ControlValueAccessor — use with reactive forms or [(ngModel)].\n *\n * For object options, set [optionValue] or [dataKey] so written values match by\n * key; otherwise matching falls back to reference equality.\n *\n * Project template directives to customise the panel:\n * - `<ng-template sdsSelectOption let-option>` — the content of each option row, after its\n * checkbox (see {@link SdsSelectOption}); context: the raw `option` (implicit), plus `label`,\n * `value`, `selected`, `disabled`, `index`.\n * - `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n * - `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action (see {@link SdsSelectFooter});\n * `close()` dismisses the panel.\n *\n * @example\n * <sds-multi-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\"\n * display=\"chip\" filter [(ngModel)]=\"codes\" />\n *\n * @example\n * <sds-multi-select [options]=\"tags\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"tagIds\">\n * <ng-template sdsSelectOption let-option>\n * <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n * </ng-template>\n * </sds-multi-select>\n */\n@Component({\n selector: 'sds-multi-select',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, NgTemplateOutlet],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsMultiSelect), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"selectId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div class=\"relative\">\n <div\n #trigger\n [id]=\"selectId\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-activedescendant]=\"open() && !filter() ? activeDescId() : null\"\n [attr.aria-label]=\"!label() && ariaLabel() ? ariaLabel() : null\"\n class=\"relative flex items-center rounded-control border bg-surface transition-colors focus:outline-none\"\n [class]=\"wrapperClasses()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n @if (display() === 'chip' && selectedOptions().length) {\n <div class=\"flex flex-1 flex-wrap items-center gap-1 py-1 pl-2\">\n @for (opt of selectedOptions(); track $index) {\n <span class=\"inline-flex items-center gap-1 rounded bg-brand-50 py-0.5 pl-2 pr-1 text-xs font-medium text-brand-700\">\n {{ opt.label }}\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Retirer ' + opt.label\"\n class=\"inline-flex h-4 w-4 items-center justify-center rounded-full hover:bg-brand-100\"\n (click)=\"removeChip($event, opt)\"\n >\n <sds-icon name=\"x\" [size]=\"12\" />\n </button>\n </span>\n }\n </div>\n } @else {\n <span\n class=\"flex-1 truncate pl-3.5\"\n [class]=\"selectedOptions().length ? 'text-ink' : 'text-ink-faint'\"\n >\n {{ triggerLabel() }}\n </span>\n }\n\n @if (showClear()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Tout effacer\"\n class=\"mr-1 inline-flex h-6 w-6 shrink-0 items-center justify-center self-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear($event)\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n\n <span\n class=\"mr-3 ml-1 shrink-0 self-center text-ink-soft transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n >\n <sds-icon name=\"chevron-down\" [size]=\"18\" />\n </span>\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div data-sds-select-panel class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\">\n @if (filter()) {\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n role=\"combobox\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeDescId()\"\n [placeholder]=\"filterPlaceholder()\"\n [value]=\"filterText()\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n aria-label=\"Rechercher\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n />\n </div>\n </div>\n }\n\n @if (hasToggleAll()) {\n <button\n type=\"button\"\n role=\"checkbox\"\n [id]=\"toggleAllId\"\n [attr.data-index]=\"-1\"\n [attr.aria-checked]=\"allFilteredSelected() ? 'true' : (toggleAllIndeterminate() ? 'mixed' : 'false')\"\n class=\"flex w-full items-center gap-2.5 border-b border-border px-3 py-2 text-sm text-ink\"\n [class.bg-brand-50]=\"highlightedIndex() === -1\"\n (click)=\"toggleAll()\"\n (mouseenter)=\"highlightedIndex.set(-1)\"\n >\n <span class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border\" [class]=\"checkboxClass(allFilteredSelected(), toggleAllIndeterminate())\">\n @if (allFilteredSelected()) {\n <sds-icon name=\"check\" [size]=\"12\" />\n } @else if (toggleAllIndeterminate()) {\n <span class=\"h-0.5 w-2.5 rounded-full bg-white\"></span>\n }\n </span>\n Tout sélectionner\n </button>\n }\n\n <ul [id]=\"listId\" role=\"listbox\" aria-multiselectable=\"true\" class=\"max-h-60 overflow-auto py-1\">\n @for (opt of filteredOptions(); track $index; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? 'true' : null\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, opt)\"\n (click)=\"opt.disabled ? null : toggleOption(opt)\"\n (mouseenter)=\"opt.disabled ? null : highlightedIndex.set(i)\"\n >\n <span class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border\" [class]=\"checkboxClass(isSelected(opt.value), false)\">\n @if (isSelected(opt.value)) {\n <sds-icon name=\"check\" [size]=\"12\" />\n }\n </span>\n @if (optionTpl()) {\n <span class=\"flex min-w-0 flex-1 items-center gap-2\">\n <ng-container\n [ngTemplateOutlet]=\"optionTpl()!.template\"\n [ngTemplateOutletContext]=\"optionContext(opt, i)\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{ opt.label }}</span>\n }\n </li>\n } @empty {\n @if (emptyTpl()) {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">\n <ng-container\n [ngTemplateOutlet]=\"emptyTpl()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: filterText(), filterText: filterText() }\"\n />\n </li>\n } @else {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ emptyMessage() }}</li>\n }\n }\n </ul>\n\n @if (footerTpl()) {\n <div class=\"border-t border-border\">\n <ng-container\n [ngTemplateOutlet]=\"footerTpl()!.template\"\n [ngTemplateOutletContext]=\"footerContext()\"\n />\n </div>\n }\n </div>\n }\n </div>\n\n @if (hint() && !error()) {\n <p class=\"mt-1.5 text-xs text-ink-faint\">{{ hint() }}</p>\n }\n @if (error()) {\n <p class=\"mt-1.5 text-xs font-medium text-danger\">{{ error() }}</p>\n }\n `,\n})\nexport class SdsMultiSelect implements ControlValueAccessor, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly selectId = `sds-multiselect-${nextId++}`;\n protected readonly listId = `${this.selectId}-list`;\n\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<string>('label');\n readonly optionValue = input<string>('');\n readonly optionDisabled = input<string>('disabled');\n readonly dataKey = input<string>('');\n readonly placeholder = input<string>('Sélectionner…');\n readonly label = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly size = input<SdsMultiSelectSize>('md');\n readonly display = input<SdsMultiSelectDisplay>('comma');\n /** In comma mode, show a count label once more than this many are selected. */\n readonly maxSelectedLabels = input(3, { transform: numberAttribute });\n readonly selectedItemsLabel = input<string>('{0} éléments sélectionnés');\n readonly showToggleAll = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly filter = input(false, { transform: booleanAttribute });\n readonly filterPlaceholder = input<string>('Rechercher…');\n readonly emptyMessage = input<string>('Aucun résultat');\n\n /** Optional projected `<ng-template sdsSelectOption>` — custom option-row rendering. */\n protected readonly optionTpl = contentChild(SdsSelectOption);\n /** Optional projected `<ng-template sdsSelectEmpty>` — custom no-results content. */\n protected readonly emptyTpl = contentChild(SdsSelectEmpty);\n /** Optional projected `<ng-template sdsSelectFooter>` — a sticky footer action. */\n protected readonly footerTpl = contentChild(SdsSelectFooter);\n\n protected readonly value = signal<unknown[]>([]);\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n private readonly cvaDisabled = signal(false);\n\n private readonly trigger = viewChild<ElementRef<HTMLElement>>('trigger');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n protected readonly normalizedOptions = computed<NormOption[]>(() =>\n this.options().map((o) => this.norm(o)),\n );\n\n protected readonly filteredOptions = computed<NormOption[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.normalizedOptions();\n if (!this.filter() || !f) return all;\n return all.filter((o) => o.label.toLowerCase().includes(f));\n });\n\n protected readonly selectedOptions = computed<NormOption[]>(() =>\n this.normalizedOptions().filter((o) => this.isSelected(o.value)),\n );\n\n protected readonly showClear = computed(\n () => this.clearable() && this.value().length > 0 && !this.isDisabled(),\n );\n\n protected readonly triggerLabel = computed(() => {\n const sel = this.selectedOptions();\n const total = this.value().length;\n if (!total) return this.placeholder();\n const max = this.maxSelectedLabels();\n const limit = Number.isFinite(max) ? max : 3;\n if (total <= limit) {\n const labels = sel.map((o) => o.label).join(', ');\n // Some selected values may not resolve to a current option.\n return total > sel.length ? `${labels} +${total - sel.length}`.trim() : labels;\n }\n return this.selectedItemsLabel().replace('{0}', String(total));\n });\n\n private readonly filteredEnabled = computed(() =>\n this.filteredOptions().filter((o) => !o.disabled),\n );\n protected readonly allFilteredSelected = computed(() => {\n const e = this.filteredEnabled();\n return e.length > 0 && e.every((o) => this.isSelected(o.value));\n });\n protected readonly toggleAllIndeterminate = computed(\n () => !this.allFilteredSelected() && this.filteredEnabled().some((o) => this.isSelected(o.value)),\n );\n /** Show the select-all row only when there is at least one enabled option. */\n protected readonly hasToggleAll = computed(\n () => this.showToggleAll() && this.filteredEnabled().length > 0,\n );\n protected readonly toggleAllId = `${this.selectId}-all`;\n\n protected readonly activeDescId = computed(() => {\n const i = this.highlightedIndex();\n if (i === -1) return this.hasToggleAll() ? this.toggleAllId : null;\n return i >= 0 ? this.optionId(i) : null;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.error()\n ? 'border-danger focus:border-danger focus:ring-2 focus:ring-danger/25'\n : 'border-border focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25',\n );\n parts.push(\n this.isDisabled()\n ? 'opacity-60 cursor-not-allowed pointer-events-none'\n : 'cursor-pointer',\n );\n return parts.join(' ');\n });\n\n // --- normalization & equality ---\n private norm(raw: unknown): NormOption {\n if (raw !== null && typeof raw === 'object') {\n const o = raw as Record<string, unknown>;\n const labelKey = this.optionLabel();\n const label =\n labelKey && labelKey in o ? String(o[labelKey]) : String(o['label'] ?? raw);\n const value = this.optionValue() ? o[this.optionValue()] : raw;\n const disabled = this.optionDisabled() ? !!o[this.optionDisabled()] : !!o['disabled'];\n return { label, value, disabled, raw };\n }\n return { label: String(raw), value: raw, disabled: false, raw };\n }\n\n /** Context for a projected option template (an option row). */\n protected optionContext(opt: NormOption, index: number): SdsSelectOptionContext {\n return {\n $implicit: opt.raw,\n option: opt.raw,\n label: opt.label,\n value: opt.value,\n selected: this.isSelected(opt.value),\n disabled: opt.disabled,\n index,\n };\n }\n\n /** Context for a projected footer template. */\n protected footerContext() {\n return { $implicit: this.filterText(), filterText: this.filterText(), close: () => this.close(true) };\n }\n\n private equals(a: unknown, b: unknown): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k];\n }\n return a === b;\n }\n\n protected isSelected(v: unknown): boolean {\n return this.value().some((x) => this.equals(x, v));\n }\n\n protected optionId(i: number): string {\n return `${this.selectId}-opt-${i}`;\n }\n\n protected optionClass(i: number, opt: NormOption): string {\n const base = 'flex cursor-pointer items-center gap-2.5 px-3 py-2 text-sm';\n if (opt.disabled) return `${base} cursor-not-allowed text-ink-faint opacity-60`;\n let cls = `${base} text-ink`;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (this.isSelected(opt.value)) cls += ' font-medium';\n return cls;\n }\n\n protected checkboxClass(checked: boolean, indeterminate: boolean): string {\n return checked || indeterminate\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface';\n }\n\n // --- open / close ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.open.set(true);\n this.onTouched();\n this.initHighlight();\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[data-sds-select-panel]');\n this.positionPanel();\n this.addReflowListeners();\n if (this.filter()) {\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n } else {\n this.trigger()?.nativeElement.focus();\n }\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.setValue([]);\n }\n\n protected removeChip(event: Event, opt: NormOption): void {\n event.stopPropagation();\n this.toggleOption(opt);\n }\n\n protected toggleOption(opt: NormOption): void {\n const cur = this.value();\n const exists = cur.some((x) => this.equals(x, opt.value));\n const next = exists\n ? cur.filter((x) => !this.equals(x, opt.value))\n : [...cur, opt.value];\n this.setValue(next);\n }\n\n protected toggleAll(): void {\n const enabled = this.filteredEnabled();\n if (this.allFilteredSelected()) {\n this.setValue(\n this.value().filter((v) => !enabled.some((o) => this.equals(o.value, v))),\n );\n } else {\n const toAdd = enabled.filter((o) => !this.isSelected(o.value)).map((o) => o.value);\n this.setValue([...this.value(), ...toAdd]);\n }\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightFirst();\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n } else if (event.key === 'Backspace' && this.selectedOptions().length) {\n event.preventDefault();\n const sel = this.selectedOptions();\n this.toggleOption(sel[sel.length - 1]);\n }\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.toggleHighlighted();\n return;\n }\n if (this.handleNavKey(event)) return;\n if (\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n this.typeAhead(event.key);\n }\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): boolean {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); return true;\n case 'ArrowUp': event.preventDefault(); this.move(-1); return true;\n case 'Home': event.preventDefault(); this.highlightFirst(); return true;\n case 'End': event.preventDefault(); this.highlightLast(); return true;\n case 'Enter': event.preventDefault(); this.toggleHighlighted(); return true;\n case 'Escape': event.preventDefault(); this.close(true); return true;\n case 'Tab': this.close(false); return true;\n default: return false;\n }\n }\n\n private initHighlight(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n }\n\n private firstEnabled(opts: NormOption[]): number {\n return opts.findIndex((o) => !o.disabled);\n }\n\n private move(delta: number): void {\n // Navigable rows: the select-all sentinel (-1) followed by enabled options.\n const nav: number[] = [];\n if (this.hasToggleAll()) nav.push(-1);\n this.filteredOptions().forEach((o, i) => {\n if (!o.disabled) nav.push(i);\n });\n if (!nav.length) return;\n const cur = nav.indexOf(this.highlightedIndex());\n const next = cur === -1 ? (delta > 0 ? 0 : nav.length - 1) : (cur + delta + nav.length) % nav.length;\n this.highlightedIndex.set(nav[next]);\n this.scrollHighlightedIntoView();\n }\n\n private highlightFirst(): void {\n this.highlightedIndex.set(this.firstEnabled(this.filteredOptions()));\n this.scrollHighlightedIntoView();\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n return;\n }\n }\n }\n\n private toggleHighlighted(): void {\n if (this.highlightedIndex() === -1) {\n if (this.hasToggleAll()) this.toggleAll();\n return;\n }\n const opt = this.filteredOptions()[this.highlightedIndex()];\n if (opt && !opt.disabled) this.toggleOption(opt);\n }\n\n private typeBuffer = '';\n private typeTimer?: ReturnType<typeof setTimeout>;\n private typeAhead(char: string): void {\n clearTimeout(this.typeTimer);\n this.typeBuffer += char.toLowerCase();\n const opts = this.filteredOptions();\n const idx = opts.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(this.typeBuffer),\n );\n if (idx >= 0) {\n this.highlightedIndex.set(idx);\n this.scrollHighlightedIntoView();\n }\n this.typeTimer = setTimeout(() => (this.typeBuffer = ''), 600);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n const el = this.panelEl?.querySelector<HTMLElement>(\n `[data-index=\"${this.highlightedIndex()}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 240;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n clearTimeout(this.typeTimer);\n this.panelEl?.remove();\n }\n\n private setValue(v: unknown[]): void {\n this.value.set(v);\n this.onChange(v);\n this.onTouched();\n // Chip display can change the trigger height while the panel is open.\n if (this.open()) setTimeout(() => this.positionPanel());\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: unknown[]) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: unknown[] | null): void {\n this.value.set(Array.isArray(value) ? [...value] : []);\n }\n registerOnChange(fn: (value: unknown[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n}\n","/**\n * Curated country dataset for <sds-phone-input>. Dependency-free: each entry\n * carries the dial code, the valid national-significant digit length(s) used\n * for validation, a best-effort display mask (# = a digit) and an example.\n *\n * `lengths` are the number of significant national digits, i.e. excluding the\n * dial code and any leading trunk \"0\". Add or override entries as needed.\n */\nexport interface SdsPhoneCountry {\n /** ISO 3166-1 alpha-2 code, e.g. 'BE'. */\n iso2: string;\n /** Localised display name. */\n name: string;\n /** International dial code without '+', e.g. '32'. */\n dialCode: string;\n /** Valid national-significant digit counts (excluding dial/trunk). */\n lengths: number[];\n /** Display grouping mask; '#' is a digit placeholder, other chars are literal. */\n format: string;\n /** Example national-significant number (digits only) for the placeholder. */\n example: string;\n}\n\nexport const SDS_PHONE_COUNTRIES: readonly SdsPhoneCountry[] = [\n { iso2: 'BE', name: 'Belgique', dialCode: '32', lengths: [9], format: '### ## ## ##', example: '470123456' },\n { iso2: 'FR', name: 'France', dialCode: '33', lengths: [9], format: '# ## ## ## ##', example: '612345678' },\n { iso2: 'LU', name: 'Luxembourg', dialCode: '352', lengths: [9, 8, 6], format: '### ### ###', example: '628123456' },\n { iso2: 'NL', name: 'Pays-Bas', dialCode: '31', lengths: [9], format: '# ## ## ## ##', example: '612345678' },\n { iso2: 'DE', name: 'Allemagne', dialCode: '49', lengths: [10, 11], format: '#### #######', example: '15123456789' },\n { iso2: 'GB', name: 'Royaume-Uni', dialCode: '44', lengths: [10], format: '#### ######', example: '7400123456' },\n { iso2: 'IE', name: 'Irlande', dialCode: '353', lengths: [9], format: '## ### ####', example: '850123456' },\n { iso2: 'CH', name: 'Suisse', dialCode: '41', lengths: [9], format: '## ### ## ##', example: '781234567' },\n { iso2: 'ES', name: 'Espagne', dialCode: '34', lengths: [9], format: '### ## ## ##', example: '612345678' },\n { iso2: 'IT', name: 'Italie', dialCode: '39', lengths: [9, 10], format: '### ### ####', example: '3123456789' },\n { iso2: 'PT', name: 'Portugal', dialCode: '351', lengths: [9], format: '### ### ###', example: '912345678' },\n { iso2: 'AT', name: 'Autriche', dialCode: '43', lengths: [10, 11], format: '### #######', example: '6641234567' },\n { iso2: 'DK', name: 'Danemark', dialCode: '45', lengths: [8], format: '## ## ## ##', example: '20123456' },\n { iso2: 'SE', name: 'Suède', dialCode: '46', lengths: [9], format: '## ### ## ##', example: '701234567' },\n { iso2: 'NO', name: 'Norvège', dialCode: '47', lengths: [8], format: '### ## ###', example: '40612345' },\n { iso2: 'PL', name: 'Pologne', dialCode: '48', lengths: [9], format: '### ### ###', example: '512345678' },\n { iso2: 'US', name: 'États-Unis', dialCode: '1', lengths: [10], format: '(###) ###-####', example: '2015550123' },\n { iso2: 'CA', name: 'Canada', dialCode: '1', lengths: [10], format: '(###) ###-####', example: '2042345678' },\n { iso2: 'MA', name: 'Maroc', dialCode: '212', lengths: [9], format: '### ## ## ##', example: '612345678' },\n { iso2: 'TR', name: 'Turquie', dialCode: '90', lengths: [10], format: '### ### ## ##', example: '5012345678' },\n];\n\n/** Reduce raw input to national-significant digits (drops non-digits & leading trunk zeros). */\nexport function sdsNormalizeSignificant(raw: string): string {\n return (raw ?? '').replace(/\\D/g, '').replace(/^0+/, '');\n}\n\n/**\n * Group `digits` for display using `mask` ('#' = digit). Digits beyond the mask\n * are appended grouped in pairs; an incomplete number stops at the last digit.\n */\nexport function sdsFormatNational(digits: string, mask: string): string {\n if (!digits) return '';\n if (!mask) return digits.replace(/(\\d{2})(?=\\d)/g, '$1 ');\n\n let out = '';\n let di = 0;\n for (const ch of mask) {\n if (di >= digits.length) break;\n if (ch === '#') out += digits[di++];\n else out += ch;\n }\n if (di < digits.length) {\n out += ' ' + digits.slice(di).replace(/(\\d{2})(?=\\d)/g, '$1 ');\n }\n return out.trim();\n}\n\n/** Find the country whose dial code is the longest prefix of an E.164 digit string. */\nexport function sdsMatchDialCode(\n e164Digits: string,\n countries: readonly SdsPhoneCountry[],\n): SdsPhoneCountry | null {\n let best: SdsPhoneCountry | null = null;\n for (const c of countries) {\n if (e164Digits.startsWith(c.dialCode)) {\n if (!best || c.dialCode.length > best.dialCode.length) best = c;\n }\n }\n return best;\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport {\n SDS_PHONE_COUNTRIES,\n SdsPhoneCountry,\n sdsFormatNational,\n sdsMatchDialCode,\n sdsNormalizeSignificant,\n} from './phone-countries';\n\nexport type SdsPhoneInputSize = 'sm' | 'md' | 'lg';\n\n/** Payload of (phoneChange): the canonical and parsed parts of the number. */\nexport interface SdsPhoneValue {\n /** E.164 string, e.g. '+32470123456' (empty when no number is entered). */\n e164: string;\n /** Selected country ISO2 code. */\n country: string;\n /** Dial code without '+', e.g. '32'. */\n dialCode: string;\n /** National-significant digits, e.g. '470123456'. */\n national: string;\n /** Whether the national number matches an expected length for the country. */\n valid: boolean;\n}\n\nconst SIZES: Record<SdsPhoneInputSize, string> = {\n sm: 'h-9 text-sm',\n md: 'h-10 text-sm',\n lg: 'h-12 text-base',\n};\n\nlet nextId = 0;\n\n/**\n * International phone number input: a country selector (ISO chip + dial code)\n * with a searchable, body-appended dropdown, plus a formatted national-number\n * field. Implements ControlValueAccessor (value is an E.164 string such as\n * '+32470123456') and Validator (national length is checked per country).\n *\n * @example\n * <sds-phone-input label=\"Téléphone\" defaultCountry=\"BE\"\n * [preferredCountries]=\"['BE','FR','LU']\"\n * [(ngModel)]=\"phone\" required />\n */\n@Component({\n selector: 'sds-phone-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsPhoneInput), multi: true },\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => SdsPhoneInput), multi: true },\n ],\n host: {\n class: 'block',\n '(document:click)': 'onDocumentClick($event)',\n },\n template: `\n @if (label()) {\n <label [for]=\"fieldId\" class=\"mb-1.5 block text-sm font-medium text-ink\">\n {{ label() }}\n </label>\n }\n\n <div\n #anchor\n class=\"relative flex items-stretch rounded-control border bg-surface transition-colors\"\n [class]=\"wrapperClasses()\"\n >\n <!-- country selector -->\n <button\n type=\"button\"\n role=\"combobox\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n aria-haspopup=\"listbox\"\n [attr.aria-label]=\"countryAriaLabel()\"\n class=\"flex shrink-0 items-center gap-1.5 rounded-l-control pl-2.5 pr-2 focus:outline-none\"\n [class.cursor-not-allowed]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"grid h-5 min-w-7 place-items-center rounded bg-muted px-1 text-[11px] font-semibold tracking-wide text-ink-soft\">\n {{ country().iso2 }}\n </span>\n <span class=\"text-ink-soft\">+{{ country().dialCode }}</span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n class=\"text-ink-faint transition-transform duration-150\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n <div class=\"my-1.5 w-px shrink-0 bg-border\"></div>\n\n <!-- national number -->\n <input\n #field\n [id]=\"fieldId\"\n type=\"tel\"\n inputmode=\"tel\"\n autocomplete=\"tel-national\"\n [placeholder]=\"placeholderText()\"\n [disabled]=\"isDisabled()\"\n [value]=\"display()\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n class=\"w-full min-w-0 bg-transparent px-3 outline-none placeholder:text-ink-faint disabled:cursor-not-allowed\"\n (input)=\"onInput($event)\"\n (blur)=\"markTouched()\"\n />\n\n @if (clearable() && national() && !isDisabled()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"clearLabel()\"\n class=\"mr-1.5 inline-flex w-7 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n }\n </div>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel). -->\n <div\n data-sds-phone-panel\n class=\"fixed z-[1000] overflow-hidden rounded-card border border-border bg-surface shadow-lg\"\n >\n <div class=\"border-b border-border p-2\">\n <div class=\"relative flex items-center rounded-control border border-border focus-within:border-brand-500\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"pointer-events-none absolute left-2.5 text-ink-faint\" />\n <input\n type=\"text\"\n [attr.aria-controls]=\"listId\"\n [value]=\"filterText()\"\n [placeholder]=\"searchPlaceholder()\"\n [attr.aria-label]=\"searchLabel()\"\n class=\"h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint\"\n (input)=\"onFilter($event)\"\n (keydown)=\"onFilterKeydown($event)\"\n />\n </div>\n </div>\n\n <ul [id]=\"listId\" role=\"listbox\" class=\"max-h-64 overflow-auto py-1\">\n @for (c of filteredCountries(); track c.iso2; let i = $index) {\n <li\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"c.iso2 === country().iso2\"\n [attr.data-index]=\"i\"\n [class]=\"optionClass(i, c)\"\n (click)=\"selectCountry(c)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n <span class=\"grid h-5 min-w-7 place-items-center rounded bg-muted px-1 text-[11px] font-semibold tracking-wide text-ink-soft\">\n {{ c.iso2 }}\n </span>\n <span class=\"flex-1 truncate\">{{ c.name }}</span>\n <span class=\"text-ink-faint\">+{{ c.dialCode }}</span>\n </li>\n } @empty {\n <li class=\"px-3 py-2 text-sm text-ink-faint\">{{ noResultsLabel() }}</li>\n }\n </ul>\n </div>\n }\n\n @if (showError()) {\n <p [id]=\"fieldId + '-err'\" class=\"mt-1.5 text-xs font-medium text-danger\">\n {{ errorMessage() }}\n </p>\n } @else if (hint() || autoHint()) {\n <p [id]=\"fieldId + '-hint'\" class=\"mt-1.5 text-xs text-ink-faint\">\n {{ hint() || autoHint() }}\n </p>\n }\n `,\n})\nexport class SdsPhoneInput implements ControlValueAccessor, Validator, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n protected readonly fieldId = `sds-phone-${nextId++}`;\n protected readonly listId = `${this.fieldId}-list`;\n\n readonly label = input<string>('');\n readonly hint = input<string>('');\n /** External error message; overrides the built-in validation message. */\n readonly error = input<string>('');\n readonly size = input<SdsPhoneInputSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Initial country (ISO2) when no value is written. */\n readonly defaultCountry = input<string>('BE');\n /** ISO2 codes shown first in the list. */\n readonly preferredCountries = input<string[]>([]);\n /** Restrict the list to these ISO2 codes (empty = all). */\n readonly onlyCountries = input<string[]>([]);\n /** Show an example number as a hint when no [hint] is provided. */\n readonly showExampleHint = input(true, { transform: booleanAttribute });\n readonly requiredMessage = input<string>('Numéro de téléphone requis');\n\n /**\n * Accessible name of the country selector. `{country}` is replaced with the selected country's\n * name. A token rather than a prefix because word order differs per language. French default so\n * existing consumers are unchanged; translate it in any app serving more than one language.\n *\n * Note the interpolated country NAME still comes from the library's built-in country table, which\n * is French-only — translating this template fixes the wrapper, not the name inside it.\n */\n readonly countryLabel = input<string>('Indicatif pays : {country}');\n\n /**\n * Accessible name for the clear button. It is icon-only, so this string is its ONLY accessible\n * name — a hardcoded French one is simply wrong in every other locale.\n */\n readonly clearLabel = input<string>('Effacer');\n\n /** Accessible name for the country-search field inside the dropdown. */\n readonly searchLabel = input<string>('Rechercher un pays');\n\n /** Placeholder text of the country-search field. */\n readonly searchPlaceholder = input<string>('Rechercher un pays…');\n\n /** Shown in place of the list when no country matches the filter. */\n readonly noResultsLabel = input<string>('Aucun pays');\n\n /**\n * Built-in validation messages. `{lengths}` is replaced with the country's accepted national\n * lengths, joined with {@link lengthSeparator}. Siblings of {@link requiredMessage}, which was\n * already translatable — these two were not, so an English or Dutch app showed French errors.\n */\n readonly incompleteMessage = input<string>('Numéro incomplet — {lengths} chiffres attendus');\n readonly invalidMessage = input<string>('Numéro invalide — {lengths} chiffres attendus');\n\n /** Joins the accepted lengths when a country allows more than one (e.g. \"8 ou 9\"). */\n readonly lengthSeparator = input<string>(' ou ');\n\n /**\n * Auto-generated example hint (see {@link showExampleHint}). `{number}` is replaced with the\n * formatted international example number.\n */\n readonly exampleHintTemplate = input<string>('Ex. {number}');\n\n /** Emitted with the parsed parts whenever the number or country changes. */\n readonly phoneChange = output<SdsPhoneValue>();\n\n protected readonly national = signal('');\n protected readonly countryIso = signal('');\n protected readonly open = signal(false);\n protected readonly filterText = signal('');\n protected readonly highlightedIndex = signal(-1);\n protected readonly touched = signal(false);\n private readonly cvaDisabled = signal(false);\n\n private readonly anchor = viewChild<ElementRef<HTMLElement>>('anchor');\n private readonly field = viewChild<ElementRef<HTMLInputElement>>('field');\n private panelEl: HTMLElement | null = null;\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n /** Countries after applying [onlyCountries] and [preferredCountries] ordering. */\n protected readonly availableCountries = computed<SdsPhoneCountry[]>(() => {\n const only = this.onlyCountries().map((c) => c.toUpperCase());\n let list = SDS_PHONE_COUNTRIES.slice();\n if (only.length) list = list.filter((c) => only.includes(c.iso2));\n\n const preferred = this.preferredCountries().map((c) => c.toUpperCase());\n if (preferred.length) {\n const rank = (iso2: string) => {\n const i = preferred.indexOf(iso2);\n return i === -1 ? preferred.length : i;\n };\n list = list.slice().sort((a, b) => rank(a.iso2) - rank(b.iso2));\n }\n return list;\n });\n\n protected readonly country = computed<SdsPhoneCountry>(() => {\n const iso = this.countryIso() || this.defaultCountry().toUpperCase();\n return (\n this.availableCountries().find((c) => c.iso2 === iso) ??\n this.availableCountries()[0] ??\n SDS_PHONE_COUNTRIES[0]\n );\n });\n\n protected readonly filteredCountries = computed<SdsPhoneCountry[]>(() => {\n const f = this.filterText().trim().toLowerCase();\n const all = this.availableCountries();\n if (!f) return all;\n return all.filter(\n (c) =>\n c.name.toLowerCase().includes(f) ||\n c.iso2.toLowerCase().includes(f) ||\n c.dialCode.includes(f.replace('+', '')),\n );\n });\n\n protected readonly display = computed(() =>\n sdsFormatNational(this.national(), this.country().format),\n );\n\n protected readonly placeholderText = computed(() =>\n sdsFormatNational(this.country().example, this.country().format),\n );\n\n protected readonly autoHint = computed(() => {\n if (!this.showExampleHint()) return '';\n const c = this.country();\n const number = `+${c.dialCode} ${sdsFormatNational(c.example, c.format)}`;\n return this.exampleHintTemplate().replace('{number}', number);\n });\n\n protected readonly countryAriaLabel = computed(() =>\n this.countryLabel().replace('{country}', this.country().name),\n );\n\n protected readonly e164 = computed(() => {\n const d = this.national();\n return d ? `+${this.country().dialCode}${d}` : '';\n });\n\n /** Non-empty but national length is not valid for the country. */\n protected readonly invalid = computed(() => {\n const d = this.national();\n if (!d) return false;\n const lengths = this.country().lengths;\n return lengths.length > 0 && !lengths.includes(d.length);\n });\n\n protected readonly showError = computed(() => {\n if (this.error()) return true;\n if (!this.touched()) return false;\n if (this.required() && !this.national()) return true;\n return this.invalid();\n });\n\n protected readonly errorMessage = computed(() => {\n if (this.error()) return this.error();\n if (this.required() && !this.national()) return this.requiredMessage();\n const lengths = this.country().lengths;\n const expected = lengths.join(this.lengthSeparator());\n const len = this.national().length;\n const min = Math.min(...lengths);\n if (len < min) return this.incompleteMessage().replace('{lengths}', expected);\n return this.invalidMessage().replace('{lengths}', expected);\n });\n\n protected readonly describedBy = computed(() => {\n if (this.showError()) return `${this.fieldId}-err`;\n if (this.hint() || this.autoHint()) return `${this.fieldId}-hint`;\n return null;\n });\n\n protected readonly wrapperClasses = computed(() => {\n const parts = [SIZES[this.size()]];\n parts.push(\n this.showError()\n ? 'border-danger focus-within:border-danger focus-within:ring-2 focus-within:ring-danger/25'\n : 'border-border focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25',\n );\n if (this.isDisabled()) parts.push('opacity-60 cursor-not-allowed');\n return parts.join(' ');\n });\n\n protected optionId(i: number): string {\n return `${this.fieldId}-opt-${i}`;\n }\n\n protected optionClass(i: number, c: SdsPhoneCountry): string {\n const base = 'flex cursor-pointer items-center gap-2.5 px-3 py-2 text-sm text-ink';\n let cls = base;\n if (this.highlightedIndex() === i) cls += ' bg-brand-50';\n if (c.iso2 === this.country().iso2) cls += ' font-medium';\n return cls;\n }\n\n // --- national number input ---\n protected onInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n const max = Math.max(...this.country().lengths, 0) || 15;\n const next = sdsNormalizeSignificant(raw).slice(0, max);\n this.national.set(next);\n this.emit();\n }\n\n protected clear(): void {\n this.national.set('');\n this.markTouched();\n this.emit();\n this.field()?.nativeElement.focus();\n }\n\n // --- country dropdown ---\n protected toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.close() : this.openPanel();\n }\n\n protected openPanel(): void {\n if (this.isDisabled()) return;\n this.filterText.set('');\n this.highlightedIndex.set(\n this.filteredCountries().findIndex((c) => c.iso2 === this.country().iso2),\n );\n this.open.set(true);\n afterNextRender(\n () => {\n this.panelEl = this.host.nativeElement.querySelector<HTMLElement>('[data-sds-phone-panel]');\n this.positionPanel();\n this.addReflowListeners();\n this.panelEl?.querySelector<HTMLInputElement>('input')?.focus();\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n if (returnFocus) this.anchor()?.nativeElement.querySelector('button')?.focus();\n }\n\n protected selectCountry(c: SdsPhoneCountry): void {\n const changed = c.iso2 !== this.country().iso2;\n this.countryIso.set(c.iso2);\n // Re-clamp the existing number to the new country's max length.\n const max = Math.max(...c.lengths, 0) || 15;\n if (this.national().length > max) this.national.set(this.national().slice(0, max));\n this.close(true);\n if (changed) this.emit();\n this.field()?.nativeElement.focus();\n }\n\n protected onFilter(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n this.highlightedIndex.set(this.filteredCountries().length ? 0 : -1);\n setTimeout(() => this.positionPanel());\n }\n\n // --- keyboard ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n this.handleNavKey(event);\n }\n\n protected onFilterKeydown(event: KeyboardEvent): void {\n this.handleNavKey(event);\n }\n\n private handleNavKey(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); break;\n case 'ArrowUp': event.preventDefault(); this.move(-1); break;\n case 'Home': event.preventDefault(); this.highlightedIndex.set(0); this.scrollHighlightedIntoView(); break;\n case 'End': event.preventDefault(); this.highlightedIndex.set(this.filteredCountries().length - 1); this.scrollHighlightedIntoView(); break;\n case 'Enter': {\n event.preventDefault();\n const c = this.filteredCountries()[this.highlightedIndex()];\n if (c) this.selectCountry(c);\n break;\n }\n case 'Escape': event.preventDefault(); this.close(true); break;\n case 'Tab': this.close(false); break;\n }\n }\n\n private move(delta: number): void {\n const list = this.filteredCountries();\n if (!list.length) return;\n const len = list.length;\n const i = (this.highlightedIndex() + delta + len) % len;\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n this.panelEl\n ?.querySelector<HTMLElement>(`[data-index=\"${this.highlightedIndex()}\"]`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const anchorEl = this.anchor()?.nativeElement;\n const panelEl = this.panelEl;\n if (!anchorEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = anchorEl.getBoundingClientRect();\n panelEl.style.minWidth = `${Math.round(r.width)}px`;\n const ph = panelEl.offsetHeight || 280;\n const gap = 4;\n const margin = 8;\n\n let top = r.bottom + gap;\n if (top + ph > window.innerHeight - margin && r.top - gap - ph > margin) {\n top = r.top - gap - ph;\n }\n let left = r.left;\n const pw = panelEl.offsetWidth || r.width;\n if (left + pw > window.innerWidth - margin) {\n left = Math.max(margin, window.innerWidth - margin - pw);\n }\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inField = this.host.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inField && !inPanel) this.close();\n }\n\n protected markTouched(): void {\n this.touched.set(true);\n this.onTouched();\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private emit(): void {\n const value = this.e164();\n this.onChange(value);\n this.onValidatorChange();\n this.phoneChange.emit({\n e164: value,\n country: this.country().iso2,\n dialCode: this.country().dialCode,\n national: this.national(),\n valid: !!value && !this.invalid(),\n });\n }\n\n // --- ControlValueAccessor ---\n private onChange: (value: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n const raw = (value ?? '').trim();\n if (!raw) {\n this.national.set('');\n return;\n }\n if (raw.startsWith('+')) {\n const digits = raw.slice(1).replace(/\\D/g, '');\n const match = sdsMatchDialCode(digits, this.availableCountries());\n if (match) {\n this.countryIso.set(match.iso2);\n this.national.set(sdsNormalizeSignificant(digits.slice(match.dialCode.length)));\n return;\n }\n }\n // No '+' / unknown dial code: treat as a national number for the current country.\n this.national.set(sdsNormalizeSignificant(raw));\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n if (isDisabled) this.close();\n }\n\n // --- Validator ---\n private onValidatorChange: () => void = () => {};\n\n validate(_control: AbstractControl): ValidationErrors | null {\n const d = this.national();\n if (!d) return this.required() ? { required: true } : null;\n const lengths = this.country().lengths;\n if (lengths.length && !lengths.includes(d.length)) {\n return {\n phoneInvalid: {\n country: this.country().iso2,\n expectedLengths: lengths,\n actualLength: d.length,\n },\n };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsSelect } from '../select/sds-select';\n\nexport type SdsPaginatorSize = 'sm' | 'md' | 'lg';\n\n/** Payload emitted by (pageChange) whenever the page or page size changes. */\nexport interface SdsPaginatorState {\n /** Zero-based index of the current page. */\n page: number;\n /** Zero-based index of the first record on the current page. */\n first: number;\n /** Rows displayed per page. */\n rows: number;\n /** Total number of pages. */\n pageCount: number;\n /** Total number of records. */\n totalRecords: number;\n}\n\nconst SIZES: Record<SdsPaginatorSize, string> = {\n sm: 'h-8 min-w-8 text-xs',\n md: 'h-9 min-w-9 text-sm',\n lg: 'h-11 min-w-11 text-base',\n};\n\nconst ICON_SIZES: Record<SdsPaginatorSize, number> = { sm: 15, md: 16, lg: 18 };\n\nconst BTN_BASE =\n 'inline-flex items-center justify-center rounded-control px-1.5 font-medium ' +\n 'transition-colors select-none focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-brand-500 focus-visible:ring-offset-1';\n\n/**\n * Pagination control (mirrors PrimeNG's paginator). Drives a sliding window of\n * page links with first/prev/next/last navigation, an optional rows-per-page\n * dropdown (reuses <sds-select>), a current-page report and a jump-to-page input.\n *\n * State is exposed as two-way models: [first] (zero-based index of the first\n * record on the page) and [rows] (page size). A combined (pageChange) event\n * carries the full {@link SdsPaginatorState} on every change.\n *\n * @example\n * <sds-paginator\n * [totalRecords]=\"120\"\n * [(first)]=\"first\"\n * [(rows)]=\"rows\"\n * [rowsPerPageOptions]=\"[10, 20, 50]\"\n * showCurrentPageReport\n * (pageChange)=\"load($event)\"\n * />\n */\n@Component({\n selector: 'sds-paginator',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, SdsIcon, SdsSelect],\n host: { '[class]': 'hostClass()' },\n template: `\n @if (showCurrentPageReport()) {\n <span class=\"text-sm text-ink-soft\">{{ reportText() }}</span>\n }\n\n <div class=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <!-- page navigation -->\n <nav class=\"flex items-center gap-1\" [attr.aria-label]=\"paginationLabel()\">\n @if (showFirstLastIcon()) {\n <button\n type=\"button\"\n [class]=\"navClass(firstDisabled())\"\n [disabled]=\"firstDisabled()\"\n [attr.aria-label]=\"firstPageLabel()\"\n (click)=\"firstPage()\"\n >\n <sds-icon name=\"chevrons-left\" [size]=\"iconSize()\" />\n </button>\n }\n <button\n type=\"button\"\n [class]=\"navClass(firstDisabled())\"\n [disabled]=\"firstDisabled()\"\n [attr.aria-label]=\"previousPageLabel()\"\n (click)=\"prevPage()\"\n >\n <sds-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n @if (showPageLinks()) {\n @for (p of pageLinks(); track $index) {\n <button\n type=\"button\"\n [class]=\"linkClass(p === page())\"\n [attr.aria-label]=\"pageLinkAriaLabel(p)\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n [disabled]=\"disabled()\"\n (click)=\"changePage(p)\"\n >\n {{ p + 1 }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n [class]=\"navClass(lastDisabled())\"\n [disabled]=\"lastDisabled()\"\n [attr.aria-label]=\"nextPageLabel()\"\n (click)=\"nextPage()\"\n >\n <sds-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n @if (showFirstLastIcon()) {\n <button\n type=\"button\"\n [class]=\"navClass(lastDisabled())\"\n [disabled]=\"lastDisabled()\"\n [attr.aria-label]=\"lastPageLabel()\"\n (click)=\"lastPage()\"\n >\n <sds-icon name=\"chevrons-right\" [size]=\"iconSize()\" />\n </button>\n }\n </nav>\n\n <!-- rows per page -->\n @if (rowsPerPageOptions().length) {\n <label class=\"flex items-center gap-2 text-sm text-ink-soft\">\n <span>{{ rowsPerPageLabel() }}</span>\n <span class=\"w-20\">\n <sds-select\n size=\"sm\"\n [ariaLabel]=\"rowsPerPageLabel()\"\n [options]=\"rowsPerPageOptions()\"\n [ngModel]=\"rows()\"\n (ngModelChange)=\"onRowsChange($event)\"\n [disabled]=\"disabled()\"\n />\n </span>\n </label>\n }\n\n <!-- jump to page -->\n @if (showJumpToPageInput()) {\n <label class=\"flex items-center gap-2 text-sm text-ink-soft\">\n <span>{{ jumpToPageLabel() }}</span>\n <input\n type=\"number\"\n min=\"1\"\n [max]=\"pageCount()\"\n [value]=\"page() + 1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"jumpToPageAriaLabel()\"\n (change)=\"onJump($event)\"\n class=\"h-9 w-16 rounded-control border border-border bg-surface px-2 text-center text-sm text-ink outline-none transition-colors focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25 disabled:opacity-60\"\n />\n </label>\n }\n </div>\n `,\n})\nexport class SdsPaginator {\n /** Total number of records to paginate. */\n readonly totalRecords = input(0, { transform: numberAttribute });\n /** Zero-based index of the first record on the current page (two-way). */\n readonly first = model(0);\n /** Rows displayed per page (two-way). */\n readonly rows = model(10);\n /** When non-empty, renders a rows-per-page dropdown with these choices. */\n readonly rowsPerPageOptions = input<number[]>([]);\n /** Maximum count of numbered page links shown in the sliding window. */\n readonly pageLinkSize = input(5, { transform: numberAttribute });\n readonly showFirstLastIcon = input(true, { transform: booleanAttribute });\n readonly showPageLinks = input(true, { transform: booleanAttribute });\n readonly showCurrentPageReport = input(false, { transform: booleanAttribute });\n /** Tokens: {first} {last} {totalRecords} {currentPage} {totalPages} {rows}. */\n readonly currentPageReportTemplate = input<string>('{first} – {last} of {totalRecords}');\n readonly showJumpToPageInput = input(false, { transform: booleanAttribute });\n readonly rowsPerPageLabel = input<string>('Rows per page');\n readonly jumpToPageLabel = input<string>('Go to');\n\n /**\n * Accessible name for the <nav> wrapping the page controls, and for the four icon-only\n * first/prev/next/last buttons. Those buttons have no text, so these strings are their ONLY\n * accessible names — the English defaults suit an English-first app, but an app serving more than\n * one language MUST pass translated values.\n */\n readonly paginationLabel = input<string>('Pagination');\n readonly firstPageLabel = input<string>('First page');\n readonly previousPageLabel = input<string>('Previous page');\n readonly nextPageLabel = input<string>('Next page');\n readonly lastPageLabel = input<string>('Last page');\n\n /**\n * Accessible name of a numbered page link. `{page}` is replaced with the 1-based page number —\n * a token rather than a prefix because word order is not the same in every language.\n */\n readonly pageLinkLabel = input<string>('Page {page}');\n\n /**\n * Accessible name of the jump-to-page field. Separate from the visible {@link jumpToPageLabel}\n * (\"Go to\") on purpose: the visible text is terse because it sits next to the field, while the\n * accessible name has to stand alone.\n */\n readonly jumpToPageAriaLabel = input<string>('Go to page');\n readonly size = input<SdsPaginatorSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Fires after any page or page-size change with the full paginator state. */\n readonly pageChange = output<SdsPaginatorState>();\n\n protected readonly pageCount = computed(() =>\n Math.max(1, Math.ceil(this.totalRecords() / Math.max(1, this.rows()))),\n );\n\n protected readonly page = computed(() =>\n Math.min(this.pageCount() - 1, Math.floor(this.first() / Math.max(1, this.rows()))),\n );\n\n protected readonly firstDisabled = computed(() => this.disabled() || this.page() <= 0);\n protected readonly lastDisabled = computed(\n () => this.disabled() || this.page() >= this.pageCount() - 1,\n );\n\n protected readonly iconSize = computed(() => ICON_SIZES[this.size()]);\n\n // Sliding window of zero-based page indices, centred on the current page.\n protected readonly pageLinks = computed<number[]>(() => {\n const pages = this.pageCount();\n const visible = Math.min(this.pageLinkSize(), pages);\n let start = Math.max(0, Math.ceil(this.page() - visible / 2));\n const end = Math.min(pages - 1, start + visible - 1);\n start = Math.max(0, start - (visible - (end - start + 1)));\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n });\n\n protected readonly reportText = computed(() => {\n const total = this.totalRecords();\n const first = total === 0 ? 0 : this.first() + 1;\n const last = Math.min(this.first() + this.rows(), total);\n return this.currentPageReportTemplate()\n .replace('{first}', String(first))\n .replace('{last}', String(last))\n .replace('{totalRecords}', String(total))\n .replace('{currentPage}', String(this.page() + 1))\n .replace('{totalPages}', String(this.pageCount()))\n .replace('{rows}', String(this.rows()));\n });\n\n protected readonly hostClass = computed(() => {\n const base = 'flex flex-wrap items-center gap-x-4 gap-y-3';\n const justify = this.showCurrentPageReport() ? 'justify-between' : 'justify-center';\n return `${base} ${justify}`;\n });\n\n protected pageLinkAriaLabel(page: number): string {\n return this.pageLinkLabel().replace('{page}', String(page + 1));\n }\n\n protected navClass(isDisabled: boolean): string {\n const cls = `${BTN_BASE} ${SIZES[this.size()]} px-0`;\n return isDisabled\n ? `${cls} text-ink-faint opacity-50 cursor-not-allowed`\n : `${cls} text-ink-soft hover:bg-muted cursor-pointer`;\n }\n\n protected linkClass(active: boolean): string {\n const cls = `${BTN_BASE} ${SIZES[this.size()]}`;\n if (this.disabled()) return `${cls} text-ink-faint opacity-50 cursor-not-allowed`;\n return active\n ? `${cls} bg-brand-600 text-white hover:bg-brand-700 cursor-pointer`\n : `${cls} text-ink-soft hover:bg-muted cursor-pointer`;\n }\n\n protected firstPage(): void {\n this.changePage(0);\n }\n protected prevPage(): void {\n this.changePage(this.page() - 1);\n }\n protected nextPage(): void {\n this.changePage(this.page() + 1);\n }\n protected lastPage(): void {\n this.changePage(this.pageCount() - 1);\n }\n\n protected changePage(target: number): void {\n if (this.disabled()) return;\n const next = Math.min(Math.max(target, 0), this.pageCount() - 1);\n const newFirst = next * this.rows();\n if (newFirst === this.first()) return;\n this.first.set(newFirst);\n this.emit();\n }\n\n protected onRowsChange(value: number): void {\n if (this.disabled()) return;\n const newRows = Math.max(1, Number(value) || 1);\n if (newRows === this.rows()) return;\n const anchor = this.first();\n this.rows.set(newRows);\n // Keep the first visible record anchored within the new page size.\n const clamped = Math.min(anchor, (this.pageCount() - 1) * newRows);\n this.first.set(Math.floor(clamped / newRows) * newRows);\n this.emit();\n }\n\n protected onJump(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!Number.isNaN(value)) this.changePage(value - 1);\n // Reflect the clamped page back into the field.\n input.value = String(this.page() + 1);\n }\n\n private emit(): void {\n this.pageChange.emit({\n page: this.page(),\n first: this.first(),\n rows: this.rows(),\n pageCount: this.pageCount(),\n totalRecords: this.totalRecords(),\n });\n }\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\n\n/** Identifier of a tab / panel pair. Keep types consistent across a tab set. */\nexport type SdsTabValue = string | number | null;\n\nlet nextId = 0;\n\n/**\n * Coordinates a single <sds-tabs> instance: holds the active value (shared from\n * the host's two-way model), tracks registered tabs for default selection and\n * generates the ARIA ids that link each tab to its panel.\n *\n * Provided at the <sds-tabs> component level so every tab set is isolated.\n */\n@Injectable()\nexport class SdsTabsStore {\n /** Unique base id used to link tabs and panels via ARIA. */\n readonly id = `sds-tabs-${nextId++}`;\n /** Whether the tab list scrolls horizontally (mirrors [scrollable]). */\n readonly scrollable = signal(false);\n\n private value!: WritableSignal<SdsTabValue>;\n private readonly registered = signal<SdsTabValue[]>([]);\n\n /** Called once by <sds-tabs> to share its two-way `value` signal. */\n connect(value: WritableSignal<SdsTabValue>): void {\n this.value = value;\n }\n\n activeValue(): SdsTabValue {\n return this.value();\n }\n\n isActive(value: SdsTabValue): boolean {\n return this.value() === value;\n }\n\n select(value: SdsTabValue): void {\n this.value.set(value);\n }\n\n registerTab(value: SdsTabValue): void {\n this.registered.update((list) => (list.includes(value) ? list : [...list, value]));\n // Default to the first registered tab when no value has been provided.\n if (this.value() == null) this.value.set(value);\n }\n\n unregisterTab(value: SdsTabValue): void {\n this.registered.update((list) => list.filter((v) => v !== value));\n }\n\n tabId(value: SdsTabValue): string {\n return `${this.id}-tab-${value}`;\n }\n\n panelId(value: SdsTabValue): string {\n return `${this.id}-panel-${value}`;\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * Root of a tab set. Compose with <sds-tab-list> (headers) and <sds-tab-panels>\n * (content). The active tab is the [value], matched against each <sds-tab> /\n * <sds-tab-panel> [value]; it is two-way bindable via [(value)]. When omitted,\n * the first registered tab is selected.\n *\n * @example\n * <sds-tabs [(value)]=\"active\">\n * <sds-tab-list>\n * <sds-tab value=\"0\">Détails</sds-tab>\n * <sds-tab value=\"1\">Historique</sds-tab>\n * </sds-tab-list>\n * <sds-tab-panels>\n * <sds-tab-panel value=\"0\">…</sds-tab-panel>\n * <sds-tab-panel value=\"1\">…</sds-tab-panel>\n * </sds-tab-panels>\n * </sds-tabs>\n */\n@Component({\n selector: 'sds-tabs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [SdsTabsStore],\n host: { class: 'block' },\n template: `<ng-content />`,\n})\nexport class SdsTabs {\n private readonly store = inject(SdsTabsStore);\n\n /** Value of the active tab (two-way). */\n readonly value = model<SdsTabValue>(null);\n /** Let the tab list scroll horizontally instead of overflowing. */\n readonly scrollable = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.store.connect(this.value);\n effect(() => this.store.scrollable.set(this.scrollable()));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { SdsTabsStore } from './sds-tabs-store';\n\n/**\n * Container (role=\"tablist\") for the <sds-tab> headers. Renders the bottom rule\n * and handles roving-focus keyboard navigation (Arrow keys, Home, End) with\n * automatic activation.\n */\n@Component({\n selector: 'sds-tab-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'tablist',\n '[class]': 'listClass()',\n '(keydown)': 'onKeydown($event)',\n },\n template: `<ng-content />`,\n})\nexport class SdsTabList {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly store = inject(SdsTabsStore);\n\n protected readonly listClass = computed(() => {\n const base = 'relative flex border-b border-border';\n return this.store.scrollable() ? `${base} overflow-x-auto` : base;\n });\n\n protected onKeydown(event: KeyboardEvent): void {\n const keys = ['ArrowRight', 'ArrowLeft', 'Home', 'End'];\n if (!keys.includes(event.key)) return;\n\n const tabs = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'),\n ).filter((b) => !b.disabled);\n if (!tabs.length) return;\n\n event.preventDefault();\n const current = tabs.indexOf(document.activeElement as HTMLButtonElement);\n let next: number;\n switch (event.key) {\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = tabs.length - 1;\n break;\n case 'ArrowRight':\n next = current < 0 ? 0 : (current + 1) % tabs.length;\n break;\n default: // ArrowLeft\n next = current <= 0 ? tabs.length - 1 : current - 1;\n break;\n }\n\n const el = tabs[next];\n el.focus();\n el.click(); // automatic activation\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * A single tab header (role=\"tab\"). Project the label and, optionally, an\n * <sds-icon> for an icon + text header. Set [disabled] to make it unselectable.\n */\n@Component({\n selector: 'sds-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'contents' },\n template: `\n <button\n type=\"button\"\n role=\"tab\"\n [id]=\"store.tabId(value())\"\n [attr.aria-selected]=\"active()\"\n [attr.aria-controls]=\"store.panelId(value())\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.tabindex]=\"active() && !disabled() ? 0 : -1\"\n [disabled]=\"disabled()\"\n [class]=\"tabClass()\"\n (click)=\"select()\"\n >\n <ng-content />\n </button>\n `,\n})\nexport class SdsTab implements OnInit, OnDestroy {\n protected readonly store = inject(SdsTabsStore);\n\n readonly value = input.required<SdsTabValue>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly active = computed(() => this.store.isActive(this.value()));\n\n ngOnInit(): void {\n this.store.registerTab(this.value());\n }\n\n ngOnDestroy(): void {\n this.store.unregisterTab(this.value());\n }\n\n protected select(): void {\n if (this.disabled()) return;\n this.store.select(this.value());\n }\n\n protected tabClass(): string {\n const base =\n 'relative -mb-px inline-flex items-center gap-2 whitespace-nowrap border-b-2 px-4 py-2.5 ' +\n 'text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-brand-500 focus-visible:ring-inset';\n if (this.disabled()) {\n return `${base} border-transparent text-ink-faint opacity-50 cursor-not-allowed`;\n }\n return this.active()\n ? `${base} border-brand-600 text-brand-700 cursor-pointer`\n : `${base} border-transparent text-ink-soft hover:border-border hover:text-ink cursor-pointer`;\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Wrapper for the <sds-tab-panel> content blocks of a tab set. */\n@Component({\n selector: 'sds-tab-panels',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div class=\"pt-4\">\n <ng-content />\n </div>\n `,\n})\nexport class SdsTabPanels {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsTabsStore, SdsTabValue } from './sds-tabs-store';\n\n/**\n * Content for one tab (role=\"tabpanel\"); shown only while its [value] matches\n * the active tab. Inactive panels are not rendered (their content is created\n * on activation), so panel state does not persist across switches.\n */\n@Component({\n selector: 'sds-tab-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n @if (active()) {\n <div\n role=\"tabpanel\"\n [id]=\"store.panelId(value())\"\n [attr.aria-labelledby]=\"store.tabId(value())\"\n tabindex=\"0\"\n class=\"rounded-control focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n >\n <ng-content />\n </div>\n }\n `,\n})\nexport class SdsTabPanel {\n protected readonly store = inject(SdsTabsStore);\n\n readonly value = input.required<SdsTabValue>();\n\n protected readonly active = computed(() => this.store.isActive(this.value()));\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\n\n/** Identifier of an accordion panel. Keep types consistent across a set. */\nexport type SdsAccordionValue = string | number;\n/** Active value(s): a single value (or null) normally, an array in multiple mode. */\nexport type SdsAccordionActive = SdsAccordionValue | SdsAccordionValue[] | null;\n\nlet nextId = 0;\n\n/**\n * Coordinates a single <sds-accordion>: holds the open value(s) (shared from the\n * host's two-way model), the multiple-open flag, and generates the ARIA ids that\n * link each header to its content region.\n *\n * Provided at the <sds-accordion> component level so every accordion is isolated.\n */\n@Injectable()\nexport class SdsAccordionStore {\n /** Unique base id used to link headers and content regions via ARIA. */\n readonly id = `sds-accordion-${nextId++}`;\n /** Whether more than one panel may be open at a time (mirrors [multiple]). */\n readonly multiple = signal(false);\n\n private value!: WritableSignal<SdsAccordionActive>;\n\n /** Called once by <sds-accordion> to share its two-way `value` signal. */\n connect(value: WritableSignal<SdsAccordionActive>): void {\n this.value = value;\n }\n\n isOpen(value: SdsAccordionValue): boolean {\n const current = this.value();\n return Array.isArray(current) ? current.includes(value) : current === value;\n }\n\n toggle(value: SdsAccordionValue): void {\n if (this.multiple()) {\n const current = this.asArray();\n this.value.set(\n current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value],\n );\n } else {\n // Single mode: clicking the open panel collapses it.\n this.value.set(this.value() === value ? null : value);\n }\n }\n\n headerId(value: SdsAccordionValue): string {\n return `${this.id}-header-${value}`;\n }\n\n contentId(value: SdsAccordionValue): string {\n return `${this.id}-content-${value}`;\n }\n\n private asArray(): SdsAccordionValue[] {\n const current = this.value();\n if (Array.isArray(current)) return current;\n return current == null ? [] : [current];\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SdsAccordionActive, SdsAccordionStore } from './sds-accordion-store';\n\n/**\n * Root of an accordion. Compose with <sds-accordion-panel> children, each\n * holding an <sds-accordion-header> and an <sds-accordion-content>. The open\n * panel is the [value], matched against each panel's [value]; it is two-way\n * bindable via [(value)]. With [multiple], several panels may be open at once\n * and [value] is an array.\n *\n * @example\n * <sds-accordion [(value)]=\"open\">\n * <sds-accordion-panel value=\"0\">\n * <sds-accordion-header>Section 1</sds-accordion-header>\n * <sds-accordion-content>…</sds-accordion-content>\n * </sds-accordion-panel>\n * </sds-accordion>\n */\n@Component({\n selector: 'sds-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [SdsAccordionStore],\n host: {\n class: 'block divide-y divide-border overflow-hidden rounded-card border border-border bg-surface',\n '(keydown)': 'onKeydown($event)',\n },\n template: `<ng-content />`,\n})\nexport class SdsAccordion {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly store = inject(SdsAccordionStore);\n\n /** Open panel value, or array of values in multiple mode (two-way). */\n readonly value = model<SdsAccordionActive>(null);\n /** Allow more than one panel open at a time. */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.store.connect(this.value);\n effect(() => this.store.multiple.set(this.multiple()));\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (!target?.matches?.('[data-sds-accordion-header]')) return;\n\n const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End'];\n if (!keys.includes(event.key)) return;\n\n const headers = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLButtonElement>('[data-sds-accordion-header]'),\n ).filter((b) => !b.disabled);\n if (!headers.length) return;\n\n event.preventDefault();\n const current = headers.indexOf(target as HTMLButtonElement);\n let next: number;\n switch (event.key) {\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = headers.length - 1;\n break;\n case 'ArrowDown':\n next = current < 0 ? 0 : (current + 1) % headers.length;\n break;\n default: // ArrowUp\n next = current <= 0 ? headers.length - 1 : current - 1;\n break;\n }\n headers[next].focus();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsAccordionStore, SdsAccordionValue } from './sds-accordion-store';\n\n/**\n * One accordion section. Holds the [value] and optional [disabled] state shared\n * with its projected <sds-accordion-header> and <sds-accordion-content>.\n */\n@Component({\n selector: 'sds-accordion-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `<ng-content />`,\n})\nexport class SdsAccordionPanel {\n private readonly store = inject(SdsAccordionStore);\n\n readonly value = input.required<SdsAccordionValue>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly open = computed(() => this.store.isOpen(this.value()));\n\n get headerId(): string {\n return this.store.headerId(this.value());\n }\n\n get contentId(): string {\n return this.store.contentId(this.value());\n }\n\n toggle(): void {\n if (!this.disabled()) this.store.toggle(this.value());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsAccordionPanel } from './sds-accordion-panel';\n\n/**\n * Clickable header of an accordion panel. Project the label text and,\n * optionally, an <sds-icon>. Renders a chevron that rotates when open.\n */\n@Component({\n selector: 'sds-accordion-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <button\n type=\"button\"\n data-sds-accordion-header\n [id]=\"panel.headerId\"\n [attr.aria-expanded]=\"panel.open()\"\n [attr.aria-controls]=\"panel.contentId\"\n [attr.aria-disabled]=\"panel.disabled() ? 'true' : null\"\n [disabled]=\"panel.disabled()\"\n [class]=\"headerClass()\"\n (click)=\"panel.toggle()\"\n >\n <span class=\"flex-1 text-left\"><ng-content /></span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"18\"\n class=\"shrink-0 transition-transform duration-200\"\n [class.rotate-180]=\"panel.open()\"\n />\n </button>\n `,\n})\nexport class SdsAccordionHeader {\n protected readonly panel = inject(SdsAccordionPanel);\n\n protected readonly headerClass = computed(() => {\n const base =\n 'flex w-full items-center gap-3 px-4 py-3.5 text-left text-sm font-medium ' +\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n 'focus-visible:ring-inset focus-visible:ring-brand-500';\n if (this.panel.disabled()) {\n return `${base} text-ink-faint opacity-60 cursor-not-allowed`;\n }\n return this.panel.open()\n ? `${base} text-brand-700 hover:bg-muted cursor-pointer`\n : `${base} text-ink hover:bg-muted cursor-pointer`;\n });\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { SdsAccordionPanel } from './sds-accordion-panel';\n\n/**\n * Collapsible content region of an accordion panel. Animates open/closed with a\n * CSS grid-rows transition; while closed it is `inert` (not focusable, hidden\n * from assistive tech) but kept in the DOM, so its state persists.\n */\n@Component({\n selector: 'sds-accordion-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div\n role=\"region\"\n [id]=\"panel.contentId\"\n [attr.aria-labelledby]=\"panel.headerId\"\n [attr.inert]=\"panel.open() ? null : ''\"\n class=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n [style.grid-template-rows]=\"panel.open() ? '1fr' : '0fr'\"\n >\n <div class=\"overflow-hidden\">\n <div class=\"px-4 pb-4 pt-0 text-sm leading-relaxed text-ink-soft\">\n <ng-content />\n </div>\n </div>\n </div>\n `,\n})\nexport class SdsAccordionContent {\n protected readonly panel = inject(SdsAccordionPanel);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { SdsTableColumn } from './sds-table';\n\n/**\n * Typed context handed to a custom cell template. Pulled out so consumers can\n * destructure with `let-value`, `let-row`, `let-i=\"index\"`, etc., with full\n * type inference (see {@link SdsTableCell.ngTemplateContextGuard}).\n */\nexport interface SdsTableCellContext {\n /** Same as {@link value} — enables the `let-value` (implicit) binding. */\n $implicit: unknown;\n /** Resolved cell value for this column (via the table's getValue). */\n value: unknown;\n /** The full row object. */\n row: any;\n /** The column definition the cell belongs to. */\n column: SdsTableColumn;\n /** Zero-based index of the row within the currently displayed page. */\n index: number;\n}\n\n/**\n * Supplies a custom cell template for a single table column, matched by its\n * field key. Use as a structural template inside `<sds-table>`:\n *\n * @example\n * <sds-table [value]=\"rows\" [columns]=\"cols\">\n * <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n * <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n * </ng-template>\n * </sds-table>\n */\n@Directive({\n selector: 'ng-template[sdsCell]',\n standalone: true,\n})\nexport class SdsTableCell {\n /** The column `field` this template renders. */\n readonly column = input.required<string>({ alias: 'sdsCell' });\n\n /** The wrapped template, rendered by the host table via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsTableCellContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsTableCellContext. */\n static ngTemplateContextGuard(\n _dir: SdsTableCell,\n _ctx: unknown,\n ): _ctx is SdsTableCellContext {\n return true;\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Typed context handed to a row-expansion template. Pulled out so consumers can\n * destructure with `let-row`, `let-i=\"index\"`, etc., with full type inference\n * (see {@link SdsTableRowExpansion.ngTemplateContextGuard}).\n */\nexport interface SdsTableRowExpansionContext {\n /** Same as {@link row} — enables the `let-row` (implicit) binding. */\n $implicit: any;\n /** The full row object whose details are being shown. */\n row: any;\n /** Zero-based index of the row within the currently displayed page. */\n index: number;\n}\n\n/**\n * Supplies the detail template rendered beneath an expanded row when the host\n * `<sds-table>` has `expandable`. Use as a structural template inside the table:\n *\n * @example\n * <sds-table [value]=\"rows\" [columns]=\"cols\" expandable>\n * <ng-template sdsRowExpansion let-row>\n * <div>Détails de {{ row.nom }}</div>\n * </ng-template>\n * </sds-table>\n */\n@Directive({\n selector: 'ng-template[sdsRowExpansion]',\n standalone: true,\n})\nexport class SdsTableRowExpansion {\n /** The wrapped template, rendered by the host table via ngTemplateOutlet. */\n readonly template = inject<TemplateRef<SdsTableRowExpansionContext>>(TemplateRef);\n\n /** Lets the compiler type-check `let-*` bindings against SdsTableRowExpansionContext. */\n static ngTemplateContextGuard(\n _dir: SdsTableRowExpansion,\n _ctx: unknown,\n ): _ctx is SdsTableRowExpansionContext {\n return true;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n numberAttribute,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsInputNumber } from '../input-number/sds-input-number';\nimport { SdsPaginator, SdsPaginatorState } from '../paginator/sds-paginator';\nimport { SdsTableCell, SdsTableCellContext } from './sds-table-cell';\nimport { SdsTableRowExpansion } from './sds-table-row-expansion';\n\n/** Column configuration. `field` may be a dot-path (e.g. `service.name`). */\nexport interface SdsTableColumn {\n /** Row field rendered in this column. Supports dot-paths. */\n field: string;\n /** Header label. */\n header: string;\n /** Allow sorting on this column (also requires the table's `sortable`). */\n sortable?: boolean;\n /** Text alignment for header + body cells. */\n align?: 'left' | 'center' | 'right';\n /** Fixed column width, e.g. `'120px'` or `'20%'`. */\n width?: string;\n\n // --- Editing (opt-in: also requires the table's `editable`) --------------------------------------\n /** Makes the column's cells editable with this editor. */\n editor?: SdsTableEditor;\n /** Lock individual cells of an editable column: `false`, or a per-row predicate. Default true. */\n editable?: boolean | ((row: any) => boolean);\n /** Choices for the `select` editor (also used to display the chosen label). */\n options?: SdsTableSelectOption[];\n /** `number` / `currency` editor: bounds, step and fraction digits (as on sds-input-number). */\n min?: number;\n max?: number;\n step?: number;\n minFractionDigits?: number;\n maxFractionDigits?: number;\n /** `currency` editor: ISO 4217 code. Default `EUR`. */\n currency?: string;\n /** Locale for the number/currency editor and display. Defaults to the table's [locale]. */\n locale?: string;\n /** Placeholder shown in the editor. */\n placeholder?: string;\n /** Display formatter for the cell (view mode, when no `sdsCell` template is given). */\n format?: (value: unknown, row: any) => string;\n}\n\n/** Cell editors of an editable column. `number`/`currency` reuse sds-input-number. */\nexport type SdsTableEditor = 'text' | 'number' | 'currency' | 'select';\n\n/** One choice of a `select` column. */\nexport interface SdsTableSelectOption {\n label: string;\n value: unknown;\n}\n\n/**\n * Per-cell error messages: `{ [rowKey]: { [field]: message } }`. `rowKey` is the row's `dataKey`\n * value (or, without a dataKey, its index in `value`). A falsy message means no error.\n */\nexport type SdsTableCellErrors = Record<string, Record<string, string | null | undefined>>;\n\n/** Emitted when an edited cell is committed with a changed value. */\nexport interface SdsTableCellCommitEvent {\n row: any;\n field: string;\n value: unknown;\n previousValue: unknown;\n /** The row's dataKey value (or its index in `value` without a dataKey). */\n rowKey: unknown;\n /** Index of the row in the `value` input. */\n rowIndex: number;\n}\n\n/** When a click starts editing an editable cell. */\nexport type SdsTableEditTrigger = 'click' | 'dblclick';\n\nexport type SdsTableSize = 'sm' | 'md' | 'lg';\n/** 1 = ascending, -1 = descending, 0 = unsorted. */\nexport type SdsSortOrder = 1 | -1 | 0;\n\nexport interface SdsTableSortEvent {\n field: string;\n order: SdsSortOrder;\n}\n\n/** Emitted when `lazy` is true so the host can fetch the matching slice. */\nexport interface SdsTableLazyEvent {\n first: number;\n rows: number;\n sortField: string | null;\n sortOrder: SdsSortOrder;\n globalFilter: string;\n}\n\ntype SdsSelectionMode = 'single' | 'multiple' | null;\n\nconst SIZES: Record<SdsTableSize, { cell: string; head: string }> = {\n sm: { cell: 'px-3 py-2 text-sm', head: 'px-3 py-2' },\n md: { cell: 'px-4 py-2.5 text-sm', head: 'px-4 py-2.5' },\n lg: { cell: 'px-4 py-3 text-base', head: 'px-4 py-3' },\n};\n\nconst ALIGN: Record<NonNullable<SdsTableColumn['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n};\n\nlet nextId = 0;\n\n/**\n * Client-side data table mirroring PrimeNG's table, scoped to a strong local\n * feature set: sorting, pagination (reuses {@link SdsPaginator}), global filter,\n * single/multiple selection, custom cell templates (via {@link SdsTableCell}),\n * loading/empty states and visual variants. Set `lazy` to delegate\n * sort/filter/paging to the host through `(lazyLoad)`.\n *\n * @remarks\n * - **`dataKey` is strongly recommended** for sortable and/or selectable\n * tables: it gives each row a stable identity so `trackRow` reuses the\n * correct DOM node when rows reorder (otherwise tracking falls back to the\n * page-relative `$index`, which defeats row-identity animations and can\n * momentarily mis-associate a focused custom-cell control after a re-sort).\n * - The header **\"select all\" checkbox operates over the entire filtered set\n * across all pages**, not just the current page. Toggling it selects/clears\n * every filtered row regardless of pagination (this is an intentional\n * deviation from PrimeNG's per-page select-all).\n *\n * **Editable grid (opt-in).** Set `editable` and give columns an `editor` (`text` · `number` ·\n * `currency` · `select`). The table becomes an ARIA grid with one tab stop: arrow keys move between\n * cells (Home/End, Ctrl+Home/End), Enter or F2 edits (typing a character starts editing with it),\n * Enter commits and moves down (Shift+Enter up), Tab / Shift+Tab commit and move to the next/previous\n * editable cell, Escape cancels (and is stopped, so an enclosing drawer stays open), clicking elsewhere\n * commits. Each changed commit emits `(cellCommit)` — the host applies it to its data (the table never\n * mutates rows) — and marks the cell dirty until {@link clearDirty}. Errors from `[cellErrors]` show\n * under the cell with `aria-invalid`. Number/currency cells use sds-input-number (live, locale-aware\n * formatting: \"11,9\" → \"€11.90\"). Everything else — sort, paging, selection — is unchanged.\n *\n * @example\n * <sds-table [value]=\"staff\" [columns]=\"cols\" dataKey=\"id\"\n * sortable paginator [rows]=\"10\" globalFilter\n * selectionMode=\"multiple\" [(selection)]=\"selected\">\n * <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n * <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n * </ng-template>\n * </sds-table>\n *\n * @example\n * <sds-table [value]=\"drafts()\" [columns]=\"[{ field: 'name', header: 'Name', editor: 'text' },\n * { field: 'price', header: 'Price', editor: 'currency', align: 'right' }]\"\n * dataKey=\"id\" editable [cellErrors]=\"errors()\" (cellCommit)=\"apply($event)\" />\n */\n@Component({\n selector: 'sds-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, SdsPaginator, SdsInputNumber, NgTemplateOutlet],\n host: { class: 'block' },\n template: `\n <div class=\"rounded-card border border-border bg-surface overflow-hidden\">\n <!-- Toolbar: caption + global filter -->\n @if (caption() || globalFilter()) {\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\n @if (caption()) {\n <span [id]=\"tableId + '-caption'\" class=\"font-semibold text-ink\">{{ caption() }}</span>\n } @else {\n <span></span>\n }\n\n @if (globalFilter()) {\n <div\n class=\"relative flex h-9 items-center rounded-control border border-border bg-surface transition-colors focus-within:border-brand-500 focus-within:ring-2 focus-within:ring-brand-500/25\"\n >\n <sds-icon\n name=\"search\"\n [size]=\"16\"\n class=\"pointer-events-none absolute left-2.5 text-ink-faint\"\n />\n <input\n type=\"search\"\n [id]=\"tableId + '-filter'\"\n [value]=\"filterText()\"\n [placeholder]=\"globalFilterPlaceholder()\"\n [attr.aria-label]=\"globalFilterAriaLabel()\"\n [disabled]=\"loading()\"\n [attr.aria-disabled]=\"loading() ? 'true' : null\"\n class=\"h-full w-56 max-w-full bg-transparent pl-8 pr-3 text-sm text-ink outline-none placeholder:text-ink-faint disabled:opacity-60\"\n (input)=\"onFilterInput($event)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- Scroll region -->\n <div\n class=\"relative overflow-x-auto\"\n [class.overflow-y-auto]=\"scrollHeight()\"\n [style.maxHeight]=\"scrollHeight() || null\"\n [attr.inert]=\"loading() ? '' : null\"\n >\n <table\n class=\"w-full border-collapse text-left\"\n [attr.role]=\"editable() ? 'grid' : null\"\n (keydown)=\"onGridKeydown($event)\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [attr.aria-labelledby]=\"caption() ? tableId + '-caption' : null\"\n [attr.aria-label]=\"caption() ? null : ariaLabel()\"\n >\n <thead\n class=\"bg-muted text-xs font-semibold uppercase tracking-wide text-ink-soft\"\n >\n <tr [class]=\"gridlines() ? 'divide-x divide-border' : ''\">\n @if (expandable()) {\n <th\n scope=\"col\"\n class=\"w-px\"\n [class]=\"headCellClass()\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n >\n <span class=\"sr-only\">Détails</span>\n </th>\n }\n\n @if (showSelectionColumn()) {\n <th\n scope=\"col\"\n class=\"w-px\"\n [class]=\"headCellClass()\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n >\n @if (selectionMode() === 'multiple') {\n <button\n type=\"button\"\n role=\"checkbox\"\n [attr.aria-checked]=\"headerChecked() ? 'true' : (headerIndeterminate() ? 'mixed' : 'false')\"\n aria-label=\"Tout sélectionner\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(headerChecked(), headerIndeterminate())\"\n (click)=\"toggleAll()\"\n >\n @if (headerChecked()) {\n <sds-icon name=\"check\" [size]=\"12\" />\n } @else if (headerIndeterminate()) {\n <span class=\"h-0.5 w-2.5 rounded-full bg-white\"></span>\n }\n </button>\n } @else {\n <span class=\"sr-only\">Sélection</span>\n }\n </th>\n }\n\n @for (col of effectiveColumns(); track col.field; let i = $index) {\n <th\n scope=\"col\"\n class=\"relative\"\n [class]=\"headCellClass(col)\"\n [class.sticky]=\"scrollHeight()\"\n [class.top-0]=\"scrollHeight()\"\n [class.z-10]=\"scrollHeight()\"\n [class.bg-muted]=\"scrollHeight()\"\n [class.cursor-move]=\"reorderableColumns()\"\n [style.width]=\"columnStyleWidth(col)\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.draggable]=\"reorderableColumns() ? 'true' : null\"\n (dragstart)=\"onColDragStart(i)\"\n (dragover)=\"onColDragOver($event)\"\n (drop)=\"onColDrop($event, i)\"\n (dragend)=\"onColDragEnd()\"\n >\n @if (isColumnSortable(col)) {\n <button\n type=\"button\"\n [disabled]=\"loading()\"\n class=\"inline-flex items-center gap-1.5 select-none rounded hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n (click)=\"onSort(col)\"\n >\n <span>{{ col.header }}</span>\n <sds-icon [name]=\"sortIcon(col)\" [size]=\"14\" class=\"text-ink-faint\" />\n </button>\n } @else {\n <span>{{ col.header }}</span>\n }\n\n @if (resizableColumns()) {\n <span\n class=\"absolute right-0 top-0 h-full w-1.5 cursor-col-resize select-none touch-none hover:bg-brand-300\"\n (pointerdown)=\"onResizeStart($event, col.field)\"\n (click)=\"$event.stopPropagation()\"\n ></span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-border\">\n @for (row of displayRows(); track trackRow($index, row); let i = $index) {\n <tr\n [class]=\"rowClass(row, i)\"\n [attr.tabindex]=\"selectionMode() === 'single' && !loading() && !editable() ? 0 : null\"\n [attr.aria-selected]=\"selectionMode() === 'single' ? (isRowSelected(row) ? 'true' : 'false') : null\"\n (click)=\"onRowClick(row)\"\n (keydown.enter)=\"onRowKeydown($event, row)\"\n (keydown.space)=\"onRowKeydown($event, row)\"\n >\n @if (expandable()) {\n <td [class]=\"cellClass()\" class=\"w-px\">\n <button\n type=\"button\"\n [attr.aria-expanded]=\"isExpanded(row)\"\n [attr.aria-controls]=\"isExpanded(row) ? rowDetailId(row) : null\"\n [attr.aria-label]=\"isExpanded(row) ? 'Réduire la ligne' : 'Développer la ligne'\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded text-ink-soft hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n (click)=\"onExpanderClick($event, row)\"\n >\n <sds-icon\n name=\"chevron-right\"\n [size]=\"16\"\n class=\"transition-transform\"\n [class.rotate-90]=\"isExpanded(row)\"\n />\n </button>\n </td>\n }\n\n @if (showSelectionColumn()) {\n <td\n [class]=\"cellClass()\"\n class=\"w-px\"\n >\n @if (selectionMode() === 'multiple') {\n <button\n type=\"button\"\n role=\"checkbox\"\n [attr.aria-checked]=\"isRowSelected(row) ? 'true' : 'false'\"\n aria-label=\"Sélectionner la ligne\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(isRowSelected(row), false)\"\n (click)=\"onRowCheckboxClick($event, row)\"\n >\n @if (isRowSelected(row)) {\n <sds-icon name=\"check\" [size]=\"12\" />\n }\n </button>\n } @else if (selectionMode() === 'single') {\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"isRowSelected(row) ? 'true' : 'false'\"\n aria-label=\"Sélectionner la ligne\"\n [disabled]=\"loading()\"\n class=\"grid h-[18px] w-[18px] shrink-0 place-items-center rounded-full border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1 disabled:opacity-60\"\n [class]=\"checkboxClass(isRowSelected(row), false)\"\n (click)=\"onRowCheckboxClick($event, row)\"\n >\n @if (isRowSelected(row)) {\n <span class=\"h-1.5 w-1.5 rounded-full bg-white\"></span>\n }\n </button>\n }\n </td>\n }\n\n @for (col of effectiveColumns(); track col.field; let ci = $index) {\n @if (!editable()) {\n <td\n [class]=\"cellClass(col)\"\n [style.width]=\"columnStyleWidth(col)\"\n >\n @if (templateFor(col.field); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, col, i)\"\n />\n } @else {\n {{ displayCell(row, col) }}\n }\n </td>\n } @else {\n <!-- Editable grid cell: one roving tab stop, arrow-key navigation, in-place editor. -->\n <td\n role=\"gridcell\"\n [class]=\"gridCellClass(row, col, i, ci)\"\n [style.width]=\"columnStyleWidth(col)\"\n [attr.data-cell]=\"i + ':' + ci\"\n [attr.tabindex]=\"isTabStop(i, ci) ? 0 : -1\"\n [attr.aria-readonly]=\"isCellEditable(row, col) ? null : 'true'\"\n [attr.aria-invalid]=\"cellErrorFor(row, col.field) ? 'true' : null\"\n [attr.aria-describedby]=\"cellErrorFor(row, col.field) ? cellErrorId(i, ci) : null\"\n (click)=\"onCellClick($event, i, ci)\"\n (dblclick)=\"onCellDblClick($event, i, ci)\"\n (focus)=\"onCellFocus(i, ci)\"\n >\n @if (isEditing(i, ci)) {\n @switch (col.editor) {\n @case ('select') {\n <select\n data-sds-cell-editor\n class=\"h-9 w-full rounded-control border border-brand-500 bg-surface px-2 text-sm text-ink outline-none ring-2 ring-brand-500/25\"\n [attr.aria-label]=\"col.header\"\n (change)=\"onSelectEditorChange($event, col)\"\n (blur)=\"onEditorBlur()\"\n >\n @if (draft() === null || draft() === undefined) {\n <option value=\"\" disabled selected>{{ col.placeholder ?? '' }}</option>\n }\n @for (opt of col.options ?? []; track $index; let oi = $index) {\n <option [value]=\"oi\" [selected]=\"opt.value === draft()\">{{ opt.label }}</option>\n }\n </select>\n }\n @case ('number') {\n <sds-input-number\n data-sds-cell-editor\n size=\"sm\"\n mode=\"decimal\"\n [locale]=\"col.locale ?? locale()\"\n [min]=\"col.min ?? null\"\n [max]=\"col.max ?? null\"\n [step]=\"col.step ?? 1\"\n [minFractionDigits]=\"col.minFractionDigits ?? null\"\n [maxFractionDigits]=\"col.maxFractionDigits ?? null\"\n [placeholder]=\"col.placeholder ?? ''\"\n [ariaLabel]=\"col.header\"\n (focusout)=\"onEditorBlur()\"\n />\n }\n @case ('currency') {\n <sds-input-number\n data-sds-cell-editor\n size=\"sm\"\n mode=\"currency\"\n [currency]=\"col.currency ?? 'EUR'\"\n [locale]=\"col.locale ?? locale()\"\n [min]=\"col.min ?? null\"\n [max]=\"col.max ?? null\"\n [step]=\"col.step ?? 1\"\n [minFractionDigits]=\"col.minFractionDigits ?? null\"\n [maxFractionDigits]=\"col.maxFractionDigits ?? null\"\n [placeholder]=\"col.placeholder ?? ''\"\n [ariaLabel]=\"col.header\"\n (focusout)=\"onEditorBlur()\"\n />\n }\n @default {\n <input\n data-sds-cell-editor\n type=\"text\"\n class=\"h-9 w-full rounded-control border border-brand-500 bg-surface px-2.5 text-sm text-ink outline-none ring-2 ring-brand-500/25 placeholder:text-ink-faint\"\n [value]=\"draftText()\"\n [placeholder]=\"col.placeholder ?? ''\"\n [attr.aria-label]=\"col.header\"\n (input)=\"onTextEditorInput($event)\"\n (blur)=\"onEditorBlur()\"\n />\n }\n }\n } @else {\n @if (templateFor(col.field); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, col, i)\"\n />\n } @else {\n {{ displayCell(row, col) }}\n }\n @if (isDirty(row, col.field)) {\n <span\n class=\"pointer-events-none absolute right-1 top-1 h-1.5 w-1.5 rounded-full bg-brand-500\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"sr-only\">({{ dirtyLabel() }})</span>\n }\n }\n @if (cellErrorFor(row, col.field); as message) {\n <span\n [id]=\"cellErrorId(i, ci)\"\n class=\"mt-1 flex items-start gap-1 text-xs font-medium normal-case text-danger\"\n >\n <sds-icon name=\"alert-circle\" [size]=\"13\" class=\"mt-px shrink-0\" />\n <span>{{ message }}</span>\n </span>\n }\n </td>\n }\n }\n </tr>\n\n @if (expandable() && isExpanded(row) && expansionTemplate()) {\n <tr>\n <td [id]=\"rowDetailId(row)\" [attr.colspan]=\"totalColumnCount()\" class=\"bg-muted/30 p-0\">\n <div class=\"px-4 py-3\">\n <ng-container\n [ngTemplateOutlet]=\"expansionTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, row, index: i }\"\n />\n </div>\n </td>\n </tr>\n }\n } @empty {\n @if (!loading()) {\n <tr>\n <td\n [attr.colspan]=\"totalColumnCount()\"\n class=\"py-10 text-center text-ink-faint\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n\n <!-- Loading overlay -->\n @if (loading()) {\n <div\n class=\"absolute inset-0 z-20 grid place-items-center bg-white/60\"\n aria-hidden=\"true\"\n >\n <div\n class=\"h-7 w-7 animate-spin rounded-full border-2 border-brand-200 border-t-brand-600\"\n ></div>\n </div>\n }\n </div>\n\n <!-- Paginator -->\n @if (paginator()) {\n <div class=\"border-t border-border px-4 py-2.5\">\n <sds-paginator\n [totalRecords]=\"totalForPaginator()\"\n [(first)]=\"first\"\n [(rows)]=\"pageRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\"\n [disabled]=\"loading()\"\n [currentPageReportTemplate]=\"currentPageReportTemplate()\"\n [rowsPerPageLabel]=\"rowsPerPageLabel()\"\n [paginationLabel]=\"paginationLabel()\"\n [firstPageLabel]=\"firstPageLabel()\"\n [previousPageLabel]=\"previousPageLabel()\"\n [nextPageLabel]=\"nextPageLabel()\"\n [lastPageLabel]=\"lastPageLabel()\"\n [pageLinkLabel]=\"pageLinkLabel()\"\n (pageChange)=\"onPageChange($event)\"\n />\n </div>\n }\n </div>\n `,\n})\nexport class SdsTable implements OnDestroy {\n protected readonly tableId = `sds-table-${nextId++}`;\n\n // --- inputs ---------------------------------------------------------------\n readonly value = input<readonly any[]>([]);\n readonly columns = input<SdsTableColumn[]>([]);\n readonly dataKey = input<string>('');\n readonly size = input<SdsTableSize>('md');\n readonly striped = input(false, { transform: booleanAttribute });\n readonly gridlines = input(false, { transform: booleanAttribute });\n readonly hoverable = input(true, { transform: booleanAttribute });\n /** Master sort switch; per-column `sortable` is still required. */\n readonly sortable = input(true, { transform: booleanAttribute });\n\n readonly paginator = input(false, { transform: booleanAttribute });\n readonly rows = input(10, { transform: numberAttribute });\n readonly rowsPerPageOptions = input<number[]>([10, 20, 50]);\n readonly showCurrentPageReport = input(true, { transform: booleanAttribute });\n\n /**\n * Paginator labels, forwarded to the inner <sds-paginator>. English defaults suit an English-first\n * app; an app serving more than one language MUST pass translated values (the four nav labels and\n * {@link pageLinkLabel} name icon-only controls, so they are their ONLY accessible name).\n * {@link currentPageReportTemplate} tokens: {first} {last} {totalRecords} {currentPage} {totalPages} {rows}.\n */\n readonly currentPageReportTemplate = input<string>('{first} – {last} of {totalRecords}');\n readonly rowsPerPageLabel = input<string>('Rows per page');\n readonly paginationLabel = input<string>('Pagination');\n readonly firstPageLabel = input<string>('First page');\n readonly previousPageLabel = input<string>('Previous page');\n readonly nextPageLabel = input<string>('Next page');\n readonly lastPageLabel = input<string>('Last page');\n /** Accessible name of a numbered page link; `{page}` is the 1-based page number. */\n readonly pageLinkLabel = input<string>('Page {page}');\n\n readonly globalFilter = input(false, { transform: booleanAttribute });\n readonly globalFilterPlaceholder = input<string>('Search…');\n /** Accessible name for the global-filter input. */\n readonly globalFilterAriaLabel = input<string>('Search the table');\n /** Fields searched by the global filter. Empty = every column field. */\n readonly globalFilterFields = input<string[]>([]);\n\n readonly selectionMode = input<SdsSelectionMode>(null);\n /** Two-way: a single row (single mode) or an array of rows (multiple). */\n readonly selection = model<any>(null);\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyMessage = input<string>('No data');\n readonly caption = input<string>('');\n /** Fallback accessible name for the `<table>` when no `caption` is set. */\n readonly ariaLabel = input<string>('Data table');\n /** When set, the body scrolls vertically with a sticky header, e.g. `'320px'`. */\n readonly scrollHeight = input<string>('');\n\n /** When true: skip internal sort/filter/slice; emit (lazyLoad) instead. */\n readonly lazy = input(false, { transform: booleanAttribute });\n /** Total records for the paginator when `lazy`. */\n readonly totalRecords = input(0, { transform: numberAttribute });\n\n /** Adds a leading expander column; details come from `<ng-template sdsRowExpansion>`. */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Drag the right edge of a column header to resize it. */\n readonly resizableColumns = input(false, { transform: booleanAttribute });\n /** Drag a column header to reorder columns. */\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n\n /** Turn on the editable grid (columns opt in with `editor`). Off: the table is unchanged. */\n readonly editable = input(false, { transform: booleanAttribute });\n /** Whether a single click (default) or a double click starts editing an editable cell. */\n readonly editOn = input<SdsTableEditTrigger>('click');\n /** Per-cell error messages, keyed by row key then field (see {@link SdsTableCellErrors}). */\n readonly cellErrors = input<SdsTableCellErrors>({});\n /** Default locale for number/currency cells (a column's `locale` wins). Empty = the browser's. */\n readonly locale = input<string>('');\n /** Spoken marker of an edited (dirty) cell. */\n readonly dirtyLabel = input<string>('edited');\n\n // --- outputs --------------------------------------------------------------\n readonly sortChange = output<SdsTableSortEvent>();\n readonly pageChange = output<SdsPaginatorState>();\n readonly rowSelect = output<any>();\n readonly rowUnselect = output<any>();\n readonly lazyLoad = output<SdsTableLazyEvent>();\n readonly rowClick = output<any>();\n /** Emitted with the row when its expander is opened. */\n readonly rowExpand = output<any>();\n /** Emitted with the row when its expander is closed. */\n readonly rowCollapse = output<any>();\n /** Emitted after a drag-reorder with the moved field and its old/new index. */\n readonly colReorder = output<{ field: string; fromIndex: number; toIndex: number }>();\n /** Emitted when an edited cell is committed with a CHANGED value. Apply it to your data. */\n readonly cellCommit = output<SdsTableCellCommitEvent>();\n\n // --- custom cell templates ------------------------------------------------\n private readonly cellTemplates = contentChildren(SdsTableCell);\n\n private readonly templateMap = computed(() => {\n const map = new Map<string, SdsTableCell['template']>();\n for (const cell of this.cellTemplates()) map.set(cell.column(), cell.template);\n return map;\n });\n\n protected templateFor(field: string) {\n return this.templateMap().get(field) ?? null;\n }\n\n // --- row-expansion template -----------------------------------------------\n private readonly rowExpansion = contentChild(SdsTableRowExpansion);\n\n protected expansionTemplate() {\n return this.rowExpansion()?.template ?? null;\n }\n\n // --- pipeline state -------------------------------------------------------\n protected readonly filterText = signal('');\n protected readonly sortField = signal<string | null>(null);\n protected readonly sortOrder = signal<SdsSortOrder>(0);\n\n // Local paging signals kept in sync with the paginator's two-way models.\n protected readonly first = signal(0);\n protected readonly pageRows = signal(10);\n\n // Expanded-row identities (keyed via keyOf, like selection).\n private readonly expandedKeys = signal(new Set<unknown>());\n\n // Per-field pixel widths set by the resize handle (overrides col.width).\n private readonly columnWidths = signal<Record<string, number>>({});\n\n // Working column order while reorderableColumns is on; seeded from columns().\n private readonly columnOrder = signal<SdsTableColumn[]>([]);\n private readonly dragColIndex = signal<number | null>(null);\n\n constructor() {\n // Seed page size from the `rows` input (and keep it tracking until paged).\n effect(() => this.pageRows.set(this.rows()));\n // Reset the working order whenever the columns input changes.\n effect(() => this.columnOrder.set([...this.columns()]));\n }\n\n ngOnDestroy(): void {\n this.activeResizeCleanup?.();\n this.activeResizeCleanup = null;\n }\n\n // --- value resolution -----------------------------------------------------\n /** Resolve a (possibly dot-pathed) field on a row; null/undefined safe. */\n protected getValue(row: any, field: string): unknown {\n if (row == null || !field) return null;\n if (field.indexOf('.') === -1) return row[field];\n let acc: any = row;\n for (const part of field.split('.')) {\n if (acc == null) return null;\n acc = acc[part];\n }\n return acc;\n }\n\n /** String rendering of a cell value (null/undefined => ''). */\n protected display(row: any, field: string): string {\n const v = this.getValue(row, field);\n return v == null ? '' : String(v);\n }\n\n protected cellContext(row: any, column: SdsTableColumn, index: number): SdsTableCellContext {\n const value = this.getValue(row, column.field);\n return { $implicit: value, value, row, column, index };\n }\n\n // --- filter ---------------------------------------------------------------\n private readonly filtered = computed<readonly any[]>(() => {\n const data = this.value();\n if (this.lazy()) return data;\n const q = this.filterText().trim().toLowerCase();\n if (!this.globalFilter() || !q) return data;\n const fields = this.globalFilterFields().length\n ? this.globalFilterFields()\n : this.effectiveColumns().map((c) => c.field);\n return data.filter((row) =>\n fields.some((f) => {\n const v = this.getValue(row, f);\n return v != null && String(v).toLowerCase().includes(q);\n }),\n );\n });\n\n // --- sort -----------------------------------------------------------------\n private readonly sorted = computed<readonly any[]>(() => {\n const data = this.filtered();\n if (this.lazy()) return data;\n const field = this.sortField();\n const order = this.sortOrder();\n if (!field || order === 0) return data;\n // Stable sort: decorate with original index, compare, then strip.\n return data\n .map((row, index) => ({ row, index }))\n .sort((a, b) => {\n const cmp = this.compare(this.getValue(a.row, field), this.getValue(b.row, field));\n return cmp !== 0 ? cmp * order : a.index - b.index;\n })\n .map((d) => d.row);\n });\n\n private compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n // Booleans (and mixed types) fall through to a lexical compare:\n // `false` < `true`. Columns are expected to be type-homogeneous.\n return String(a).localeCompare(String(b));\n }\n\n // --- paginate -------------------------------------------------------------\n protected readonly displayRows = computed<readonly any[]>(() => {\n const data = this.sorted();\n if (this.lazy() || !this.paginator()) return data;\n const pageRows = Math.max(1, this.pageRows());\n // Clamp the page offset: if `value` shrinks (server refresh, deleted rows,\n // dataset switch) `first` may point past the new end, slicing to []. Snap\n // it back to the last valid page start, mirroring SdsPaginator.onRowsChange.\n const maxStart = Math.max(0, (Math.ceil(data.length / pageRows) - 1) * pageRows);\n const start = Math.min(this.first(), maxStart);\n return data.slice(start, start + pageRows);\n });\n\n protected readonly totalForPaginator = computed(() =>\n this.lazy() ? this.totalRecords() : this.filtered().length,\n );\n\n /** Columns in their current (possibly reordered) order. */\n protected readonly effectiveColumns = computed<SdsTableColumn[]>(() =>\n this.reorderableColumns() && this.columnOrder().length\n ? this.columnOrder()\n : this.columns(),\n );\n\n /** Leading non-data columns: the expander then the selection column. */\n protected readonly leadingColumnCount = computed(\n () => (this.expandable() ? 1 : 0) + (this.showSelectionColumn() ? 1 : 0),\n );\n\n protected readonly totalColumnCount = computed(\n () => this.effectiveColumns().length + this.leadingColumnCount(),\n );\n\n // --- sorting UI -----------------------------------------------------------\n protected isColumnSortable(col: SdsTableColumn): boolean {\n return this.sortable() && !!col.sortable;\n }\n\n protected sortIcon(col: SdsTableColumn) {\n if (this.sortField() !== col.field || this.sortOrder() === 0) {\n return 'chevrons-up-down' as const;\n }\n return this.sortOrder() === 1 ? ('arrow-up' as const) : ('arrow-down' as const);\n }\n\n protected ariaSort(col: SdsTableColumn): 'ascending' | 'descending' | 'none' | null {\n if (!this.isColumnSortable(col)) return null;\n if (this.sortField() !== col.field || this.sortOrder() === 0) return 'none';\n return this.sortOrder() === 1 ? 'ascending' : 'descending';\n }\n\n protected onSort(col: SdsTableColumn): void {\n if (!this.isColumnSortable(col)) return;\n // Cycle asc(1) -> desc(-1) -> none(0) for this single column.\n let order: SdsSortOrder;\n if (this.sortField() !== col.field) {\n order = 1;\n } else {\n order = this.sortOrder() === 1 ? -1 : this.sortOrder() === -1 ? 0 : 1;\n }\n this.sortField.set(order === 0 ? null : col.field);\n this.sortOrder.set(order);\n // A new sort means the first sorted records belong on page 1.\n this.first.set(0);\n this.sortChange.emit({ field: col.field, order });\n if (this.lazy()) this.emitLazy();\n }\n\n // --- selection ------------------------------------------------------------\n protected readonly showSelectionColumn = computed(() => this.selectionMode() != null);\n\n private equals(a: any, b: any): boolean {\n const k = this.dataKey();\n if (k && a && b && typeof a === 'object' && typeof b === 'object') {\n return a[k] === b[k];\n }\n return a === b;\n }\n\n /** Identity used for O(1) membership tests: dataKey value when set, else the row itself. */\n private keyOf(row: any): unknown {\n const k = this.dataKey();\n return k && row && typeof row === 'object' ? row[k] : row;\n }\n\n /**\n * Set of selected identities, recomputed only when selection()/dataKey()\n * change. Lets isRowSelected/headerChecked/headerIndeterminate do O(1)\n * lookups instead of an O(selection) scan per row.\n */\n private readonly selectedKeys = computed(() => {\n const sel = this.selection();\n const list = Array.isArray(sel) ? sel : sel == null ? [] : [sel];\n return new Set(list.map((s) => this.keyOf(s)));\n });\n\n protected isRowSelected(row: any): boolean {\n if (this.selection() == null) return false;\n return this.selectedKeys().has(this.keyOf(row));\n }\n\n protected readonly headerChecked = computed(() => {\n if (this.selectionMode() !== 'multiple') return false;\n const rows = this.filtered();\n if (!rows.length) return false;\n const keys = this.selectedKeys();\n if (!keys.size) return false;\n return rows.every((r) => keys.has(this.keyOf(r)));\n });\n\n protected readonly headerIndeterminate = computed(() => {\n if (this.selectionMode() !== 'multiple') return false;\n const rows = this.filtered();\n const keys = this.selectedKeys();\n if (!keys.size) return false;\n const selectedCount = rows.reduce((n, r) => (keys.has(this.keyOf(r)) ? n + 1 : n), 0);\n return selectedCount > 0 && selectedCount < rows.length;\n });\n\n protected toggleAll(): void {\n if (this.selectionMode() !== 'multiple') return;\n const rows = this.filtered();\n if (this.headerChecked()) {\n // Deselect every currently-filtered row.\n const next = (this.selection() as any[]).filter(\n (s) => !rows.some((r) => this.equals(s, r)),\n );\n rows.forEach((r) => this.rowUnselect.emit(r));\n this.selection.set(next);\n } else {\n const current = Array.isArray(this.selection()) ? [...this.selection()] : [];\n for (const r of rows) {\n if (!current.some((s) => this.equals(s, r))) {\n current.push(r);\n this.rowSelect.emit(r);\n }\n }\n this.selection.set(current);\n }\n }\n\n protected onRowCheckboxClick(event: Event, row: any): void {\n event.stopPropagation();\n if (this.selectionMode() === 'single') {\n this.onRowClick(row);\n } else {\n this.toggleRowSelection(row);\n }\n }\n\n /** Enter/Space on a (single-mode) focusable row toggles its selection. */\n protected onRowKeydown(event: Event, row: any): void {\n if (this.selectionMode() !== 'single' || this.loading() || this.editable()) return;\n event.preventDefault();\n this.onRowClick(row);\n }\n\n private toggleRowSelection(row: any): void {\n const current = Array.isArray(this.selection()) ? [...this.selection()] : [];\n const idx = current.findIndex((s) => this.equals(s, row));\n if (idx >= 0) {\n current.splice(idx, 1);\n this.selection.set(current);\n this.rowUnselect.emit(row);\n } else {\n current.push(row);\n this.selection.set(current);\n this.rowSelect.emit(row);\n }\n }\n\n protected onRowClick(row: any): void {\n if (this.loading()) return;\n this.rowClick.emit(row);\n if (this.selectionMode() === 'single') {\n if (this.equals(this.selection(), row)) {\n this.selection.set(null);\n this.rowUnselect.emit(row);\n } else {\n this.selection.set(row);\n this.rowSelect.emit(row);\n }\n }\n }\n\n // --- paginator ------------------------------------------------------------\n protected onPageChange(state: SdsPaginatorState): void {\n this.editing.set(null);\n this.pageChange.emit(state);\n if (this.lazy()) this.emitLazy();\n }\n\n private emitLazy(): void {\n this.lazyLoad.emit({\n first: this.first(),\n rows: this.pageRows(),\n sortField: this.sortField(),\n sortOrder: this.sortOrder(),\n globalFilter: this.filterText(),\n });\n }\n\n protected onFilterInput(event: Event): void {\n this.filterText.set((event.target as HTMLInputElement).value);\n // New query -> back to the first page.\n this.first.set(0);\n if (this.lazy()) this.emitLazy();\n }\n\n // --- row expansion --------------------------------------------------------\n protected isExpanded(row: any): boolean {\n return this.expandedKeys().has(this.keyOf(row));\n }\n\n protected toggleExpand(row: any): void {\n const key = this.keyOf(row);\n const next = new Set(this.expandedKeys());\n if (next.has(key)) {\n next.delete(key);\n this.expandedKeys.set(next);\n this.rowCollapse.emit(row);\n } else {\n next.add(key);\n this.expandedKeys.set(next);\n this.rowExpand.emit(row);\n }\n }\n\n protected onExpanderClick(event: Event, row: any): void {\n // Keep the expander from triggering single-select row click.\n event.stopPropagation();\n this.toggleExpand(row);\n }\n\n /**\n * Stable per-row id for the expansion region, derived from the row identity\n * (dataKey value when set, else the row itself). Mirrors the accordion's\n * contentId pattern so the expander's aria-controls can point at the detail\n * region. Using keyOf (not $index) keeps the id stable across reorders.\n */\n protected rowDetailId(row: any): string {\n return `${this.tableId}-detail-${String(this.keyOf(row))}`;\n }\n\n // --- resizable columns ----------------------------------------------------\n private activeResizeCleanup: (() => void) | null = null;\n\n /** px override from a resize drag, else the column's declared width, else null. */\n protected columnStyleWidth(col: SdsTableColumn): string | null {\n const px = this.columnWidths()[col.field];\n if (px != null) return px + 'px';\n return col.width || null;\n }\n\n protected onResizeStart(event: PointerEvent, field: string): void {\n event.preventDefault();\n event.stopPropagation();\n const th = (event.target as HTMLElement).closest('th');\n if (!th) return;\n const startX = event.clientX;\n const startW = th.getBoundingClientRect().width;\n const move = (e: PointerEvent) => {\n const w = Math.max(60, Math.round(startW + (e.clientX - startX)));\n this.columnWidths.update((m) => ({ ...m, [field]: w }));\n };\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n this.activeResizeCleanup = null;\n };\n // Track for ngOnDestroy in case the pointer-up never lands.\n this.activeResizeCleanup = up;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }\n\n // --- reorderable columns --------------------------------------------------\n protected onColDragStart(i: number): void {\n this.dragColIndex.set(i);\n }\n\n protected onColDragEnd(): void {\n this.dragColIndex.set(null);\n }\n\n protected onColDragOver(e: DragEvent): void {\n e.preventDefault();\n }\n\n protected onColDrop(e: DragEvent, toIndex: number): void {\n e.preventDefault();\n const from = this.dragColIndex();\n if (from == null || from === toIndex) return;\n const cols = [...this.effectiveColumns()];\n const [moved] = cols.splice(from, 1);\n cols.splice(toIndex, 0, moved);\n this.columnOrder.set(cols);\n this.dragColIndex.set(null);\n this.colReorder.emit({ field: moved.field, fromIndex: from, toIndex });\n }\n\n // --- trackBy --------------------------------------------------------------\n protected trackRow(index: number, row: any): unknown {\n const k = this.dataKey();\n if (k && row && typeof row === 'object' && row[k] != null) return row[k];\n return index;\n }\n\n // --- editable grid ----------------------------------------------------------\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly numberEditor = viewChild(SdsInputNumber);\n\n /** The roving tab stop (row index in the displayed page, column index). */\n private readonly activeCell = signal<{ r: number; c: number }>({ r: 0, c: 0 });\n /** The cell being edited, if any. */\n private readonly editing = signal<{ r: number; c: number } | null>(null);\n /** The editor's working value. */\n protected readonly draft = signal<unknown>(null);\n /** Edited cells: row key → fields. */\n private readonly dirty = signal(new Map<unknown, Set<string>>());\n /** Set while the table moves focus itself, so the editor's blur doesn't commit twice. */\n private suppressBlur = false;\n\n /** Active cell clamped to the current page and columns. */\n private readonly tabStop = computed(() => {\n const rows = this.displayRows().length;\n const cols = this.effectiveColumns().length;\n const { r, c } = this.activeCell();\n return { r: Math.max(0, Math.min(r, rows - 1)), c: Math.max(0, Math.min(c, cols - 1)) };\n });\n\n protected readonly draftText = computed(() => {\n const d = this.draft();\n return d == null ? '' : String(d);\n });\n\n protected isTabStop(r: number, c: number): boolean {\n const t = this.tabStop();\n return t.r === r && t.c === c;\n }\n\n protected isEditing(r: number, c: number): boolean {\n const e = this.editing();\n return !!e && e.r === r && e.c === c;\n }\n\n protected isCellEditable(row: any, col: SdsTableColumn): boolean {\n if (!this.editable() || !col.editor || this.loading()) return false;\n const rule = col.editable;\n if (rule === undefined) return true;\n return typeof rule === 'function' ? !!rule(row) : rule;\n }\n\n /** Row key used by dirty tracking, errors and commit events. */\n private rowKeyOf(row: any): unknown {\n if (this.dataKey() && row && typeof row === 'object') return row[this.dataKey()];\n const idx = this.value().indexOf(row);\n return idx >= 0 ? idx : row;\n }\n\n protected cellErrorFor(row: any, field: string): string | null {\n const byRow = this.cellErrors()?.[String(this.rowKeyOf(row))];\n return (byRow && byRow[field]) || null;\n }\n\n protected cellErrorId(r: number, c: number): string {\n return `${this.tableId}-err-${r}-${c}`;\n }\n\n protected isDirty(row: any, field: string): boolean {\n return this.dirty().get(this.rowKeyOf(row))?.has(field) ?? false;\n }\n\n /** Forget the dirty marks — all of them, or one row's (by row key). */\n clearDirty(rowKey?: unknown): void {\n if (rowKey === undefined) {\n this.dirty.set(new Map());\n return;\n }\n const next = new Map(this.dirty());\n next.delete(rowKey);\n this.dirty.set(next);\n }\n\n /** Display text of a cell in view mode: `format`, else the editor's formatting, else the raw value. */\n protected displayCell(row: any, col: SdsTableColumn): string {\n const v = this.getValue(row, col.field);\n if (col.format) return col.format(v, row);\n if (v == null || v === '') return '';\n if ((col.editor === 'currency' || col.editor === 'number') && typeof v === 'number') {\n try {\n const opts: Intl.NumberFormatOptions =\n col.editor === 'currency'\n ? { style: 'currency', currency: col.currency ?? 'EUR' }\n : { style: 'decimal' };\n if (col.minFractionDigits != null) opts.minimumFractionDigits = col.minFractionDigits;\n if (col.maxFractionDigits != null) opts.maximumFractionDigits = col.maxFractionDigits;\n return new Intl.NumberFormat(col.locale ?? (this.locale() || undefined), opts).format(v);\n } catch {\n return String(v);\n }\n }\n if (col.editor === 'select') {\n return col.options?.find((o) => o.value === v)?.label ?? String(v);\n }\n return String(v);\n }\n\n protected gridCellClass(row: any, col: SdsTableColumn, r: number, c: number): string {\n const align = ALIGN[col.align ?? 'left'];\n const editing = this.isEditing(r, c);\n // While editing, the cell trades its padding for the editor's own, so the row height barely moves.\n const pad = editing ? 'px-1 py-1 text-sm' : SIZES[this.size()].cell;\n const parts = [\n pad,\n align,\n 'relative text-ink align-middle focus:outline-none focus:ring-2 focus:ring-inset focus:ring-brand-500',\n ];\n if (!editing && this.isCellEditable(row, col)) parts.push('cursor-text hover:bg-muted/60');\n if (this.cellErrorFor(row, col.field)) parts.push('bg-accent-red-soft/50 shadow-[inset_0_0_0_1px_var(--color-danger)]');\n return parts.join(' ');\n }\n\n protected onCellFocus(r: number, c: number): void {\n const a = this.activeCell();\n if (a.r !== r || a.c !== c) this.activeCell.set({ r, c });\n }\n\n protected onCellClick(event: MouseEvent, r: number, c: number): void {\n if (this.isEditing(r, c)) {\n event.stopPropagation();\n return;\n }\n this.activeCell.set({ r, c });\n const row = this.displayRows()[r];\n const col = this.effectiveColumns()[c];\n if (this.editOn() === 'click' && row && col && this.isCellEditable(row, col)) {\n // Keep a click that edits a cell from also toggling single-row selection.\n event.stopPropagation();\n this.startEdit(r, c);\n }\n }\n\n protected onCellDblClick(event: MouseEvent, r: number, c: number): void {\n if (this.editOn() !== 'dblclick' || this.isEditing(r, c)) return;\n const row = this.displayRows()[r];\n const col = this.effectiveColumns()[c];\n if (row && col && this.isCellEditable(row, col)) {\n event.stopPropagation();\n this.startEdit(r, c);\n }\n }\n\n /**\n * Start editing a cell of the displayed page (e.g. the first cell of a row you just added).\n * `field` names the column. Returns false when the cell isn't editable.\n */\n editCell(rowIndex: number, field: string): boolean {\n const c = this.effectiveColumns().findIndex((col) => col.field === field);\n const row = this.displayRows()[rowIndex];\n const col = this.effectiveColumns()[c];\n if (c < 0 || !row || !this.isCellEditable(row, col)) return false;\n this.activeCell.set({ r: rowIndex, c });\n this.startEdit(rowIndex, c);\n return true;\n }\n\n private startEdit(r: number, c: number, initialChar?: string): void {\n const row = this.displayRows()[r];\n const col = this.effectiveColumns()[c];\n if (!row || !col || !this.isCellEditable(row, col)) return;\n if (this.editing()) this.commitEdit('none', false);\n const current = this.getValue(row, col.field);\n const numeric = col.editor === 'number' || col.editor === 'currency';\n this.draft.set(initialChar !== undefined && !numeric ? initialChar : initialChar !== undefined ? null : current);\n this.activeCell.set({ r, c });\n this.editing.set({ r, c });\n afterNextRender(() => this.focusEditor(col, initialChar), { injector: this.injector });\n }\n\n private focusEditor(col: SdsTableColumn, initialChar?: string): void {\n const e = this.editing();\n if (!e) return;\n const td = this.cellEl(e.r, e.c);\n if (!td) return;\n if (col.editor === 'number' || col.editor === 'currency') {\n const cmp = this.numberEditor();\n if (!cmp) return;\n const d = this.draft();\n cmp.writeValue(typeof d === 'number' ? d : null);\n cmp.registerOnChange((v) => this.draft.set(v));\n cmp.focus({ select: initialChar === undefined });\n if (initialChar !== undefined) {\n const field = td.querySelector<HTMLInputElement>('input');\n if (field) {\n field.value = initialChar;\n field.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n return;\n }\n const el = td.querySelector<HTMLInputElement | HTMLSelectElement>('[data-sds-cell-editor]');\n el?.focus();\n if (el instanceof HTMLInputElement) {\n if (initialChar === undefined) el.select();\n else el.setSelectionRange(el.value.length, el.value.length);\n }\n }\n\n protected onTextEditorInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onSelectEditorChange(event: Event, col: SdsTableColumn): void {\n const idx = Number((event.target as HTMLSelectElement).value);\n const opt = col.options?.[idx];\n this.draft.set(opt ? opt.value : null);\n }\n\n /** Focus left the editor (a click elsewhere): commit, but don't pull focus back. */\n protected onEditorBlur(): void {\n if (this.suppressBlur || !this.editing()) return;\n // A focus move INSIDE the editor (sds-input-number's own buttons) is not a blur of the cell.\n setTimeout(() => {\n const e = this.editing();\n if (!e || this.suppressBlur) return;\n const td = this.cellEl(e.r, e.c);\n if (td && td.contains(document.activeElement) && document.activeElement !== td) return;\n this.commitEdit('none', false);\n });\n }\n\n /**\n * Commit the edit. `move` picks the next active cell; `refocus` puts focus back on the grid (not when\n * the user clicked away).\n */\n private commitEdit(move: 'none' | 'down' | 'up' | 'next' | 'prev', refocus = true): void {\n const e = this.editing();\n if (!e) return;\n // Move focus to the cell first: the number editor clamps/tidies its value on blur.\n this.suppressBlur = true;\n if (refocus) this.cellEl(e.r, e.c)?.focus();\n this.suppressBlur = false;\n\n const row = this.displayRows()[e.r];\n const col = this.effectiveColumns()[e.c];\n this.editing.set(null);\n if (row && col) {\n let value = this.draft();\n if (col.editor === 'text' || col.editor === undefined) value = value == null ? '' : String(value);\n const previousValue = this.getValue(row, col.field);\n const same =\n value === previousValue ||\n ((value === '' || value == null) && (previousValue === '' || previousValue == null));\n if (!same) {\n const key = this.rowKeyOf(row);\n const next = new Map(this.dirty());\n next.set(key, new Set([...(next.get(key) ?? []), col.field]));\n this.dirty.set(next);\n this.cellCommit.emit({\n row,\n field: col.field,\n value,\n previousValue,\n rowKey: key,\n rowIndex: this.value().indexOf(row),\n });\n }\n }\n\n let target = { r: e.r, c: e.c };\n if (move === 'down') target = { r: Math.min(e.r + 1, this.displayRows().length - 1), c: e.c };\n else if (move === 'up') target = { r: Math.max(0, e.r - 1), c: e.c };\n else if (move === 'next' || move === 'prev') target = this.nextEditable(e.r, e.c, move === 'next' ? 1 : -1) ?? target;\n this.activeCell.set(target);\n if (refocus) {\n if (move === 'next' || move === 'prev') {\n // Tab keeps the spreadsheet rhythm: land in the next editable cell already editing.\n if (target.r !== e.r || target.c !== e.c) this.startEdit(target.r, target.c);\n else this.focusCellSoon(target.r, target.c);\n } else {\n this.focusCellSoon(target.r, target.c);\n }\n }\n }\n\n private cancelEdit(): void {\n const e = this.editing();\n if (!e) return;\n this.suppressBlur = true;\n this.cellEl(e.r, e.c)?.focus();\n this.suppressBlur = false;\n this.editing.set(null);\n this.focusCellSoon(e.r, e.c);\n }\n\n /** The next editable cell in reading order (wrapping rows), or null at the grid's edge. */\n private nextEditable(r: number, c: number, dir: 1 | -1): { r: number; c: number } | null {\n const rows = this.displayRows();\n const cols = this.effectiveColumns();\n let rr = r;\n let cc = c;\n for (let n = 0; n < rows.length * cols.length; n++) {\n cc += dir;\n if (cc >= cols.length) {\n cc = 0;\n rr++;\n } else if (cc < 0) {\n cc = cols.length - 1;\n rr--;\n }\n if (rr < 0 || rr >= rows.length) return null;\n if (this.isCellEditable(rows[rr], cols[cc])) return { r: rr, c: cc };\n }\n return null;\n }\n\n private cellEl(r: number, c: number): HTMLElement | null {\n return this.host.nativeElement.querySelector<HTMLElement>(`td[data-cell=\"${r}:${c}\"]`);\n }\n\n private focusCellSoon(r: number, c: number): void {\n afterNextRender(() => this.cellEl(r, c)?.focus(), { injector: this.injector });\n }\n\n protected onGridKeydown(event: KeyboardEvent): void {\n if (!this.editable() || this.loading()) return;\n const target = event.target as HTMLElement;\n const e = this.editing();\n\n // --- editing: Enter / Tab / Escape drive the edit; everything else belongs to the editor.\n if (e && this.cellEl(e.r, e.c)?.contains(target) && target.tagName !== 'TD') {\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n this.commitEdit(event.shiftKey ? 'up' : 'down');\n return;\n case 'Tab': {\n const next = this.nextEditable(e.r, e.c, event.shiftKey ? -1 : 1);\n if (!next) {\n // Last editable cell: commit and let Tab leave the grid naturally.\n this.commitEdit('none', false);\n return;\n }\n event.preventDefault();\n this.commitEdit(event.shiftKey ? 'prev' : 'next');\n return;\n }\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.cancelEdit();\n return;\n }\n return;\n }\n\n // --- navigation: only when a grid cell itself has focus.\n const td = target.closest<HTMLElement>('td[data-cell]');\n if (!td || td !== target) return;\n const [r, c] = (td.dataset['cell'] ?? '0:0').split(':').map(Number);\n const rows = this.displayRows().length;\n const cols = this.effectiveColumns().length;\n let next: { r: number; c: number } | null = null;\n switch (event.key) {\n case 'ArrowUp':\n next = { r: Math.max(0, r - 1), c };\n break;\n case 'ArrowDown':\n next = { r: Math.min(rows - 1, r + 1), c };\n break;\n case 'ArrowLeft':\n next = { r, c: Math.max(0, c - 1) };\n break;\n case 'ArrowRight':\n next = { r, c: Math.min(cols - 1, c + 1) };\n break;\n case 'Home':\n next = event.ctrlKey || event.metaKey ? { r: 0, c: 0 } : { r, c: 0 };\n break;\n case 'End':\n next = event.ctrlKey || event.metaKey ? { r: rows - 1, c: cols - 1 } : { r, c: cols - 1 };\n break;\n case 'Enter':\n case 'F2':\n event.preventDefault();\n this.startEdit(r, c);\n return;\n default: {\n const row = this.displayRows()[r];\n const col = this.effectiveColumns()[c];\n const printable =\n event.key.length === 1 && event.key !== ' ' && !event.ctrlKey && !event.metaKey && !event.altKey;\n if (printable && row && col && col.editor !== 'select' && this.isCellEditable(row, col)) {\n event.preventDefault();\n this.startEdit(r, c, event.key);\n }\n return;\n }\n }\n event.preventDefault();\n if (next) {\n this.activeCell.set(next);\n this.cellEl(next.r, next.c)?.focus();\n }\n }\n\n // --- styling --------------------------------------------------------------\n protected headCellClass(col?: SdsTableColumn): string {\n const align = ALIGN[col?.align ?? 'left'];\n return `${SIZES[this.size()].head} ${align} font-semibold`;\n }\n\n protected cellClass(col?: SdsTableColumn): string {\n const align = ALIGN[col?.align ?? 'left'];\n return `${SIZES[this.size()].cell} ${align} text-ink align-middle`;\n }\n\n protected rowClass(row: any, index: number): string {\n const parts: string[] = ['transition-colors'];\n if (this.gridlines()) parts.push('divide-x divide-border');\n if (this.isRowSelected(row)) {\n parts.push('bg-brand-50');\n } else if (this.striped() && index % 2 === 1) {\n parts.push('bg-muted/40');\n }\n if (this.hoverable() && !this.isRowSelected(row)) parts.push('hover:bg-muted/60');\n if (this.selectionMode() === 'single') {\n parts.push(\n 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-brand-500',\n );\n }\n return parts.join(' ');\n }\n\n protected checkboxClass(checked: boolean, indeterminate: boolean): string {\n return checked || indeterminate\n ? 'border-brand-600 bg-brand-600 text-white'\n : 'border-border bg-surface';\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\nexport type SdsToastKind = 'success' | 'error' | 'info';\n\nexport interface SdsToast {\n id: number;\n kind: SdsToastKind;\n text: string;\n}\n\n/**\n * A tiny transient-notification bus. Application code calls {@link success} / {@link error} / {@link info}\n * after an action; a single {@link SdsToastHost} mounted in the app shell renders the queue and each toast\n * auto-dismisses. Deliberately minimal — no positions, no actions-in-toast — because it exists to confirm\n * an action, not to be a notification centre.\n *\n * `providedIn: 'root'`, so injecting it anywhere shares one queue:\n *\n * ```ts\n * private readonly toasts = inject(SdsToastService);\n * this.toasts.success('Enregistré.');\n * ```\n *\n * Mount the host once (e.g. in the shell): `<sds-toast-host />`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SdsToastService {\n private seq = 0;\n readonly toasts = signal<SdsToast[]>([]);\n\n /** How long a toast stays, in ms, by kind. Errors linger; success/info are brief. */\n private static readonly TTL: Record<SdsToastKind, number> = {\n success: 3500,\n info: 3500,\n error: 6000,\n };\n\n success(text: string): void {\n this.push('success', text);\n }\n error(text: string): void {\n this.push('error', text);\n }\n info(text: string): void {\n this.push('info', text);\n }\n\n dismiss(id: number): void {\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n private push(kind: SdsToastKind, text: string): void {\n const id = ++this.seq;\n this.toasts.update((list) => [...list, { id, kind, text }]);\n setTimeout(() => this.dismiss(id), SdsToastService.TTL[kind]);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SdsToast, SdsToastKind, SdsToastService } from './sds-toast.service';\n\n/**\n * Renders the {@link SdsToastService} queue, fixed bottom-centre. Mount it once, in the app shell:\n * `<sds-toast-host />`. Application code pushes toasts through the injected service.\n *\n * Accessibility: the two live regions are ALWAYS in the DOM (even when empty), because a live region must\n * pre-exist for its later content changes to be announced. Errors go to an assertive `role=\"alert\"` region\n * so a failure interrupts; success/info go to a polite region so they queue.\n */\n@Component({\n selector: 'sds-toast-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, SdsIcon],\n template: `\n <div class=\"pointer-events-none fixed inset-x-0 bottom-6 z-[100] flex flex-col items-center gap-2 px-4\">\n <div role=\"alert\" aria-live=\"assertive\" class=\"flex w-full flex-col items-center gap-2\">\n @for (t of errors(); track t.id) {\n <ng-container [ngTemplateOutlet]=\"toast\" [ngTemplateOutletContext]=\"{ t }\" />\n }\n </div>\n <div aria-live=\"polite\" class=\"flex w-full flex-col items-center gap-2\">\n @for (t of notices(); track t.id) {\n <ng-container [ngTemplateOutlet]=\"toast\" [ngTemplateOutletContext]=\"{ t }\" />\n }\n </div>\n </div>\n\n <ng-template #toast let-t=\"t\">\n <div\n class=\"pointer-events-auto flex max-w-md items-start gap-2.5 rounded-card border bg-surface px-4 py-3 text-sm shadow-lg\"\n [class]=\"border(t.kind)\"\n >\n <sds-icon [name]=\"icon(t.kind)\" [size]=\"18\" class=\"mt-0.5 shrink-0\" [class]=\"tone(t.kind)\" />\n <span class=\"text-ink\">{{ t.text }}</span>\n <button\n type=\"button\"\n (click)=\"toasts.dismiss(t.id)\"\n [attr.aria-label]=\"closeLabel()\"\n class=\"ml-1 shrink-0 rounded p-0.5 text-ink-faint hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n >\n <sds-icon name=\"x\" [size]=\"15\" />\n </button>\n </div>\n </ng-template>\n `,\n})\nexport class SdsToastHost {\n readonly toasts = inject(SdsToastService);\n\n /**\n * Accessible name for each toast's close button. French default so existing consumers are unchanged; the\n * button is icon-only, so an app serving more than one language MUST translate it.\n */\n readonly closeLabel = input<string>('Fermer');\n\n protected readonly errors = computed(() => this.toasts.toasts().filter((t) => t.kind === 'error'));\n protected readonly notices = computed(() => this.toasts.toasts().filter((t) => t.kind !== 'error'));\n\n protected icon(kind: SdsToastKind): SdsIconName {\n return kind === 'success' ? 'check-circle' : kind === 'error' ? 'alert-circle' : 'info';\n }\n protected tone(kind: SdsToastKind): string {\n return kind === 'success' ? 'text-success' : kind === 'error' ? 'text-danger' : 'text-accent-blue';\n }\n protected border(kind: SdsToast['kind']): string {\n const accent =\n kind === 'success' ? 'border-l-success' : kind === 'error' ? 'border-l-danger' : 'border-l-accent-blue';\n return `border-l-4 ${accent} border-y-border border-r-border`;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\n\nexport type SdsTheme = 'light' | 'dark';\n\nconst STORAGE_KEY = 'sds-theme';\n\n/**\n * Light/dark theme state for the whole app. It owns exactly one thing: the presence of the `.dark`\n * class on the document root, which flips every design token defined under `.dark` in the theme CSS\n * (base.css and the brand ramp). Because the library themes by ROLE, this single class re-themes the\n * entire component set — there is no per-component dark mode to wire.\n *\n * `providedIn: 'root'`, so the switcher, the shell and any feature share one source of truth:\n *\n * ```ts\n * private readonly theme = inject(SdsThemeService);\n * this.theme.toggle(); // flip\n * this.theme.isDark(); // read (a signal)\n * ```\n *\n * Initial value: a previously stored choice wins; otherwise the OS `prefers-color-scheme` is honoured,\n * so a first-time visitor already in dark at the OS level lands in dark. The choice is persisted to\n * `localStorage` and re-applied on the next visit. Every browser access is guarded, so the service is\n * safe under SSR / prerender (it simply no-ops without a DOM).\n */\n@Injectable({ providedIn: 'root' })\nexport class SdsThemeService {\n private readonly document = inject(DOCUMENT);\n\n readonly theme = signal<SdsTheme>(this.initialTheme());\n readonly isDark = computed(() => this.theme() === 'dark');\n\n constructor() {\n // Keep the DOM class and the stored preference in lockstep with the signal — one effect, so any\n // caller that sets the signal (toggle, setTheme, or a future settings screen) applies uniformly.\n effect(() => this.apply(this.theme()));\n }\n\n /** Flip between light and dark. */\n toggle(): void {\n this.theme.update((t) => (t === 'light' ? 'dark' : 'light'));\n }\n\n /** Set an explicit theme. */\n setTheme(theme: SdsTheme): void {\n this.theme.set(theme);\n }\n\n private initialTheme(): SdsTheme {\n try {\n const stored = this.readStorage()?.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark') return stored;\n const win = this.document.defaultView;\n if (win?.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';\n } catch {\n /* no storage / no matchMedia (SSR, privacy mode) — fall through to the light default */\n }\n return 'light';\n }\n\n private apply(theme: SdsTheme): void {\n const root = this.document.documentElement;\n root.classList.toggle('dark', theme === 'dark');\n // Let the UA paint form controls / scrollbars to match.\n root.style.colorScheme = theme;\n try {\n this.readStorage()?.setItem(STORAGE_KEY, theme);\n } catch {\n /* storage unavailable — the class is still applied; only persistence is skipped */\n }\n }\n\n private readStorage(): Storage | null {\n return this.document.defaultView?.localStorage ?? null;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsThemeService } from './sds-theme.service';\n\nexport type SdsThemeToggleAppearance = 'surface' | 'on-brand';\n\n/**\n * Icon button that flips the app between light and dark, backed by {@link SdsThemeService}. It shows the\n * destination, not the current state — a moon while you are in light (tap to go dark), a sun while you\n * are in dark — and its accessible name names the action, because an icon-only control's label is its\n * only name.\n *\n * Two appearances so it sits correctly on either bar: `surface` (default) for a light or glass top bar,\n * `on-brand` for the dark brand bar / sidebar.\n *\n * @example\n * <sds-theme-toggle />\n * <sds-theme-toggle appearance=\"on-brand\" [lightLabel]=\"'Passer en clair'\" [darkLabel]=\"'Passer en sombre'\" />\n */\n@Component({\n selector: 'sds-theme-toggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'inline-block' },\n template: `\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"buttonClasses()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-pressed]=\"isDark()\"\n [attr.title]=\"label()\"\n (click)=\"theme.toggle()\"\n >\n <sds-icon [name]=\"isDark() ? 'sun' : 'moon'\" [size]=\"iconSize()\" />\n </button>\n `,\n})\nexport class SdsThemeToggle {\n protected readonly theme = inject(SdsThemeService);\n protected readonly isDark = this.theme.isDark;\n\n /** Button box size in px (the icon scales with it). */\n readonly size = input<number>(40);\n\n /** `surface` for light/glass bars, `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsThemeToggleAppearance>('surface');\n\n /**\n * Accessible names for the two actions. French defaults keep existing consumers unchanged; a\n * multilingual app must pass translated values.\n */\n readonly darkLabel = input<string>('Passer en mode sombre');\n readonly lightLabel = input<string>('Passer en mode clair');\n\n protected readonly iconSize = computed(() => Math.round(this.size() * 0.5));\n protected readonly label = computed(() => (this.isDark() ? this.lightLabel() : this.darkLabel()));\n\n protected readonly buttonClasses = computed(() =>\n this.appearance() === 'on-brand'\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'bg-muted text-ink-soft hover:bg-brand-50 hover:text-brand-600 focus-visible:ring-brand-500/40',\n );\n}\n","import { Injectable, signal } from '@angular/core';\n\n/** How the rail is painted. `brand` is the dark brand rail; `surface` is a light rail with brand accents. */\nexport type SdsSidebarAppearance = 'brand' | 'surface';\n\n/**\n * Shared collapse state for the sidebar and its nav items.\n *\n * Provided in root so the sidebar, projected nav groups/items and any layout\n * code observe a single source of truth without prop-drilling. For apps with\n * multiple independent sidebars, provide it at a component level instead.\n */\n@Injectable({ providedIn: 'root' })\nexport class SidebarStore {\n /** Desktop rail state: collapsed to icon-only width (applies at ≥ lg). */\n readonly collapsed = signal(false);\n\n /**\n * The rail's paint, published by <sds-sidebar> so projected <sds-nav-item>/<sds-nav-group> pick the\n * matching state and hover colours (white-on-dark for `brand`, ink-and-brand for `surface`) without\n * every item taking an input. One rail, one appearance — set by the sidebar, read by its children.\n */\n readonly appearance = signal<SdsSidebarAppearance>('brand');\n\n /** Mobile drawer state: whether the off-canvas sidebar is slid in (< lg). */\n readonly mobileOpen = signal(false);\n\n /** Toggle the desktop icon-rail. */\n toggle(): void {\n this.collapsed.update((v) => !v);\n }\n\n setCollapsed(value: boolean): void {\n this.collapsed.set(value);\n }\n\n /** Open the mobile drawer. */\n openMobile(): void {\n this.mobileOpen.set(true);\n }\n\n /** Close the mobile drawer. */\n closeMobile(): void {\n this.mobileOpen.set(false);\n }\n\n /** Toggle the mobile drawer. */\n toggleMobile(): void {\n this.mobileOpen.update((v) => !v);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SidebarStore } from '../sidebar/sidebar-store';\n\nexport type SdsTopbarAppearance = 'brand' | 'surface' | 'glass';\n\n/**\n * Application top bar: a logo slot, the app name, and three slots the app fills.\n *\n * Three appearances. `brand` is the gradient-and-wave bar an internal tool wants. `surface` is white on\n * a hairline border, for a bar that has to sit under a customer-facing page without dominating it —\n * a storefront header is a bar, but it is not a banner. `glass` is a translucent, brand-tinted bar with\n * a blur behind it, for a dashboard that wants the brand present but light — it reads the brand from the\n * ramp, so it tints itself to whatever theme is loaded and flips with dark mode. The slots and the\n * layout are identical across all three; only the paint differs.\n *\n * `[decorations]` adds slow-drifting, brand-tinted blobs behind the bar (opt-in; they respect\n * prefers-reduced-motion). They pair with `glass`/`surface`; on `brand` the wave already fills that role.\n *\n * It deliberately owns NO account UI. It used to render the signed-in user and a logout button, which\n * forced every consumer into one shape — no dropdown, no email, no menu, no busy state, and an\n * icon-only button whose accessible name the library had to guess a language for. What an app needs\n * beside its own brand bar differs per app, so the bar supplies the surface and the app supplies the\n * contents: project them into `[sdsActions]`.\n *\n * Slots, left to right: `[sdsLogo]`, `[sdsLead]` (beside the name — a location or workspace picker),\n * `[sdsCenter]` (the flexible middle — a search field), `[sdsActions]` (the right edge).\n *\n * @example\n * <sds-topbar appName=\"Design system\">\n * <img sdsLogo src=\"logo.svg\" alt=\"\" />\n * <my-address-picker sdsLead />\n * <my-search sdsCenter />\n * <my-account-menu sdsActions />\n * </sds-topbar>\n */\n@Component({\n selector: 'sds-topbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <header class=\"relative z-30\" [class]=\"shellClasses()\" style=\"height: var(--sds-topbar-h)\">\n <!--\n Decorative wave. The clip lives HERE, on the wave's own wrapper, and not on the header.\n The header used to carry overflow-hidden, which also clipped anything projected into\n [sdsActions] — so an app menu or dropdown, the very thing that slot exists for, rendered as a\n 4px sliver. The wave still needs clipping; nothing else does.\n -->\n @if (appearance() === 'brand') {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <svg\n class=\"pointer-events-none absolute inset-y-0 right-0 h-full w-2/3 min-w-105\"\n viewBox=\"0 0 600 64\"\n preserveAspectRatio=\"none\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M0,64 C150,64 130,6 340,6 C470,6 480,64 600,64 Z\"\n fill=\"white\"\n fill-opacity=\"0.05\"\n />\n <path\n d=\"M40,64 C210,64 190,18 400,18 C520,18 540,64 660,64\"\n stroke=\"white\"\n stroke-opacity=\"0.13\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M130,64 C300,64 280,2 480,2 C580,2 600,40 680,64\"\n stroke=\"white\"\n stroke-opacity=\"0.10\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n }\n\n <!--\n Brand-tinted ambient blobs. Behind the content and non-interactive; the clip lives on this span,\n never on the header, so a projected menu/dropdown is not sliced. Colours come from the brand ramp,\n so they follow the active theme and dark mode.\n -->\n @if (decorations()) {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <span class=\"absolute -top-16 right-8 h-56 w-56 rounded-full bg-brand-300/25 blur-3xl animate-sds-ambient\"></span>\n <span class=\"absolute -top-10 right-[26%] h-40 w-40 rounded-full bg-brand-400/20 blur-3xl animate-sds-ambient [animation-delay:3s]\"></span>\n </span>\n }\n\n <!--\n The band is always full-bleed — the gradient and the wave span the viewport — while the\n CONTENTS are constrained by [contentWidth], so a bar over a centred page lines up with it\n instead of running to the edges. Empty (the default) leaves the contents full-bleed too,\n which is what a dashboard shell wants.\n -->\n <div\n class=\"relative mx-auto flex h-full items-center justify-between px-4 sm:px-6\"\n [class]=\"contentWidth()\"\n >\n <!-- Left: mobile menu button + logo + app name -->\n <div class=\"relative flex items-center gap-3\">\n @if (menuButton()) {\n <button\n type=\"button\"\n class=\"-ml-1 inline-flex h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:hidden\"\n [class]=\"menuButtonClasses()\"\n [attr.aria-label]=\"menuLabel()\"\n (click)=\"store.toggleMobile()\"\n >\n <sds-icon name=\"menu\" [size]=\"22\" />\n </button>\n }\n <ng-content select=\"[sdsLogo]\" />\n <!--\n The app name is hidden on phones (< sm) and shown from sm up: on a narrow bar carrying a logo,\n a search field and the account controls, the wordmark is what gives — the logo still answers\n \"which app\". shrink-0 + whitespace-nowrap keep it on one line at the widths where it does show.\n -->\n @if (appName()) {\n <span class=\"hidden h-7 w-px shrink-0 sm:block\" [class]=\"appearance() === 'brand' ? 'bg-white/30' : 'bg-border'\" [style.opacity]=\"appearance() === 'glass' ? 0.7 : null\"></span>\n <span class=\"hidden shrink-0 whitespace-nowrap text-xl font-bold tracking-tight sm:inline-block\">{{ appName() }}</span>\n }\n <ng-content select=\"[sdsLead]\" />\n </div>\n\n <!-- Flexible middle: takes the space the two ends leave, and is skipped entirely when empty. -->\n <div class=\"relative flex min-w-0 flex-1 items-center justify-center px-2\">\n <ng-content select=\"[sdsCenter]\" />\n </div>\n\n <!-- Right: whatever the app puts here -->\n <div class=\"relative flex items-center gap-3 sm:gap-4\">\n <ng-content select=\"[sdsActions]\" />\n </div>\n </div>\n </header>\n `,\n})\nexport class SdsTopbar {\n protected readonly store = inject(SidebarStore);\n\n readonly appName = input<string>('');\n\n /**\n * Width of the bar's CONTENTS, as Tailwind width utilities — e.g. `\"w-full max-w-7xl\"`.\n *\n * The coloured band always spans the viewport; this constrains only what sits on it, so the logo and\n * the actions line up with a page whose own content is centred at the same width. Default is empty,\n * i.e. contents run edge to edge, which is right for a full-bleed dashboard shell.\n *\n * A class string rather than an enum on purpose: apps already state their content width as a Tailwind\n * utility, and this way the bar is given the SAME string rather than a name that has to be kept in\n * sync with it.\n */\n readonly contentWidth = input<string>('w-full');\n /** Show the mobile hamburger that toggles the sidebar drawer (< lg). */\n readonly menuButton = input(true, { transform: booleanAttribute });\n\n /**\n * Accessible name for the hamburger. Defaults to French so nothing changes for existing consumers,\n * but any app serving more than one language MUST pass a translated value — an icon-only control's\n * aria-label is its only name, and a hardcoded one is simply wrong in every other locale.\n */\n readonly menuLabel = input<string>('Ouvrir le menu');\n\n /**\n * `brand` (default) paints the gradient and the wave; `surface` is white on a hairline border;\n * `glass` is a translucent, brand-tinted bar with a backdrop blur.\n */\n readonly appearance = input<SdsTopbarAppearance>('brand');\n\n /** Add slow-drifting brand-tinted blobs behind the bar (opt-in; pairs with `glass`/`surface`). */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly shellClasses = computed(() => {\n switch (this.appearance()) {\n case 'brand':\n return 'bg-linear-to-r from-brand-800 via-brand-700 to-brand-600 text-white';\n case 'glass':\n // Translucent so the blur shows the page tint through; the brand edge is read from the ramp.\n return 'border-b border-border bg-linear-to-r from-surface/85 via-surface/80 to-brand-100/70 text-ink backdrop-blur-xl';\n default:\n return 'border-b border-border bg-surface text-ink';\n }\n });\n\n protected readonly menuButtonClasses = computed(() =>\n this.appearance() === 'brand'\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40',\n );\n\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\nexport type SdsShellBackground = 'plain' | 'gradient';\n\n/**\n * App layout shell: a full-height column with the top bar across the top and a\n * row below holding the sidebar and the scrollable main content.\n *\n * The content area is `plain` (flat canvas) by default. Set `[background]=\"'gradient'\"` for the soft\n * brand-tinted wash that pairs with the glass top bar and the surface sidebar, and add `[decorations]`\n * for the slow drifting brand blobs behind the page. Both read the brand ramp, so they follow the active\n * theme and dark mode, and the decorations respect prefers-reduced-motion.\n *\n * Page overlays (drawers, dialogs) can be rendered anywhere in the page: `<main>` is not a stacking\n * context, so a `fixed` overlay with a z-index above the top bar's (z-30) covers the top bar too.\n *\n * @example\n * <sds-shell background=\"gradient\" decorations>\n * <sds-topbar appearance=\"glass\" sdsTopbar … />\n * <sds-sidebar appearance=\"surface\" sdsSidebar> … </sds-sidebar>\n * <!-- routed page content -->\n * <router-outlet />\n * </sds-shell>\n */\n@Component({\n selector: 'sds-shell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block' },\n template: `\n <div class=\"flex h-screen flex-col overflow-hidden\">\n <ng-content select=\"[sdsTopbar]\" />\n <div class=\"flex min-h-0 flex-1\">\n <ng-content select=\"[sdsSidebar]\" />\n <!--\n The content area carries the background and the ambient blobs; the scrolling <main> sits on top,\n transparent. <main> is positioned but never a stacking context (no isolate, no z-index): one would\n trap a page's own overlays — drawers, dialogs, fixed popovers — under the top bar (z-30) however\n high their z-index. Same pattern as the top bar and sidebar decorations: the blob layer comes first\n with no z-index, so the positioned <main> after it paints above it.\n -->\n <div class=\"relative flex min-w-0 flex-1\" [class]=\"areaClass()\">\n @if (decorations()) {\n <div class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <div class=\"absolute -left-32 top-10 h-96 w-96 rounded-full bg-brand-300/15 blur-3xl animate-sds-ambient\"></div>\n <div class=\"absolute -right-40 top-1/3 h-[28rem] w-[28rem] rounded-full bg-brand-400/12 blur-3xl animate-sds-ambient [animation-delay:4s]\"></div>\n <div class=\"absolute bottom-10 left-1/4 h-80 w-80 rounded-full bg-brand-200/20 blur-3xl animate-sds-ambient [animation-delay:7s]\"></div>\n </div>\n }\n <main class=\"relative min-w-0 flex-1 overflow-y-auto\">\n <ng-content />\n </main>\n </div>\n </div>\n </div>\n `,\n})\nexport class SdsShell {\n /** `plain` flat canvas (default) or a soft brand-tinted `gradient` wash. */\n readonly background = input<SdsShellBackground>('plain');\n\n /** Add slow-drifting brand-tinted blobs behind the page content (opt-in). They stay in place while the page scrolls. */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly areaClass = computed(() =>\n this.background() === 'gradient'\n ? 'bg-linear-to-br from-brand-50/50 via-canvas to-brand-100/40'\n : 'bg-canvas',\n );\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsSidebarAppearance, SidebarStore } from './sidebar-store';\n\n/**\n * Collapsible navigation rail. Project <sds-nav-group>/<sds-nav-item> as the\n * default content, and pin a footer (e.g. search + version badge) via the\n * [sdsFooter] slot. Collapse state is shared through SidebarStore.\n *\n * Two appearances. `brand` (default) is the dark brand rail. `surface` is a light rail with a faint\n * brand wash and brand-tinted active items — the counterpart to the glass top bar. The appearance is\n * published to SidebarStore so the projected nav items adopt the matching state colours from this one\n * input. `[decorations]` adds the same slow brand-tinted blobs the top bar and container use.\n *\n * Responsive: below `lg` it is a fixed off-canvas drawer opened by the top bar's hamburger; it is a\n * modal (scrim + trap), so while open Escape closes it, focus moves into it and is restored on close,\n * and Tab is kept inside. While closed it is `inert`, so its off-screen items are out of the tab order.\n * At `lg` and up it is the in-flow, collapsible rail.\n *\n * @example\n * <sds-sidebar appearance=\"surface\" decorations>\n * <sds-nav-group label=\"Membres\">\n * <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" link=\"/membres/new\" />\n * </sds-nav-group>\n * <div sdsFooter>…</div>\n * </sds-sidebar>\n */\n@Component({\n selector: 'sds-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'block h-full',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <!-- Mobile backdrop (only when the drawer is open, < lg) -->\n @if (mobileOpen()) {\n <div\n class=\"fixed inset-0 z-40 bg-black/50 lg:hidden\"\n (click)=\"store.closeMobile()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!--\n Mobile (< lg): fixed off-canvas drawer that slides in from the left, and is inert while closed so\n its off-screen controls leave the tab order. Desktop (>= lg): the in-flow collapsible icon-rail. It\n is lg:relative (not static) so the ambient blobs, which are absolutely positioned, anchor to it.\n -->\n <aside\n #drawer\n class=\"fixed inset-y-0 left-0 z-50 flex h-full w-[var(--sds-sidebar-w)] flex-col transition-transform duration-200 ease-out lg:relative lg:z-auto lg:w-[var(--sds-rail)] lg:translate-x-0 lg:transition-[width]\"\n [class]=\"asideClass()\"\n [style.--sds-rail]=\"railWidth()\"\n [inert]=\"belowLg() && !mobileOpen()\"\n [attr.role]=\"belowLg() && mobileOpen() ? 'dialog' : null\"\n [attr.aria-modal]=\"belowLg() && mobileOpen() ? 'true' : null\"\n (keydown)=\"onDrawerKeydown($event)\"\n >\n @if (decorations()) {\n <span class=\"pointer-events-none absolute inset-0 overflow-hidden\" aria-hidden=\"true\">\n <span class=\"absolute -top-16 -left-16 h-56 w-56 rounded-full bg-brand-300/20 blur-3xl animate-sds-ambient\"></span>\n <span class=\"absolute -bottom-24 -right-16 h-64 w-64 rounded-full bg-brand-400/15 blur-3xl animate-sds-ambient [animation-delay:4s]\"></span>\n </span>\n }\n\n <!-- Header: collapse toggle (desktop) / close (mobile) -->\n <div\n class=\"relative flex items-center px-3\"\n style=\"height: 52px\"\n [class]=\"collapsed() ? 'justify-end lg:justify-center' : 'justify-end'\"\n >\n <button\n type=\"button\"\n class=\"hidden h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:inline-flex\"\n [class]=\"railBtnClass()\"\n [attr.aria-label]=\"collapsed() ? expandLabel() : collapseLabel()\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"store.toggle()\"\n >\n <sds-icon\n [name]=\"collapsed() ? 'panel-left-open' : 'panel-left-close'\"\n [size]=\"20\"\n />\n </button>\n <button\n #closeBtn\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 lg:hidden\"\n [class]=\"railBtnClass()\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"store.closeMobile()\"\n >\n <sds-icon name=\"x\" [size]=\"20\" />\n </button>\n </div>\n\n <!-- Navigation -->\n <nav class=\"relative flex-1 overflow-y-auto overflow-x-hidden px-3 pb-4\">\n <ng-content />\n </nav>\n\n <!-- Footer (search, version, …) -->\n <div class=\"relative px-3 pb-4 pt-2\">\n <ng-content select=\"[sdsFooter]\" />\n </div>\n </aside>\n `,\n})\nexport class SdsSidebar {\n protected readonly store = inject(SidebarStore);\n private readonly document = inject(DOCUMENT);\n\n private readonly drawer = viewChild<ElementRef<HTMLElement>>('drawer');\n private readonly closeBtn = viewChild<ElementRef<HTMLButtonElement>>('closeBtn');\n\n /** True below the `lg` breakpoint — where the rail is the off-canvas modal drawer. */\n protected readonly belowLg = signal(false);\n /** The element focused before the drawer opened, restored to it on close. */\n private restoreFocusTo: HTMLElement | null = null;\n\n constructor() {\n // Publish the rail's paint so projected nav items match it.\n effect(() => this.store.appearance.set(this.appearance()));\n\n const view = this.document.defaultView;\n const mql = view?.matchMedia('(max-width: 1023.98px)');\n if (mql) {\n this.belowLg.set(mql.matches);\n mql.addEventListener('change', (e) => this.belowLg.set(e.matches));\n }\n\n // Modal focus handling for the mobile drawer: on open, remember what was focused (the hamburger) and\n // move focus to the close button; on close, restore it. A no-op at ≥ lg, where the rail is not modal.\n effect(() => {\n const open = this.mobileOpen();\n if (!this.belowLg()) return;\n if (open) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement | null;\n this.closeBtn()?.nativeElement.focus();\n } else if (this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n });\n }\n\n /**\n * Accessible names for the rail's three icon-only controls. French defaults keep existing consumers\n * unchanged; a multilingual app must pass translated values.\n */\n readonly collapseLabel = input<string>('Replier le menu');\n readonly expandLabel = input<string>('Déplier le menu');\n readonly closeLabel = input<string>('Fermer le menu');\n\n /** `brand` (default) is the dark rail; `surface` is a light rail with brand accents. */\n readonly appearance = input<SdsSidebarAppearance>('brand');\n\n /** Add slow-drifting brand-tinted blobs behind the rail (opt-in). */\n readonly decorations = input(false, { transform: booleanAttribute });\n\n protected readonly collapsed = this.store.collapsed;\n protected readonly mobileOpen = this.store.mobileOpen;\n\n protected readonly asideClass = computed(() => {\n // The rail must stay OPAQUE: as a mobile drawer it slides over page content, so a translucent stop\n // (e.g. to-brand-50/50) would let that content bleed through. All gradient stops are opaque; the\n // wash is a subtle surface->brand-50 tint, not a transparency.\n const paint =\n this.appearance() === 'surface'\n ? 'bg-surface bg-linear-to-b from-surface via-surface to-brand-50 text-ink border-r border-border'\n : 'bg-brand-900 text-white';\n const slide = this.mobileOpen() ? 'translate-x-0' : '-translate-x-full';\n return `${paint} ${slide}`;\n });\n\n /** The two header icon buttons, painted for the active rail. */\n protected readonly railBtnClass = computed(() =>\n this.appearance() === 'surface'\n ? 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40'\n : 'text-white/70 hover:bg-white/10 hover:text-white focus-visible:ring-white/40',\n );\n\n /** Desktop rail width (full vs. collapsed); mobile always uses full width. */\n protected readonly railWidth = computed(() =>\n this.collapsed()\n ? 'var(--sds-sidebar-w-collapsed)'\n : 'var(--sds-sidebar-w)',\n );\n\n protected onEscape(): void {\n if (this.mobileOpen()) this.store.closeMobile();\n }\n\n /** Keep Tab inside the open mobile drawer (a modal must not leak focus to the page behind the scrim). */\n protected onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || !this.mobileOpen() || !this.belowLg()) return;\n const focusables = this.focusableEls();\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private focusableEls(): HTMLElement[] {\n const root = this.drawer()?.nativeElement;\n if (!root) return [];\n const sel =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n return Array.from(root.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null || el === this.document.activeElement,\n );\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SidebarStore } from './sidebar-store';\n\n/**\n * Groups nav items under an optional uppercase section label.\n *\n * Two modes:\n * - **Section** (default) — a static label over its items. The label is replaced by a divider when\n * the rail is collapsed.\n * - **Collapsible** (`[collapsible]`) — the label becomes a button that expands and collapses the\n * group. Set `[basePath]` and the group opens itself whenever the active route is inside it, so a\n * deep link or a browser Back lands with the right section already open instead of the person\n * having to find and re-open it.\n *\n * Collapsible mode exists because a flat rail stops scaling somewhere around a dozen destinations,\n * and the alternative — showing every child of every section at once — buries the ones in use.\n *\n * On the collapsed desktop rail there is nowhere to put a header, so a collapsible group renders\n * exactly like a section: divider, children visible. Hiding them there would leave the rail with\n * unreachable destinations and no affordance to reveal them.\n */\n@Component({\n selector: 'sds-nav-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: { class: 'block' },\n template: `\n <div class=\"mt-5 first:mt-3\">\n @if (label()) {\n @if (collapsible()) {\n <!--\n A collapsible header is styled as a NAV ROW, not as a section caption. A small uppercase\n caption says \"everything under me belongs to me\" — which is a lie the moment the group is\n collapsed and the next section's items sit directly beneath it. At row scale, with an icon\n and a chevron, it reads as the control it is.\n\n It renders on the collapsed rail too, as an icon alone, because there it is the group's\n ONLY representation: the children are hidden (a child with no icon of its own would be a\n blank row), so the app is expected to treat the toggle as \"take me into this section\" —\n which is what expandedChange already means.\n -->\n <button\n type=\"button\"\n [class]=\"headerClass()\"\n [attr.aria-expanded]=\"collapsed() ? null : expanded()\"\n [attr.title]=\"collapsed() ? label() : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"20\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate text-left\" [class.lg:hidden]=\"collapsed()\">\n {{ label() }}\n </span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n [class]=\"chevronClass()\"\n [class.lg:hidden]=\"collapsed()\"\n [class.rotate-180]=\"expanded()\"\n />\n </button>\n } @else if (collapsed()) {\n <div [class]=\"dividerClass()\"></div>\n } @else {\n <p [class]=\"captionClass()\">\n {{ label() }}\n </p>\n }\n }\n\n <div [class]=\"childrenClass()\">\n <ng-content />\n </div>\n </div>\n `,\n})\nexport class SdsNavGroup {\n private readonly store = inject(SidebarStore);\n private readonly router = inject(Router);\n\n readonly label = input<string>('');\n\n /** Turn the label into an expand/collapse control. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n\n /** Icon for a collapsible header, so it reads at the same weight as the items it sits among. */\n readonly icon = input<SdsIconName | null>(null);\n\n /**\n * URL prefix owned by this group, e.g. `/payments`. While the active route starts with it the\n * group counts as active and opens itself — unless the person has explicitly toggled it since.\n */\n readonly basePath = input<string | null>(null);\n\n /** Emits the new state on every manual toggle. Not emitted for route-driven auto-expansion. */\n readonly expandedChange = output<boolean>();\n\n /** Explicit user choice; null means \"follow the route\". */\n private readonly manual = signal<boolean | null>(null);\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map((e) => e.urlAfterRedirects),\n ),\n { initialValue: this.router.url },\n );\n\n /**\n * True while the active route lives inside this group. Matches on segment boundaries, not a raw string\n * prefix, so `/users/42` does NOT activate a group whose basePath is `/user` (query/hash are stripped\n * first).\n */\n protected readonly routeActive = computed(() => {\n const base = this.basePath();\n if (!base) return false;\n const path = this.url().split(/[?#]/)[0];\n return path === base || path.startsWith(base + '/');\n });\n\n protected readonly expanded = computed(() => this.manual() ?? this.routeActive());\n\n protected readonly collapsed = this.store.collapsed;\n\n /** Rail paint, shared via the store — see SidebarStore.appearance. Drives the header/caption tones. */\n private readonly surface = computed(() => this.store.appearance() === 'surface');\n\n /** Collapsible header, painted for the active rail (ink+brand on `surface`, white on `brand`). */\n protected readonly headerClass = computed(() => {\n const s = this.surface();\n const base =\n 'mb-1 flex h-10 w-full items-center gap-3 rounded-control px-3 text-sm font-medium ' +\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 ' +\n (this.collapsed() ? 'lg:justify-center ' : '') +\n (s\n ? 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40'\n : 'text-white/70 hover:bg-white/8 hover:text-white focus-visible:ring-white/40');\n // text-ink (not brand-700) stays readable in dark, where the grayscale brand-700 is near-black.\n const active = this.routeActive() ? (s ? ' text-ink' : ' text-white') : '';\n return base + active;\n });\n\n protected readonly chevronClass = computed(\n () => 'shrink-0 transition-transform ' + (this.surface() ? 'text-ink-faint' : 'text-white/50'),\n );\n\n protected readonly dividerClass = computed(\n () => 'mx-3 mb-2 mt-2 h-px ' + (this.surface() ? 'bg-border' : 'bg-white/10'),\n );\n\n protected readonly captionClass = computed(\n () =>\n 'mb-1.5 px-3 text-[11px] font-semibold uppercase tracking-wider ' +\n (this.surface() ? 'text-ink-faint' : 'text-white/60'),\n );\n\n /**\n * A plain section always shows its items — they carry their own icons, so they survive the collapsed\n * rail. A collapsible group hides its children there instead: its children are sub-destinations and\n * typically have no icon, which on an icon-only rail is a row with nothing in it.\n */\n protected readonly childrenVisible = computed(\n () => !this.collapsible() || (!this.collapsed() && this.expanded()),\n );\n\n /**\n * One binding rather than `[class]` alongside `[class.hidden]` — mixing a whole-list binding with a\n * single-class toggle on the same element depends on Angular's styling precedence to resolve, which\n * is a subtlety no template should rest on.\n *\n * The indent rule appears only on an expanded collapsible group on the full-width rail: it is what\n * shows the children belong to the header above them.\n */\n protected readonly childrenClass = computed(() => {\n const parts = ['flex flex-col gap-1'];\n if (!this.childrenVisible()) {\n parts.push('hidden');\n }\n if (this.collapsible() && !this.collapsed()) {\n parts.push(this.surface() ? 'ml-5 border-l border-border pl-3' : 'ml-5 border-l border-white/10 pl-3');\n }\n return parts.join(' ');\n });\n\n /**\n * On the collapsed rail there is nothing to expand into, so the toggle always reports \"opening\" —\n * the app's handler takes that as the cue to navigate into the section, which is the only useful\n * meaning the control can have there.\n */\n protected toggle(): void {\n const next = this.collapsed() ? true : !this.expanded();\n this.manual.set(next);\n this.expandedChange.emit(next);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\nimport { SidebarStore } from './sidebar-store';\n\nexport type SdsNavItemBadgeTone = 'brand' | 'danger' | 'neutral';\n\n/**\n * A single sidebar navigation entry. Renders an anchor when [link] is set\n * (with automatic active state via routerLinkActive) or a button otherwise.\n *\n * Requires the host application to provide the Angular Router (`provideRouter`),\n * as it depends on RouterLink/RouterLinkActive even when used as a button.\n *\n * @example\n * <sds-nav-item icon=\"home\" label=\"Accueil\" link=\"/\" [exact]=\"true\" />\n * <sds-nav-item icon=\"book-open\" label=\"Menu\" link=\"/menu\" [badge]=\"3\" badgeLabel=\"{count} issues\" badgeTone=\"danger\" />\n */\n@Component({\n selector: 'sds-nav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, SdsIcon],\n host: { class: 'block' },\n template: `\n @if (link() !== null) {\n <a\n [routerLink]=\"link()\"\n routerLinkActive\n #rla=\"routerLinkActive\"\n [routerLinkActiveOptions]=\"{ exact: exact() }\"\n [class]=\"itemClass(rla.isActive || active())\"\n [attr.title]=\"collapsed() ? collapsedName() : null\"\n [attr.aria-label]=\"collapsed() ? collapsedName() : null\"\n [attr.aria-current]=\"rla.isActive || active() ? 'page' : null\"\n (click)=\"store.closeMobile()\"\n >\n @if (rla.isActive || active()) {\n <span [class]=\"accentBarClass()\" aria-hidden=\"true\"></span>\n }\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <button\n type=\"button\"\n [class]=\"itemClass(active())\"\n [attr.title]=\"collapsed() ? collapsedName() : null\"\n [attr.aria-label]=\"collapsed() ? collapsedName() : null\"\n [attr.aria-current]=\"active() ? 'page' : null\"\n (click)=\"select.emit(); store.closeMobile()\"\n >\n @if (active()) {\n <span [class]=\"accentBarClass()\" aria-hidden=\"true\"></span>\n }\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n }\n\n <ng-template #content>\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"20\" class=\"shrink-0\" />\n }\n <!-- Label is hidden only on the collapsed desktop rail; always shown in the mobile drawer. -->\n <span class=\"truncate\" [class]=\"collapsed() ? 'lg:hidden' : ''\">{{ label() }}</span>\n @if (badgeText(); as text) {\n <!-- The number is drawn; the words are what is spoken (\"Menu, 3 pending\"). On the collapsed\n desktop rail it becomes a small corner pill on the icon. -->\n <span [class]=\"badgeClass()\" aria-hidden=\"true\">{{ badgeDisplay() }}</span>\n <span class=\"sr-only\">, {{ text }}</span>\n }\n </ng-template>\n `,\n})\nexport class SdsNavItem {\n protected readonly store = inject(SidebarStore);\n\n readonly icon = input<SdsIconName | null>(null);\n readonly label = input.required<string>();\n /** Router link target; when null, the item behaves as a button. */\n readonly link = input<string | unknown[] | null>(null);\n readonly exact = input(false, { transform: booleanAttribute });\n /** Manual active state (combined with routerLinkActive when a link is set). */\n readonly active = input(false, { transform: booleanAttribute });\n\n /**\n * Optional count shown as a pill after the label (e.g. menu issues to fix). Hidden when null or 0.\n * On the collapsed rail it sits on the icon's corner.\n */\n readonly badge = input<number | null>(null);\n /** Spoken text for the badge; `{count}` is replaced. Pass a translated string. */\n readonly badgeLabel = input<string>('{count} pending');\n /** Counts above this read as \"max+\" (e.g. 99+). */\n readonly badgeMax = input<number>(99);\n /** Badge colour. `danger` for things that block, `brand` (default) for a neutral count. */\n readonly badgeTone = input<SdsNavItemBadgeTone>('brand');\n\n readonly select = output<void>();\n\n protected readonly collapsed = this.store.collapsed;\n\n /** The badge's spoken text, or null when there is nothing to show. */\n protected readonly badgeText = computed(() => {\n const n = this.badge();\n if (n === null || n === undefined || !Number.isFinite(n) || n <= 0) return null;\n return this.badgeLabel().replace('{count}', String(n));\n });\n\n protected readonly badgeDisplay = computed(() => {\n const n = this.badge() ?? 0;\n return n > this.badgeMax() ? `${this.badgeMax()}+` : String(n);\n });\n\n /** Accessible name on the collapsed rail, where the visible label is hidden. */\n protected readonly collapsedName = computed(() => {\n const text = this.badgeText();\n return text ? `${this.label()}, ${text}` : this.label();\n });\n\n protected readonly badgeClass = computed(() => {\n const tone =\n this.badgeTone() === 'danger'\n ? 'bg-danger text-white'\n : this.badgeTone() === 'neutral'\n ? 'bg-muted text-ink-soft border border-border'\n : this.store.appearance() === 'surface'\n ? 'bg-brand-600 text-white dark:bg-ink dark:text-surface'\n : 'bg-white text-brand-800';\n const base =\n 'ml-auto inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full px-1.5 ' +\n 'text-[11px] font-bold tabular-nums leading-none';\n // Collapsed desktop rail: a small pill pinned to the top-right of the centred icon.\n const collapsed = this.collapsed()\n ? ' lg:absolute lg:right-1.5 lg:top-0.5 lg:ml-0 lg:h-4 lg:min-w-4 lg:px-1 lg:text-[10px]' +\n (this.store.appearance() === 'surface' ? ' lg:ring-2 lg:ring-surface' : '')\n : '';\n return `${base} ${tone}${collapsed}`;\n });\n\n protected itemClass(isActive: boolean): string {\n // A `surface` rail is light: an active item is a brand-tinted pill with a left accent bar, brand\n // text and a soft shadow (matching the certicheck reference); inactive is muted ink that lifts on\n // hover. A `brand` rail is dark, so an active item is a solid brand-500 pill in white. Read from the\n // shared store so the whole rail switches from one input on <sds-sidebar>.\n const surface = this.store.appearance() === 'surface';\n const base =\n 'group relative flex w-full items-center gap-3 rounded-control px-3 text-sm font-medium ' +\n 'transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 ' +\n (surface ? 'focus-visible:ring-brand-500/40 ' : 'focus-visible:ring-white/40 ') +\n (this.collapsed() ? 'h-10 lg:justify-center' : 'h-10');\n const state = isActive\n ? surface\n ? 'bg-linear-to-r from-brand-500/15 to-brand-500/5 text-ink shadow-sm'\n : 'bg-brand-500 text-white shadow-sm'\n : surface\n ? 'text-ink-soft hover:bg-brand-500/8 hover:text-ink'\n : 'text-white/70 hover:bg-white/8 hover:text-white';\n return `${base} ${state}`;\n }\n\n /**\n * The left accent bar on an active item — the strongest \"selected\" cue, and the one that survives a\n * grayscale brand where a tinted pill alone is nearly invisible. brand-600 on the light rail, white on\n * the dark one; on a coloured brand it is the brand colour, matching the certicheck accent bar.\n */\n protected readonly accentBarClass = computed(\n () =>\n 'pointer-events-none absolute left-1 top-1/2 h-5 w-1 -translate-y-1/2 rounded-full ' +\n (this.store.appearance() === 'surface' ? 'bg-brand-500' : 'bg-white'),\n );\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsAvatar, SdsAvatarStatus } from '../avatar/sds-avatar';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsUserMenuAppearance = 'surface' | 'on-brand';\nexport type SdsUserMenuAlign = 'start' | 'end';\n\n/**\n * The signed-in user's trigger and dropdown for the top bar: an avatar (with the name and email beside\n * it on wider screens) that opens a panel with a gradient header and whatever menu rows the app projects\n * — profile, settings, sign out. The library deliberately owns no fixed set of actions, because what\n * belongs here differs per app; project <sds-menu-item> (or any markup) into the default slot.\n *\n * It manages its own open state, closes on outside click, on Escape, and whenever a menu row is\n * activated, restoring focus to the trigger. Two appearances so the trigger sits correctly on either\n * bar: `surface` (default) for a light / glass bar, `on-brand` for the dark brand bar — the same default\n * as its top-bar siblings sds-theme-toggle and sds-search-command.\n *\n * It is a disclosure (aria-haspopup + aria-expanded on the trigger), not an ARIA menu widget: the rows\n * are ordinary links/buttons the app projects, navigated with Tab like any popover.\n *\n * @example\n * <sds-user-menu name=\"Souhail AIT SAID\" email=\"souhail@example.com\" status=\"online\" appearance=\"surface\">\n * <sds-menu-item icon=\"user\" label=\"Profil\" link=\"/profile\" />\n * <sds-menu-item icon=\"settings\" label=\"Paramètres\" link=\"/settings\" />\n * <sds-menu-item icon=\"log-out\" label=\"Se déconnecter\" tone=\"danger\" (select)=\"signOut()\" />\n * </sds-user-menu>\n */\n@Component({\n selector: 'sds-user-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsAvatar, SdsIcon],\n host: {\n class: 'relative inline-block',\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"flex items-center gap-2.5 rounded-control py-1.5 pl-1.5 pr-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"triggerClass()\"\n [attr.aria-label]=\"menuLabel()\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <sds-avatar\n [name]=\"name()\"\n [initials]=\"initials()\"\n [src]=\"src()\"\n [status]=\"status()\"\n [size]=\"avatarSize()\"\n [bgClass]=\"resolvedAvatarBg()\"\n />\n @if (showDetails()) {\n <span class=\"hidden min-w-0 flex-col items-start text-left leading-tight sm:flex\">\n <span class=\"max-w-40 truncate text-sm font-semibold\" [class]=\"nameClass()\">{{ name() }}</span>\n @if (email()) {\n <span class=\"max-w-40 truncate text-xs\" [class]=\"emailClass()\">{{ email() }}</span>\n }\n </span>\n }\n <sds-icon\n name=\"chevron-down\"\n [size]=\"16\"\n class=\"hidden shrink-0 transition-transform sm:block\"\n [class]=\"chevronClass()\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n @if (open()) {\n <div\n class=\"absolute top-full z-50 mt-2 w-64 overflow-hidden rounded-card border border-border bg-surface shadow-xl animate-sds-menu\"\n [class]=\"align() === 'end' ? 'right-0' : 'left-0'\"\n (click)=\"onPanelClick($event)\"\n >\n <!-- Header: identity, on a soft brand wash. -->\n <div class=\"flex items-center gap-3 border-b border-border bg-linear-to-br from-brand-50 via-surface to-brand-100/40 p-4\">\n <sds-avatar\n [name]=\"name()\"\n [initials]=\"initials()\"\n [src]=\"src()\"\n [size]=\"44\"\n [bgClass]=\"headerAvatarBg()\"\n />\n <div class=\"min-w-0\">\n <p class=\"truncate text-sm font-semibold text-ink\">{{ name() }}</p>\n @if (email()) {\n <p class=\"mt-0.5 truncate text-xs text-ink-faint\">{{ email() }}</p>\n }\n </div>\n </div>\n\n <!-- Actions projected by the app. -->\n <div class=\"py-1.5\">\n <ng-content />\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-menu {\n animation: sds-menu-in 0.14s ease-out;\n }\n @keyframes sds-menu-in {\n from {\n opacity: 0;\n transform: translateY(-6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-menu {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsUserMenu {\n private readonly el = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n readonly name = input<string>('');\n readonly email = input<string>('');\n readonly initials = input<string>('');\n readonly src = input<string | null>(null);\n readonly status = input<SdsAvatarStatus | null>(null);\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsUserMenuAppearance>('surface');\n\n /** Which edge the panel aligns to. `end` (default) hangs the panel from the right of the trigger. */\n readonly align = input<SdsUserMenuAlign>('end');\n\n /** Show the name/email beside the avatar (≥ sm). Turn off for an avatar-only trigger. */\n readonly showDetails = input(true, { transform: booleanAttribute });\n\n /** Trigger avatar box size in px. */\n readonly avatarSize = input<number>(36);\n\n /** Override the trigger avatar's initials background; defaults per appearance. */\n readonly avatarBgClass = input<string | null>(null);\n\n /** Accessible name for the trigger (icon/avatar only when details are hidden). */\n readonly menuLabel = input<string>('Menu du compte');\n\n readonly openChange = output<boolean>();\n\n protected readonly open = signal(false);\n\n protected toggle(): void {\n this.open.update((v) => !v);\n this.openChange.emit(this.open());\n }\n\n protected close(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.openChange.emit(false);\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (this.open() && !this.el.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected onEscape(): void {\n if (!this.open()) return;\n this.close();\n // Keyboard dismissal returns focus to the trigger (a click-away deliberately does not).\n this.trigger()?.nativeElement.focus();\n }\n\n /** Close when any actionable row (link or button) inside the panel is activated. */\n protected onPanelClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).closest('a,button')) {\n this.close();\n this.trigger()?.nativeElement.focus();\n }\n }\n\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly resolvedAvatarBg = computed(\n () => this.avatarBgClass() ?? (this.onBrand() ? 'bg-white/15' : 'bg-brand-500'),\n );\n protected readonly headerAvatarBg = computed(() => 'bg-brand-500');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'hover:bg-white/10 focus-visible:ring-white/40'\n : 'hover:bg-muted focus-visible:ring-brand-500/40',\n );\n protected readonly nameClass = computed(() => (this.onBrand() ? 'text-white' : 'text-ink'));\n protected readonly emailClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n protected readonly chevronClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\nexport type SdsMenuItemTone = 'default' | 'danger';\n\n/**\n * A single row inside a menu surface (the {@link SdsUserMenu} dropdown, or any custom popover). Renders,\n * in order of precedence: a plain anchor when [href] is set (an EXTERNAL or cross-origin URL), a\n * Router anchor when [link] is set (an in-app route), or a button otherwise. It always emits\n * {@link select} on activation. The parent menu closes itself when an item is activated, so an item\n * never has to reach back into the menu.\n *\n * `tone=\"danger\"` paints a destructive action (sign out, delete). Trailing content (a shortcut hint, a\n * count) projects into the default slot after the label.\n *\n * @example\n * <sds-menu-item icon=\"user\" label=\"Profil\" link=\"/profile\" /> <!-- in-app route -->\n * <sds-menu-item icon=\"external-link\" label=\"Site public\" href=\"https://…\" target=\"_blank\" />\n * <sds-menu-item icon=\"log-out\" label=\"Se déconnecter\" tone=\"danger\" (select)=\"signOut()\" />\n */\n@Component({\n selector: 'sds-menu-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterLink, SdsIcon],\n host: { class: 'block' },\n template: `\n @if (href() !== null) {\n <a\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"resolvedRel()\"\n [class]=\"rowClass()\"\n (click)=\"select.emit()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else if (link() !== null) {\n <a [routerLink]=\"link()\" [class]=\"rowClass()\" (click)=\"select.emit()\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n } @else {\n <button type=\"button\" [class]=\"rowClass()\" [disabled]=\"disabled()\" (click)=\"select.emit()\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n }\n\n <ng-template #content>\n @if (icon()) {\n <sds-icon [name]=\"icon()!\" [size]=\"18\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate text-left\">{{ label() }}</span>\n <ng-content />\n </ng-template>\n `,\n})\nexport class SdsMenuItem {\n readonly icon = input<SdsIconName | null>(null);\n readonly label = input.required<string>();\n /** Router link target for an in-app route; when null (default) the item is not a Router link. */\n readonly link = input<string | unknown[] | null>(null);\n /**\n * External / cross-origin URL. When set, the item renders a plain `<a [href]>` (NOT a Router link),\n * so it works for another app's origin. Takes precedence over {@link link}.\n */\n readonly href = input<string | null>(null);\n /** Anchor target for {@link href}, e.g. `_blank` to open the destination in a new tab. */\n readonly target = input<string | null>(null);\n /**\n * `rel` for {@link href}. Defaults to `noopener noreferrer` when {@link target} is `_blank` (the safe\n * default for a new-tab external link); pass a value to override, or `''` to clear it.\n */\n readonly rel = input<string | null>(null);\n readonly tone = input<SdsMenuItemTone>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n readonly select = output<void>();\n\n /** `noopener noreferrer` is forced for a `_blank` external link unless the consumer set `rel` explicitly. */\n protected readonly resolvedRel = computed(() =>\n this.rel() !== null ? this.rel() : this.target() === '_blank' ? 'noopener noreferrer' : null,\n );\n\n protected readonly rowClass = computed(() => {\n const base =\n 'flex w-full items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset ' +\n 'disabled:opacity-50 disabled:pointer-events-none';\n const tone =\n this.tone() === 'danger'\n ? 'text-danger hover:bg-danger/10 focus-visible:ring-danger/40'\n : 'text-ink-soft hover:bg-muted hover:text-ink focus-visible:ring-brand-500/40';\n return `${base} ${tone}`;\n });\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\nimport { SdsIconName } from '../icon/icon-registry';\n\n/** One searchable entry. `group` buckets it under a heading; `keywords` widen what the filter matches. */\nexport interface SdsSearchItem {\n /** Stable identity, also used to build the option's DOM id. */\n id: string;\n label: string;\n icon?: SdsIconName;\n /** Optional section heading; items sharing a group render together. */\n group?: string;\n /** Extra terms the filter should match beyond the label (synonyms, a route, an acronym). */\n keywords?: string;\n disabled?: boolean;\n}\n\nexport type SdsSearchAppearance = 'surface' | 'on-brand';\n\ninterface Section {\n label: string;\n items: SdsSearchItem[];\n}\n\nconst norm = (s: string): string =>\n s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/**\n * A command-palette search: a trigger pill (search icon, placeholder, a ⌘K hint) that opens a modal with\n * a search field, grouped results and keyboard navigation. It is data-driven — the app passes `[items]`\n * and handles `(select)` — so the library stays router-agnostic; ⌘K / Ctrl-K opens it from anywhere.\n *\n * When the field is empty the items show as quick navigation; typing filters by label and keywords\n * (accent-insensitive). Arrow keys move the highlight, Enter selects, Escape closes. Hide the built-in\n * pill with `[showTrigger]=\"false\"` and drive it from your own control via a template ref: `cmd.open()`.\n *\n * @example\n * <sds-search-command\n * #cmd\n * appearance=\"surface\"\n * [items]=\"navItems\"\n * (select)=\"router.navigateByUrl($event.id)\"\n * />\n */\n@Component({\n selector: 'sds-search-command',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'block',\n '(document:keydown)': 'onGlobalKeydown($event)',\n },\n template: `\n @if (showTrigger()) {\n <!--\n Responsive trigger: a 40px icon-only button on phones (< sm), the full pill (placeholder + ⌘K\n hint, with a minimum width so it does not collapse in a flexible slot) from sm up. The min-width\n is carried in a CSS var so it can be applied at sm+ only, never squeezing the mobile square.\n -->\n <button\n type=\"button\"\n class=\"flex h-10 w-10 items-center justify-center rounded-control transition-colors focus-visible:outline-none focus-visible:ring-2 sm:w-auto sm:justify-between sm:gap-2 sm:px-3 sm:min-w-[var(--sds-search-minw)]\"\n [class]=\"triggerClass()\"\n [style.--sds-search-minw]=\"triggerMinWidth() + 'px'\"\n [attr.aria-label]=\"searchLabel()\"\n (click)=\"open()\"\n >\n <span class=\"flex min-w-0 items-center gap-2\" [class]=\"triggerTextClass()\">\n <sds-icon name=\"search\" [size]=\"16\" class=\"shrink-0\" />\n <span class=\"hidden truncate text-sm sm:inline\">{{ placeholder() }}</span>\n </span>\n <kbd class=\"hidden shrink-0 rounded border px-1.5 py-0.5 text-[11px] font-semibold sm:inline-block\" [class]=\"kbdClass()\">{{ hotkeyLabel() }}</kbd>\n </button>\n }\n\n @if (isOpen()) {\n <div #overlay class=\"fixed inset-0 z-[100] flex items-start justify-center p-4 pt-[12vh]\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-black/40 backdrop-blur-sm\" (click)=\"close()\" aria-hidden=\"true\"></div>\n\n <!-- Panel -->\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"searchLabel()\"\n class=\"relative flex w-full max-w-xl flex-col overflow-hidden rounded-card border border-border bg-surface shadow-2xl animate-sds-cmd\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n <!-- Search field -->\n <div class=\"flex items-center gap-3 border-b border-border px-4 py-3.5\">\n <sds-icon name=\"search\" [size]=\"20\" class=\"shrink-0 text-ink-faint\" />\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-controls=\"sds-cmd-list\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-label]=\"searchLabel()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n class=\"min-w-0 flex-1 bg-transparent text-base text-ink outline-none placeholder:text-ink-faint\"\n />\n @if (query()) {\n <button\n type=\"button\"\n class=\"rounded p-1 text-ink-faint transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500/40\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear()\"\n >\n <sds-icon name=\"x\" [size]=\"18\" />\n </button>\n }\n <kbd class=\"hidden shrink-0 rounded bg-muted px-2 py-1 text-[11px] font-semibold text-ink-faint sm:inline-block\">ESC</kbd>\n </div>\n\n <!-- Results -->\n <div id=\"sds-cmd-list\" #list role=\"listbox\" [attr.aria-label]=\"searchLabel()\" class=\"max-h-[min(60vh,420px)] overflow-y-auto p-2\">\n @if (sections().length) {\n @for (section of sections(); track section.label) {\n @if (section.label) {\n <p class=\"px-3 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-wider text-ink-faint\">{{ section.label }}</p>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n role=\"option\"\n [id]=\"optionId(item)\"\n [attr.aria-selected]=\"activeId() === optionId(item)\"\n [disabled]=\"item.disabled\"\n class=\"flex w-full items-center gap-3 rounded-control px-3 py-2.5 text-left text-sm font-medium transition-colors focus-visible:outline-none disabled:opacity-50\"\n [class]=\"activeId() === optionId(item) ? 'bg-brand-500/15 text-ink' : 'text-ink-soft hover:bg-muted hover:text-ink'\"\n (click)=\"choose(item)\"\n (mousemove)=\"setActiveById(optionId(item))\"\n >\n @if (item.icon) {\n <sds-icon [name]=\"item.icon\" [size]=\"18\" class=\"shrink-0\" />\n }\n <span class=\"flex-1 truncate\">{{ item.label }}</span>\n </button>\n }\n }\n } @else {\n <div class=\"px-6 py-10 text-center\">\n <sds-icon name=\"search-x\" [size]=\"40\" class=\"mx-auto mb-3 text-ink-faint\" />\n <p class=\"text-sm text-ink-soft\">{{ emptyLabel() }}</p>\n </div>\n }\n </div>\n\n <!-- Footer hints -->\n <div class=\"flex items-center justify-center gap-4 border-t border-border bg-muted px-3 py-2.5 text-xs text-ink-faint\">\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">↵</kbd> {{ selectHint() }}</span>\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">↑↓</kbd> {{ navigateHint() }}</span>\n <span class=\"flex items-center gap-1.5\"><kbd class=\"rounded bg-surface px-1.5 py-0.5\">ESC</kbd> {{ closeHint() }}</span>\n </div>\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-cmd {\n animation: sds-cmd-in 0.16s ease-out;\n }\n @keyframes sds-cmd-in {\n from {\n opacity: 0;\n transform: translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-cmd {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsSearchCommand {\n private readonly document = inject(DOCUMENT);\n private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly overlay = viewChild<ElementRef<HTMLElement>>('overlay');\n\n /** The searchable entries. Order is preserved; when the field is empty they show as quick navigation. */\n readonly items = input<SdsSearchItem[]>([]);\n\n /** Placeholder on the trigger pill and the search field. */\n readonly placeholder = input<string>('Rechercher…');\n\n /** Show the built-in trigger pill. Turn off to drive the palette from your own control (`cmd.open()`). */\n readonly showTrigger = input(true, { transform: booleanAttribute });\n\n /** Enable the global ⌘K / Ctrl-K shortcut. */\n readonly hotkey = input(true, { transform: booleanAttribute });\n\n /** Trigger pill minimum width in px, so it does not collapse in a flexible top-bar slot. */\n readonly triggerMinWidth = input<number>(220);\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsSearchAppearance>('surface');\n\n /**\n * User-facing copy. French defaults; a multilingual app passes translated values (the trigger and the\n * field share `placeholder`, and `searchLabel` is the accessible name for both).\n */\n readonly searchLabel = input<string>('Rechercher');\n readonly clearLabel = input<string>('Effacer');\n readonly emptyLabel = input<string>('Aucun résultat');\n readonly selectHint = input<string>('Sélectionner');\n readonly navigateHint = input<string>('Naviguer');\n readonly closeHint = input<string>('Fermer');\n\n readonly select = output<SdsSearchItem>();\n readonly openChange = output<boolean>();\n\n protected readonly isOpen = signal(false);\n protected readonly query = signal('');\n /** DOM id of the highlighted option, or null. Kept as the id (not an index) so the list can regroup. */\n protected readonly activeId = signal<string | null>(null);\n /** The element focused before the palette opened, restored to it on close (WAI-ARIA dialog pattern). */\n private restoreFocusTo: HTMLElement | null = null;\n\n constructor() {\n // On open: move the overlay to <body> so it escapes any ancestor that is a containing block for\n // fixed positioning (a `backdrop-filter` on the glass top bar is exactly such an ancestor), then\n // focus the field and lock background scroll. Angular still owns the moved node — its bindings and\n // listeners keep working, and @if removes it on close.\n effect(() => {\n const open = this.isOpen();\n const overlay = this.overlay();\n const input = this.searchInput();\n this.document.body.style.overflow = open ? 'hidden' : '';\n if (open && overlay) this.document.body.appendChild(overlay.nativeElement);\n if (open && input) input.nativeElement.focus();\n });\n\n // Keep a valid highlight as the results change: default to the first option; drop it if empty.\n // activeId is read untracked so writing it here does not retrigger this effect.\n effect(() => {\n const flat = this.flat();\n const current = untracked(this.activeId);\n if (!flat.length) {\n if (current !== null) this.activeId.set(null);\n return;\n }\n if (!current || !flat.some((i) => this.optionId(i) === current)) {\n this.activeId.set(this.optionId(flat[0]));\n }\n });\n\n // A palette destroyed while open must not leave the page unscrollable.\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n });\n }\n\n // --- public control (also reachable via a template ref) ---\n open(): void {\n if (this.isOpen()) return;\n // Remember what was focused (the trigger pill, or wherever ⌘K was pressed) to restore on close.\n this.restoreFocusTo = this.document.activeElement as HTMLElement | null;\n this.isOpen.set(true);\n this.openChange.emit(true);\n }\n\n close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.query.set('');\n this.openChange.emit(false);\n // Return focus to the invoker so keyboard/AT users are not dropped onto <body>.\n this.restoreFocusTo?.focus();\n this.restoreFocusTo = null;\n }\n\n toggle(): void {\n this.isOpen() ? this.close() : this.open();\n }\n\n // --- filtering ---\n private readonly filtered = computed(() => {\n const q = norm(this.query().trim());\n if (!q) return this.items();\n return this.items().filter((i) => norm(`${i.label} ${i.keywords ?? ''}`).includes(q));\n });\n\n protected readonly sections = computed<Section[]>(() => {\n const list = this.filtered();\n if (!list.length) return [];\n const anyGroup = list.some((i) => i.group);\n if (!anyGroup) {\n return [{ label: '', items: list }];\n }\n const order: string[] = [];\n const map = new Map<string, SdsSearchItem[]>();\n for (const item of list) {\n const g = item.group ?? '';\n if (!map.has(g)) {\n map.set(g, []);\n order.push(g);\n }\n map.get(g)!.push(item);\n }\n return order.map((label) => ({ label, items: map.get(label)! }));\n });\n\n private readonly flat = computed(() => this.sections().flatMap((s) => s.items.filter((i) => !i.disabled)));\n\n // --- interaction ---\n protected optionId(item: SdsSearchItem): string {\n return `sds-cmd-opt-${item.id}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n }\n\n protected clear(): void {\n this.query.set('');\n this.searchInput()?.nativeElement.focus();\n }\n\n protected setActiveById(id: string): void {\n this.activeId.set(id);\n }\n\n protected choose(item: SdsSearchItem): void {\n if (item.disabled) return;\n this.select.emit(item);\n this.close();\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.close();\n return;\n case 'ArrowDown':\n event.preventDefault();\n this.move(1);\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.move(-1);\n return;\n case 'Enter': {\n event.preventDefault();\n const current = this.flat().find((i) => this.optionId(i) === this.activeId());\n if (current) this.choose(current);\n return;\n }\n case 'Tab':\n // Keep focus inside the modal (aria-modal must not leak focus to the page behind the backdrop).\n this.trapTab(event);\n return;\n }\n }\n\n protected onGlobalKeydown(event: KeyboardEvent): void {\n if (this.hotkey() && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n this.toggle();\n return;\n }\n // Fallback: close on Escape even if focus somehow left the panel.\n if (this.isOpen() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n private trapTab(event: KeyboardEvent): void {\n const root = this.overlay()?.nativeElement;\n if (!root) return;\n const sel =\n 'a[href],button:not([disabled]),input:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n const focusables = Array.from(root.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null || el === this.document.activeElement,\n );\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.document.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n private move(delta: number): void {\n const flat = this.flat();\n if (!flat.length) return;\n const currentIndex = flat.findIndex((i) => this.optionId(i) === this.activeId());\n const next = Math.min(flat.length - 1, Math.max(0, (currentIndex < 0 ? 0 : currentIndex) + delta));\n const id = this.optionId(flat[next]);\n this.activeId.set(id);\n // Positions are static, so scrolling the element into view needs no rendered highlight.\n this.document.getElementById(id)?.scrollIntoView({ block: 'nearest' });\n }\n\n // --- trigger appearance ---\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'bg-white/10 hover:bg-white/15 focus-visible:ring-white/40'\n : 'bg-muted hover:bg-brand-50 border border-transparent hover:border-brand-200 focus-visible:ring-brand-500/40',\n );\n protected readonly triggerTextClass = computed(() => (this.onBrand() ? 'text-white/80' : 'text-ink-faint'));\n protected readonly kbdClass = computed(() =>\n this.onBrand() ? 'border-white/25 text-white/70' : 'border-border bg-surface text-ink-faint',\n );\n\n protected readonly hotkeyLabel = computed(() => {\n const platform = this.document.defaultView?.navigator?.platform ?? '';\n return /mac|iphone|ipad/i.test(platform) ? '⌘K' : 'Ctrl K';\n });\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdsIcon } from '../icon/sds-icon';\n\nexport type SdsLanguageSwitcherAppearance = 'surface' | 'on-brand';\nexport type SdsLanguageSwitcherAlign = 'start' | 'end';\nexport type SdsLanguageSwitcherDirection = 'down' | 'up';\n\n/**\n * One selectable language. Pass either this shape or a bare code string in [languages].\n */\nexport interface SdsLanguageOption {\n /** Language code, e.g. 'fr', 'de', 'en'. Shown uppercased in the trigger. */\n code: string;\n /** Human-readable name shown in the list, e.g. 'Français'. Defaults to `code.toUpperCase()`. */\n label?: string;\n}\n\nlet nextId = 0;\n\n/**\n * The language picker for the top bar: a compact pill (globe icon + the active code) that opens a panel\n * listing exactly the languages the app supports, each row marked selected for the current one.\n *\n * The library owns no i18n engine — every app uses a different one (ngx-translate, Transloco, per-locale\n * URLs). So this is a pure, controlled control: the app passes the supported [languages] and the [current]\n * code, and reacts to the choice. `current` is a two-way `model`, so bind `[(current)]=\"lang\"` for optimistic\n * echo, or just listen to `(currentChange)` and call your own `translate.use($event)`. Rows show each\n * language's human label (pass it in the option, or let it default to the uppercased code).\n *\n * It is a sibling of sds-user-menu / sds-theme-toggle / sds-search-command and shares their chrome: the same\n * two appearances (`surface` default for a light/glass bar, `on-brand` for the dark brand bar), the same\n * disclosure mechanics (closes on outside click, on Escape, and on selection, restoring focus to the trigger),\n * and the same panel styling and open animation — so the three top-bar controls read as one set.\n *\n * The panel is appended to `document.body` while open and positioned against the trigger (like sds-select),\n * so a clipping ancestor — a bar with `overflow:hidden`, or a `glass` bar whose `backdrop-filter` is a\n * containing block — can never cut it off or paint over it. It repositions on scroll/resize and is removed\n * on close. Accessibility follows the APG select-only combobox: focus stays on the trigger, and Arrow/Home/\n * End/Enter/Escape drive a highlighted option surfaced via `aria-activedescendant` (works even though the\n * listbox lives in `<body>`).\n *\n * @example\n * <sds-language-switcher\n * [languages]=\"[{ code: 'fr', label: 'Français' }, { code: 'de', label: 'Deutsch' }, { code: 'en', label: 'English' }]\"\n * [current]=\"lang()\"\n * menuLabel=\"Changer de langue\"\n * (currentChange)=\"translate.use($event)\"\n * />\n *\n * @example\n * <!-- Bare codes are fine; rows fall back to the uppercased code. -->\n * <sds-language-switcher [languages]=\"['fr', 'de', 'en']\" [(current)]=\"lang\" />\n */\n@Component({\n selector: 'sds-language-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon],\n host: {\n class: 'relative inline-block',\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n },\n template: `\n <button\n #trigger\n type=\"button\"\n role=\"combobox\"\n class=\"flex h-10 items-center gap-1.5 rounded-control px-3 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2\"\n [class]=\"triggerClass()\"\n [attr.aria-label]=\"menuLabel()\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <sds-icon name=\"languages\" [size]=\"16\" class=\"shrink-0\" />\n <span>{{ currentCode() }}</span>\n <sds-icon\n name=\"chevron-down\"\n [size]=\"14\"\n class=\"shrink-0 transition-transform\"\n [class]=\"chevronClass()\"\n [class.rotate-180]=\"open()\"\n />\n </button>\n\n @if (open()) {\n <!-- Appended to document.body on open (see positionPanel) so no ancestor can clip it. -->\n <div\n data-sds-language-panel\n [id]=\"panelId\"\n role=\"listbox\"\n [attr.aria-label]=\"menuLabel()\"\n class=\"fixed z-[1000] min-w-44 overflow-hidden rounded-card border border-border bg-surface shadow-xl animate-sds-menu\"\n >\n @if (heading(); as h) {\n <p class=\"border-b border-border px-4 pb-2 pt-3 text-[0.68rem] font-semibold uppercase tracking-wider text-ink-faint\">\n {{ h }}\n </p>\n }\n <div class=\"max-h-[60vh] overflow-auto py-1.5\">\n @for (opt of options(); track opt.code; let i = $index) {\n <div\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.data-index]=\"i\"\n [attr.aria-selected]=\"opt.code === effectiveCode()\"\n [class]=\"rowClass(i, opt.code === effectiveCode())\"\n (click)=\"choose(opt.code)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n <span class=\"flex-1 truncate text-left\">{{ opt.label }}</span>\n <span\n class=\"shrink-0 text-[0.7rem] font-semibold uppercase tracking-wide\"\n [class]=\"opt.code === effectiveCode() ? 'text-brand-600' : 'text-ink-faint'\"\n >{{ opt.code }}</span\n >\n @if (opt.code === effectiveCode()) {\n <sds-icon name=\"check\" [size]=\"16\" class=\"shrink-0 text-brand-600\" />\n } @else {\n <span class=\"w-4 shrink-0\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [\n `\n .animate-sds-menu {\n animation: sds-menu-in 0.14s ease-out;\n }\n @keyframes sds-menu-in {\n from {\n opacity: 0;\n transform: translateY(-6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .animate-sds-menu {\n animation: none;\n }\n }\n `,\n ],\n})\nexport class SdsLanguageSwitcher implements OnDestroy {\n private readonly el = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly injector = inject(Injector);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n protected readonly panelId = `sds-language-panel-${nextId++}`;\n\n /** The supported languages — either `{ code, label }` options or bare code strings. */\n readonly languages = input<ReadonlyArray<SdsLanguageOption | string>>([]);\n\n /** The active language code. Two-way: `[(current)]` echoes the choice, or listen to `(currentChange)`. */\n readonly current = model<string>('');\n\n /** `surface` (default) for a light / glass bar; `on-brand` for the dark brand bar. */\n readonly appearance = input<SdsLanguageSwitcherAppearance>('surface');\n\n /** Which edge the panel aligns to. `end` (default) hangs it from the right of the trigger. */\n readonly align = input<SdsLanguageSwitcherAlign>('end');\n\n /** `up` prefers opening the panel above the trigger — for a switcher near the bottom of the page. */\n readonly direction = input<SdsLanguageSwitcherDirection>('down');\n\n /** Accessible name for the trigger and panel. */\n readonly menuLabel = input<string>('Choisir la langue');\n\n /** Optional visible header above the list (e.g. \"Langue\"). Omitted when empty. */\n readonly heading = input<string>('');\n\n readonly openChange = output<boolean>();\n\n protected readonly open = signal(false);\n protected readonly highlightedIndex = signal(-1);\n private panelEl: HTMLElement | null = null;\n\n /** Normalise the mixed `languages` input to `{ code, label }`, defaulting the label to the code. */\n protected readonly options = computed<SdsLanguageOption[]>(() =>\n this.languages().map((l) =>\n typeof l === 'string'\n ? { code: l, label: l.toUpperCase() }\n : { code: l.code, label: l.label ?? l.code.toUpperCase() },\n ),\n );\n\n /**\n * The code treated as active everywhere — trigger label AND the selected row. Falls back to the first\n * option when `current` is unset, so the pill and the checked row can never disagree.\n */\n protected readonly effectiveCode = computed(() => this.current() || this.options()[0]?.code || '');\n\n /** Uppercased code shown in the trigger. */\n protected readonly currentCode = computed(() => this.effectiveCode().toUpperCase());\n\n protected readonly activeOptionId = computed(() =>\n this.highlightedIndex() >= 0 ? this.optionId(this.highlightedIndex()) : null,\n );\n\n protected optionId(i: number): string {\n return `${this.panelId}-opt-${i}`;\n }\n\n protected toggle(): void {\n this.open() ? this.close(true) : this.openPanel();\n }\n\n protected openPanel(): void {\n this.open.set(true);\n this.openChange.emit(true);\n this.initHighlight();\n // After the panel renders inside the host, portal it to <body> and anchor it to the trigger, so no\n // clipping/stacking ancestor (an overflow:hidden bar, a backdrop-filter glass bar) can cut it off.\n // Focus stays on the trigger (combobox model); the active row is surfaced via aria-activedescendant.\n afterNextRender(\n () => {\n this.panelEl = this.el.nativeElement.querySelector<HTMLElement>('[data-sds-language-panel]');\n this.positionPanel();\n this.addReflowListeners();\n this.trigger()?.nativeElement.focus();\n this.scrollHighlightedIntoView();\n },\n { injector: this.injector },\n );\n }\n\n protected close(returnFocus = false): void {\n if (!this.open()) return;\n this.removeReflowListeners();\n // Remove the portalled node ourselves before Angular tears the view down (it lives in <body> now).\n this.panelEl?.remove();\n this.panelEl = null;\n this.open.set(false);\n this.openChange.emit(false);\n if (returnFocus) this.trigger()?.nativeElement.focus();\n }\n\n protected choose(code: string): void {\n this.current.set(code);\n // Pointer/keyboard selection returns focus to the trigger, like the other top-bar disclosures.\n this.close(true);\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node;\n const inHost = this.el.nativeElement.contains(target);\n const inPanel = !!this.panelEl && this.panelEl.contains(target);\n if (!inHost && !inPanel) this.close();\n }\n\n protected onEscape(): void {\n if (!this.open()) return;\n this.close(true);\n }\n\n // --- keyboard (APG select-only combobox: focus stays on the trigger) ---\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.open()) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPanel();\n }\n return;\n }\n switch (event.key) {\n case 'ArrowDown': event.preventDefault(); this.move(1); break;\n case 'ArrowUp': event.preventDefault(); this.move(-1); break;\n case 'Home': event.preventDefault(); this.highlight(0); break;\n case 'End': event.preventDefault(); this.highlight(this.options().length - 1); break;\n case 'Enter':\n case ' ': event.preventDefault(); this.chooseHighlighted(); break;\n case 'Escape': event.preventDefault(); this.close(true); break;\n case 'Tab': this.close(false); break;\n default: break;\n }\n }\n\n private initHighlight(): void {\n const idx = this.options().findIndex((o) => o.code === this.effectiveCode());\n this.highlightedIndex.set(idx >= 0 ? idx : this.options().length ? 0 : -1);\n }\n\n private move(delta: number): void {\n const n = this.options().length;\n if (!n) return;\n const from = this.highlightedIndex();\n this.highlight(((from < 0 ? 0 : from) + delta + n) % n);\n }\n\n private highlight(i: number): void {\n if (i < 0 || i >= this.options().length) return;\n this.highlightedIndex.set(i);\n this.scrollHighlightedIntoView();\n }\n\n private chooseHighlighted(): void {\n const opt = this.options()[this.highlightedIndex()];\n if (opt) this.choose(opt.code);\n }\n\n private scrollHighlightedIntoView(): void {\n setTimeout(() => {\n this.panelEl\n ?.querySelector<HTMLElement>(`[data-index=\"${this.highlightedIndex()}\"]`)\n ?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n // --- body-appended overlay positioning (mirrors sds-select / sds-date-picker) ---\n private readonly reflow = (): void => this.positionPanel();\n private listening = false;\n\n private addReflowListeners(): void {\n if (this.listening) return;\n window.addEventListener('scroll', this.reflow, true);\n window.addEventListener('resize', this.reflow);\n this.listening = true;\n }\n private removeReflowListeners(): void {\n if (!this.listening) return;\n window.removeEventListener('scroll', this.reflow, true);\n window.removeEventListener('resize', this.reflow);\n this.listening = false;\n }\n\n private positionPanel(): void {\n const triggerEl = this.trigger()?.nativeElement;\n const panelEl = this.panelEl;\n if (!triggerEl || !panelEl) return;\n if (panelEl.parentElement !== document.body) document.body.appendChild(panelEl);\n\n const r = triggerEl.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n const pw = panelEl.offsetWidth || 176;\n const ph = panelEl.offsetHeight || 200;\n\n // Vertical: below by default; open above when asked (direction='up') and there is room, or when there\n // isn't room below but there is above. The panel height is bounded by the list's max-h, but clamp\n // defensively so top can never be pushed off the top edge.\n const roomBelow = window.innerHeight - r.bottom - gap;\n const roomAbove = r.top - gap;\n let top =\n (this.direction() === 'up' && roomAbove >= ph) || (roomBelow < ph && roomAbove > roomBelow)\n ? r.top - gap - ph\n : r.bottom + gap;\n if (top + ph > window.innerHeight - margin) top = window.innerHeight - margin - ph;\n if (top < margin) top = margin;\n\n // Horizontal: align the panel's end (right) or start (left) edge to the trigger, then clamp.\n let left = this.align() === 'end' ? r.right - pw : r.left;\n left = Math.min(left, window.innerWidth - margin - pw);\n left = Math.max(margin, left);\n\n panelEl.style.top = `${Math.round(top)}px`;\n panelEl.style.left = `${Math.round(left)}px`;\n }\n\n ngOnDestroy(): void {\n this.removeReflowListeners();\n this.panelEl?.remove();\n }\n\n private readonly onBrand = computed(() => this.appearance() === 'on-brand');\n\n protected readonly triggerClass = computed(() =>\n this.onBrand()\n ? 'text-white/85 hover:bg-white/10 hover:text-white focus-visible:ring-white/40'\n : 'bg-muted text-ink-soft hover:bg-brand-50 hover:text-brand-600 focus-visible:ring-brand-500/40',\n );\n\n protected readonly chevronClass = computed(() => (this.onBrand() ? 'text-white/70' : 'text-ink-faint'));\n\n protected rowClass(index: number, selected: boolean): string {\n const base =\n 'flex w-full cursor-pointer items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors';\n const highlighted = this.highlightedIndex() === index;\n let state: string;\n if (selected) {\n state = highlighted ? 'bg-brand-500/25 text-ink' : 'bg-brand-500/15 text-ink';\n } else {\n state = highlighted ? 'bg-muted text-ink' : 'text-ink-soft';\n }\n return `${base} ${state}`;\n }\n}\n","/*\n * Public API Surface of saitech-design-system — the Saitech / App design system.\n */\n\n// Primitives\nexport * from './lib/icon/icon-registry';\nexport * from './lib/icon/sds-icon';\nexport * from './lib/button/sds-button';\nexport * from './lib/input/sds-input';\nexport * from './lib/input-number/sds-input-number';\nexport * from './lib/localized-input/sds-localized-input';\nexport * from './lib/otp-input/sds-otp-input';\nexport * from './lib/textarea/sds-textarea';\nexport * from './lib/toggle-switch/sds-toggle-switch';\nexport * from './lib/checkbox/sds-checkbox';\nexport * from './lib/radio/sds-radio';\nexport * from './lib/avatar/sds-avatar';\nexport * from './lib/badge/sds-badge';\nexport * from './lib/card/sds-card';\nexport * from './lib/allergen/sds-allergen-icon';\nexport * from './lib/tri-state-chip/sds-tri-state-chip';\nexport * from './lib/segmented/sds-segmented';\nexport * from './lib/checklist/sds-checklist-row';\nexport * from './lib/score/sds-score';\nexport * from './lib/status-tile/sds-status-tile';\nexport * from './lib/menu/sds-menu';\nexport * from './lib/bulk-bar/sds-bulk-bar';\nexport * from './lib/sortable-list/sds-sortable-list';\nexport * from './lib/file-drop/sds-file-drop';\nexport * from './lib/image-cropper/sds-image-cropper';\nexport * from './lib/datepicker/date-utils';\nexport * from './lib/datepicker/sds-calendar';\nexport * from './lib/datepicker/sds-date-picker';\nexport * from './lib/select/sds-select';\nexport * from './lib/select/sds-multi-select';\nexport * from './lib/select/sds-select-templates';\nexport * from './lib/phone-input/phone-countries';\nexport * from './lib/phone-input/sds-phone-input';\nexport * from './lib/paginator/sds-paginator';\nexport * from './lib/tabs/sds-tabs-store';\nexport * from './lib/tabs/sds-tabs';\nexport * from './lib/tabs/sds-tab-list';\nexport * from './lib/tabs/sds-tab';\nexport * from './lib/tabs/sds-tab-panels';\nexport * from './lib/tabs/sds-tab-panel';\nexport * from './lib/accordion/sds-accordion-store';\nexport * from './lib/accordion/sds-accordion';\nexport * from './lib/accordion/sds-accordion-panel';\nexport * from './lib/accordion/sds-accordion-header';\nexport * from './lib/accordion/sds-accordion-content';\nexport * from './lib/table/sds-table-cell';\nexport * from './lib/table/sds-table-row-expansion';\nexport * from './lib/table/sds-table';\nexport * from './lib/toast/sds-toast.service';\nexport * from './lib/toast/sds-toast-host';\n\n// Theme\nexport * from './lib/theme/sds-theme.service';\nexport * from './lib/theme/sds-theme-toggle';\n\n// Layout\nexport * from './lib/topbar/sds-topbar';\nexport * from './lib/shell/sds-shell';\nexport * from './lib/sidebar/sidebar-store';\nexport * from './lib/sidebar/sds-sidebar';\nexport * from './lib/sidebar/sds-nav-group';\nexport * from './lib/sidebar/sds-nav-item';\nexport * from './lib/user-menu/sds-user-menu';\nexport * from './lib/user-menu/sds-menu-item';\nexport * from './lib/search/sds-search-command';\nexport * from './lib/language-switcher/sds-language-switcher';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["VARIANTS","SIZES","nextId"],"mappings":"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"}