diff --git a/apps/web/index.html b/apps/web/index.html
index ef4d4065309f84f55011e0f2ae1b6a05e03e4df1..1f53c36c99a343b00e20aab44339eda4e15c765c 100644
--- a/apps/web/index.html
+++ b/apps/web/index.html
@@ -1,13 +1,19 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite + React + TS</title>
-  </head>
-  <body>
-    <div id="root"></div>
-    <script type="module" src="./src/main.tsx"></script>
-  </body>
-</html>
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <title>Graphpolaris</title>
+    <base href="/" />
+    <meta name="description" content="Graphpolaris" />
+
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + React + TS</title>
+    <link rel="preconnect" href="https://fonts.googleapis.com" />
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+    <link href="https://fonts.googleapis.com/css2?family=Inter&display=swap" rel="stylesheet" />
+  </head>
+  <body>
+    <div id="root" data-theme="graphpolaris"></div>
+    <script type="module" src="./src/main.tsx"></script>
+  </body>
+</html>
diff --git a/apps/web/package.json b/apps/web/package.json
index 24c4e5bfc0da9e8dc4326f8cf8e9f0efe279d257..9b3f0a9d08fb88dd13e586dd3caa0d0c53a501da 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,49 +1,55 @@
-{
-  "name": "web",
-  "private": true,
-  "version": "0.0.0",
-  "type": "module",
-  "scripts": {
-    "dev2": "vite --host local.graphpolaris.com --port 4200",
-    "dev": "vite --port 4200",
-    "build": "tsc && vite build",
-    "build-dev": "tsc && vite build --mode development",
-    "preview": "vite preview",
-    "lint": "eslint *.ts*",
-    "test": "vitest run"
-  },
-  "dependencies": {
-    "@graphpolaris/shared": "workspace:*",
-    "@mui/base": "5.0.0-alpha.118",
-    "@mui/icons-material": "^5.11.11",
-    "@mui/material": "^5.11.13",
-    "@reduxjs/toolkit": "^1.9.2",
-    "graphology": "^0.25.1",
-    "react": "^18.2.0",
-    "react-dom": "^18.2.0",
-    "react-grid-layout": "^1.3.4",
-    "react-redux": "^8.0.5",
-    "react-router-dom": "^6.8.1",
-    "reactflow": "11.4.0-next.1",
-    "styled-components": "^5.3.6"
-  },
-  "devDependencies": {
-    "@storybook/react": "7.0.0-rc.5",
-    "@testing-library/react": "14.0.0",
-    "@types/react": "^18.0.28",
-    "@types/react-dom": "^18.0.11",
-    "@types/react-grid-layout": "^1.3.2",
-    "@types/styled-components": "^5.1.26",
-    "@vitejs/plugin-basic-ssl": "^1.0.1",
-    "@vitejs/plugin-react-swc": "^3.0.0",
-    "autoprefixer": "^10.4.14",
-    "graphology-types": "^0.24.7",
-    "postcss": "^8.4.21",
-    "react-is": "^18.2.0",
-    "tailwindcss": "^3.3.1",
-    "typescript": "^4.9.3",
-    "vite": "^4.2.0",
-    "vite-plugin-dts": "^2.1.0",
-    "vitest": "^0.29.2"
-  }
-}
+{
+  "name": "web",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev2": "vite --host local.graphpolaris.com --port 4200",
+    "dev": "vite --port 4200",
+    "build": "tsc && vite build",
+    "build-dev": "tsc && vite build --mode development",
+    "preview": "vite preview",
+    "lint": "eslint *.ts*",
+    "test": "vitest run"
+  },
+  "dependencies": {
+    "@graphpolaris/shared": "workspace:*",
+    "@mui/base": "5.0.0-alpha.118",
+    "@mui/icons-material": "^5.11.11",
+    "@mui/material": "^5.11.13",
+    "@reduxjs/toolkit": "^1.9.2",
+    "graphology": "^0.25.1",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0",
+    "react-grid-layout": "^1.3.4",
+    "react-redux": "^8.0.5",
+    "react-router-dom": "^6.8.1",
+    "reactflow": "11.4.0-next.1",
+    "styled-components": "^5.3.6"
+  },
+  "devDependencies": {
+    "@iconify/json": "^2.2.95",
+    "@storybook/react": "7.0.0-rc.5",
+    "@svgr/core": "^8.0.0",
+    "@svgr/plugin-jsx": "^8.0.1",
+    "@tailwindcss/typography": "^0.5.9",
+    "@testing-library/react": "14.0.0",
+    "@types/react": "^18.0.28",
+    "@types/react-dom": "^18.0.11",
+    "@types/react-grid-layout": "^1.3.2",
+    "@types/styled-components": "^5.1.26",
+    "@vitejs/plugin-basic-ssl": "^1.0.1",
+    "@vitejs/plugin-react-swc": "^3.0.0",
+    "autoprefixer": "^10.4.14",
+    "daisyui": "^3.5.0",
+    "graphology-types": "^0.24.7",
+    "postcss": "^8.4.21",
+    "react-is": "^18.2.0",
+    "tailwindcss": "^3.3.1",
+    "typescript": "^4.9.3",
+    "unplugin-icons": "^0.16.5",
+    "vite": "^4.2.0",
+    "vite-plugin-dts": "^2.1.0",
+    "vitest": "^0.29.2"
+  }
+}
diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx
index c616b6452aca9754acfd38ccee16dcc4f3e84364..6e10743933cb5a7af4b86c354428f86a1d149d78 100644
--- a/apps/web/src/app/app.tsx
+++ b/apps/web/src/app/app.tsx
@@ -97,7 +97,7 @@ export function App(props: App) {
   return (
     <div className="h-screen w-screen">
       <div className={'flex h-screen w-screen overflow-hidden ' + (!auth.authorized ? 'blur-sm pointer-events-none ' : '')}>
-        <div className="h-full relative flex flex-col flex-1 overflow-y-auto overflow-x-hidden">
+        <div className="h-full relative flex flex-col flex-1 overflow-y-hidden overflow-x-hidden bg-base-content">
           <div className="h-fit flex-grow-0">
             <Navbar />
           </div>
diff --git a/apps/web/src/components/navbar/AddDatabaseForm/index.tsx b/apps/web/src/components/navbar/AddDatabaseForm/index.tsx
index 8df366cd416b8e49c60c86a967121b9175cf05ed..51cd9c181d7bffaed81453f6ff1b98981e8aeb51 100644
--- a/apps/web/src/components/navbar/AddDatabaseForm/index.tsx
+++ b/apps/web/src/components/navbar/AddDatabaseForm/index.tsx
@@ -15,7 +15,6 @@ import { AddDatabaseRequest, DatabaseType, databaseNameMapping, databaseProtocol
 
 /** AddDatabaseFormProps is an interface containing the AuthViewModel. */
 export interface AddDatabaseFormProps {
-  styles: any;
   open: boolean;
   onClose(): void;
   onSubmit(data: AddDatabaseRequest): void;
diff --git a/apps/web/src/components/navbar/navbar.module.scss b/apps/web/src/components/navbar/navbar.module.scss
index 339c62c0bdcfd45e3d48f1e0b69cde6fb1519d08..6504cf40b1b320ad2cf1ce7b1feeb8cc807859ba 100644
--- a/apps/web/src/components/navbar/navbar.module.scss
+++ b/apps/web/src/components/navbar/navbar.module.scss
@@ -1,44 +1,42 @@
-.root {
-  display: flex;
-  overflow: hidden;
-  height: 50px;
-}
-
-.appBar {
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  background-color: #fff;
-  height: 50px;
-}
-
-.menubox {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  width: 100%;
-}
-
-.menuText {
-  margin: 5px;
-  color: #181520;
-  font-family: Poppins, sans-serif;
-  font-weight: 400;
-  font-size: 15px;
-  align-self: flex-end;
-  text-transform: none;
-}
-
-.logo {
-  margin: auto;
-  display: block;
-}
-
-.loginButton {
-  margin: 6px;
-}
-
-.loginButtonText {
-  color: black;
-  font-weight: bold;
-}
+// .root {
+//   display: flex;
+//   overflow: hidden;
+//   height: 50px;
+// }
+
+// .appBar {
+//   display: flex;
+//   flex-direction: column;
+//   justify-content: center;
+//   height: 50px;
+// }
+
+// .menubox {
+//   display: flex;
+//   flex-direction: row;
+//   justify-content: flex-end;
+//   width: 100%;
+// }
+
+// .menuText {
+//   margin: 5px;
+//   color: #181520;
+//   font-weight: 400;
+//   font-size: 15px;
+//   align-self: flex-end;
+//   text-transform: none;
+// }
+
+// .logo {
+//   margin: auto;
+//   display: block;
+// }
+
+// .loginButton {
+//   margin: 6px;
+// }
+
+// .loginButtonText {
+//   color: black;
+//   font-weight: bold;
+// }
diff --git a/apps/web/src/components/navbar/navbar.tsx b/apps/web/src/components/navbar/navbar.tsx
index 9e1fe77168fcb8d28e5cbf22a98d7a16da8281ef..f11b22774fa3512ac2fae838c1b2f92d19b2b061 100644
--- a/apps/web/src/components/navbar/navbar.tsx
+++ b/apps/web/src/components/navbar/navbar.tsx
@@ -9,13 +9,12 @@
  * We do not test components/renderfunctions/styling files.
  * See testing plan for more details.*/
 import React, { useEffect, useState } from 'react';
-import { AppBar, Toolbar, CssBaseline, Typography, MenuItem, ListItemText, Menu, IconButton, Button } from '@mui/material';
-import { AccountCircle } from '@mui/icons-material';
+import { Toolbar, MenuItem, ListItemText, Menu, Button } from '@mui/material';
+import IconAccountCircle from '~icons/mdi/account-circle';
 import logo from './logogp.png';
 import logo_white from './logogpwhite.png';
 import AddDatabaseForm from './AddDatabaseForm';
 import { useTheme } from '@mui/material/styles';
-import styles from './navbar.module.scss';
 
 import { updateCurrentDatabase, updateDatabaseList } from '@graphpolaris/shared/lib/data-access/store/sessionSlice';
 import {
@@ -121,212 +120,156 @@ export const Navbar = (props: NavbarComponentProps) => {
     });
   }
 
-  const currentLogo = theme.palette.custom.logo == 'white' ? logo_white : logo;
+  const currentLogo = !'dark' ? logo_white : logo; // TODO: support dark mode
 
   return (
-    <div className={styles.root}>
-      <CssBaseline />
-      <AppBar
-        title="GraphPolaris"
-        style={{
-          backgroundColor: theme.palette.custom.background,
-        }}
-        sx={{
-          zIndex: 9999,
-        }}
-        position="fixed"
-        className={styles.appBar}
-      >
-        <Toolbar style={{ marginLeft: -5 }}>
-          <a href="https://graphpolaris.com/" className={styles.logo}>
-            <img src={currentLogo} className={styles.logo} />
-          </a>
-          <div className={styles.menubox}>
-            {/* <Button
-              className={styles.menuText}
-              style={{ color: theme.palette.custom.menuText }}
-              onClick={changeColourPalette}
-            >
-              Change Palette
-            </Button> */}
-            <Button href="https://graphpolaris.com/" className={styles.menuText} style={{ color: theme.palette.custom.menuText }}>
-              Home
-            </Button>
-            <Button
-              href="https://graphpolaris.com/index.php/products/"
-              className={styles.menuText}
-              style={{ color: theme.palette.custom.menuText }}
-            >
-              Products
-            </Button>
-            <Button href="https://graphpolaris.com#usecases" className={styles.menuText} style={{ color: theme.palette.custom.menuText }}>
-              Use Cases
-            </Button>
-            <Button
-              href="https://graphpolaris.com#earlyadoption"
-              className={styles.menuText}
-              style={{ color: theme.palette.custom.menuText }}
-            >
-              Contact
-            </Button>
-            {auth.authorized ? (
-              <div>
-                <IconButton
-                  color="inherit"
+    <div className="w-full px-5">
+      <div title="GraphPolaris" className={'navbar w-full'}>
+        <a href="https://graphpolaris.com/" className="w-full">
+          <img src={currentLogo} />
+        </a>
+        <div className="w-fit">
+          {auth.authorized ? (
+            <div>
+              <button
+                className="btn btn-circle btn-ghost hover:bg-gray-200"
+                onClick={(event) =>
+                  setState({
+                    ...state,
+                    userMenuAnchor: event.currentTarget,
+                  })
+                }
+              >
+                <IconAccountCircle htmlColor={theme.palette.custom.menuText} />
+              </button>
+              <Menu
+                id="user-menus"
+                anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
+                transformOrigin={{ vertical: 'top', horizontal: 'left' }}
+                anchorEl={state.userMenuAnchor}
+                keepMounted
+                open={Boolean(state.userMenuAnchor)}
+                onClose={() => closeUserMenu()}
+              >
+                <MenuItem>
+                  <ListItemText primary={'userID: ' + auth.userID} />
+                </MenuItem>
+                <MenuItem>
+                  <ListItemText primary={'sessionID: ' + auth.sessionID} />
+                </MenuItem>
+                <MenuItem
+                  onClick={() =>
+                    setState({
+                      ...state,
+                      userMenuAnchor: undefined,
+                      showAddDatabaseForm: true,
+                    })
+                  }
+                >
+                  <ListItemText primary={'Add database'} />
+                </MenuItem>
+                <MenuItem
                   onClick={(event) =>
                     setState({
                       ...state,
-                      userMenuAnchor: event.currentTarget,
+                      selectDatabaseMenuAnchor: event.currentTarget,
                     })
                   }
                 >
-                  <AccountCircle htmlColor={theme.palette.custom.menuText} />
-                </IconButton>
+                  <ListItemText onClick={() => openChangeSubMenu()} primary={'Change database'} />
+                </MenuItem>
                 <Menu
-                  id="user-menus"
-                  anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
-                  transformOrigin={{ vertical: 'top', horizontal: 'left' }}
-                  anchorEl={state.userMenuAnchor}
+                  id="databases-menus"
+                  anchorOrigin={{ vertical: 'top', horizontal: 'left' }}
+                  transformOrigin={{ vertical: 'top', horizontal: 'right' }}
+                  anchorEl={state.selectDatabaseMenuAnchor}
                   keepMounted
-                  open={Boolean(state.userMenuAnchor)}
-                  onClose={() => closeUserMenu()}
+                  disableAutoFocusItem
+                  open={Boolean(state.selectDatabaseMenuAnchor)}
+                  sx={{ display: subMenuChangeDisplay }}
+                  onClose={() => closeChangeSubMenu()}
                 >
-                  <MenuItem>
-                    <ListItemText primary={'userID: ' + auth.userID} />
-                  </MenuItem>
-                  <MenuItem>
-                    <ListItemText primary={'sessionID: ' + auth.sessionID} />
-                  </MenuItem>
-                  {/* <MenuItem
-                    onClick={() =>
-                      navbarViewModel.handleLoginButtonClicked('google')
-                    }
-                  >
-                    <ListItemText primary={'request new'} />
-                  </MenuItem> */}
-                  {/*<MenuItem onClick={() => LocalStorage.instance().Reset()}>*/}
-                  {/*  <ListItemText primary={'Empty localstorage'} />*/}
-                  {/*</MenuItem>*/}
-                  <MenuItem
-                    onClick={() =>
-                      setState({
-                        ...state,
-                        userMenuAnchor: undefined,
-                        showAddDatabaseForm: true,
-                      })
-                    }
-                  >
-                    <ListItemText primary={'Add database'} />
-                  </MenuItem>
-                  <MenuItem
-                    onClick={(event) =>
-                      setState({
-                        ...state,
-                        selectDatabaseMenuAnchor: event.currentTarget,
-                      })
-                    }
-                  >
-                    <ListItemText onClick={() => openChangeSubMenu()} primary={'Change database'} />
-                  </MenuItem>
-                  <Menu
-                    id="databases-menus"
-                    anchorOrigin={{ vertical: 'top', horizontal: 'left' }}
-                    transformOrigin={{ vertical: 'top', horizontal: 'right' }}
-                    anchorEl={state.selectDatabaseMenuAnchor}
-                    keepMounted
-                    disableAutoFocusItem
-                    open={Boolean(state.selectDatabaseMenuAnchor)}
-                    sx={{ display: subMenuChangeDisplay }}
-                    onClose={() => closeChangeSubMenu()}
-                  >
-                    {session.databases.length > 0 ? (
-                      session.databases.map((database) => (
-                        <MenuItem
-                          key={database}
-                          selected={database == session.currentDatabase}
-                          sx={{ display: subMenuChangeDisplay }}
-                          onClick={() => {
-                            if (session.currentDatabase != database) {
-                              dispatch(updateCurrentDatabase(database));
-                            }
-                            closeChangeSubMenu();
-                          }}
-                        >
-                          <ListItemText primary={database} />
-                        </MenuItem>
-                      ))
-                    ) : (
-                      <MenuItem key="placeholder" value="" disabled>
-                        no databases connected
-                      </MenuItem>
-                    )}
-                  </Menu>
-                  <MenuItem
-                    onClick={(event) =>
-                      setState({
-                        ...state,
-                        deleteDatabaseMenuAnchor: event.currentTarget,
-                      })
-                    }
-                  >
-                    <ListItemText onClick={() => openDeleteSubMenu()} primary={'Delete database'} />
-                  </MenuItem>
-                  <Menu
-                    id="delete-databases-menus"
-                    anchorOrigin={{ vertical: 'top', horizontal: 'left' }}
-                    transformOrigin={{ vertical: 'top', horizontal: 'right' }}
-                    anchorEl={state.deleteDatabaseMenuAnchor}
-                    keepMounted
-                    disableAutoFocusItem
-                    open={Boolean(state?.deleteDatabaseMenuAnchor)}
-                    sx={{ display: subMenuDeleteDisplay }}
-                    onClose={() => closeDeleteSubMenu()}
-                  >
-                    {session.databases.length > 0 ? (
-                      session.databases.map((database) => (
-                        <MenuItem
-                          key={database}
-                          selected={database == session.currentDatabase}
-                          onClick={() => {
-                            if (session.currentDatabase === database) {
-                              dispatch(updateCurrentDatabase(''));
-                            }
-                            api.DeleteDatabase(database);
-                            closeDeleteSubMenu();
-                          }}
-                        >
-                          <ListItemText primary={database} />
-                        </MenuItem>
-                      ))
-                    ) : (
-                      <MenuItem key="placeholder" value="" disabled>
-                        no databases connected
+                  {session.databases.length > 0 ? (
+                    session.databases.map((database) => (
+                      <MenuItem
+                        key={database}
+                        selected={database == session.currentDatabase}
+                        sx={{ display: subMenuChangeDisplay }}
+                        onClick={() => {
+                          if (session.currentDatabase != database) {
+                            dispatch(updateCurrentDatabase(database));
+                          }
+                          closeChangeSubMenu();
+                        }}
+                      >
+                        <ListItemText primary={database} />
                       </MenuItem>
-                    )}
-                  </Menu>
+                    ))
+                  ) : (
+                    <MenuItem key="placeholder" value="" disabled>
+                      no databases connected
+                    </MenuItem>
+                  )}
                 </Menu>
-              </div>
-            ) : (
-              <div>
-                <Button
-                  className={styles.loginButton}
+                <MenuItem
                   onClick={(event) =>
                     setState({
                       ...state,
-                      userMenuAnchor: event.currentTarget,
+                      deleteDatabaseMenuAnchor: event.currentTarget,
                     })
                   }
                 >
-                  <span
-                    className={styles.loginButtonText}
-                    style={{
-                      color: theme.palette.custom.menuText,
-                    }}
-                  >
-                    Login
-                  </span>
-                </Button>
-                {/* <Menu
+                  <ListItemText onClick={() => openDeleteSubMenu()} primary={'Delete database'} />
+                </MenuItem>
+                <Menu
+                  id="delete-databases-menus"
+                  anchorOrigin={{ vertical: 'top', horizontal: 'left' }}
+                  transformOrigin={{ vertical: 'top', horizontal: 'right' }}
+                  anchorEl={state.deleteDatabaseMenuAnchor}
+                  keepMounted
+                  disableAutoFocusItem
+                  open={Boolean(state?.deleteDatabaseMenuAnchor)}
+                  sx={{ display: subMenuDeleteDisplay }}
+                  onClose={() => closeDeleteSubMenu()}
+                >
+                  {session.databases.length > 0 ? (
+                    session.databases.map((database) => (
+                      <MenuItem
+                        key={database}
+                        selected={database == session.currentDatabase}
+                        onClick={() => {
+                          if (session.currentDatabase === database) {
+                            dispatch(updateCurrentDatabase(''));
+                          }
+                          api.DeleteDatabase(database);
+                          closeDeleteSubMenu();
+                        }}
+                      >
+                        <ListItemText primary={database} />
+                      </MenuItem>
+                    ))
+                  ) : (
+                    <MenuItem key="placeholder" value="" disabled>
+                      no databases connected
+                    </MenuItem>
+                  )}
+                </Menu>
+              </Menu>
+            </div>
+          ) : (
+            <div>
+              <button
+                className="btn btn-ghost"
+                onClick={(event) =>
+                  setState({
+                    ...state,
+                    userMenuAnchor: event.currentTarget,
+                  })
+                }
+              >
+                <span>Login</span>
+              </button>
+              {/* <Menu
                   id="user-menus"
                   getContentAnchorEl={null}
                   anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
@@ -358,11 +301,10 @@ export const Navbar = (props: NavbarComponentProps) => {
                     <ListItemText primary={'Login with free (debug)'} />
                   </MenuItem>
                 </Menu> */}
-              </div>
-            )}
-          </div>
-        </Toolbar>
-      </AppBar>
+            </div>
+          )}
+        </div>
+      </div>
       <AddDatabaseForm
         open={state.showAddDatabaseForm}
         onClose={() => setState({ ...state, showAddDatabaseForm: false })}
@@ -370,7 +312,6 @@ export const Navbar = (props: NavbarComponentProps) => {
           onAddDatabaseFormSubmit(...params);
           setState({ ...state, showAddDatabaseForm: false });
         }}
-        styles={undefined}
       />
     </div>
   );
diff --git a/apps/web/src/index.html b/apps/web/src/index.html
deleted file mode 100644
index fb97c0641cfe83e26fb2990ce93e8ffbb585f198..0000000000000000000000000000000000000000
--- a/apps/web/src/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <title>Graphpolaris</title>
-    <base href="/" />
-
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <link rel="icon" type="image/x-icon" href="favicon.ico" />
-  </head>
-
-  <body>
-    <div id="root"></div>
-  </body>
-</html>
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index b5c61c956711f981a41e95f7fcf0038436cfbb22..d1f14bdfc15ff18d02f909253306857d1323c577 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -1,3 +1,7 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+* {
+  font-family: 'Inter', ubuntu, sans-serif;
+}
diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js
index d21f1cdae70ca548855964467cc032c21ce5c1bb..1339b4d16963a1233868ea5f83c1654cbac37beb 100644
--- a/apps/web/tailwind.config.js
+++ b/apps/web/tailwind.config.js
@@ -1,8 +1,57 @@
 /** @type {import('tailwindcss').Config} */
+const defaultTheme = require('tailwindcss/defaultTheme');
+
 export default {
   content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
   theme: {
-    extend: {},
+    extend: {
+      fontFamily: {
+        inter: ['"Inter"', ...defaultTheme.fontFamily.sans],
+      },
+    },
+  },
+  plugins: [require('@tailwindcss/typography'), require('daisyui')],
+  // daisyUI config (optional - here are the default values)
+  daisyui: {
+    themes: [
+      {
+        graphpolarisWhite: {
+          ...require('daisyui/src/theming/themes')['[data-theme=corporate]'],
+          fontFamily: 'inter,ubuntu,courier,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace',
+          primary: '#112646',
+          secondary: '#B0B8C2',
+          accent: '#FF7D00',
+          neutral: '#1c1917',
+          'base-100': '#FFFFFF',
+          'base-content': '#F7F9FA',
+          // 'base-200': '#F9FBFC',
+          info: '#99622E',
+          success: '#2DC177',
+          warning: '#eab308',
+          error: '#dc2626',
+
+          // "--rounded-box": "0rem", // border radius rounded-box utility class, used in card and other large boxes
+          // "--rounded-btn": "0.5rem", // border radius rounded-btn utility class, used in buttons and similar element
+          // "--rounded-badge": "1.9rem", // border radius rounded-badge utility class, used in badges and similar
+          // "--animation-btn": "0.25s", // duration of animation when you click on button
+          // "--animation-input": "0.2s", // duration of animation for inputs like checkbox, toggle, radio, etc
+          // "--btn-text-case": "uppercase", // set default text transform for buttons
+          // "--btn-focus-scale": "0.95", // scale transform of button when you focus on it
+          // "--border-btn": "1px", // border width of buttons
+          // "--tab-border": "1px", // border width of tabs
+          // "--tab-radius": "0.5rem", // border radius of tabs
+        },
+      },
+      'dark',
+      'corporate',
+    ], // true: all themes | false: only light + dark | array: specific themes like this ["light", "dark", "cupcake"]
+    darkTheme: false, // disabled for now
+    // darkTheme: 'dark', // name of one of the included themes for dark mode
+    base: true, // applies background color and foreground color for root element by default
+    styled: true, // include daisyUI colors and design decisions for all components
+    utils: true, // adds responsive and modifier utility classes
+    rtl: false, // rotate style direction from left-to-right to right-to-left. You also need to add dir="rtl" to your html tag and install `tailwindcss-flip` plugin for Tailwind CSS.
+    prefix: '', // prefix for daisyUI classnames (components, modifiers and responsive class names. Not colors)
+    logs: true, // Shows info about daisyUI version and used config in the console when building your CSS
   },
-  plugins: [],
 };
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
index e3f42121eadfdee5dbebd030346e1e78f3fa4b7d..12b0482d9b502eafa2ebe41a737b43571063a1c5 100644
--- a/apps/web/tsconfig.json
+++ b/apps/web/tsconfig.json
@@ -21,7 +21,8 @@
     "baseUrl": ".",
     "paths": {
       "@graphpolaris/shared/lib/*": ["../../libs/shared/lib/*"]
-    }
+    },
+    "types": ["unplugin-icons/types/react"]
   },
   "exclude": ["node_modules", "public"],
   "include": ["src", "../../libs/shared/lib/querybuilder/panel/attributepill"],
diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts
index 44c0c7d6058d86b6955579f13e00a5a6f9872b99..d2f39ea117deb60ba9c92e5fafc75986860c7752 100644
--- a/apps/web/vite.config.ts
+++ b/apps/web/vite.config.ts
@@ -3,6 +3,7 @@ import { defineConfig } from 'vite';
 import react from '@vitejs/plugin-react-swc';
 import path from 'path';
 import dts from 'vite-plugin-dts';
+import Icons from 'unplugin-icons/vite';
 
 // https://vitejs.dev/config/
 export default defineConfig({
@@ -12,6 +13,7 @@ export default defineConfig({
     dts({
       insertTypesEntry: true,
     }),
+    Icons({ compiler: 'jsx', jsx: 'react' }),
   ],
   resolve: {
     alias: {
diff --git a/libs/shared/package.json b/libs/shared/package.json
index 221adab0f26c255ac9acce3f4b3ecc0e87ef98e8..2d31edd55afbc0ce147e52510a3e7bdd4436a0b3 100644
--- a/libs/shared/package.json
+++ b/libs/shared/package.json
@@ -65,6 +65,7 @@
     "web-worker": "^1.2.0"
   },
   "devDependencies": {
+    "@iconify/json": "^2.2.95",
     "@storybook/addon-styling": "^0.3.2",
     "@storybook/preset-scss": "^1.0.3",
     "@storybook/react": "7.0.22",
@@ -86,6 +87,7 @@
     "cytoscape-elk": "^2.1.0",
     "cytoscape-fcose": "^2.2.0",
     "cytoscape-klay": "^3.1.4",
+    "daisyui": "^3.5.0",
     "eslint": "^7.32.0",
     "eslint-config-next": "13.0.0",
     "eslint-config-prettier": "^8.3.0",
@@ -116,6 +118,7 @@
     "require-from-string": "^2.0.2",
     "ts-node": "10.9.1",
     "typescript": "^4.5.2",
+    "unplugin-icons": "^0.16.5",
     "url-loader": "^4.1.1",
     "vite": "^4.1.0",
     "vite-plugin-dts": "^2.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 73e36f4b94ecb26a651ddce45fb071acf7c5eb96..6d3c054d9f136edfe9854f07dafbf88782e5deae 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -112,9 +112,21 @@ importers:
         specifier: ^5.3.6
         version: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
     devDependencies:
+      '@iconify/json':
+        specifier: ^2.2.95
+        version: 2.2.95
       '@storybook/react':
         specifier: 7.0.0-rc.5
         version: 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5)
+      '@svgr/core':
+        specifier: ^8.0.0
+        version: 8.0.0
+      '@svgr/plugin-jsx':
+        specifier: ^8.0.1
+        version: 8.0.1(@svgr/core@8.0.0)
+      '@tailwindcss/typography':
+        specifier: ^0.5.9
+        version: 0.5.9(tailwindcss@3.3.1)
       '@testing-library/react':
         specifier: 14.0.0
         version: 14.0.0(react-dom@18.2.0)(react@18.2.0)
@@ -139,6 +151,9 @@ importers:
       autoprefixer:
         specifier: ^10.4.14
         version: 10.4.14(postcss@8.4.21)
+      daisyui:
+        specifier: ^3.5.0
+        version: 3.5.0(ts-node@10.9.1)
       graphology-types:
         specifier: ^0.24.7
         version: 0.24.7
@@ -154,6 +169,9 @@ importers:
       typescript:
         specifier: ^4.9.3
         version: 4.9.5
+      unplugin-icons:
+        specifier: ^0.16.5
+        version: 0.16.5(@svgr/core@8.0.0)
       vite:
         specifier: ^4.2.0
         version: 4.2.1(@types/node@17.0.12)(sass@1.59.3)
@@ -308,6 +326,9 @@ importers:
         specifier: ^1.2.0
         version: 1.2.0
     devDependencies:
+      '@iconify/json':
+        specifier: ^2.2.95
+        version: 2.2.95
       '@storybook/addon-styling':
         specifier: ^0.3.2
         version: 0.3.2(@storybook/addons@6.5.16)(@storybook/api@6.5.16)(@storybook/components@6.5.16)(@storybook/core-events@6.5.16)(@storybook/manager-api@7.0.22)(@storybook/theming@6.5.16)(react-dom@18.2.0)(react@18.2.0)(sass-loader@13.2.2)
@@ -368,6 +389,9 @@ importers:
       cytoscape-klay:
         specifier: ^3.1.4
         version: 3.1.4(cytoscape@3.23.0)
+      daisyui:
+        specifier: ^3.5.0
+        version: 3.5.0(ts-node@10.9.1)
       eslint:
         specifier: ^7.32.0
         version: 7.32.0
@@ -379,7 +403,7 @@ importers:
         version: 8.7.0(eslint@7.32.0)
       eslint-config-turbo:
         specifier: latest
-        version: 1.10.9(eslint@7.32.0)
+        version: 1.10.12(eslint@7.32.0)
       eslint-plugin-import:
         specifier: 2.27.5
         version: 2.27.5(@typescript-eslint/parser@5.52.0)(eslint-import-resolver-typescript@2.7.1)(eslint@7.32.0)
@@ -443,6 +467,9 @@ importers:
       typescript:
         specifier: ^4.5.2
         version: 4.9.5
+      unplugin-icons:
+        specifier: ^0.16.5
+        version: 0.16.5(@svgr/core@8.0.0)
       url-loader:
         specifier: ^4.1.1
         version: 4.1.1(webpack@5.77.0)
@@ -569,7 +596,7 @@ importers:
         version: 8.7.0(eslint@7.32.0)
       eslint-config-turbo:
         specifier: latest
-        version: 1.10.9(eslint@7.32.0)
+        version: 1.10.12(eslint@7.32.0)
       eslint-plugin-react:
         specifier: 7.31.8
         version: 7.31.8(eslint@7.32.0)
@@ -589,6 +616,17 @@ packages:
       '@jridgewell/gen-mapping': 0.1.1
       '@jridgewell/trace-mapping': 0.3.17
 
+  /@antfu/install-pkg@0.1.1:
+    resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
+    dependencies:
+      execa: 5.1.1
+      find-up: 5.0.0
+    dev: true
+
+  /@antfu/utils@0.7.5:
+    resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==}
+    dev: true
+
   /@aw-web-design/x-default-browser@1.4.88:
     resolution: {integrity: sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA==}
     hasBin: true
@@ -2845,6 +2883,30 @@ packages:
   /@humanwhocodes/object-schema@1.2.1:
     resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
 
+  /@iconify/json@2.2.95:
+    resolution: {integrity: sha512-54c4P8Z2Zuvgd3EEhAGV/byNPJ1sjVHO+Sd94376//6heUW73x04TjtNAnYviFdypI8S7SdYCn+ncyW4JhOmiA==}
+    dependencies:
+      '@iconify/types': 2.0.0
+      pathe: 1.1.0
+    dev: true
+
+  /@iconify/types@2.0.0:
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+    dev: true
+
+  /@iconify/utils@2.1.7:
+    resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==}
+    dependencies:
+      '@antfu/install-pkg': 0.1.1
+      '@antfu/utils': 0.7.5
+      '@iconify/types': 2.0.0
+      debug: 4.3.4(supports-color@5.5.0)
+      kolorist: 1.8.0
+      local-pkg: 0.4.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@istanbuljs/load-nyc-config@1.1.0:
     resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
     engines: {node: '>=8'}
@@ -5931,6 +5993,131 @@ packages:
       file-system-cache: 2.0.2
     dev: true
 
+  /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+    dev: true
+
+  /@svgr/babel-preset@8.0.0(@babel/core@7.21.3):
+    resolution: {integrity: sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.21.3
+      '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.21.3)
+      '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.21.3)
+    dev: true
+
+  /@svgr/core@8.0.0:
+    resolution: {integrity: sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@babel/core': 7.21.3
+      '@svgr/babel-preset': 8.0.0(@babel/core@7.21.3)
+      camelcase: 6.3.0
+      cosmiconfig: 8.1.3
+      snake-case: 3.0.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@svgr/hast-util-to-babel-ast@8.0.0:
+    resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@babel/types': 7.22.5
+      entities: 4.4.0
+    dev: true
+
+  /@svgr/plugin-jsx@8.0.1(@svgr/core@8.0.0):
+    resolution: {integrity: sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@svgr/core': '*'
+    dependencies:
+      '@babel/core': 7.21.3
+      '@svgr/babel-preset': 8.0.0(@babel/core@7.21.3)
+      '@svgr/core': 8.0.0
+      '@svgr/hast-util-to-babel-ast': 8.0.0
+      svg-parser: 2.0.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@swc/core-darwin-arm64@1.3.42:
     resolution: {integrity: sha512-hM6RrZFyoCM9mX3cj/zM5oXwhAqjUdOCLXJx7KTQps7NIkv/Qjvobgvyf2gAb89j3ARNo9NdIoLjTjJ6oALtiA==}
     engines: {node: '>=10'}
@@ -6044,6 +6231,18 @@ packages:
       tslib: 2.5.0
     dev: false
 
+  /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1):
+    resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
+    peerDependencies:
+      tailwindcss: '>=3.0.0 || insiders'
+    dependencies:
+      lodash.castarray: 4.4.0
+      lodash.isplainobject: 4.0.6
+      lodash.merge: 4.6.2
+      postcss-selector-parser: 6.0.10
+      tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.9.1)
+    dev: true
+
   /@testing-library/dom@8.20.0:
     resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==}
     engines: {node: '>=12'}
@@ -7063,16 +7262,16 @@ packages:
   /acorn-globals@7.0.1:
     resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
     dependencies:
-      acorn: 8.8.2
+      acorn: 8.10.0
       acorn-walk: 8.2.0
     dev: true
 
-  /acorn-import-assertions@1.8.0(acorn@8.8.2):
+  /acorn-import-assertions@1.8.0(acorn@8.10.0):
     resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==}
     peerDependencies:
       acorn: ^8
     dependencies:
-      acorn: 8.8.2
+      acorn: 8.10.0
     dev: true
 
   /acorn-jsx@5.3.2(acorn@7.4.1):
@@ -7097,6 +7296,12 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
+  /acorn@8.10.0:
+    resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
+
   /acorn@8.8.2:
     resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
     engines: {node: '>=0.4.0'}
@@ -7682,6 +7887,11 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+    dev: true
+
   /camelize@1.0.1:
     resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
     dev: false
@@ -7905,7 +8115,6 @@ packages:
 
   /colord@2.9.3:
     resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
-    dev: false
 
   /colorette@2.0.19:
     resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
@@ -8186,6 +8395,13 @@ packages:
       webpack: 5.77.0(esbuild@0.17.12)
     dev: true
 
+  /css-selector-tokenizer@0.8.0:
+    resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==}
+    dependencies:
+      cssesc: 3.0.0
+      fastparse: 1.1.2
+    dev: true
+
   /css-to-react-native@3.2.0:
     resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
     dependencies:
@@ -8601,6 +8817,19 @@ packages:
       lodash: 4.17.21
     dev: true
 
+  /daisyui@3.5.0(ts-node@10.9.1):
+    resolution: {integrity: sha512-wSaeXwaYdMv4yURv9wj7kKQQN9Jyumfh/skIpZfCNkCb2jLf/so+iNKSM8l4rDN0TRvB5OccMlAvsf2UAtk2gg==}
+    engines: {node: '>=16.9.0'}
+    dependencies:
+      colord: 2.9.3
+      css-selector-tokenizer: 0.8.0
+      postcss: 8.4.21
+      postcss-js: 4.0.1(postcss@8.4.21)
+      tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.9.1)
+    transitivePeerDependencies:
+      - ts-node
+    dev: true
+
   /damerau-levenshtein@1.0.8:
     resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
 
