<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexandro Paixao Marques</title>
    <description>The latest articles on DEV Community by Alexandro Paixao Marques (@alexandro_net).</description>
    <link>https://dev.to/alexandro_net</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3951163%2Fdc3b2f72-155a-49ac-bddb-3679f4b92c6a.png</url>
      <title>DEV Community: Alexandro Paixao Marques</title>
      <link>https://dev.to/alexandro_net</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexandro_net"/>
    <language>en</language>
    <item>
      <title>Angular 21 Multiselect Dropdown: A Migration-Friendly Component with Live Functional Tests</title>
      <dc:creator>Alexandro Paixao Marques</dc:creator>
      <pubDate>Mon, 25 May 2026 18:30:45 +0000</pubDate>
      <link>https://dev.to/alexandro_net/angular-21-multiselect-dropdown-a-migration-friendly-component-with-live-functional-tests-5fj6</link>
      <guid>https://dev.to/alexandro_net/angular-21-multiselect-dropdown-a-migration-friendly-component-with-live-functional-tests-5fj6</guid>
      <description>&lt;p&gt;Modern Angular applications rarely need just a dropdown.&lt;/p&gt;

&lt;p&gt;In real projects, a multiselect dropdown usually sits inside something more important: filters, dashboards, reporting tools, permission editors, workflow screens, admin panels, and data-heavy forms where users need to search, group, select, clear, validate, and keep state consistent.&lt;/p&gt;

&lt;p&gt;That is the context behind &lt;strong&gt;Stackline Angular Multiselect Dropdown&lt;/strong&gt;, now available for &lt;strong&gt;Angular 21&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This release is not just about making a dropdown compile on the latest Angular version. The goal is to provide a practical component that can be adopted in real applications, tested through live examples, and migrated gradually without forcing teams to rewrite every existing template at once.&lt;/p&gt;

&lt;p&gt;Install the package with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @stackline/angular-multiselect-dropdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Links:&lt;/p&gt;

&lt;p&gt;npm:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/@stackline/angular-multiselect-dropdown" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@stackline/angular-multiselect-dropdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;br&gt;
&lt;a href="https://alexandro.net/docs/angular/multiselect/angular-21/" rel="noopener noreferrer"&gt;https://alexandro.net/docs/angular/multiselect/angular-21/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live demo:&lt;br&gt;
&lt;a href="https://alexandro.net/docs/angular/multiselect/angular-21/live/?v=21.0.3-20260525-live" rel="noopener noreferrer"&gt;https://alexandro.net/docs/angular/multiselect/angular-21/live/?v=21.0.3-20260525-live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/alexandroit/angular-multiselect-dropdown" rel="noopener noreferrer"&gt;https://github.com/alexandroit/angular-multiselect-dropdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For new releases, documentation updates, and upcoming Angular components, visit:&lt;br&gt;
&lt;a href="https://alexandro.net" rel="noopener noreferrer"&gt;https://alexandro.net&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What the library provides
&lt;/h2&gt;

&lt;p&gt;Stackline Angular Multiselect Dropdown is an Angular multiselect component designed for real application forms, dashboards, filters, and enterprise interfaces.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;single-select and multi-select modes&lt;/li&gt;
&lt;li&gt;search and filtering&lt;/li&gt;
&lt;li&gt;select all and clear all behavior&lt;/li&gt;
&lt;li&gt;grouped options&lt;/li&gt;
&lt;li&gt;custom item templates&lt;/li&gt;
&lt;li&gt;custom badge templates&lt;/li&gt;
&lt;li&gt;template-driven forms&lt;/li&gt;
&lt;li&gt;reactive forms&lt;/li&gt;
&lt;li&gt;lazy loading and remote-data hooks&lt;/li&gt;
&lt;li&gt;CSS and SCSS theming&lt;/li&gt;
&lt;li&gt;versioned documentation per Angular major&lt;/li&gt;
&lt;li&gt;modern selector support with legacy selector compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A multiselect component can look simple from the outside, but once it is used across several forms and workflows, replacing it becomes expensive. It affects templates, validation, events, styling, selected state, form reset behavior, and sometimes even backend query logic.&lt;/p&gt;

