Code Monkey home page Code Monkey logo

vue-emotion's Introduction

vue-emotion

NPM version NPM downloads CircleCI donate

emotion is the Next Generation of CSS-in-JS.

Install

yarn add @egoist/vue-emotion

Table of Contents

Usage

Use the plugin:

import { VueEmotion } from '@egoist/vue-emotion'

Vue.use(VueEmotion)

Create your styled component:

import { styled } from '@egoist/vue-emotion'

const Button = styled('button')`
  font-size: 15px;
`

const PinkButton = styled(Button)`
  color: hotpink;
`

new Vue({
  render() {
    return (
      <div>
        <Button>normal button</Button>
        <PinkButton>pink button</PinkButton>
      </div>
    )
  }
})

Refer to https://emotion.sh for more docs.

Theming

Using provide/inject:

new Vue({
  provide() {
    return {
      theme: this.theme
    }
  },
  data() {
    return {
      theme: 'dark'
    }
  },
  render() {
    const Button = styled('button')`
      color: ${props => (props.theme === 'dark' ? 'white' : 'black')};
    `
    return <Button>Hello</Button>
  }
})

I do know that provide/inject is NOT recommended in generic application code, but before we find a better solution, use it as a work-around.

Global styles

<template>
  <div id="app">
    <GlobalStyle />
    <!-- rest of your app -->
  </div>
</template>

<script>
import { createGlobalStyle } from '@egoist/vue-emotion'

const GlobalStyle = createGlobalStyle`
  body {
    background: red;
  }
`

export default {
  components: {
    GlobalStyle
  }
}
</script>

Server-side rendering

You can extract critical CSS like this during server-side rendering:

const { renderStyle } = require('@egoist/vue-emotion/server')

// `cache` is the $emotionCache property on your Vue app instance
// `html` is the rendered HTML by vue-server-renderer
const style = renderStyle(cache, html)
// <style>...</style>

Caveats

Component selector doesn't work (yet)

const Container = styled.div`
  ${Button} {
    color: red;
  }
`

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Author

vue-emotion © EGOIST, Released under the MIT License.
Authored and maintained by EGOIST with help from contributors (list).

github.com/egoist · GitHub @EGOIST · Twitter @_egoistlily

vue-emotion's People

Contributors

d-corler avatar egoist avatar u3u avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-emotion's Issues

domProps / v-html

How can I use domProps / v-html with styled component ?

// This example works ✔
createElement('div', {
    domProps: { innerHTML: this.settings.hero_title },
})
// This example doesn't works ❌
const HeroTitle = styled("h1")`
    color: red;
`;

createElement(HeroTitle, {
    domProps: { innerHTML: this.settings.hero_title },
})

Overwrite styles from the outside

Imagine a title

const StyledTitle = styled('div')`
  color: cornflowerblue;
`;

that is used in a template and exported as a component Title:

<template>
  <StyledTitle>
    I am a title
  </StyledTitle>
</template>

Now, when overwriting the StyledTitle, it works as expected. It's color changes from blue to red:

const OverwrittenStyledTitle = styled(StyledTitle)`
  color: crimson;
`;

Although when overwriting the Title, it keeps it's original blue color and does not become green:

const OverwrittenTitle = styled(Title)`
  color: forestgreen;
`;

Is this expected behavior? In such instances, is it the "correct" approach to style via props (e.g. a prop type: 'main' | 'secondary, ...). Or is this a bug?
Also, I am not sure if this is related to either vue-emotion or emotion. So pardon me if this has nothing to do with vue-emotion.

Thank you for your time :)

Style composition no longer works

Sorry, me again. Just reporting that basic style composition no longer works after the breaking rewrite.

Reproduction here

Particularly relevant code below:

// App.js
import { styled } from "@egoist/vue-emotion";
import { css } from "emotion";

const bold = css`
  font-weight: bold;
`;

const red = css`
  color: red;
`;

const blue = css`
  color: blue;
`;

const otherComposition = css`
  ${bold};
  ${blue};
`;

const StyledComponent = styled("div")`
  ${bold};
  ${red};
`;

const StyledComponentTwo = styled("div")`
  ${bold};
  ${blue};
`;

export default {
  name: "App",
  render() {
    return (
      <div>
        <StyledComponent>Composition Doesn't Work</StyledComponent>
        <StyledComponentTwo>Composition Doesn't Work</StyledComponentTwo>
        <div class={otherComposition}>Composition Does Work</div>
      </div>
    );
  }
};

Can't we use styled components with vuejs templates? Or is jsx mandatory?

I was wonder if we could write code like this instead of using vuejs's jsx feature? Since I am facing some reactivity issues while working with jsx...

<template>
  <dummy-component></dummy-component>
</template>
<script>
import DummyComponent from './DummyComponent.vue'
import { styled } from '@egoist/vue-emotion'
export default {
  components: {
    'dummy-component': styled(DummyComponent)`
      .title:hover {
        color: #ed508f;
      }
    `,
  },
}
</script>
<style lang="scss" scoped></style>

Feature complete?

Hey egoist!

My team is interested in using jsx with vue, and some of us are big fans of the styled-component/emotion paradigm. We're looking for a viable option for this approach with vue. The vue-styled-component library seems to have some issues with lack of maintenance and not being feature complete. So I was curious where you would place this project on the spectrum of stability/feature completed-ness? It looks like there hasn't been a whole lot of activity on it, but I wasn't sure if this was because you didn't have more time to put into it, or because extending the Emotion api to function with Vue was pretty trivial and hasn't required more work than you've put into it.

Thoughts/advice? Would you be comfortable incorporating this library into a commercial grade product, if you were in my place?

Define prop types

If there a way to same through props types like in vue-styled-components
https://github.com/styled-components/vue-styled-components#adapting-based-on-props

I have a issue where the prop value is not removed the the Dom. e.g.

const StyledBox = styled('div')`
  background-color: ${props => props.background};
<template>
  <StyledBox background="red">
    <slot/>
  </StyledBox>
</template>

renders

<div data-v-02e4c64b="" data-v-469af010="" background="red" class="css-1a3rjkp">Box 1</div>

Ideally we should not be seeing background="red" as an attribute.

Incorrectly pass slots to styled component

Reproduce: https://codesandbox.io/s/z2m69vxnw4

const Item = {
  name: "Item",
  data() {
    return {};
  },
  render() {
    console.log(this.$slots);
    return (
      <div>
        <div style="font-size: 20px">1:{this.$slots.title}</div>
        <div>2:{this.$slots.default}</div>
      </div>
    );
  }
};

const Wrapper = {
  name: "Wrapper",
  data() {
    return {};
  },
  render() {
    return (
      <div>
        ----correct:-----------------------------
        <Item>
          <div>content</div>
          <div slot="title">title</div>
        </Item>
        ----incorrect:-----------------------------
        <StyledItem>
          <div>content</div>
          <div slot="title">title</div>
        </StyledItem>
      </div>
    );
  }
};

const StyledItem = styled(Item)`
  color: red;
`;

result:

----correct:-----------------------------
1:
title
2:
content
----incorrect:-----------------------------
1:
2:
content
title                     <-----expect pass to $slot.title, but actually $slots.default

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.