@@ -8896,6 +9125,13 @@ packages:
     dev: false
     optional: true
 
+  /dot-case@3.0.4:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.5.0
+    dev: true
+
   /dot-prop@5.3.0:
     resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
     engines: {node: '>=8'}
@@ -9241,13 +9477,13 @@ packages:
     dependencies:
       eslint: 7.32.0
 
-  /eslint-config-turbo@1.10.9(eslint@7.32.0):
-    resolution: {integrity: sha512-YA5QWxWte/NiRJL0/Cv7aATfIvS5sUAuyD6ZuyTZEzwyU7E6FUXGo44amjf9INkyj96HrJ2nYWoFkCRx3vs6Ag==}
+  /eslint-config-turbo@1.10.12(eslint@7.32.0):
+    resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==}
     peerDependencies:
       eslint: '>6.6.0'
     dependencies:
       eslint: 7.32.0
-      eslint-plugin-turbo: 1.10.9(eslint@7.32.0)
+      eslint-plugin-turbo: 1.10.12(eslint@7.32.0)
 
   /eslint-import-resolver-node@0.3.7:
     resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
@@ -9390,8 +9626,8 @@ packages:
       semver: 6.3.0
       string.prototype.matchall: 4.0.8
 
-  /eslint-plugin-turbo@1.10.9(eslint@7.32.0):
-    resolution: {integrity: sha512-o8Nga4WFMvzF0lo3d3UyjGli2JOUn/4SRtRdvcf4EA9/TPotU/NUHqO16Cp0SHZJG/tGYIy5LY1O/EO7Mxbd1A==}
+  /eslint-plugin-turbo@1.10.12(eslint@7.32.0):
+    resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==}
     peerDependencies:
       eslint: '>6.6.0'
     dependencies:
