Two features with similar names solve different problems, and reaching for the wrong one produces either a class that does nothing or a duplicate block.
// a STYLE: one class, chosen in the sidebar. is-style-{name}
wp.blocks.registerBlockStyle('core/quote', {
name: 'pull', label: 'Pull quote',
});
// a VARIATION: a preset of ATTRIBUTES, and its own inserter entry
wp.blocks.registerBlockVariation('core/embed', {
name: 'internal-video',
title: 'Internal video',
attributes: { providerNameSlug: 'internal', responsive: true },
isActive: (a, v) => a.providerNameSlug === v.providerNameSlug,
});
A style is presentational and a variation is a different starting configuration of the same block — which is why a variation appears in the inserter as its own item and a style does not. isActive is what lets the editor recognise an existing block as that variation, and omitting it means the block always shows as the base one. Variations arrived in 5.4 and are the more useful of the two for anything with attributes worth presetting.