Don't bundle label + input + description into a single component with props for every variation (size, descriptionPlacement, iconLeft, iconRight, layout). This leads to "prop city" — an ever-growing API that can never anticipate every use case.
Instead, expose composable child components:
<!-- ❌ Monolithic prop-driven API -->
<Input label="Price" description="Set your price" icon="dollar" icon-right="help" description-placement="top" size="md" layout="horizontal" />
<!-- ✅ Composable compound components -->
<Field>
<Label>Price</Label>
<Description>Set your price</Description>
<InputGroup>
<DollarIcon />
<Input class="sm:max-w-32" />
<HelpIcon />
</InputGroup>
</Field>This is more verbose but far more flexible. Layout, ordering, and responsive behavior are controlled by the consumer, not baked into the component.