Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(@theme-ui/mdx): add TypeScript support #703

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export interface IntrinsicSxElements {
em: JSX.IntrinsicElements['em'] & SxProps
strong: JSX.IntrinsicElements['strong'] & SxProps
div: JSX.IntrinsicElements['div'] & SxProps
delete: JSX.IntrinsicElements['div'] & SxProps
Copy link
Member

@hasparus hasparus Feb 22, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a MDX thing as is inlineCode and thematicBreak.
https://github.com/gatsbyjs/gatsby/blob/master/docs/docs/mdx/customizing-components.md

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I'm just a bit confused- in v0.3 (which fixed the issue reported in #401), delete was renamed to del.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn’t know about #401. I’m as confused as you are or more. Sorry 😄

del: JSX.IntrinsicElements['div'] & SxProps
inlineCode: JSX.IntrinsicElements['div'] & SxProps
thematicBreak: JSX.IntrinsicElements['div'] & SxProps
root: JSX.IntrinsicElements['div'] & SxProps
Expand Down
12 changes: 8 additions & 4 deletions packages/mdx/package.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
{
"name": "@theme-ui/mdx",
"version": "0.3.0",
"source": "src/index.ts",
"main": "dist/index.js",
"module": "dist/index.esm.js",
"types": "dist/index.d.ts",
"sideEffects": false,
"scripts": {
"prepare": "microbundle --no-compress",
"watch": "microbundle watch --no-compress"
"prepare": "microbundle --no-compress --tsconfig tsconfig.json",
"watch": "microbundle watch --no-compress --tsconfig tsconfig.json"
},
"dependencies": {
"@emotion/core": "^10.0.0",
"@emotion/styled": "^10.0.0",
"@mdx-js/react": "^1.0.0"
},
"devDependencies": {
"@theme-ui/core": "^0.3.1",
"@theme-ui/css": "^0.3.1"
},
"peerDependencies": {
"@theme-ui/core": "*",
"@theme-ui/css": "*",
"react": "^16.11.0"
},
"author": "Brent Jackson",
Expand Down
86 changes: 0 additions & 86 deletions packages/mdx/src/index.js

This file was deleted.

108 changes: 108 additions & 0 deletions packages/mdx/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import { jsx, IntrinsicSxElements } from '@theme-ui/core'
import { css, get, Theme } from '@theme-ui/css'
import { ComponentType, FC, ReactNode } from 'react'
import styled, { Interpolation } from '@emotion/styled'
import {
MDXProvider as _MDXProvider,
useMDXComponents
} from '@mdx-js/react'


export type MdxAliases = {
[key in keyof IntrinsicSxElements]: keyof JSX.IntrinsicElements
}

export type MdxAliasesKeys = 'inlineCode' | 'thematicBreak' | 'root'

export type MdxProviderComponents = {
[key in keyof IntrinsicSxElements]: ComponentType
}

export type ThemedProps = {
theme: Theme
}

export interface MdxProviderProps {
components?: MdxProviderComponents
children: ReactNode
}

// mdx components
const tags: Array<keyof IntrinsicSxElements> = [
'p',
'b',
'i',
'a',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'img',
'pre',
'code',
'ol',
'ul',
'li',
'blockquote',
'hr',
'em',
'table',
'tr',
'th',
'td',
'em',
'strong',
'del',
// mdx
'inlineCode',
'thematicBreak',
// other
'div',
// theme-ui
'root',
]

const aliases: Pick<MdxAliases, MdxAliasesKeys> = {
inlineCode: 'code',
thematicBreak: 'hr',
root: 'div',
}

const alias = (n: keyof IntrinsicSxElements): keyof JSX.IntrinsicElements => aliases[n] || n

export const themed = (key: keyof IntrinsicSxElements) => (props: ThemedProps) =>
css(get(props.theme, `styles.${key}`))(props.theme) as Interpolation<ThemedProps>

export const Styled = styled('div')(themed('div'))

export const components = {}

tags.forEach(tag => {
components[tag] = styled(alias(tag))(themed(tag))
Styled[tag] = components[tag]
})

const createComponents = (comps: MdxProviderComponents) => {
const next = { ...components }

const componentKeys = Object.keys(comps) as Array<keyof IntrinsicSxElements>

componentKeys.forEach(key => {
next[key] = styled(comps[key])(themed(key))
})
return next
}

export const MDXProvider: FC<MdxProviderProps> = ({
components,
children,
}) => {
const outer = useMDXComponents()

return jsx(_MDXProvider, {
components: createComponents({ ...outer, ...components }),
children,
})
}
4 changes: 4 additions & 0 deletions packages/mdx/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": "../core/tsconfig.json",
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts"]
}