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"