• Stars
    star
    363
  • Rank 113,685 (Top 3 %)
  • Language
    JavaScript
  • License
    Other
  • Created over 5 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Markup and styles that feel right

reshadow ⛱️

Github Actions Coverage Status branch npm version Babel Macro

Markup and styles that feel right.

Please check the reshadow.dev website to get more information and examples.

reshadow provides the Shadow DOM developer experience, but for the Virtual DOM with the Component way.

import React from 'react';
import styled, {css} from 'reshadow';

// Write styles:
const styles = css`
    button {
        width: 200px;
    }
    content {
        font-size: 14px;
    }
`;

export const Button = ({children, ...props}) => {
    // connect the styles to the markup:
    return styled(styles)(
        <button {...props}>
            <content as="span">{children}</content>
        </button>,
    );
};

This project has alpha status, so the API and the implementation could be changed.

Features

  • Get away from additional abstractions
    • Write isolated semantic styles for the Virtual DOM in a native like way
    • Match styles on the elements, components, and props. That's all you need
  • Compile-time styles processing and efficient runtime
  • Static styles extracting options
  • Static analysis
  • Combine the css-in-js and css-modules approaches or choose which fits you better
  • All the benefits of the PostCSS ecosystem
  • Interoperable. Use it with components in React, Preact, Vue, htm.

There are some examples on the Сodesandbox:

Benchmarks

There are also some css-in-js benchmarks, that are available on the codesandbox.

reshadow benchmarks

Docs

npm i --save reshadow

.babelrc

{"plugins": ["reshadow/babel"]}

Check the Setup page to get more details (including setup with Create React App)

Example

import React from 'react';
import styled from 'reshadow';
import {readableColor, rgba} from 'polished';

const Button = ({
    bgcolor = 'lightgray',
    size = 's',
    children,
    ...props
}) => styled`
    button {
        cursor: pointer;
        padding: 5px 10px;
        border-radius: 5px;
        border: 2px solid ${bgcolor};
        background-color: ${rgba(bgcolor, 0.7)};
        color: ${readableColor(bgcolor)};
        transition: background-color 0.5s;

        &:hover {
            background-color: ${rgba(bgcolor, 0.9)};
        }
    }

    /**
     * Match on the 'disabled' prop,
     * not the DOM attribute
     **/
    button[disabled] {
        opacity: 0.5;
        pointer-events: none;
    }

    /**
     * Match on the 'use:size' prop
     */
    button[use|size='s'] {
        font-size: 12px;
    }

    /* The 'use' namespace can be omitted */
    button[|size='m'] {
        font-size: 14px;
    }
`(
    /* use:size property would not pass to the DOM */
    <button {...props} use:size={size}>
        {children}
    </button>,
);
const Container = () => styled`
    Button + Button {
        margin-left: 10px;
    }
`(
    <div>
        <Button size="m" bgcolor="lightgray">
            lightgray
        </Button>
        <Button size="m" bgcolor="orange">
            orange
        </Button>
        <Button size="m" bgcolor="rebeccapurple">
            rebeccapurple
        </Button>
    </div>,
);

buttons

Usage

css-modules

Button/index.js

import React from 'react';
import styled from 'reshadow';

import styles from './styles.css';

export const Button = ({size, children}) => styled(styles)(
    <button use:size={size}>{children}</button>,
);

Button/styles.css

button {
    /* button styles */
}
button[|size='m'] {
    /* button styles for the size */
}

css-in-js

import React from 'react';
import styled, {css} from 'reshadow';

const anotherStyles = css`
    button[disabled] {
        /* disabled button styles */
    }
`;

export const Button = ({size, children}) => styled(
    props.another && anotherStyles,
)`
    button {
        /* button styles */
    }
    button[|size='m'] {
        /* button styles for the size */
    }
`(<button use:size={size}>{children}</button>);

Setup

Macro

With CRA 2 (Create React App) or babel-plugin-macros usage you can just use reshadow/macro out of the box.

import React from 'react';
import styled from 'reshadow/macro';

export const Button = ({children}) => styled`
    button {
        /* button styles */
    }
`(<button>{children}</button>);

Options (via babel-plugin-macros config) are the same as reshadow babel options, but with different defaults:

option default value
postcss true
files /.shadow.css$/

Babel

Add reshadow/babel to the plugin list.

babel.config.js

module.exports = {
    plugins: ['reshadow/babel'],
};

Options

option type default value description
postcss boolean | {plugins: Plugin[]} false Use PostCSS to process CSS code. You can add your custom PostCSS plugins (they should be sync)
files boolean | RegExp false Resolve and process css files imports that match to the RegExp
elementFallback boolean | string 'div' Use fallback for the custom elements

PostCSS

Add reshadow/postcss to the plugin list.

postcss.config.js

module.exports = {
    plugins: ['reshadow/postcss'],
};

