This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new f90824f  [Dashboard] new listview filters & emotion infra (#9462)
f90824f is described below

commit f90824fa178c2164d954a8f29a12309c7a06327e
Author: ʈᵃᵢ <[email protected]>
AuthorDate: Mon Apr 13 13:39:55 2020 -0700

    [Dashboard] new listview filters & emotion infra (#9462)
    
    * [Dashboard] listview filters to match new design
    
    * use title_or_slug filter
    
    * use ?. operator
    
    * move components to components folder
---
 superset-frontend/jest.config.js                   |   5 +-
 superset-frontend/package-lock.json                | 627 ++++++++++++++++-----
 superset-frontend/package.json                     |  11 +-
 .../components/ListView/ListView_spec.jsx          | 253 ++++++---
 .../src/components/ListView/Filters.tsx            | 168 ++++++
 .../src/components/ListView/LegacyFilters.tsx      | 199 +++++++
 .../src/components/ListView/ListView.tsx           | 219 ++-----
 superset-frontend/src/components/ListView/types.ts |  10 +-
 superset-frontend/src/components/ListView/utils.ts |  88 ++-
 .../components/SearchInput.tsx}                    |  39 +-
 .../components/StyledSelect.tsx}                   |  58 +-
 superset-frontend/src/featureFlags.ts              |   1 +
 .../src/types/react-table-config.d.ts              |   1 -
 .../src/views/dashboardList/DashboardList.tsx      |  41 +-
 superset-frontend/src/welcome/App.jsx              |  43 +-
 .../styled-components/superset-theme.ts}           |  48 +-
 superset-frontend/webpack.config.js                |   2 +
 superset/config.py                                 |   1 +
 18 files changed, 1302 insertions(+), 512 deletions(-)

diff --git a/superset-frontend/jest.config.js b/superset-frontend/jest.config.js
index 8a3c08a..44f460d 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/jest.config.js
@@ -34,13 +34,10 @@ module.exports = {
   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
   globals: {
     'ts-jest': {
+      babelConfig: true,
       diagnostics: {
         warnOnly: true,
       },
-      tsConfig: {
-        jsx: 'react',
-        esModuleInterop: true,
-      },
     },
   },
 };
diff --git a/superset-frontend/package-lock.json 
b/superset-frontend/package-lock.json
index e2c73d9..077a3a5 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -5360,6 +5360,145 @@
         "prop-types": "^15.6.0"
       }
     },
+    "@emotion/cache": {
+      "version": "10.0.29",
+      "resolved": 
"https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz";,
+      "integrity": 
"sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
+      "requires": {
+        "@emotion/sheet": "0.9.4",
+        "@emotion/stylis": "0.8.5",
+        "@emotion/utils": "0.11.3",
+        "@emotion/weak-memoize": "0.2.5"
+      }
+    },
+    "@emotion/core": {
+      "version": "10.0.28",
+      "resolved": 
"https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz";,
+      "integrity": 
"sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@emotion/cache": "^10.0.27",
+        "@emotion/css": "^10.0.27",
+        "@emotion/serialize": "^0.11.15",
+        "@emotion/sheet": "0.9.4",
+        "@emotion/utils": "0.11.3"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.9.2",
+          "resolved": 
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";,
+          "integrity": 
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.5",
+          "resolved": 
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";,
+          "integrity": 
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+        }
+      }
+    },
+    "@emotion/css": {
+      "version": "10.0.27",
+      "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz";,
+      "integrity": 
"sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
+      "requires": {
+        "@emotion/serialize": "^0.11.15",
+        "@emotion/utils": "0.11.3",
+        "babel-plugin-emotion": "^10.0.27"
+      }
+    },
+    "@emotion/hash": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz";,
+      "integrity": 
"sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
+    },
+    "@emotion/is-prop-valid": {
+      "version": "0.8.8",
+      "resolved": 
"https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz";,
+      "integrity": 
"sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+      "requires": {
+        "@emotion/memoize": "0.7.4"
+      }
+    },
+    "@emotion/memoize": {
+      "version": "0.7.4",
+      "resolved": 
"https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz";,
+      "integrity": 
"sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+    },
+    "@emotion/serialize": {
+      "version": "0.11.16",
+      "resolved": 
"https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz";,
+      "integrity": 
"sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
+      "requires": {
+        "@emotion/hash": "0.8.0",
+        "@emotion/memoize": "0.7.4",
+        "@emotion/unitless": "0.7.5",
+        "@emotion/utils": "0.11.3",
+        "csstype": "^2.5.7"
+      }
+    },
+    "@emotion/sheet": {
+      "version": "0.9.4",
+      "resolved": 
"https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz";,
+      "integrity": 
"sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
+    },
+    "@emotion/styled": {
+      "version": "10.0.27",
+      "resolved": 
"https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz";,
+      "integrity": 
"sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==",
+      "requires": {
+        "@emotion/styled-base": "^10.0.27",
+        "babel-plugin-emotion": "^10.0.27"
+      }
+    },
+    "@emotion/styled-base": {
+      "version": "10.0.31",
+      "resolved": 
"https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz";,
+      "integrity": 
"sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@emotion/is-prop-valid": "0.8.8",
+        "@emotion/serialize": "^0.11.15",
+        "@emotion/utils": "0.11.3"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.9.2",
+          "resolved": 
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";,
+          "integrity": 
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.5",
+          "resolved": 
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";,
+          "integrity": 
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+        }
+      }
+    },
+    "@emotion/stylis": {
+      "version": "0.8.5",
+      "resolved": 
"https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz";,
+      "integrity": 
"sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+    },
+    "@emotion/unitless": {
+      "version": "0.7.5",
+      "resolved": 
"https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz";,
+      "integrity": 
"sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+    },
+    "@emotion/utils": {
+      "version": "0.11.3",
+      "resolved": 
"https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz";,
+      "integrity": 
"sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
+    },
+    "@emotion/weak-memoize": {
+      "version": "0.2.5",
+      "resolved": 
"https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz";,
+      "integrity": 
"sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
+    },
     "@hot-loader/react-dom": {
       "version": "16.13.0",
       "resolved": 
"https://registry.npmjs.org/@hot-loader/react-dom/-/react-dom-16.13.0.tgz";,
@@ -7655,6 +7794,11 @@
         "@babel/runtime": "^7.0.0"
       }
     },
+    "@scarf/scarf": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz";,
+      "integrity": 
"sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg=="
+    },
     "@sinonjs/commons": {
       "version": "1.3.0",
       "resolved": 
"https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz";,
@@ -8721,6 +8865,11 @@
       "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.15.tgz";,
       "integrity": 
"sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA=="
     },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": 
"https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz";,
+      "integrity": 
"sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+    },
     "@types/prop-types": {
       "version": "15.5.8",
       "resolved": 
"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.8.tgz";,
@@ -10689,6 +10838,23 @@
         "object.assign": "^4.1.0"
       }
     },
+    "babel-plugin-emotion": {
+      "version": "10.0.29",
+      "resolved": 
"https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz";,
+      "integrity": 
"sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@emotion/hash": "0.8.0",
+        "@emotion/memoize": "0.7.4",
+        "@emotion/serialize": "^0.11.16",
+        "babel-plugin-macros": "^2.0.0",
+        "babel-plugin-syntax-jsx": "^6.18.0",
+        "convert-source-map": "^1.5.0",
+        "escape-string-regexp": "^1.0.5",
+        "find-root": "^1.1.0",
+        "source-map": "^0.5.7"
+      }
+    },
     "babel-plugin-istanbul": {
       "version": "6.0.0",
       "resolved": 
"https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz";,
@@ -10722,6 +10888,81 @@
         "require-package-name": "^2.0.1"
       }
     },