&lt;p&gt;That is why compatibility, predictable APIs, and safe migration paths matter.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this package exists
&lt;/h2&gt;

&lt;p&gt;There are many dropdowns and select components available for Angular, but the hard part in real applications is rarely the first implementation.&lt;/p&gt;

&lt;p&gt;The hard part is keeping the component stable while Angular moves forward, while forms evolve, while UI layouts become more complex, and while existing screens continue to depend on older selectors or configuration patterns.&lt;/p&gt;

&lt;p&gt;This package focuses on a practical set of goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep Angular 21 compatibility clear&lt;/li&gt;
&lt;li&gt;keep the API familiar for existing projects&lt;/li&gt;
&lt;li&gt;support both template-driven and reactive forms&lt;/li&gt;
&lt;li&gt;provide working examples that can be tested in the browser&lt;/li&gt;
&lt;li&gt;preserve a migration path for older templates&lt;/li&gt;
&lt;li&gt;expose enough configuration for real dashboard and form use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intention is not to reinvent how selection works. The intention is to make a commonly needed UI component easier to adopt, validate, and maintain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;For Angular 21 projects, install the package with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @stackline/angular-multiselect-dropdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a dedicated Angular 21 package line helps keep compatibility predictable across local environments, CI pipelines, and production builds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Module registration
&lt;/h2&gt;

&lt;p&gt;The component is exposed through &lt;code&gt;AngularMultiSelectModule&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/platform-browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FormsModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/forms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AngularMultiSelectModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@stackline/angular-multiselect-dropdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;BrowserModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;AngularMultiSelectModule&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After registering the module, the component can be used in templates with a data source, selected values, and a settings object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic usage
&lt;/h2&gt;

&lt;p&gt;A typical implementation starts with a list of items, a selected model, and a dropdown configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;countries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Brazil&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Canada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Portugal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;United States&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;selectedCountries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Canada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;singleSelection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select countries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;selectAllText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;unSelectAllText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clear all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableCheckAll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableSearchFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;badgeShowLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;260&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showCheckbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;classic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;labelKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;itemName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular-multiselect&lt;/span&gt;
  &lt;span class="na"&gt;[data]=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
  &lt;span class="na"&gt;[(ngModel)]=&lt;/span&gt;&lt;span class="s"&gt;"selectedCountries"&lt;/span&gt;
  &lt;span class="na"&gt;[settings]=&lt;/span&gt;&lt;span class="s"&gt;"dropdownSettings"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the template compact while allowing most of the behavior to be configured from TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selector compatibility
&lt;/h2&gt;

&lt;p&gt;The recommended selector for new code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular-multiselect&amp;gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package also keeps support for the older selector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular2-multiselect&amp;gt;&amp;lt;/angular2-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters in large Angular applications where selectors may already exist across shared modules, reusable form components, admin screens, internal libraries, and older templates.&lt;/p&gt;

&lt;p&gt;Teams can upgrade gradually instead of rewriting everything in one pass. Existing applications can continue working while new development standardizes around the modern selector.&lt;/p&gt;

&lt;p&gt;That kind of migration flexibility is important when a UI component is already used in many places.&lt;/p&gt;

&lt;h2&gt;
  
  
  Forms integration
&lt;/h2&gt;

&lt;p&gt;A production-ready dropdown component must integrate correctly with Angular forms.&lt;/p&gt;

