= React.ForwardRefExoticComponent<
+ React.PropsWithoutRef & React.RefAttributes
+>
+
+export interface BoxOwnProps extends SpaceProps, ColorProps {
+ as?: React.ElementType
+ variant?: string
+ sx?: SxStyleProp
+ css?: InterpolationWithTheme
+ __themeKey?: string //TODO is __themeKey a "keyof / typeof" from the theme spec?
+}
+
+export interface BoxProps
+ extends Assign, BoxOwnProps> {}
+
+/**
+ * Use the Box component as a layout primitive to add margin, padding, and colors to content.
+ * @see https://theme-ui.com/components/box
+ */
+
+const shouldForwardProp = createShouldForwardProp([
+ ...space.propNames,
+ ...color.propNames,
+])
+
+const sx = props => css(props.sx)(props.theme)
+const base = props => css(props.__css)(props.theme)
+const variant = ({ theme, variant, __themeKey = 'variants' }) =>
+ css(get(theme, __themeKey + '.' + variant, get(theme, variant)))
+
+export const Box: StyledComponent<
+ React.ComponentProps<'div'>,
+ BoxOwnProps,
+ {}
+> = styled('div', {
+ shouldForwardProp,
+})(
+ {
+ boxSizing: 'border-box',
+ margin: 0,
+ minWidth: 0,
+ },
+ base,
+ variant,
+ space,
+ color,
+ sx,
+ props => props.css
+)
+
+export default Box
diff --git a/packages/components/src/Button.js b/packages/components/src/Button.tsx
similarity index 50%
rename from packages/components/src/Button.js
rename to packages/components/src/Button.tsx
index 100224899..a22575a15 100644
--- a/packages/components/src/Button.js
+++ b/packages/components/src/Button.tsx
@@ -1,14 +1,24 @@
import React from 'react'
-import Box from './Box'
+import Box, { Assign, BoxOwnProps, ForwardRef } from './Box'
-export const Button = React.forwardRef((props, ref) => (
+export interface ButtonProps
+ extends Assign, BoxOwnProps> {}
+/**
+ * Primitive button component with variants
+ * @see https://theme-ui.com/components/button
+ */
+
+export const Button: ForwardRef<
+ HTMLButtonElement,
+ ButtonProps
+> = React.forwardRef((props, ref) => (
(
-
-))
diff --git a/packages/components/src/Card.tsx b/packages/components/src/Card.tsx
new file mode 100644
index 000000000..dfce34e05
--- /dev/null
+++ b/packages/components/src/Card.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import Box, { BoxProps, ForwardRef } from './Box'
+
+export type CardProps = BoxProps
+/**
+ * Card style variants can be defined in the `theme.cards` object.
+ * By default the Card component uses the `theme.cards.primary` variant.
+ * @see https://theme-ui.com/components/card
+ */
+
+export const Card: ForwardRef<
+ HTMLDivElement,
+ CardProps
+> = React.forwardRef((props, ref) => (
+
+))
diff --git a/packages/components/src/Checkbox.js b/packages/components/src/Checkbox.tsx
similarity index 77%
rename from packages/components/src/Checkbox.js
rename to packages/components/src/Checkbox.tsx
index 65803c655..29e506c4e 100644
--- a/packages/components/src/Checkbox.js
+++ b/packages/components/src/Checkbox.tsx
@@ -1,7 +1,17 @@
import React from 'react'
-import Box from './Box'
+import Box, { Assign, BoxOwnProps, ForwardRef } from './Box'
import SVG from './SVG'
+export interface CheckboxProps
+ extends Assign, BoxOwnProps> {}
+/**
+ * Form checkbox input component
+ *
+ * Checkbox variants can be defined in `theme.forms` and the
+ * component uses the `theme.forms.checkbox` variant by default.
+ * @see https://theme-ui.com/components/checkbox/
+ */
+
const CheckboxChecked = props => (
-)
-
-export const Close = React.forwardRef(({ size = 32, ...props }, ref) => (
-
-))
diff --git a/packages/components/src/Close.tsx b/packages/components/src/Close.tsx
new file mode 100644
index 000000000..1dc7707ca
--- /dev/null
+++ b/packages/components/src/Close.tsx
@@ -0,0 +1,39 @@
+import React from 'react'
+import { IconButton, IconButtonProps } from './IconButton'
+import { ForwardRef } from './Box'
+
+interface CloseProps extends Omit {}
+/**
+ * Button with close (×) icon.
+ *
+ * The Close component renders as a