diff --git a/core/docz-core/src/bundler/plugins.ts b/core/docz-core/src/bundler/plugins.ts index 9d7b23498..b58db4a63 100644 --- a/core/docz-core/src/bundler/plugins.ts +++ b/core/docz-core/src/bundler/plugins.ts @@ -59,8 +59,7 @@ export const injections = (config: Config, args: Args, env: Env) => { { ...getClientEnvironment(base).stringified, NODE_ENV: stringify(env), - DOCZ_BASE_URL: args.hashRouter ? stringify('/') : stringify(base), - DOCZ_HASH_ROUTER: stringify(args.hashRouter || false), + DOCZ_BASE_URL: stringify(base), }, ]) } diff --git a/core/docz-core/src/config/argv.ts b/core/docz-core/src/config/argv.ts index 7004c1b6a..502c43d74 100644 --- a/core/docz-core/src/config/argv.ts +++ b/core/docz-core/src/config/argv.ts @@ -81,7 +81,6 @@ export interface Argv { * this property will be deleted in the v1.0 */ ordering: 'ascending' | 'descending' - hashRouter: boolean wrapper?: string indexHtml?: string /** slugify separator */ @@ -195,10 +194,6 @@ export const setArgs = (yargs: Yargs) => { type: 'number', default: getEnv('docz.websocket.port', 60505), }) - .option('hashRouter', { - type: 'boolean', - default: getEnv('docz.hash.router', false), - }) .option('native', { type: 'boolean', default: getEnv('docz.native', false), diff --git a/core/docz-core/templates/root.tpl.js b/core/docz-core/templates/root.tpl.js index 17b0bf578..f2ec9d832 100644 --- a/core/docz-core/templates/root.tpl.js +++ b/core/docz-core/templates/root.tpl.js @@ -15,9 +15,7 @@ const Root = () => { linkComponent={Link} db={database} > - - ) } diff --git a/core/docz-theme-default/package.json b/core/docz-theme-default/package.json index 282e7934d..92bd8de5a 100644 --- a/core/docz-theme-default/package.json +++ b/core/docz-theme-default/package.json @@ -38,8 +38,8 @@ "styled-components": "^4.1.3" }, "peerDependencies": { - "react": "^16.2.0", - "react-dom": "^16.2.0" + "react": "^16.8.0", + "react-dom": "^16.8.0" }, "devDependencies": { "@types/lodash": "^4.14.121", diff --git a/core/docz-theme-default/src/components/shared/Sidebar/MenuHeadings.tsx b/core/docz-theme-default/src/components/shared/Sidebar/MenuHeadings.tsx index c4eeeee53..a29ae9943 100644 --- a/core/docz-theme-default/src/components/shared/Sidebar/MenuHeadings.tsx +++ b/core/docz-theme-default/src/components/shared/Sidebar/MenuHeadings.tsx @@ -47,9 +47,6 @@ const createSmallLink = (Link: React.ComponentType) => styled(Link)` } ` -const isSmallLinkActive = (slug: string) => (m: any, location: any) => - slug === location.hash.slice(1, Infinity) - const getHeadings = (route: string, docs: Entry[]) => { const doc = docs.find(doc => doc.route === route) const headings = get(doc, 'headings') @@ -74,7 +71,6 @@ export const MenuHeadings: SFC = ({ route, onClick }) => { key={heading.slug} onClick={onClick} to={`${route}#${heading.slug}`} - isActive={isSmallLinkActive(heading.slug)} > {heading.value} diff --git a/core/docz/package.json b/core/docz/package.json index 3a36eb139..8e065b16a 100644 --- a/core/docz/package.json +++ b/core/docz/package.json @@ -26,6 +26,7 @@ "dependencies": { "@loadable/component": "^5.6.0", "@mdx-js/tag": "^0.17.5", + "@reach/router": "^1.2.1", "array-sort": "^1.0.0", "capitalize": "^2.0.0", "deepmerge": "^3.2.0", @@ -36,17 +37,15 @@ "prop-types": "^15.7.2", "react": "^16.8.2", "react-dom": "^16.8.2", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", - "react-router-hash-link": "^1.2.1", "ulid": "^2.3.0", "yargs": "^13.2.1" }, "peerDependencies": { - "react": "^16.2.0", - "react-dom": "^16.2.0" + "react": "^16.8.0", + "react-dom": "^16.8.0" }, "devDependencies": { - "@types/loadable__component": "^5.6.0" + "@types/loadable__component": "^5.6.0", + "@types/reach__router": "^1.2.3" } } diff --git a/core/docz/src/components/AsyncRoute.tsx b/core/docz/src/components/AsyncRoute.tsx index 808a9c7fe..701333436 100644 --- a/core/docz/src/components/AsyncRoute.tsx +++ b/core/docz/src/components/AsyncRoute.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { useEffect, SFC } from 'react' +import { SFC } from 'react' import { withMDXComponents } from '@mdx-js/tag/dist/mdx-provider' import loadable from '@loadable/component' @@ -43,16 +43,6 @@ export const AsyncRoute: SFC = defaultProps => { const Component: any = asyncComponent const props = { ...routeProps, doc: entry } - useEffect(() => { - setTimeout(() => { - if (typeof window !== 'undefined' && location.hash) { - const id: string = location.hash.substring(1) - const el: HTMLElement | null = document.getElementById(id) - if (el) el.scrollIntoView() - } - }) - }, []) - return Page ? ( diff --git a/core/docz/src/components/DocPreview.tsx b/core/docz/src/components/DocPreview.tsx index 1bf9efc0d..a4a6b2262 100644 --- a/core/docz/src/components/DocPreview.tsx +++ b/core/docz/src/components/DocPreview.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Fragment, SFC, ComponentType as CT } from 'react' -import { RouteComponentProps } from 'react-router-dom' +import { RouteComponentProps } from '@reach/router' import { MDXProvider } from '@mdx-js/tag' import { Entry } from '../state' diff --git a/core/docz/src/components/Link.tsx b/core/docz/src/components/Link.tsx index e2f124752..475dfe910 100644 --- a/core/docz/src/components/Link.tsx +++ b/core/docz/src/components/Link.tsx @@ -1,7 +1,23 @@ import * as React from 'react' -import { SFC } from 'react' -import { NavLinkProps as LinkProps } from 'react-router-dom' -import { NavHashLink as NavLink } from 'react-router-hash-link' +import { useCallback } from 'react' +import { Link as BaseLink, LinkProps, LinkGetProps } from '@reach/router' -export const Link: SFC = props => export { LinkProps } +export const Link = React.forwardRef>((props, ref) => { + const isActive = useCallback( + ({ isCurrent, location }: LinkGetProps) => { + const hrefHash = props.to && props.to.split('#') + const slug = hrefHash && Array.isArray(hrefHash) && hrefHash[1] + const isActive = + slug && location.hash && slug === location.hash.slice(1, Infinity) + return isCurrent || isActive + ? { className: `${props.className} active` } + : {} + }, + [props.to, props.className] + ) + + return +}) + +Link.displayName = 'Link' diff --git a/core/docz/src/components/Router.tsx b/core/docz/src/components/Router.tsx deleted file mode 100644 index a792300da..000000000 --- a/core/docz/src/components/Router.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react' -import { SFC } from 'react' -import { HashRouter, BrowserRouter } from 'react-router-dom' -import { StaticRouterProps } from 'react-router' - -declare var DOCZ_BASE_URL: string -declare var DOCZ_HASH_ROUTER: boolean - -const BaseRouter: SFC = (props: any) => - Boolean(DOCZ_HASH_ROUTER) ? ( - - ) : ( - - ) - -export const Router: SFC = ({ children }) => { - return {children} -} diff --git a/core/docz/src/components/Routes.tsx b/core/docz/src/components/Routes.tsx index 76f34d6ed..d09202b3a 100644 --- a/core/docz/src/components/Routes.tsx +++ b/core/docz/src/components/Routes.tsx @@ -1,7 +1,14 @@ import * as React from 'react' -import { SFC, useContext } from 'react' -import { Switch, Route } from 'react-router-dom' +import { SFC, useMemo, useContext, useEffect } from 'react' import { withMDXComponents } from '@mdx-js/tag/dist/mdx-provider' +import { + LocationProvider, + Router, + createHistory, + HistoryListenerParameter, +} from '@reach/router' + +declare var DOCZ_BASE_URL: string import { doczState } from '../state' import { ComponentsMap } from './DocPreview' @@ -12,6 +19,16 @@ export interface RoutesProps { imports: Imports } +const goToHash = ({ location }: HistoryListenerParameter) => { + setTimeout(() => { + if (location && location.hash) { + const id: string = location.hash.substring(1) + const el: HTMLElement | null = document.getElementById(id) + if (el) el.scrollIntoView() + } + }) +} + export const Routes: SFC = withMDXComponents( ({ components, imports }: RoutesProps) => { const { entries } = useContext(doczState.context) @@ -19,33 +36,34 @@ export const Routes: SFC = withMDXComponents( const NotFound: any = components.notFound const Loading: any = components.loading + const history = useMemo(() => createHistory(window as any), []) + + useEffect(() => { + history.listen(goToHash) + }, []) return ( - }> - - {entries.map(({ key: path, value: entry }) => { - const props = { path, entries, components } - const component = loadRoute(path, imports, Loading) - - return ( - ( - - )} - /> - ) - })} - {NotFound && } - - + + }> + + + {entries.map(({ key: path, value: entry }) => { + const props = { path, entries, components } + const component = loadRoute(path, imports, Loading) + + return ( + + ) + })} + + + ) } ) diff --git a/core/docz/src/index.ts b/core/docz/src/index.ts index 318cc47df..4fa19d999 100644 --- a/core/docz/src/index.ts +++ b/core/docz/src/index.ts @@ -2,7 +2,6 @@ export { AsyncRoute } from './components/AsyncRoute' export { Link, LinkProps } from './components/Link' export { Playground } from './components/Playground' export { PropsTable } from './components/PropsTable' -export { Router } from './components/Router' export { Routes } from './components/Routes' export * from './components/DocPreview' diff --git a/yarn.lock b/yarn.lock index d3f0fed2c..c38348385 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2110,7 +2110,7 @@ tslib "1.9.3" typescript "^3.2.2" -"@reach/router@^1.1.1": +"@reach/router@^1.1.1", "@reach/router@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" integrity sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ== @@ -2503,7 +2503,7 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/reach__router@^1.0.0": +"@types/reach__router@^1.0.0", "@types/reach__router@^1.2.3": version "1.2.3" resolved "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.3.tgz#679fa6968aab0314dc4b967808a23fd11af2ccce" integrity sha512-Zp0AdVhoJXjwsgp8pDPVEMnAH5eHU64hi5EnPT1Jerddqwiy0O87KFrnZKd1DKdO87cU120n2d3SnKKPtf4wFA== @@ -8925,17 +8925,6 @@ hex-color-regex@^1.1.0: resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -history@^4.7.2: - version "4.7.2" - resolved "https://registry.npmjs.org/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" - integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== - dependencies: - invariant "^2.2.1" - loose-envify "^1.2.0" - resolve-pathname "^2.2.0" - value-equal "^0.4.0" - warning "^3.0.0" - hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -9462,7 +9451,7 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= -invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: +invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -11217,7 +11206,7 @@ longest@^1.0.1: resolved "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -13029,13 +13018,6 @@ path-to-regexp@0.1.7: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= - dependencies: - isarray "0.0.1" - path-type@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -14142,38 +14124,6 @@ react-perfect-scrollbar@^1.4.4: perfect-scrollbar "^1.4.0" prop-types "^15.6.1" -react-router-dom@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" - integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== - dependencies: - history "^4.7.2" - invariant "^2.2.4" - loose-envify "^1.3.1" - prop-types "^15.6.1" - react-router "^4.3.1" - warning "^4.0.1" - -react-router-hash-link@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-1.2.1.tgz#da3b6384e5bff90e9b2172d2e689a994646f2f45" - integrity sha512-ddkCtmk/JwMmuU087TGShQHYyNjsJ+/9CTyuVdvvKf6ACgqk2Ma9ndX2xogo7WWmyq9AjuziBm5bmJ12zBxtsQ== - dependencies: - prop-types "^15.6.0" - -react-router@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" - integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== - dependencies: - history "^4.7.2" - hoist-non-react-statics "^2.5.0" - invariant "^2.2.4" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.1" - warning "^4.0.1" - react-side-effect@^1.1.0: version "1.1.5" resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz#f26059e50ed9c626d91d661b9f3c8bb38cd0ff2d" @@ -14903,11 +14853,6 @@ resolve-global@0.1.0, resolve-global@^0.1.0: dependencies: global-dirs "^0.1.0" -resolve-pathname@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" - integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== - resolve-pkg@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-1.0.0.tgz#e19a15e78aca2e124461dc92b2e3943ef93494d9" @@ -17264,11 +17209,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -value-equal@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" - integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== - vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -17358,13 +17298,6 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" - integrity sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug== - dependencies: - loose-envify "^1.0.0" - watch@~0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"