+    "babel-plugin-macros": {
+      "version": "2.8.0",
+      "resolved": 
"https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz";,
+      "integrity": 
"sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "cosmiconfig": "^6.0.0",
+        "resolve": "^1.12.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.9.2",
+          "resolved": 
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";,
+          "integrity": 
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "cosmiconfig": {
+          "version": "6.0.0",
+          "resolved": 
"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz";,
+          "integrity": 
"sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+          "requires": {
+            "@types/parse-json": "^4.0.0",
+            "import-fresh": "^3.1.0",
+            "parse-json": "^5.0.0",
+            "path-type": "^4.0.0",
+            "yaml": "^1.7.2"
+          }
+        },
+        "import-fresh": {
+          "version": "3.2.1",
+          "resolved": 
"https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz";,
+          "integrity": 
"sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.0.0",
+          "resolved": 
"https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz";,
+          "integrity": 
"sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": 
"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz";,
+          "integrity": 
"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        },
+        "regenerator-runtime": {
+          "version": "0.13.5",
+          "resolved": 
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";,
+          "integrity": 
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+        },
+        "resolve": {
+          "version": "1.15.1",
+          "resolved": 
"https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz";,
+          "integrity": 
"sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "babel-plugin-syntax-jsx": {
+      "version": "6.18.0",
+      "resolved": 
"https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz";,
+      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+    },
     "babel-polyfill": {
       "version": "6.26.0",
       "resolved": 
"https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";,
@@ -11516,28 +11757,28 @@
           "dependencies": {
             "abbrev": {
               "version": "1.1.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";,
               "integrity": 
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
               "dev": true,
               "optional": true
             },
             "ansi-regex": {
               "version": "2.1.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";,
               "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
               "dev": true,
               "optional": true
             },
             "aproba": {
               "version": "1.2.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";,
               "integrity": 
"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
               "dev": true,
               "optional": true
             },
             "are-we-there-yet": {
               "version": "1.1.5",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";,
               "integrity": 
"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
               "dev": true,
               "optional": true,
@@ -11548,14 +11789,14 @@
             },
             "balanced-match": {
               "version": "1.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";,
               "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
               "dev": true,
               "optional": true
             },
             "brace-expansion": {
               "version": "1.1.11",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";,
               "integrity": 
"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
               "dev": true,
               "optional": true,
@@ -11566,42 +11807,42 @@
             },
             "chownr": {
               "version": "1.1.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz";,
               "integrity": 
"sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
               "dev": true,
               "optional": true
             },
             "code-point-at": {
               "version": "1.1.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";,
               "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
               "dev": true,
               "optional": true
             },
             "concat-map": {
               "version": "0.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";,
               "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
               "dev": true,
               "optional": true
             },
             "console-control-strings": {
               "version": "1.1.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";,
               "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
               "dev": true,
               "optional": true
             },
             "core-util-is": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
               "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
               "dev": true,
               "optional": true
             },
             "debug": {
               "version": "4.1.1",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";,
               "integrity": 
"sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
               "dev": true,
               "optional": true,
@@ -11611,28 +11852,28 @@
             },
             "deep-extend": {
               "version": "0.6.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz";,
               "integrity": 
"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
               "dev": true,
               "optional": true
             },
             "delegates": {
               "version": "1.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";,
               "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
               "dev": true,
               "optional": true
             },
             "detect-libc": {
               "version": "1.0.3",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz";,
               "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
               "dev": true,
               "optional": true
             },
             "fs-minipass": {
               "version": "1.2.5",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz";,
               "integrity": 
"sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
               "dev": true,
               "optional": true,
@@ -11642,14 +11883,14 @@
             },
             "fs.realpath": {
               "version": "1.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";,
               "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
               "dev": true,
               "optional": true
             },
             "gauge": {
               "version": "2.7.4",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";,
               "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
               "dev": true,
               "optional": true,
@@ -11666,7 +11907,7 @@
             },
             "glob": {
               "version": "7.1.3",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";,
               "integrity": 
"sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
               "dev": true,
               "optional": true,
@@ -11681,14 +11922,14 @@
             },
             "has-unicode": {
               "version": "2.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";,
               "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
               "dev": true,
               "optional": true
             },
             "iconv-lite": {
               "version": "0.4.24",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";,
               "integrity": 
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
               "dev": true,
               "optional": true,
@@ -11698,7 +11939,7 @@
             },
             "ignore-walk": {
               "version": "3.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz";,
               "integrity": 
"sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
               "dev": true,
               "optional": true,
@@ -11708,7 +11949,7 @@
             },
             "inflight": {
               "version": "1.0.6",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";,
               "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
               "dev": true,
               "optional": true,
@@ -11719,21 +11960,21 @@
             },
             "inherits": {
               "version": "2.0.3",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";,
               "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
               "dev": true,
               "optional": true
             },
             "ini": {
               "version": "1.3.5",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";,
               "integrity": 
"sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
               "dev": true,
               "optional": true
             },
             "is-fullwidth-code-point": {
               "version": "1.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";,
               "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
               "dev": true,
               "optional": true,
@@ -11743,14 +11984,14 @@
             },
             "isarray": {
               "version": "1.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";,
               "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
               "dev": true,
               "optional": true
             },
             "minimatch": {
               "version": "3.0.4",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";,
               "integrity": 
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
               "dev": true,
               "optional": true,
@@ -11760,14 +12001,14 @@
             },
             "minimist": {
               "version": "0.0.8",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";,
               "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
               "dev": true,
               "optional": true
             },
             "minipass": {
               "version": "2.3.5",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz";,
               "integrity": 
"sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
               "dev": true,
               "optional": true,
@@ -11778,7 +12019,7 @@
             },
             "minizlib": {
               "version": "1.2.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz";,
               "integrity": 
"sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
               "dev": true,
               "optional": true,
@@ -11788,7 +12029,7 @@
             },
             "mkdirp": {
               "version": "0.5.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";,
               "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
               "dev": true,
               "optional": true,
@@ -11798,14 +12039,14 @@
             },
             "ms": {
               "version": "2.1.1",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";,
               "integrity": 
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
               "dev": true,
               "optional": true
             },
             "needle": {
               "version": "2.3.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/needle/-/needle-2.3.0.tgz";,
               "integrity": 
"sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
               "dev": true,
               "optional": true,
@@ -11817,7 +12058,7 @@
             },
             "node-pre-gyp": {
               "version": "0.12.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz";,
               "integrity": 
"sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
               "dev": true,
               "optional": true,
@@ -11836,7 +12077,7 @@
             },
             "nopt": {
               "version": "4.0.1",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";,
               "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
               "dev": true,
               "optional": true,
@@ -11847,14 +12088,14 @@
             },
             "npm-bundled": {
               "version": "1.0.6",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz";,
               "integrity": 
"sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
               "dev": true,
               "optional": true
             },
             "npm-packlist": {
               "version": "1.4.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz";,
               "integrity": 
"sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
               "dev": true,
               "optional": true,
@@ -11865,7 +12106,7 @@
             },
             "npmlog": {
               "version": "4.1.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";,
               "integrity": 
"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
               "dev": true,
               "optional": true,
@@ -11878,21 +12119,21 @@
             },
             "number-is-nan": {
               "version": "1.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";,
               "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
               "dev": true,
               "optional": true
             },
             "object-assign": {
               "version": "4.1.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";,
               "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
               "dev": true,
               "optional": true
             },
             "once": {
               "version": "1.4.0",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz";,
               "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
               "dev": true,
               "optional": true,
@@ -11902,21 +12143,21 @@
             },
             "os-homedir": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";,
               "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
               "dev": true,
               "optional": true
             },
             "os-tmpdir": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";,
               "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
               "dev": true,
               "optional": true
             },
             "osenv": {
               "version": "0.1.5",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";,
               "integrity": 
"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
               "dev": true,
               "optional": true,
@@ -11927,21 +12168,21 @@
             },
             "path-is-absolute": {
               "version": "1.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";,
               "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
               "dev": true,
               "optional": true
             },
             "process-nextick-args": {
               "version": "2.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz";,
               "integrity": 
"sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
               "dev": true,
               "optional": true
             },
             "rc": {
               "version": "1.2.8",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";,
               "integrity": 
"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
               "dev": true,
               "optional": true,
@@ -11963,7 +12204,7 @@
             },
             "readable-stream": {
               "version": "2.3.6",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";,
               "integrity": 
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
               "dev": true,
               "optional": true,
@@ -11979,7 +12220,7 @@
             },
             "rimraf": {
               "version": "2.6.3",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
               "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
               "dev": true,
               "optional": true,
@@ -11989,49 +12230,49 @@
             },
             "safe-buffer": {
               "version": "5.1.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";,
               "integrity": 
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
               "dev": true,
               "optional": true
             },
             "safer-buffer": {
               "version": "2.1.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";,
               "integrity": 
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
               "dev": true,
               "optional": true
             },
             "sax": {
               "version": "1.2.4",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";,
               "integrity": 
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
               "dev": true,
               "optional": true
             },
             "semver": {
               "version": "5.7.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/semver/-/semver-5.7.0.tgz";,
               "integrity": 
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
               "dev": true,
               "optional": true
             },
             "set-blocking": {
               "version": "2.0.0",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";,
               "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
               "dev": true,
               "optional": true
             },
             "signal-exit": {
               "version": "3.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";,
               "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
               "dev": true,
               "optional": true
             },
             "string-width": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";,
               "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
               "dev": true,
               "optional": true,
@@ -12043,7 +12284,7 @@
             },
             "string_decoder": {
               "version": "1.1.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";,
               "integrity": 
"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
               "dev": true,
               "optional": true,
@@ -12053,7 +12294,7 @@
             },
             "strip-ansi": {
               "version": "3.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";,
               "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
               "dev": true,
               "optional": true,
@@ -12063,14 +12304,14 @@
             },
             "strip-json-comments": {
               "version": "2.0.1",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";,
               "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
               "dev": true,
               "optional": true
             },
             "tar": {
               "version": "4.4.8",
-              "resolved": false,
+              "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz";,
               "integrity": 
"sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
               "dev": true,
               "optional": true,
@@ -12086,14 +12327,14 @@
             },
             "util-deprecate": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";,
               "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
               "dev": true,
               "optional": true
             },
             "wide-align": {
               "version": "1.1.3",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";,
               "integrity": 
"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
               "dev": true,
               "optional": true,
@@ -12103,14 +12344,14 @@
             },
             "wrappy": {
               "version": "1.0.2",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";,
               "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
               "dev": true,
               "optional": true
             },
             "yallist": {
               "version": "3.0.3",
-              "resolved": false,
+              "resolved": 
"https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz";,
               "integrity": 
"sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
               "dev": true,
               "optional": true
@@ -14408,6 +14649,81 @@
       "resolved": 
"https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz";,
       "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
     },
+    "emotion-theming": {
+      "version": "10.0.27",
+      "resolved": 
"https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.0.27.tgz";,
+      "integrity": 
"sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw==",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "@emotion/weak-memoize": "0.2.5",
+        "hoist-non-react-statics": "^3.3.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.9.2",
+          "resolved": 
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";,
+          "integrity": 
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "hoist-non-react-statics": {
+          "version": "3.3.2",
+          "resolved": 
"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz";,
+          "integrity": 
"sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+          "requires": {
+            "react-is": "^16.7.0"
+          }
+        },
+        "react-is": {
+          "version": "16.13.1",
+          "resolved": 
"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz";,
+          "integrity": 
"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.13.5",
+          "resolved": 
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";,
+          "integrity": 
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+        }
+      }
+    },
+    "emotion-ts-plugin": {
+      "version": "0.5.3",
+      "resolved": 
"https://registry.npmjs.org/emotion-ts-plugin/-/emotion-ts-plugin-0.5.3.tgz";,
+      "integrity": 
"sha512-GK60jpSpQIH3RdOeG9+/cnbdMJLpto8zVYVBMsKaFGL8yK2Pm/ej1Pa3LgkeBxVww/ELQyvTjwCMi5R+ZQkNSA==",
+      "dev": true,
+      "requires": {
+        "@emotion/hash": "^0.7.3",
+        "convert-source-map": "^1.7.0",
+        "find-root": "^1.1.0",
+        "lodash": "^4.17.15",
+        "source-map": "^0.7.3",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "@emotion/hash": {
+          "version": "0.7.4",
+          "resolved": 
"https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz";,
+          "integrity": 
"sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==",
+          "dev": true
+        },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": 
"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";,
+          "integrity": 
"sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": 
"https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz";,
+          "integrity": 
"sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        }
+      }
+    },
     "encodeurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";,