Webpack

Use reshadow/webpack/loader to extract styles in separate files.

webpack.config.js

{
    test: /\.js$/,
    use: [
        'reshadow/webpack/loader',
        'babel-loader',
    ]
}

Linting

Use reshadow/eslint if you want to have more control about reshadow usage.

Rules:

Prettier

Use reshadow/prettier if you want to improve your Developer Experience with prettier.

prettier.config.js

module.exports = {
    plugins: ['reshadow/prettier'],
};

Special Thanks

More Repositories

1

gixy

Nginx configuration static analyzer
Python
8,129
star
2

YaLM-100B

Pretrained language model with 100B parameters
Python
3,716
star
3

odyssey

Scalable PostgreSQL connection pooler
C
3,102
star
4

yandex-tank

Load and performance benchmark tool
Python
2,398
star
5

rep

Machine Learning toolbox for Humans
Jupyter Notebook
678
star
6

pgmigrate

Simple tool to evolve PostgreSQL schema easily.
Python
606
star
7

faster-rnnlm

Faster Recurrent Neural Network Language Modeling Toolkit with Noise Contrastive Estimation and Hierarchical Softmax
C++
561
star
8

tomita-parser

C
492
star
9

porto

Yet another Linux container management system
C++
392
star
10

pandora

A load generator in Go language
Go
383
star
11

django_replicated

Django DB router for stateful master-slave replication
Python
350
star
12

pire

Perl Incompatible Regular Expressions library
C++
328
star
13

metrica-tag

The client library of the web analytics tool. It is in the top 5 by popularity worldwide.
TypeScript
251
star
14

yatagan

Dependency Injection framework based on Google's Dagger2 API, optimized for fast builds and for managing large graphs with optional dependencies
Kotlin
223
star
15

ozo

OZO is a C++17 Boost.Asio based header-only library for asyncronous communication with PostgreSQL DBMS.
C++
220
star
16

mapsapi-codestyle

JavaScript and TypeScript Style Guide
JavaScript
213
star
17

zero-downtime-migrations

Apply Django migrations on PostgreSql without long locks on tables
Python
181
star
18

audio-js

Библиотека аудио-плеера для браузера
JavaScript
181
star
19

alice-skills

Примеры кода навыков для голосового помощника, придуманного в Яндексе
Python
178
star
20

burp-molly-scanner

Turn your Burp suite into headless active web application vulnerability scanner
Java
153
star
21

yandex-taxi-testsuite

testsuite: microservices testing framework
Python
144
star
22

burp-molly-pack

Security checks pack for Burp Suite
Java
137
star
23

mapsapi-modules

Async modular system
JavaScript
132
star
24

go-hasql

Go library for accessing multi-host SQL database installations
Go
122
star
25

mapkit-android-demo

MapKit Android demo
Kotlin
115
star
26

yoctodb

A tiny embedded Java-engine for extremely fast partitioned immutable-after-construction databases
Java
107
star
27

scout

A fast and safe manual dependency injector for Kotlin and Android.
Kotlin
102
star
28

handystats

C++ library for collecting user-defined in-process runtime statistics with low overhead
C++
94
star
29

speechkitcloud

Speechkit Cloud examples and SDK
JavaScript
90
star
30

fastops

This small library enables acceleration of bulk calls of certain math functions on AVX and AVX2 hardware. Currently supported operations are exp, log, sigmoid and tanh. The library is designed with extensibility in mind.
C++
82
star
31

yatool

Yatool is a cross-platform distribution, building, testing, and debugging toolkit focused on monorepositories
C
82
star
32

argon2

Implementation of argon2 (i, d, id) algorithms with CPU dispatching
C++
79
star
33

mms

Memory-mapped storage library
C++
76
star
34

mapsapi-heatmap

Heatmap: Yandex.Maps API plugin for data visualization
JavaScript
76
star
35

tcplanz

TCPDump latency analyzer
Python
75
star
36

mapkit-ios-demo

MapKit iOS demo
Swift
75
star
37

balancer

http balancer
C
72
star
38

securitygym

Python
71
star
39

NwSMTP

Asynchronous SMTP proxy server
Shell
71
star
40

geo-reviews-dataset-2023

67
star
41

smart

SMT-aware Real-time scheduler for Linux
C
67
star
42

tex-renderer

Микросервис для рендеринга tex-формул в изображения
JavaScript
59
star
43

rtv

Remote TV control for developers
JavaScript
58
star
44

mysync

MySync is mysql high-availability and cluster configuration tool.
Go
56
star
45

YandexDriver

YandexDriver is a WebDriver implementation
55
star
46

csp-tester

This extension helps web masters to test web application behaviour with Content Security Policy (CSP) ver. 1.0 implemented.
JavaScript
54
star
47

mapsapi-examples

Примеры использования API Яндекс.Карт
JavaScript
52
star
48