&lt;p&gt;The package supports both template-driven forms and reactive forms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template-driven forms
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;#form&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="na"&gt;ngForm&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;angular-multiselect&lt;/span&gt;
    &lt;span class="na"&gt;[data]=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
    &lt;span class="na"&gt;[(ngModel)]=&lt;/span&gt;&lt;span class="s"&gt;"selectedCountries"&lt;/span&gt;
    &lt;span class="na"&gt;[settings]=&lt;/span&gt;&lt;span class="s"&gt;"dropdownSettings"&lt;/span&gt;
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reactive forms
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;[formGroup]=&lt;/span&gt;&lt;span class="s"&gt;"userForm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;angular-multiselect&lt;/span&gt;
    &lt;span class="na"&gt;[data]=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
    &lt;span class="na"&gt;[settings]=&lt;/span&gt;&lt;span class="s"&gt;"dropdownSettings"&lt;/span&gt;
    &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In real applications, a multiselect value is not only a visual state. It needs to participate in validation, dirty and touched state, serialization, reset behavior, disabled state, and form submission.&lt;/p&gt;

&lt;p&gt;Clean forms integration reduces custom glue code and makes the component easier to maintain across large codebases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Settings-driven behavior
&lt;/h2&gt;

&lt;p&gt;One of the strongest parts of the package is the settings-driven API.&lt;/p&gt;

&lt;p&gt;Most dropdown behavior can be configured through a single settings object instead of requiring wrapper components or repeated template changes.&lt;/p&gt;

&lt;p&gt;Supported settings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;singleSelection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enableCheckAll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enableSearchFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;searchBy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxHeight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;badgeShowLimit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limitSelection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;searchPlaceholderText&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;groupBy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;showCheckbox&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noDataLabel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lazyLoading&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;labelKey&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;primaryKey&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selectGroup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;addNewItemOnFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;escapeToClose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;autoPosition&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clearAll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tagToBody&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Single selection without checkboxes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;singleSelection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showCheckbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableCheckAll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select one country&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Selection limit
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;singleSelection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;limitSelection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;badgeShowLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select up to 2 countries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Grouped data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;countries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Brazil&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;South America&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Canada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;North America&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Portugal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Europe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableSearchFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select countries by region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach keeps behavior explicit and discoverable for consumers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search and filtering
&lt;/h2&gt;

&lt;p&gt;Search becomes important as soon as datasets grow.&lt;/p&gt;

&lt;p&gt;The package supports filtering through &lt;code&gt;enableSearchFilter&lt;/code&gt;, while &lt;code&gt;searchBy&lt;/code&gt; allows filtering only specific fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;enableSearchFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;searchPlaceholderText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Search countries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;searchBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;itemName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives teams two useful modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broad search across item properties&lt;/li&gt;
&lt;li&gt;controlled search over selected fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Controlled search is useful when items contain internal IDs, flags, system fields, or hidden metadata that should not match the user input.&lt;/p&gt;

&lt;p&gt;For applications with complex objects, predictable search behavior avoids confusing matches and keeps the UI easier to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom templates
&lt;/h2&gt;

&lt;p&gt;A multiselect becomes more useful when consumers can control how dropdown items and selected badges are rendered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom item template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;c-item&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;let-item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;{{ item.itemName }}&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/c-item&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom badge template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;c-badge&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;let-item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"country-chip"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ item.itemName }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/c-badge&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Complete custom template example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular-multiselect&lt;/span&gt;
  &lt;span class="na"&gt;[data]=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
  &lt;span class="na"&gt;[(ngModel)]=&lt;/span&gt;&lt;span class="s"&gt;"selectedCountries"&lt;/span&gt;
  &lt;span class="na"&gt;[settings]=&lt;/span&gt;&lt;span class="s"&gt;"dropdownSettings"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;c-badge&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;let-item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"country-chip"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ item.itemName }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/c-badge&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;c-item&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;let-item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;{{ item.itemName }}&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;small&amp;gt;&lt;/span&gt;{{ item.region }}&lt;span class="nt"&gt;&amp;lt;/small&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/c-item&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful when applications need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avatars&lt;/li&gt;
&lt;li&gt;icons&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;li&gt;role indicators&lt;/li&gt;
&lt;li&gt;custom layouts&lt;/li&gt;
&lt;li&gt;region labels&lt;/li&gt;
&lt;li&gt;permission markers&lt;/li&gt;
&lt;li&gt;account types&lt;/li&gt;
&lt;li&gt;status badges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most business interfaces eventually need more than plain text rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event system
&lt;/h2&gt;

&lt;p&gt;The component exposes a classic Angular event model for selection workflows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular-multiselect&lt;/span&gt;
  &lt;span class="na"&gt;[data]=&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;
  &lt;span class="na"&gt;[(ngModel)]=&lt;/span&gt;&lt;span class="s"&gt;"selectedCountries"&lt;/span&gt;
  &lt;span class="na"&gt;[settings]=&lt;/span&gt;&lt;span class="s"&gt;"dropdownSettings"&lt;/span&gt;
  &lt;span class="na"&gt;(onSelect)=&lt;/span&gt;&lt;span class="s"&gt;"onItemSelect($event)"&lt;/span&gt;
  &lt;span class="na"&gt;(onDeSelect)=&lt;/span&gt;&lt;span class="s"&gt;"onItemDeSelect($event)"&lt;/span&gt;
  &lt;span class="na"&gt;(onSelectAll)=&lt;/span&gt;&lt;span class="s"&gt;"onSelectAll($event)"&lt;/span&gt;
  &lt;span class="na"&gt;(onDeSelectAll)=&lt;/span&gt;&lt;span class="s"&gt;"onDeSelectAll($event)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selection events are useful when dropdown changes need to trigger downstream behavior, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refreshing a report&lt;/li&gt;
&lt;li&gt;loading dependent filters&lt;/li&gt;
&lt;li&gt;updating query parameters&lt;/li&gt;
&lt;li&gt;syncing form state&lt;/li&gt;
&lt;li&gt;sending analytics events&lt;/li&gt;
&lt;li&gt;enabling related controls&lt;/li&gt;
&lt;li&gt;validating dependent fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many applications, a selection change is not isolated. It is part of a larger workflow. A predictable event contract makes that easier to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lazy loading and large lists
&lt;/h2&gt;

&lt;p&gt;Large datasets are where simple dropdowns usually start failing.&lt;/p&gt;

&lt;p&gt;The package includes lazy loading support and remote-data hooks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;dropdownSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Select items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableSearchFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lazyLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;labelKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;260&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters for applications dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;customers&lt;/li&gt;
&lt;li&gt;products&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;locations&lt;/li&gt;
&lt;li&gt;departments&lt;/li&gt;
&lt;li&gt;catalogs&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;li&gt;reporting dimensions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A component that supports lazy loading can be integrated with local pagination, server-side filtering, remote search workflows, and large-list scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dropdown positioning in real layouts
&lt;/h2&gt;

&lt;p&gt;Dropdown positioning problems usually appear only in real layouts.&lt;/p&gt;

&lt;p&gt;A dropdown that works on a simple page can behave differently inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboard cards&lt;/li&gt;
&lt;li&gt;modals&lt;/li&gt;
&lt;li&gt;side panels&lt;/li&gt;
&lt;li&gt;scrollable containers&lt;/li&gt;
&lt;li&gt;constrained widgets&lt;/li&gt;
&lt;li&gt;table filters&lt;/li&gt;
&lt;li&gt;embedded panels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package exposes configuration options such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;autoPosition&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tagToBody&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These options help keep dropdown behavior stable across complex UI layouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Theming strategy
&lt;/h2&gt;

&lt;p&gt;The package ships with bundled CSS and SCSS themes.&lt;/p&gt;

&lt;p&gt;A default theme can be added through the Angular styles configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"styles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"node_modules/@stackline/angular-multiselect-dropdown/themes/default.theme.css"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classic theme&lt;/li&gt;
&lt;li&gt;custom theme&lt;/li&gt;
&lt;li&gt;dark theme&lt;/li&gt;
&lt;li&gt;SCSS customization support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates two adoption paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast adoption
&lt;/h3&gt;

