JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 21852
  • Score
    100M100P100Q130870F
  • License MIT

css-in-js. again.

Package Exports

  • glam
  • glam/babel

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (glam) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

glam

experimental

npm install glam

  • super fast + small (<2k gz)
  • create real css files
  • future facing css : nested selectors, autoprefixing, etc
  • real dynamic props / @apply!
  • Make Alex Happy (tm)

input -

// index.js

import css from 'glam'

let myColor = '#ab67ee'
let radius = '20px'

let myClass = css`
  color: red;
  &:hover {
    font-weight: bold;
    color: ${myColor};
    border-radius: ${radius};
  }
`
// ...
<div class={myClass}>
  what up homies
</div>
`

output -

// index.js

import css from 'glam'

let myColor = '#ab67ee'
let radius = '20px'

let myClass = css('css-1bh6s', [myColor, rad]) 
// generates "css-1bh6s vars-h23psd"
/* index.js.css */

.css-1bh6s {
  color: red
}
.css-1bh6s:hover {
  font-weight: bold;
  color: var(--css-1bh6s-0);
  border-radius: var(--css-1bh6s-1);
}
/* dynamically added */
.vars-h23psd {
  --css-1bh6s-0: #ab67ee;
  --css-1bh6s-1: 20px;
}

fragments

glam lets you define reusable css fragments that can be mixed in with css and fragment definitions

import css, {fragment} from 'glam'
let huge = 100, 
  tiny = 6

let bold = fragment` 
  display: flex; 
  font-weight: bold;` 

let big = fragment` 
  @apply ${bold}; 
  font-size: ${huge}`

let small = fragment` 
  font-size: ${tiny}`

<div className={css` 
  @apply ${props.error ? big : small}; 
  color: red 
`}>
  compose all your classes!
</div>

debugging

pass a name to generate readable classnames

let cls = css`
  name: big;
  font-size: 40px;
`
// big-f8xd3

motivation

this lib was designed to leverage compile-time to provide great DX, and ship only enough js as required for the interactive portions.

nice things

  • extract out as much static css as possible, before delegating the dynamic bits to javascript
  • true composition with css vars / @apply
  • friendly with server side / static rendering
  • backward compatible with older browsers (serve the right bundle!)
  • free DCE/async loading/etc via webpack ecosystem

how does it work?

like so

caveats

  • interpolated property values can't be 'processed', which should be fine?

usage

  • add glam/babel to your babel plugins
  • add glam/loader to webpack's css loaders
  • ???
  • profit

plugin options

glam can 'polyfill' for browsers that don't support css vars and / or @apply. fancy! you could then generate separate bundles targeting different browsers.

  • inline - bool - default false

loading css

add require('./path/to/file.js.css') statements as required. some options to bundle and serve this css -

  • use a classic webpack combo: style-loader/css-loader
  • use file-loader and load it with link tags and/or @import
  • use glam/loader
  • (todo) - use glam/server to extract 'precise' css from html

I hope to make this simpler.

bonus - high perf react variant

for stuff like animations, you could define your own css variant, further bringing down runtime cost

(react@16.alpha-11 and above)

function css(cls, vars = []){
  return {
    className: cls,
    style: vars.reduce((o, v, i) => 
      (o[`--${cls}-${i}`] = v, o), {})
  }
}

// ...

<div {...css` font-weight:bold; color: ${props.color}; `}>
  hello!
</div>

todo

  • web components, shadow dom et al
  • keyframes, fonts, imports, globals
  • more features from cssnext
  • ssr
  • custom postcss pipeline
  • source maps?
  • typed om?
  • SC api?
  • unload styles?
  • hot loading support
  • test inheritance chains

previous work

thanks