diff --git a/package.json b/package.json index fea209a..f7a14cb 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@lumino/coreutils": "^1.4.2", "@lumino/messaging": "^1.3.3", "@lumino/widgets": "^1.10.2", + "@material-ui/core": "^4.10.2", "react": "^16.8.6", "react-dom": "^16.8.6" }, diff --git a/src/extension.ts b/src/extension.ts index 6c6b3e7..8fc2d68 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -52,6 +52,15 @@ async function activateTOC( rendermime: IRenderMimeRegistry, settingRegistry: ISettingRegistry ): Promise { + // Attempt to load plugin settings: + let settings: ISettingRegistry.ISettings | undefined; + try { + settings = await settingRegistry.load('@jupyterlab/toc:plugin'); + } catch (error) { + console.error( + `Failed to load settings for the Table of Contents extension.\n\n${error}` + ); + } // Create the ToC widget: const toc = new TableOfContents({ docmanager, rendermime }); @@ -67,16 +76,6 @@ async function activateTOC( // Add the ToC widget to the application restorer: restorer.add(toc, '@jupyterlab/toc:plugin'); - // Attempt to load plugin settings: - let settings: ISettingRegistry.ISettings | undefined; - try { - settings = await settingRegistry.load('@jupyterlab/toc:plugin'); - } catch (error) { - console.error( - `Failed to load settings for the Table of Contents extension.\n\n${error}` - ); - } - // Create a notebook generator: const notebookGenerator = createNotebookGenerator( notebookTracker, diff --git a/src/toc_item.tsx b/src/toc_item.tsx index 21d7600..086d02d 100644 --- a/src/toc_item.tsx +++ b/src/toc_item.tsx @@ -2,7 +2,63 @@ // Distributed under the terms of the Modified BSD License. import * as React from 'react'; -import { IHeading } from './utils/headings'; +import ListItem from '@material-ui/core/ListItem'; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import { CodeCell } from '@jupyterlab/cells'; +import { NotebookPanel } from '@jupyterlab/notebook'; +import { IHeading, INotebookHeading } from './utils/headings'; + +/** + * Tests whether a heading is a notebook heading. + * + * @private + * @param heading - heading to test + * @returns boolean indicating whether a heading is a notebook heading + */ +function isNotebookHeading(heading: any): heading is INotebookHeading { + return heading.type !== undefined && heading.cellRef !== undefined; +} + +/** + * Checks whether a heading has runnable code cells. + * + * @private + * @param headings - list of headings + * @param heading - heading + * @returns boolean indicating whether a heading has runnable code cells + */ +function hasCodeCells(headings: IHeading[], heading: IHeading): boolean { + let h: INotebookHeading; + let i: number; + + if (!isNotebookHeading(heading)) { + return false; + } + // Find the heading in the list of headings... + for (i = 0; i < headings.length; i++) { + if (heading === headings[i]) { + break; + } + } + // Check if the current heading is a "code" heading... + h = heading as INotebookHeading; + if (h.type === 'code') { + return true; + } + // Check for nested code headings... + const level = heading.level; + for (i = i + 1; i < headings.length; i++) { + h = headings[i] as INotebookHeading; + if (h.level <= level) { + return false; + } + if (h.type === 'code') { + return true; + } + } + return false; +} /** * Interface describing component properties. @@ -10,6 +66,11 @@ import { IHeading } from './utils/headings'; * @private */ interface IProperties extends React.Props { + /** + * List of all headings. + */ + headings: IHeading[]; + /** * Heading to render. */ @@ -29,7 +90,17 @@ interface IProperties extends React.Props { * * @private */ -interface IState {} +interface IState { + /** + * Mouse x-position. + */ + mouseX: number | null; + + /** + * Mouse y-position. + */ + mouseY: number | null; +} /** * React component for a table of contents entry. @@ -37,6 +108,20 @@ interface IState {} * @private */ class TOCItem extends React.Component { + /** + * Returns a component which renders a table of contents entry. + * + * @param props - component properties + * @returns component + */ + constructor(props: IProperties) { + super(props); + this.state = { + mouseX: null, + mouseY: null + }; + } + /** * Renders a table of contents entry. * @@ -52,9 +137,161 @@ class TOCItem extends React.Component { event.stopPropagation(); heading.onClick(); }; + const content = this.props.itemRenderer(heading); + if (!content) { + return null; + } + const FLG = hasCodeCells(this.props.headings, heading); + return ( + + {content} + {FLG ? ( + + + Run Cell(s) + + + ) : null} + + ); + } + + /** + * Returns a callback which is invoked upon opening a context menu. + * + * @param heading - heading + * @returns callback + */ + private _onContextMenuFactory(heading: INotebookHeading) { + const self = this; + return onContextMenu; + + /** + * Callback invoked upon opening a job's context menu. + * + * @private + * @param event - event object + */ + function onContextMenu(event: any): void { + event.preventDefault(); + event.stopPropagation(); + + self.setState({ + mouseX: event.clientX - 2, + mouseY: event.clientY - 4 + }); + } + } + + /** + * Returns a callback which is invoked upon clicking a menu item to run code cells. + * + * @param heading - heading + * @returns callback + */ + private _onRunFactory(heading: INotebookHeading) { + const self = this; + return onClick; - let content = this.props.itemRenderer(heading); - return content &&
  • {content}
  • ; + /** + * Callback invoked upon clicking a menu item to run code cells. + * + * @private + * @param event - event object + */ + async function onClick(event: any): Promise { + let code: INotebookHeading[]; + let h: INotebookHeading; + let i: number; + + event.preventDefault(); + event.stopPropagation(); + + self._closeContextMenu(); + + // Find the heading in the list of ToC headings... + const headings = self.props.headings; + for (i = 0; i < headings.length; i++) { + if (heading === headings[i]) { + break; + } + } + code = []; + + // Check if the current heading is a "code" heading... + h = heading as INotebookHeading; + if (h.type === 'code') { + code.push(h); + } + // Find all nested code headings... + else { + const level = heading.level; + for (i = i + 1; i < headings.length; i++) { + h = headings[i] as INotebookHeading; + if (h.level <= level) { + break; + } + if (h.type === 'code') { + code.push(h); + } + } + } + // Run each of the associated code cells... + for (i = 0; i < code.length; i++) { + if (code[i].cellRef) { + const cell = code[i].cellRef as CodeCell; + const panel = cell.parent?.parent as NotebookPanel; + if (panel) { + await CodeCell.execute(cell, panel.sessionContext); + } + } + } + } + } + + /** + * Callback invoked upon closing a context menu. + * + * @param event - event object + */ + private _onContextMenuClose = (event: any): void => { + event.preventDefault(); + event.stopPropagation(); + + this._closeContextMenu(); + }; + + /** + * Closes a context menu. + */ + private _closeContextMenu(): void { + this.setState({ + mouseX: null, + mouseY: null + }); } } diff --git a/src/toc_tree.tsx b/src/toc_tree.tsx index 4d1801a..e2e19fd 100644 --- a/src/toc_tree.tsx +++ b/src/toc_tree.tsx @@ -2,6 +2,7 @@ // Distributed under the terms of the Modified BSD License. import * as React from 'react'; +import List from '@material-ui/core/List'; import { Widget } from '@lumino/widgets'; import { IHeading } from './utils/headings'; import { TableOfContentsRegistry as Registry } from './registry'; @@ -55,6 +56,16 @@ interface IState {} * @private */ class TOCTree extends React.Component { + /** + * Returns a component which renders a table of contents tree. + * + * @param props - component properties + * @returns component + */ + constructor(props: IProperties) { + super(props); + } + /** * Renders a table of contents tree. */ @@ -66,6 +77,7 @@ class TOCTree extends React.Component { let list: JSX.Element[] = this.props.toc.map(el => { return ( {
    {this.props.title}
    {Toolbar && } -
      {list}
    + {list}
    ); } diff --git a/style/index.css b/style/index.css index 93cb921..ac3aa8d 100644 --- a/style/index.css +++ b/style/index.css @@ -459,3 +459,18 @@ .toc-level-size-default { font-size: 9px; } + +/** + * TOC item context menu. + */ + +.jp-TableOfContents-item-contextmenu { + padding-top: 0 !important; + padding-bottom: 0 !important; + + background-color: var(--jp-layout-color2); +} + +.jp-TableOfContents-item-contextmenu-item { + color: var(--jp-ui-font-color0) !important; +} diff --git a/yarn.lock b/yarn.lock index 8a1d503..54b64e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + dependencies: + regenerator-runtime "^0.13.4" + "@blueprintjs/core@^3.22.2", "@blueprintjs/core@^3.24.0": version "3.24.0" resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.24.0.tgz#593a2b289bb94224f3a924eb1b3065ea3c4ca00a" @@ -59,6 +66,11 @@ classnames "^2.2" tslib "~1.10.0" +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + "@fortawesome/fontawesome-free@^5.12.0": version "5.12.1" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.1.tgz#2a98fea9fbb8a606ddc79a4680034e9d5591c550" @@ -583,6 +595,70 @@ "@lumino/signaling" "^1.3.5" "@lumino/virtualdom" "^1.6.1" +"@material-ui/core@^4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.10.2.tgz#0ef78572132fcef1a25f6969bce0d34652d42e31" + integrity sha512-Uf4iDLi9sW6HKbVQDyDZDr1nMR4RUAE7w/RIIJZGNVZResC0xwmpLRZMtaUdSO43N0R0yJehfxTi4Z461Cd49A== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.10.0" + "@material-ui/system" "^4.9.14" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.10.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0" + react-transition-group "^4.4.0" + +"@material-ui/styles@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.10.0.tgz#2406dc23aa358217aa8cc772e6237bd7f0544071" + integrity sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.6" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.0.3" + jss-plugin-camel-case "^10.0.3" + jss-plugin-default-unit "^10.0.3" + jss-plugin-global "^10.0.3" + jss-plugin-nested "^10.0.3" + jss-plugin-props-sort "^10.0.3" + jss-plugin-rule-value-function "^10.0.3" + jss-plugin-vendor-prefixer "^10.0.3" + prop-types "^15.7.2" + +"@material-ui/system@^4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.9.14.tgz#4b00c48b569340cefb2036d0596b93ac6c587a5f" + integrity sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.9.6" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.10.2", "@material-ui/utils@^4.9.6": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.10.2.tgz#3fd5470ca61b7341f1e0468ac8f29a70bf6df321" + integrity sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -612,6 +688,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" + integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@~16.4.13", "@types/react@~16.9.16": version "16.4.18" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.18.tgz#2e28a2e7f92d3fa7d6a65f2b73275c3e3138a13d" @@ -860,6 +943,11 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -939,11 +1027,24 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + csstype@^2.2.0, csstype@^2.4.0, csstype@~2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== +csstype@^2.5.2, csstype@^2.6.5, csstype@^2.6.7: + version "2.6.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" + integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== + date-fns@^1.27.2: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -1045,6 +1146,14 @@ dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" +dom-helpers@^5.0.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -1417,6 +1526,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -1450,6 +1566,11 @@ husky@^2.7.0: run-node "^1.0.0" slash "^3.0.0" +hyphenate-style-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" + integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -1595,6 +1716,11 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -1731,6 +1857,76 @@ json5@^2.1.1: dependencies: minimist "^1.2.0" +jss-plugin-camel-case@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.3.0.tgz#ae4da53b39a6e3ea94b70a20fc41c11f0b87386a" + integrity sha512-tadWRi/SLWqLK3EUZEdDNJL71F3ST93Zrl9JYMjV0QDqKPAl0Liue81q7m/nFUpnSTXczbKDy4wq8rI8o7WFqA== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "^10.3.0" + +jss-plugin-default-unit@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.3.0.tgz#cd74cf5088542620a82591f76c62c6b43a7e50a6" + integrity sha512-tT5KkIXAsZOSS9WDSe8m8lEHIjoEOj4Pr0WrG0WZZsMXZ1mVLFCSsD2jdWarQWDaRNyMj/I4d7czRRObhOxSuw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-global@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.3.0.tgz#6b883e74900bb71f65ac2b19bea78f7d1e85af3f" + integrity sha512-etYTG/y3qIR/vxZnKY+J3wXwObyBDNhBiB3l/EW9/pE3WHE//BZdK8LFvQcrCO48sZW1Z6paHo6klxUPP7WbzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-nested@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.3.0.tgz#ae8aceac95e09c3d40c991ea32403fb647d9e0a8" + integrity sha512-qWiEkoXNEkkZ+FZrWmUGpf+zBsnEOmKXhkjNX85/ZfWhH9dfGxUCKuJFuOWFM+rjQfxV4csfesq4hY0jk8Qt0w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.3.0.tgz#5b0625f87b6431a7969c56b0d8c696525969bfe4" + integrity sha512-boetORqL/lfd7BWeFD3K+IyPqyIC+l3CRrdZr+NPq7Noqp+xyg/0MR7QisgzpxCEulk+j2CRcEUoZsvgPC4nTg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-rule-value-function@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.3.0.tgz#498b0e2bae16cb316a6bdb73fd783cf9604ba747" + integrity sha512-7WiMrKIHH3rwxTuJki9+7nY11r1UXqaUZRhHvqTD4/ZE+SVhvtD5Tx21ivNxotwUSleucA/8boX+NF21oXzr5Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.3.0.tgz#b09c13a4d05a055429d8a24e19cc01ce049f0ed4" + integrity sha512-sZQbrcZyP5V0ADjCLwUA1spVWoaZvM7XZ+2fSeieZFBj31cRsnV7X70FFDerMHeiHAXKWzYek+67nMDjhrZAVQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "^10.3.0" + +jss@^10.0.3, jss@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.3.0.tgz#2cf7be265f72b59c1764d816fdabff1c5dd18326" + integrity sha512-B5sTRW9B6uHaUVzSo9YiMEOEp3UX8lWevU0Fsv+xtRnsShmgCfIYX44bTH8bPJe6LQKqEXku3ulKuHLbxBS97Q== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^2.6.5" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -2281,6 +2477,11 @@ please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: dependencies: semver-compare "^1.0.0" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + popper.js@^1.14.4, popper.js@^1.15.0: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" @@ -2305,7 +2506,7 @@ prettier@^1.19.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prop-types@^15.6.1, prop-types@^15.6.2: +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -2357,6 +2558,11 @@ react-dom@~16.9.0: prop-types "^15.6.2" scheduler "^0.15.0" +react-is@^16.7.0, react-is@^16.8.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^16.8.1: version "16.13.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" @@ -2390,6 +2596,16 @@ react-transition-group@^2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^16.8.6: version "16.13.0" resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" @@ -2832,6 +3048,11 @@ synchronous-promise@^2.0.6: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"