Skip to content

Instantly share code, notes, and snippets.

@taion
Last active July 31, 2016 09:10
Show Gist options
  • Save taion/ac60a7e54fb02e000b3a39fd3bb1e944 to your computer and use it in GitHub Desktop.
Save taion/ac60a7e54fb02e000b3a39fd3bb1e944 to your computer and use it in GitHub Desktop.
Embarrassing strawman API proposal that hopefully gets the point across
// This is _not_ supposed to be a real API. It's only intended to describe what
// I'm looking for. It's almost intentionally awful.
export const buttonHook = new OverrideHook({
properties: ['margin'],
});
export default function Button(props) {
return (
<button
{...props}
type="button"
className={classNames(
props.className,
buttonClassName,
buttonHook.className
)}
/>
);
}
import { buttonHook } from './Button';
// This is _not_ supposed to be a real API. It's only intended to describe what
// I'm looking for. It's almost intentionally awful.
const formClassName = makeClass({
border: '1 px solid grey',
[s`> ${buttonHook}`]: buttonHook({
margin: '0 1rem',
}),
});
export default function InlineForm(props) {
return (
<form
{...props}
className={classNames(props.className, formClassName)}
/>
);
}
// The idea is that you can do:
const form = (
<InlineForm>
<EmailInput />
<PasswordInput />
<LoginButton />
</InlineForm>
);
// Where <LoginButton> renders a <Button>.
import { buttonHook } from './Button';
// This is _not_ supposed to be a real API. It's only intended to describe what
// I'm looking for. It's almost intentionally awful.
const toolbarClassName = makeClass({
border: '1 px solid black',
[s`> ${buttonHook}`]: buttonHook({
margin: '0 0.5rem',
// If you try to set font-family or something here, throw.
}),
});
export default function Toolbar(props) {
return (
<div
{...props}
className={classNames(props.className, toolbarClassName)}
/>
);
}
@taion
Copy link
Author

taion commented Jul 31, 2016

Trying to move discussion to styled-components/spec#5.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment