bs-phone-input is a phone-number field: a country picker with flags, a dial code that cannot be edited away, and as-you-type formatting. The bound value is E.164 — +32470123456 — or null while empty, so a form posts one canonical string.
Validation rules are loaded per calling code on first interaction, so a field costs about 20 kB gzip when the user reaches it and nothing before that. (phoneChange) reports valid as undefined until those rules arrive — deliberately, rather than claiming a number is valid before anything has checked it.
Bound value (E.164):
nullLast (phoneChange) detail:
null Country names come from Intl.DisplayNames, so they are localized and collated in the viewer's language at no download cost. Leave locale unset to follow the browser — the default, and what most apps should ship.
Open the picker above after switching: the list re-sorts, because an alphabetical list of English names is not alphabetical to a Dutch reader.
nullbs-input-group joins any mix of controls into one continuous field — including components that keep their own shadow root, which Bootstrap's own CSS cannot reach. The corners pair and the borders collapse either way.
Tick Required above and blur the empty field. The message is rendered inside the component's shadow root and referenced by aria-errormessage from the real input — a message in your own template could not be, because an IDREF does not cross a shadow boundary.
+44 … switches the country and strips the dial code.