&lt;p&gt;Use the bundled CSS theme directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"styles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"node_modules/@stackline/angular-multiselect-dropdown/themes/default.theme.css"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Design-system control
&lt;/h3&gt;

&lt;p&gt;Start from the SCSS theme files and adapt styling to the application design system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"styles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"src/styles.scss"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"src/styles/multiselect-dropdown.theme.scss"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives teams a working default while still allowing deeper customization when the component needs to match an internal design system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live functional examples
&lt;/h2&gt;

&lt;p&gt;One of the strongest parts of the Angular 21 release is the live functional documentation.&lt;/p&gt;

&lt;p&gt;The Angular 21 documentation includes real interactive examples running in a live Angular environment.&lt;/p&gt;

&lt;p&gt;The examples cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;basic multi-select&lt;/li&gt;
&lt;li&gt;search and select all&lt;/li&gt;
&lt;li&gt;single selection without checkbox&lt;/li&gt;
&lt;li&gt;multi-select without checkbox&lt;/li&gt;
&lt;li&gt;selection limits&lt;/li&gt;
&lt;li&gt;badge overflow&lt;/li&gt;
&lt;li&gt;grouped datasets&lt;/li&gt;
&lt;li&gt;disabled states&lt;/li&gt;
&lt;li&gt;empty data&lt;/li&gt;
&lt;li&gt;long scrollable lists&lt;/li&gt;
&lt;li&gt;local lazy loading&lt;/li&gt;
&lt;li&gt;custom templates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These examples are not just static documentation. They let developers check the behavior directly in the browser before installing the package.&lt;/p&gt;

&lt;p&gt;That matters because UI components are often judged by edge cases: how search behaves, how selected values are displayed, how empty states look, how limits are handled, and how the component reacts in real interaction.&lt;/p&gt;

&lt;p&gt;For UI libraries, live examples are part of the trust model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular version strategy
&lt;/h2&gt;

&lt;p&gt;Many Angular libraries use broad peer dependency ranges.&lt;/p&gt;

&lt;p&gt;That can look convenient, but it often creates uncertainty. A package may install successfully while still not being clearly validated against the Angular version used in production.&lt;/p&gt;

&lt;p&gt;This package follows a stricter strategy where each Angular major receives its own validated package line.&lt;/p&gt;

&lt;p&gt;That improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reproducible builds&lt;/li&gt;
&lt;li&gt;compatibility validation&lt;/li&gt;
&lt;li&gt;migration planning&lt;/li&gt;
&lt;li&gt;CI predictability&lt;/li&gt;
&lt;li&gt;versioned documentation consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Angular teams, predictable compatibility is often more valuable than optimistic version ranges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration checklist
&lt;/h2&gt;

&lt;p&gt;For teams adopting the Angular 21 line, I would use the following checklist.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install the package
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @stackline/angular-multiselect-dropdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Register the module
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AngularMultiSelectModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@stackline/angular-multiselect-dropdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add a theme
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"styles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"node_modules/@stackline/angular-multiselect-dropdown/themes/default.theme.css"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Use the modern selector for new code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular-multiselect&amp;gt;&amp;lt;/angular-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Keep the legacy selector only where needed during migration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;angular2-multiselect&amp;gt;&amp;lt;/angular2-multiselect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Verify form behavior
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;initial selected values&lt;/li&gt;
&lt;li&gt;reset behavior&lt;/li&gt;
&lt;li&gt;required validation&lt;/li&gt;
&lt;li&gt;disabled state&lt;/li&gt;
&lt;li&gt;reactive form bindings&lt;/li&gt;
&lt;li&gt;template-driven form bindings&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Validate real UI scenarios
&lt;/h3&gt;