@@ -14571,7 +14887,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz";,
       "integrity": 
"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
       "requires": {
         "is-arrayish": "^0.2.1"
       }
@@ -16217,8 +16532,7 @@
     "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
+      "integrity": 
"sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
     },
     "find-up": {
       "version": "2.1.0",
@@ -16441,28 +16755,28 @@
               "dependencies": {
                 "abbrev": {
                   "version": "1.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";,
                   "integrity": 
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
                   "dev": true,
                   "optional": true
                 },
                 "ansi-regex": {
                   "version": "2.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";,
                   "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
                   "dev": true,
                   "optional": true
                 },
                 "aproba": {
                   "version": "1.2.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";,
                   "integrity": 
"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
                   "dev": true,
                   "optional": true
                 },
                 "are-we-there-yet": {
                   "version": "1.1.5",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";,
                   "integrity": 
"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
                   "dev": true,
                   "optional": true,
@@ -16473,14 +16787,14 @@
                 },
                 "balanced-match": {
                   "version": "1.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";,
                   "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
                   "dev": true,
                   "optional": true
                 },
                 "brace-expansion": {
                   "version": "1.1.11",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";,
                   "integrity": 
"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
                   "dev": true,
                   "optional": true,
@@ -16491,42 +16805,42 @@
                 },
                 "chownr": {
                   "version": "1.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz";,
                   "integrity": 
"sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
                   "dev": true,
                   "optional": true
                 },
                 "code-point-at": {
                   "version": "1.1.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";,
                   "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
                   "dev": true,
                   "optional": true
                 },
                 "concat-map": {
                   "version": "0.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";,
                   "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
                   "dev": true,
                   "optional": true
                 },
                 "console-control-strings": {
                   "version": "1.1.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";,
                   "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
                   "dev": true,
                   "optional": true
                 },
                 "core-util-is": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
                   "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
                   "dev": true,
                   "optional": true
                 },
                 "debug": {
                   "version": "4.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";,
                   "integrity": 
"sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
                   "dev": true,
                   "optional": true,
@@ -16536,28 +16850,28 @@
                 },
                 "deep-extend": {
                   "version": "0.6.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz";,
                   "integrity": 
"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
                   "dev": true,
                   "optional": true
                 },
                 "delegates": {
                   "version": "1.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";,
                   "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
                   "dev": true,
                   "optional": true
                 },
                 "detect-libc": {
                   "version": "1.0.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz";,
                   "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
                   "dev": true,
                   "optional": true
                 },
                 "fs-minipass": {
                   "version": "1.2.5",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz";,
                   "integrity": 
"sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
                   "dev": true,
                   "optional": true,
@@ -16567,14 +16881,14 @@
                 },
                 "fs.realpath": {
                   "version": "1.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";,
                   "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
                   "dev": true,
                   "optional": true
                 },
                 "gauge": {
                   "version": "2.7.4",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";,
                   "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
                   "dev": true,
                   "optional": true,
@@ -16591,7 +16905,7 @@
                 },
                 "glob": {
                   "version": "7.1.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";,
                   "integrity": 
"sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
                   "dev": true,
                   "optional": true,
@@ -16606,14 +16920,14 @@
                 },
                 "has-unicode": {
                   "version": "2.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";,
                   "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
                   "dev": true,
                   "optional": true
                 },
                 "iconv-lite": {
                   "version": "0.4.24",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";,
                   "integrity": 
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
                   "dev": true,
                   "optional": true,
@@ -16623,7 +16937,7 @@
                 },
                 "ignore-walk": {
                   "version": "3.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz";,
                   "integrity": 
"sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
                   "dev": true,
                   "optional": true,
@@ -16633,7 +16947,7 @@
                 },
                 "inflight": {
                   "version": "1.0.6",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";,
                   "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
                   "dev": true,
                   "optional": true,
@@ -16644,21 +16958,21 @@
                 },
                 "inherits": {
                   "version": "2.0.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";,
                   "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
                   "dev": true,
                   "optional": true
                 },
                 "ini": {
                   "version": "1.3.5",
-                  "resolved": false,
+                  "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";,
                   "integrity": 
"sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
                   "dev": true,
                   "optional": true
                 },
                 "is-fullwidth-code-point": {
                   "version": "1.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";,
                   "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
                   "dev": true,
                   "optional": true,
@@ -16668,14 +16982,14 @@
                 },
                 "isarray": {
                   "version": "1.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";,
                   "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
                   "dev": true,
                   "optional": true
                 },
                 "minimatch": {
                   "version": "3.0.4",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";,
                   "integrity": 
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
                   "dev": true,
                   "optional": true,
@@ -16685,14 +16999,14 @@
                 },
                 "minimist": {
                   "version": "0.0.8",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";,
                   "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
                   "dev": true,
                   "optional": true
                 },
                 "minipass": {
                   "version": "2.3.5",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz";,
                   "integrity": 
"sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
                   "dev": true,
                   "optional": true,
@@ -16703,7 +17017,7 @@
                 },
                 "minizlib": {
                   "version": "1.2.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz";,
                   "integrity": 
"sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
                   "dev": true,
                   "optional": true,
@@ -16713,7 +17027,7 @@
                 },
                 "mkdirp": {
                   "version": "0.5.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";,
                   "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
                   "dev": true,
                   "optional": true,
@@ -16723,14 +17037,14 @@
                 },
                 "ms": {
                   "version": "2.1.1",
-                  "resolved": false,
+                  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";,
                   "integrity": 
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
                   "dev": true,
                   "optional": true
                 },
                 "needle": {
                   "version": "2.3.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/needle/-/needle-2.3.0.tgz";,
                   "integrity": 
"sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
                   "dev": true,
                   "optional": true,
@@ -16742,7 +17056,7 @@
                 },
                 "node-pre-gyp": {
                   "version": "0.12.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz";,
                   "integrity": 
"sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
                   "dev": true,
                   "optional": true,
@@ -16761,7 +17075,7 @@
                 },
                 "nopt": {
                   "version": "4.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";,
                   "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
                   "dev": true,
                   "optional": true,
@@ -16772,14 +17086,14 @@
                 },
                 "npm-bundled": {
                   "version": "1.0.6",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz";,
                   "integrity": 
"sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
                   "dev": true,
                   "optional": true
                 },
                 "npm-packlist": {
                   "version": "1.4.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz";,
                   "integrity": 
"sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
                   "dev": true,
                   "optional": true,
@@ -16790,7 +17104,7 @@
                 },
                 "npmlog": {
                   "version": "4.1.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";,
                   "integrity": 
"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
                   "dev": true,
                   "optional": true,
@@ -16803,21 +17117,21 @@
                 },
                 "number-is-nan": {
                   "version": "1.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";,
                   "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
                   "dev": true,
                   "optional": true
                 },
                 "object-assign": {
                   "version": "4.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";,
                   "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
                   "dev": true,
                   "optional": true
                 },
                 "once": {
                   "version": "1.4.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/once/-/once-1.4.0.tgz";,
                   "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
                   "dev": true,
                   "optional": true,
@@ -16827,21 +17141,21 @@
                 },
                 "os-homedir": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";,
                   "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
                   "dev": true,
                   "optional": true
                 },
                 "os-tmpdir": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";,
                   "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
                   "dev": true,
                   "optional": true
                 },
                 "osenv": {
                   "version": "0.1.5",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";,
                   "integrity": 
"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
                   "dev": true,
                   "optional": true,
@@ -16852,21 +17166,21 @@
                 },
                 "path-is-absolute": {
                   "version": "1.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";,
                   "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
                   "dev": true,
                   "optional": true
                 },
                 "process-nextick-args": {
                   "version": "2.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz";,
                   "integrity": 
"sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
                   "dev": true,
                   "optional": true
                 },
                 "rc": {
                   "version": "1.2.8",
-                  "resolved": false,
+                  "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";,
                   "integrity": 
"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
                   "dev": true,
                   "optional": true,
@@ -16888,7 +17202,7 @@
                 },
                 "readable-stream": {
                   "version": "2.3.6",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";,
                   "integrity": 
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
                   "dev": true,
                   "optional": true,
@@ -16904,7 +17218,7 @@
                 },
                 "rimraf": {
                   "version": "2.6.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
                   "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
                   "dev": true,
                   "optional": true,
@@ -16914,49 +17228,49 @@
                 },
                 "safe-buffer": {
                   "version": "5.1.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";,
                   "integrity": 
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
                   "dev": true,
                   "optional": true
                 },
                 "safer-buffer": {
                   "version": "2.1.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";,
                   "integrity": 
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
                   "dev": true,
                   "optional": true
                 },
                 "sax": {
                   "version": "1.2.4",
-                  "resolved": false,
+                  "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";,
                   "integrity": 
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
                   "dev": true,
                   "optional": true
                 },
                 "semver": {
                   "version": "5.7.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/semver/-/semver-5.7.0.tgz";,
                   "integrity": 
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
                   "dev": true,
                   "optional": true
                 },
                 "set-blocking": {
                   "version": "2.0.0",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";,
                   "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
                   "dev": true,
                   "optional": true
                 },
                 "signal-exit": {
                   "version": "3.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";,
                   "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
                   "dev": true,
                   "optional": true
                 },
                 "string-width": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";,
                   "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
                   "dev": true,
                   "optional": true,