yandex_tracker_client

Python client for working with Yandex.Tracker Api
Python
50
star
49

ofd

Реализация протокола взаимодействия ККТ-ОФД
Python
49
star
50

reselector

Use React Components in css selectors
JavaScript
44
star
51

csp-reporter

Content Security Policy logs parser
Python
43
star
52

dpt

BEM-based prototyping framework for large projects
JavaScript
41
star
53

CMICOT

Efficient feature selection method based on Conditional Mutual Information.
C++
41
star
54

pgcheck

Tool for monitoring backend databases from PL/Proxy hosts and changing plproxy.get_cluster_partitions() output
Go
37
star
55

root-2015-tasks

Yandex.Root 2015 contest data
Python
34
star
56

deaf

Android App for Deaf
Java
33
star
57

datasync-js

DataSync API allows for structured data storage and synchronization in Web services and mobile applications.
JavaScript
33
star
58

inet64_tcp

Magic thing to make old Erlang stuff work in IPv6-only networks
Erlang
32
star
59

ymaps-pie-chart-clusterer

Yandex Maps Plugin: Pie Chart Clusterer
JavaScript
31
star
60

browser-extensions

JavaScript
31
star
61

mongoz

An alternative implementation of MongoDB sharding server aimed at high availability
C++
31
star
62

mlcup

Official baseline solutions to Yandex Cup ML challenge
Jupyter Notebook
30
star
63

webmaster.api

28
star
64

mapsapi-polylabeler

Plugin to setting labels inside polygons
JavaScript
25
star
65

mapsapi-round-controls

Plugin for Yandex.Maps JS API: rounded map controls theme
JavaScript
24
star
66

dep_tregex

Stanford Tregex-inspired language for rule-based dependency tree manipulation.
Python
21
star
67

tartifacts

📦 Create artifacts for your assemblies
JavaScript
20
star
68

cggen

Tool for generating Core Graphics code from vector image files
Swift
20
star
69

mastermind

Smart control for a big storage
Python
19
star
70

ch-backup

Backup tool for ClickHouse DBMS
Python
19
star
71

sdch_module

C++
18
star
72

ch-tools

ClickHouse administration and diagnostics tools
Python
17
star
73

openvpn-python-plugin

Runs python3 interpreter inside OpenVPN process in a persistent manner to answer it's plug-in calls.
C
17
star
74

rdsync

Go
17
star
75

YNDX000SB_kernel

Yandex.Phone kernel sources
C
16
star
76

evgen

Code generation for event logging
TypeScript
14
star
77

yandex-ecom-search

Бета-Версия документации для разработчиков по работе с товарным фидом Яндекс Поиска
14
star
78

cluster_metrics

C++
13
star
79

vgsl

Very Good Swift Library
Swift
13
star
80

yamail

YMail General Purpose Library
C++
13
star
81

agglomerative_clustering

C++
13
star
82

temporal-over-ydb

Go
12
star
83

pgconsul

PgConsul is a tool for maintaining High-Availability Postgresql cluster configurations. It is responsible for cluster recovery in case of emergencies.
Python
12
star
84

minishard

Lightweight sharding for distributed erlang applications
Erlang
12
star
85

jsx-directives

Директивы для JSX
TypeScript
12
star
86

miniapp-example

Example application for brand new platform of MiniApps inside the Yandex App
TypeScript
11
star
87

mapsapi-ios

Allows to easily add Yandex.Maps to your existing iOS project using Yandex.Maps JavaScript API
Objective-C
11
star
88

erater

Generic embedded distributed request rate limiting service for erlang applications
Erlang
10
star
89

storytests-cli

Framework agnostic CLI Utility to generate test files from Storybook
TypeScript
10
star
90

mapsapi-area

util.calculateArea: plugin for calculating geodesic features area.
JavaScript
10
star
91

miniapp-example-backend

Backend for Miniapp Example App for brand new platform of MiniApps inside the Yandex App
TypeScript
9
star
92

zest

Библиотека для взаимодействия с бэкендом
TypeScript
9
star
93

opentsdb-flume

Module for flume, allows to write incoming events directly to OpenTSDB.
Java
9
star
94

mediastorage-proxy

Mediastorage-proxy is a HTTP proxy for mediastorage based on elliptics
C++
8
star
95

erateserver

Distributed rate limiting service with HTTP interface
Erlang
7
star
96

domestic-roots-patch

A patch that adds support for the Russian domesic root certificate to the Chromium browser.
6
star
97

libmastermind

Client library for mastermind
C++
6
star
98

opensourcestand

YaC 2014 Open Source Stand
JavaScript
5
star
99

storytests-webpack-plugin

Plugin for creating test files according to Storybook
JavaScript
5
star
100

php-http-signature

PHP Implementation Of Draft RFC HttpSignature (v10)
PHP
5
star