From d7ef6da6d80e9b8f4d5f5c443062b4069c7f2b49 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 28 Oct 2021 10:30:11 +0200 Subject: [PATCH] tabs in react --- .eslintrc.json | 35 + apps/remix-ide/src/app/files/fileManager.js | 2 +- apps/remix-ide/src/app/panels/main-view.js | 2 +- apps/remix-ide/src/app/panels/tab-proxy.js | 168 ++--- apps/remix-ide/src/app/tabs/theme-module.js | 2 +- libs/remix-ui/editor/README.md | 6 +- libs/remix-ui/tabs/.babelrc | 3 + libs/remix-ui/tabs/.eslintrc | 19 + libs/remix-ui/tabs/README.md | 4 + libs/remix-ui/tabs/src/index.ts | 1 + libs/remix-ui/tabs/src/lib/remix-ui-tabs.css | 48 ++ libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 69 ++ libs/remix-ui/tabs/tsconfig.json | 19 + libs/remix-ui/tabs/tsconfig.lib.json | 13 + nx.json | 3 + package-lock.json | 697 +------------------ package.json | 4 +- tsconfig.base.json | 23 +- workspace.json | 19 +- 19 files changed, 335 insertions(+), 802 deletions(-) create mode 100644 .eslintrc.json create mode 100644 libs/remix-ui/tabs/.babelrc create mode 100644 libs/remix-ui/tabs/.eslintrc create mode 100644 libs/remix-ui/tabs/README.md create mode 100644 libs/remix-ui/tabs/src/index.ts create mode 100644 libs/remix-ui/tabs/src/lib/remix-ui-tabs.css create mode 100644 libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx create mode 100644 libs/remix-ui/tabs/tsconfig.json create mode 100644 libs/remix-ui/tabs/tsconfig.lib.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..06cc47d9a2 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,35 @@ +{ + "root": true, + "ignorePatterns": ["**/*"], + "plugins": ["@nrwl/nx"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": { + "@nrwl/nx/enforce-module-boundaries": [ + "error", + { + "enforceBuildableLibDependency": true, + "allow": [], + "depConstraints": [ + { + "sourceTag": "*", + "onlyDependOnLibsWithTags": ["*"] + } + ] + } + ] + } + }, + { + "files": ["*.ts", "*.tsx"], + "extends": ["plugin:@nrwl/nx/typescript"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "extends": ["plugin:@nrwl/nx/javascript"], + "rules": {} + } + ] +} diff --git a/apps/remix-ide/src/app/files/fileManager.js b/apps/remix-ide/src/app/files/fileManager.js index 07fe178c5e..782eb3c89b 100644 --- a/apps/remix-ide/src/app/files/fileManager.js +++ b/apps/remix-ide/src/app/files/fileManager.js @@ -22,7 +22,7 @@ const profile = { icon: 'assets/img/fileManager.webp', permission: true, version: packageJson.version, - methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', 'saveCurrentFile'], + methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', 'saveCurrentFile', 'filesAllClosed'], kind: 'file-system' } const errorMsg = { diff --git a/apps/remix-ide/src/app/panels/main-view.js b/apps/remix-ide/src/app/panels/main-view.js index 8a76ee6565..537b296796 100644 --- a/apps/remix-ide/src/app/panels/main-view.js +++ b/apps/remix-ide/src/app/panels/main-view.js @@ -54,7 +54,7 @@ export class MainView { fileManager: self._components.registry.get('filemanager').api } - self.tabProxy = new TabProxy(self.fileManager, self.editor, self.appManager) + self.tabProxy = new TabProxy(self.fileManager, self.editor) /* We listen here on event from the tab component to display / hide the editor and mainpanel depending on the content that should be displayed diff --git a/apps/remix-ide/src/app/panels/tab-proxy.js b/apps/remix-ide/src/app/panels/tab-proxy.js index 887e560c13..ecf5ece29f 100644 --- a/apps/remix-ide/src/app/panels/tab-proxy.js +++ b/apps/remix-ide/src/app/panels/tab-proxy.js @@ -1,17 +1,9 @@ +import React from 'react' // eslint-disable-line +import ReactDOM from 'react-dom' import { Plugin } from '@remixproject/engine' -const yo = require('yo-yo') -const $ = require('jquery') +import { TabsUI } from '@remix-ui/tabs' const EventEmitter = require('events') -const globalRegistry = require('../../global/registry') -const csjs = require('csjs-inject') const helper = require('../../lib/helper') -require('remix-tabs') - -const css = csjs` - .remix_tabs div[title]{ - display: flex; - } -` const profile = { name: 'tabs', @@ -21,28 +13,29 @@ const profile = { // @todo(#650) Merge this with MainPanel into one plugin export class TabProxy extends Plugin { - constructor (fileManager, editor, appManager) { + constructor (fileManager, editor) { super(profile) this.event = new EventEmitter() this.fileManager = fileManager - this.appManager = appManager this.editor = editor this.data = {} this._view = {} this._handlers = {} this.loadedTabs = [] + } - globalRegistry.get('themeModule').api.events.on('themeChanged', (theme) => { - // update invert for all icons + onActivation () { + this.on('theme', 'themeChanged', (theme) => { + // update invert for all icons this.updateImgStyles() }) - fileManager.events.on('filesAllClosed', () => { + this.on('fileManager', 'filesAllClosed', () => { this.call('manager', 'activatePlugin', 'home') - this._view.filetabs.active = 'home' + this.tabsApi.activateTab('home') }) - fileManager.events.on('fileRemoved', (name) => { + this.on('fileManager', 'fileRemoved', (name) => { const workspace = this.fileManager.currentWorkspace() if (this.fileManager.mode === 'browser') { @@ -54,7 +47,7 @@ export class TabProxy extends Plugin { } }) - fileManager.events.on('fileClosed', (name) => { + this.on('fileManager', 'fileClosed', (name) => { const workspace = this.fileManager.currentWorkspace() if (this.fileManager.mode === 'browser') { @@ -66,14 +59,14 @@ export class TabProxy extends Plugin { } }) - fileManager.events.on('currentFileChanged', (file) => { + this.on('fileManager', 'currentFileChanged', (file) => { const workspace = this.fileManager.currentWorkspace() if (this.fileManager.mode === 'browser') { const workspacePath = workspace + '/' + file if (this._handlers[workspacePath]) { - this._view.filetabs.activateTab(workspacePath) + this.tabsApi.activateTab(workspacePath) return } this.addTab(workspacePath, '', () => { @@ -84,11 +77,12 @@ export class TabProxy extends Plugin { this.fileManager.closeFile(file) this.event.emit('closeFile', file) }) + this.tabsApi.activateTab(workspacePath) } else { const path = file.startsWith(this.fileManager.mode + '/') ? file : this.fileManager.mode + '/' + file if (this._handlers[path]) { - this._view.filetabs.activateTab(path) + this.tabsApi.activateTab(path) return } this.addTab(path, '', () => { @@ -99,10 +93,11 @@ export class TabProxy extends Plugin { this.fileManager.closeFile(file) this.event.emit('closeFile', file) }) + this.tabsApi.activateTab(path) } }) - fileManager.events.on('fileRenamed', (oldName, newName, isFolder) => { + this.on('fileManager', 'fileRenamed', (oldName, newName, isFolder) => { const workspace = this.fileManager.currentWorkspace() if (this.fileManager.mode === 'browser') { @@ -132,7 +127,7 @@ export class TabProxy extends Plugin { } }) - appManager.event.on('activate', ({ name, location, displayName, icon }) => { + this.on('manager', 'pluginActivated', ({ name, location, displayName, icon }) => { if (location === 'mainPanel') { this.addTab( name, @@ -148,32 +143,32 @@ export class TabProxy extends Plugin { } }) - appManager.event.on('deactivate', (profile) => { + this.on('manager', 'pluginDeactivated', (profile) => { this.removeTab(profile.name) }) } focus (name) { this.event.emit('switchApp', name) - this._view.filetabs.activateTab(name) + this.tabsApi.activateTab(name) } updateImgStyles () { - const images = this._view.filetabs.getElementsByClassName('iconImage') + const images = this.el.getElementsByClassName('iconImage') for (const element of images) { - globalRegistry.get('themeModule').api.fixInvert(element) - }; + this.call('theme', 'fixInvert', element) + } } switchTab (tabName) { if (this._handlers[tabName]) { this._handlers[tabName].switchTo() - this._view.filetabs.activateTab(tabName) + this.tabsApi.activateTab(tabName) } } switchNextTab () { - const active = this._view.filetabs.active + const active = this.tabsApi.active() if (active && this._handlers[active]) { const handlers = Object.keys(this._handlers) let i = handlers.indexOf(active) @@ -185,7 +180,7 @@ export class TabProxy extends Plugin { } switchPreviousTab () { - const active = this._view.filetabs.active + const active = this.tabsApi.active() if (active && this._handlers[active]) { const handlers = Object.keys(this._handlers) let i = handlers.indexOf(active) @@ -197,7 +192,7 @@ export class TabProxy extends Plugin { } switchToActiveTab () { - const active = this._view.filetabs.active + const active = this.tabsApi.active() if (active && this._handlers[active]) { this.switchTab(active) } @@ -232,8 +227,12 @@ export class TabProxy extends Plugin { title = formatPath.join('/') const titleLength = formatPath.length this.loadedTabs.push({ + id: name, name, - title + title, + icon, + tooltip: title, + iconClass: helper.getPathIcon(name) }) formatPath.shift() if (formatPath.length > 0) { @@ -243,12 +242,8 @@ export class TabProxy extends Plugin { const duplicateTabTitle = duplicateTabFormatPath.slice(0, titleLength).reverse().join('/') this.loadedTabs.push({ - name: duplicateTabName, - title: duplicateTabTitle - }) - this._view.filetabs.removeTab(duplicateTabName) - this._view.filetabs.addTab({ id: duplicateTabName, + name: duplicateTabName, title: duplicateTabTitle, icon, tooltip: duplicateTabName, @@ -260,27 +255,25 @@ export class TabProxy extends Plugin { } } else { this.loadedTabs.push({ + id: name, name, - title + title, + icon, + tooltip: title, + iconClass: helper.getPathIcon(name) }) } - this._view.filetabs.addTab({ - id: name, - title, - icon, - tooltip: name, - iconClass: helper.getPathIcon(name) - }) + this.renderComponent() this.updateImgStyles() this._handlers[name] = { switchTo, close } } removeTab (name) { - this._view.filetabs.removeTab(name) delete this._handlers[name] this.switchToActiveTab() this.loadedTabs = this.loadedTabs.filter(tab => tab.name !== name) + this.renderComponent() this.updateImgStyles() } @@ -288,63 +281,36 @@ export class TabProxy extends Plugin { this.handlers[type] = fn } - onZoomOut () { - this.editor.editorFontSize(-1) - } + renderComponent () { + const onSelect = (index) => { + if (this.loadedTabs[index]) { + const name = this.loadedTabs[index].name + if (this._handlers[name]) this._handlers[name].switchTo() + this.event.emit('tabCountChanged', this.loadedTabs.length) + } + } - onZoomIn () { - this.editor.editorFontSize(1) - } + const onClose = (index) => { + if (this.loadedTabs[index]) { + const name = this.loadedTabs[index].name + if (this._handlers[name]) this._handlers[name].close() + this.event.emit('tabCountChanged', this.loadedTabs.length) + } + } - renderTabsbar () { - this._view.filetabs = yo`` - this._view.filetabs.addEventListener('tabClosed', (event) => { - if (this._handlers[event.detail]) this._handlers[event.detail].close() - this.event.emit('tabCountChanged', this._view.filetabs.tabs.length) - }) - this._view.filetabs.addEventListener('tabActivated', (event) => { - if (this._handlers[event.detail]) this._handlers[event.detail].switchTo() - this.event.emit('tabCountChanged', this._view.filetabs.tabs.length) - }) + const onZoomIn = () => this.editor.editorFontSize(1) + const onZoomOut = () => this.editor.editorFontSize(-1) - this._view.filetabs.canAdd = false - - const zoomBtns = yo` -
- this.onZoomOut()}> - this.onZoomIn()}> -
- ` - - // @todo(#2492) remove style after the mainPanel layout fix. - this._view.tabs = yo` -
- ${zoomBtns} - - ${this._view.filetabs} -
- ` - - // tabs - var $filesEl = $(this._view.filetabs) - - // Switch tab - var self = this - $filesEl.on('click', '.file:not(.active)', function (ev) { - ev.preventDefault() - var name = $(this).find('.name').text() - self._handlers[name].switchTo() - return false - }) + const onReady = (api) => { this.tabsApi = api } - // Remove current tab - $filesEl.on('click', '.file .remove', function (ev) { - ev.preventDefault() - var name = $(this).parent().find('.name').text() - self._handlers[name].close() - return false - }) + ReactDOM.render( + + , this.el) + } - return this._view.tabs + renderTabsbar () { + this.el = document.createElement('div') + this.renderComponent() + return this.el } } diff --git a/apps/remix-ide/src/app/tabs/theme-module.js b/apps/remix-ide/src/app/tabs/theme-module.js index cbfef2d927..da3f8f9a78 100644 --- a/apps/remix-ide/src/app/tabs/theme-module.js +++ b/apps/remix-ide/src/app/tabs/theme-module.js @@ -21,7 +21,7 @@ const themes = [ const profile = { name: 'theme', events: ['themeChanged'], - methods: ['switchTheme', 'getThemes', 'currentTheme'], + methods: ['switchTheme', 'getThemes', 'currentTheme', 'fixInvert'], version: packageJson.version, kind: 'theme' } diff --git a/libs/remix-ui/editor/README.md b/libs/remix-ui/editor/README.md index 9950c7626a..5e63800aab 100644 --- a/libs/remix-ui/editor/README.md +++ b/libs/remix-ui/editor/README.md @@ -1,8 +1,4 @@ # remix-ui-editor This library was generated with [Nx](https://nx.dev). -Its purpose is to integrate Monaco editor as a react component inside Remix IDE. - -## Running unit tests - -Run `nx test remix-ui-editor` to execute the unit tests via [Jest](https://jestjs.io). +Its purpose is to integrate Monaco editor as a react component inside Remix IDE. \ No newline at end of file diff --git a/libs/remix-ui/tabs/.babelrc b/libs/remix-ui/tabs/.babelrc new file mode 100644 index 0000000000..cf7ddd99c6 --- /dev/null +++ b/libs/remix-ui/tabs/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": [["@nrwl/web/babel", { "useBuiltIns": "usage" }]] +} diff --git a/libs/remix-ui/tabs/.eslintrc b/libs/remix-ui/tabs/.eslintrc new file mode 100644 index 0000000000..3c2c73bfe9 --- /dev/null +++ b/libs/remix-ui/tabs/.eslintrc @@ -0,0 +1,19 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": "../../../.eslintrc", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 11, + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "error" + } +} \ No newline at end of file diff --git a/libs/remix-ui/tabs/README.md b/libs/remix-ui/tabs/README.md new file mode 100644 index 0000000000..eb7feb53fa --- /dev/null +++ b/libs/remix-ui/tabs/README.md @@ -0,0 +1,4 @@ +# remix-ui-tabs + +This library was generated with [Nx](https://nx.dev). +Its purpose is to integrate tabs for the Remix IDE main view. \ No newline at end of file diff --git a/libs/remix-ui/tabs/src/index.ts b/libs/remix-ui/tabs/src/index.ts new file mode 100644 index 0000000000..5f41e08497 --- /dev/null +++ b/libs/remix-ui/tabs/src/index.ts @@ -0,0 +1 @@ +export * from './lib/remix-ui-tabs' diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.css b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.css new file mode 100644 index 0000000000..08462647ec --- /dev/null +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.css @@ -0,0 +1,48 @@ +.remix-ui-tabs { + display: -webkit-box; + max-height: 42px +} +.remix-ui-tabs li { + display: inline-block; +} +.title-tabs { + padding: inherit; + align-items: center; + padding-right: 8px; + padding-left: 2px; + cursor: default; + /*to make it unselectable*/ + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently supported by any browser but < IE9 */ + vertical-align: middle; +} +.tab:hover .close-tabs{ + visibility: visible +} +.active .close-tabs { + visibility: visible +} +.close-tabs { + visibility: hidden; + padding-top: 4px; + font-size: medium; +} +.iconImage { + width: 16px; + height: 16px; +} +.active { + border: 1px solid transparent; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} +.editor-f1 { + height: 49px; +} +.editor-zoom { + height: 49px; +} diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx new file mode 100644 index 0000000000..0c2980116b --- /dev/null +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx @@ -0,0 +1,69 @@ +import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint-disable-line +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' + +import './remix-ui-tabs.css' + +/* eslint-disable-next-line */ +export interface TabsUIProps { + tabs: Array + onSelect: (index: number) => void + onClose: (index: number) => void + onZoomOut: () => void + onZoomIn: () => void + onReady: (api: any) => void +} + +export interface TabsUIApi { + activateTab: (namee: string) => void + active: () => string +} + +export const TabsUI = (props: TabsUIProps) => { + const [selectedIndex, setSelectedIndex] = useState(-1) + const currentIndexRef = useRef(-1) + + const renderTab = (tab, index) => { + const classNameImg = 'my-1 mr-1 text-dark ' + tab.iconClass + const classNameTab = 'nav-item nav-link tab' + (index === selectedIndex ? ' active' : '') + return ( +
+ {tab.icon ? () : ()} + {tab.title} + props.onClose(index)}> + + +
+ ) + } + + const active = () => { + return props.tabs[currentIndexRef.current].name + } + const activateTab = (name: string) => { + const index = props.tabs.findIndex((tab) => tab.name === name) + setSelectedIndex(index) + currentIndexRef.current = index + } + useEffect(() => { + props.onReady({ + activateTab, + active + }) + }, []) + + return ( +
+
+ props.onZoomOut()}> + props.onZoomIn()}> +
+ + { props.onSelect(index); setSelectedIndex(index); currentIndexRef.current = index }} > + {props.tabs.map((tab, i) => {renderTab(tab, i)})} + {props.tabs.map((tab) => )} + +
+ ) +} + +export default TabsUI diff --git a/libs/remix-ui/tabs/tsconfig.json b/libs/remix-ui/tabs/tsconfig.json new file mode 100644 index 0000000000..a7180ef589 --- /dev/null +++ b/libs/remix-ui/tabs/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/remix-ui/tabs/tsconfig.lib.json b/libs/remix-ui/tabs/tsconfig.lib.json new file mode 100644 index 0000000000..71adee65df --- /dev/null +++ b/libs/remix-ui/tabs/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": ["**/*.spec.ts", "**/*.spec.tsx"], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/nx.json b/nx.json index be231f010c..9f4c399b8e 100644 --- a/nx.json +++ b/nx.json @@ -132,6 +132,9 @@ }, "remix-ui-helper": { "tags": [] + }, + "remix-ui-tabs": { + "tags": [] } }, "targetDependencies": { diff --git a/package-lock.json b/package-lock.json index 5fcf108368..c0534af2bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3552,36 +3552,12 @@ "integrity": "sha1-9vGlzl05caSt6RoR0i1MRZrNN18=", "dev": true }, - "@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", - "dev": true - }, "@fortawesome/fontawesome-free": { "version": "5.15.4", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", "dev": true }, - "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", - "dev": true, - "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - } - }, - "@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", - "dev": true, - "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - } - }, "@gar/promisify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", @@ -10872,12 +10848,6 @@ "@xtuc/long": "4.2.2" } }, - "@webcomponents/webcomponentsjs": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.6.0.tgz", - "integrity": "sha512-Moog+Smx3ORTbWwuPqoclr+uvfLnciVd6wdCaVscHPrxbmQ/IJKm3wbB7hpzJtXWjAq2l/6QMlO85aZiOdtv5Q==", - "dev": true - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -14769,6 +14739,11 @@ } } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -16371,12 +16346,6 @@ "ms": "2.0.0" } }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, "debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", @@ -16642,28 +16611,6 @@ } } }, - "deglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", - "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", - "dev": true, - "requires": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^3.0.9", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - } - } - }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -17708,12 +17655,6 @@ "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", "dev": true }, - "eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", - "dev": true - }, "eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", @@ -19194,12 +19135,6 @@ "pkg-dir": "^3.0.0" } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -19331,12 +19266,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", - "dev": true - }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -29412,21 +29341,6 @@ } } }, - "lit-element": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz", - "integrity": "sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==", - "dev": true, - "requires": { - "lit-html": "^1.1.1" - } - }, - "lit-html": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.4.1.tgz", - "integrity": "sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==", - "dev": true - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -38654,17 +38568,6 @@ "load-json-file": "^4.0.0" } }, - "pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", - "dev": true, - "requires": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -38779,12 +38682,6 @@ "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", "dev": true }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -40033,6 +39930,15 @@ "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", "dev": true }, + "react-tabs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.2.tgz", + "integrity": "sha512-/o52eGKxFHRa+ssuTEgSM8qORnV4+k7ibW+aNQzKe+5gifeVz8nLxCrsI9xdRhfb0wCLdgIambIpb1qCxaMN+A==", + "requires": { + "clsx": "^1.1.0", + "prop-types": "^15.5.0" + } + }, "react-transition-group": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", @@ -40481,39 +40387,6 @@ } } }, - "remix-store": { - "version": "0.0.1-alpha.0", - "resolved": "https://registry.npmjs.org/remix-store/-/remix-store-0.0.1-alpha.0.tgz", - "integrity": "sha512-OK3ODBig+nxpPh0Aq+oZi5NL99rU1I5bSwNC10Qg4B8ZyIregFt+l5HukzBQBEtNl8kVYfWvjd1NsxizEBekWQ==", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "remix-tabs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/remix-tabs/-/remix-tabs-1.1.3.tgz", - "integrity": "sha512-Yb61kbFUI874PKpxgOXDMUnGLxYjH6JXSNnNofPed8I+ERJkp5OzXZ17abKwGAF+ZXnAVGGsZnjYYfOfoxiXMw==", - "dev": true, - "requires": { - "@fortawesome/fontawesome-svg-core": "^1.2.14", - "@fortawesome/free-solid-svg-icons": "^5.7.1", - "@webcomponents/webcomponentsjs": "^2.2.4", - "events": "^3.3.0", - "font-awesome": "^4.7.0", - "lit-element": "^2.0.0-rc.5", - "remix-store": "0.0.1-alpha.0", - "standard": "^12.0.1" - }, - "dependencies": { - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - } - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -40668,39 +40541,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -42747,509 +42587,6 @@ "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", "dev": true }, - "standard": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", - "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", - "dev": true, - "requires": { - "eslint": "~5.4.0", - "eslint-config-standard": "12.0.0", - "eslint-config-standard-jsx": "6.0.2", - "eslint-plugin-import": "~2.14.0", - "eslint-plugin-node": "~7.0.1", - "eslint-plugin-promise": "~4.0.0", - "eslint-plugin-react": "~7.11.1", - "eslint-plugin-standard": "~4.0.0", - "standard-engine": "~9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", - "dev": true, - "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", - "dev": true - }, - "eslint-plugin-es": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", - "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", - "dev": true, - "requires": { - "eslint-utils": "^1.4.2", - "regexpp": "^2.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", - "dev": true, - "requires": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" - } - }, - "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, - "standard-engine": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", - "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", - "dev": true, - "requires": { - "deglob": "^2.1.0", - "get-stdin": "^6.0.0", - "minimist": "^1.1.0", - "pkg-conf": "^2.0.0" - } - }, "state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", @@ -45717,12 +45054,6 @@ "set-value": "^2.0.1" } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", diff --git a/package.json b/package.json index b6d99a91d7..593867260f 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help", - "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd,remix-ui-tree-view,remix-ui-modal-dialog,remix-ui-toaster,remix-ui-helper,remix-ui-debugger-ui,remix-ui-workspace,remix-ui-static-analyser,remix-ui-checkbox,remix-ui-settings,remix-core-plugin,remix-ui-renderer,remix-ui-publish-to-storage,remix-ui-solidity-compiler,remix-ui-plugin-manager,remix-ui-terminal,remix-ui-editor", + "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd,remix-ui-tree-view,remix-ui-modal-dialog,remix-ui-toaster,remix-ui-helper,remix-ui-file-explorer,remix-ui-debugger-ui,remix-ui-workspace,remix-ui-static-analyser,remix-ui-checkbox,remix-ui-settings,remix-core-plugin,remix-ui-renderer,remix-ui-publish-to-storage,remix-ui-solidity-compiler,remix-ui-plugin-manager,remix-ui-terminal,remix-ui-editor,remix-ui-tabs", "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "publish:libs": "npm run build:libs && lerna publish --skip-git && npm run bumpVersion:libs", @@ -180,6 +180,7 @@ "react-beautiful-dnd": "^13.1.0", "react-bootstrap": "^1.6.4", "react-dom": "^17.0.2", + "react-tabs": "^3.2.2", "selenium": "^2.20.0", "signale": "^1.4.0", "string-similarity": "^4.0.4", @@ -289,7 +290,6 @@ "nyc": "^13.3.0", "onchange": "^3.2.1", "prettier": "1.19.1", - "remix-tabs": "1.1.3", "request": "^2.83.0", "rimraf": "^2.6.1", "selenium-standalone": "^7.1.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index 7121d2e13b..c0f4b6f093 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -16,14 +16,24 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@remix-project/remix-analyzer": ["dist/libs/remix-analyzer/src/index.js"], - "@remix-project/remix-astwalker": ["dist/libs/remix-astwalker/src/index.js"], + "@remix-project/remix-analyzer": [ + "dist/libs/remix-analyzer/src/index.js" + ], + "@remix-project/remix-astwalker": [ + "dist/libs/remix-astwalker/src/index.js" + ], "@remix-project/remix-debug": ["dist/libs/remix-debug/src/index.js"], "@remix-project/remix-lib": ["dist/libs/remix-lib/src/index.js"], - "@remix-project/remix-simulator": ["dist/libs/remix-simulator/src/index.js"], - "@remix-project/remix-solidity": ["dist/libs/remix-solidity/src/index.js"], + "@remix-project/remix-simulator": [ + "dist/libs/remix-simulator/src/index.js" + ], + "@remix-project/remix-solidity": [ + "dist/libs/remix-solidity/src/index.js" + ], "@remix-project/remix-tests": ["dist/libs/remix-tests/src/index.js"], - "@remix-project/remix-url-resolver": ["dist/libs/remix-url-resolver/src/index.js"], + "@remix-project/remix-url-resolver": [ + "dist/libs/remix-url-resolver/src/index.js" + ], "@remixproject/debugger-plugin": ["apps/debugger/src/index.ts"], "@remixproject/solidity-compiler-plugin": [ "apps/solidity-compiler/src/index.ts" @@ -51,10 +61,11 @@ "@remix-ui/publish-to-storage": [ "libs/remix-ui/publish-to-storage/src/index.ts" ], - "@remix-ui/plugin-manager": ["libs/remix-ui/plugin-manager/src/index.ts"], "@remix-ui/renderer": ["libs/remix-ui/renderer/src/index.ts"], "@remix-ui/terminal": ["libs/remix-ui/terminal/src/index.ts"], + "@remix-ui/plugin-manager": ["libs/remix-ui/plugin-manager/src/index.ts"], "@remix-ui/editor": ["libs/remix-ui/editor/src/index.ts"], + "@remix-ui/tabs": ["libs/remix-ui/tabs/src/index.ts"], "@remix-ui/helper": ["libs/remix-ui/helper/src/index.ts"] } }, diff --git a/workspace.json b/workspace.json index f1496361d6..cbf1e710f2 100644 --- a/workspace.json +++ b/workspace.json @@ -776,8 +776,8 @@ } }, "remix-ui-plugin-manager": { - "root": "libs/remix-ui/plugin-manager", - "sourceRoot": "libs/remix-ui/plugin-manager/src", + "root": "libs/remix-ui/plugin-manager", + "sourceRoot": "libs/remix-ui/plugin-manager/src", "projectType": "library", "schematics": {}, "architect": { @@ -1048,6 +1048,21 @@ } } } + }, + "remix-ui-tabs": { + "root": "libs/remix-ui/tabs", + "sourceRoot": "libs/remix-ui/tabs/src", + "projectType": "library", + "architect": { + "lint": { + "builder": "@nrwl/linter:lint", + "options": { + "linter": "eslint", + "tsConfig": ["libs/remix-ui/tabs/tsconfig.lib.json"], + "exclude": ["**/node_modules/**", "!libs/remix-ui/tabs/**/*"] + } + } + } } }, "cli": {