Please correct me if I’m wrong, but last time I checked targeting a fully qualified class precedes targeting an attribute selector as we use for the default max-width of 100%. So working with utility classes should work perfectly fine.
It’s not really a question of whether the utility classes will work. They do work. It’s a question of what the user is then permitted or not permitted to do when attempting to override certain behavior.
.text–m, for example, doesn’t actually load after Bricks. So the order in your example is flipped. We intentionally load the utilities before Bricks because our philosophy is to defer to the builder’s controls as this is the best user experience. Other frameworks don’t do this – they pretty much just trample the builder by loading everything last.
We do have an overrides file that loads last, though, where we can put essential overrides. This is where we put .text–m for example, in the case of Bricks.
This does still cause an issue because some people want .text–m to only change the size of their text and not limit the line length. If they don’t want the character limitation for a specific element, they expect to be able to override it, which they can’t do with the builder unless they use ID styling (since we were forced to load this rule after the builder, given the attribute selector used by Bricks).
Granted, it’s not a super common issue. BUT, it’s definitely a big issue with default global styles: h1,h2,h3,h4,h5,h6,p, etc.
These cannot have a proper max-width set on them without increased specificity that then disables the max-width input in the builder for these elements.
If you’re not comfortable with :where() or providing a toggle that allows users to disable the max-width attribute selector, then another solution is to allow users to set a default max-width on headings and paragraphs from the global styles area — and make sure this is overrideable on any specific element, using a class (not ID), via the builder controls.
We can then instruct users to use the Bricks global styling area instead of setting these defaults in ACSS. It’s not perfect since they want to use ACSS to do this, but it at least gives them a workable option.