@@ -9649,6 +9885,10 @@ packages:
       strnum: 1.0.5
     dev: false
 
+  /fastparse@1.1.2:
+    resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==}
+    dev: true
+
   /fastq@1.15.0:
     resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
     dependencies:
@@ -11209,6 +11449,10 @@ packages:
     resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==}
     dev: true
 
+  /kolorist@1.8.0:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+    dev: true
+
   /ktx-parse@0.0.4:
     resolution: {integrity: sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A==}
     dev: false
@@ -11347,6 +11591,10 @@ packages:
     resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
     dev: true
 
+  /lodash.castarray@4.4.0:
+    resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+    dev: true
+
   /lodash.curry@4.1.1:
     resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==}
     dev: false
@@ -11436,6 +11684,12 @@ packages:
       get-func-name: 2.0.0
     dev: true
 
+  /lower-case@2.0.2:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+    dependencies:
+      tslib: 2.5.0
+    dev: true
+
   /lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
     dependencies:
@@ -11698,7 +11952,7 @@ packages:
   /mlly@1.2.0:
     resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==}
     dependencies:
-      acorn: 8.8.2
+      acorn: 8.10.0
       pathe: 1.1.0
       pkg-types: 1.0.2
       ufo: 1.1.1
@@ -11825,6 +12079,13 @@ packages:
       - babel-plugin-macros
     dev: false
 
