Components should be....
-easy to use, even without documentation and hard to misuse
-easy to read and maintain code that consumes your component
-Easy to extend
-Designed to be simple and not over constrained with features that may not meet everyone's needs (designed your component to be simple with the aim of displeasing everyone equally)
-Functionality, when it doubt leave it (It is always easier to add features rather than remove features)
-keep all complex implementation private within your component, and expose only public actions that are simple to understand and use;
-All names should be self explanatory
-Be consistent with words, the same word should mean the same thing everywhere!