Show HN: MVP.css – Minimalist stylesheet for HTML elements
github.com
github.com
Also for reference, behold W3C Core Styles (since 1997): https://www.w3.org/StyleSheets/Core/
https://www.w3.org/StyleSheets/Core/Oldstyle.css
https://www.w3.org/StyleSheets/Core/Modernist.css
https://www.w3.org/StyleSheets/Core/Midnight.css
https://www.w3.org/StyleSheets/Core/Ultramarine.css
https://www.w3.org/StyleSheets/Core/Swiss.css
https://www.w3.org/StyleSheets/Core/Chocolate.css
https://www.w3.org/StyleSheets/Core/Traditional.css
https://www.w3.org/StyleSheets/Core/Steely.cssMight be fun to take all the w3 core styles rebuild them with modern CSS features. Maybe add some HTML5 elements to the test docs as well.
[1] @dohliam's excellent "Drop-in Minimal CSS" collection mentioned here https://news.ycombinator.com/item?id=22683281
(function() {
const sheets = [
'https://www.w3.org/StyleSheets/Core/Oldstyle.css',
'https://www.w3.org/StyleSheets/Core/Modernist.css',
'https://www.w3.org/StyleSheets/Core/Midnight.css',
'https://www.w3.org/StyleSheets/Core/Ultramarine.css',
'https://www.w3.org/StyleSheets/Core/Swiss.css',
'https://www.w3.org/StyleSheets/Core/Chocolate.css',
'https://www.w3.org/StyleSheets/Core/Traditional.css',
'https://www.w3.org/StyleSheets/Core/Steely.css',
'./mvp.css',
];
const div = document.createElement('div');
const head = document.querySelector('head');
sheets.forEach(url => {
let button = document.createElement('button');
button.onclick = () => {
// Remove all stylesheets
let stylesheets = document.querySelectorAll('link[rel="stylesheet"]');
stylesheets.forEach(el => el.parentNode.removeChild(el));
// Insert our new sheet (<link rel="stylesheet" href="file.css">)
let link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', url);
head.appendChild(link);
};
button.innerText =
url === './mvp.css'
? 'Original MVP.css'
: url.replace('https://www.w3.org/StyleSheets/Core/', '');
button.setAttribute('style', 'cursor: pointer');
div.appendChild(button);
div.appendChild(document.createTextNode(' '));
});
// Insert buttons into DOM
document.body.insertAdjacentElement('afterbegin', div);
})();https://developer.mozilla.org/en-US/docs/Web/CSS/Alternative... https://developer.mozilla.org/samples/cssref/altstyles/index...
The last detail this nice feature lacks to this day and that presumably doomed it to current obsolescence is that your choice does not persist during navigation and even page reloads. Never understood why this native switcher stuck half way to be usable. Back in day alternative style sheets were (at least a bit) "hype" author had to recede to JavaScript solutions to provide persistence, so it lost much of its charm.
Browsers to this days are required by specs to give user a way to participate in the cascade, but it never wasn't easy or even pleasant experience - it mostly involved editing some magic file and restarting browser (for "native" user styles) or using some extension, what feels like a poor excuse to not support it natively and mostly is implemented an a way that does not comply with specs anyway - because it mostly just spams author origin level and does not create user origin level. (I miss the old days when web was young and "userstyles" and "userscripts" seemed like natural development of tech what every user will use daily.)
I think I know what you mean but I can't help but feel like that sentence is denigrating the work of an entire discipline that _also_ works on "hard stuff" like figuring out how to address user need with usable interfaces.
Now that of course depends heavily on what you consider to be minimally viable but there's generally not an expectation of professional design work.
If you're the kind of person who reached for bootstrap or material UI or other not semantic, boilerplate frameworks this might be appealing.
I can see how that doesn't come across the way I worded it though. I'll try to wordsmith that line. Thanks for the feedback!
> cross _visual_ design off your list and get back to working on the hard stuff
That sentence made me consider Poe's Law for a while, considering the weird fruits HustleSpeak is bearing quite often. Going by the author's bio, I'm most likely wrong.
Giving opinionated styles to unclassed HTML elements is definitely not the right fit for every website. But, given this project's goal of being a minimalist, quick-start stylesheet that requires no classes, I think this use of `a em` and `a strong` selectors to create button-y links is pretty ingenious.
I wanted to solve a similar problem when creating sakura.css [0], but I decided to not implement it and keep it even simpler.
(Hint: if you use the bookmarklet, you can quickly preview how MVP.css looks when applied to any HTML page.)
[0]: https://github.com/dohliam/dropin-minimal-css [1]: https://dohliam.github.io/dropin-minimal-css/?mvp
https://wmeredith.github.io/MercuryCSS/
EDIT: Ha! I should have checked first. It was added in Feb 2018 :)
[0]: https://github.com/dohliam/dropin-minimal-css/blob/gh-pages/...
> - Andy Brewer, Author of MVP.css
Haha, that sold me.
However, it seriously looks like this could be pretty useful. I’m lazy, and the idea of just writing some semantic markup and have it look great out of the box is very appealing. Especially for a random toy project, where I want to put as little effort into the front end design as possible.
Although the targeting is MVPs as you also mention on the site, it could possibly evolve to a very powerful HTML/CSS framework, far more than setting up a MVP :)
What I'd like to throw in as an idea is that in a future v2 of mvp.css you could consider using custom HTML tags to allow for inserting new tags in the mix for better positioning/layout, typography and more.
Again, this is just an idea. If anyone's to learn 200 CSS classes to use something like Tailwind (et al), they might as well learn custom (prefixed) HTML tags that potentially make more sense.
And as for search engines, technically speaking it doesn't matter to them if you use custom HTML. SEO-wise, if one wants to be Google-friendly, it's either way preferable to use structured data over semantic HTML.
> you could consider using custom HTML tags to allow for inserting new tags in the mix for better positioning/layout, typography and more.
That might work for another stylesheet project, but I'm trying to keep MVP.css as "add and forget" as possible without having to learn anything unique.
While I appreciate the dogfooding and clever presentation style, it's adding some unnecessary steps when I want to see how you chose to style specific elements.
Regardless of how you feel about Bootstrap, I think their documentation[0] does this well. water.css[1] linked in another reply here does it even better (admittedly it's less complex).
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sa...
I was even more surprised to see it in the HTML 4.01 spec, but if you look it makes more sense. I'll quote every mention of it here but the table of contents line:
9.2.1 Phrase elements: EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, and ACRONYM
<!ENTITY % phrase "EM | STRONG | DFN | CODE |
SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
SAMP:
Designates sample output from programs, scripts, etc.
CODE is equally well defined -- neither even mention monospace!> The other phrase elements have particular significance in technical documents
HTML never ceases to amaze me. This also explains why I still prefer <pre> even though I can never remember why it's <pre> and not <code>.
Almost forgot the link: https://www.w3.org/TR/html401/struct/text.html#h-9.2.1
Edit: props for citing the actual HTML 4.01 SGML DTD!
I pointed out the irony of not giving an example|intended use in a technical document because if a line or two like that was in the HTML 4.01 specification I probably would have written more-correct HTML since sometime in the early-mid ~2000s. I guess I'm glad my reading comprehension has improved but it also shows pretty clearly why it's the old spec.
Put another way, when I learned a lot of the HTML we all use every day there was no HTML5.
By agreeing with the original reply and looking into why, I saw that it was defined in a specification I have read several times (HTML 4.01[0]). I knew CODE being vague was a thing and was part of why I didn't use it much, so seeing SAMP was similar explained why it would have slipped my mind or I totally glossed over it.
Another reply pointed out that <pre> is the block-level styling element I want and that <code> or <samp> make more semantic sense inline and nested. This does make sense to me and I thought it was funny that in a technical document like an HTML specification they would note the importance of the elements in technical documents but not give any example or further explanation.
Yet another reply corrected me again, that SAMP is defined with a monospace font-family in the CSS2 specification[1]! Now I can complete why I used to be wrong and now am not: <pre> always worked by default to get a monospace font and preserve literal whitespace in rendering. <samp> may have, I'd be interested to know but not interested enough to do research into old browsers' specific rendering. The entire <samp> thing was effectively unknown to me. <code>, while similarly defined in HTML, did not have that default font set and thus would not work in a spec-compliant browser by default unless they extended the specification in that browser. That is why in my head I used to prefer <pre> over <code> and that was all; and also why I enjoy posting in communities like these!
> If I'm not mistaken, even Google amp is considered valid HTML5?
So far as I know (I haven't kept up with this level of detail in AMP) it is entirely implemented via some subset of HTML/JS/CSS: presumably any Google AMP would then include valid HTML5.
[0]: linked in my original post
And <code> isn't defined at all! I'm not disputing this is all internally consistent or that I used to write what I'm now learning is incorrect HTML, this completely explains what I used to know about the tags and I love it:
I didn't know or forgot <samp> was a thing for whatever reason. I know HTML5 is big and I don't know it all, HTML4 is much less so and I usually do.
I always prefer <pre> when I'm writing HTML to show intentionally-monospace blocks like code or code output because <code> is inconsistent, importantly for me it meant sometimes it didn't|doesn't work. Here I now know why: The CSS2 stylesheet doesn't define anything for <code>!
Other replies have described how it makes more literal/semantic sense to nest these things together and I agree completely; many times I am surprised at how elegant these old specifications are, if indirectly.
pre, tt, code,
kbd, samp { font-family: monospace }
?(I’ve filed https://github.com/andybrewer/mvp/issues/1 about this now.)
https://chrismorgan.info/blog/rust-fizzbuzz/ demonstrates use of <pre><code>, <pre><samp> and <code>, though not just <samp> or <pre>. (I use bare <pre> elsewhere on my site, but haven’t had cause to use bare <samp> yet.) What can I say? I’m a snob. Also there are subtle differences in style between the two. (I have <samp> be truly monospaced, because terminal output is more typically visually aligned, but <code> be only mostly monospaced, because it’s seldom visually aligned and I find Triplicate’s Poly variant generally nicer for code reading.)
Also potentially of interest to you: <output>. Plenty of other interesting semantic tags to use or not, as well. I like to use <var> carefully.
Do you have a go-to reference for tags and their meaning?
This blog post is actually a great intro to rust too :)
One example is this "hidden" gem. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ma...
Thank you! I'll take a look today.
And pull requests are always welcome.
I usually go for water.css [0] which had been posted in Show HN here earlier [1].
But the use of <section> and <asides> really helps in placing elements one beside another.
Will try this for sure.
Remember the days when you simply had to add bootstrap to your website to make it look great?
Now I feel like anytime I start a new project and want to add some simple, light styling, it is just impossible to find anything. bootstrap is pretty convoluted and I can't figure out which bootstrap lib to use with react, and everything else seems to be built for the next facebook.
I just want something simple with some form elements and layouts pre designed and easy to modify.
Two things I think could be improved:
1. You should consider using a CDN instead of GitHub pages to host the stylesheet on the demo template. Here is an example [0].
2. In the future it might be cool to explore the `prefers-color-scheme` media query so pages are responsive to color schemes too [1].
[0] https://cdn.jsdelivr.net/gh/andybrewer/mvp/mvp.css
[1] https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pref...
Half the reason why most websites look awful is because somebody tried to be too clever and missed an edge case. Basic HTML renders fine in most cases.
(this is a jest of course, you can have a fast and pleasing website, but pure HTML only gives one)
https://developers.google.com/speed/pagespeed/insights/?url=...
Maybe a better RTL support could be added as an extension in later versions.
Ok, it got me hook on the just use the standard tags concept, but the above quote implies, this shouldn’t go into production.
Is that accurate?
It's more to help you launch quickly so you can test an idea, like a hackathon, side project or MVP.
That said I have had to defend non-framework CSS to other front end developers in the wild, who insist that material design, bootstrap or whatever is worth writing all this CSS your self.
1. i'm using firefox and the select dropdown isn't styled so it looks like the plain old unstyled select.
2. i don't see anywhere on the page where it shows all of the elements and what they will look like as an example, like bootstrap does. that example form at the bottom doesn't cut it as far as i'm concerned.
Lightshot what you're seeing, maybe i'm crazy.