I did not like semantic or material versions of uniforms, so I used unstyled. I am using the materialize Meteor component and so I get some basic material styling anyway, but I agree with you that it handles many things poorly. Fonts are problematically small, spacing often is inefficiant, arrays are no fun at all since they like to stack right on the left of the form below the label, as do radio buttons. Lots of pain.
So I tortured myself for a week or two slowly figuring out how to style the forms and have been able to completely change how they look. The basics come down to CSS I’m afraid … lots of “inspect” followed by css updates, but I can say that you can get at anything pretty much.
I use Autoform exclusively as I am doing a time boxed project that should have quite a few people on it (what’s new?) … and I use it with the simpl-schema npm module. The main trick is to use the uniforms object as part of your field definition when you want to take more control … an example:
uniforms: {
disabled: true,
id: "inlinearray",
},
Disabling a field makes it read only, obviously, and I do this whenever I want auto form to display useful info. In this case, though, it is a set of tags that I am showing. The tag itself is a react component that I have styled to look like a real tag, with rounded ends and a little round x button on the left to remove the tag. Works great. But in this place, I do not want the tag to be editable, as trhat is handled in another way. So disabled. I hated the way arrays were displayed (block), so I found a really neat trick to have tags display inline and wrap so you can add as many as you need. I use the id field, which is the only one I can find that shows up in the actual HTML, allowing it to be addressed in css. Basically, it is the poor man’s class. So unfortunate that uniforms does not seem to allow for much more flexible styling. No doubt that’s what they include every style under the sun as separate packages.
The css I use for this “inlinearray” id is:
form > ul[id=inlinearray] {
margin-top: 1rem;
display: inline-flex;
align-items: center;
flex-wrap: wrap;
}
form > ul[id=inlinearray] > label, form > ul[id=inlinearray] > div {
display: inline-flex;
align-items: center;
justify-content: center;
}
This looks pretty good. Of course, I have similar css for blockarray when I want to have an array of sub objects properly indented and separated with a subtle background color to separate them from the main elements. I also shrink the labels in sub forms and so on.
It can be done, but it is harder than it should be. Alas, every package has its compromises. Best of luck.