phy-compiled
All-in-JS template engine for you to write everything in JavaScript. No more HTML. No more CSS. Only JavaScript!
phy-compiled depends on Compiled CSS-in-JS styling engine.
This project is a fork of phy minimal hyperscript helpers. It allows you to use minimalist h
helper function to create React/Preact elements. With phy-compiled, the css
prop gets parsed by Emotion, so you can write everything in JS!
Examples
To style an element, simply pass css
prop:
const h = require('phy-compiled');
module.exports = function SomeComponent() {
return h('#foo', h('span.bar', { css: { color: 'red' } }, 'whee!'));
};
You can create an entire styled, dark-mode aware component with merely JavaScript:
import { h } from 'phy-compiled';
export const Button = ({
variant = 'primary',
size = 'normal',
height = size === 'small' ? 24 : 32,
css,
...props
}) =>
h('button', {
...props,
css: {
all: 'unset',
fontFamily: 'inherit',
fontSize: 16,
height,
fontWeight: 'bold',
borderRadius: 4,
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'default',
userSelect: 'none',
...{
wide: { padding: '0 48px' },
normal: { padding: '0 32px' },
narrow: { padding: '0 16px' },
small: {
padding: '0 16px',
fontSize: 14,
},
}[size],
...{
primary: {
color: 'white',
backgroundColor: 'hsl(212, 100%, 47.6%)',
border: '1px solid rgb(174, 174, 178)',
'&:hover': { backgroundColor: 'hsl(212, 100%, 60%)' },
'&:focus': {
boxShadow: '0 0 0 2px hsla(212, 100%, 60%, 0.5)',
},
'@media (prefers-color-scheme: dark)': {
color: 'white',
backgroundColor: 'hsl(212, 100%, 36%)',
border: '1px solid rgb(99, 99, 102)',
'&:hover': { backgroundColor: 'hsl(212, 100%, 36%)' },
'&:focus': {
boxShadow: '0 0 0 2px hsla(212, 100%, 64%, 0.8)',
},
},
},
green: {
color: 'hsl(129, 67.3%, 20.0%)',
backgroundColor: 'hsl(129, 67.3%, 72.0%)',
border: '1px solid rgb(174, 174, 178)',
'&:hover': { backgroundColor: 'hsl(129, 67.3%, 64.0%)' },
'&:focus': {
boxShadow: '0 0 0 2px rgb(174, 174, 178)',
},
'@media (prefers-color-scheme: dark)': {
color: 'hsl(129, 67.3%, 88.0%)',
backgroundColor: 'hsl(129, 67.3%, 28.0%)',
border: '1px solid rgb(99, 99, 102)',
'&:hover': { backgroundColor: 'hsl(129, 67.3%, 36.0%)' },
'&:focus': {
boxShadow: '0 0 0 2px hsl(129, 67.3%, 28.0%)',
},
},
},
}[variant],
...css,
},
});
import { h } from 'phy-compiled';
import Button from './button';
export default function App() {
return [
h(Button, 'Primary'),
h('br'),
h(Button, { variant: 'green', size: 'wide' }, 'Green'),
h('br'),
h(Button, { size: 'small' }, 'Small'),
];
}
See CodeSandbox button example: https://codesandbox.io/s/cocky-waterfall-vy8d6q?file=/src/App.js
Starters
To quickly get started with phy-compiled, feel free to clone the starters:
License
phy-compiled
is a fork of phy
which is under BSD-3-Clause license.