All Projects → alekseykulikov → injected-css

alekseykulikov / injected-css

Licence: MIT license
{:;} CSS in JS

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to injected-css

emitty
A platform for finding dependencies between files and building tools for incremental compilation or build.
Stars: ✭ 69 (+283.33%)
Mutual labels:  postcss
prepublish
Simplifies the prepare step (bundling, transpiling, rebasing) during publishing NPM packages.
Stars: ✭ 21 (+16.67%)
Mutual labels:  postcss
postcss-styled
PostCSS syntax for parsing styled components
Stars: ✭ 53 (+194.44%)
Mutual labels:  postcss
postcss-will-change-transition
PostCSS plugin to add will-change property after transition declarations
Stars: ✭ 15 (-16.67%)
Mutual labels:  postcss
ship
A toolkit for makers to ship better products faster 🚀
Stars: ✭ 68 (+277.78%)
Mutual labels:  postcss
webpack-html-boilerplate
Boilerplate for building html templates
Stars: ✭ 17 (-5.56%)
Mutual labels:  postcss
postcss-czech-stylesheets
PostCSS plugin for writing Czech Style Sheets
Stars: ✭ 47 (+161.11%)
Mutual labels:  postcss
postcss-windicss
PostCSS integrations for Windi CSS
Stars: ✭ 33 (+83.33%)
Mutual labels:  postcss
bb8
Starter kit for automating tasks in everyday front-end development. 👨🏻‍💻 ⚡️ 🛠 ✨ 🤖
Stars: ✭ 13 (-27.78%)
Mutual labels:  postcss
criteria-of-quality-frontend
Критерии качественной вёрстки (разметка, стилизация, картинки, шрифты, автоматизация и пр.)
Stars: ✭ 26 (+44.44%)
Mutual labels:  postcss
postcss
No description or website provided.
Stars: ✭ 59 (+227.78%)
Mutual labels:  postcss
postcss-purgecss
PostCSS plugin for purgecss
Stars: ✭ 92 (+411.11%)
Mutual labels:  postcss
styled-jsx-plugin-postcss
Plugin to add PostCSS support to styled-jsx.
Stars: ✭ 86 (+377.78%)
Mutual labels:  postcss
atom-language-postcss
Atom language support for PostCSS
Stars: ✭ 55 (+205.56%)
Mutual labels:  postcss
postcss-redundant-color-vars
⚒️ PostCSS plugin that fixes a bug in safari when using custom properties in certain color declarations.
Stars: ✭ 11 (-38.89%)
Mutual labels:  postcss
bowman
A simple static site generator with an integrated toolchain for efficient development and delivery.
Stars: ✭ 17 (-5.56%)
Mutual labels:  postcss
abilitysheet
This app is ability sheet for beatmania iidx music of level 12.
Stars: ✭ 38 (+111.11%)
Mutual labels:  postcss
bootstrap-shopify-theme
🛍 A free Shopify Theme built with Bootstrap, BEM, Liquid, Sass, ESNext, Theme Tools, ... and Webpack.
Stars: ✭ 41 (+127.78%)
Mutual labels:  postcss
craft3-webpack5-tailwind2-boilerplate
A real-world boilerplate for Craft CMS 3 projects that leverages Wepback 5, Tailwind 2, PostCSS 8, and has a hot-reload dev environment. Now with dynamic imports, asynchronous chunk loading, and legacy vs modern browser support!
Stars: ✭ 44 (+144.44%)
Mutual labels:  postcss
postcss-prefixwrap
A PostCSS plugin that is used to wrap css styles with a css selector to constrain their affect on parent elements in a page.
Stars: ✭ 54 (+200%)
Mutual labels:  postcss

{:;} injected-css

Structured way to write CSS in JS file.

Usage

Install the package:

$ npm install injected-css

Add injected-css/babel to plugins section in your babel config:

{
  "plugins": [
    "injected-css/babel"
  ]
}

Define real CSS in your JS file using css{} template expression, and refer to resulted classes using style object.

import { css } from 'injected-css'
import { red, white, mobile } from '../my-theme' // use js variables

const style = css`
  text-align: center;

  &-button {
    background-color: ${red};
    width: 32rem;
    padding: 2rem;
    border-radius: 0.5rem;
    border: none;

    &:hover {
      background-color: ${white};
    }

    @media ${mobile} {
      width: 16rem;
    }
  }
`

document.innerHTML = `
  <div class="${style}">
    <button class="${style.button}">Click me!</button>
  </div>
`

It transforms to:

import { css } from 'injected-css';
import { red, white, mobile } from '../my-theme';

const style = css.inject({
  toString() { return 'c3423985940'; },
  button: 'c3423985940-button',
  _css: `.c3423985940 { text-align: center } .c3423985940-button { background-color: ${red}; width: 32rem; padding: 2rem; border-radius: 0.5rem; border: none
  } .c3423985940-button:hover { background-color: ${white} } @media ${mobile} { .c3423985940-button { width: 16rem } }`  
});

document.innerHTML = `
  <div class="${style}">
    <button class="${style.button}">Click me!</button>
  </div>
`;

Benefits

  • Write real CSS and use JS for import/export, variables and dynamic strings
  • Use powerful tools of JS world
    • ES modules to manage dependencies between styles and JS components
    • Eslint to ensure, it's hard to write bad CSS
    • Variables and functions
    • Webpack 2, Hot Module Replacement, code splitting, and server side render
  • Built-in naming convention for component world
  • Postcss integration (100s of plugins and custom syntaxes like SASS)
  • Minimal overhead (no parsing cost, 400 byte runtime)

Custom postcss config

Just create .postcssrc.js file with content similar to (read more about postcss config):

module.exports = (ctx) => ({
  plugins: [
    require('postcss-cssnext')({ 'features': { 'rem': false } }),
    ctx.env === 'production' ? require('cssnano')({ autoprefixer: false }) : false
  ]
})

Inject global styles

Use inject() method to insert global css string. Everything tagged literal with css`` will be preparsed with postcss.

import { inject, css } from 'injected-css'
import normalizeCss from 'normalize.css'
import { mobile } from '../my-theme';

// insert regular css, like normalize.css

inject(normalize)

// setup global typography

inject(css`
  html {
    font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
    font-weight: normal;
    font-size: 62.5%; /* 1rem ~ 10px */

    @media ${mobile} {
      font-size: 56.25%; /* 1rem ~ 9px */
    }
  }
`)

Server side render

Use flush() method to get all css calls.

import { flush } from 'injected-css'
import { App } from './App'

const body = renderToStaticMarkup(<App />)
const css = reset._css + flush().join('')

const html = `
  <!doctype html>
  <html lang='en-US'>
    <head>      
      <title>My App</title>
      <style>${css}</style>
    </head>
    <body>
      ${body}
    </body>
  </html>
`

const reset = inject(css`
  html {
    -ms-text-size-adjust: 100%;
    -webkit-text-size-adjust: 100%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  }

  body {
    margin: 0;
  }
`)

Syntax highlight

Atom with language-babel plugin supports syntax highlight and autocompletion by default. atom-language-babel

Credits

  • BEM and SUIT CSS - for name convention, that works
  • CSS modules - for embracing CSS syntax and adding the way to reference on classes from JS code
  • style-loader - for concept of loading styles with js
  • styled-jsx - for idea of babel plugin and this credits section
  • @rtsao - for his open-source work on many css-in-js libraries
  • styling - for embracing ES modules to export CSS
  • react - for component approach and development philosophy
  • CSS: The Definitive Guide - for explaining me details of CSS
  • styled-components - for showing how to highlight CSS in tagged template literal

License

MIT

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].