&lt;p&gt;Test the dropdown inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modals&lt;/li&gt;
&lt;li&gt;scrollable containers&lt;/li&gt;
&lt;li&gt;dashboard cards&lt;/li&gt;
&lt;li&gt;table filters&lt;/li&gt;
&lt;li&gt;side panels&lt;/li&gt;
&lt;li&gt;forms with validation messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Review large-list behavior
&lt;/h3&gt;

&lt;p&gt;For large datasets, evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lazyLoading&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxHeight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;search behavior&lt;/li&gt;
&lt;li&gt;server-side filtering&lt;/li&gt;
&lt;li&gt;scroll-to-end handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Standardize settings
&lt;/h3&gt;

&lt;p&gt;Create shared settings presets for your design system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultMultiselectSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;singleSelection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableCheckAll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;enableSearchFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;badgeShowLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;260&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showCheckbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;classic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;primaryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;labelKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;itemName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids slightly different dropdown behavior across the same application.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this component is a good fit
&lt;/h2&gt;

&lt;p&gt;This package is a strong fit when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular 21 compatibility&lt;/li&gt;
&lt;li&gt;classic Angular module integration&lt;/li&gt;
&lt;li&gt;template-driven forms support&lt;/li&gt;
&lt;li&gt;reactive forms support&lt;/li&gt;
&lt;li&gt;search and select-all behavior&lt;/li&gt;
&lt;li&gt;grouped options&lt;/li&gt;
&lt;li&gt;customizable item rendering&lt;/li&gt;
&lt;li&gt;customizable selected badge rendering&lt;/li&gt;
&lt;li&gt;theming through CSS and SCSS&lt;/li&gt;
&lt;li&gt;migration-friendly selector compatibility&lt;/li&gt;
&lt;li&gt;live examples before adoption&lt;/li&gt;
&lt;li&gt;bounded Angular major version support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful for Angular applications where stability and migration control matter more than replacing every UI control from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;A good UI component is not only about what appears on the screen.&lt;/p&gt;

&lt;p&gt;In real Angular projects, the important questions are practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it integrate cleanly with forms?&lt;/li&gt;
&lt;li&gt;Does it preserve state correctly?&lt;/li&gt;
&lt;li&gt;Can teams migrate without rewriting templates?&lt;/li&gt;
&lt;li&gt;Does it support larger datasets?&lt;/li&gt;
&lt;li&gt;Can the design system customize it?&lt;/li&gt;
&lt;li&gt;Are the examples reproducible?&lt;/li&gt;
&lt;li&gt;Is Angular compatibility clearly validated?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stackline Angular Multiselect Dropdown for Angular 21 focuses on those concerns.&lt;/p&gt;

&lt;p&gt;The package includes search, grouping, select all support, custom templates, form integration, theming, lazy loading, and live Angular 21 examples running in a real application environment.&lt;/p&gt;

&lt;p&gt;The migration path is also practical. Existing applications can continue using legacy selectors while newer projects adopt the modern selector progressively.&lt;/p&gt;

&lt;p&gt;For teams building or upgrading Angular 21 applications, that combination of compatibility, customization, and validated live examples makes the package a solid option for production use.&lt;/p&gt;

&lt;p&gt;For new releases, documentation updates, and upcoming Angular components, visit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://alexandro.net" rel="noopener noreferrer"&gt;https://alexandro.net&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;npm:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/@stackline/angular-multiselect-dropdown" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@stackline/angular-multiselect-dropdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;br&gt;
&lt;a href="https://alexandro.net/docs/angular/multiselect/angular-21/" rel="noopener noreferrer"&gt;https://alexandro.net/docs/angular/multiselect/angular-21/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live demo:&lt;br&gt;
&lt;a href="https://alexandro.net/docs/angular/multiselect/angular-21/live/?v=21.0.3-20260525-live" rel="noopener noreferrer"&gt;https://alexandro.net/docs/angular/multiselect/angular-21/live/?v=21.0.3-20260525-live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/alexandroit/angular-multiselect-dropdown" rel="noopener noreferrer"&gt;https://github.com/alexandroit/angular-multiselect-dropdown&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
