From 3ddb57557a31c38e60285438d056a0bb04d67449 Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Fri, 20 Oct 2023 16:42:18 +0200
Subject: [PATCH] update material to 15

---
 package-lock.json                             | 929 ++++++++++++++++--
 package.json                                  |   4 +-
 .../atlas-download.directive.ts               |   2 +-
 src/atlas-download/atlas-download.module.ts   |   4 +-
 src/atlasComponents/sapi/module.ts            |   4 +-
 src/atlasComponents/sapi/sapi.service.ts      |   2 +-
 .../sapiViews/core/atlas/module.ts            |   6 +-
 .../splashScreen/splashScreen.template.html   |   6 +-
 .../sapiViews/core/region/module.ts           |  10 -
 .../sapiViews/core/rich/ATPSelector/module.ts |  10 +-
 .../pureDumb/pureATPSelector.stories.ts       |   4 +-
 .../ATPSelector/wrapper/wrapper.component.ts  |   2 +-
 .../ATPSelector/wrapper/wrapper.stories.ts    |   4 +-
 .../regionsHierarchy.stories.ts               |   2 +-
 .../regionListSearch.component.ts             |   2 +-
 .../regionListSearch.template.html            |   2 +-
 .../point-assignment.component.spec.ts        |   4 +-
 .../point-assignment.component.ts             |   2 +-
 .../sapiViews/volumes/volumes.module.ts       |  12 +-
 .../annotationList.component.spec.ts          |  14 +-
 .../annotationList.component.ts               |   4 +-
 .../annotationMode.component.ts               |   2 +-
 .../singleAnnotationUnit.component.ts         |   2 +-
 .../tools/line/line.component.ts              |   2 +-
 .../tools/line/line.template.html             |   4 +-
 .../tools/point/point.template.html           |   4 +-
 .../tools/poly/poly.component.ts              |   2 +-
 .../tools/poly/poly.template.html             |   4 +-
 .../userAnnotations/tools/service.spec.ts     |   4 +-
 .../userAnnotations/tools/service.ts          |   2 +-
 .../textareaCopyExport.component.ts           |   2 +-
 src/atlasViewer/atlasViewer.component.ts      |   4 +-
 .../confirmDialog.component.spec.ts           |   2 +-
 .../confirmDialog/confirmDialog.component.ts  |   2 +-
 src/components/dialog/dialog.component.ts     |   2 +-
 .../treeView/treeView.component.ts            |   2 +-
 src/components/smartChip/module.ts            |   6 +-
 src/components/smartChip/smartChip.stories.ts |   6 +-
 src/dragDropFile/dragDrop.directive.ts        |   2 +-
 src/extra_styles.css                          |   4 +-
 src/features/connectivity/module.ts           |  17 +-
 src/features/entry/entry.component.ts         |   2 +-
 src/features/module.ts                        |  26 +-
 .../fileInputModal.component.ts               |   2 +-
 src/getFileInput/getFileInput.directive.ts    |   2 +-
 src/getFileInput/module.ts                    |   8 +-
 .../keyframeCtrl/keyframeCtrl.component.ts    |   2 +-
 src/main.module.ts                            |   1 -
 src/messaging/service.ts                      |   2 +-
 .../pluginBanner/pluginBanner.component.ts    |   2 +-
 .../screenshotCmp/screenshot.component.ts     |   3 +-
 src/services/dialogService.service.ts         |   2 +-
 src/services/uiService.service.ts             |   8 +-
 src/share/clipboardCopy.directive.ts          |   3 +-
 src/share/saneUrl/saneUrl.component.ts        |   5 +-
 src/share/share.directive.ts                  |   2 +-
 src/share/shareSheet/shareSheet.component.ts  |   2 +-
 src/sharedModules/angularMaterial.exports.ts  |  14 +
 src/sharedModules/angularMaterial.module.ts   |  96 +-
 src/state/atlasSelection/effects.spec.ts      |   2 +-
 src/state/atlasSelection/effects.ts           |   2 +-
 src/state/userInterface/actions.ts            |   3 +-
 src/state/userInterface/effects.ts            |   3 +-
 src/strictLocal/module.ts                     |   6 +-
 src/theme.scss                                |  84 +-
 src/ui/actionDialog/actionDialog.component.ts |   2 +-
 src/ui/bottomMenu/module.ts                   |   6 +-
 src/ui/config/configCmp/config.component.ts   |   7 +-
 src/ui/config/configCmp/config.template.html  |   6 +-
 src/ui/dialogInfo/dialog.directive.ts         |   2 +-
 src/ui/dialogInfo/module.ts                   |   8 +-
 src/ui/dialogInfo/tmpl/tmpl.component.ts      |   2 +-
 src/ui/help/about/about.component.ts          |   2 +-
 src/ui/help/module.ts                         |   6 +-
 src/ui/quickTour/quickTour.service.ts         |   2 +-
 .../startTourDialog.component.ts              |   2 +-
 src/ui/topMenu/module.ts                      |   3 +-
 .../topMenu/topMenuCmp/topMenu.components.ts  |   3 +-
 src/util/df-to-ds.pipe.ts                     |   3 +-
 .../side-panel/side-panel.component.spec.ts   |   4 +-
 src/util/util.module.ts                       |   4 +-
 src/viewerModule/leap/module.ts               |   4 +-
 .../nehuba/layoutOverlay/module.ts            |   7 +-
 .../nehuba/ngLayerCtlModule/module.ts         |   7 +-
 .../ngLayerCtl/ngLayerCtrl.stories.ts         |   6 +-
 .../statusCard/statusCard.component.spec.ts   |   2 +-
 .../nehuba/statusCard/statusCard.component.ts |   3 +-
 src/viewerModule/nehuba/userLayers/module.ts  |  12 +-
 src/viewerModule/nehuba/userLayers/service.ts |   6 +-
 .../userLayers/userlayerDragdrop.directive.ts |   2 +-
 .../userlayerInfo/userlayerInfo.component.ts  |   2 +-
 .../viewerCtrlCmp.component.spec.ts           |   2 +-
 src/viewerModule/threeSurfer/module.ts        |   2 -
 .../threeSurferGlue/threeSurfer.component.ts  |   2 +-
 .../viewerCmp/viewerCmp.template.html         |   4 +-
 src/widget/constants.ts                       |   2 +-
 src/widget/widget.module.ts                   |  10 +-
 97 files changed, 1078 insertions(+), 443 deletions(-)
 create mode 100644 src/sharedModules/angularMaterial.exports.ts