+  /no-case@3.0.4:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.5.0
+    dev: true
+
   /node-dir@0.1.17:
     resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==}
     engines: {node: '>= 0.10.5'}
@@ -12469,6 +12730,14 @@ packages:
     dependencies:
       postcss: 8.4.21
 
+  /postcss-selector-parser@6.0.10:
+    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+    engines: {node: '>=4'}
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+    dev: true
+
   /postcss-selector-parser@6.0.11:
     resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
     engines: {node: '>=4'}
@@ -13637,6 +13906,13 @@ packages:
       is-fullwidth-code-point: 4.0.0
     dev: true
 
+  /snake-case@3.0.4:
+    resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.5.0
+    dev: true
+
   /source-map-js@1.0.2:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
@@ -13842,7 +14118,7 @@ packages:
   /strip-literal@1.0.1:
     resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==}
     dependencies:
-      acorn: 8.8.2
+      acorn: 8.10.0
     dev: true
 
   /strnum@1.0.5:
@@ -13946,6 +14222,10 @@ packages:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
 
+  /svg-parser@2.0.4:
+    resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+    dev: true
+
   /svg-pathdata@6.0.3:
     resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==}
     engines: {node: '>=12.0.0'}
@@ -14115,7 +14395,7 @@ packages:
     hasBin: true
     dependencies:
       '@jridgewell/source-map': 0.3.2