@@ -16968,7 +17282,7 @@
                 },
                 "string_decoder": {
                   "version": "1.1.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";,
                   "integrity": 
"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
                   "dev": true,
                   "optional": true,
@@ -16978,7 +17292,7 @@
                 },
                 "strip-ansi": {
                   "version": "3.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";,
                   "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
                   "dev": true,
                   "optional": true,
@@ -16988,14 +17302,14 @@
                 },
                 "strip-json-comments": {
                   "version": "2.0.1",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";,
                   "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
                   "dev": true,
                   "optional": true
                 },
                 "tar": {
                   "version": "4.4.8",
-                  "resolved": false,
+                  "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz";,
                   "integrity": 
"sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
                   "dev": true,
                   "optional": true,
@@ -17011,14 +17325,14 @@
                 },
                 "util-deprecate": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";,
                   "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
                   "dev": true,
                   "optional": true
                 },
                 "wide-align": {
                   "version": "1.1.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";,
                   "integrity": 
"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
                   "dev": true,
                   "optional": true,
@@ -17028,14 +17342,14 @@
                 },
                 "wrappy": {
                   "version": "1.0.2",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";,
                   "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
                   "dev": true,
                   "optional": true
                 },
                 "yallist": {
                   "version": "3.0.3",
-                  "resolved": false,
+                  "resolved": 
"https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz";,
                   "integrity": 
"sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
                   "dev": true,
                   "optional": true
@@ -18965,8 +19279,7 @@
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": 
"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz";,
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
     },
     "is-binary-path": {
       "version": "1.0.1",
@@ -25682,8 +25995,7 @@
     "json-parse-better-errors": {
       "version": "1.0.2",
       "resolved": 
"https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";,
-      "integrity": 
"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
+      "integrity": 
"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
     },
     "json-schema": {
       "version": "0.2.3",
@@ -25875,6 +26187,11 @@
         "type-check": "~0.3.2"
       }
     },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": 
"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz";,
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+    },
     "loader-runner": {
       "version": "2.3.1",
       "resolved": 
"https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz";,
@@ -27275,7 +27592,6 @@
       "version": "1.0.1",
       "resolved": 
"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz";,
       "integrity": 
"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
       "requires": {
         "callsites": "^3.0.0"
       }
@@ -30711,9 +31027,12 @@
       }
     },
     "react-table": {
-      "version": "7.0.0-rc.15",
-      "resolved": 
"https://registry.npmjs.org/react-table/-/react-table-7.0.0-rc.15.tgz";,
-      "integrity": 
"sha512-ofMOlgrioHhhvHjvjsQkxvfQzU98cqwy6BjPGNwhLN1vhgXeWi0mUGreaCPvRenEbTiXsQbMl4k3Xmx3Mut8Rw=="
+      "version": "7.0.4",
+      "resolved": 
"https://registry.npmjs.org/react-table/-/react-table-7.0.4.tgz";,
+      "integrity": 
"sha512-Uqpj+VnUIvsNWNtNFD1z2i7OCHdlhoJtQt0DWx3XOkZnvDyI/eCghK8YBfA9mY4TW7vEgCDLaRCcREC/fmcx6Q==",
+      "requires": {
+        "@scarf/scarf": "^0.1.5"
+      }
     },
     "react-test-renderer": {
       "version": "16.9.0",
@@ -31611,8 +31930,7 @@
     "resolve-from": {
       "version": "4.0.0",
       "resolved": 
"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz";,
-      "integrity": 
"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true
+      "integrity": 
"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
     },
     "resolve-pathname": {
       "version": "3.0.0",
@@ -37012,6 +37330,29 @@
       "integrity": 
"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
       "dev": true
     },
+    "yaml": {
+      "version": "1.8.3",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz";,
+      "integrity": 
"sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==",
+      "requires": {
+        "@babel/runtime": "^7.8.7"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.9.2",
+          "resolved": 
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";,
+          "integrity": 
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.5",
+          "resolved": 
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";,
+          "integrity": 
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+        }
+      }
+    },
     "yargs": {
       "version": "12.0.5",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz";,
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index d0a0589..1cf766b 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -16,7 +16,7 @@
     "prod": "node --max_old_space_size=4096 
./node_modules/webpack/bin/webpack.js --mode=production --colors --progress",
     "build-dev": "cross-env NODE_OPTIONS=--max_old_space_size=8192 
NODE_ENV=development webpack --mode=development --colors --progress",
     "build": "cross-env NODE_OPTIONS=--max_old_space_size=8192 
NODE_ENV=production webpack --mode=production --colors --progress",
-    "lint": "eslint --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx . && 
prettier --check '{src,stylesheets}/**/*.{css,less,sass,scss}'",
+    "lint": "prettier --check '{src,stylesheets}/**/*.{css,less,sass,scss}' && 
eslint --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx .",
     "lint-fix": "eslint --fix --ignore-path=.eslintignore --ext 
.js,.jsx,.ts,tsx . && npm run clean-css",
     "clean-css": "prettier --write 
'{src,stylesheets}/**/*.{css,less,sass,scss}'"
   },
