All Projects → dan-lee → glamor-jss

dan-lee / glamor-jss

Licence: MIT license
Use glamor flavored CSS with jss under the hood…

Programming Languages

javascript
184084 projects - #8 most used programming language
CSS
56736 projects

Projects that are alternatives of or similar to glamor-jss

gloss
a powerful style system for building ui kits
Stars: ✭ 16 (-15.79%)
Mutual labels:  cssinjs, jss
csstox
Convert CSS text to a React Native/JSS stylesheet object with ease.
Stars: ✭ 72 (+278.95%)
Mutual labels:  cssinjs, jss
Jss
JSS is an authoring tool for CSS which uses JavaScript as a host language.
Stars: ✭ 6,576 (+34510.53%)
Mutual labels:  cssinjs, jss
vue-component-style
A Vue mixin to add style section to components.
Stars: ✭ 16 (-15.79%)
Mutual labels:  cssinjs, jss
gatsby-starter-simple-landing
A simple, ready to use, easy to customize landing page starter for GatsbyJS with auto generated (sizes & types) Hero images.
Stars: ✭ 45 (+136.84%)
Mutual labels:  jss
get-css-data
A micro-library for collecting stylesheet data from link and style nodes
Stars: ✭ 29 (+52.63%)
Mutual labels:  cssom
Styletron
⚡ Toolkit for component-oriented styling
Stars: ✭ 3,217 (+16831.58%)
Mutual labels:  cssinjs
tsstyled
A small, fast, and simple CSS-in-JS solution for React.
Stars: ✭ 52 (+173.68%)
Mutual labels:  jss
JSS-Resource-Tools
A CLI utility that utilises the Jamf Pro (previously Casper Suite) API in order to import, export and update JSS resources en-masse.
Stars: ✭ 24 (+26.32%)
Mutual labels:  jss
A Journey Toward Better Style
A Journey toward better style
Stars: ✭ 245 (+1189.47%)
Mutual labels:  jss
fractal-component
A javascript library that can help you to encapsulate decoupled UI component easily
Stars: ✭ 13 (-31.58%)
Mutual labels:  jss
jss-material-ui
A enhanced styling engine for material-ui
Stars: ✭ 15 (-21.05%)
Mutual labels:  jss
HTML5-Space-Invaders
A Space Invaders HTML5 porting. This work is licensed under a Creative Commons Attribution - Share Alike 3.0 - Unported license (CC BY-SA 3.0). The text of the license is available at http://creativecommons.org/licenses/by-sa/3.0/ .
Stars: ✭ 36 (+89.47%)
Mutual labels:  cssom
Css In Js
React: CSS in JS techniques comparison
Stars: ✭ 5,388 (+28257.89%)
Mutual labels:  cssinjs
injected-css
{:;} CSS in JS
Stars: ✭ 18 (-5.26%)
Mutual labels:  cssinjs
pigment
A powerful library that provides color-conversions, palette/scheme generation, color manipulation and many more features intended to provide a great UX.
Stars: ✭ 23 (+21.05%)
Mutual labels:  cssinjs
enlite-starter
Enlite Starter - React Dashboard Starter Template with Firebase Auth
Stars: ✭ 28 (+47.37%)
Mutual labels:  jss
vue-jss-plugin
JSS plugin implementation for Vue.js
Stars: ✭ 24 (+26.32%)
Mutual labels:  jss
aphrodite-jss
Aphrodite-like API on top of JSS.
Stars: ✭ 92 (+384.21%)
Mutual labels:  jss
sitecore-headless-commerce-accelerator
EPAM Headless Commerce Accelerator for Sitecore Experience Commerce
Stars: ✭ 35 (+84.21%)
Mutual labels:  jss

glamor-jss

Build Status

Use glamor flavored CSS with jss under the hood…

Install

yarn add glamor-jss

Features

  • 📦 Zero configuration (just like glamor).
  • ⚡️ Server side rendering ready.
  • 💭 Caching mechanisms
  • 🕸 Hoist static style rules with babel plugin.
  • 🏎💨 Blazing fast, thanks to JSS behind scenes.
  • 📝 Well tested

Reasoning

I'm a big fan of glamor. Unfortunately it seems like a stale project, but I don't want to give up on it just yet. my idea was to keep the simple and hands on usage of glamor and back it up with something bigger in the background.

That's why I created glamor-jss. It's not a plugin but more kind of like a wrapper around it.

I wanted it to be fast. And I wanted it to be smart.

Of course I couldn't lift these heavy tasks all alone. I did some thorough research to back up this project with a bunch of great other projects:

  • hash-it: fast object hashing to cache the 💩 out of it.
  • memoize-weak: combined with the hoisting plugin for babel this produces even better caching possibilites (uses WeakMap if possible).

and of course, let's not forget

  • jss: Does all the heavy lifting in the CSSOM

This is by no means feature complete and only supports the CSS object definition (e.g.: css({ width: 100 })) for now. I don't plan to support string templates.

API wise for now it supports:

  • css object spreading
  • css as class names
  • css.keyframes
  • Babel hoisting (glamor-jss/hoist)
  • renderToString Server side rendering

This is all I needed for now, but I am happy to extend it further or accept PRs

Just want to try it out?

There's a codeshift which will replace all glamor imports with glamor-jss imports.
Be aware that only a limited set of the glamor API is available (see above).

Just run

jscodeshift -t glamor-jss/codeshift.js src

Usage

🎊 See the demo 🎉 (and the according source)

For further documentation on how to declare styles, I'd like to refer to the glamor API guidelines.

🍨 Vanilla

import css from 'glamor-jss'
// oldschool require:
// const css = require('glamor-jss').default

const myClass = css({ color: 'red' })
document.body.innerHTML = `<div class="${myClass}">RED 🎈</div>`

🔋 React

import React from 'react'
import { css } from 'glamor-jss'

const AwesomeComponent = () => (
  <div {...css({ color: 'red' )}>RED 🎈</div>

  // or as CSS class:
  // <div className={css({ color: 'red' )} />
)

💁‍♀️ Server side rendering (SSR)

It's easy to add the generated styles on the server side (see example/src/server.js):

// …
import ReactDOMServer from 'react-dom/server'
import { renderToString } from 'glamor-jss'

// … eventually
const html = ReactDOMServer.renderToString(<App />)
response.send(`
  <!doctype html>
  <html>
    <style id="ssr">${renderToString()}</style>
    <div id="root">${html}</div>
  </html>
`)

On client side you can then easily remove this style tag (see example/src/client.js):

ReactDOM.hydrate(<App />, document.getElementById('root'), () => {
  const ssr = document.getElementById('ssr')
  ssr.parentNode.removeChild(ssr)
})

🐠 Babel plugin

// .babelrc
{
  "plugins": ["glamor-jss/hoist"]
}

What does it do? 🤔

Every statically declared rule will be moved to the outermost scope. This opens up the possibility for heavy caching.

For example:

In

import css from 'glamor-jss'

const Component = props => (
  <div {...css({ width: 100, height: 100 })}>
    <div {...css({ ':after': { content: "'*'" } })} />
	<div {...css({ background: props.background })} />
  </div>
)

Out

import css from 'glamor-jss'

var _ref = { width: 100, height: 100 };
var _ref2 = { ':after': { content: "'*'" } };

const Component = props => (
  <div {...css(_ref)}>
    <div {...css(_ref2)} />
	<div {...css({ background: props.background })} />
  </div>
)
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].