diff --git a/package-lock.json b/package-lock.json
index f0e85ed35..e1ec1eefc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,12 +10,12 @@
       "license": "apache-2.0",
       "dependencies": {
         "@angular/animations": "^15.2.10",
-        "@angular/cdk": "^14.2.7",
+        "@angular/cdk": "^15.2.9",
         "@angular/common": "^15.2.10",
         "@angular/compiler": "^15.2.10",
         "@angular/core": "^15.2.10",
         "@angular/forms": "^15.2.10",
-        "@angular/material": "^14.2.7",
+        "@angular/material": "^15.2.9",
         "@angular/platform-browser": "^15.2.10",
         "@angular/platform-browser-dynamic": "^15.2.10",
         "@angular/router": "^15.2.10",
@@ -594,18 +594,18 @@
       }
     },
     "node_modules/@angular/cdk": {
-      "version": "14.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz",
-      "integrity": "sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==",
+      "version": "15.2.9",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.9.tgz",
+      "integrity": "sha512-koaM07N1AIQ5oHU27l0/FoQSSoYAwlAYwVZ4Di3bYrJsTBNCN2Xsby7wI8gZxdepMnV4Fe9si382BDBov+oO4Q==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
       "optionalDependencies": {
-        "parse5": "^5.0.0"
+        "parse5": "^7.1.2"
       },
       "peerDependencies": {
-        "@angular/common": "^14.0.0 || ^15.0.0",
-        "@angular/core": "^14.0.0 || ^15.0.0",
+        "@angular/common": "^15.0.0 || ^16.0.0",
+        "@angular/core": "^15.0.0 || ^16.0.0",
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
@@ -835,19 +835,66 @@
       }
     },
     "node_modules/@angular/material": {
-      "version": "14.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.7.tgz",
-      "integrity": "sha512-WXHh8pEStpgkXZJmYOg2cI8BSHkV82ET4XTJCNPdveumaCn1UYnaNzsXD13kw5z+zmy8CufhFEzdXTrv/yt7KQ==",
-      "dependencies": {
+      "version": "15.2.9",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.9.tgz",
+      "integrity": "sha512-emuFF/7+91Jq+6kVCl3FiVoFLtAZoh+woFQWNuK8nhx0HmD4ckLFI8d9a6ERYR3zRuKhq5deSRE2kYsfpjrrsQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/auto-init": "15.0.0-canary.684e33d25.0",
+        "@material/banner": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/button": "15.0.0-canary.684e33d25.0",
+        "@material/card": "15.0.0-canary.684e33d25.0",
+        "@material/checkbox": "15.0.0-canary.684e33d25.0",
+        "@material/chips": "15.0.0-canary.684e33d25.0",
+        "@material/circular-progress": "15.0.0-canary.684e33d25.0",
+        "@material/data-table": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dialog": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/drawer": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/fab": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/floating-label": "15.0.0-canary.684e33d25.0",
+        "@material/form-field": "15.0.0-canary.684e33d25.0",
+        "@material/icon-button": "15.0.0-canary.684e33d25.0",
+        "@material/image-list": "15.0.0-canary.684e33d25.0",
+        "@material/layout-grid": "15.0.0-canary.684e33d25.0",
+        "@material/line-ripple": "15.0.0-canary.684e33d25.0",
+        "@material/linear-progress": "15.0.0-canary.684e33d25.0",
+        "@material/list": "15.0.0-canary.684e33d25.0",
+        "@material/menu": "15.0.0-canary.684e33d25.0",
+        "@material/menu-surface": "15.0.0-canary.684e33d25.0",
+        "@material/notched-outline": "15.0.0-canary.684e33d25.0",
+        "@material/radio": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/segmented-button": "15.0.0-canary.684e33d25.0",
+        "@material/select": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/slider": "15.0.0-canary.684e33d25.0",
+        "@material/snackbar": "15.0.0-canary.684e33d25.0",
+        "@material/switch": "15.0.0-canary.684e33d25.0",
+        "@material/tab": "15.0.0-canary.684e33d25.0",
+        "@material/tab-bar": "15.0.0-canary.684e33d25.0",
+        "@material/tab-indicator": "15.0.0-canary.684e33d25.0",
+        "@material/tab-scroller": "15.0.0-canary.684e33d25.0",
+        "@material/textfield": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tooltip": "15.0.0-canary.684e33d25.0",
+        "@material/top-app-bar": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
         "tslib": "^2.3.0"
       },
       "peerDependencies": {
-        "@angular/animations": "^14.0.0 || ^15.0.0",
-        "@angular/cdk": "14.2.7",
-        "@angular/common": "^14.0.0 || ^15.0.0",
-        "@angular/core": "^14.0.0 || ^15.0.0",
-        "@angular/forms": "^14.0.0 || ^15.0.0",
-        "@angular/platform-browser": "^14.0.0 || ^15.0.0",
+        "@angular/animations": "^15.0.0 || ^16.0.0",
+        "@angular/cdk": "15.2.9",
+        "@angular/common": "^15.0.0 || ^16.0.0",
+        "@angular/core": "^15.0.0 || ^16.0.0",
+        "@angular/forms": "^15.0.0 || ^16.0.0",
+        "@angular/platform-browser": "^15.0.0 || ^16.0.0",
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
@@ -4391,6 +4438,757 @@
       "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
       "dev": true
     },
+    "node_modules/@material/animation": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/auto-init": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/banner": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/button": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/base": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/button": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w==",
+      "dependencies": {
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/card": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g==",
+      "dependencies": {
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/checkbox": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/chips": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/checkbox": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "safevalues": "^0.3.4",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/circular-progress": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/progress-indicator": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/data-table": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/checkbox": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/icon-button": "15.0.0-canary.684e33d25.0",
+        "@material/linear-progress": "15.0.0-canary.684e33d25.0",
+        "@material/list": "15.0.0-canary.684e33d25.0",
+        "@material/menu": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/select": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/density": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/dialog": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/button": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/icon-button": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/dom": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog==",
+      "dependencies": {
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/drawer": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/list": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/elevation": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/fab": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/feature-targeting": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/floating-label": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/focus-ring": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg==",
+      "dependencies": {
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0"
+      }
+    },
+    "node_modules/@material/form-field": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/icon-button": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/image-list": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA==",
+      "dependencies": {
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/layout-grid": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/line-ripple": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/linear-progress": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/progress-indicator": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/list": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/menu": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/list": "15.0.0-canary.684e33d25.0",
+        "@material/menu-surface": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/menu-surface": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/notched-outline": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/floating-label": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/progress-indicator": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/radio": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/ripple": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/rtl": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw==",
+      "dependencies": {
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/segmented-button": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/touch-target": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/select": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/floating-label": "15.0.0-canary.684e33d25.0",
+        "@material/line-ripple": "15.0.0-canary.684e33d25.0",
+        "@material/list": "15.0.0-canary.684e33d25.0",
+        "@material/menu": "15.0.0-canary.684e33d25.0",
+        "@material/menu-surface": "15.0.0-canary.684e33d25.0",
+        "@material/notched-outline": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/shape": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA==",
+      "dependencies": {
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/slider": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/snackbar": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/button": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/icon-button": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/switch": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "safevalues": "^0.3.4",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/tab": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/focus-ring": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/tab-indicator": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/tab-bar": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/tab": "15.0.0-canary.684e33d25.0",
+        "@material/tab-indicator": "15.0.0-canary.684e33d25.0",
+        "@material/tab-scroller": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/tab-indicator": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/tab-scroller": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/tab": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/textfield": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/density": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/floating-label": "15.0.0-canary.684e33d25.0",
+        "@material/line-ripple": "15.0.0-canary.684e33d25.0",
+        "@material/notched-outline": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/theme": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw==",
+      "dependencies": {
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/tokens": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ==",
+      "dependencies": {
+        "@material/elevation": "15.0.0-canary.684e33d25.0"
+      }
+    },
+    "node_modules/@material/tooltip": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/button": "15.0.0-canary.684e33d25.0",
+        "@material/dom": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/tokens": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "safevalues": "^0.3.4",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/top-app-bar": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw==",
+      "dependencies": {
+        "@material/animation": "15.0.0-canary.684e33d25.0",
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/elevation": "15.0.0-canary.684e33d25.0",
+        "@material/ripple": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/shape": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "@material/typography": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/touch-target": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ==",
+      "dependencies": {
+        "@material/base": "15.0.0-canary.684e33d25.0",
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/rtl": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@material/typography": {
+      "version": "15.0.0-canary.684e33d25.0",
+      "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz",
+      "integrity": "sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw==",
+      "dependencies": {
+        "@material/feature-targeting": "15.0.0-canary.684e33d25.0",
+        "@material/theme": "15.0.0-canary.684e33d25.0",
+        "tslib": "^2.1.0"
+      }
+    },
     "node_modules/@mdx-js/mdx": {
       "version": "1.6.22",
       "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",
@@ -23866,30 +24664,6 @@
         "url": "https://github.com/sponsors/fb55"
       }
     },
-    "node_modules/cheerio/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "dev": true,
-      "dependencies": {
-        "entities": "^4.4.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
     "node_modules/chokidar": {
       "version": "3.5.3",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -33717,10 +34491,16 @@
       }
     },
     "node_modules/parse5": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
-      "optional": true
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+      "devOptional": true,
+      "dependencies": {
+        "entities": "^4.4.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
     },
     "node_modules/parse5-html-rewriting-stream": {
       "version": "7.0.0",
@@ -33748,18 +34528,6 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/parse5-html-rewriting-stream/node_modules/parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "dev": true,
-      "dependencies": {
-        "entities": "^4.4.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
     "node_modules/parse5-htmlparser2-tree-adapter": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
@@ -33773,30 +34541,6 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "dev": true,
-      "dependencies": {
-        "entities": "^4.4.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
     "node_modules/parse5-sax-parser": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz",
@@ -33809,11 +34553,11 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/parse5-sax-parser/node_modules/entities": {
+    "node_modules/parse5/node_modules/entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
-      "dev": true,
+      "devOptional": true,
       "engines": {
         "node": ">=0.12"
       },
@@ -33821,18 +34565,6 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/parse5-sax-parser/node_modules/parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "dev": true,
-      "dependencies": {
-        "entities": "^4.4.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
     "node_modules/parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -35885,6 +36617,11 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "dev": true
     },
+    "node_modules/safevalues": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz",
+      "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw=="
+    },
     "node_modules/sane": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
diff --git a/package.json b/package.json
index 9a47f2800..f558febf2 100644
--- a/package.json
+++ b/package.json
@@ -53,12 +53,12 @@
   },
   "dependencies": {
     "@angular/animations": "^15.2.10",
-    "@angular/cdk": "^14.2.7",
+    "@angular/cdk": "^15.2.9",
     "@angular/common": "^15.2.10",
     "@angular/compiler": "^15.2.10",
     "@angular/core": "^15.2.10",
     "@angular/forms": "^15.2.10",
-    "@angular/material": "^14.2.7",
+    "@angular/material": "^15.2.9",
     "@angular/platform-browser": "^15.2.10",
     "@angular/platform-browser-dynamic": "^15.2.10",
     "@angular/router": "^15.2.10",
diff --git a/src/atlas-download/atlas-download.directive.ts b/src/atlas-download/atlas-download.directive.ts
index ca0e8d23c..94cdb2c79 100644
--- a/src/atlas-download/atlas-download.directive.ts
+++ b/src/atlas-download/atlas-download.directive.ts
@@ -1,5 +1,5 @@
 import { Directive, HostListener } from '@angular/core';
-import { MatSnackBar } from '@angular/material/snack-bar';
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { Store, select } from '@ngrx/store';
 import { Subject, concat, of } from 'rxjs';
 import { distinctUntilChanged, shareReplay, take } from 'rxjs/operators';
diff --git a/src/atlas-download/atlas-download.module.ts b/src/atlas-download/atlas-download.module.ts
index 910154cb4..fb608195e 100644
--- a/src/atlas-download/atlas-download.module.ts
+++ b/src/atlas-download/atlas-download.module.ts
@@ -1,7 +1,7 @@
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { AtlasDownloadDirective } from './atlas-download.directive';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { AngularMaterialModule } from 'src/sharedModules';
 
 
 @NgModule({
@@ -10,7 +10,7 @@ import { MatSnackBarModule } from '@angular/material/snack-bar';
   ],
   imports: [
     CommonModule,
-    MatSnackBarModule,
+    AngularMaterialModule,
   ],
   exports: [
     AtlasDownloadDirective
diff --git a/src/atlasComponents/sapi/module.ts b/src/atlasComponents/sapi/module.ts
index 9b9efaf0e..416349684 100644
--- a/src/atlasComponents/sapi/module.ts
+++ b/src/atlasComponents/sapi/module.ts
@@ -2,13 +2,13 @@ import { NgModule } from "@angular/core";
 import { CommonModule } from "@angular/common";
 import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http";
 import { PriorityHttpInterceptor } from "src/util/priority";
-import { MatSnackBarModule } from "@angular/material/snack-bar";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
     HttpClientModule,
-    MatSnackBarModule,
+    AngularMaterialModule,
   ],
   declarations: [
   ],
diff --git a/src/atlasComponents/sapi/sapi.service.ts b/src/atlasComponents/sapi/sapi.service.ts
index a8a423ed6..c190d20b3 100644
--- a/src/atlasComponents/sapi/sapi.service.ts
+++ b/src/atlasComponents/sapi/sapi.service.ts
@@ -2,7 +2,7 @@ import { Injectable } from "@angular/core";
 import { HttpClient } from '@angular/common/http';
 import { catchError, map, shareReplay, switchMap, take, tap } from "rxjs/operators";
 import { CachedFunction, getExportNehuba, noop } from "src/util/fn";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service";
 import { EnumColorMapName } from "src/util/colorMaps";
 import { BehaviorSubject, forkJoin, from, NEVER, Observable, of, throwError } from "rxjs";
diff --git a/src/atlasComponents/sapiViews/core/atlas/module.ts b/src/atlasComponents/sapiViews/core/atlas/module.ts
index 174ba5d39..a8d4b35d3 100644
--- a/src/atlasComponents/sapiViews/core/atlas/module.ts
+++ b/src/atlasComponents/sapiViews/core/atlas/module.ts
@@ -2,15 +2,13 @@ import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
 import { SpinnerModule } from "src/components/spinner";
 import { SapiViewsCoreAtlasSplashScreen } from "./splashScreen/splashScreen.component";
-import { MatCardModule } from "@angular/material/card";
 import { SAPIModule } from "src/atlasComponents/sapi/module";
-import { MatRippleModule } from "@angular/material/core";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
-    MatCardModule,
-    MatRippleModule,
+    AngularMaterialModule,
     SpinnerModule,
     SAPIModule,
   ],
diff --git a/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.template.html b/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.template.html
index ab4954689..5b54e6284 100644
--- a/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.template.html
+++ b/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.template.html
@@ -8,11 +8,11 @@
       (click)="selectAtlas(atlas)"
       matRipple
       *ngFor="let atlas of atlases$ | async"
-      class="m-3 col-md-12 col-lg-12 pe-all">
+      class="m-3 col-md-12 col-lg-12 pe-all mat-elevation-z2">
       <mat-card-header>
-        <mat-card-title class="text-nowrap font-stretch">
+        <h1 class="mat-h1 sxplr-p-2">
           {{ atlas.name }}
-        </mat-card-title>
+        </h1>
       </mat-card-header>
 
       <!-- required... or on ripple, angular adds 16px margin to the bottom -->
diff --git a/src/atlasComponents/sapiViews/core/region/module.ts b/src/atlasComponents/sapiViews/core/region/module.ts
index b1e56652d..2560b2b3c 100644
--- a/src/atlasComponents/sapiViews/core/region/module.ts
+++ b/src/atlasComponents/sapiViews/core/region/module.ts
@@ -10,16 +10,11 @@ import { SapiViewsUtilModule } from "../../util/module";
 import { SapiViewsCoreRegionRegionListItem } from "./region/listItem/region.listItem.component";
 import { SapiViewsCoreRegionRegionBase } from "./region/region.base.directive";
 import { SapiViewsCoreRegionRegionRich } from "./region/rich/region.rich.component";
-import { MatTabsModule } from "@angular/material/tabs";
 import { ExperimentalModule } from "src/experimental/experimental.module";
-import { MatListModule } from "@angular/material/list";
 import { DialogModule } from "src/ui/dialogInfo";
 import { SapiViewsCoreParcellationModule } from "../parcellation";
-import { MatTooltipModule } from "@angular/material/tooltip";
 import { TranslateQualificationPipe } from "./translateQualification.pipe";
 import { DedupRelatedRegionPipe } from "./dedupRelatedRegion.pipe";
-import { MatExpansionModule } from "@angular/material/expansion";
-import { MatTableModule } from "@angular/material/table";
 
 @NgModule({
   imports: [
@@ -31,14 +26,9 @@ import { MatTableModule } from "@angular/material/table";
     StrictLocalModule,
     FeatureModule,
     ReadmoreModule,
-    MatTabsModule,
     ExperimentalModule,
-    MatListModule,
     DialogModule,
     SapiViewsCoreParcellationModule,
-    MatTooltipModule,
-    MatExpansionModule,
-    MatTableModule,
     ExperimentalModule,
   ],
   declarations: [
diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/module.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/module.ts
index c0269e9f1..482720c3b 100644
--- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/module.ts
+++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/module.ts
@@ -1,8 +1,5 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
-import { MatButtonModule } from "@angular/material/button";
-import { MatRippleModule } from "@angular/material/core";
-import { MatIconModule } from "@angular/material/icon";
 import { MarkdownModule } from "src/components/markdown";
 import { SmartChipModule } from "src/components/smartChip";
 import { DialogModule } from "src/ui/dialogInfo";
@@ -11,9 +8,9 @@ import { SapiViewsCoreParcellationModule } from "src/atlasComponents/sapiViews/c
 import { PureATPSelector } from "./pureDumb/pureATPSelector.components";
 import { WrapperATPSelector } from "./wrapper/wrapper.component";
 import { SAPIModule } from "src/atlasComponents/sapi/module";
-import { MatTooltipModule } from "@angular/material/tooltip";
 import { QuickTourModule } from "src/ui/quickTour";
 import { ExperimentalModule } from "src/experimental/experimental.module";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
@@ -21,10 +18,7 @@ import { ExperimentalModule } from "src/experimental/experimental.module";
     SmartChipModule,
     UtilModule,
     MarkdownModule,
-    MatRippleModule,
-    MatIconModule,
-    MatTooltipModule,
-    MatButtonModule,
+    AngularMaterialModule,
     DialogModule,
     SAPIModule,
     SapiViewsCoreParcellationModule,
diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.stories.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.stories.ts
index 421b47409..c22b2b96b 100644
--- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.stories.ts
+++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.stories.ts
@@ -1,6 +1,5 @@
 import { CommonModule } from "@angular/common";
 import { Component } from "@angular/core";
-import { MatButtonModule } from "@angular/material/button";
 import { action } from "@storybook/addon-actions";
 import { componentWrapperDecorator, Meta, moduleMetadata, Story } from "@storybook/angular";
 import { atlasId, provideDarkTheme } from "src/atlasComponents/sapi/stories.base";
@@ -10,6 +9,7 @@ import { ATPSelectorModule } from "../module";
 import { darkThemePalette } from "./pureATPSelector.components"
 import { loadAtlasEtcData, wrapperDecoratorFn } from "../story.base"
 import { provideMockStore } from "@ngrx/store/testing";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @Component({
   selector: 'atlas-selector-wrapper-story',
@@ -70,7 +70,7 @@ export default {
       imports: [
         CommonModule,
         ATPSelectorModule,
-        MatButtonModule,
+        AngularMaterialModule,
         UtilModule,
       ],
       declarations: [
diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts
index 9da752e04..f7655e5af 100644
--- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts
+++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts
@@ -1,5 +1,5 @@
 import { Component, EventEmitter, Inject, OnDestroy, Output } from "@angular/core";
-import { MatDialog } from "@angular/material/dialog";
+import { MatDialog } from "src/sharedModules/angularMaterial.exports";
 import { select, Store } from "@ngrx/store";
 import { Observable, Subject, Subscription } from "rxjs";
 import { switchMap, withLatestFrom } from "rxjs/operators";
diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.stories.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.stories.ts
index 8dbf60965..555b31580 100644
--- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.stories.ts
+++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.stories.ts
@@ -1,5 +1,4 @@
 import { Component } from "@angular/core";
-import { MatDialogModule } from "@angular/material/dialog";
 import { Store } from "@ngrx/store";
 import { action } from "@storybook/addon-actions";
 import { componentWrapperDecorator, Meta, moduleMetadata, Story } from "@storybook/angular";
@@ -9,6 +8,7 @@ import { ParcellationVisibilityService } from "../../../parcellation/parcellatio
 import { ATPSelectorModule } from "../module";
 import { ATP } from "../pureDumb/pureATPSelector.components";
 import { loadAtlasEtcData, wrapperDecoratorFn } from "../story.base";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @Component({
   selector: 'wrapper-wrapper',
@@ -38,7 +38,7 @@ export default {
     moduleMetadata({
       imports: [
         ATPSelectorModule,
-        MatDialogModule,
+        AngularMaterialModule,
         RootStoreModule,
       ],
       providers: [
diff --git a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.stories.ts b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.stories.ts
index 9edc242be..76e6de53f 100644
--- a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.stories.ts
+++ b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.stories.ts
@@ -1,7 +1,7 @@
 import { CommonModule } from "@angular/common"
 import { HttpClientModule } from "@angular/common/http"
 import { Component, EventEmitter, TemplateRef, ViewChild } from "@angular/core"
-import { MatDialog } from "@angular/material/dialog"
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 import { action } from "@storybook/addon-actions"
 import { Meta, moduleMetadata, Story } from "@storybook/angular"
 import { atlasId, provideDarkTheme, getParcRegions, getAtlas, getParc } from "src/atlasComponents/sapi/stories.base"
diff --git a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts
index 389486f77..0fa6f0384 100644
--- a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts
+++ b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts
@@ -3,7 +3,7 @@ import { SxplrRegion } from "src/atlasComponents/sapi/sxplrTypes";
 import { ARIA_LABELS } from "common/constants"
 import { UntypedFormControl } from "@angular/forms";
 import { debounceTime, distinctUntilChanged, map, startWith } from "rxjs/operators";
-import { MatAutocompleteSelectedEvent } from "@angular/material/autocomplete";
+import { MatAutocompleteSelectedEvent } from 'src/sharedModules/angularMaterial.exports'
 import { SapiViewsCoreRichRegionListTemplateDirective } from "./regionListSearchTmpl.directive";
 import { BehaviorSubject, combineLatest } from "rxjs";
 
diff --git a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.template.html b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.template.html
index 2eba3854a..c56656a7e 100644
--- a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.template.html
+++ b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.template.html
@@ -1,6 +1,6 @@
 <mat-form-field
   class="sxplr-w-100"
-  floatLabel="never">
+  floatLabel="auto">
   <input
     placeholder="Search for regions"
     [value]="currentSearch"
diff --git a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.spec.ts b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.spec.ts
index 86fd2406a..49744330a 100644
--- a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.spec.ts
+++ b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.spec.ts
@@ -3,9 +3,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { PointAssignmentComponent } from './point-assignment.component';
 import { SAPI } from 'src/atlasComponents/sapi/sapi.service';
 import { EMPTY } from 'rxjs';
-import { MatDialogModule } from '@angular/material/dialog';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { provideMockStore } from '@ngrx/store/testing';
+import { AngularMaterialModule } from 'src/sharedModules';
 
 describe('PointAssignmentComponent', () => {
   let component: PointAssignmentComponent;
@@ -14,7 +14,7 @@ describe('PointAssignmentComponent', () => {
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       declarations: [ PointAssignmentComponent ],
-      imports: [ MatDialogModule, NoopAnimationsModule ],
+      imports: [ AngularMaterialModule, NoopAnimationsModule ],
       providers: [
         provideMockStore(),
         {
diff --git a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts
index 0dbe66f73..beefde08a 100644
--- a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts
+++ b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts
@@ -1,5 +1,5 @@
 import { Component, Input, OnDestroy, Output, TemplateRef, EventEmitter } from '@angular/core';
-import { MatDialog, MatDialogRef } from '@angular/material/dialog';
+import { MatDialog, MatDialogRef } from 'src/sharedModules/angularMaterial.exports';
 import { BehaviorSubject, EMPTY, Observable, Subscription, combineLatest, concat, of } from 'rxjs';
 import { catchError, map, shareReplay, switchMap, tap } from 'rxjs/operators';
 import { SAPI, EXPECTED_SIIBRA_API_VERSION } from 'src/atlasComponents/sapi/sapi.service';
diff --git a/src/atlasComponents/sapiViews/volumes/volumes.module.ts b/src/atlasComponents/sapiViews/volumes/volumes.module.ts
index a2e461bff..44322970a 100644
--- a/src/atlasComponents/sapiViews/volumes/volumes.module.ts
+++ b/src/atlasComponents/sapiViews/volumes/volumes.module.ts
@@ -1,16 +1,12 @@
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { PointAssignmentComponent } from './point-assignment/point-assignment.component';
-import { MatTableModule } from '@angular/material/table';
 import { UtilModule } from 'src/util';
 import { SpinnerModule } from 'src/components/spinner';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatButtonModule } from '@angular/material/button';
-import { MatSortModule } from '@angular/material/sort';
 import { ZipFilesOutputModule } from 'src/zipFilesOutput/module';
 import { SandsToNumPipe } from "./sandsToNum.pipe"
 import { SapiViewsUtilModule } from '../util';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { AngularMaterialModule } from 'src/sharedModules';
 
 
 
@@ -21,15 +17,11 @@ import { MatTooltipModule } from '@angular/material/tooltip';
   ],
   imports: [
     CommonModule,
-    MatTableModule,
     UtilModule,
     SpinnerModule,
-    MatDialogModule,
-    MatButtonModule,
-    MatSortModule,
     ZipFilesOutputModule,
     SapiViewsUtilModule,
-    MatTooltipModule,
+    AngularMaterialModule,
   ],
   exports: [
     PointAssignmentComponent
diff --git a/src/atlasComponents/userAnnotations/annotationList/annotationList.component.spec.ts b/src/atlasComponents/userAnnotations/annotationList/annotationList.component.spec.ts
index 23662fcfd..a4331fcee 100644
--- a/src/atlasComponents/userAnnotations/annotationList/annotationList.component.spec.ts
+++ b/src/atlasComponents/userAnnotations/annotationList/annotationList.component.spec.ts
@@ -4,20 +4,15 @@ import { FileInputModule } from "src/getFileInput/module"
 import { CommonModule } from "@angular/common"
 import { ModularUserAnnotationToolService } from "../tools/service"
 import { NoopAnimationsModule } from "@angular/platform-browser/animations"
-import { MatDialogModule } from "@angular/material/dialog"
 import { ComponentStore } from "@ngrx/component-store"
 import { NEVER, of } from "rxjs"
-import { MatSnackBarModule } from "@angular/material/snack-bar"
 import { StateModule } from "src/state"
 import { hot } from "jasmine-marbles"
 import { IAnnotationGeometry } from "../tools/type"
-import { MatTooltipModule } from "@angular/material/tooltip"
-import { MatButtonModule } from "@angular/material/button"
-import { MatCardModule } from "@angular/material/card"
 import { ZipFilesOutputModule } from "src/zipFilesOutput/module"
 import { AnnotationVisiblePipe } from "../annotationVisible.pipe"
 import { SingleAnnotationClsIconPipe, SingleAnnotationNamePipe } from "../singleAnnotationUnit/singleAnnotationUnit.component"
-import { MatExpansionModule } from "@angular/material/expansion"
+import { AngularMaterialModule } from "src/sharedModules"
 
 class MockModularUserAnnotationToolService {
   hiddenAnnotations$ = of([])
@@ -42,13 +37,8 @@ describe("annotationList.component.ts", () => {
           CommonModule,
           FileInputModule,
           NoopAnimationsModule,
-          MatDialogModule,
-          MatSnackBarModule,
+          AngularMaterialModule,
           StateModule, // needed for iavStateAggregator directive
-          MatTooltipModule,
-          MatButtonModule,
-          MatCardModule,
-          MatExpansionModule,
           ZipFilesOutputModule,
         ],
         providers: [
diff --git a/src/atlasComponents/userAnnotations/annotationList/annotationList.component.ts b/src/atlasComponents/userAnnotations/annotationList/annotationList.component.ts
index 7463f9a10..d1d413534 100644
--- a/src/atlasComponents/userAnnotations/annotationList/annotationList.component.ts
+++ b/src/atlasComponents/userAnnotations/annotationList/annotationList.component.ts
@@ -8,10 +8,10 @@ import { combineLatest, concat, Observable, of, Subscription } from "rxjs";
 import { TZipFileConfig } from "src/zipFilesOutput/type";
 import { TFileInputEvent } from "src/getFileInput/type";
 import { FileInputDirective } from "src/getFileInput/getFileInput.directive";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { unzip } from "src/zipFilesOutput/zipFilesOutput.directive";
 import { DialogService } from "src/services/dialogService.service";
-import { MatDialog } from "@angular/material/dialog";
+import { MatDialog } from "src/sharedModules/angularMaterial.exports";
 import { userAnnotationRouteKey } from "../constants";
 
 const README = `{id}.sands.json file contains the data of annotations. {id}.desc.json contains the metadata of annotations.`
diff --git a/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts b/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts
index accf24d9e..af6452081 100644
--- a/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts
+++ b/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts
@@ -4,7 +4,7 @@ import { ARIA_LABELS } from 'common/constants'
 import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR, CONTEXT_MENU_ITEM_INJECTOR, TContextMenu } from "src/util";
 import { TContextArg } from "src/viewerModule/viewer.interface";
 import { TContextMenuReg } from "src/contextMenuModule";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 
 @Component({
   selector: 'annotating-tools-panel',
diff --git a/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.component.ts b/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.component.ts
index 098951095..a558eb2ec 100644
--- a/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.component.ts
+++ b/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.component.ts
@@ -6,7 +6,7 @@ import { UntypedFormControl, UntypedFormGroup } from "@angular/forms";
 import { Subscription } from "rxjs";
 import { select, Store } from "@ngrx/store";
 import { ModularUserAnnotationToolService } from "../tools/service";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { Line } from "../tools/line";
 import { atlasSelection } from "src/state";
 import { map } from "rxjs/operators";
diff --git a/src/atlasComponents/userAnnotations/tools/line/line.component.ts b/src/atlasComponents/userAnnotations/tools/line/line.component.ts
index a98e126c6..daa483c2e 100644
--- a/src/atlasComponents/userAnnotations/tools/line/line.component.ts
+++ b/src/atlasComponents/userAnnotations/tools/line/line.component.ts
@@ -1,5 +1,5 @@
 import { Component, ElementRef, Inject, Input, OnDestroy, Optional, ViewChild } from "@angular/core";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { Store } from "@ngrx/store";
 import { Line, LINE_ICON_CLASS } from "../line";
 import { ToolCmpBase } from "../toolCmp.base";
diff --git a/src/atlasComponents/userAnnotations/tools/line/line.template.html b/src/atlasComponents/userAnnotations/tools/line/line.template.html
index 2cff6f5fe..520d82240 100644
--- a/src/atlasComponents/userAnnotations/tools/line/line.template.html
+++ b/src/atlasComponents/userAnnotations/tools/line/line.template.html
@@ -4,13 +4,13 @@
   Endpoints
 </span>
 
-<mat-chip-list>
+<mat-chip-set>
   <mat-chip *ngFor="let point of (updateAnnotation?.points || []) ; let i = index"
     (click)="gotoRoi(point)"
     [matTooltip]="point.toString()">
     {{ i }}
   </mat-chip>
-</mat-chip-list>
+</mat-chip-set>
 
 <mat-divider class="m-2 d-block position-relative"></mat-divider>
 
diff --git a/src/atlasComponents/userAnnotations/tools/point/point.template.html b/src/atlasComponents/userAnnotations/tools/point/point.template.html
index 90f1b5807..8db95a9dd 100644
--- a/src/atlasComponents/userAnnotations/tools/point/point.template.html
+++ b/src/atlasComponents/userAnnotations/tools/point/point.template.html
@@ -4,12 +4,12 @@
   Point
 </span>
 
-<mat-chip-list>
+<mat-chip-set>
   <mat-chip [matTooltip]="updateAnnotation.toString()"
     (click)="gotoRoi()">
     0
   </mat-chip>
-</mat-chip-list>
+</mat-chip-set>
 
 <mat-divider class="m-2 d-block position-relative"></mat-divider>
 
diff --git a/src/atlasComponents/userAnnotations/tools/poly/poly.component.ts b/src/atlasComponents/userAnnotations/tools/poly/poly.component.ts
index 6e8852d88..be948fce7 100644
--- a/src/atlasComponents/userAnnotations/tools/poly/poly.component.ts
+++ b/src/atlasComponents/userAnnotations/tools/poly/poly.component.ts
@@ -1,5 +1,5 @@
 import { Component, ElementRef, Inject, Input, OnDestroy, Optional, ViewChild } from "@angular/core";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { Polygon, POLY_ICON_CLASS } from "../poly";
 import { ToolCmpBase } from "../toolCmp.base";
 import { IAnnotationGeometry, TExportFormats, UDPATE_ANNOTATION_TOKEN } from "../type";
diff --git a/src/atlasComponents/userAnnotations/tools/poly/poly.template.html b/src/atlasComponents/userAnnotations/tools/poly/poly.template.html
index fa966e0aa..fbc231035 100644
--- a/src/atlasComponents/userAnnotations/tools/poly/poly.template.html
+++ b/src/atlasComponents/userAnnotations/tools/poly/poly.template.html
@@ -4,13 +4,13 @@
   Vertices
 </span>
 
-<mat-chip-list class="wrapped-chips">
+<mat-chip-set class="wrapped-chips">
   <mat-chip *ngFor="let point of (updateAnnotation?.points || []); let i = index"
     (click)="gotoRoi(point)"
     [matTooltip]="point.toString()">
     {{ i }}
   </mat-chip>
-</mat-chip-list>
+</mat-chip-set>
 
 <mat-divider class="m-2 d-block position-relative"></mat-divider>
 
diff --git a/src/atlasComponents/userAnnotations/tools/service.spec.ts b/src/atlasComponents/userAnnotations/tools/service.spec.ts
index fdeacfde8..8dd8de55a 100644
--- a/src/atlasComponents/userAnnotations/tools/service.spec.ts
+++ b/src/atlasComponents/userAnnotations/tools/service.spec.ts
@@ -2,10 +2,10 @@ import { TestBed } from "@angular/core/testing"
 import { ModularUserAnnotationToolService } from "./service"
 import { MockStore, provideMockStore } from "@ngrx/store/testing"
 import { NoopAnimationsModule } from "@angular/platform-browser/animations"
-import { MatSnackBarModule } from "@angular/material/snack-bar"
 import { ANNOTATION_EVENT_INJ_TOKEN, INJ_ANNOT_TARGET } from "./type"
 import { NEVER, Subject } from "rxjs"
 import { atlasSelection } from "src/state"
+import { AngularMaterialModule } from "src/sharedModules"
 
 describe("userAnnotations/service.ts", () => {
 
@@ -15,7 +15,7 @@ describe("userAnnotations/service.ts", () => {
       TestBed.configureTestingModule({
         imports: [
           NoopAnimationsModule,
-          MatSnackBarModule,
+          AngularMaterialModule,
         ],
         providers: [
           provideMockStore(),
diff --git a/src/atlasComponents/userAnnotations/tools/service.ts b/src/atlasComponents/userAnnotations/tools/service.ts
index a7338ee12..a80e18c17 100644
--- a/src/atlasComponents/userAnnotations/tools/service.ts
+++ b/src/atlasComponents/userAnnotations/tools/service.ts
@@ -12,7 +12,7 @@ import { Polygon } from "./poly";
 import { Line } from "./line";
 import { Point } from "./point";
 import { FilterAnnotationsBySpace } from "../filterAnnotationBySpace.pipe";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { actions } from "src/state/atlasSelection";
 import { atlasSelection } from "src/state";
 import { SxplrTemplate } from "src/atlasComponents/sapi/sxplrTypes";
diff --git a/src/atlasComponents/userAnnotations/tools/textareaCopyExport/textareaCopyExport.component.ts b/src/atlasComponents/userAnnotations/tools/textareaCopyExport/textareaCopyExport.component.ts
index a3be425df..f749e39b4 100644
--- a/src/atlasComponents/userAnnotations/tools/textareaCopyExport/textareaCopyExport.component.ts
+++ b/src/atlasComponents/userAnnotations/tools/textareaCopyExport/textareaCopyExport.component.ts
@@ -1,5 +1,5 @@
 import { Component, Input } from "@angular/core";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { ARIA_LABELS } from 'common/constants'
 import { Clipboard } from "@angular/cdk/clipboard";
 
diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts
index 1fc4e3a60..5c1f800ec 100644
--- a/src/atlasViewer/atlasViewer.component.ts
+++ b/src/atlasViewer/atlasViewer.component.ts
@@ -16,8 +16,8 @@ import { filter, delay, switchMapTo, take, startWith } from "rxjs/operators";
 
 import { colorAnimation } from "./atlasViewer.animation"
 import { MouseHoverDirective } from "src/mouseoverModule";
-import { MatSnackBar } from "@angular/material/snack-bar";
-import { MatDialog, MatDialogRef } from "@angular/material/dialog";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
+import { MatDialog, MatDialogRef } from "src/sharedModules/angularMaterial.exports";
 import { CONST } from 'common/constants'
 
 import { SlServiceService } from "src/spotlight/sl-service.service";
diff --git a/src/components/confirmDialog/confirmDialog.component.spec.ts b/src/components/confirmDialog/confirmDialog.component.spec.ts
index 258970c99..d615beece 100644
--- a/src/components/confirmDialog/confirmDialog.component.spec.ts
+++ b/src/components/confirmDialog/confirmDialog.component.spec.ts
@@ -1,6 +1,6 @@
 import { CommonModule } from "@angular/common"
 import { TestBed, async } from "@angular/core/testing"
-import { MAT_DIALOG_DATA } from "@angular/material/dialog"
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports"
 import { AngularMaterialModule } from "src/sharedModules"
 import { ComponentsModule } from "../components.module"
 import { ConfirmDialogComponent } from "./confirmDialog.component"
diff --git a/src/components/confirmDialog/confirmDialog.component.ts b/src/components/confirmDialog/confirmDialog.component.ts
index 8361ee409..84e6bb358 100644
--- a/src/components/confirmDialog/confirmDialog.component.ts
+++ b/src/components/confirmDialog/confirmDialog.component.ts
@@ -1,5 +1,5 @@
 import { Component, Inject, Input } from "@angular/core";
-import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports";
 
 @Component({
   selector: 'confirm-dialog-component',
diff --git a/src/components/dialog/dialog.component.ts b/src/components/dialog/dialog.component.ts
index 969cbc135..491018485 100644
--- a/src/components/dialog/dialog.component.ts
+++ b/src/components/dialog/dialog.component.ts
@@ -1,7 +1,7 @@
 import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, OnDestroy, OnInit, ViewChild } from "@angular/core";
 import { fromEvent, Observable, Subscription } from "rxjs";
 import { filter, share } from "rxjs/operators";
-import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
+import {MAT_DIALOG_DATA, MatDialogRef} from "src/sharedModules/angularMaterial.exports";
 
 @Component({
   selector: 'dialog-component',
diff --git a/src/components/flatHierarchy/treeView/treeView.component.ts b/src/components/flatHierarchy/treeView/treeView.component.ts
index 211d8f629..e38281e44 100644
--- a/src/components/flatHierarchy/treeView/treeView.component.ts
+++ b/src/components/flatHierarchy/treeView/treeView.component.ts
@@ -1,5 +1,5 @@
 import { FlatTreeControl } from "@angular/cdk/tree";
-import { MatTreeFlatDataSource, MatTreeFlattener } from "@angular/material/tree"
+import { MatTreeFlatDataSource, MatTreeFlattener } from 'src/sharedModules/angularMaterial.exports'
 import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, OnChanges, Output, SimpleChanges, TemplateRef } from "@angular/core";
 import { TreeNode } from "../const"
 import { Tree } from "./treeControl"
diff --git a/src/components/smartChip/module.ts b/src/components/smartChip/module.ts
index 58c8a2930..2fcd5064d 100644
--- a/src/components/smartChip/module.ts
+++ b/src/components/smartChip/module.ts
@@ -1,7 +1,5 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
-import { MatRippleModule } from "@angular/material/core";
-import { MatMenuModule } from "@angular/material/menu";
 import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
 import { SmartChip } from "./component/smartChip.component";
 import { HasSubMenuPipe } from "./hasSubmenu.pipe";
@@ -10,14 +8,14 @@ import { SmartChipHeader } from "./smartChip.header.directive";
 import { SmartChipMenu } from "./smartChip.menu.directive";
 import { ExperimentalModule } from "src/experimental/experimental.module";
 import { SmartChipAction } from "./smartChip.action.directive";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
-    MatMenuModule,
     BrowserAnimationsModule,
-    MatRippleModule,
     ExperimentalModule,
+    AngularMaterialModule,
   ],
   declarations: [
     SmartChipMenu,
diff --git a/src/components/smartChip/smartChip.stories.ts b/src/components/smartChip/smartChip.stories.ts
index 791c9372e..d49cedfda 100644
--- a/src/components/smartChip/smartChip.stories.ts
+++ b/src/components/smartChip/smartChip.stories.ts
@@ -1,10 +1,9 @@
 import { CommonModule } from "@angular/common";
 import { Component, Pipe, PipeTransform } from "@angular/core";
-import { MatDividerModule } from "@angular/material/divider";
-import { MatExpansionModule } from "@angular/material/expansion";
 import { Meta, moduleMetadata, Story } from "@storybook/angular";
 import { provideDarkTheme } from "src/atlasComponents/sapi/stories.base";
 import { SmartChipModule } from "./module";
+import { AngularMaterialModule } from "src/sharedModules";
 
 
 const complex1 = `
@@ -123,8 +122,7 @@ export default {
       imports: [
         CommonModule,
         SmartChipModule,
-        MatExpansionModule,
-        MatDividerModule,
+        AngularMaterialModule,
       ],
       declarations: [
         ShowHtmlCode,
diff --git a/src/dragDropFile/dragDrop.directive.ts b/src/dragDropFile/dragDrop.directive.ts
index abca56ad2..5a4dcd1ed 100644
--- a/src/dragDropFile/dragDrop.directive.ts
+++ b/src/dragDropFile/dragDrop.directive.ts
@@ -1,7 +1,7 @@
 import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, Output } from "@angular/core";
 import { fromEvent, merge, Observable, of, Subscription } from "rxjs";
 import { debounceTime, distinctUntilChanged, map, scan, switchMap } from "rxjs/operators";
-import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from "src/sharedModules/angularMaterial.exports"
 
 @Directive({
   selector: '[drag-drop-file]',
diff --git a/src/extra_styles.css b/src/extra_styles.css
index bc64f55d7..41762c096 100644
--- a/src/extra_styles.css
+++ b/src/extra_styles.css
@@ -827,12 +827,12 @@ body::after
   text-overflow: ellipsis;
 }
 
-iav-cmp-viewer-container .mat-chip-list-wrapper
+iav-cmp-viewer-container .mat-chip-set-wrapper
 {
   flex-wrap: nowrap;
 }
 
-.wrapped-chips .mat-chip-list-wrapper
+.wrapped-chips .mat-chip-set-wrapper
 {
   flex-wrap: wrap;
 }
diff --git a/src/features/connectivity/module.ts b/src/features/connectivity/module.ts
index 221ad467e..7ae3e1ae4 100644
--- a/src/features/connectivity/module.ts
+++ b/src/features/connectivity/module.ts
@@ -4,28 +4,17 @@ import { SAPI } from "src/atlasComponents/sapi";
 import { ConnectivityBrowserComponent } from "./connectivityBrowser/connectivityBrowser.component";
 import { ReactiveFormsModule } from "@angular/forms";
 import { DialogModule } from "src/ui/dialogInfo";
-import { MatSelectModule } from "@angular/material/select";
-import { MatRadioModule } from "@angular/material/radio";
-import { MatSliderModule } from "@angular/material/slider";
-import { MatMenuModule } from "@angular/material/menu";
 import { UtilModule } from "src/util";
-import { MatCheckboxModule } from "@angular/material/checkbox";
-import { MatButtonModule } from "@angular/material/button";
-import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
+import { AngularMaterialModule } from "src/sharedModules";
+
 
 @NgModule({
   imports: [
     CommonModule,
     ReactiveFormsModule,
-    MatSelectModule,
-    MatRadioModule,
-    MatSliderModule,
-    MatMenuModule,
+    AngularMaterialModule,
     DialogModule,
     UtilModule,
-    MatCheckboxModule,
-    MatButtonModule,
-    MatProgressSpinnerModule,
   ],
   declarations: [
     ConnectivityBrowserComponent,
diff --git a/src/features/entry/entry.component.ts b/src/features/entry/entry.component.ts
index f3c1b9d1e..468aded9d 100644
--- a/src/features/entry/entry.component.ts
+++ b/src/features/entry/entry.component.ts
@@ -11,7 +11,7 @@ import { combineLatest, concat, forkJoin, merge, of, Subject, Subscription } fro
 import { DsExhausted, IsAlreadyPulling, PulledDataSource } from 'src/util/pullable';
 import { TranslatedFeature } from '../list/list.directive';
 import { SPECIES_ENUM } from 'src/util/constants';
-import { MatDialog } from '@angular/material/dialog';
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports';
 
 const categoryAcc = <T extends Record<string, unknown>>(categories: T[]) => {
   const returnVal: Record<string, T[]> = {}
diff --git a/src/features/module.ts b/src/features/module.ts
index 3ccdbbd56..9b7b5c9ec 100644
--- a/src/features/module.ts
+++ b/src/features/module.ts
@@ -1,10 +1,5 @@
 import { CommonModule } from "@angular/common";
 import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core";
-import { MatCardModule } from "@angular/material/card";
-import { MatRippleModule } from "@angular/material/core";
-import { MatExpansionModule } from "@angular/material/expansion";
-import { MatListModule } from "@angular/material/list";
-import { MatTooltipModule } from "@angular/material/tooltip";
 import { SpinnerModule } from "src/components/spinner";
 import { UtilModule } from "src/util";
 import { EntryComponent } from './entry/entry.component'
@@ -12,49 +7,32 @@ import { FeatureNamePipe } from "./featureName.pipe";
 import { CategoryAccDirective } from './category-acc.directive';
 import { SapiViewsFeatureConnectivityModule } from "./connectivity";
 import { ScrollingModule } from "@angular/cdk/scrolling";
-import { MatButtonModule } from "@angular/material/button"
-import { MatIconModule } from "@angular/material/icon";
-import { MatDividerModule } from "@angular/material/divider";
 import { MarkdownModule } from "src/components/markdown";
-import { MatTableModule } from "@angular/material/table";
 import { FeatureViewComponent } from "./feature-view/feature-view.component";
 import { NgLayerCtlModule } from "src/viewerModule/nehuba/ngLayerCtlModule/module";
 import { VoiBboxDirective } from "./voi-bbox.directive";
 import { FilterCategoriesPipe } from "./filterCategories.pipe";
 import { ListDirective } from "./list/list.directive";
-import { MatChipsModule } from "@angular/material/chips";
 import { FeatureFilterDirective } from "./feature.filter.directive";
 import { GroupFeaturesToName } from "./grpFeatToName.pipe";
 import { ExperimentalModule } from "src/experimental/experimental.module";
-import { MatTabsModule } from "@angular/material/tabs";
 import { ReadmoreModule } from "src/components/readmore";
-import { MatDialogModule } from "@angular/material/dialog";
 import { GroupFeatureTallyPipe } from "./grpFeatToTotal.pipe";
 import { PlotlyComponent } from "./plotly";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
-    MatCardModule,
-    MatExpansionModule,
     SpinnerModule,
-    MatListModule,
-    MatTooltipModule,
     UtilModule,
-    MatRippleModule,
     SapiViewsFeatureConnectivityModule,
     ScrollingModule,
-    MatButtonModule,
-    MatIconModule,
-    MatDividerModule,
     MarkdownModule,
-    MatTableModule,
     NgLayerCtlModule,
-    MatChipsModule,
     ExperimentalModule,
-    MatTabsModule,
     ReadmoreModule,
-    MatDialogModule,
+    AngularMaterialModule,
     
     /**
      * standalone components
diff --git a/src/getFileInput/fileInputModal/fileInputModal.component.ts b/src/getFileInput/fileInputModal/fileInputModal.component.ts
index 40bfa6d8f..00b8c1cf9 100644
--- a/src/getFileInput/fileInputModal/fileInputModal.component.ts
+++ b/src/getFileInput/fileInputModal/fileInputModal.component.ts
@@ -1,5 +1,5 @@
 import { Component, ElementRef, EventEmitter, Inject, Input, Optional, TemplateRef, ViewChild } from "@angular/core";
-import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports";
 import { IFileInputConfig, TFileInputEvent } from "../type";
 
 const FILEINPUT_DEFAULT_LABEL = 'File input'
diff --git a/src/getFileInput/getFileInput.directive.ts b/src/getFileInput/getFileInput.directive.ts
index d1158cdac..66ee9af69 100644
--- a/src/getFileInput/getFileInput.directive.ts
+++ b/src/getFileInput/getFileInput.directive.ts
@@ -1,5 +1,5 @@
 import { Directive, EventEmitter, HostListener, Input, Output, TemplateRef } from "@angular/core";
-import { MatDialog, MatDialogRef } from "@angular/material/dialog";
+import { MatDialog, MatDialogRef } from "src/sharedModules/angularMaterial.exports";
 import { FileInputModal } from "./fileInputModal/fileInputModal.component";
 import { IFileInputConfig, TFileInputEvent } from "./type";
 
diff --git a/src/getFileInput/module.ts b/src/getFileInput/module.ts
index 77610abdb..719920c96 100644
--- a/src/getFileInput/module.ts
+++ b/src/getFileInput/module.ts
@@ -1,21 +1,17 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
 import { FileInputDirective } from "./getFileInput.directive";
-import { MatDialogModule } from '@angular/material/dialog';
 import { FileInputModal } from "./fileInputModal/fileInputModal.component";
 import { FormsModule } from "@angular/forms";
-import { MatInputModule } from '@angular/material/input';
-import { MatButtonModule } from '@angular/material/button';
 import { DragDropFileModule } from "src/dragDropFile/module";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
-    MatDialogModule,
     FormsModule,
-    MatInputModule,
-    MatButtonModule,
     DragDropFileModule,
+    AngularMaterialModule,
   ],
   declarations: [
     FileInputDirective,
diff --git a/src/keyframesModule/keyframeCtrl/keyframeCtrl.component.ts b/src/keyframesModule/keyframeCtrl/keyframeCtrl.component.ts
index 1b39b366a..986db4e19 100644
--- a/src/keyframesModule/keyframeCtrl/keyframeCtrl.component.ts
+++ b/src/keyframesModule/keyframeCtrl/keyframeCtrl.component.ts
@@ -1,10 +1,10 @@
 import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop";
 import { Component, OnDestroy, Optional } from "@angular/core";
-import { MatSnackBar } from "@angular/material/snack-bar";
 import { Subscription } from "rxjs";
 import { getUuid } from "src/util/fn";
 import { timedValues } from "src/util/generator";
 import { AUTO_ROTATE, TAutoRotatePayload, ViewerInternalStateSvc } from "src/viewerModule/viewerInternalState.service";
+import { MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 
 type TStoredState = {
   name: string
diff --git a/src/main.module.ts b/src/main.module.ts
index dca320a00..9f3bad9e6 100644
--- a/src/main.module.ts
+++ b/src/main.module.ts
@@ -24,7 +24,6 @@ import { PluginModule } from './plugin/plugin.module';
 import { LoggingModule } from './logging/logging.module';
 import { AuthService } from './auth'
 
-import 'src/theme.scss'
 import { ClickInterceptorService } from './glue';
 import { TOS_OBS_INJECTION_TOKEN } from './ui/kgtos';
 import { MesssagingModule } from './messaging/module';
diff --git a/src/messaging/service.ts b/src/messaging/service.ts
index 3abdeb901..18832f3f3 100644
--- a/src/messaging/service.ts
+++ b/src/messaging/service.ts
@@ -1,6 +1,5 @@
 import { Inject, Injectable, Optional } from "@angular/core";
 import { Observable } from "rxjs";
-import { MatDialog } from "@angular/material/dialog";
 import { getUuid, noop } from "src/util/fn";
 import { ConfirmDialogComponent } from "src/components/confirmDialog/confirmDialog.component";
 
@@ -10,6 +9,7 @@ import { TYPE as NATIVE_TYPE, processJsonLd as nativeProcess } from './native'
 import { BoothVisitor, JRPCRequest, ListenerChannel } from "src/api/jsonrpc"
 import { ApiService } from "src/api";
 import { ApiBoothEvents, namespace as apiNameSpace } from "src/api/service";
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 
 export const IAV_POSTMESSAGE_NAMESPACE = `ebrains:iav:`
 
diff --git a/src/plugin/pluginBanner/pluginBanner.component.ts b/src/plugin/pluginBanner/pluginBanner.component.ts
index ee763c409..34f5ad7aa 100644
--- a/src/plugin/pluginBanner/pluginBanner.component.ts
+++ b/src/plugin/pluginBanner/pluginBanner.component.ts
@@ -1,11 +1,11 @@
 import { Component, TemplateRef } from "@angular/core";
-import { MatDialog } from "@angular/material/dialog";
 import { PluginService } from "../service";
 import { PluginManifest } from "../types";
 import { combineLatest, Observable, Subject } from "rxjs";
 import { map, scan, startWith } from "rxjs/operators";
 import { select, Store } from "@ngrx/store";
 import { userPreference } from "src/state";
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 
 @Component({
   selector : 'plugin-banner',
diff --git a/src/screenshot/screenshotCmp/screenshot.component.ts b/src/screenshot/screenshotCmp/screenshot.component.ts
index 2ccb1da45..30dc70977 100644
--- a/src/screenshot/screenshotCmp/screenshot.component.ts
+++ b/src/screenshot/screenshotCmp/screenshot.component.ts
@@ -1,6 +1,5 @@
 import { Component, HostListener, Inject, OnDestroy, Output, EventEmitter, Optional, ViewChild, TemplateRef } from "@angular/core";
-import { MatDialog } from "@angular/material/dialog";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatDialog, MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 import { combineLatest, Observable, Subject, Subscription } from "rxjs";
 import { distinctUntilChanged, map, mapTo, shareReplay, startWith, switchMap, switchMapTo } from "rxjs/operators";
 import { HANDLE_SCREENSHOT_PROMISE, TypeHandleScrnShotPromise } from "../util";
diff --git a/src/services/dialogService.service.ts b/src/services/dialogService.service.ts
index 933b86227..583478087 100644
--- a/src/services/dialogService.service.ts
+++ b/src/services/dialogService.service.ts
@@ -1,7 +1,7 @@
 import { Injectable } from "@angular/core";
 import { ConfirmDialogComponent } from "src/components/confirmDialog/confirmDialog.component";
 import { DialogComponent } from "src/components/dialog/dialog.component";
-import {MatDialog, MatDialogRef} from "@angular/material/dialog";
+import { MatDialog,  MatDialogRef } from 'src/sharedModules/angularMaterial.exports'
 
 type TCancellable = {
   abort: () => void
diff --git a/src/services/uiService.service.ts b/src/services/uiService.service.ts
index 2e6a58041..eafaf3e3d 100644
--- a/src/services/uiService.service.ts
+++ b/src/services/uiService.service.ts
@@ -1,7 +1,11 @@
 import { Injectable } from "@angular/core";
-import {MatSnackBar, MatSnackBarConfig} from "@angular/material/snack-bar";
-import { MatDialog, MatDialogConfig } from "@angular/material/dialog";
 import { ActionDialog } from "src/ui/actionDialog/actionDialog.component";
+import { 
+  MatSnackBar,
+  MatSnackBarConfig,
+  MatDialog,
+  MatDialogConfig
+ } from 'src/sharedModules/angularMaterial.exports'
 
 @Injectable({
   providedIn: 'root',
diff --git a/src/share/clipboardCopy.directive.ts b/src/share/clipboardCopy.directive.ts
index a02cbdd22..0a22fc6aa 100644
--- a/src/share/clipboardCopy.directive.ts
+++ b/src/share/clipboardCopy.directive.ts
@@ -1,6 +1,5 @@
 import { Directive, HostListener, Input } from "@angular/core";
-import { MatSnackBar } from "@angular/material/snack-bar";
-import { Clipboard } from '@angular/cdk/clipboard'
+import { Clipboard, MatSnackBar } from 'src/sharedModules/angularMaterial.exports'
 
 @Directive({
   selector: '[iav-clipboard-copy]',
diff --git a/src/share/saneUrl/saneUrl.component.ts b/src/share/saneUrl/saneUrl.component.ts
index 0ce99cce3..c3984a8fa 100644
--- a/src/share/saneUrl/saneUrl.component.ts
+++ b/src/share/saneUrl/saneUrl.component.ts
@@ -1,10 +1,7 @@
 import { Component, OnDestroy, Input } from "@angular/core";
 import { Observable, merge, of, Subscription, BehaviorSubject, combineLatest } from "rxjs";
 import { startWith, mapTo, map, debounceTime, switchMap, catchError, shareReplay, filter, tap, distinctUntilChanged } from "rxjs/operators";
-import { UntypedFormControl } from "@angular/forms";
-import { ErrorStateMatcher } from "@angular/material/core";
-import { Clipboard } from "@angular/cdk/clipboard";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { Clipboard, ErrorStateMatcher, MatSnackBar, UntypedFormControl } from 'src/sharedModules/angularMaterial.exports'
 import { SaneUrlSvc } from "./saneUrl.service";
 import { NotFoundError } from "../type";
 
diff --git a/src/share/share.directive.ts b/src/share/share.directive.ts
index e3200cba6..f6ac96c74 100644
--- a/src/share/share.directive.ts
+++ b/src/share/share.directive.ts
@@ -1,5 +1,5 @@
 import { Directive, HostListener } from "@angular/core";
-import { MatBottomSheet } from "@angular/material/bottom-sheet";
+import { MatBottomSheet } from 'src/sharedModules/angularMaterial.exports'
 import { ShareSheetComponent } from "./shareSheet/shareSheet.component"
 
 
diff --git a/src/share/shareSheet/shareSheet.component.ts b/src/share/shareSheet/shareSheet.component.ts
index 664ffd89c..028e5510e 100644
--- a/src/share/shareSheet/shareSheet.component.ts
+++ b/src/share/shareSheet/shareSheet.component.ts
@@ -1,5 +1,5 @@
 import { Component, TemplateRef } from "@angular/core";
-import { MatDialog } from "@angular/material/dialog";
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 import { ARIA_LABELS } from 'common/constants'
 
 @Component({
diff --git a/src/sharedModules/angularMaterial.exports.ts b/src/sharedModules/angularMaterial.exports.ts
new file mode 100644
index 000000000..bfff6a835
--- /dev/null
+++ b/src/sharedModules/angularMaterial.exports.ts
@@ -0,0 +1,14 @@
+export { ErrorStateMatcher } from "@angular/material/core";
+export { MatDialogConfig, MatDialog, MatDialogRef } from "@angular/material/dialog";
+export { MatSnackBar, MatSnackBarRef, SimpleSnackBar, MatSnackBarConfig } from "@angular/material/snack-bar";
+export { MAT_DIALOG_DATA } from "@angular/material/dialog";
+export { MatBottomSheet, MatBottomSheetRef, MatBottomSheetConfig } from "@angular/material/bottom-sheet";
+export { MatSlideToggle, MatSlideToggleChange } from "@angular/material/slide-toggle"
+export { MatTableDataSource } from "@angular/material/table"
+export { MatSort } from '@angular/material/sort';
+export { Clipboard } from "@angular/cdk/clipboard";
+export { UntypedFormControl } from "@angular/forms";
+export { MatTreeFlatDataSource, MatTreeFlattener } from "@angular/material/tree"
+export { MatAutocompleteSelectedEvent } from "@angular/material/autocomplete";
+
+export { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing'
\ No newline at end of file
diff --git a/src/sharedModules/angularMaterial.module.ts b/src/sharedModules/angularMaterial.module.ts
index 914f3f852..a1e459e36 100644
--- a/src/sharedModules/angularMaterial.module.ts
+++ b/src/sharedModules/angularMaterial.module.ts
@@ -1,75 +1,43 @@
-import {MAT_DIALOG_DEFAULT_OPTIONS, MatDialogConfig, MatDialogModule} from "@angular/material/dialog";
-import {MatButtonModule} from "@angular/material/button";
-import {MatSnackBarModule} from "@angular/material/snack-bar";
-import {MatCardModule} from "@angular/material/card";
-import {MatCheckboxModule} from "@angular/material/checkbox";
-import {MatTabsModule} from "@angular/material/tabs";
-import {MatSidenavModule} from "@angular/material/sidenav";
-import {NgModule} from "@angular/core";
-import {MatTooltipModule} from "@angular/material/tooltip";
-import {MatBadgeModule} from "@angular/material/badge";
-import {MatDividerModule} from "@angular/material/divider";
-import {MatSelectModule} from "@angular/material/select";
-import {MatChipsModule} from "@angular/material/chips";
-import {MatAutocompleteModule} from "@angular/material/autocomplete";
+import { MAT_DIALOG_DEFAULT_OPTIONS, MatDialogConfig, MatDialogModule } from "@angular/material/dialog";
+import { MatButtonModule } from "@angular/material/button";
+import { MatSnackBarModule } from "@angular/material/snack-bar";
+import { MatCardModule } from "@angular/material/card";
+import { MatCheckboxModule } from "@angular/material/checkbox";
+import { MatTabsModule } from "@angular/material/tabs";
+import { MatSidenavModule } from "@angular/material/sidenav";
+import { NgModule} from "@angular/core";
+import { MatTooltipModule } from "@angular/material/tooltip";
+import { MatBadgeModule } from "@angular/material/badge";
+import { MatDividerModule } from "@angular/material/divider";
+import { MatSelectModule } from "@angular/material/select";
+import { MatChipsModule } from "@angular/material/chips";
+import { MatAutocompleteModule } from "@angular/material/autocomplete";
 
 import { ScrollingModule } from '@angular/cdk/scrolling'
-import {MatInputModule} from "@angular/material/input";
-import {MatSlideToggleModule} from "@angular/material/slide-toggle";
-import {MatListModule} from "@angular/material/list";
-import {MatBottomSheetModule} from "@angular/material/bottom-sheet";
-import {MatRippleModule} from "@angular/material/core";
-import {MatSliderModule} from "@angular/material/slider";
-import {DragDropModule} from "@angular/cdk/drag-drop";
-import {MatGridListModule} from "@angular/material/grid-list";
-import {MatIconModule} from "@angular/material/icon";
-import {MatExpansionModule} from "@angular/material/expansion";
-import {MatMenuModule} from "@angular/material/menu";
+import { MatInputModule } from "@angular/material/input";
+import { MatSlideToggleModule } from "@angular/material/slide-toggle";
+import { MatListModule } from "@angular/material/list";
+import { MatBottomSheetModule } from "@angular/material/bottom-sheet";
+import { MatRippleModule } from "@angular/material/core";
+import { MatSliderModule } from "@angular/material/slider";
+import { DragDropModule } from "@angular/cdk/drag-drop";
+import { MatGridListModule } from "@angular/material/grid-list";
+import { MatIconModule } from "@angular/material/icon";
+import { MatExpansionModule } from "@angular/material/expansion";
+import { MatMenuModule } from "@angular/material/menu";
 import { MatToolbarModule } from '@angular/material/toolbar'
 
 import { ClipboardModule } from '@angular/cdk/clipboard'
 import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
-import {MatProgressBarModule} from "@angular/material/progress-bar";
-import {MatProgressSpinnerModule} from "@angular/material/progress-spinner";
-import {MatRadioModule} from "@angular/material/radio";
+import { MatProgressBarModule } from "@angular/material/progress-bar";
+import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
+import { MatRadioModule } from "@angular/material/radio";
+import { MatTableModule } from "@angular/material/table";
+import { MatSortModule } from "@angular/material/sort";
 
 const defaultDialogOption: MatDialogConfig = new MatDialogConfig()
 
 @NgModule({
-  imports: [
-    BrowserAnimationsModule,
-    
-    MatButtonModule,
-    MatSnackBarModule,
-    MatCheckboxModule,
-    MatSidenavModule,
-    MatCardModule,
-    MatTabsModule,
-    MatTooltipModule,
-    MatBadgeModule,
-    MatDividerModule,
-    MatSelectModule,
-    MatChipsModule,
-    MatAutocompleteModule,
-    MatDialogModule,
-    MatInputModule,
-    MatBottomSheetModule,
-    MatListModule,
-    MatSlideToggleModule,
-    MatRippleModule,
-    MatSliderModule,
-    DragDropModule,
-    MatExpansionModule,
-    MatGridListModule,
-    MatIconModule,
-    MatMenuModule,
-    ScrollingModule,
-    MatToolbarModule,
-    ClipboardModule,
-    MatProgressBarModule,
-    MatProgressSpinnerModule,
-    MatRadioModule
-  ],
   exports: [
     MatButtonModule,
     MatCheckboxModule,
@@ -100,7 +68,9 @@ const defaultDialogOption: MatDialogConfig = new MatDialogConfig()
     ClipboardModule,
     MatProgressBarModule,
     MatProgressSpinnerModule,
-    MatRadioModule
+    MatRadioModule,
+    MatTableModule,
+    MatSortModule,
   ],
   providers: [{
     provide: MAT_DIALOG_DEFAULT_OPTIONS,
diff --git a/src/state/atlasSelection/effects.spec.ts b/src/state/atlasSelection/effects.spec.ts
index 9e4778613..a64b03233 100644
--- a/src/state/atlasSelection/effects.spec.ts
+++ b/src/state/atlasSelection/effects.spec.ts
@@ -14,7 +14,7 @@ import { atlasSelection } from ".."
 import { BrowserAnimationsModule } from "@angular/platform-browser/animations"
 import { translateV3Entities } from "src/atlasComponents/sapi/translateV3"
 import { PathReturn } from "src/atlasComponents/sapi/typeV3"
-import { MatDialog } from "@angular/material/dialog"
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 
 describe("> effects.ts", () => {
   describe("> Effect", () => {
diff --git a/src/state/atlasSelection/effects.ts b/src/state/atlasSelection/effects.ts
index c4920067a..1403ce3c4 100644
--- a/src/state/atlasSelection/effects.ts
+++ b/src/state/atlasSelection/effects.ts
@@ -13,7 +13,7 @@ import { InterSpaceCoordXformSvc } from "src/atlasComponents/sapi/core/space/int
 import { SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate } from "src/atlasComponents/sapi/sxplrTypes";
 import { DecisionCollapse } from "src/atlasComponents/sapi/decisionCollapse.service";
 import { DialogFallbackCmp } from "src/ui/dialogInfo";
-import { MatDialog } from "@angular/material/dialog";
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 
 type OnTmplParcHookArg = {
   previous: {
diff --git a/src/state/userInterface/actions.ts b/src/state/userInterface/actions.ts
index e423f261e..5fcd71a40 100644
--- a/src/state/userInterface/actions.ts
+++ b/src/state/userInterface/actions.ts
@@ -1,6 +1,5 @@
 import { TemplateRef } from "@angular/core";
-import { MatBottomSheetConfig } from "@angular/material/bottom-sheet";
-import { MatSnackBarConfig } from "@angular/material/snack-bar";
+import { MatSnackBarConfig, MatBottomSheetConfig } from 'src/sharedModules/angularMaterial.exports'
 import { createAction, props } from "@ngrx/store";
 import { nameSpace, PanelMode } from "./const"
 
diff --git a/src/state/userInterface/effects.ts b/src/state/userInterface/effects.ts
index 6b5d98bdd..aa879e727 100644
--- a/src/state/userInterface/effects.ts
+++ b/src/state/userInterface/effects.ts
@@ -1,6 +1,5 @@
 import { Injectable } from "@angular/core";
-import { MatBottomSheet, MatBottomSheetRef } from "@angular/material/bottom-sheet";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar, MatBottomSheet, MatBottomSheetRef } from 'src/sharedModules/angularMaterial.exports'
 import { Actions, createEffect, ofType } from "@ngrx/effects";
 import { select, Store } from "@ngrx/store";
 import { of } from "rxjs";
diff --git a/src/strictLocal/module.ts b/src/strictLocal/module.ts
index 62db4e8d8..d7ffa1de9 100644
--- a/src/strictLocal/module.ts
+++ b/src/strictLocal/module.ts
@@ -1,7 +1,6 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
-import { MatButtonModule } from "@angular/material/button";
-import { MatTooltipModule } from "@angular/material/tooltip";
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
 import { HideWhenLocal } from "./strictLocal.directive";
 import { StrictLocalInfo } from "./strictLocalCmp/strictLocalCmp.component";
 
@@ -12,8 +11,7 @@ import { StrictLocalInfo } from "./strictLocalCmp/strictLocalCmp.component";
   ],
   imports: [
     CommonModule,
-    MatTooltipModule,
-    MatButtonModule,
+    AngularMaterialModule,
   ],
   exports: [
     HideWhenLocal,
diff --git a/src/theme.scss b/src/theme.scss
index 8140e544f..b163b1c26 100644
--- a/src/theme.scss
+++ b/src/theme.scss
@@ -3,6 +3,46 @@
 
 @include mat.core();
 
+$sxplr-primary: mat.define-palette(mat.$indigo-palette, 500);
+$sxplr-accent: mat.define-palette(mat.$amber-palette, A200, A100, A400);
+$sxplr-warn: mat.define-palette(mat.$red-palette);
+
+// The "warn" palette is optional and defaults to red if not specified.
+$sxplr-warn: mat.define-palette(mat.$red-palette);
+$sxplr-light-theme: mat.define-light-theme((
+ color: (
+   primary: $sxplr-primary,
+   accent: $sxplr-accent,
+   warn: $sxplr-warn,
+ ),
+ typography: mat.define-typography-config(),
+ density: 0,
+));
+
+// Define a dark theme
+$sxplr-dark-theme: mat.define-dark-theme((
+ color: (
+   primary: $sxplr-primary,
+   accent: $sxplr-accent,
+   warn: $sxplr-warn,
+ ),
+  typography: mat.define-typography-config(),
+  density: 0,
+));
+
+// Include the theme mixins for other components you use here.
+// TODO(v15): As of v15 mat.legacy-core no longer includes default typography styles.
+//  The following line adds:
+//    1. Default typography styles for all components
+//    2. Styles for typography hierarchy classes (e.g. .mat-headline-1)
+//  If you specify typography styles for the components you use elsewhere, you should delete this line.
+//  If you don't need the default component typographies but still want the hierarchy styles,
+//  you can delete this line and instead use:
+//    `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());`
+
+// @include mat.all-legacy-component-typographies();
+// @include mat.legacy-core();
+
 @mixin custom-cmp($theme) {
   $color-config: mat.get-color-config($theme);
 
@@ -85,32 +125,20 @@
   }
 }
 
-$iv-theme-primary:  mat.define-palette(mat.$indigo-palette);
-$iv-theme-accent:   mat.define-palette(mat.$amber-palette);
-$iv-theme-warn:     mat.define-palette(mat.$red-palette);
-
-$iv-theme: mat.define-light-theme((
-  color: (
-    primary: $iv-theme-primary,
-    accent: $iv-theme-accent,
-    warn: $iv-theme-warn,
-  )
-));
+// @include mat.all-legacy-component-themes($iv-theme);
+// @include custom-cmp($iv-theme);
 
-@include mat.all-component-themes($iv-theme);
-@include custom-cmp($iv-theme);
+// $iv-dark-theme-primary: mat.define-palette(mat.$blue-palette);
+// $iv-dark-theme-accent:  mat.define-palette(mat.$amber-palette, A200, A100, A400);
+// $iv-dark-theme-warn:    mat.define-palette(mat.$red-palette);
 
-$iv-dark-theme-primary: mat.define-palette(mat.$blue-palette);
-$iv-dark-theme-accent:  mat.define-palette(mat.$amber-palette, A200, A100, A400);
-$iv-dark-theme-warn:    mat.define-palette(mat.$red-palette);
-
-$iv-dark-theme:   mat.define-dark-theme((
-  color: (
-    primary: $iv-dark-theme-primary,
-    accent: $iv-dark-theme-accent,
-    warn: $iv-dark-theme-warn,
-  )
-));
+// $iv-dark-theme:   mat.define-dark-theme((
+//   color: (
+//     primary: $iv-dark-theme-primary,
+//     accent: $iv-dark-theme-accent,
+//     warn: $iv-dark-theme-warn,
+//   )
+// ));
 
 /**
   * attribute has lower priority than class
@@ -120,15 +148,15 @@ $iv-dark-theme:   mat.define-dark-theme((
 [darktheme=true],
 .darktheme.darktheme
 {
-  @include mat.all-component-themes($iv-dark-theme);
-  @include custom-cmp($iv-dark-theme);
+  @include mat.all-component-themes($sxplr-dark-theme);
+  @include custom-cmp($sxplr-dark-theme);
 }
 
 [darktheme=false],
 .lighttheme.lighttheme
 {
-  @include mat.all-component-themes($iv-theme);
-  @include custom-cmp($iv-theme);
+  @include custom-cmp($sxplr-light-theme);
+  @include mat.all-component-themes($sxplr-light-theme);
 }
 
 .iav-dialog-class
diff --git a/src/ui/actionDialog/actionDialog.component.ts b/src/ui/actionDialog/actionDialog.component.ts
index ced5d32d4..a49ca149f 100644
--- a/src/ui/actionDialog/actionDialog.component.ts
+++ b/src/ui/actionDialog/actionDialog.component.ts
@@ -1,5 +1,5 @@
 import { Component, Optional, Inject } from "@angular/core";
-import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports";
 
 interface IDialogAction{
   type: 'mat-button' | 'mat-flat-button' | 'mat-raised-button' | 'mat-stroked-button'
diff --git a/src/ui/bottomMenu/module.ts b/src/ui/bottomMenu/module.ts
index ab281f989..48ff73d96 100644
--- a/src/ui/bottomMenu/module.ts
+++ b/src/ui/bottomMenu/module.ts
@@ -4,8 +4,7 @@ import { BottomMenuCmp } from "./bottomMenuCmp/bottomMenu.component";
 import { ATPSelectorModule } from "src/atlasComponents/sapiViews/core/rich/ATPSelector";
 import { SmartChipModule } from "src/components/smartChip";
 import { SapiViewsCoreRegionModule } from "src/atlasComponents/sapiViews/core/region";
-import { MatButtonModule } from "@angular/material/button";
-import { MatRippleModule } from "@angular/material/core";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
@@ -13,8 +12,7 @@ import { MatRippleModule } from "@angular/material/core";
     ATPSelectorModule,
     SmartChipModule,
     SapiViewsCoreRegionModule,
-    MatButtonModule,
-    MatRippleModule,
+    AngularMaterialModule,
   ],
   declarations: [
     BottomMenuCmp,
diff --git a/src/ui/config/configCmp/config.component.ts b/src/ui/config/configCmp/config.component.ts
index 386293b19..00b2b4783 100644
--- a/src/ui/config/configCmp/config.component.ts
+++ b/src/ui/config/configCmp/config.component.ts
@@ -3,8 +3,7 @@ import { select, Store } from '@ngrx/store';
 import { combineLatest, Observable, of, Subscription } from 'rxjs';
 import { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
 import { isIdentityQuat } from 'src/viewerModule/nehuba/util';
-import { MatSlideToggleChange } from "@angular/material/slide-toggle";
-import { MatSliderChange } from "@angular/material/slider";
+import { MatSlideToggleChange } from 'src/sharedModules/angularMaterial.exports'
 import { atlasSelection, userPreference, userInterface } from 'src/state';
 import { environment } from "src/environments/environment"
 import { Z_TRAVERSAL_MULTIPLIER } from 'src/viewerModule/nehuba/layerCtrl.service/layerCtrl.util';
@@ -197,10 +196,10 @@ export class ConfigComponent implements OnInit, OnDestroy {
     )
   }
 
-  public handleMatSliderChange(ev: MatSliderChange) {
+  public updateGpuLimit(newVal: number){
     this.store.dispatch(
       userPreference.actions.setGpuLimit({
-        limit: ev.value * 1e6
+        limit: newVal * 1e6
       })
     )
   }
diff --git a/src/ui/config/configCmp/config.template.html b/src/ui/config/configCmp/config.template.html
index 3d1f0f215..a8244dcfe 100644
--- a/src/ui/config/configCmp/config.template.html
+++ b/src/ui/config/configCmp/config.template.html
@@ -41,8 +41,10 @@
           min="100"
           max="1000"
           [step]="stepSize"
-          (change)="handleMatSliderChange($event)"
-          [value]="gpuLimit$ | async">
+          >
+          <input matSliderThumb
+            (valueChange)="updateGpuLimit($event)"
+            [value]="gpuLimit$ | async">
         </mat-slider>
         <span class="d-inline-block flex-grow-0 flex-shrink-0 w-10em">
           {{ gpuLimit$ | async }} MB
diff --git a/src/ui/dialogInfo/dialog.directive.ts b/src/ui/dialogInfo/dialog.directive.ts
index 62640509e..48d8daf65 100644
--- a/src/ui/dialogInfo/dialog.directive.ts
+++ b/src/ui/dialogInfo/dialog.directive.ts
@@ -1,5 +1,5 @@
 import { Directive, HostListener, Input, TemplateRef } from "@angular/core";
-import { MatDialog, MatDialogConfig } from "@angular/material/dialog";
+import { MatDialog, MatDialogConfig } from 'src/sharedModules/angularMaterial.exports'
 import { DialogFallbackCmp } from "./tmpl/tmpl.component"
 
 type DialogSize = 's' | 'm' | 'l' | 'xl' | 'auto'
diff --git a/src/ui/dialogInfo/module.ts b/src/ui/dialogInfo/module.ts
index c691e5381..bc329cbbd 100644
--- a/src/ui/dialogInfo/module.ts
+++ b/src/ui/dialogInfo/module.ts
@@ -1,23 +1,19 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
-import { MatButtonModule } from "@angular/material/button";
-import { MatDialogModule } from "@angular/material/dialog";
 import { MarkdownModule } from "src/components/markdown";
 import { StrictLocalModule } from "src/strictLocal";
 import { DialogDirective } from "./dialog.directive"
 import { DialogFallbackCmp } from "./tmpl/tmpl.component";
-import { MatListModule } from "@angular/material/list";
 import { ExperimentalModule } from "src/experimental/experimental.module";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports: [
     CommonModule,
-    MatDialogModule,
-    MatButtonModule,
     MarkdownModule,
     StrictLocalModule,
-    MatListModule,
     ExperimentalModule,
+    AngularMaterialModule,
   ],
   declarations: [
     DialogDirective,
diff --git a/src/ui/dialogInfo/tmpl/tmpl.component.ts b/src/ui/dialogInfo/tmpl/tmpl.component.ts
index be6842b0e..43d92b79c 100644
--- a/src/ui/dialogInfo/tmpl/tmpl.component.ts
+++ b/src/ui/dialogInfo/tmpl/tmpl.component.ts
@@ -1,5 +1,5 @@
 import { Component, Inject } from "@angular/core";
-import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports";
 
 export type FallBackData = {
   title: string
diff --git a/src/ui/help/about/about.component.ts b/src/ui/help/about/about.component.ts
index 31fd28663..32528ffea 100644
--- a/src/ui/help/about/about.component.ts
+++ b/src/ui/help/about/about.component.ts
@@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'
 import { NewestRelease } from '../newestRelease.directive'
 import { HttpClient } from '@angular/common/http'
 import { map } from 'rxjs/operators'
-import { MatDialog } from '@angular/material/dialog'
+import { MatDialog } from 'src/sharedModules/angularMaterial.exports'
 import { HowToCite } from '../howToCite/howToCite.component'
 import { SAPI, EXPECTED_SIIBRA_API_VERSION } from "src/atlasComponents/sapi/sapi.service"
 import { environment } from "src/environments/environment"
diff --git a/src/ui/help/module.ts b/src/ui/help/module.ts
index 5d08c1179..ca6c1f42a 100644
--- a/src/ui/help/module.ts
+++ b/src/ui/help/module.ts
@@ -9,8 +9,6 @@ import { QuickTourModule } from "src/ui/quickTour/module";
 import { HowToCite } from "./howToCite/howToCite.component";
 import { StrictLocalModule } from "src/strictLocal";
 import { HttpClientModule } from "@angular/common/http";
-import { MatInputModule } from "@angular/material/input";
-import { MatDialogModule } from "@angular/material/dialog";
 import { ShareModule } from "src/share";
 
 @NgModule({
@@ -23,9 +21,7 @@ import { ShareModule } from "src/share";
     StrictLocalModule,
     HttpClientModule,
 
-    ShareModule,    
-    MatInputModule,
-    MatDialogModule,
+    ShareModule,
   ],
   declarations: [
     AboutCmp,
diff --git a/src/ui/quickTour/quickTour.service.ts b/src/ui/quickTour/quickTour.service.ts
index e593328e8..83a19f227 100644
--- a/src/ui/quickTour/quickTour.service.ts
+++ b/src/ui/quickTour/quickTour.service.ts
@@ -6,7 +6,7 @@ import { QuickTourThis } from "./quickTourThis.directive";
 import { DoublyLinkedList, IDoublyLinkedItem } from 'src/util'
 import { EnumQuickTourSeverity, PERMISSION_DIALOG_ACTIONS, QuickTourSeverity, QUICK_TOUR_CMP_INJTKN } from "./constrants";
 import { LOCAL_STORAGE_CONST } from "src/util/constants";
-import { MatDialog, MatDialogRef } from "@angular/material/dialog";
+import { MatDialog, MatDialogRef } from 'src/sharedModules/angularMaterial.exports'
 import { StartTourDialogDialog } from "src/ui/quickTour/startTourDialog/startTourDialog.component";
 
 const autoPlayPriority: Set<EnumQuickTourSeverity | keyof typeof QuickTourSeverity> = new Set([
diff --git a/src/ui/quickTour/startTourDialog/startTourDialog.component.ts b/src/ui/quickTour/startTourDialog/startTourDialog.component.ts
index ac77e1d47..4d1dd9e40 100644
--- a/src/ui/quickTour/startTourDialog/startTourDialog.component.ts
+++ b/src/ui/quickTour/startTourDialog/startTourDialog.component.ts
@@ -1,5 +1,5 @@
 import {Component} from "@angular/core";
-import {MatDialogRef} from "@angular/material/dialog";
+import { MatDialogRef } from 'src/sharedModules/angularMaterial.exports'
 import { CONST } from 'common/constants'
 import { PERMISSION_DIALOG_ACTIONS } from "../constrants";
 
diff --git a/src/ui/topMenu/module.ts b/src/ui/topMenu/module.ts
index 71c28c739..44437f2e6 100644
--- a/src/ui/topMenu/module.ts
+++ b/src/ui/topMenu/module.ts
@@ -10,12 +10,13 @@ import { CookieModule } from "src/ui/cookieAgreement/module";
 import { HelpModule } from "src/ui/help/module";
 import { KgTosModule } from "src/ui/kgtos/module";
 import { ScreenshotModule } from "src/screenshot";
-import { AngularMaterialModule } from "src/sharedModules";
 import { TopMenuCmp } from "./topMenuCmp/topMenu.components";
 import { UserAnnotationsModule } from "src/atlasComponents/userAnnotations";
 import { QuickTourModule } from "src/ui/quickTour/module";
 import { KeyFrameModule } from "src/keyframesModule/module";
 import { AtlasDownloadModule } from "src/atlas-download/atlas-download.module";
+import { AngularMaterialModule } from "src/sharedModules";
+
 
 @NgModule({
   imports: [
diff --git a/src/ui/topMenu/topMenuCmp/topMenu.components.ts b/src/ui/topMenu/topMenuCmp/topMenu.components.ts
index 94bf82bef..580ab86fc 100644
--- a/src/ui/topMenu/topMenuCmp/topMenu.components.ts
+++ b/src/ui/topMenu/topMenuCmp/topMenu.components.ts
@@ -7,8 +7,7 @@ import {
 import { Observable } from "rxjs";
 import { map } from "rxjs/operators";
 import { AuthService } from "src/auth";
-import { MatDialog, MatDialogConfig, MatDialogRef } from "@angular/material/dialog";
-import { MatBottomSheet } from "@angular/material/bottom-sheet";
+import { MatBottomSheet, MatDialog, MatDialogConfig, MatDialogRef } from 'src/sharedModules/angularMaterial.exports'
 import { CONST, QUICKTOUR_DESC, ARIA_LABELS } from 'common/constants'
 import { IQuickTourData } from "src/ui/quickTour/constrants";
 import { TypeMatBtnColor, TypeMatBtnStyle } from "src/components/dynamicMaterialBtn/dynamicMaterialBtn.component";
diff --git a/src/util/df-to-ds.pipe.ts b/src/util/df-to-ds.pipe.ts
index f50be028d..62be4bd99 100644
--- a/src/util/df-to-ds.pipe.ts
+++ b/src/util/df-to-ds.pipe.ts
@@ -1,7 +1,6 @@
 import { CdkTableDataSourceInput } from '@angular/cdk/table';
 import { Pipe, PipeTransform } from '@angular/core';
-import { MatSort } from '@angular/material/sort';
-import { MatTableDataSource } from '@angular/material/table';
+import { MatSort, MatTableDataSource } from 'src/sharedModules/angularMaterial.exports'
 import { components } from "src/atlasComponents/sapi/schemaV3"
 type DF = components["schemas"]["DataFrameModel"]
 
diff --git a/src/util/side-panel/side-panel.component.spec.ts b/src/util/side-panel/side-panel.component.spec.ts
index 5a7f71a4d..3fb23f57f 100644
--- a/src/util/side-panel/side-panel.component.spec.ts
+++ b/src/util/side-panel/side-panel.component.spec.ts
@@ -1,7 +1,7 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { SidePanelComponent } from './side-panel.component';
-import { MatCardModule } from '@angular/material/card';
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
 
 describe('SidePanelComponent', () => {
   let component: SidePanelComponent;
@@ -10,7 +10,7 @@ describe('SidePanelComponent', () => {
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       imports: [
-        MatCardModule,
+        AngularMaterialModule,
       ],
       declarations: [ 
         SidePanelComponent,
diff --git a/src/util/util.module.ts b/src/util/util.module.ts
index 53355b1f5..f2b7ccc21 100644
--- a/src/util/util.module.ts
+++ b/src/util/util.module.ts
@@ -20,7 +20,7 @@ import { CombineFnPipe } from "./pipes/combineFn.pipe";
 import { MergeObjPipe } from "./mergeObj.pipe";
 import { IncludesPipe } from "./includes.pipe";
 import { SidePanelComponent } from './side-panel/side-panel.component';
-import { MatCardModule } from "@angular/material/card";
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
 import { CommonModule } from "@angular/common";
 import { DfToDsPipe } from './df-to-ds.pipe';
 import { PrettyPresentPipe } from './pretty-present.pipe';
@@ -28,7 +28,7 @@ import { PrettyPresentPipe } from './pretty-present.pipe';
 @NgModule({
   imports:[
     LayoutModule,
-    MatCardModule,
+    AngularMaterialModule,
     CommonModule,
   ],
   declarations: [
diff --git a/src/viewerModule/leap/module.ts b/src/viewerModule/leap/module.ts
index 4e7bcbfc5..19eb06f7c 100644
--- a/src/viewerModule/leap/module.ts
+++ b/src/viewerModule/leap/module.ts
@@ -1,6 +1,6 @@
 import { CommonModule } from "@angular/common";
 import { APP_INITIALIZER, NgModule } from "@angular/core";
-import { MatCardModule } from "@angular/material/card";
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
 import { APPEND_SCRIPT_TOKEN } from "src/util/constants";
 import { LeapSignal } from "./leapSignal/leapSignal.component";
 import { LeapService } from "./service";
@@ -9,7 +9,7 @@ import { LeapControlViewRef } from "./signal.directive";
 @NgModule({
   imports: [
     CommonModule,
-    MatCardModule,
+    AngularMaterialModule,
   ],
   declarations: [
     LeapSignal,
diff --git a/src/viewerModule/nehuba/layoutOverlay/module.ts b/src/viewerModule/nehuba/layoutOverlay/module.ts
index b19dbd704..29bfe0703 100644
--- a/src/viewerModule/nehuba/layoutOverlay/module.ts
+++ b/src/viewerModule/nehuba/layoutOverlay/module.ts
@@ -1,6 +1,5 @@
 import { CommonModule } from "@angular/common";
 import { NgModule } from "@angular/core";
-import { MatMenuModule } from "@angular/material/menu";
 import { ViewerCtrlModule } from "../viewerCtrl";
 import { NehubaLayoutOverlay } from "./nehuba.layoutOverlay/nehuba.layoutOverlay.component";
 import { QuickTourModule } from "src/ui/quickTour";
@@ -8,11 +7,10 @@ import { SpinnerModule } from "src/components/spinner";
 import { UtilModule } from "src/util";
 import { WindowResizeModule } from "src/util/windowResize";
 import { LayoutModule } from "src/layouts/layout.module";
-import { MatButtonModule } from "@angular/material/button";
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
 
 @NgModule({
   imports: [
-    MatMenuModule,
     CommonModule,
     LayoutModule,
     ViewerCtrlModule,
@@ -20,8 +18,7 @@ import { MatButtonModule } from "@angular/material/button";
     SpinnerModule,
     UtilModule,
     WindowResizeModule,
-    MatButtonModule,
-    MatMenuModule
+    AngularMaterialModule,
   ],
   declarations: [
     NehubaLayoutOverlay,
diff --git a/src/viewerModule/nehuba/ngLayerCtlModule/module.ts b/src/viewerModule/nehuba/ngLayerCtlModule/module.ts
index dbdea746c..52defe572 100644
--- a/src/viewerModule/nehuba/ngLayerCtlModule/module.ts
+++ b/src/viewerModule/nehuba/ngLayerCtlModule/module.ts
@@ -1,16 +1,15 @@
 import { CommonModule } from "@angular/common";
 import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core";
-import { MatButtonModule } from "@angular/material/button";
-import { MatTooltipModule } from "@angular/material/tooltip";
 import { SpinnerModule } from "src/components/spinner";
 import { NgLayerCtrlCmp } from "./ngLayerCtl/ngLayerCtrl.component";
+import { AngularMaterialModule } from 'src/sharedModules/angularMaterial.module'
+
 
 @NgModule({
   imports: [
     CommonModule,
-    MatTooltipModule,
-    MatButtonModule,
     SpinnerModule,
+    AngularMaterialModule,
   ],
   declarations: [
     NgLayerCtrlCmp
diff --git a/src/viewerModule/nehuba/ngLayerCtlModule/ngLayerCtl/ngLayerCtrl.stories.ts b/src/viewerModule/nehuba/ngLayerCtlModule/ngLayerCtl/ngLayerCtrl.stories.ts
index ff1fb3cd5..d6e832f32 100644
--- a/src/viewerModule/nehuba/ngLayerCtlModule/ngLayerCtl/ngLayerCtrl.stories.ts
+++ b/src/viewerModule/nehuba/ngLayerCtlModule/ngLayerCtl/ngLayerCtrl.stories.ts
@@ -1,12 +1,11 @@
 import { idMat4, NgLayerCtrlCmp } from "./ngLayerCtrl.component"
 import { Meta, moduleMetadata, Story } from "@storybook/angular"
 import { CommonModule } from "@angular/common"
-import { MatButtonModule } from "@angular/material/button"
 import { NEHUBA_INSTANCE_INJTKN } from "src/viewerModule/nehuba/util"
 import { NEVER } from "rxjs"
 import { action } from "@storybook/addon-actions"
-import { MatTooltipModule } from "@angular/material/tooltip"
 import { Store } from "@ngrx/store"
+import { AngularMaterialModule } from "src/sharedModules"
 
 export default {
   component: NgLayerCtrlCmp,
@@ -14,8 +13,7 @@ export default {
     moduleMetadata({
       imports: [
         CommonModule,
-        MatButtonModule,
-        MatTooltipModule,
+        AngularMaterialModule,
       ],
       providers: [
         {
diff --git a/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts b/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts
index cb1521df9..63db4bdcf 100644
--- a/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts
+++ b/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts
@@ -8,7 +8,6 @@ import { ShareModule } from "src/share"
 import { StateModule } from "src/state"
 import { MockStore, provideMockStore } from "@ngrx/store/testing"
 import { By } from "@angular/platform-browser"
-import { MatSlideToggle } from "@angular/material/slide-toggle"
 import { NoopAnimationsModule } from "@angular/platform-browser/animations"
 import { FormsModule, ReactiveFormsModule } from "@angular/forms"
 import { UtilModule } from "src/util"
@@ -16,6 +15,7 @@ import * as configSvc from '../config.service'
 import {QuickTourModule} from "src/ui/quickTour/module";
 import { atlasSelection } from "src/state"
 import { SxplrTemplate } from "src/atlasComponents/sapi/sxplrTypes"
+import { MatSlideToggle } from "src/sharedModules/angularMaterial.exports"
 
 @Directive({
   selector: '[iav-auth-auth-state]',
diff --git a/src/viewerModule/nehuba/statusCard/statusCard.component.ts b/src/viewerModule/nehuba/statusCard/statusCard.component.ts
index 5ca64921a..12e15afb3 100644
--- a/src/viewerModule/nehuba/statusCard/statusCard.component.ts
+++ b/src/viewerModule/nehuba/statusCard/statusCard.component.ts
@@ -12,8 +12,7 @@ import { LoggingService } from "src/logging";
 import { NehubaViewerUnit } from "../nehubaViewer/nehubaViewer.component";
 import { Observable, Subscription, of, combineLatest } from "rxjs";
 import { map, filter, startWith, throttleTime } from "rxjs/operators";
-import { MatBottomSheet } from "@angular/material/bottom-sheet";
-import { MatDialog } from "@angular/material/dialog";
+import { MatBottomSheet, MatDialog } from "src/sharedModules/angularMaterial.exports"
 import { ARIA_LABELS, QUICKTOUR_DESC } from 'common/constants'
 import { UntypedFormControl } from "@angular/forms";
 
diff --git a/src/viewerModule/nehuba/userLayers/module.ts b/src/viewerModule/nehuba/userLayers/module.ts
index ae8068454..dc55a432f 100644
--- a/src/viewerModule/nehuba/userLayers/module.ts
+++ b/src/viewerModule/nehuba/userLayers/module.ts
@@ -1,30 +1,22 @@
 import { CommonModule } from "@angular/common"
 import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core"
-import { MatDialogModule } from "@angular/material/dialog"
-import { MatSnackBarModule } from "@angular/material/snack-bar"
 import { DragDropFileModule } from "src/dragDropFile"
 import { UserLayerDragDropDirective } from "./userlayerDragdrop.directive"
-import { UserLayerService } from "./service"
-import { MatButtonModule } from "@angular/material/button"
-import { MatTooltipModule } from "@angular/material/tooltip"
 import { UserLayerInfoCmp } from "./userlayerInfo/userlayerInfo.component"
 import { UtilModule } from "src/util"
 import { SpinnerModule } from "src/components/spinner"
+import { AngularMaterialModule } from "src/sharedModules"
 
 @NgModule({
   imports: [
     CommonModule,
     DragDropFileModule,
-    MatSnackBarModule,
-    MatDialogModule,
-    MatButtonModule,
-    MatTooltipModule,
+    AngularMaterialModule,
     UtilModule,
     SpinnerModule,
   ],
   declarations: [UserLayerDragDropDirective, UserLayerInfoCmp],
   exports: [UserLayerDragDropDirective],
-  providers: [UserLayerService],
   schemas: [CUSTOM_ELEMENTS_SCHEMA],
 })
 export class NehubaUserLayerModule {}
diff --git a/src/viewerModule/nehuba/userLayers/service.ts b/src/viewerModule/nehuba/userLayers/service.ts
index 91634c402..7ec5f5bbf 100644
--- a/src/viewerModule/nehuba/userLayers/service.ts
+++ b/src/viewerModule/nehuba/userLayers/service.ts
@@ -1,5 +1,4 @@
 import { Injectable, OnDestroy } from "@angular/core"
-import { MatDialog, MatDialogRef } from "@angular/material/dialog"
 import { select, Store } from "@ngrx/store"
 import { forkJoin, from, Subscription } from "rxjs"
 import { distinctUntilChanged, filter } from "rxjs/operators"
@@ -19,6 +18,7 @@ import { translateV3Entities } from "src/atlasComponents/sapi/translateV3"
 import { MetaV1Schema } from "src/atlasComponents/sapi/typeV3"
 import { AnnotationLayer } from "src/atlasComponents/annotations"
 import { rgbToHex } from 'common/util'
+import { MatDialogRef, MatDialog } from "src/sharedModules/angularMaterial.exports"
 
 type OmitKeys = "clType" | "id" | "source"
 type LayerOption = Omit<atlasAppearance.const.NgLayerCustomLayer, OmitKeys>
@@ -51,7 +51,9 @@ function RegisterSource(matcher: ProcessResource['matcher']) {
 }
 
 
-@Injectable()
+@Injectable({
+  providedIn: 'root'
+})
 export class UserLayerService implements OnDestroy {
   #idToCleanup = new Map<string, () => void>()
   #dialogRef: MatDialogRef<unknown>
diff --git a/src/viewerModule/nehuba/userLayers/userlayerDragdrop.directive.ts b/src/viewerModule/nehuba/userLayers/userlayerDragdrop.directive.ts
index 2b049c7f7..a4ef1d9dd 100644
--- a/src/viewerModule/nehuba/userLayers/userlayerDragdrop.directive.ts
+++ b/src/viewerModule/nehuba/userLayers/userlayerDragdrop.directive.ts
@@ -5,7 +5,7 @@ import {
   OnDestroy,
   OnInit,
 } from "@angular/core"
-import { MatSnackBar } from "@angular/material/snack-bar"
+import { MatSnackBar } from "src/sharedModules/angularMaterial.exports"
 import { Subscription } from "rxjs"
 import { DragDropFileDirective } from "src/dragDropFile/dragDrop.directive"
 import { UserLayerService } from "./service"
diff --git a/src/viewerModule/nehuba/userLayers/userlayerInfo/userlayerInfo.component.ts b/src/viewerModule/nehuba/userLayers/userlayerInfo/userlayerInfo.component.ts
index eb4f6fac1..119ccd2f4 100644
--- a/src/viewerModule/nehuba/userLayers/userlayerInfo/userlayerInfo.component.ts
+++ b/src/viewerModule/nehuba/userLayers/userlayerInfo/userlayerInfo.component.ts
@@ -1,5 +1,5 @@
 import { Component, Inject, ViewChild } from "@angular/core";
-import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { MAT_DIALOG_DATA } from "src/sharedModules/angularMaterial.exports"
 import { ARIA_LABELS, CONST } from 'common/constants'
 import { BehaviorSubject, Subject, combineLatest, concat, of, timer } from "rxjs";
 import { map, switchMap, take } from "rxjs/operators";
diff --git a/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts b/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts
index 0ec1d5125..ea18ee5a2 100644
--- a/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts
+++ b/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts
@@ -11,7 +11,7 @@ import { NEHUBA_INSTANCE_INJTKN } from "../../util"
 import { ViewerCtrlCmp } from "./viewerCtrlCmp.component"
 import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'
 import { HarnessLoader } from "@angular/cdk/testing"
-import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing'
+import { MatSlideToggleHarness } from "src/sharedModules/angularMaterial.exports"
 import { atlasAppearance, atlasSelection } from "src/state"
 
 
diff --git a/src/viewerModule/threeSurfer/module.ts b/src/viewerModule/threeSurfer/module.ts
index 7647de0ce..7bc067546 100644
--- a/src/viewerModule/threeSurfer/module.ts
+++ b/src/viewerModule/threeSurfer/module.ts
@@ -10,7 +10,6 @@ import { ThreeSurferViewerConfig } from "./tsViewerConfig/tsViewerConfig.compone
 import { nameSpace, reducer, ThreeSurferEffects } from "./store"
 import { EffectsModule } from "@ngrx/effects";
 import { TmpThreeSurferLifeCycle } from "./lifecycle/lifecycle.component";
-import { MatSlideToggleModule } from "@angular/material/slide-toggle";
 import { ExperimentalModule } from "src/experimental/experimental.module";
 
 @NgModule({
@@ -20,7 +19,6 @@ import { ExperimentalModule } from "src/experimental/experimental.module";
     UtilModule,
     FormsModule,
     ComponentsModule,
-    MatSlideToggleModule,
     ExperimentalModule,
     StoreModule.forFeature(
       nameSpace,
diff --git a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts
index 05b5d7f43..9a44a02e1 100644
--- a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts
+++ b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts
@@ -5,7 +5,7 @@ import { catchError, debounceTime, distinctUntilChanged, filter, map, scan, shar
 import { ComponentStore, LockError } from "src/viewerModule/componentStore";
 import { select, Store } from "@ngrx/store";
 import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR } from "src/util";
-import { MatSnackBar } from "@angular/material/snack-bar";
+import { MatSnackBar } from "src/sharedModules/angularMaterial.exports"
 import { CONST } from 'common/constants'
 import { getUuid, switchMapWaitFor } from "src/util/fn";
 import { AUTO_ROTATE, TInteralStatePayload, ViewerInternalStateSvc } from "src/viewerModule/viewerInternalState.service";
diff --git a/src/viewerModule/viewerCmp/viewerCmp.template.html b/src/viewerModule/viewerCmp/viewerCmp.template.html
index 1a247aafb..9035dc990 100644
--- a/src/viewerModule/viewerCmp/viewerCmp.template.html
+++ b/src/viewerModule/viewerCmp/viewerCmp.template.html
@@ -815,7 +815,7 @@
   
           <!-- content -->
           <ng-template matExpansionPanelContent>
-            <mat-chip-list class="wrapped-chips">
+            <mat-chip-set class="wrapped-chips">
               <mat-chip *ngFor="let region of regions">
                 <span>
                   {{ region.name }}
@@ -826,7 +826,7 @@
                   <i class="fas fa-times"></i>
                 </button>
               </mat-chip>  
-            </mat-chip-list>
+            </mat-chip-set>
           </ng-template>
         </mat-expansion-panel>
   
diff --git a/src/widget/constants.ts b/src/widget/constants.ts
index 53cc6568a..a917d4978 100644
--- a/src/widget/constants.ts
+++ b/src/widget/constants.ts
@@ -1,5 +1,5 @@
 import { InjectionToken } from "@angular/core";
-import { MatDialogConfig, MatDialogRef } from "@angular/material/dialog";
+import { MatDialogConfig, MatDialogRef } from "src/sharedModules/angularMaterial.exports"
 
 export enum EnumActionToWidget{
   OPEN,
diff --git a/src/widget/widget.module.ts b/src/widget/widget.module.ts
index 62b9d65ba..efe39aa36 100644
--- a/src/widget/widget.module.ts
+++ b/src/widget/widget.module.ts
@@ -3,19 +3,13 @@ import { CommonModule } from "@angular/common";
 import { ComponentsModule } from "src/components";
 import { WidgetCanvas } from "./widgetCanvas.directive";
 import { WidgetPortal } from "./widgetPortal/widgetPortal.component"
-import { MatCardModule } from "@angular/material/card";
-import { DragDropModule } from "@angular/cdk/drag-drop";
-import { MatButtonModule } from "@angular/material/button";
 import { PortalModule } from "@angular/cdk/portal";
-import { MatTooltipModule } from "@angular/material/tooltip";
 import { WidgetStateIconPipe } from "./widgetStateIcon.pipe";
+import { AngularMaterialModule } from "src/sharedModules";
 
 @NgModule({
   imports:[
-    MatCardModule,
-    DragDropModule,
-    MatButtonModule,
-    MatTooltipModule,
+    AngularMaterialModule,
     PortalModule,
     CommonModule,
     ComponentsModule,
-- 
GitLab