@@ -53,6 +53,8 @@
   "dependencies": {
     "@babel/runtime-corejs3": "^7.8.4",
     "@data-ui/sparkline": "^0.0.54",
+    "@emotion/core": "^10.0.28",
+    "@emotion/styled": "^10.0.27",
     "@superset-ui/chart": "^0.12.11",
     "@superset-ui/chart-composition": "^0.12.8",
     "@superset-ui/color": "^0.12.8",
@@ -108,6 +110,7 @@
     "d3-scale": "^2.1.2",
     "dnd-core": "^2.6.0",
     "dompurify": "^2.0.7",
+    "emotion-theming": "^10.0.27",
     "geolib": "^2.0.24",
     "immutable": "^3.8.2",
     "interweave": "^11.2.0",
@@ -147,7 +150,7 @@
     "react-split": "^2.0.4",
     "react-sticky": "^6.0.2",
     "react-syntax-highlighter": "^7.0.4",
-    "react-table": "^7.0.0-rc.15",
+    "react-table": "^7.0.4",
     "react-transition-group": "^2.5.3",
     "react-ultimate-pagination": "^1.2.0",
     "react-virtualized": "9.19.1",
@@ -175,10 +178,12 @@
     "@babel/preset-react": "^7.8.3",
     "@babel/register": "^7.8.6",
     "@hot-loader/react-dom": "^16.13.0",
+    "@types/classnames": "^2.2.9",
     "@types/jest": "^25.1.4",
     "@types/jquery": "^3.3.32",
     "@types/react": "^16.9.23",
     "@types/react-dom": "^16.9.5",
+    "@types/react-json-tree": "^0.6.11",
     "@types/react-redux": "^7.1.7",
     "@types/react-table": "^7.0.2",
     "@types/react-ultimate-pagination": "^1.2.0",
@@ -189,12 +194,14 @@
     "babel-jest": "^25.1.0",
     "babel-loader": "^8.0.6",
     "babel-plugin-dynamic-import-node": "^2.3.0",
+    "babel-plugin-emotion": "^10.0.29",
     "babel-plugin-lodash": "^3.3.4",
     "cache-loader": "^1.2.2",
     "clean-webpack-plugin": "^3.0.0",
     "copy-webpack-plugin": "^5.1.1",
     "cross-env": "^5.2.0",
     "css-loader": "^1.0.0",
+    "emotion-ts-plugin": "^0.5.3",
     "enzyme": "^3.10.0",
     "enzyme-adapter-react-16": "^1.14.0",
     "eslint": "^6.2.2",
diff --git 
a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx 
b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
index fc8b569..eba56f1 100644
--- a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
@@ -20,43 +20,45 @@ import React from 'react';
 import { mount, shallow } from 'enzyme';
 import { act } from 'react-dom/test-utils';
 import { MenuItem, Pagination } from 'react-bootstrap';
+import Select from 'react-select';
 
 import ListView from 'src/components/ListView/ListView';
+import ListViewFilters from 'src/components/ListView/Filters';
 import ListViewPagination from 'src/components/ListView/Pagination';
 import { areArraysShallowEqual } from 'src/reduxUtils';
 
+const mockedProps = {
+  title: 'Data Table',
+  columns: [
+    {
+      accessor: 'id',
+      Header: 'ID',
+      sortable: true,
+    },
+    {
+      accessor: 'name',
+      Header: 'Name',
+    },
+  ],
+  filters: [
+    {
+      Header: 'Name',
+      id: 'name',
+      operators: [{ label: 'Starts With', value: 'sw' }],
+    },
+  ],
+  data: [
+    { id: 1, name: 'data 1' },
+    { id: 2, name: 'data 2' },
+  ],
+  count: 2,
+  pageSize: 1,
+  fetchData: jest.fn(() => []),
+  loading: false,
+  bulkActions: [{ name: 'do something', onSelect: jest.fn() }],
+};
+
 describe('ListView', () => {
-  const mockedProps = {
-    title: 'Data Table',
-    columns: [
-      {
-        accessor: 'id',
-        Header: 'ID',
-        sortable: true,
-      },
-      {
-        accessor: 'name',
-        Header: 'Name',
-        filterable: true,
-      },
-    ],
-    filters: [
-      {
-        Header: 'Name',
-        id: 'name',
-        operators: [{ label: 'Starts With', value: 'sw' }],
-      },
-    ],
-    data: [
-      { id: 1, name: 'data 1' },
-      { id: 2, name: 'data 2' },
-    ],
-    count: 2,
-    pageSize: 1,
-    fetchData: jest.fn(() => []),
-    loading: false,
-    bulkActions: [{ name: 'do something', onSelect: jest.fn() }],
-  };
   const wrapper = mount(<ListView {...mockedProps} />);
 
   afterEach(() => {
@@ -138,34 +140,35 @@ describe('ListView', () => {
     wrapper.update();
 
     expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
-                  Array [
-                    Object {
-                      "filters": Array [
-                        Object {
-                          "Header": "name",
-                          "id": "name",
-                          "operator": "sw",
-                          "value": "foo",
-                        },
-                      ],
-                      "pageIndex": 0,
-                      "pageSize": 1,
-                      "sortBy": Array [
-                        Object {
-                          "desc": false,
-                          "id": "id",
-                        },
-                      ],
-                    },
-                  ]
-            `);
+Array [
+  Object {
+    "filters": Array [
+      Object {
+        "id": "name",
+        "operator": "sw",
+        "value": "foo",
+      },
+    ],
+    "pageIndex": 0,
+    "pageSize": 1,
+    "sortBy": Array [
+      Object {
+        "desc": false,
+        "id": "id",
+      },
+    ],
+  },
+]
+`);
   });
+
   it('renders pagination controls', () => {
     expect(wrapper.find(Pagination).exists()).toBe(true);
     expect(wrapper.find(Pagination.Prev).exists()).toBe(true);
     expect(wrapper.find(Pagination.Item).exists()).toBe(true);
     expect(wrapper.find(Pagination.Next).exists()).toBe(true);
   });
+
   it('calls fetchData on page change', () => {
     act(() => {
       wrapper.find(ListViewPagination).prop('onChange')(2);
@@ -173,28 +176,28 @@ describe('ListView', () => {
     wrapper.update();
 
     expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
-                  Array [
-                    Object {
-                      "filters": Array [
-                        Object {
-                          "Header": "name",
-                          "id": "name",
-                          "operator": "sw",
-                          "value": "foo",
-                        },
-                      ],
-                      "pageIndex": 1,
-                      "pageSize": 1,
-                      "sortBy": Array [
-                        Object {
-                          "desc": false,
-                          "id": "id",
-                        },
-                      ],
-                    },
-                  ]
-            `);
+Array [
+  Object {
+    "filters": Array [
+      Object {
+        "id": "name",
+        "operator": "sw",
+        "value": "foo",
+      },
+    ],
+    "pageIndex": 1,
+    "pageSize": 1,
+    "sortBy": Array [
+      Object {
+        "desc": false,
+        "id": "id",
+      },
+    ],
+  },
+]
+`);
   });
+
   it('handles bulk actions on 1 row', () => {
     act(() => {
       wrapper
@@ -228,6 +231,7 @@ describe('ListView', () => {
                                     ]
                         `);
   });
+
   it('handles bulk actions on all rows', () => {
     act(() => {
       wrapper
@@ -265,6 +269,7 @@ describe('ListView', () => {
                         ]
                 `);
   });
+
   it('Throws an exception if filter missing in columns', () => {
     expect.assertions(1);
     const props = {
@@ -280,3 +285,105 @@ describe('ListView', () => {
     }
   });
 });
+
+describe('ListView with new UI filters', () => {
+  const newFiltersProps = {
+    ...mockedProps,
+    useNewUIFilters: true,
+    filters: [
+      {
+        Header: 'ID',
+        id: 'id',
+        input: 'select',
+        selects: [{ label: 'foo', value: 'bar' }],
+        operator: 'eq',
+      },
+      {
+        Header: 'Name',
+        id: 'name',
+        input: 'search',
+        operator: 'ct',
+      },
+    ],
+  };
+
+  const wrapper = mount(<ListView {...newFiltersProps} />);
+
+  afterEach(() => {
+    mockedProps.fetchData.mockClear();
+    mockedProps.bulkActions.forEach(ba => {
+      ba.onSelect.mockClear();
+    });
+  });
+
+  it('renders UI filters', () => {
+    expect(wrapper.find(ListViewFilters)).toHaveLength(1);
+  });
+
+  it('calls fetchData on filter', () => {
+    act(() => {
+      wrapper
+        .find('[data-test="filters-select"]')
+        .last()
+        .props()
+        .onChange({ value: 'bar' });
+    });
+
+    act(() => {
+      wrapper
+        .find('[data-test="filters-search"]')
+        .last()
+        .props()
+        .onChange({ currentTarget: { value: 'something' } });
+    });
+
+    wrapper.update();
+
+    act(() => {
+      wrapper
+        .find('[data-test="filters-search"]')
+        .last()
+        .props()
+        .onBlur();
+    });
+
+    expect(newFiltersProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
+  Array [
+    Object {
+      "filters": Array [
+        Object {
+          "id": "id",
+          "operator": "eq",
+          "value": "bar",
+        },
+      ],
+      "pageIndex": 0,
+      "pageSize": 1,
+      "sortBy": Array [],
+    },
+  ]
+  `);
+
+    expect(newFiltersProps.fetchData.mock.calls[1]).toMatchInlineSnapshot(`
+  Array [
+    Object {
+      "filters": Array [
+        Object {
+          "id": "id",
+          "operator": "eq",
+          "value": "bar",
+        },
+        Object {
+          "id": "name",
+          "operator": "ct",
+          "value": "something",
+        },
+      ],
+      "pageIndex": 0,
+      "pageSize": 1,
+      "sortBy": Array [],
+    },
+  ]
+  `);
+  });
+});
diff --git a/superset-frontend/src/components/ListView/Filters.tsx 
b/superset-frontend/src/components/ListView/Filters.tsx
new file mode 100644
index 0000000..69d35a1
--- /dev/null
+++ b/superset-frontend/src/components/ListView/Filters.tsx
@@ -0,0 +1,168 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { useState } from 'react';
+import styled from '@emotion/styled';
+import { withTheme } from 'emotion-theming';
+
+import StyledSelect from 'src/components/StyledSelect';
+import SearchInput from 'src/components/SearchInput';
+import { Filter, Filters, FilterValue, InternalFilter } from './types';
+
+interface BaseFilter {
+  Header: string;
+  initialValue: any;
+}
+interface SelectFilterProps extends BaseFilter {
+  onSelect: (selected: any) => any;
+  selects: Filter['selects'];
+  emptyLabel?: string;
+}
+
+const FilterContainer = styled.div`
+  display: inline;
+  margin-right: 8px;
+`;
+
+const Title = styled.span`
+  font-weight: bold;
+`;
+
+const CLEAR_SELECT_FILTER_VALUE = 'CLEAR_SELECT_FILTER_VALUE';
+
+function SelectFilter({
+  Header,
+  selects = [],
+  emptyLabel = 'None',
+  initialValue,
+  onSelect,
+}: SelectFilterProps) {
+  const clearFilterSelect = {
+    label: emptyLabel,
+    value: CLEAR_SELECT_FILTER_VALUE,
+  };
+  const options = React.useMemo(() => [clearFilterSelect, ...selects], [
+    emptyLabel,
+    selects,
+  ]);
+
+  const [value, setValue] = useState(
+    typeof initialValue === 'undefined'
+      ? clearFilterSelect.value
+      : initialValue,
+  );
+  const onChange = (selected: { label: string; value: any } | null) => {
+    if (selected === null) return;
+    setValue(selected.value);
+    onSelect(
+      selected.value === CLEAR_SELECT_FILTER_VALUE ? undefined : 
selected.value,
+    );
+  };
+
+  return (
+    <FilterContainer>
+      <Title>{Header}:</Title>
+      <StyledSelect
+        data-test="filters-select"
+        value={value}
+        options={options}
+        onChange={onChange}
+        clearable={false}
+      />
+    </FilterContainer>
+  );
+}
+
+interface SearchHeaderProps extends BaseFilter {
+  Header: string;
+  onSubmit: (val: string) => void;
+}
+
+function SearchFilter({ Header, initialValue, onSubmit }: SearchHeaderProps) {
+  const [value, setValue] = useState(initialValue || '');
+  const handleSubmit = () => onSubmit(value);
+
+  return (
+    <FilterContainer>
+      <SearchInput
+        data-test="filters-search"
+        placeholder={Header}
+        value={value}
+        onChange={e => {
+          setValue(e.currentTarget.value);
+        }}
+        onKeyDown={e => {
+          if (e.key === 'Enter') {
+            handleSubmit();
+          }
+        }}
+        onBlur={handleSubmit}
+      />
+    </FilterContainer>
+  );
+}
+
+interface UIFiltersProps {
+  filters: Filters;
+  internalFilters: InternalFilter[];
+  updateFilterValue: (id: number, value: FilterValue['value']) => void;
+}
+
+const FilterWrapper = styled.div`
+  padding: 24px 16px 8px;
+`;
+
+function UIFilters({
+  filters,
+  internalFilters = [],
+  updateFilterValue,
+}: UIFiltersProps) {
+  return (
+    <FilterWrapper>
+      {filters.map(({ Header, input, selects, unfilteredLabel }, index) => {
+        const initialValue =
+          internalFilters[index] && internalFilters[index].value;
+        if (input === 'select') {
+          return (
+            <SelectFilter
+              key={Header}
+              Header={Header}
+              selects={selects}
+              emptyLabel={unfilteredLabel}
+              initialValue={initialValue}
+              onSelect={(value: any) => updateFilterValue(index, value)}
+            />
+          );
+        }
+        if (input === 'search') {
+          return (
+            <SearchFilter
+              key={Header}
+              Header={Header}
+              initialValue={initialValue}
+              onSubmit={(value: string) => updateFilterValue(index, value)}
+            />
+          );
+        }
+        return null;
+      })}
+    </FilterWrapper>
+  );
+}
+
+export default withTheme(UIFilters);
diff --git a/superset-frontend/src/components/ListView/LegacyFilters.tsx 
b/superset-frontend/src/components/ListView/LegacyFilters.tsx
new file mode 100644
index 0000000..6c493bc
--- /dev/null
+++ b/superset-frontend/src/components/ListView/LegacyFilters.tsx
@@ -0,0 +1,199 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { t } from '@superset-ui/translation';
+import React, { Dispatch, SetStateAction } from 'react';
+import {
+  Button,
+  Col,
+  DropdownButton,
+  FormControl,
+  MenuItem,
+  Row,
+  // @ts-ignore
+} from 'react-bootstrap';
+// @ts-ignore
+import SelectComponent from 'react-select';
+// @ts-ignore
+import VirtualizedSelect from 'react-virtualized-select';
+import { Filters, InternalFilter, Select } from './types';
+import { extractInputValue, getDefaultFilterOperator } from './utils';
+
+export const FilterMenu = ({
+  filters,
+  internalFilters,
+  setInternalFilters,
+}: {
+  filters: Filters;
+  internalFilters: InternalFilter[];
+  setInternalFilters: Dispatch<SetStateAction<InternalFilter[]>>;
+}) => (
+  <div className="filter-dropdown">
+    <DropdownButton
+      id="filter-picker"
+      bsSize="small"
+      bsStyle={'default'}
+      noCaret
+      title={
+        <>
+          <i className="fa fa-filter text-primary" />
+          {'  '}
+          {t('Filter List')}
+        </>
+      }
+    >
+      {filters
+        .map(({ id, Header }) => ({
+          Header,
+          id,
+          value: undefined,
+        }))
+        .map(ft => (
+          <MenuItem
+            key={ft.id}
+            eventKey={ft}
+            onSelect={(fltr: typeof ft) =>
+              setInternalFilters([...internalFilters, fltr])
+            }
+          >
+            {ft.Header}
+          </MenuItem>
+        ))}
+    </DropdownButton>
+  </div>
+);
+
+export const FilterInputs = ({
+  internalFilters,
+  filters,
+  updateInternalFilter,
+  removeFilterAndApply,
+  filtersApplied,
+  applyFilters,
+}: {
+  internalFilters: InternalFilter[];
+  filters: Filters;
+  updateInternalFilter: (i: number, f: object) => void;
+  removeFilterAndApply: (i: number) => void;
+  filtersApplied: boolean;
+  applyFilters: () => void;
+}) => (
+  <>
+    {internalFilters.map((ft, i) => {
+      const filter = filters.find(f => f.id === ft.id);
+      if (!filter) {
+        console.error(`could not find filter for ${ft.id}`);
+        return null;
+      }
+      return (
+        <div key={`${ft.Header}-${i}`} className="filter-inputs">
+          <Row>
+            <Col className="text-center filter-column" md={2}>
+              <span>{ft.Header}</span>
+            </Col>
+            <Col md={2}>
+              <FormControl
+                componentClass="select"
+                bsSize="small"
+                value={ft.operator}
+                placeholder={filter ? getDefaultFilterOperator(filter) : ''}
+                onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
+                  updateInternalFilter(i, {
+                    operator: e.currentTarget.value,
+                  });
+                }}
+              >
+                {(filter.operators || []).map(({ label, value }: Select) => (
+                  <option key={label} value={value}>
+                    {label}
+                  </option>
+                ))}
+              </FormControl>
+            </Col>
+            <Col md={1} />
+            <Col md={4}>
+              {filter.input === 'select' && (
+                <VirtualizedSelect
+                  autoFocus
+                  multi
+                  searchable
+                  name={`filter-${filter.id}-select`}
+                  options={filter.selects}
+                  placeholder="Select Value"
+                  value={ft.value}
+                  selectComponent={SelectComponent}
+                  onChange={(e: Select[] | null) => {
+                    updateInternalFilter(i, {
+                      operator: ft.operator || 
getDefaultFilterOperator(filter),
+                      value: e ? e.map(s => s.value) : e,
+                    });
+                  }}
+                />
+              )}
+              {filter.input !== 'select' && (
+                <FormControl
+                  type={filter.input ? filter.input : 'text'}
+                  bsSize="small"
+                  value={ft.value || ''}
+                  checked={Boolean(ft.value)}
+                  onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
+                    e.persist();
+                    updateInternalFilter(i, {
+                      operator: ft.operator || 
getDefaultFilterOperator(filter),
+                      value: extractInputValue(filter.input, e),
+                    });
+                  }}
+                />
+              )}
+            </Col>
+            <Col md={1}>
+              <div
+                className="filter-close"
+                role="button"
+                tabIndex={0}
+                onClick={() => removeFilterAndApply(i)}
+              >
+                <i className="fa fa-close text-primary" />
+              </div>
+            </Col>
+          </Row>
+          <br />
+        </div>
+      );
+    })}
+    {internalFilters.length > 0 && (
+      <>
+        <Row>
+          <Col md={10} />
+          <Col md={2}>
+            <Button
+              data-test="apply-filters"
+              disabled={!!filtersApplied}
+              bsStyle="primary"
+              onClick={applyFilters}
+              bsSize="small"
+            >
+              {t('Apply')}
+            </Button>
+          </Col>
+        </Row>
+        <br />
+      </>
+    )}
+  </>
+);
diff --git a/superset-frontend/src/components/ListView/ListView.tsx 
b/superset-frontend/src/components/ListView/ListView.tsx
index f488777..2999d78 100644
--- a/superset-frontend/src/components/ListView/ListView.tsx
+++ b/superset-frontend/src/components/ListView/ListView.tsx
@@ -19,10 +19,8 @@
 import { t } from '@superset-ui/translation';
 import React, { FunctionComponent } from 'react';
 import {
-  Button,
   Col,
   DropdownButton,
-  FormControl,
   MenuItem,
   Row,
   // @ts-ignore
@@ -34,20 +32,10 @@ import VirtualizedSelect from 'react-virtualized-select';
 import IndeterminateCheckbox from '../IndeterminateCheckbox';
 import TableCollection from './TableCollection';
 import Pagination from './Pagination';
-import {
-  FetchDataConfig,
-  Filters,
-  InternalFilter,
-  Select,
-  SortColumn,
-} from './types';
-import {
-  convertFilters,
-  extractInputValue,
-  ListViewError,
-  removeFromList,
-  useListViewState,
-} from './utils';
+import { FilterMenu, FilterInputs } from './LegacyFilters';
+import FilterControls from './Filters';
+import { FetchDataConfig, Filters, SortColumn } from './types';
+import { ListViewError, useListViewState } from './utils';
 
 import './ListViewStyles.less';
 
@@ -67,6 +55,7 @@ interface Props {
     name: React.ReactNode;
     onSelect: (rows: any[]) => any;
   }>;
+  useNewUIFilters?: boolean;
 }
 
 const bulkSelectColumnConfig = {
@@ -95,6 +84,7 @@ const ListView: FunctionComponent<Props> = ({
   title = '',
   filters = [],
   bulkActions = [],
+  useNewUIFilters = false,
 }) => {
   const {
     getTableProps,
@@ -104,9 +94,10 @@ const ListView: FunctionComponent<Props> = ({
     prepareRow,
     pageCount = 1,
     gotoPage,
-    setAllFilters,
+    removeFilterAndApply,
     setInternalFilters,
     updateInternalFilter,
+    applyFilterValue,
     applyFilters,
     filtersApplied,
     selectedFlatRows,
@@ -120,6 +111,7 @@ const ListView: FunctionComponent<Props> = ({
     fetchData,
     initialPageSize,
     initialSort,
+    initialFilters: useNewUIFilters ? filters : [],
   });
   const filterable = Boolean(filters.length);
   if (filterable) {
@@ -136,161 +128,56 @@ const ListView: FunctionComponent<Props> = ({
     });
   }
 
-  const removeFilterAndApply = (index: number) => {
-    const updated = removeFromList(internalFilters, index);
-    setInternalFilters(updated);
-    setAllFilters(convertFilters(updated));
-  };
-
   return (
     <div className={`superset-list-view ${className}`}>
-      {title && filterable && (
-        <div className="header">
-          <Row>
-            <Col md={10}>
-              <h2>{t(title)}</h2>
-            </Col>
-            {filterable && (
-              <Col md={2}>
-                <div className="filter-dropdown">
-                  <DropdownButton
-                    id="filter-picker"
-                    bsSize="small"
-                    bsStyle={'default'}
-                    noCaret
-                    title={
-                      <>
-                        <i className="fa fa-filter text-primary" />
-                        {'  '}
-                        {t('Filter List')}
-                      </>
-                    }
-                  >
-                    {filters
-                      .map(({ id, Header }) => ({
-                        Header,
-                        id,
-                      }))
-                      .map((ft: InternalFilter) => (
-                        <MenuItem
-                          key={ft.id}
-                          eventKey={ft}
-                          onSelect={(fltr: InternalFilter) =>
-                            setInternalFilters([...internalFilters, fltr])
-                          }
-                        >
-                          {ft.Header}
-                        </MenuItem>
-                      ))}
-                  </DropdownButton>
-                </div>
-              </Col>
-            )}
-          </Row>
-          <hr />
-          {internalFilters.map((ft, i) => {
-            const filter = filters.find(f => f.id === ft.id);
-            if (!filter) {
-              console.error(`could not find filter for ${ft.id}`);
-              return null;
-            }
-            return (
-              <div key={`${ft.Header}-${i}`} className="filter-inputs">
+      <div className="header">
+        {!useNewUIFilters && (
+          <>
+            {title && filterable && (
+              <>
                 <Row>
-                  <Col className="text-center filter-column" md={2}>
-                    <span>{ft.Header}</span>
+                  <Col md={10}>
+                    <h2>{t(title)}</h2>
                   </Col>
-                  <Col md={2}>
-                    <FormControl
-                      componentClass="select"
-                      bsSize="small"
-                      value={ft.operator}
-                      placeholder={filter ? filter.operators[0] : ''}
-                      onChange={(e: React.MouseEvent<HTMLInputElement>) => {
-                        updateInternalFilter(i, {
-                          operator: e.currentTarget.value,
-                        });
-                      }}
-                    >
-                      {filter.operators.map(({ label, value }: Select) => (
-                        <option key={label} value={value}>
-                          {label}
-                        </option>
-                      ))}
-                    </FormControl>
-                  </Col>
-                  <Col md={1} />
-                  <Col md={4}>
-                    {filter.input === 'select' && (
-                      <VirtualizedSelect
-                        autoFocus
-                        multi
-                        searchable
-                        name={`filter-${filter.id}-select`}
-                        options={filter.selects}
-                        placeholder="Select Value"
-                        value={ft.value}
-                        selectComponent={SelectComponent}
-                        onChange={(e: Select[] | null) => {
-                          updateInternalFilter(i, {
-                            operator: ft.operator || filter.operators[0].value,
-                            value: e ? e.map(s => s.value) : e,
-                          });
-                        }}
-                      />
-                    )}
-                    {filter.input !== 'select' && (
-                      <FormControl
-                        type={filter.input ? filter.input : 'text'}
-                        bsSize="small"
-                        value={ft.value || ''}
-                        checked={Boolean(ft.value)}
-                        onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
-                          e.persist();
-                          updateInternalFilter(i, {
-                            operator: ft.operator || filter.operators[0].value,
-                            value: extractInputValue(filter.input, e),
-                          });
-                        }}
+                  {filterable && (
+                    <Col md={2}>
+                      <FilterMenu
+                        filters={filters}
+                        internalFilters={internalFilters}
+                        setInternalFilters={setInternalFilters}
                       />
-                    )}
-                  </Col>
-                  <Col md={1}>
-                    <div
-                      className="filter-close"
-                      role="button"
-                      tabIndex={0}
-                      onClick={() => removeFilterAndApply(i)}
-                    >
-                      <i className="fa fa-close text-primary" />
-                    </div>
-                  </Col>
+                    </Col>
+                  )}
                 </Row>
-                <br />
-              </div>
-            );
-          })}
-          {internalFilters.length > 0 && (
-            <>
-              <Row>
-                <Col md={10} />
-                <Col md={2}>
-                  <Button
-                    data-test="apply-filters"
-                    disabled={!!filtersApplied}
-                    bsStyle="primary"
-                    onClick={applyFilters}
-                    bsSize="small"
-                  >
-                    {t('Apply')}
-                  </Button>
-                </Col>
-              </Row>
-              <br />
-            </>
-          )}
-        </div>
-      )}
+                <hr />
+                <FilterInputs
+                  internalFilters={internalFilters}
+                  filters={filters}
+                  updateInternalFilter={updateInternalFilter}
+                  removeFilterAndApply={removeFilterAndApply}
+                  filtersApplied={filtersApplied}
+                  applyFilters={applyFilters}
+                />
+              </>
+            )}
+          </>
+        )}
+        {useNewUIFilters && (
+          <>
+            <Row>
+              <Col md={10}>
+                <h2>{t(title)}</h2>
+              </Col>
+            </Row>
+            <hr />
+            <FilterControls
+              filters={filters}
+              internalFilters={internalFilters}
+              updateFilterValue={applyFilterValue}
+            />
+          </>
+        )}
+      </div>
       <div className="body">
         <TableCollection
           getTableProps={getTableProps}
diff --git a/superset-frontend/src/components/ListView/types.ts 
b/superset-frontend/src/components/ListView/types.ts
index 294192d..de85949 100644
--- a/superset-frontend/src/components/ListView/types.ts
+++ b/superset-frontend/src/components/ListView/types.ts
@@ -31,8 +31,10 @@ export interface Select {
 export interface Filter {
   Header: string;
   id: string;
-  operators: Select[];
-  input?: 'text' | 'textarea' | 'select' | 'checkbox';
+  operators?: Select[];
+  operator?: string;
+  input?: 'text' | 'textarea' | 'select' | 'checkbox' | 'search';
+  unfilteredLabel?: string;
   selects?: Select[];
 }
 
@@ -41,7 +43,7 @@ export type Filters = Filter[];
 export interface FilterValue {
   id: string;
   operator?: string;
-  value: string | boolean | number;
+  value: string | boolean | number | null | undefined;
 }
 
 export interface FetchDataConfig {
@@ -52,7 +54,7 @@ export interface FetchDataConfig {
 }
 
 export interface InternalFilter extends FilterValue {
-  Header: string;
+  Header?: string;
 }
 
 export interface FilterOperatorMap {
diff --git a/superset-frontend/src/components/ListView/utils.ts 
b/superset-frontend/src/components/ListView/utils.ts
index d94703a..6bc643a 100644
--- a/superset-frontend/src/components/ListView/utils.ts
+++ b/superset-frontend/src/components/ListView/utils.ts
@@ -33,7 +33,13 @@ import {
   useQueryParams,
 } from 'use-query-params';
 
-import { FetchDataConfig, InternalFilter, SortColumn } from './types';
+import {
+  FetchDataConfig,
+  Filter,
+  FilterValue,
+  InternalFilter,
+  SortColumn,
+} from './types';
 
 export class ListViewError extends Error {
   name = 'ListViewError';
@@ -55,17 +61,22 @@ function updateInList(list: any[], index: number, update: 
any): any[] {
   ];
 }
 
+function mergeCreateFilterValues(list: Filter[], updateList: FilterValue[]) {
+  return list.map(({ id, operator }) => {
+    const update = updateList.find(obj => obj.id === id);
+
+    return { id, operator, value: update?.value };
+  });
+}
+
 // convert filters from UI objects to data objects
-export function convertFilters(fts: InternalFilter[]) {
+export function convertFilters(fts: InternalFilter[]): FilterValue[] {
   return fts
-    .filter((ft: InternalFilter) => ft.value)
-    .map(ft => ({ operator: ft.operator, ...ft }));
+    .filter(f => typeof f.value !== 'undefined')
+    .map(({ value, operator, id }) => ({ value, operator, id }));
 }
 
-export function extractInputValue(
-  inputType: 'text' | 'textarea' | 'checkbox' | 'select' | undefined,
-  event: any,
-) {
+export function extractInputValue(inputType: Filter['input'], event: any) {
   if (!inputType || inputType === 'text') {
     return event.currentTarget.value;
   }
@@ -76,6 +87,13 @@ export function extractInputValue(
   return null;
 }
 
+export function getDefaultFilterOperator(filter: Filter): string {
+  if (filter?.operator) return filter.operator;
+  if (filter?.operators?.length) {
+    return filter.operators[0].value;
+  }
+  return '';
+}
 interface UseListViewConfig {
   fetchData: (conf: FetchDataConfig) => any;
   columns: any[];
@@ -84,6 +102,7 @@ interface UseListViewConfig {
   initialPageSize: number;
   initialSort?: SortColumn[];
   bulkSelectMode?: boolean;
+  initialFilters?: Filter[];
   bulkSelectColumnConfig?: {
     id: string;
     Header: (conf: any) => React.ReactNode;
@@ -97,6 +116,7 @@ export function useListViewState({
   data,
   count,
   initialPageSize,
+  initialFilters = [],
   initialSort = [],
   bulkSelectMode = false,
   bulkSelectColumnConfig,
@@ -123,10 +143,13 @@ export function useListViewState({
     sortBy: initialSortBy,
   };
 
-  const columnsWithSelect = useMemo(
-    () => (bulkSelectMode ? [bulkSelectColumnConfig, ...columns] : columns),
-    [bulkSelectMode, columns],
-  );
+  const columnsWithSelect = useMemo(() => {
+    // add exact filter type so filters with falsey values are not filtered out
+    const columnsWithFilter = columns.map(f => ({ ...f, filter: 'exact' }));
+    return bulkSelectMode
+      ? [bulkSelectColumnConfig, ...columnsWithFilter]
+      : columnsWithFilter;
+  }, [bulkSelectMode, columns]);
 
   const {
     getTableProps,
@@ -166,6 +189,14 @@ export function useListViewState({
   );
 
   useEffect(() => {
+    if (initialFilters.length) {
+      setInternalFilters(
+        mergeCreateFilterValues(initialFilters, query.filters),
+      );
+    }
+  }, [initialFilters]);
+
+  useEffect(() => {
     const queryParams: any = {
       filters: internalFilters,
       pageIndex,
@@ -175,22 +206,41 @@ export function useListViewState({
       queryParams.sortOrder = sortBy[0].desc ? 'desc' : 'asc';
     }
     setQuery(queryParams);
-
     fetchData({ pageIndex, pageSize, sortBy, filters });
   }, [fetchData, pageIndex, pageSize, sortBy, filters]);
 
   const filtersApplied = internalFilters.every(
     ({ id, value, operator }, index) =>
       id &&
-      filters[index] &&
-      filters[index].id === id &&
-      filters[index].value === value &&
+      filters[index]?.id === id &&
+      filters[index]?.value === value &&
       // @ts-ignore
-      filters[index].operator === operator,
+      filters[index]?.operator === operator,
   );
 
+  const updateInternalFilter = (index: number, update: object) =>
+    setInternalFilters(updateInList(internalFilters, index, update));
+
+  const applyFilterValue = (index: number, value: any) => {
+    // skip redunundant updates
+    if (internalFilters[index].value === value) {
+      return;
+    }
+    const update = { ...internalFilters[index], value };
+    const updatedFilters = updateInList(internalFilters, index, update);
+    setInternalFilters(updatedFilters);
+    setAllFilters(convertFilters(updatedFilters));
+  };
+
+  const removeFilterAndApply = (index: number) => {
+    const updated = removeFromList(internalFilters, index);
+    setInternalFilters(updated);
+    setAllFilters(convertFilters(updated));
+  };
+
   return {
     applyFilters: () => setAllFilters(convertFilters(internalFilters)),
+    removeFilterAndApply,
     canNextPage,
     canPreviousPage,
     filtersApplied,
@@ -205,7 +255,7 @@ export function useListViewState({
     setAllFilters,
     setInternalFilters,
     state: { pageIndex, pageSize, sortBy, filters, internalFilters },
-    updateInternalFilter: (index: number, update: object) =>
-      setInternalFilters(updateInList(internalFilters, index, update)),
+    updateInternalFilter,
+    applyFilterValue,
   };
 }
diff --git a/superset-frontend/jest.config.js 
b/superset-frontend/src/components/SearchInput.tsx
similarity index 50%
copy from superset-frontend/jest.config.js
copy to superset-frontend/src/components/SearchInput.tsx
index 8a3c08a..dc4e744 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/src/components/SearchInput.tsx
@@ -16,31 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module.exports = {
-  testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
-  moduleNameMapper: {
-    '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
-    '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
-    '^src/(.*)$': '<rootDir>/src/$1',
-  },
-  setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
-  testURL: 'http://localhost',
-  collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
-  coverageDirectory: '<rootDir>/coverage/',
-  transform: {
-    '^.+\\.jsx?$': 'babel-jest',
-    '^.+\\.tsx?$': 'ts-jest',
-  },
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
-  globals: {
-    'ts-jest': {
-      diagnostics: {
-        warnOnly: true,
-      },
-      tsConfig: {
-        jsx: 'react',
-        esModuleInterop: true,
-      },
-    },
-  },
-};
+import styled from '@emotion/styled';
+
+export default styled.input`
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  padding: 4px 8px;
+  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+`;
diff --git a/superset-frontend/jest.config.js 
b/superset-frontend/src/components/StyledSelect.tsx
similarity index 50%
copy from superset-frontend/jest.config.js
copy to superset-frontend/src/components/StyledSelect.tsx
index 8a3c08a..1a47466 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/src/components/StyledSelect.tsx
@@ -16,31 +16,33 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module.exports = {
-  testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
-  moduleNameMapper: {
-    '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
-    '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
-    '^src/(.*)$': '<rootDir>/src/$1',
-  },
-  setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
-  testURL: 'http://localhost',
-  collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
-  coverageDirectory: '<rootDir>/coverage/',
-  transform: {
-    '^.+\\.jsx?$': 'babel-jest',
-    '^.+\\.tsx?$': 'ts-jest',
-  },
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
-  globals: {
-    'ts-jest': {
-      diagnostics: {
-        warnOnly: true,
-      },
-      tsConfig: {
-        jsx: 'react',
-        esModuleInterop: true,
-      },
-    },
-  },
-};
+import styled from '@emotion/styled';
+// @ts-ignore
+import Select from 'react-select';
+
+export default styled(Select)`
+  display: inline;
+  &.is-focused:not(.is-open) > .Select-control {
+    border: none;
+    box-shadow: none;
+  }
+  .Select-control {
+    display: inline-table;
+    border: none;
+    width: 100px;
+    &:focus,
+    &:hover {
+      border: none;
+      box-shadow: none;
+    }
+
+    .Select-arrow-zone {
+      padding-left: 10px;
+    }
+  }
+  .Select-menu-outer {
+    margin-top: 0;
+    border-bottom-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+`;
diff --git a/superset-frontend/src/featureFlags.ts 
b/superset-frontend/src/featureFlags.ts
index 0853578..b9d1e38 100644
--- a/superset-frontend/src/featureFlags.ts
+++ b/superset-frontend/src/featureFlags.ts
@@ -26,6 +26,7 @@ export enum FeatureFlag {
   ESTIMATE_QUERY_COST = 'ESTIMATE_QUERY_COST',
   SHARE_QUERIES_VIA_KV_STORE = 'SHARE_QUERIES_VIA_KV_STORE',
   SQLLAB_BACKEND_PERSISTENCE = 'SQLLAB_BACKEND_PERSISTENCE',
+  LIST_VIEWS_NEW_UI = 'LIST_VIEWS_NEW_UI',
 }
 
 export type FeatureFlagMap = {
diff --git a/superset-frontend/src/types/react-table-config.d.ts 
b/superset-frontend/src/types/react-table-config.d.ts
index a16a695..5c2321a 100644
--- a/superset-frontend/src/types/react-table-config.d.ts
+++ b/superset-frontend/src/types/react-table-config.d.ts
@@ -69,7 +69,6 @@ declare module 'react-table' {
   export interface TableOptions<D extends object>
     extends UseExpandedOptions<D>,
       UseFiltersOptions<D>,
-      UseFiltersOptions<D>,
       UseGlobalFiltersOptions<D>,
       UseGroupByOptions<D>,
       UsePaginationOptions<D>,
diff --git a/superset-frontend/src/views/dashboardList/DashboardList.tsx 
b/superset-frontend/src/views/dashboardList/DashboardList.tsx
index c36ddd8..0137c9e 100644
--- a/superset-frontend/src/views/dashboardList/DashboardList.tsx
+++ b/superset-frontend/src/views/dashboardList/DashboardList.tsx
@@ -32,6 +32,7 @@ import {
 } from 'src/components/ListView/types';
 import withToasts from 'src/messageToasts/enhancers/withToasts';
 import PropertiesModal from 'src/dashboard/components/PropertiesModal';
+import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
 
 const PAGE_SIZE = 25;
 
@@ -125,6 +126,10 @@ class DashboardList extends React.PureComponent<Props, 
State> {
     return this.hasPerm('can_mulexport');
   }
 
+  get isNewUIEnabled() {
+    return isFeatureEnabled(FeatureFlag.LIST_VIEWS_NEW_UI);
+  }
+
   initialSort = [{ id: 'changed_on', desc: true }];
 
   columns = [
@@ -378,6 +383,39 @@ class DashboardList extends React.PureComponent<Props, 
State> {
 
   updateFilters = () => {
     const { filterOperators, owners } = this.state;
+
+    if (this.isNewUIEnabled) {
+      return this.setState({
+        filters: [
+          {
+            Header: 'Owner',
+            id: 'owners',
+            input: 'select',
+            operator: 'rel_m_m',
+            unfilteredLabel: 'All',
+            selects: owners.map(({ text: label, value }) => ({ label, value 
})),
+          },
+          {
+            Header: 'Published',
+            id: 'published',
+            input: 'select',
+            operator: 'eq',
+            unfilteredLabel: 'Any',
+            selects: [
+              { label: 'Published', value: true },
+              { label: 'Unpublished', value: false },
+            ],
+          },
+          {
+            Header: 'Search',
+            id: 'dashboard_title',
+            input: 'search',
+            operator: 'title_or_slug',
+          },
+        ],
+      });
+    }
+
     const convertFilter = ({
       name: label,
       operator,
@@ -386,7 +424,7 @@ class DashboardList extends React.PureComponent<Props, 
State> {
       operator: string;
     }) => ({ label, value: operator });
 
-    this.setState({
+    return this.setState({
       filters: [
         {
           Header: 'Dashboard',
@@ -481,6 +519,7 @@ class DashboardList extends React.PureComponent<Props, 
State> {
                       initialSort={this.initialSort}
                       filters={filters}
                       bulkActions={bulkActions}
+                      useNewUIFilters={this.isNewUIEnabled}
                     />
                   </>
                 );
diff --git a/superset-frontend/src/welcome/App.jsx 
b/superset-frontend/src/welcome/App.jsx
index a83f6df..0580ccb 100644
--- a/superset-frontend/src/welcome/App.jsx
+++ b/superset-frontend/src/welcome/App.jsx
@@ -22,7 +22,10 @@ import thunk from 'redux-thunk';
 import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
 import { Provider } from 'react-redux';
 import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
+import { ThemeProvider } from 'emotion-theming';
 
+import { initFeatureFlags } from 'src/featureFlags';
+import { supersetTheme } from 'stylesheets/styled-components/superset-theme';
 import Menu from 'src/components/Menu/Menu';
 import DashboardList from 'src/views/dashboardList/DashboardList';
 import ChartList from 'src/views/chartList/ChartList';
@@ -41,6 +44,8 @@ const bootstrap = 
JSON.parse(container.getAttribute('data-bootstrap'));
 const user = { ...bootstrap.user };
 const menu = { ...bootstrap.common.menu_data };
 
+initFeatureFlags(bootstrap.common.feature_flags);
+
 const store = createStore(
   combineReducers({
     messageToasts: messageToastReducer,
@@ -51,24 +56,26 @@ const store = createStore(
 
 const App = () => (
   <Provider store={store}>
-    <Router>
-      <Menu data={menu} />
-      <Switch>
-        <Route path="/superset/welcome/">
-          <Welcome user={user} />
-        </Route>
-        <Route path="/dashboard/list/">
-          <DashboardList user={user} />
-        </Route>
-        <Route path="/chart/list/">
-          <ChartList user={user} />
-        </Route>
-        <Route path="/tablemodelview/list/">
-          <DatasetList user={user} />
-        </Route>
-      </Switch>
-      <ToastPresenter />
-    </Router>
+    <ThemeProvider theme={supersetTheme}>
+      <Router>
+        <Menu data={menu} />
+        <Switch>
+          <Route path="/superset/welcome/">
+            <Welcome user={user} />
+          </Route>
+          <Route path="/dashboard/list/">
+            <DashboardList user={user} />
+          </Route>
+          <Route path="/chart/list/">
+            <ChartList user={user} />
+          </Route>
+          <Route path="/tablemodelview/list/">
+            <DatasetList user={user} />
+          </Route>
+        </Switch>
+        <ToastPresenter />
+      </Router>
+    </ThemeProvider>
   </Provider>
 );
 
diff --git a/superset-frontend/jest.config.js 
b/superset-frontend/stylesheets/styled-components/superset-theme.ts
similarity index 51%
copy from superset-frontend/jest.config.js
copy to superset-frontend/stylesheets/styled-components/superset-theme.ts
index 8a3c08a..aadb575 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/stylesheets/styled-components/superset-theme.ts
@@ -16,31 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module.exports = {
-  testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
-  moduleNameMapper: {
-    '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
-    '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
-    '^src/(.*)$': '<rootDir>/src/$1',
-  },
-  setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
-  testURL: 'http://localhost',
-  collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
-  coverageDirectory: '<rootDir>/coverage/',
-  transform: {
-    '^.+\\.jsx?$': 'babel-jest',
-    '^.+\\.tsx?$': 'ts-jest',
-  },
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
-  globals: {
-    'ts-jest': {
-      diagnostics: {
-        warnOnly: true,
-      },
-      tsConfig: {
-        jsx: 'react',
-        esModuleInterop: true,
-      },
+import styled, { CreateStyled } from '@emotion/styled';
+
+const defaultTheme = {
+  borderRadius: '4px',
+  colors: {
+    primary: {
+      base: '#20A7C9',
+    },
+    secondary: {
+      base: '#444E7C',
+      dark1: '#363E63',
+      dark2: '#282E4A',
+      dark3: '#1B1F31',
+      light1: '#8E94B0',
+      light2: '#B4B8CA',
+      light3: '#D9DBE4',
+      light4: '#ECEEF2',
+      light5: '#F5F5F8',
     },
   },
+  gridUnit: '4px',
 };
+
+export default styled as CreateStyled<typeof defaultTheme>;
+
+export const supersetTheme = defaultTheme;
diff --git a/superset-frontend/webpack.config.js 
b/superset-frontend/webpack.config.js
index a07181c..50233b9 100644
--- a/superset-frontend/webpack.config.js
+++ b/superset-frontend/webpack.config.js
@@ -154,6 +154,7 @@ const babelLoader = {
     // disable gzip compression for cache files
     // faster when there are millions of small files
     cacheCompression: false,
+    plugins: ['emotion'],
   },
 };
 
@@ -198,6 +199,7 @@ const config = {
     alias: {
       src: path.resolve(APP_DIR, './src'),
       'react-dom': '@hot-loader/react-dom',
+      stylesheets: path.resolve(APP_DIR, './stylesheets'),
     },
     extensions: ['.ts', '.tsx', '.js', '.jsx'],
     symlinks: false,
diff --git a/superset/config.py b/superset/config.py
index 1d27119..28beb27 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -289,6 +289,7 @@ DEFAULT_FEATURE_FLAGS = {
     "SHARE_QUERIES_VIA_KV_STORE": False,
     "TAGGING_SYSTEM": False,
     "SQLLAB_BACKEND_PERSISTENCE": False,
+    "LIST_VIEWS_NEW_UI": False,
 }
 
 # This is merely a default.

Reply via email to