Euphoric CSS styling utility library for CSS-in-JS projects
To view examples of how to use Euphoria, check out the Examples site!
This library contains a collection of building blocks for assembling web UIs that are common across most applications. The helpers include:
- All - return all Euphoria utils with optional mappings
- Alignment
- Float:
.float-left,.float-right,.float-none - Alignment:
.align-top,.align-middle,.align-basline, etc... - Text:
.text-right,.text-center,.text-justify, etc... - Sizes:
.full-widthand.full-height - Position:
.position-absolute,.position-relative,.position-fixed - Flexbox:
.flex-row,.align-items-center,.justify-content-start, etc...
- Float:
- Colors
- Text colors:
.text-primary,.text-white,.text-gray-dark, etc... - Background:
.bg-info,.bg-danger,.bg-gray-lightest, etc...
- Text colors:
- Display
- Display:
.display-none,.display-block,.display-flex, etc... - Visibility:
.visible,.invisible
- Display:
- Spacing
- Padding:
.p-xl,.px-none,.pl-xxs, etc... - Margins:
.m-md,.mx-auto,.my-none, etc...
- Padding:
- Text
- Transforms:
.text-uppercase,.text-lowercase,.text-capitalize - Sizes:
.text-xxs,.text-xs,.text-sm,.text-md, etc... - Style:
.text-bold,.text-italic,.text-normal - Decoration:
.text-underline,.text-line-through
- Transforms:
Euphoria provides common styling classes for creating user interfaces in CSS-in-JS projects. All Euphoria functions return a collection of CSS classes as a String that can be injected into a webpage, for example using glamor (which all the following examples refer to). You can use Euphoria however you like of course.
Most of the code that makes up Euphoria is quite simple, have a look at the euphoria directory to learn more about how this all works.
With yarn:
yarn add euphoriaWith npm:
npm i -S euphoriaimport euphoria from 'euphoria'
import { css } from 'glamor'
// Include everything:
css.insert(euphoria.all())
// or just a certain utils:
css.insert(euphoria.alignment())
css.insert(euphoria.display())
// etc...You can of course also just import the utils you want like:
import { colors } from 'euphoria'
import { css } from 'glamor'
css.insert(colors())Usage: euphoria.all([mappings])
If you call euphoria.all() it will return all the below utilities together with default mappings:
import { css } from 'glamor'
import { all } from 'euphoria'
css.insert(all())You can pass in custom mappings also:
import { css } from 'glamor'
import { all } from 'euphoria'
css.insert(
all({
colors: {
angry: 'red',
happy: 'green',
},
spacing: {
tiny: '0.2rem',
huge: '4rem',
},
text: {
tiny: '0.6rem',
huge: '3rem',
},
})
)These mapping will get passed directly to the helpers below based on the key (eg colors, spacing, etc)
Usage: euphoria.alignment()
import { css } from 'glamor'
import { alignment } from 'euphoria'
css.insert(alignment())Will result in:
/* Text alignment */
.text-left { text-align: left !important; }
.text-right { text-align: right !important; }
.text-center { text-align: center !important; }
.text-justify { text-align: justify !important; }
/* Vertical alignment */
.align-baseline { vertical-align: baseline !important; }
.align-top { vertical-align: top !important; }
.align-middle { vertical-align: middle !important; }
.align-bottom { vertical-align: bottom !important; }
.align-text-top { vertical-align: text-top !important; }
.align-text-bottom { vertical-align: text-bottom !important; }
/* Floats */
.float-left { float: left !important; }
.float-right { float: right !important; }
.float-none { float: none !important; }
/* Sizing */
.position-relative { position: relative !important; }
.position-absolute { position: absolute !important; }
.position-fixed { position: fixed !important; }
/* Sizing */
.full-height { height: 100% !important; }
.full-width { width: 100% !important; }
/* Flexbox direction */
.flex-row { flex-direction: row !important; }
.flex-column { flex-direction: column !important; }
.flex-column-reverse { flex-direction: column-reverse !important; }
/* Flexbox justification */
.justify-content-start { justify-content: flex-start !important; }
.justify-content-end { justify-content: flex-end !important; }
.justify-content-center { justify-content: center !important; }
.justify-content-between { justify-content: space-between !important; }
.justify-content-around { justify-content: space-around !important; }
/* Flexbox align items */
.align-items-start { align-items: flex-start !important; }
.align-items-end { align-items: flex-end !important; }
.align-items-center { align-items: center !important; }
.align-items-baseline { align-items: baseline !important; }
.align-items-stretch { align-items: stretch !important; }
/* Flexbox align self */
.align-self-start { align-self: flex-start !important; }
.align-self-end { align-self: flex-end !important; }
.align-self-center { align-self: center !important; }
.align-self-baseline { align-self: baseline !important; }
.align-self-stretch { align-self: stretch !important; }
/* Flexbox align content */
.align-content-start { align-content: flex-start !important; }
.align-content-end { align-content: flex-end !important; }
.align-content-center { align-content: center !important; }
.align-content-stretch { align-content: stretch !important; }
.align-content-between { align-content: space-between !important; }
.align-content-around { align-content: space-around !important; }
/* Flexbox wrapping */
.flex-wrap { flex-wrap: wrap !important; }
.flex-wrap-reverse { flex-wrap: wrap-reverse !important; }
.flex-nowrap { flex-wrap: nowrap !important; }
/* Flexbox ordering */
.flex-first { order: -1 !important; }
.flex-last { order: 1 !important; }Usage: euphoria.colors([colorsMapping])
import { css } from 'glamor'
import { colors } from 'euphoria'
css.insert(colors())Will result in:
/* Text colors */
.text-primary { color: lightseagreen !important; }
.text-success { color: forestgreen !important; }
.text-muted { color: gray !important; }
.text-info { color: teal !important; }
.text-warning { color: orange !important; }
.text-danger { color: crimson !important; }
/* Background colors */
.bg-primary { background: lightseagreen !important; }
.bg-success { background: forestgreen !important; }
.bg-info { background: teal !important; }
.bg-muted { background: gray !important; }
.bg-warning { background: orange !important; }
.bg-danger { background: crimson !important; }
.bg-muted { background: gray !important; }You can pass in your own color mappings like:
euphoria.colors({
angry: 'red',
happy: 'green',
})Which will return:
/* Text colors */
.text-angry { color: red !important; }
.text-happy { color: green !important; }
/* Background colors */
.bg-angry { background: red !important; }
.bg-happy { background: green !important; }Usage: euphoria.display()
import { css } from 'glamor'
import { display } from 'euphoria'
css.insert(display())Results in:
/* Display */
.display-block { display: block !important; }
.display-inline { display: inline !important; }
.display-inline-block { display: inline-block !important; }
.display-flex { display: flex !important; }
.display-inline-flex { display: inline-flex !important; }
.display-none { display: none !important; }
/* Visibility */
.visible { visibility: visible !important; }
.invisible { visibility: hidden !important; }Usage: euphoria.spacing([spacingMapping])
import { css } from 'glamor'
import { spacing } from 'euphoria'
css.insert(
spacing({
sm: '0.5rem',
md: '1rem',
lg: '2rem',
})
)Now you will have the following classes available to you:
/* Padding */
.p-none { padding: 0 !important; }
.p-sm { padding: 0.5rem !important; }
.p-md { padding: 1rem !important; }
.p-lg { padding: 2rem !important; }
.pb-none { padding-bottom: 0 !important; }
.pb-sm { padding-bottom: 0.5rem !important; }
.pb-md { padding-bottom: 1rem !important; }
.pb-lg { padding-bottom: 2rem !important; }
.pl-none { padding-left: 0 !important; }
.pl-sm { padding-left: 0.5rem !important; }
.pl-md { padding-left: 1rem !important; }
.pl-lg { padding-left: 2rem !important; }
.pr-none { padding-right: 0 !important; }
.pr-sm { padding-right: 0.5rem !important; }
.pr-md { padding-right: 1rem !important; }
.pr-lg { padding-right: 2rem !important; }
.pt-none { padding-top: 0 !important; }
.pt-sm { padding-top: 0.5rem !important; }
.pt-md { padding-top: 1rem !important; }
.pt-lg { padding-top: 2rem !important; }
.px-none { padding-left: 0 !important; padding-right: 0 !important; }
.px-sm { padding-left: 0.5rem !important; padding-right: 0.5rem !important; }
.px-md { padding-left: 1rem !important; padding-right: 1rem !important; }
.px-lg { padding-left: 2rem !important; padding-right: 2rem !important; }
.py-none { padding-top: 0 !important; padding-bottom: 0 !important; }
.py-sm { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; }
.py-md { padding-top: 1rem !important; padding-bottom: 1rem !important; }
.py-lg { padding-top: 2rem !important; padding-bottom: 2rem !important; }
/* Margins */
.m-none { margin: 0 !important; }
.m-sm { margin: 0.5rem !important; }
.m-md { margin: 1rem !important; }
.m-lg { margin: 2rem !important; }
.m-auto { margin: auto !important; }
.mb-none { margin-bottom: 0 !important; }
.mb-sm { margin-bottom: 0.5rem !important; }
.mb-md { margin-bottom: 1rem !important; }
.mb-lg { margin-bottom: 2rem !important; }
.mb-auto { margin-bottom: auto !important; }
.ml-none { margin-left: 0 !important; }
.ml-sm { margin-left: 0.5rem !important; }
.ml-md { margin-left: 1rem !important; }
.ml-lg { margin-left: 2rem !important; }
.ml-auto { margin-left: auto !important; }
.mr-none { margin-right: 0 !important; }
.mr-sm { margin-right: 0.5rem !important; }
.mr-md { margin-right: 1rem !important; }
.mr-lg { margin-right: 2rem !important; }
.mr-auto { margin-right: auto !important; }
.mt-none { margin-top: 0 !important; }
.mt-sm { margin-top: 0.5rem !important; }
.mt-md { margin-top: 1rem !important; }
.mt-lg { margin-top: 2rem !important; }
.mt-auto { margin-top: auto !important; }
.mx-none { margin-left: 0 !important; margin-right: 0 !important; }
.mx-sm { margin-left: 0.5rem !important; margin-right: 0.5rem !important; }
.mx-md { margin-left: 1rem !important; margin-right: 1rem !important; }
.mx-lg { margin-left: 2rem !important; margin-right: 2rem !important; }
.mx-auto { margin-left: auto !important; margin-right: auto !important; }
.my-none { margin-top: 0 !important; margin-bottom: 0 !important; }
.my-sm { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; }
.my-md { margin-top: 1rem !important; margin-bottom: 1rem !important; }
.my-lg { margin-top: 2rem !important; margin-bottom: 2rem !important; }
.my-auto { margin-top: auto !important; margin-bottom: auto !important; }Calling spacing without arguments will get you the default spacing mapping, which is:
{
xxs: '0.25rem',
xs: '0.5rem',
sm: '0.75rem',
md: '1rem',
lg: '1.75rem',
xl: '3.25rem',
xxl: '5rem',
}We automatically inject none classes for padding and spacing (eg .p-none { padding: 0 !important; }) and auto classes for margins (eg .m-auto { margin: auto !important; }) since they are so commonly needed.
Usage: euphoria.text()
import { css } from 'glamor'
import { text } from 'euphoria'
css.insert(text())Will result in:
/* Font sizes */
.text-xxs { font-size: 0.7rem !important; }
.text-xs { font-size: 0.8rem !important; }
.text-sm { font-size: 0.9rem !important; }
.text-md { font-size: 1rem !important; }
.text-lg { font-size: 1.25rem !important; }
.text-xl { font-size: 1.5rem !important; }
.text-xxl { font-size: 2rem !important; }
.text-xxxl { font-size: 3rem !important; }
/* Text transforms */
.text-uppercase { text-transform: uppercase !important; }
.text-lowercase { text-transform: lowercase !important; }
.text-capitalize { text-transform: capitalize !important; }
/* Text decoration */
.text-line-through { text-decoration: line-through !important; }
.text-underline { text-decoration: underline !important; }
/* Font style */
.text-normal { font-style: normal !important; }
.text-bold { font-style: bold !important; }
.text-italic { font-style: italic !important; }To override default font styles, pass in a configuration object:
import { css } from 'glamor'
import { text } from 'euphoria'
css.insert(text({ tiny: '0.3rem', huge: '3rem' }))Will result in:
/* Font sizes */
.text-tiny { font-size: 0.3rem !important; }
.text-huge { font-size: 3rem !important; }
/* Text transforms */
/* ...same as above... */
/* Text decoration */
/* ...same as above... */
/* Font style */
/* ...same as above... */- Add
.position-absolute,.position-relativeand.position-fixedalignment helpers
- Add
.full-heightand.full-widthalignment helpers
- Add
.flex-row-reversedirection
- Use autoprefixer to add vendor prefixes as necessary.
- Finish adding examples to example site
- Fix
.text-bold
- Further improve example site.
- Add examples site
- Add
mutedcolor to defaults
- Add text decoration and font styles
- BREAKING: Rename
typetotext - Cleanup readme
- Make
font-sizehelpers
- Make type helpers use
!importantflag.
- Add "text-transform" helpers.
- Set
!importantflag for color styles.
- Update readme.
- Update readme.
- Bump to v1 because npm wasn't allowing minor versions...?
- Move to CSS-in-JS implementation
- Add alignment, display, colors, spacing helpers
- Initial prototype
PRs welcome!
- Please run
prettier --no-semi --single-quote --trailing-comma es5on all code before submitting. - Please write tests for your code! (coming soon 😅)
- If you're updating examples, make sure to run
npm run build-examplesand commit compiled changes before submitting a PR.
MIT