-      acorn: 8.8.2
+      acorn: 8.10.0
       commander: 2.20.3
       source-map-support: 0.5.21
     dev: true
@@ -14601,15 +14881,56 @@ packages:
     engines: {node: '>= 0.8'}
     dev: true
 
+  /unplugin-icons@0.16.5(@svgr/core@8.0.0):
+    resolution: {integrity: sha512-laCCqMWfng1XZgB9yowGfjBdDhtmz8t8zVnhzRNEMhBNdy26QrVewVmdXk/zsiAQYnEWvIxTjvW1nQXrxdd2+w==}
+    peerDependencies:
+      '@svgr/core': '>=7.0.0'
+      '@svgx/core': ^1.0.1
+      '@vue/compiler-sfc': ^3.0.2 || ^2.7.0
+      vue-template-compiler: ^2.6.12
+      vue-template-es2015-compiler: ^1.9.0
+    peerDependenciesMeta:
+      '@svgr/core':
+        optional: true
+      '@svgx/core':
+        optional: true
+      '@vue/compiler-sfc':
+        optional: true
+      vue-template-compiler:
+        optional: true
+      vue-template-es2015-compiler:
+        optional: true
+    dependencies:
+      '@antfu/install-pkg': 0.1.1
+      '@antfu/utils': 0.7.5
+      '@iconify/utils': 2.1.7
+      '@svgr/core': 8.0.0
+      debug: 4.3.4(supports-color@5.5.0)
+      kolorist: 1.8.0
+      local-pkg: 0.4.3
+      unplugin: 1.4.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /unplugin@0.10.2:
     resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==}
     dependencies:
-      acorn: 8.8.2
+      acorn: 8.10.0
       chokidar: 3.5.3
       webpack-sources: 3.2.3
       webpack-virtual-modules: 0.4.6
     dev: true
 
+  /unplugin@1.4.0:
+    resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==}
+    dependencies:
+      acorn: 8.10.0
+      chokidar: 3.5.3
+      webpack-sources: 3.2.3
+      webpack-virtual-modules: 0.5.0
+    dev: true
+
   /untildify@4.0.0:
     resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
     engines: {node: '>=8'}
@@ -15085,6 +15406,10 @@ packages:
     resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==}
     dev: true
 
+  /webpack-virtual-modules@0.5.0:
+    resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==}
+    dev: true
+
   /webpack@5.77.0(esbuild@0.17.12):
     resolution: {integrity: sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==}
     engines: {node: '>=10.13.0'}
@@ -15100,8 +15425,8 @@ packages:
       '@webassemblyjs/ast': 1.11.1
       '@webassemblyjs/wasm-edit': 1.11.1
       '@webassemblyjs/wasm-parser': 1.11.1
-      acorn: 8.8.2
-      acorn-import-assertions: 1.8.0(acorn@8.8.2)
+      acorn: 8.10.0
+      acorn-import-assertions: 1.8.0(acorn@8.10.0)
       browserslist: 4.21.5
       chrome-trace-event: 1.0.3
       enhanced-resolve: 5.12.0