This is a great approach. Just to add to it, you can also use custom elements in lieu of classes, such as:
<my-product>...</my-product>
Any tag with a hyphen is considered a custom element, which is completely valid HTML -- even without defining the element in JS.
This gives you a more descriptive `div`, and then instead of classes like `product-primary`, you can use semantic attributes, like `<my-product primary size="large">`. In combination with CSS nesting, you can get some great looking HTML and CSS with minimal markup/visual noise and no build step.