From 7b3dca98434656b77505a6a598fdac76bf68e5a5 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Thu, 1 Sep 2022 16:19:03 -0500 Subject: [PATCH] PRDONE-94: updated dashboards, new styles everywhere, moved 90% of codes we are using under qqq directory --- .eslintrc.json | 1 + package.json | 1 + public/index.html | 2 +- public/manifest.json | 2 +- src/App.tsx | 66 ++- src/assets/theme-dark/base/colors.ts | 4 +- src/assets/theme/base/colors.ts | 4 +- .../DefaultLineChart/.index.tsx.swp | Bin 0 -> 16384 bytes src/examples/Sidenav/index.tsx | 12 +- src/index.tsx | 5 +- src/page.routes.tsx | 4 +- src/qqq/components/BaseLayout/index.tsx | 30 +- src/qqq/components/DashboardLayout/index.tsx | 58 +++ src/qqq/components/EntityForm/index.tsx | 6 +- src/qqq/components/Footer/index.tsx | 6 +- src/qqq/components/Navbar/index.tsx | 8 +- src/qqq/components/ProcessLinkCard/index.tsx | 4 +- src/qqq/components/QBreadcrumbs/index.tsx | 5 +- src/qqq/components/QButtons/index.tsx | 4 +- src/qqq/components/QDynamicForm/index.tsx | 4 +- .../components/QDynamicFormField/index.tsx | 6 +- src/qqq/components/QRecordSidebar/index.tsx | 8 +- .../components/Sidenav/SidenavCollapse.tsx | 121 ++++++ src/qqq/components/Sidenav/SidenavItem.tsx | 100 +++++ src/qqq/components/Sidenav/SidenavList.tsx | 39 ++ src/qqq/components/Sidenav/SidenavRoot.tsx | 101 +++++ src/qqq/components/Sidenav/index.tsx | 337 +++++++++++++++ src/qqq/components/Sidenav/styles/sidenav.ts | 46 +++ .../Sidenav/styles/sidenavCollapse.ts | 193 +++++++++ .../components/Sidenav/styles/sidenavItem.ts | 180 ++++++++ .../Temporary/BookingCard/index.tsx | 128 ++++++ .../Configurator/ConfiguratorRoot.tsx | 66 +++ .../Temporary/Configurator/index.tsx | 385 +++++++++++++++++ .../Temporary/DefaultInfoCard/index.tsx | 84 ++++ .../Temporary/MDAlert/MDAlertCloseIcon.tsx | 41 ++ .../Temporary/MDAlert/MDAlertRoot.tsx | 54 +++ .../components/Temporary/MDAlert/index.tsx | 81 ++++ .../Temporary/MDAvatar/MDAvatarRoot.tsx | 96 +++++ .../components/Temporary/MDAvatar/index.tsx | 54 +++ .../Temporary/MDBadge/MDBadgeRoot.tsx | 147 +++++++ .../components/Temporary/MDBadge/index.tsx | 63 +++ .../components/Temporary/MDBadgeDot/index.tsx | 120 ++++++ .../components/Temporary/MDBox/MDBoxRoot.tsx | 138 +++++++ src/qqq/components/Temporary/MDBox/index.tsx | 60 +++ .../Temporary/MDButton/MDButtonRoot.tsx | 309 ++++++++++++++ .../components/Temporary/MDButton/index.tsx | 75 ++++ .../Temporary/MDInput/MDInputRoot.tsx | 77 ++++ .../components/Temporary/MDInput/index.tsx | 44 ++ .../MDTypography/MDTypographyRoot.tsx | 74 ++++ .../Temporary/MDTypography/index.tsx | 100 +++++ .../Temporary/MiniStatisticsCard/index.tsx | 162 ++++++++ .../Temporary/NotificationItem/index.tsx | 50 +++ .../Temporary/NotificationItem/styles.ts | 60 +++ src/qqq/components/Temporary/Theme.ts | 159 +++++++ .../Temporary/Theme/base/borders.ts | 75 ++++ .../Temporary/Theme/base/boxShadows.ts | 148 +++++++ .../Temporary/Theme/base/breakpoints.ts | 33 ++ .../components/Temporary/Theme/base/colors.ts | 389 ++++++++++++++++++ .../Temporary/Theme/base/globals.ts | 41 ++ .../Temporary/Theme/base/typography.ts | 320 ++++++++++++++ .../Temporary/Theme/components/appBar.ts | 31 ++ .../Temporary/Theme/components/avatar.ts | 40 ++ .../Temporary/Theme/components/breadcrumbs.ts | 39 ++ .../Theme/components/button/contained.ts | 91 ++++ .../Theme/components/button/index.ts | 49 +++ .../Theme/components/button/outlined.ts | 82 ++++ .../Temporary/Theme/components/button/root.ts | 53 +++ .../Temporary/Theme/components/button/text.ts | 104 +++++ .../Temporary/Theme/components/buttonBase.ts | 25 ++ .../Theme/components/card/cardContent.ts | 32 ++ .../Theme/components/card/cardMedia.ts | 40 ++ .../Temporary/Theme/components/card/index.ts | 50 +++ .../Temporary/Theme/components/container.ts | 77 ++++ .../Theme/components/dialog/dialogActions.ts | 30 ++ .../Theme/components/dialog/dialogContent.ts | 46 +++ .../components/dialog/dialogContentText.ts | 35 ++ .../Theme/components/dialog/dialogTitle.ts | 36 ++ .../Theme/components/dialog/index.ts | 39 ++ .../Temporary/Theme/components/divider.ts | 71 ++++ .../Temporary/Theme/components/flatpickr.ts | 58 +++ .../Theme/components/form/autocomplete.ts | 103 +++++ .../Theme/components/form/checkbox.ts | 86 ++++ .../Theme/components/form/formControlLabel.ts | 53 +++ .../Theme/components/form/formLabel.ts | 32 ++ .../Temporary/Theme/components/form/input.ts | 49 +++ .../Theme/components/form/inputLabel.ts | 63 +++ .../Theme/components/form/inputOutlined.ts | 71 ++++ .../Temporary/Theme/components/form/radio.ts | 100 +++++ .../Temporary/Theme/components/form/select.ts | 52 +++ .../Theme/components/form/switchButton.ts | 90 ++++ .../Theme/components/form/textField.ts | 32 ++ .../Temporary/Theme/components/icon.ts | 43 ++ .../Temporary/Theme/components/iconButton.ts | 34 ++ .../Theme/components/linearProgress.ts | 56 +++ .../Temporary/Theme/components/link.ts | 26 ++ .../Temporary/Theme/components/list/index.ts | 28 ++ .../Theme/components/list/listItem.ts | 32 ++ .../Theme/components/list/listItemText.ts | 28 ++ .../Temporary/Theme/components/menu/index.ts | 52 +++ .../Theme/components/menu/menuItem.ts | 50 +++ .../Temporary/Theme/components/popover.ts | 42 ++ .../Temporary/Theme/components/sidenav.ts | 52 +++ .../Temporary/Theme/components/slider.ts | 84 ++++ .../Theme/components/stepper/index.ts | 47 +++ .../Theme/components/stepper/step.ts | 30 ++ .../Theme/components/stepper/stepConnector.ts | 55 +++ .../Theme/components/stepper/stepIcon.ts | 60 +++ .../Theme/components/stepper/stepLabel.ts | 52 +++ .../Temporary/Theme/components/svgIcon.ts | 42 ++ .../Theme/components/table/tableCell.ts | 38 ++ .../Theme/components/table/tableContainer.ts | 38 ++ .../Theme/components/table/tableHead.ts | 37 ++ .../Temporary/Theme/components/tabs/index.ts | 68 +++ .../Temporary/Theme/components/tabs/tab.ts | 68 +++ .../Temporary/Theme/components/tooltip.ts | 59 +++ .../Temporary/Theme/functions/boxShadow.ts | 40 ++ .../Theme/functions/gradientChartLine.ts | 35 ++ .../Temporary/Theme/functions/hexToRgb.ts | 28 ++ .../Theme/functions/linearGradient.ts | 24 ++ .../Temporary/Theme/functions/pxToRem.ts | 24 ++ .../Temporary/Theme/functions/rgba.ts | 28 ++ src/qqq/components/Temporary/Theme/index.ts | 159 +++++++ .../components/Temporary/Theme/theme-rtl.ts | 161 ++++++++ src/qqq/components/Temporary/colors.ts | 388 +++++++++++++++++ src/qqq/components/Temporary/typography.ts | 324 +++++++++++++++ src/qqq/images/carrier-logos/axlehire.png | Bin 0 -> 4045 bytes src/qqq/images/carrier-logos/cdl.png | Bin 0 -> 36897 bytes src/qqq/images/carrier-logos/dhl.png | Bin 0 -> 10249 bytes src/qqq/images/carrier-logos/fedex.jpeg | Bin 0 -> 174543 bytes src/qqq/images/carrier-logos/fedex.png | Bin 0 -> 61184 bytes src/qqq/images/carrier-logos/lso.png | Bin 0 -> 3761 bytes src/qqq/images/carrier-logos/ontrac.png | Bin 0 -> 16512 bytes src/qqq/images/carrier-logos/ups.png | Bin 0 -> 150048 bytes src/qqq/images/logo-blue.png | Bin 0 -> 61917 bytes src/qqq/pages/app-home/index.tsx | 22 +- .../pages/dashboards/CarrierPerformance.tsx | 210 ++++++++++ src/qqq/pages/dashboards/Overview.tsx | 210 ++++++++++ .../Tables/ShipmentsByWarehouseTable.tsx | 98 +++++ .../Tables/ShipmentsByWarehouseTableCell.tsx | 98 +++++ .../dashboards/Widgets/.LineChart.tsx.swp | Bin 0 -> 16384 bytes .../dashboards}/Widgets/BarChart.tsx | 12 +- .../Widgets/Configs/BarChartConfig.ts | 0 .../Configs/HorizontalBarChartConfigs.ts | 87 ++++ .../Widgets/Configs/LineChartConfigs.ts | 104 +++++ .../Widgets/Configs/PieChartConfigs.ts | 0 .../Widgets/Data/CarrierSpendData.tsx | 87 ++++ .../Data/CarrierVolumeLineChartData.ts | 75 ++++ .../Data/ShipmentsByCarrierPieChartData.ts | 36 ++ .../Data/ShipmentsByDayBarChartData.ts | 27 ++ .../Data/ShipmentsByMonthLineChartData.ts | 28 ++ .../Widgets/Data/ShipmentsByWarehouseData.ts | 49 +++ .../Data/SmallShipmentsByWarehouseData.ts | 46 +++ .../Widgets/Data/timeInTransitBarChartData.ts | 37 ++ .../dashboards/Widgets/HorizontalBarChart.tsx | 123 ++++++ .../pages/dashboards/Widgets/LineChart.tsx | 125 ++++++ .../dashboards}/Widgets/PieChart.tsx | 6 +- .../dashboards}/Widgets/QuickSightChart.tsx | 6 +- .../Widgets/ShipmentsByChannelPieChart.tsx | 92 +++++ .../Widgets/ShipmentsByWarehouse.tsx | 128 ++++++ .../Widgets/SimpleStatisticsCard.tsx | 112 +++++ .../dashboards/Widgets/SmallLineChart.tsx | 97 +++++ .../dashboards/Widgets/StatisticsCard.tsx | 99 +++++ .../dashboards/Widgets/WarehouseCard.tsx | 125 ++++++ src/qqq/pages/entity-create/index.tsx | 2 +- src/qqq/pages/entity-edit/index.tsx | 2 +- src/qqq/pages/entity-list/index.tsx | 10 +- .../components/ViewContents/index.tsx | 8 +- src/qqq/pages/entity-view/index.tsx | 2 +- src/qqq/pages/process-run/index.tsx | 10 +- src/qqq/utils/QClient.ts | 1 - 170 files changed, 11114 insertions(+), 141 deletions(-) create mode 100644 src/examples/Charts/LineCharts/DefaultLineChart/.index.tsx.swp create mode 100644 src/qqq/components/DashboardLayout/index.tsx create mode 100644 src/qqq/components/Sidenav/SidenavCollapse.tsx create mode 100644 src/qqq/components/Sidenav/SidenavItem.tsx create mode 100644 src/qqq/components/Sidenav/SidenavList.tsx create mode 100644 src/qqq/components/Sidenav/SidenavRoot.tsx create mode 100644 src/qqq/components/Sidenav/index.tsx create mode 100644 src/qqq/components/Sidenav/styles/sidenav.ts create mode 100644 src/qqq/components/Sidenav/styles/sidenavCollapse.ts create mode 100644 src/qqq/components/Sidenav/styles/sidenavItem.ts create mode 100644 src/qqq/components/Temporary/BookingCard/index.tsx create mode 100644 src/qqq/components/Temporary/Configurator/ConfiguratorRoot.tsx create mode 100644 src/qqq/components/Temporary/Configurator/index.tsx create mode 100644 src/qqq/components/Temporary/DefaultInfoCard/index.tsx create mode 100644 src/qqq/components/Temporary/MDAlert/MDAlertCloseIcon.tsx create mode 100644 src/qqq/components/Temporary/MDAlert/MDAlertRoot.tsx create mode 100644 src/qqq/components/Temporary/MDAlert/index.tsx create mode 100644 src/qqq/components/Temporary/MDAvatar/MDAvatarRoot.tsx create mode 100644 src/qqq/components/Temporary/MDAvatar/index.tsx create mode 100644 src/qqq/components/Temporary/MDBadge/MDBadgeRoot.tsx create mode 100644 src/qqq/components/Temporary/MDBadge/index.tsx create mode 100644 src/qqq/components/Temporary/MDBadgeDot/index.tsx create mode 100644 src/qqq/components/Temporary/MDBox/MDBoxRoot.tsx create mode 100644 src/qqq/components/Temporary/MDBox/index.tsx create mode 100644 src/qqq/components/Temporary/MDButton/MDButtonRoot.tsx create mode 100644 src/qqq/components/Temporary/MDButton/index.tsx create mode 100644 src/qqq/components/Temporary/MDInput/MDInputRoot.tsx create mode 100644 src/qqq/components/Temporary/MDInput/index.tsx create mode 100644 src/qqq/components/Temporary/MDTypography/MDTypographyRoot.tsx create mode 100644 src/qqq/components/Temporary/MDTypography/index.tsx create mode 100644 src/qqq/components/Temporary/MiniStatisticsCard/index.tsx create mode 100644 src/qqq/components/Temporary/NotificationItem/index.tsx create mode 100644 src/qqq/components/Temporary/NotificationItem/styles.ts create mode 100644 src/qqq/components/Temporary/Theme.ts create mode 100644 src/qqq/components/Temporary/Theme/base/borders.ts create mode 100644 src/qqq/components/Temporary/Theme/base/boxShadows.ts create mode 100644 src/qqq/components/Temporary/Theme/base/breakpoints.ts create mode 100644 src/qqq/components/Temporary/Theme/base/colors.ts create mode 100644 src/qqq/components/Temporary/Theme/base/globals.ts create mode 100644 src/qqq/components/Temporary/Theme/base/typography.ts create mode 100644 src/qqq/components/Temporary/Theme/components/appBar.ts create mode 100644 src/qqq/components/Temporary/Theme/components/avatar.ts create mode 100644 src/qqq/components/Temporary/Theme/components/breadcrumbs.ts create mode 100644 src/qqq/components/Temporary/Theme/components/button/contained.ts create mode 100644 src/qqq/components/Temporary/Theme/components/button/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/button/outlined.ts create mode 100644 src/qqq/components/Temporary/Theme/components/button/root.ts create mode 100644 src/qqq/components/Temporary/Theme/components/button/text.ts create mode 100644 src/qqq/components/Temporary/Theme/components/buttonBase.ts create mode 100644 src/qqq/components/Temporary/Theme/components/card/cardContent.ts create mode 100644 src/qqq/components/Temporary/Theme/components/card/cardMedia.ts create mode 100644 src/qqq/components/Temporary/Theme/components/card/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/container.ts create mode 100644 src/qqq/components/Temporary/Theme/components/dialog/dialogActions.ts create mode 100644 src/qqq/components/Temporary/Theme/components/dialog/dialogContent.ts create mode 100644 src/qqq/components/Temporary/Theme/components/dialog/dialogContentText.ts create mode 100644 src/qqq/components/Temporary/Theme/components/dialog/dialogTitle.ts create mode 100644 src/qqq/components/Temporary/Theme/components/dialog/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/divider.ts create mode 100644 src/qqq/components/Temporary/Theme/components/flatpickr.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/autocomplete.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/checkbox.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/formControlLabel.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/formLabel.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/input.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/inputLabel.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/inputOutlined.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/radio.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/select.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/switchButton.ts create mode 100644 src/qqq/components/Temporary/Theme/components/form/textField.ts create mode 100644 src/qqq/components/Temporary/Theme/components/icon.ts create mode 100644 src/qqq/components/Temporary/Theme/components/iconButton.ts create mode 100644 src/qqq/components/Temporary/Theme/components/linearProgress.ts create mode 100644 src/qqq/components/Temporary/Theme/components/link.ts create mode 100644 src/qqq/components/Temporary/Theme/components/list/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/list/listItem.ts create mode 100644 src/qqq/components/Temporary/Theme/components/list/listItemText.ts create mode 100644 src/qqq/components/Temporary/Theme/components/menu/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/menu/menuItem.ts create mode 100644 src/qqq/components/Temporary/Theme/components/popover.ts create mode 100644 src/qqq/components/Temporary/Theme/components/sidenav.ts create mode 100644 src/qqq/components/Temporary/Theme/components/slider.ts create mode 100644 src/qqq/components/Temporary/Theme/components/stepper/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/stepper/step.ts create mode 100644 src/qqq/components/Temporary/Theme/components/stepper/stepConnector.ts create mode 100644 src/qqq/components/Temporary/Theme/components/stepper/stepIcon.ts create mode 100644 src/qqq/components/Temporary/Theme/components/stepper/stepLabel.ts create mode 100644 src/qqq/components/Temporary/Theme/components/svgIcon.ts create mode 100644 src/qqq/components/Temporary/Theme/components/table/tableCell.ts create mode 100644 src/qqq/components/Temporary/Theme/components/table/tableContainer.ts create mode 100644 src/qqq/components/Temporary/Theme/components/table/tableHead.ts create mode 100644 src/qqq/components/Temporary/Theme/components/tabs/index.ts create mode 100644 src/qqq/components/Temporary/Theme/components/tabs/tab.ts create mode 100644 src/qqq/components/Temporary/Theme/components/tooltip.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/boxShadow.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/gradientChartLine.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/hexToRgb.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/linearGradient.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/pxToRem.ts create mode 100644 src/qqq/components/Temporary/Theme/functions/rgba.ts create mode 100644 src/qqq/components/Temporary/Theme/index.ts create mode 100644 src/qqq/components/Temporary/Theme/theme-rtl.ts create mode 100644 src/qqq/components/Temporary/colors.ts create mode 100644 src/qqq/components/Temporary/typography.ts create mode 100644 src/qqq/images/carrier-logos/axlehire.png create mode 100644 src/qqq/images/carrier-logos/cdl.png create mode 100644 src/qqq/images/carrier-logos/dhl.png create mode 100644 src/qqq/images/carrier-logos/fedex.jpeg create mode 100644 src/qqq/images/carrier-logos/fedex.png create mode 100644 src/qqq/images/carrier-logos/lso.png create mode 100644 src/qqq/images/carrier-logos/ontrac.png create mode 100644 src/qqq/images/carrier-logos/ups.png create mode 100644 src/qqq/images/logo-blue.png create mode 100644 src/qqq/pages/dashboards/CarrierPerformance.tsx create mode 100644 src/qqq/pages/dashboards/Overview.tsx create mode 100644 src/qqq/pages/dashboards/Tables/ShipmentsByWarehouseTable.tsx create mode 100644 src/qqq/pages/dashboards/Tables/ShipmentsByWarehouseTableCell.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/.LineChart.tsx.swp rename src/qqq/{components => pages/dashboards}/Widgets/BarChart.tsx (90%) rename src/qqq/{components => pages/dashboards}/Widgets/Configs/BarChartConfig.ts (100%) create mode 100644 src/qqq/pages/dashboards/Widgets/Configs/HorizontalBarChartConfigs.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Configs/LineChartConfigs.ts rename src/qqq/{components => pages/dashboards}/Widgets/Configs/PieChartConfigs.ts (100%) create mode 100644 src/qqq/pages/dashboards/Widgets/Data/CarrierSpendData.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/Data/CarrierVolumeLineChartData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/ShipmentsByCarrierPieChartData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/ShipmentsByDayBarChartData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/ShipmentsByMonthLineChartData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/ShipmentsByWarehouseData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/SmallShipmentsByWarehouseData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/Data/timeInTransitBarChartData.ts create mode 100644 src/qqq/pages/dashboards/Widgets/HorizontalBarChart.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/LineChart.tsx rename src/qqq/{components => pages/dashboards}/Widgets/PieChart.tsx (94%) rename src/qqq/{components => pages/dashboards}/Widgets/QuickSightChart.tsx (89%) create mode 100644 src/qqq/pages/dashboards/Widgets/ShipmentsByChannelPieChart.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/ShipmentsByWarehouse.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/SimpleStatisticsCard.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/SmallLineChart.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/StatisticsCard.tsx create mode 100644 src/qqq/pages/dashboards/Widgets/WarehouseCard.tsx diff --git a/.eslintrc.json b/.eslintrc.json index 0adcb43..cf3435d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -87,6 +87,7 @@ "no-plusplus": "off", "no-underscore-dangle": "off", "no-else-return": "off", + "react/display-name": "off", "spaced-comment": "off", "object-curly-spacing": [ "error", diff --git a/package.json b/package.json index d278cb2..d6fa350 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@mui/x-license-pro": "5.12.3", "@react-jvectormap/core": "1.0.1", "@react-jvectormap/world": "1.0.0", + "@react-jvectormap/unitedstates": "1.0.1", "@testing-library/jest-dom": "5.16.2", "@testing-library/react": "12.1.2", "@testing-library/user-event": "13.5.0", diff --git a/public/index.html b/public/index.html index c998e21..b353a6b 100644 --- a/public/index.html +++ b/public/index.html @@ -18,7 +18,7 @@ Coded by www.creative-tim.com - + Nutrifresh One diff --git a/public/manifest.json b/public/manifest.json index 9d6b42e..b73bd4e 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -10,6 +10,6 @@ ], "start_url": ".", "display": "standalone", - "theme_color": "#1A73E8", + "theme_color": "#04aaef", "background_color": "#ffffff" } diff --git a/src/App.tsx b/src/App.tsx index b4a564f..3b37357 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -31,26 +31,23 @@ import React, {JSXElementConstructor, Key, ReactElement, useEffect, useState,} f import {useCookies} from "react-cookie"; import {Navigate, Route, Routes, useLocation,} from "react-router-dom"; import {Md5} from "ts-md5/dist/md5"; -import theme from "assets/theme"; -import themeDark from "assets/theme-dark"; -import MDBox from "components/MDBox"; import {setMiniSidenav, setOpenConfigurator, useMaterialUIController} from "context"; -import Configurator from "examples/Configurator"; -import Sidenav from "examples/Sidenav"; +import Sidenav from "qqq/components/Sidenav"; +import Configurator from "qqq/components/Temporary/Configurator"; +import MDAvatar from "qqq/components/Temporary/MDAvatar"; +import MDBox from "qqq/components/Temporary/MDBox"; +import theme from "qqq/components/Temporary/Theme" +import Logo from "qqq/images/logo-blue.png"; import AppHome from "qqq/pages/app-home"; +import CarrierPerformance from "qqq/pages/dashboards/CarrierPerformance"; +import Overview from "qqq/pages/dashboards/Overview"; +import EntityCreate from "qqq/pages/entity-create"; +import EntityEdit from "qqq/pages/entity-edit"; +import EntityList from "qqq/pages/entity-list"; +import EntityView from "qqq/pages/entity-view"; +import ProcessRun from "qqq/pages/process-run"; +import QClient from "qqq/utils/QClient"; import QProcessUtils from "qqq/utils/QProcessUtils"; -import MDAvatar from "./components/MDAvatar"; -import Analytics from "./layouts/dashboards/analytics"; -import Sales from "./layouts/dashboards/sales"; -import Settings from "./layouts/pages/account/settings"; -import ProfileOverview from "./layouts/pages/profile/profile-overview"; -import Logo from "./qqq/images/logo.png"; -import EntityCreate from "./qqq/pages/entity-create"; -import EntityEdit from "./qqq/pages/entity-edit"; -import EntityList from "./qqq/pages/entity-list"; -import EntityView from "./qqq/pages/entity-view"; -import ProcessRun from "./qqq/pages/process-run"; -import QClient from "./qqq/utils/QClient"; /////////////////////////////////////////////////////////////////////////////////////////////// // define the parts of the nav that are static - before the qqq tables etc get dynamic added // @@ -66,16 +63,16 @@ function getStaticRoutes() icon: dashboard, collapse: [ { - name: "Analytics", - key: "analytics", - route: "/dashboards/analytics", - component: , + name: "Overview", + key: "overview", + route: "/dashboards/overview", + component: , }, { - name: "Sales", - key: "sales", - route: "/dashboards/sales", - component: , + name: "Carrier Performance", + key: "carrierPerformance", + route: "/dashboards/carrierPerformance", + component: , }, ], }, @@ -129,7 +126,6 @@ export default function App() layout, openConfigurator, sidenavColor, - darkMode, } = controller; const [onMouseEnter, setOnMouseEnter] = useState(false); const {pathname} = useLocation(); @@ -296,20 +292,6 @@ export default function App() name: user.name, key: user.name, icon: , - collapse: [ - { - name: "My Profile", - key: "my-profile", - route: "/pages/profile/profile-overview", - component: , - }, - { - name: "Settings", - key: "profile-settings", - route: "/pages/account/settings", - component: , - }, - ], }; setProfileRoutes(profileRoutes); @@ -430,7 +412,7 @@ export default function App() return ( appRoutes && ( - + {layout === "dashboard" && ( <> @@ -446,7 +428,7 @@ export default function App() )} - } /> + } /> {appRoutes && getRoutes(appRoutes)} {getRoutes(getStaticRoutes())} {profileRoutes && getRoutes([profileRoutes])} diff --git a/src/assets/theme-dark/base/colors.ts b/src/assets/theme-dark/base/colors.ts index 36105c2..09d8272 100644 --- a/src/assets/theme-dark/base/colors.ts +++ b/src/assets/theme-dark/base/colors.ts @@ -183,7 +183,7 @@ const colors: Types = { }, info: { - main: "#1A73E8", + main: "#04aaef", focus: "#1662C4", }, @@ -237,7 +237,7 @@ const colors: Types = { info: { main: "#49a3f1", - state: "#1A73E8", + state: "#04aaef", }, success: { diff --git a/src/assets/theme/base/colors.ts b/src/assets/theme/base/colors.ts index 5334376..ee6fae7 100644 --- a/src/assets/theme/base/colors.ts +++ b/src/assets/theme/base/colors.ts @@ -181,7 +181,7 @@ const colors: Types = { }, info: { - main: "#1A73E8", + main: "#04aaef", focus: "#1662C4", }, @@ -235,7 +235,7 @@ const colors: Types = { info: { main: "#49a3f1", - state: "#1A73E8", + state: "#04aaef", }, success: { diff --git a/src/examples/Charts/LineCharts/DefaultLineChart/.index.tsx.swp b/src/examples/Charts/LineCharts/DefaultLineChart/.index.tsx.swp new file mode 100644 index 0000000000000000000000000000000000000000..36f6c22ff1ad11b23c5aa708d8cd0529df914ec6 GIT binary patch literal 16384 zcmeI3OKc=Z8OMtaWJAa%2qJOdz?TL^_G)I@o+Jy*?s&mAh=mwdYX>4MOZ0Tt%(UIF zt*)_Wm>nVxhzndI@emh+B9cgO;6%a&BuEevIdFl?N=V@)IP40@g~KBFS5^1)%&Z9^ z5D96krJtv}o?rdztLpCRa%bg}7q;kqjV8nKR>uCg|9t21=kGo7>{l6+VVuhT$nSe` zhl|Jy6P4)ZW5=Y+>sy|`o~8%&iz01AsqaPeX+L*!fo?C9?m?LJa)FHQ<;$1rU6Ce| zCqX^-Bp0C<)dMf@cT!ITZZ3S654|{xc$ETMq34}0#*U5fK|XMU=^?mSOsoX1!Q)D zJ%+}gC_~O$3SOu&CRspMkRlq7>6|f3e1*`&A0jq#jz$);6 zsDKwR_7>RnvU=gi_y6+!{{~+4e+<3?cEP8?ZQ!SOGxh>_8axFKz&`lXDaQT)eh+>C zo&(F!;@z5f6R>eh8icPl0cPkAVBY-|k@Sci<<54iCr*;W9CJ2FQs|5v~^x9+fcS30X@K^VZ907 z8D(itcv*i`nL))d4tVa1P`9b7)I_2wRaWxTI7<_r$hH%NhYlTj*t(*wIs+-w#6f~6 z6>UfIp>*aeDl~~Z?QwHP3RTNkhBD%G|NS&y+qCrl8E4HTny7YH2CdDSTh<`kdcG6UUEV5IBz>X`htta6#Ii*hTYMI-eQE_IX+bo z=2_&8+Dj@Xeu~5pRQaXCrrAjv)HC-cft>Y z5QZ<7+39U)_bIh~#nQ~6YC8`K9xoPj6b7KGP`EktnNMXZEGo-J%10>Eu0mNfmA16dRA+_|JT8|cu#Joh zy*Z59Fdxk`5o0}P)ymn5CWuB%H|*t0dNOQ8UWZ4y>ayLv8tJf2OmI1u`SMv+5TR+i zduR0-(PVkKID<2L!*x&W^h5t3;d$PoGqdw(%gh9MBk;sQBgUq>+1T?%?5>(kQ5lA6 z+1Dz)v!`=Rt1`Z*eWNUQKIh&vsj^oW_P?n)OT$F2d;URBq=O`QRVH-9C~A=u170<` zvsi>9g_q=+hrW}}OgcU4KBe5ZMGsct+72@qTl7E`jva(KZbX>cs<1`_qH9@A7{pdL zzA`X}w%O8Bk;L4H#?a5W%$y4-cbUt|x`V`5cRpI&gSa#%H6hkWPvx~)4=?Yyg@4hc zMc6r+<;yMl==P(H4@EqN2sFl15X{&;;G-7hQed~_UW>eBq?~VJJaAIEqOxDzCe@zJ zDpYrUi=0e^u_s0jVJ^x!41-&lD?Kym;DPVMZ*`I*Pb8>MpK~Enq0cbQ_N6}4PFW5D zJ!VQ1O<*A=2EkZ+q8V0Y8e^VT(j+ib*ZDFY)|hsv!e*w1*#wuk=gW_$0at0X#?x38 zQs^_i0x3+*OMG&JjY#C z+~i1%g_!AtEJiV5pKMHym#Znsm3{b%+rgCKnnCWIRi$qgTWD#s+(JuDx_IdmMg-c~ zrgdbYZ8^e*+L;RUOjy+LpX|3qQ`H=5DqkE4Y9JwYAUyquIIV8>v8AYU+FkkFLk-F; zG%)ucBf(r^JfgnZrdRoC!h{dRgU~IvAnQk%s`d@+MLsr}iZIoy?6?z{9n5HX zag(Y<9+Q4{o)qN><;HbA6!!Ca(-g80cziL%GjgqRY~0R_GCDtsVy9hpns)k}yiR(^ zQBF1zY7A47$`B6eB>~BPm{Z0@9Oi1~ETi(i7e&p-(y3=uo73yf zIwI?)&m=nfwYIhmi~jw6|f3e1zslw z_)xEp1?IoNZ(2aZI*48kG>eQ_@mqa=W3~B^`bwhKgJ;$k5vPOna$sBwd%Asp842;Z*DpaOa3#V`m+T-UJ#DyH@$xXbj>qG literal 0 HcmV?d00001 diff --git a/src/examples/Sidenav/index.tsx b/src/examples/Sidenav/index.tsx index 99b9a57..1e63e8b 100644 --- a/src/examples/Sidenav/index.tsx +++ b/src/examples/Sidenav/index.tsx @@ -287,7 +287,7 @@ function Sidenav({ color, brand, brandName, routes, ...rest }: Props): JSX.Eleme variant="permanent" ownerState={{ transparentSidenav, whiteSidenav, miniSidenav, darkMode }} > - + - {brand && } - sidenavLogoLabel(theme, { miniSidenav })} - > - - {brandName} - - + diff --git a/src/page.routes.tsx b/src/page.routes.tsx index 01cefc6..f208cc9 100644 --- a/src/page.routes.tsx +++ b/src/page.routes.tsx @@ -49,8 +49,8 @@ const pageRoutes = [ icon: dashboard, collapse: [ { - name: "analytics", - route: "/dashboards/analytics", + name: "overview", + route: "/dashboards/overview", }, { name: "sales", diff --git a/src/qqq/components/BaseLayout/index.tsx b/src/qqq/components/BaseLayout/index.tsx index 1535a15..25fdd81 100644 --- a/src/qqq/components/BaseLayout/index.tsx +++ b/src/qqq/components/BaseLayout/index.tsx @@ -19,19 +19,29 @@ * along with this program. If not, see . */ -import {useState, useEffect, ReactNode} from "react"; -import breakpoints from "assets/theme/base/breakpoints"; -import DashboardLayout from "examples/LayoutContainers/DashboardLayout"; +import {useState, ReactNode, useEffect} from "react"; +import DashboardLayout from "qqq/components/DashboardLayout"; import Footer from "qqq/components/Footer"; import Navbar from "qqq/components/Navbar"; -import MDBox from "../../../components/MDBox"; +import MDBox from "qqq/components/Temporary/MDBox"; -// Declaring props types for BaseLayout -interface Props { - stickyNavbar?: boolean; - children: ReactNode; +interface Props +{ + stickyNavbar?: boolean; + children: ReactNode; } +export const breakpoints = { + values: { + xs: 0, + sm: 576, + md: 768, + lg: 992, + xl: 1200, + xxl: 1400, + } +}; + function BaseLayout({stickyNavbar, children}: Props): JSX.Element { const [tabsOrientation, setTabsOrientation] = useState<"horizontal" | "vertical">("horizontal"); @@ -47,8 +57,8 @@ function BaseLayout({stickyNavbar, children}: Props): JSX.Element } /** - The event listener that's calling the handleTabsOrientation function when resizing the window. - */ + The event listener that's calling the handleTabsOrientation function when resizing the window. + */ window.addEventListener("resize", handleTabsOrientation); // Call the handleTabsOrientation function to set the state with the initial value. diff --git a/src/qqq/components/DashboardLayout/index.tsx b/src/qqq/components/DashboardLayout/index.tsx new file mode 100644 index 0000000..210cd44 --- /dev/null +++ b/src/qqq/components/DashboardLayout/index.tsx @@ -0,0 +1,58 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {useEffect, ReactNode} from "react"; +import {useLocation} from "react-router-dom"; +import {useMaterialUIController, setLayout} from "context"; +import MDBox from "qqq/components/Temporary/MDBox"; + +function DashboardLayout({children}: { children: ReactNode }): JSX.Element +{ + const [controller, dispatch] = useMaterialUIController(); + const {miniSidenav} = controller; + const {pathname} = useLocation(); + + useEffect(() => + { + setLayout(dispatch, "dashboard"); + }, [pathname]); + + return ( + ({ + p: 3, + position: "relative", + + [breakpoints.up("xl")]: { + marginLeft: miniSidenav ? pxToRem(120) : pxToRem(274), + transition: transitions.create(["margin-left", "margin-right"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + }, + })} + > + {children} + + ); +} + +export default DashboardLayout; diff --git a/src/qqq/components/EntityForm/index.tsx b/src/qqq/components/EntityForm/index.tsx index 5c950c4..0e8a24b 100644 --- a/src/qqq/components/EntityForm/index.tsx +++ b/src/qqq/components/EntityForm/index.tsx @@ -32,13 +32,13 @@ import {Form, Formik} from "formik"; import React, {useReducer, useState} from "react"; import {useParams, useNavigate, useLocation} from "react-router-dom"; import * as Yup from "yup"; -import colors from "assets/theme/base/colors"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; import {QCancelButton, QSaveButton} from "qqq/components/QButtons"; import QDynamicForm from "qqq/components/QDynamicForm"; import DynamicFormUtils from "qqq/components/QDynamicForm/utils/DynamicFormUtils"; import QRecordSidebar from "qqq/components/QRecordSidebar"; +import colors from "qqq/components/Temporary/colors"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; import QClient from "qqq/utils/QClient"; import QTableUtils from "qqq/utils/QTableUtils"; diff --git a/src/qqq/components/Footer/index.tsx b/src/qqq/components/Footer/index.tsx index 6ebe4c7..1a09955 100644 --- a/src/qqq/components/Footer/index.tsx +++ b/src/qqq/components/Footer/index.tsx @@ -20,9 +20,9 @@ */ import Link from "@mui/material/Link"; -import typography from "assets/theme/base/typography"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; +import typography from "qqq/components/Temporary/typography"; // Declaring props types for Footer diff --git a/src/qqq/components/Navbar/index.tsx b/src/qqq/components/Navbar/index.tsx index 9674fca..6142174 100644 --- a/src/qqq/components/Navbar/index.tsx +++ b/src/qqq/components/Navbar/index.tsx @@ -26,13 +26,13 @@ import Menu from "@mui/material/Menu"; import Toolbar from "@mui/material/Toolbar"; import {useState, useEffect} from "react"; import {useLocation} from "react-router-dom"; -import MDBadge from "components/MDBadge"; -import MDBox from "components/MDBox"; -import MDInput from "components/MDInput"; import {useMaterialUIController, setTransparentNavbar, setMiniSidenav, setOpenConfigurator,} from "context"; -import NotificationItem from "examples/Items/NotificationItem"; import {navbar, navbarContainer, navbarRow, navbarIconButton, navbarDesktopMenu, navbarMobileMenu,} from "qqq/components/Navbar/styles"; import QBreadcrumbs, {routeToLabel} from "qqq/components/QBreadcrumbs"; +import MDBadge from "qqq/components/Temporary/MDBadge"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDInput from "qqq/components/Temporary/MDInput"; +import NotificationItem from "qqq/components/Temporary/NotificationItem"; // Declaring prop types for Navbar interface Props diff --git a/src/qqq/components/ProcessLinkCard/index.tsx b/src/qqq/components/ProcessLinkCard/index.tsx index c57936f..390269d 100644 --- a/src/qqq/components/ProcessLinkCard/index.tsx +++ b/src/qqq/components/ProcessLinkCard/index.tsx @@ -23,8 +23,8 @@ import Card from "@mui/material/Card"; import Divider from "@mui/material/Divider"; import Icon from "@mui/material/Icon"; import {ReactNode} from "react"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; interface Props { color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; diff --git a/src/qqq/components/QBreadcrumbs/index.tsx b/src/qqq/components/QBreadcrumbs/index.tsx index 94587e7..ad67706 100644 --- a/src/qqq/components/QBreadcrumbs/index.tsx +++ b/src/qqq/components/QBreadcrumbs/index.tsx @@ -23,8 +23,8 @@ import {Breadcrumbs as MuiBreadcrumbs} from "@mui/material"; import Icon from "@mui/material/Icon"; import {ReactNode} from "react"; import {Link} from "react-router-dom"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; interface Props { icon: ReactNode; @@ -124,7 +124,6 @@ function QBreadcrumbs({ color={light ? "white" : "dark"} noWrap > - {routeToLabel(title)} ); diff --git a/src/qqq/components/QButtons/index.tsx b/src/qqq/components/QButtons/index.tsx index 030c827..c66a552 100644 --- a/src/qqq/components/QButtons/index.tsx +++ b/src/qqq/components/QButtons/index.tsx @@ -22,8 +22,8 @@ import Icon from "@mui/material/Icon"; import React from "react"; import {Link} from "react-router-dom"; -import MDBox from "components/MDBox"; -import MDButton from "components/MDButton"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDButton from "qqq/components/Temporary/MDButton"; // eslint-disable import/prefer-default-export diff --git a/src/qqq/components/QDynamicForm/index.tsx b/src/qqq/components/QDynamicForm/index.tsx index 3516d30..34aa5d6 100644 --- a/src/qqq/components/QDynamicForm/index.tsx +++ b/src/qqq/components/QDynamicForm/index.tsx @@ -22,9 +22,9 @@ import Grid from "@mui/material/Grid"; import {useFormikContext} from "formik"; import React from "react"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; import QDynamicFormField from "qqq/components/QDynamicFormField"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; interface Props { diff --git a/src/qqq/components/QDynamicFormField/index.tsx b/src/qqq/components/QDynamicFormField/index.tsx index 9540671..1240fc9 100644 --- a/src/qqq/components/QDynamicFormField/index.tsx +++ b/src/qqq/components/QDynamicFormField/index.tsx @@ -24,9 +24,9 @@ import Grid from "@mui/material/Grid"; import Switch from "@mui/material/Switch"; import {ErrorMessage, Field} from "formik"; import React, {useState} from "react"; -import MDBox from "components/MDBox"; -import MDInput from "components/MDInput"; -import MDTypography from "components/MDTypography"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDInput from "qqq/components/Temporary/MDInput"; +import MDTypography from "qqq/components/Temporary/MDTypography"; // Declaring props types for FormField interface Props diff --git a/src/qqq/components/QRecordSidebar/index.tsx b/src/qqq/components/QRecordSidebar/index.tsx index d146825..e599d18 100644 --- a/src/qqq/components/QRecordSidebar/index.tsx +++ b/src/qqq/components/QRecordSidebar/index.tsx @@ -20,14 +20,12 @@ */ import {QSection} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QSection"; -import {Breadcrumbs as MuiBreadcrumbs} from "@mui/material"; import Card from "@mui/material/Card"; import Icon from "@mui/material/Icon"; import {Theme} from "@mui/material/styles"; -import React, {ReactNode} from "react"; -import {Link} from "react-router-dom"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; +import React from "react"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; interface Props { tableSections: QSection[]; diff --git a/src/qqq/components/Sidenav/SidenavCollapse.tsx b/src/qqq/components/Sidenav/SidenavCollapse.tsx new file mode 100644 index 0000000..8cde802 --- /dev/null +++ b/src/qqq/components/Sidenav/SidenavCollapse.tsx @@ -0,0 +1,121 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Collapse from "@mui/material/Collapse"; +import Icon from "@mui/material/Icon"; +import ListItem from "@mui/material/ListItem"; +import ListItemIcon from "@mui/material/ListItemIcon"; +import ListItemText from "@mui/material/ListItemText"; +import {ReactNode} from "react"; +import {useMaterialUIController} from "context"; +import {collapseItem, collapseIconBox, collapseIcon, collapseText, collapseArrow,} from "qqq/components/Sidenav/styles/sidenavCollapse"; +import MDBox from "qqq/components/Temporary/MDBox"; + +// Declaring props types for SidenavCollapse +interface Props { + icon: ReactNode; + name: string; + children?: ReactNode; + active?: Boolean; + noCollapse?: Boolean; + open?: Boolean; + [key: string]: any; +} + +function SidenavCollapse({ + icon, + name, + children, + active, + noCollapse, + open, + ...rest +}: Props): JSX.Element +{ + const [controller] = useMaterialUIController(); + const {miniSidenav, transparentSidenav, whiteSidenav, darkMode} = controller; + + return ( + <> + + + collapseItem(theme, {active, transparentSidenav, whiteSidenav, darkMode}) + } + > + collapseIconBox(theme, {transparentSidenav, whiteSidenav, darkMode})} + > + {typeof icon === "string" ? ( + collapseIcon(theme, {active})}>{icon} + ) : ( + icon + )} + + + + collapseText(theme, { + miniSidenav, + transparentSidenav, + whiteSidenav, + active, + }) + } + /> + + + collapseArrow(theme, { + noCollapse, + transparentSidenav, + whiteSidenav, + miniSidenav, + open, + active, + darkMode, + }) + } + > + expand_less + + + + {children && ( + + {children} + + )} + + ); +} + +// Declaring default props for SidenavCollapse +SidenavCollapse.defaultProps = { + active: false, + noCollapse: false, + children: false, + open: false, +}; + +export default SidenavCollapse; diff --git a/src/qqq/components/Sidenav/SidenavItem.tsx b/src/qqq/components/Sidenav/SidenavItem.tsx new file mode 100644 index 0000000..099cfe8 --- /dev/null +++ b/src/qqq/components/Sidenav/SidenavItem.tsx @@ -0,0 +1,100 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Collapse from "@mui/material/Collapse"; +import Icon from "@mui/material/Icon"; +import ListItem from "@mui/material/ListItem"; +import ListItemText from "@mui/material/ListItemText"; +import {Theme} from "@mui/material/styles"; +import {ReactNode} from "react"; +import {useMaterialUIController} from "context"; +import {item, itemContent, itemArrow} from "qqq/components/Sidenav/styles/sidenavItem" +import MDBox from "qqq/components/Temporary/MDBox"; + +// Declaring props types for SidenavCollapse +interface Props { + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark"; + name: string; + active?: boolean | string; + nested?: boolean; + children?: ReactNode; + open?: boolean; + [key: string]: any; +} + +function SidenavItem({color, name, active, nested, children, open, ...rest}: Props): JSX.Element +{ + const [controller] = useMaterialUIController(); + const {miniSidenav, transparentSidenav, whiteSidenav, darkMode} = controller; + + return ( + <> + item(theme, {active, color, transparentSidenav, whiteSidenav, darkMode})} + > + + itemContent(theme, { + active, + miniSidenav, + name, + open, + nested, + transparentSidenav, + whiteSidenav, + darkMode, + }) + } + > + + {children && ( + + itemArrow(theme, {open, miniSidenav, transparentSidenav, whiteSidenav, darkMode}) + } + > + expand_less + + )} + + + {children && ( + + {children} + + )} + + ); +} + +// Declaring default props for SidenavItem +SidenavItem.defaultProps = { + color: "info", + active: false, + nested: false, + children: false, + open: false, +}; + +export default SidenavItem; diff --git a/src/qqq/components/Sidenav/SidenavList.tsx b/src/qqq/components/Sidenav/SidenavList.tsx new file mode 100644 index 0000000..3ab8e57 --- /dev/null +++ b/src/qqq/components/Sidenav/SidenavList.tsx @@ -0,0 +1,39 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import List from "@mui/material/List"; +import {ReactNode} from "react"; + +function SidenavList({children}: { children: ReactNode }): JSX.Element +{ + return ( + + {children} + + ); +} + +export default SidenavList; diff --git a/src/qqq/components/Sidenav/SidenavRoot.tsx b/src/qqq/components/Sidenav/SidenavRoot.tsx new file mode 100644 index 0000000..7f67dac --- /dev/null +++ b/src/qqq/components/Sidenav/SidenavRoot.tsx @@ -0,0 +1,101 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Drawer from "@mui/material/Drawer"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Drawer)(({theme, ownerState}: { theme?: Theme | any; ownerState: any }) => +{ + const {palette, boxShadows, transitions, breakpoints, functions} = theme; + const {transparentSidenav, whiteSidenav, miniSidenav, darkMode} = ownerState; + + const sidebarWidth = 250; + const {transparent, gradients, white, background} = palette; + const {xxl} = boxShadows; + const {pxToRem, linearGradient} = functions; + + let backgroundValue = darkMode + ? background.sidenav + : linearGradient(gradients.dark.main, gradients.dark.state); + + if (transparentSidenav) + { + backgroundValue = transparent.main; + } + else if (whiteSidenav) + { + backgroundValue = white.main; + } + + // styles for the sidenav when miniSidenav={false} + const drawerOpenStyles = () => ({ + background: backgroundValue, + transform: "translateX(0)", + transition: transitions.create("transform", { + easing: transitions.easing.sharp, + duration: transitions.duration.shorter, + }), + + [breakpoints.up("xl")]: { + boxShadow: transparentSidenav ? "none" : xxl, + marginBottom: transparentSidenav ? 0 : "inherit", + left: "0", + width: sidebarWidth, + transform: "translateX(0)", + transition: transitions.create(["width", "background-color"], { + easing: transitions.easing.sharp, + duration: transitions.duration.enteringScreen, + }), + }, + }); + + // styles for the sidenav when miniSidenav={true} + const drawerCloseStyles = () => ({ + background: backgroundValue, + transform: `translateX(${pxToRem(-320)})`, + transition: transitions.create("transform", { + easing: transitions.easing.sharp, + duration: transitions.duration.shorter, + }), + + [breakpoints.up("xl")]: { + boxShadow: transparentSidenav ? "none" : xxl, + marginBottom: transparentSidenav ? 0 : "inherit", + left: "0", + width: pxToRem(96), + overflowX: "hidden", + transform: "translateX(0)", + transition: transitions.create(["width", "background-color"], { + easing: transitions.easing.sharp, + duration: transitions.duration.shorter, + }), + }, + }); + + return { + "& .MuiDrawer-paper": { + boxShadow: xxl, + border: "none", + + ...(miniSidenav ? drawerCloseStyles() : drawerOpenStyles()), + }, + }; +}); diff --git a/src/qqq/components/Sidenav/index.tsx b/src/qqq/components/Sidenav/index.tsx new file mode 100644 index 0000000..8ec46cd --- /dev/null +++ b/src/qqq/components/Sidenav/index.tsx @@ -0,0 +1,337 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Divider from "@mui/material/Divider"; +import Icon from "@mui/material/Icon"; +import Link from "@mui/material/Link"; +import List from "@mui/material/List"; +import {useEffect, useState, ReactNode, useReducer} from "react"; +import {useLocation, NavLink} from "react-router-dom"; +import MDBox from "components/MDBox"; +import MDTypography from "components/MDTypography"; +import {useMaterialUIController, setMiniSidenav, setTransparentSidenav, setWhiteSidenav,} from "context"; +import AuthenticationButton from "qqq/components/Buttons/AuthenticationButton"; +import SidenavCollapse from "qqq/components/Sidenav/SidenavCollapse"; +import SidenavItem from "qqq/components/Sidenav/SidenavItem"; +import SidenavList from "qqq/components/Sidenav/SidenavList"; +import SidenavRoot from "qqq/components/Sidenav/SidenavRoot"; + +interface Props { + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark"; + brand?: string; + brandName: string; + routes: { + [key: string]: + | ReactNode + | string + | { + [key: string]: + | ReactNode + | string + | { + [key: string]: + | ReactNode + | string + | { + [key: string]: ReactNode | string; + }[]; + }[]; + }[]; + }[]; + [key: string]: any; +} + +function Sidenav({color, brand, brandName, routes, ...rest}: Props): JSX.Element +{ + const [openCollapse, setOpenCollapse] = useState(false); + const [openNestedCollapse, setOpenNestedCollapse] = useState(false); + const [controller, dispatch] = useMaterialUIController(); + const {miniSidenav, transparentSidenav, whiteSidenav, darkMode} = controller; + const location = useLocation(); + const {pathname} = location; + const collapseName = pathname.split("/").slice(1)[0]; + const items = pathname.split("/").slice(1); + const itemParentName = items[1]; + const itemName = items[items.length - 1]; + const [, forceUpdate] = useReducer((x) => x + 1, 0); + + let textColor: + | "primary" + | "secondary" + | "info" + | "success" + | "warning" + | "error" + | "dark" + | "white" + | "inherit" + | "text" + | "light" = "white"; + + if (transparentSidenav || (whiteSidenav && !darkMode)) + { + textColor = "dark"; + } + else if (whiteSidenav && darkMode) + { + textColor = "inherit"; + } + + const closeSidenav = () => setMiniSidenav(dispatch, true); + + useEffect(() => + { + setOpenCollapse(collapseName); + setOpenNestedCollapse(itemParentName); + }, []); + + useEffect(() => + { + // A function that sets the mini state of the sidenav. + function handleMiniSidenav() + { + setMiniSidenav(dispatch, window.innerWidth < 1200); + setTransparentSidenav(dispatch, window.innerWidth < 1200 ? false : transparentSidenav); + setWhiteSidenav(dispatch, window.innerWidth < 1200 ? false : whiteSidenav); + } + + /** + The event listener that's calling the handleMiniSidenav function when resizing the window. + */ + window.addEventListener("resize", handleMiniSidenav); + window.onload = () => + { + forceUpdate(); + }; + + // Call the handleMiniSidenav function to set the state with the initial value. + handleMiniSidenav(); + + // Remove event listener on cleanup + return () => window.removeEventListener("resize", handleMiniSidenav); + }, [dispatch, location]); + + // Render all the nested collapse items from the routes.js + const renderNestedCollapse = (collapse: any) => + { + const template = collapse.map(({name, route, key, href}: any) => + href ? ( + + + + ) : ( + + + + ) + ); + + return template; + }; + // Render the all the collpases from the routes.js + const renderCollapse = (collapses: any) => + collapses.map(({name, collapse, route, href, key}: any) => + { + let returnValue; + + if (collapse) + { + returnValue = ( + + openNestedCollapse === key && currentTarget.classList.contains("MuiListItem-root") + ? setOpenNestedCollapse(false) + : setOpenNestedCollapse(key) + } + > + {renderNestedCollapse(collapse)} + + ); + } + else + { + returnValue = href ? ( + + + + ) : ( + + + + ); + } + return {returnValue}; + }); + + // Render all the routes from the routes.js (All the visible items on the Sidenav) + const renderRoutes = routes.map( + ({type, name, icon, title, collapse, noCollapse, key, href, route}: any) => + { + let returnValue; + + if (type === "collapse") + { + if (href) + { + returnValue = ( + + + + ); + } + else if (noCollapse && route) + { + returnValue = ( + + + {collapse ? renderCollapse(collapse) : null} + + + ); + } + else + { + returnValue = ( + (openCollapse === key ? setOpenCollapse(false) : setOpenCollapse(key))} + > + {collapse ? renderCollapse(collapse) : null} + + ); + } + } + else if (type === "title") + { + returnValue = ( + + {title} + + ); + } + else if (type === "divider") + { + returnValue = ( + + ); + } + + return returnValue; + } + ); + + return ( + + + + + close + + + + + + + + {renderRoutes} + + + ); +} + +// Declaring default props for Sidenav +Sidenav.defaultProps = { + color: "info", + brand: "", +}; + +export default Sidenav; diff --git a/src/qqq/components/Sidenav/styles/sidenav.ts b/src/qqq/components/Sidenav/styles/sidenav.ts new file mode 100644 index 0000000..dcbf6f7 --- /dev/null +++ b/src/qqq/components/Sidenav/styles/sidenav.ts @@ -0,0 +1,46 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// @mui material components +import {Theme} from "@mui/material/styles"; + +export default function sidenavLogoLabel(theme: Theme, ownerState: any) +{ + const {functions, transitions, typography, breakpoints} = theme; + const {miniSidenav} = ownerState; + + const {pxToRem} = functions; + const {fontWeightMedium} = typography; + + return { + ml: 0.5, + fontWeight: fontWeightMedium, + wordSpacing: pxToRem(-1), + transition: transitions.create("opacity", { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + + [breakpoints.up("xl")]: { + opacity: miniSidenav ? 0 : 1, + }, + }; +} diff --git a/src/qqq/components/Sidenav/styles/sidenavCollapse.ts b/src/qqq/components/Sidenav/styles/sidenavCollapse.ts new file mode 100644 index 0000000..c426cbb --- /dev/null +++ b/src/qqq/components/Sidenav/styles/sidenavCollapse.ts @@ -0,0 +1,193 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {Theme} from "@mui/material/styles"; + +function collapseItem(theme: Theme, ownerState: any) +{ + const {palette, transitions, breakpoints, boxShadows, borders, functions} = theme; + const {active, transparentSidenav, whiteSidenav, darkMode} = ownerState; + + const {white, transparent, dark, grey} = palette; + const {md} = boxShadows; + const {borderRadius} = borders; + const {pxToRem, rgba} = functions; + + return { + background: () => + { + let backgroundValue; + + if (transparentSidenav && darkMode) + { + backgroundValue = active ? rgba(white.main, 0.2) : transparent.main; + } + else if (transparentSidenav && !darkMode) + { + backgroundValue = active ? grey[300] : transparent.main; + } + else if (whiteSidenav) + { + backgroundValue = active ? grey[200] : transparent.main; + } + else + { + backgroundValue = active ? rgba(white.main, 0.2) : transparent.main; + } + + return backgroundValue; + }, + color: (transparentSidenav && !darkMode) || whiteSidenav ? dark.main : white.main, + display: "flex", + alignItems: "center", + width: "100%", + padding: `${pxToRem(8)} ${pxToRem(16)}`, + margin: `${pxToRem(1.5)} ${pxToRem(16)}`, + borderRadius: borderRadius.md, + cursor: "pointer", + userSelect: "none", + whiteSpace: "nowrap", + boxShadow: active && !whiteSidenav && !darkMode && !transparentSidenav ? md : "none", + [breakpoints.up("xl")]: { + transition: transitions.create(["box-shadow", "background-color"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.shorter, + }), + }, + + "&:hover, &:focus": { + backgroundColor: + transparentSidenav && !darkMode + ? grey[300] + : rgba(whiteSidenav ? grey[400] : white.main, 0.2), + }, + }; +} + +function collapseIconBox(theme: Theme, ownerState: any) +{ + const {palette, transitions, borders, functions} = theme; + const {transparentSidenav, whiteSidenav, darkMode} = ownerState; + + const {white, dark} = palette; + const {borderRadius} = borders; + const {pxToRem} = functions; + + return { + minWidth: pxToRem(32), + minHeight: pxToRem(32), + color: (transparentSidenav && !darkMode) || whiteSidenav ? dark.main : white.main, + borderRadius: borderRadius.md, + display: "grid", + placeItems: "center", + transition: transitions.create("margin", { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + + "& svg, svg g": { + color: transparentSidenav || whiteSidenav ? dark.main : white.main, + }, + }; +} + +const collapseIcon = ({palette: {white, gradients}}: Theme, {active}: any) => ({ + color: active ? white.main : gradients.dark.state, +}); + +function collapseText(theme: any, ownerState: any) +{ + const {typography, transitions, breakpoints, functions} = theme; + const {miniSidenav, transparentSidenav, active} = ownerState; + + const {size, fontWeightRegular, fontWeightLight} = typography; + const {pxToRem} = functions; + + return { + marginLeft: pxToRem(10), + + [breakpoints.up("xl")]: { + opacity: miniSidenav || (miniSidenav && transparentSidenav) ? 0 : 1, + maxWidth: miniSidenav || (miniSidenav && transparentSidenav) ? 0 : "100%", + marginLeft: miniSidenav || (miniSidenav && transparentSidenav) ? 0 : pxToRem(10), + transition: transitions.create(["opacity", "margin"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + }, + + "& span": { + fontWeight: active ? fontWeightRegular : fontWeightLight, + fontSize: size.sm, + lineHeight: 0, + }, + }; +} + +function collapseArrow(theme: Theme, ownerState: any) +{ + const {palette, typography, transitions, breakpoints, functions} = theme; + const {noCollapse, transparentSidenav, whiteSidenav, miniSidenav, open, active, darkMode} = + ownerState; + + const {white, dark} = palette; + const {size} = typography; + const {pxToRem, rgba} = functions; + + return { + fontSize: `${size.lg} !important`, + fontWeight: 700, + marginBottom: pxToRem(-1), + transform: open ? "rotate(0)" : "rotate(-180deg)", + color: () => + { + let colorValue; + + if (transparentSidenav && darkMode) + { + colorValue = open || active ? white.main : rgba(white.main, 0.25); + } + else if (transparentSidenav || whiteSidenav) + { + colorValue = open || active ? dark.main : rgba(dark.main, 0.25); + } + else + { + colorValue = open || active ? white.main : rgba(white.main, 0.5); + } + + return colorValue; + }, + transition: transitions.create(["color", "transform", "opacity"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.shorter, + }), + + [breakpoints.up("xl")]: { + display: + noCollapse || (transparentSidenav && miniSidenav) || miniSidenav + ? "none !important" + : "block !important", + }, + }; +} + +export {collapseItem, collapseIconBox, collapseIcon, collapseText, collapseArrow}; diff --git a/src/qqq/components/Sidenav/styles/sidenavItem.ts b/src/qqq/components/Sidenav/styles/sidenavItem.ts new file mode 100644 index 0000000..4e2a973 --- /dev/null +++ b/src/qqq/components/Sidenav/styles/sidenavItem.ts @@ -0,0 +1,180 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {Theme} from "@mui/material/styles"; + +function item(theme: Theme | any, ownerState: any) +{ + const {palette, borders, functions, transitions} = theme; + const {active, color, transparentSidenav, whiteSidenav, darkMode} = ownerState; + + const {transparent, white, grey} = palette; + const {borderRadius} = borders; + const {rgba} = functions; + + return { + pl: 3, + mt: 0.375, + mb: 0.3, + width: "100%", + borderRadius: borderRadius.md, + cursor: "pointer", + backgroundColor: () => + { + let backgroundValue = transparent.main; + + if ( + (active === "isParent" && !transparentSidenav && !whiteSidenav) || + (active === "isParent" && transparentSidenav && darkMode) + ) + { + backgroundValue = rgba(white.main, 0.2); + } + else if (active === "isParent" && transparentSidenav) + { + backgroundValue = grey[300]; + } + else if (active === "isParent" && whiteSidenav) + { + backgroundValue = grey[200]; + } + else if (active) + { + backgroundValue = palette[color].main; + } + + return backgroundValue; + }, + transition: transitions.create("background-color", { + easing: transitions.easing.easeInOut, + duration: transitions.duration.shorter, + }), + + "&:hover, &:focus": { + backgroundColor: + !active && + rgba((transparentSidenav && !darkMode) || whiteSidenav ? grey[400] : white.main, 0.2), + }, + }; +} + +function itemContent(theme: Theme, ownerState: any) +{ + const {palette, typography, transitions, functions} = theme; + const {miniSidenav, name, active, transparentSidenav, whiteSidenav, darkMode} = ownerState; + + const {white, dark} = palette; + const {size, fontWeightRegular, fontWeightLight} = typography; + const {pxToRem} = functions; + + return { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + width: "100%", + padding: `${pxToRem(12)} ${pxToRem(16)}`, + marginLeft: pxToRem(18), + userSelect: "none", + position: "relative", + + "& span": { + color: + ((transparentSidenav && !darkMode) || whiteSidenav) && (active === "isParent" || !active) + ? dark.main + : white.main, + fontWeight: active ? fontWeightRegular : fontWeightLight, + fontSize: size.sm, + opacity: miniSidenav ? 0 : 1, + transition: transitions.create(["opacity", "color"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + }, + + "&::before": { + content: `"${name[0]}"`, + color: + ((transparentSidenav && !darkMode) || whiteSidenav) && (active === "isParent" || !active) + ? dark.main + : white.main, + fontWeight: fontWeightRegular, + display: "flex", + alignItems: "center", + position: "absolute", + top: "50%", + transform: "translateY(-50%)", + left: pxToRem(-15), + opacity: 1, + borderRadius: "50%", + fontSize: size.sm, + }, + }; +} + +function itemArrow(theme: Theme, ownerState: any) +{ + const {palette, typography, transitions, breakpoints, functions} = theme; + const {noCollapse, transparentSidenav, whiteSidenav, miniSidenav, open, active, darkMode} = + ownerState; + + const {white, dark} = palette; + const {size} = typography; + const {pxToRem, rgba} = functions; + + return { + fontSize: `${size.lg} !important`, + fontWeight: 700, + marginBottom: pxToRem(-1), + transform: open ? "rotate(0)" : "rotate(-180deg)", + color: () => + { + let colorValue; + + if (transparentSidenav && darkMode) + { + colorValue = open || active ? white.main : rgba(white.main, 0.25); + } + else if (transparentSidenav || whiteSidenav) + { + colorValue = open || active ? dark.main : rgba(dark.main, 0.25); + } + else + { + colorValue = open || active ? white.main : rgba(white.main, 0.5); + } + + return colorValue; + }, + transition: transitions.create(["color", "transform", "opacity"], { + easing: transitions.easing.easeInOut, + duration: transitions.duration.shorter, + }), + + [breakpoints.up("xl")]: { + display: + noCollapse || (transparentSidenav && miniSidenav) || miniSidenav + ? "none !important" + : "block !important", + }, + }; +} + +export {item, itemContent, itemArrow}; diff --git a/src/qqq/components/Temporary/BookingCard/index.tsx b/src/qqq/components/Temporary/BookingCard/index.tsx new file mode 100644 index 0000000..a00a0b2 --- /dev/null +++ b/src/qqq/components/Temporary/BookingCard/index.tsx @@ -0,0 +1,128 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Card from "@mui/material/Card"; +import Divider from "@mui/material/Divider"; +import Icon from "@mui/material/Icon"; +import {ReactNode} from "react"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; + +interface Props +{ + image: string; + title: string; + description: string; + price: string; + location: ReactNode; + action?: ReactNode | boolean; + + [key: string]: any; +} + +function BookingCard({image, title, description, price, location, action}: Props): JSX.Element +{ + return ( + + + + + + + + {action} + + + {title} + + + {description} + + + + + + {price} + + + + place + + + {location} + + + + + ); +} + +// Declaring default props for BookingCard +BookingCard.defaultProps = { + action: false, +}; + +export default BookingCard; diff --git a/src/qqq/components/Temporary/Configurator/ConfiguratorRoot.tsx b/src/qqq/components/Temporary/Configurator/ConfiguratorRoot.tsx new file mode 100644 index 0000000..72bf01a --- /dev/null +++ b/src/qqq/components/Temporary/Configurator/ConfiguratorRoot.tsx @@ -0,0 +1,66 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Drawer from "@mui/material/Drawer"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Drawer)(({theme, ownerState}: { theme?: Theme; ownerState: any }) => +{ + const {boxShadows, functions, transitions} = theme; + const {openConfigurator} = ownerState; + + const configuratorWidth = 360; + const {lg} = boxShadows; + const {pxToRem} = functions; + + // drawer styles when openConfigurator={true} + const drawerOpenStyles = () => ({ + width: configuratorWidth, + left: "initial", + right: 0, + transition: transitions.create("right", { + easing: transitions.easing.sharp, + duration: transitions.duration.short, + }), + }); + + // drawer styles when openConfigurator={false} + const drawerCloseStyles = () => ({ + left: "initial", + right: pxToRem(-350), + transition: transitions.create("all", { + easing: transitions.easing.sharp, + duration: transitions.duration.short, + }), + }); + + return { + "& .MuiDrawer-paper": { + height: "100vh", + margin: 0, + padding: `0 ${pxToRem(10)}`, + borderRadius: 0, + boxShadow: lg, + overflowY: "auto", + ...(openConfigurator ? drawerOpenStyles() : drawerCloseStyles()), + }, + }; +}); diff --git a/src/qqq/components/Temporary/Configurator/index.tsx b/src/qqq/components/Temporary/Configurator/index.tsx new file mode 100644 index 0000000..e9eb9f4 --- /dev/null +++ b/src/qqq/components/Temporary/Configurator/index.tsx @@ -0,0 +1,385 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import FacebookIcon from "@mui/icons-material/Facebook"; +import TwitterIcon from "@mui/icons-material/Twitter"; +import Divider from "@mui/material/Divider"; +import Icon from "@mui/material/Icon"; +import IconButton from "@mui/material/IconButton"; +import Link from "@mui/material/Link"; +import {Theme} from "@mui/material/styles"; +import Switch from "@mui/material/Switch"; +import {useState, useEffect} from "react"; +import GitHubButton from "react-github-btn"; +import {useMaterialUIController, setOpenConfigurator, setTransparentSidenav, setWhiteSidenav, setMiniSidenav, setFixedNavbar, setSidenavColor, setDarkMode,} from "context"; +import ConfiguratorRoot from "qqq/components/Temporary/Configurator/ConfiguratorRoot"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDButton from "qqq/components/Temporary/MDButton"; +import MDTypography from "qqq/components/Temporary/MDTypography"; + +function Configurator(): JSX.Element +{ + const [controller, dispatch] = useMaterialUIController(); + const { + openConfigurator, + miniSidenav, + fixedNavbar, + sidenavColor, + transparentSidenav, + whiteSidenav, + darkMode, + } = controller; + const [disabled, setDisabled] = useState(false); + const sidenavColors: ( + | "primary" + | "secondary" + | "info" + | "success" + | "warning" + | "error" + | "light" + | "dark" + )[] = ["primary", "dark", "info", "success", "warning", "error"]; + + // Use the useEffect hook to change the button state for the sidenav type based on window size. + useEffect(() => + { + // A function that sets the disabled state of the buttons for the sidenav type. + function handleDisabled() + { + return window.innerWidth > 1200 ? setDisabled(false) : setDisabled(true); + } + + // The event listener that's calling the handleDisabled function when resizing the window. + window.addEventListener("resize", handleDisabled); + + // Call the handleDisabled function to set the state with the initial value. + handleDisabled(); + + // Remove event listener on cleanup + return () => window.removeEventListener("resize", handleDisabled); + }, []); + + const handleCloseConfigurator = () => setOpenConfigurator(dispatch, false); + const handleTransparentSidenav = () => + { + setTransparentSidenav(dispatch, true); + setWhiteSidenav(dispatch, false); + }; + const handleWhiteSidenav = () => + { + setWhiteSidenav(dispatch, true); + setTransparentSidenav(dispatch, false); + }; + const handleDarkSidenav = () => + { + setWhiteSidenav(dispatch, false); + setTransparentSidenav(dispatch, false); + }; + const handleMiniSidenav = () => setMiniSidenav(dispatch, !miniSidenav); + const handleFixedNavbar = () => setFixedNavbar(dispatch, !fixedNavbar); + const handleDarkMode = () => setDarkMode(dispatch, !darkMode); + + // sidenav type buttons styles + const sidenavTypeButtonsStyles = ({ + functions: {pxToRem}, + palette: {white, dark, background}, + borders: {borderWidth}, + }: Theme | any) => ({ + height: pxToRem(39), + background: darkMode ? background.sidenav : white.main, + color: darkMode ? white.main : dark.main, + border: `${borderWidth[1]} solid ${darkMode ? white.main : dark.main}`, + + "&:hover, &:focus, &:focus:not(:hover)": { + background: darkMode ? background.sidenav : white.main, + color: darkMode ? white.main : dark.main, + border: `${borderWidth[1]} solid ${darkMode ? white.main : dark.main}`, + }, + }); + + // sidenav type active button styles + const sidenavTypeActiveButtonStyles = ({ + functions: {pxToRem, linearGradient}, + palette: {white, gradients, background}, + }: Theme | any) => ({ + height: pxToRem(39), + background: darkMode ? white.main : linearGradient(gradients.dark.main, gradients.dark.state), + color: darkMode ? background.sidenav : white.main, + + "&:hover, &:focus, &:focus:not(:hover)": { + background: darkMode ? white.main : linearGradient(gradients.dark.main, gradients.dark.state), + color: darkMode ? background.sidenav : white.main, + }, + }); + + return ( + + + + Material UI Configurator + + See our dashboard options. + + + + ({ + fontSize: `${size.lg} !important`, + color: darkMode ? white.main : dark.main, + stroke: "currentColor", + strokeWidth: "2px", + cursor: "pointer", + transform: "translateY(5px)", + })} + onClick={handleCloseConfigurator} + > + close + + + + + + + + Sidenav Colors + + + {sidenavColors.map((color) => ( + ({ + width: "24px", + height: "24px", + padding: 0, + border: `${borderWidth[1]} solid ${darkMode ? background.sidenav : white.main}`, + borderColor: () => + { + let borderColorValue = sidenavColor === color && dark.main; + + if (darkMode && sidenavColor === color) + { + borderColorValue = white.main; + } + + return borderColorValue; + }, + transition: transitions.create("border-color", { + easing: transitions.easing.sharp, + duration: transitions.duration.shorter, + }), + backgroundImage: ({functions: {linearGradient}, palette: {gradients}}) => + linearGradient(gradients[color].main, gradients[color].state), + + "&:not(:last-child)": { + mr: 1, + }, + + "&:hover, &:focus, &:active": { + borderColor: darkMode ? white.main : dark.main, + }, + })} + onClick={() => setSidenavColor(dispatch, color)} + /> + ))} + + + + + Sidenav Type + + Choose between different sidenav types. + + + + + Dark + + + + Transparent + + + + White + + + + + Navbar Fixed + + + + + + Sidenav Mini + + + + + + Light / Dark + + + + + + + + buy now + + + + + buy javascript version + + + + view documentation + + + + + Star + + + + + Thank you for sharing! + + + + + + +   Tweet + + + + +   Share + + + + + + ); +} + +export default Configurator; diff --git a/src/qqq/components/Temporary/DefaultInfoCard/index.tsx b/src/qqq/components/Temporary/DefaultInfoCard/index.tsx new file mode 100644 index 0000000..1a6ed3d --- /dev/null +++ b/src/qqq/components/Temporary/DefaultInfoCard/index.tsx @@ -0,0 +1,84 @@ +/* QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Card from "@mui/material/Card"; +import Divider from "@mui/material/Divider"; +import Icon from "@mui/material/Icon"; +import {ReactNode} from "react"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; + +interface Props { + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark"; + icon: ReactNode; + title: string; + description?: string; + value?: string | number; + [key: string]: any; +} + +function DefaultInfoCard({color, icon, title, description, value}: Props): JSX.Element +{ + return ( + + + + {icon} + + + + + {title} + + {description && ( + + {description} + + )} + {description && !value ? null : } + {value && ( + + {value} + + )} + + + ); +} + +// Declaring default props for DefaultInfoCard +DefaultInfoCard.defaultProps = { + color: "info", + value: "", + description: "", +}; + +export default DefaultInfoCard; diff --git a/src/qqq/components/Temporary/MDAlert/MDAlertCloseIcon.tsx b/src/qqq/components/Temporary/MDAlert/MDAlertCloseIcon.tsx new file mode 100644 index 0000000..ce172dc --- /dev/null +++ b/src/qqq/components/Temporary/MDAlert/MDAlertCloseIcon.tsx @@ -0,0 +1,41 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {styled} from "@mui/material"; + +export default styled("span")(({theme}) => +{ + const {palette, typography, functions} = theme; + + const {white} = palette; + const {size, fontWeightMedium} = typography; + const {pxToRem} = functions; + + return { + color: white.main, + fontSize: size.xl, + padding: `${pxToRem(9)} ${pxToRem(6)} ${pxToRem(8)}`, + marginLeft: pxToRem(40), + fontWeight: fontWeightMedium, + cursor: "pointer", + lineHeight: 0, + }; +}); diff --git a/src/qqq/components/Temporary/MDAlert/MDAlertRoot.tsx b/src/qqq/components/Temporary/MDAlert/MDAlertRoot.tsx new file mode 100644 index 0000000..cce6cb1 --- /dev/null +++ b/src/qqq/components/Temporary/MDAlert/MDAlertRoot.tsx @@ -0,0 +1,54 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {styled, Theme} from "@mui/material"; +import Box from "@mui/material/Box"; + +export default styled(Box)(({theme, ownerState}: { theme?: Theme; ownerState: any }) => +{ + const {palette, typography, borders, functions} = theme; + const {color} = ownerState; + + const {white, gradients} = palette; + const {size, fontWeightMedium} = typography; + const {borderRadius} = borders; + const {pxToRem, linearGradient} = functions; + + // backgroundImage value + const backgroundImageValue = gradients[color] + ? linearGradient(gradients[color].main, gradients[color].state) + : linearGradient(gradients.info.main, gradients.info.state); + + return { + display: "flex", + justifyContent: "space-between", + alignItems: "center", + minHeight: pxToRem(60), + backgroundImage: backgroundImageValue, + color: white.main, + position: "relative", + padding: pxToRem(16), + marginBottom: pxToRem(16), + borderRadius: borderRadius.md, + fontSize: size.md, + fontWeight: fontWeightMedium, + }; +}); diff --git a/src/qqq/components/Temporary/MDAlert/index.tsx b/src/qqq/components/Temporary/MDAlert/index.tsx new file mode 100644 index 0000000..32ef0be --- /dev/null +++ b/src/qqq/components/Temporary/MDAlert/index.tsx @@ -0,0 +1,81 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Fade from "@mui/material/Fade"; +import {useState, ReactNode} from "react"; +import MDAlertCloseIcon from "qqq/components/Temporary/MDAlert/MDAlertCloseIcon"; +import MDAlertRoot from "qqq/components/Temporary/MDAlert/MDAlertRoot"; +import MDBox from "qqq/components/Temporary/MDBox"; + +// Declaring props types for MDAlert +interface Props +{ + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; + dismissible?: boolean; + children: ReactNode; + + [key: string]: any; +} + +function MDAlert({color, dismissible, children, ...rest}: Props): JSX.Element | null +{ + const [alertStatus, setAlertStatus] = useState("mount"); + + const handleAlertStatus = () => setAlertStatus("fadeOut"); + + // The base template for the alert + const alertTemplate: any = (mount: boolean = true) => ( + + + + {children} + + {dismissible ? ( + + × + + ) : null} + + + ); + + switch (true) + { + case alertStatus === "mount": + return alertTemplate(); + case alertStatus === "fadeOut": + setTimeout(() => setAlertStatus("unmount"), 400); + return alertTemplate(false); + default: + alertTemplate(); + break; + } + + return null; +} + +// Declaring default props for MDAlert +MDAlert.defaultProps = { + color: "info", + dismissible: false, +}; + +export default MDAlert; diff --git a/src/qqq/components/Temporary/MDAvatar/MDAvatarRoot.tsx b/src/qqq/components/Temporary/MDAvatar/MDAvatarRoot.tsx new file mode 100644 index 0000000..ecacf3f --- /dev/null +++ b/src/qqq/components/Temporary/MDAvatar/MDAvatarRoot.tsx @@ -0,0 +1,96 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Avatar from "@mui/material/Avatar"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Avatar)(({theme, ownerState}: { theme?: Theme | any; ownerState: any }) => +{ + const {palette, functions, typography, boxShadows} = theme; + const {shadow, bgColor, size} = ownerState; + + const {gradients, transparent, white} = palette; + const {pxToRem, linearGradient} = functions; + const {size: fontSize, fontWeightRegular} = typography; + + // backgroundImage value + const backgroundValue = + bgColor === "transparent" + ? transparent.main + : linearGradient(gradients[bgColor].main, gradients[bgColor].state); + + // size value + let sizeValue; + + switch (size) + { + case "xs": + sizeValue = { + width: pxToRem(24), + height: pxToRem(24), + fontSize: fontSize.xs, + }; + break; + case "sm": + sizeValue = { + width: pxToRem(36), + height: pxToRem(36), + fontSize: fontSize.sm, + }; + break; + case "lg": + sizeValue = { + width: pxToRem(58), + height: pxToRem(58), + fontSize: fontSize.sm, + }; + break; + case "xl": + sizeValue = { + width: pxToRem(74), + height: pxToRem(74), + fontSize: fontSize.md, + }; + break; + case "xxl": + sizeValue = { + width: pxToRem(110), + height: pxToRem(110), + fontSize: fontSize.md, + }; + break; + default: { + sizeValue = { + width: pxToRem(48), + height: pxToRem(48), + fontSize: fontSize.md, + }; + } + } + + return { + background: backgroundValue, + color: white.main, + fontWeight: fontWeightRegular, + boxShadow: boxShadows[shadow], + ...sizeValue, + }; +}); diff --git a/src/qqq/components/Temporary/MDAvatar/index.tsx b/src/qqq/components/Temporary/MDAvatar/index.tsx new file mode 100644 index 0000000..f1e6a44 --- /dev/null +++ b/src/qqq/components/Temporary/MDAvatar/index.tsx @@ -0,0 +1,54 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {AvatarProps} from "@mui/material"; +import {FC, forwardRef} from "react"; +import MDAvatarRoot from "qqq/components/Temporary/MDAvatar/MDAvatarRoot"; + +// declare props types for MDAvatar +interface Props extends AvatarProps { + bgColor?: + | "transparent" + | "primary" + | "secondary" + | "info" + | "success" + | "warning" + | "error" + | "light" + | "dark"; + size?: "xs" | "sm" | "md" | "lg" | "xl" | "xxl"; + shadow?: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "xxl" | "inset"; + [key: string]: any; +} + +const MDAvatar: FC = forwardRef(({bgColor, size, shadow, ...rest}, ref) => ( + +)); + +// Declaring default props for MDAvatar +MDAvatar.defaultProps = { + bgColor: "transparent", + size: "md", + shadow: "none", +}; + +export default MDAvatar; diff --git a/src/qqq/components/Temporary/MDBadge/MDBadgeRoot.tsx b/src/qqq/components/Temporary/MDBadge/MDBadgeRoot.tsx new file mode 100644 index 0000000..e06d305 --- /dev/null +++ b/src/qqq/components/Temporary/MDBadge/MDBadgeRoot.tsx @@ -0,0 +1,147 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Badge from "@mui/material/Badge"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Badge)(({theme, ownerState}: { theme?: Theme; ownerState: any }) => +{ + const {palette, typography, borders, functions} = theme; + const {color, circular, border, size, indicator, variant, container, children} = ownerState; + + const {white, dark, gradients, badgeColors} = palette; + const {size: fontSize, fontWeightBold} = typography; + const {borderRadius, borderWidth} = borders; + const {pxToRem, linearGradient} = functions; + + // padding values + const paddings: { [key: string]: string } = { + xs: "0.45em 0.775em", + sm: "0.55em 0.9em", + md: "0.65em 1em", + lg: "0.85em 1.375em", + }; + + // fontSize value + const fontSizeValue = size === "xs" ? fontSize.xxs : fontSize.xs; + + // border value + const borderValue = border ? `${borderWidth[3]} solid ${white.main}` : "none"; + + // borderRadius value + const borderRadiusValue = circular ? borderRadius.section : borderRadius.md; + + // styles for the badge with indicator={true} + const indicatorStyles = (sizeProp: string) => + { + let widthValue = pxToRem(20); + let heightValue = pxToRem(20); + + if (sizeProp === "medium") + { + widthValue = pxToRem(24); + heightValue = pxToRem(24); + } + else if (sizeProp === "large") + { + widthValue = pxToRem(32); + heightValue = pxToRem(32); + } + + return { + width: widthValue, + height: heightValue, + display: "grid", + placeItems: "center", + textAlign: "center", + borderRadius: "50%", + padding: 0, + border: borderValue, + }; + }; + + // styles for the badge with variant="gradient" + const gradientStyles = (colorProp: string) => + { + const backgroundValue = gradients[colorProp] + ? linearGradient(gradients[colorProp].main, gradients[colorProp].state) + : linearGradient(gradients.info.main, gradients.info.state); + const colorValue = colorProp === "light" ? dark.main : white.main; + + return { + background: backgroundValue, + color: colorValue, + }; + }; + + // styles for the badge with variant="contained" + const containedStyles = (colorProp: string) => + { + const backgroundValue = badgeColors[colorProp] + ? badgeColors[colorProp].background + : badgeColors.info.background; + let colorValue = badgeColors[colorProp] ? badgeColors[colorProp].text : badgeColors.info.text; + + if (colorProp === "light") + { + colorValue = dark.main; + } + return { + background: backgroundValue, + color: colorValue, + }; + }; + + // styles for the badge with no children and container={false} + const standAloneStyles = () => ({ + position: "static", + marginLeft: pxToRem(8), + transform: "none", + fontSize: pxToRem(9), + }); + + // styles for the badge with container={true} + const containerStyles = () => ({ + position: "relative", + transform: "none", + }); + + return { + "& .MuiBadge-badge": { + height: "auto", + padding: paddings[size] || paddings.xs, + fontSize: fontSizeValue, + fontWeight: fontWeightBold, + textTransform: "uppercase", + lineHeight: 1, + textAlign: "center", + whiteSpace: "nowrap", + verticalAlign: "baseline", + border: borderValue, + borderRadius: borderRadiusValue, + ...(indicator && indicatorStyles(size)), + ...(variant === "gradient" && gradientStyles(color)), + ...(variant === "contained" && containedStyles(color)), + ...(!children && !container && standAloneStyles()), + ...(container && containerStyles()), + }, + }; +}); diff --git a/src/qqq/components/Temporary/MDBadge/index.tsx b/src/qqq/components/Temporary/MDBadge/index.tsx new file mode 100644 index 0000000..eb21f40 --- /dev/null +++ b/src/qqq/components/Temporary/MDBadge/index.tsx @@ -0,0 +1,63 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {BadgeProps} from "@mui/material"; +import {FC, ReactNode, forwardRef} from "react"; +import MDBadgeRoot from "qqq/components/Temporary/MDBadge/MDBadgeRoot"; + +interface Props extends Omit { + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; + variant?: "gradient" | "contained"; + size?: "xs" | "sm" | "md" | "lg"; + circular?: boolean; + indicator?: boolean; + border?: boolean; + children?: ReactNode; + container?: boolean; + [key: string]: any; +} + +const MDBadge: FC = forwardRef( + ({color, variant, size, circular, indicator, border, container, children, ...rest}, ref) => ( + + {children} + + ) +); + +// declaring default props for MDBadge +MDBadge.defaultProps = { + color: "info", + variant: "gradient", + size: "sm", + circular: false, + indicator: false, + border: false, + container: false, + children: false, +}; + +export default MDBadge; diff --git a/src/qqq/components/Temporary/MDBadgeDot/index.tsx b/src/qqq/components/Temporary/MDBadgeDot/index.tsx new file mode 100644 index 0000000..4e2b8d5 --- /dev/null +++ b/src/qqq/components/Temporary/MDBadgeDot/index.tsx @@ -0,0 +1,120 @@ +/* QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {FC, forwardRef} from "react"; +import MDBox from "components/MDBox"; +import MDTypography from "components/MDTypography"; + +// declaring props types for MDBadgeDot +interface Props +{ + variant?: "gradient" | "contained"; + color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; + size?: "xs" | "sm" | "md" | "lg"; + badgeContent: string; + font?: + | { + color: string; + weight: string; + } + | any; + + [key: string]: any; +} + +const MDBadgeDot: FC = forwardRef( + ({variant, color, size, badgeContent, font = {}, ...rest}, ref) => + { + let finalSize; + let fontSize: any; + let padding; + + if (size === "sm") + { + finalSize = "0.5rem"; + fontSize = "caption"; + padding = "0.45em 0.775em"; + } + else if (size === "lg") + { + finalSize = "0.625rem"; + fontSize = "body2"; + padding = "0.85em 1.375em"; + } + else if (size === "md") + { + finalSize = "0.5rem"; + fontSize = "button"; + padding = "0.65em 1em"; + } + else + { + finalSize = "0.375rem"; + fontSize = "caption"; + padding = "0.45em 0.775em"; + } + + const validColors = [ + "primary", + "secondary", + "info", + "success", + "warning", + "error", + "light", + "dark", + ]; + + const validColorIndex = validColors.findIndex((el) => el === color); + + return ( + + + + {badgeContent} + + + ); + } +); + +// Declaring default props for MDBadgeDot +MDBadgeDot.defaultProps = { + variant: "contained", + color: "info", + size: "xs", + font: {}, +}; + +export default MDBadgeDot; diff --git a/src/qqq/components/Temporary/MDBox/MDBoxRoot.tsx b/src/qqq/components/Temporary/MDBox/MDBoxRoot.tsx new file mode 100644 index 0000000..bed07b3 --- /dev/null +++ b/src/qqq/components/Temporary/MDBox/MDBoxRoot.tsx @@ -0,0 +1,138 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Box from "@mui/material/Box"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Box)(({theme, ownerState}: { theme?: Theme | any; ownerState: any }) => +{ + const {palette, functions, borders, boxShadows} = theme; + const {variant, bgColor, color, opacity, borderRadius, shadow, coloredShadow} = ownerState; + + const {gradients, grey, white} = palette; + const {linearGradient} = functions; + const {borderRadius: radius} = borders; + const {colored} = boxShadows; + + const greyColors: { [key: string]: string } = { + "grey-100": grey[100], + "grey-200": grey[200], + "grey-300": grey[300], + "grey-400": grey[400], + "grey-500": grey[500], + "grey-600": grey[600], + "grey-700": grey[700], + "grey-800": grey[800], + "grey-900": grey[900], + }; + + const validGradients = [ + "primary", + "secondary", + "info", + "success", + "warning", + "error", + "dark", + "light", + ]; + + const validColors = [ + "transparent", + "white", + "black", + "primary", + "secondary", + "info", + "success", + "warning", + "error", + "light", + "dark", + "text", + "grey-100", + "grey-200", + "grey-300", + "grey-400", + "grey-500", + "grey-600", + "grey-700", + "grey-800", + "grey-900", + ]; + + const validBorderRadius = ["xs", "sm", "md", "lg", "xl", "xxl", "section"]; + const validBoxShadows = ["xs", "sm", "md", "lg", "xl", "xxl", "inset"]; + + // background value + let backgroundValue = bgColor; + + if (variant === "gradient") + { + backgroundValue = validGradients.find((el) => el === bgColor) + ? linearGradient(gradients[bgColor].main, gradients[bgColor].state) + : white.main; + } + else if (validColors.find((el) => el === bgColor)) + { + backgroundValue = palette[bgColor] ? palette[bgColor].main : greyColors[bgColor]; + } + else + { + backgroundValue = bgColor; + } + + // color value + let colorValue = color; + + if (validColors.find((el) => el === color)) + { + colorValue = palette[color] ? palette[color].main : greyColors[color]; + } + + // borderRadius value + let borderRadiusValue = borderRadius; + + if (validBorderRadius.find((el) => el === borderRadius)) + { + borderRadiusValue = radius[borderRadius]; + } + + // boxShadow value + let boxShadowValue = "none"; + + if (validBoxShadows.find((el) => el === shadow)) + { + boxShadowValue = boxShadows[shadow]; + } + else if (coloredShadow) + { + boxShadowValue = colored[coloredShadow] ? colored[coloredShadow] : "none"; + } + + return { + opacity, + background: backgroundValue, + color: colorValue, + borderRadius: borderRadiusValue, + boxShadow: boxShadowValue, + }; +}); diff --git a/src/qqq/components/Temporary/MDBox/index.tsx b/src/qqq/components/Temporary/MDBox/index.tsx new file mode 100644 index 0000000..81f3a06 --- /dev/null +++ b/src/qqq/components/Temporary/MDBox/index.tsx @@ -0,0 +1,60 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {BoxProps} from "@mui/material"; +import {forwardRef, FC} from "react"; +import MDBoxRoot from "qqq/components/Temporary/MDBox/MDBoxRoot"; + + +// declaring props types for MDBox +interface Props extends BoxProps { + variant?: "contained" | "gradient"; + bgColor?: string; + color?: string; + opacity?: number; + borderRadius?: string; + shadow?: string; + coloredShadow?: string; + [key: string]: any; +} + +const MDBox: FC = forwardRef( + ({variant, bgColor, color, opacity, borderRadius, shadow, coloredShadow, ...rest}, ref) => ( + + ) +); + +// Declaring default props for MDBox +MDBox.defaultProps = { + variant: "contained", + bgColor: "transparent", + color: "dark", + opacity: 1, + borderRadius: "none", + shadow: "none", + coloredShadow: "none", +}; + +export default MDBox; diff --git a/src/qqq/components/Temporary/MDButton/MDButtonRoot.tsx b/src/qqq/components/Temporary/MDButton/MDButtonRoot.tsx new file mode 100644 index 0000000..cc76bec --- /dev/null +++ b/src/qqq/components/Temporary/MDButton/MDButtonRoot.tsx @@ -0,0 +1,309 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Button from "@mui/material/Button"; +import {styled, Theme} from "@mui/material/styles"; + +export default styled(Button)(({theme, ownerState}: { theme?: Theme | any; ownerState: any }) => +{ + const {palette, functions, borders, boxShadows} = theme; + const {color, variant, size, circular, iconOnly, darkMode} = ownerState; + + const {white, text, transparent, gradients, grey} = palette; + const {boxShadow, linearGradient, pxToRem, rgba} = functions; + const {borderRadius} = borders; + const {colored} = boxShadows; + + // styles for the button with variant="contained" + const containedStyles = () => + { + // background color value + const backgroundValue = palette[color] ? palette[color].main : white.main; + + // backgroundColor value when button is focused + const focusedBackgroundValue = palette[color] ? palette[color].focus : white.focus; + + // boxShadow value + const boxShadowValue = colored[color] + ? `${boxShadow([0, 3], [3, 0], palette[color].main, 0.15)}, ${boxShadow( + [0, 3], + [1, -2], + palette[color].main, + 0.2 + )}, ${boxShadow([0, 1], [5, 0], palette[color].main, 0.15)}` + : "none"; + + // boxShadow value when button is hovered + const hoveredBoxShadowValue = colored[color] + ? `${boxShadow([0, 14], [26, -12], palette[color].main, 0.4)}, ${boxShadow( + [0, 4], + [23, 0], + palette[color].main, + 0.15 + )}, ${boxShadow([0, 8], [10, -5], palette[color].main, 0.2)}` + : "none"; + + // color value + let colorValue = white.main; + + if (!darkMode && (color === "white" || color === "light" || !palette[color])) + { + colorValue = text.main; + } + else if (darkMode && (color === "white" || color === "light" || !palette[color])) + { + colorValue = grey[600]; + } + + // color value when button is focused + let focusedColorValue = white.main; + + if (color === "white") + { + focusedColorValue = text.main; + } + else if (color === "primary" || color === "error" || color === "dark") + { + focusedColorValue = white.main; + } + + return { + background: backgroundValue, + color: colorValue, + boxShadow: boxShadowValue, + + "&:hover": { + backgroundColor: backgroundValue, + color: colorValue, + boxShadow: hoveredBoxShadowValue, + }, + + "&:focus:not(:hover)": { + backgroundColor: focusedBackgroundValue, + color: colorValue, + boxShadow: palette[color] + ? boxShadow([0, 0], [0, 3.2], palette[color].main, 0.5) + : boxShadow([0, 0], [0, 3.2], white.main, 0.5), + }, + + "&:disabled": { + backgroundColor: backgroundValue, + color: focusedColorValue, + }, + }; + }; + + // styles for the button with variant="outlined" + const outlinedStyles = () => + { + // background color value + const backgroundValue = color === "white" ? rgba(white.main, 0.1) : transparent.main; + + // color value + const colorValue = palette[color] ? palette[color].main : white.main; + + // boxShadow value + const boxShadowValue = palette[color] + ? boxShadow([0, 0], [0, 3.2], palette[color].main, 0.5) + : boxShadow([0, 0], [0, 3.2], white.main, 0.5); + + // border color value + let borderColorValue = palette[color] ? palette[color].main : rgba(white.main, 0.75); + + if (color === "white") + { + borderColorValue = rgba(white.main, 0.75); + } + + return { + background: backgroundValue, + color: colorValue, + border: `${pxToRem(1)} solid ${borderColorValue}`, + + "&:hover": { + background: transparent.main, + color: colorValue, + borderColor: colorValue, + opacity: 0.85, + }, + + "&:focus:not(:hover)": { + background: transparent.main, + color: colorValue, + boxShadow: boxShadowValue, + }, + + "&:active:not(:hover)": { + backgroundColor: colorValue, + color: white.main, + opacity: 0.85, + }, + + "&:disabled": { + color: colorValue, + borderColor: colorValue, + }, + }; + }; + + // styles for the button with variant="gradient" + const gradientStyles = () => + { + // background value + const backgroundValue = + color === "white" || !gradients[color] + ? white.main + : linearGradient(gradients[color].main, gradients[color].state); + + // boxShadow value + const boxShadowValue = colored[color] + ? `${boxShadow([0, 3], [3, 0], palette[color].main, 0.15)}, ${boxShadow( + [0, 3], + [1, -2], + palette[color].main, + 0.2 + )}, ${boxShadow([0, 1], [5, 0], palette[color].main, 0.15)}` + : "none"; + + // boxShadow value when button is hovered + const hoveredBoxShadowValue = colored[color] + ? `${boxShadow([0, 14], [26, -12], palette[color].main, 0.4)}, ${boxShadow( + [0, 4], + [23, 0], + palette[color].main, + 0.15 + )}, ${boxShadow([0, 8], [10, -5], palette[color].main, 0.2)}` + : "none"; + + // color value + let colorValue = white.main; + + if (color === "white") + { + colorValue = text.main; + } + else if (color === "light") + { + colorValue = gradients.dark.state; + } + + return { + background: backgroundValue, + color: colorValue, + boxShadow: boxShadowValue, + + "&:hover": { + boxShadow: hoveredBoxShadowValue, + color: colorValue, + }, + + "&:focus:not(:hover)": { + boxShadow: boxShadowValue, + color: colorValue, + }, + + "&:disabled": { + background: backgroundValue, + color: colorValue, + }, + }; + }; + + // styles for the button with variant="text" + const textStyles = () => + { + // color value + const colorValue = palette[color] ? palette[color].main : white.main; + + // color value when button is focused + const focusedColorValue = palette[color] ? palette[color].focus : white.focus; + + return { + color: colorValue, + + "&:hover": { + color: focusedColorValue, + }, + + "&:focus:not(:hover)": { + color: focusedColorValue, + }, + }; + }; + + // styles for the button with circular={true} + const circularStyles = () => ({ + borderRadius: borderRadius.section, + }); + + // styles for the button with iconOnly={true} + const iconOnlyStyles = () => + { + // width, height, minWidth and minHeight values + let sizeValue = pxToRem(38); + + if (size === "small") + { + sizeValue = pxToRem(25.4); + } + else if (size === "large") + { + sizeValue = pxToRem(52); + } + + // padding value + let paddingValue = `${pxToRem(11)} ${pxToRem(11)} ${pxToRem(10)}`; + + if (size === "small") + { + paddingValue = pxToRem(4.5); + } + else if (size === "large") + { + paddingValue = pxToRem(16); + } + + return { + width: sizeValue, + minWidth: sizeValue, + height: sizeValue, + minHeight: sizeValue, + padding: paddingValue, + + "& .material-icons": { + marginTop: 0, + }, + + "&:hover, &:focus, &:active": { + transform: "none", + }, + }; + }; + + return { + ...(variant === "contained" && containedStyles()), + ...(variant === "outlined" && outlinedStyles()), + ...(variant === "gradient" && gradientStyles()), + ...(variant === "text" && textStyles()), + ...(circular && circularStyles()), + ...(iconOnly && iconOnlyStyles()), + }; +}); diff --git a/src/qqq/components/Temporary/MDButton/index.tsx b/src/qqq/components/Temporary/MDButton/index.tsx new file mode 100644 index 0000000..92283ed --- /dev/null +++ b/src/qqq/components/Temporary/MDButton/index.tsx @@ -0,0 +1,75 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {ButtonProps} from "@mui/material"; +import {FC, ReactNode, forwardRef} from "react"; +import {useMaterialUIController} from "context"; +import MDButtonRoot from "qqq/components/Temporary/MDButton/MDButtonRoot"; + +// Declaring props types for MDButton +export interface Props extends Omit { + color?: + | "white" + | "primary" + | "secondary" + | "info" + | "success" + | "warning" + | "error" + | "light" + | "dark" + | "default"; + variant?: "text" | "contained" | "outlined" | "gradient"; + size?: "small" | "medium" | "large"; + circular?: boolean; + iconOnly?: boolean; + children?: ReactNode; + [key: string]: any; +} + +const MDButton: FC = forwardRef( + ({color, variant, size, circular, iconOnly, children, ...rest}, ref) => + { + const [controller] = useMaterialUIController(); + const {darkMode} = controller; + + return ( + + {children} + + ); + } +); + +// Declaring default props for MDButton +MDButton.defaultProps = { + color: "white", + variant: "contained", + size: "medium", + circular: false, + iconOnly: false, +}; + +export default MDButton; diff --git a/src/qqq/components/Temporary/MDInput/MDInputRoot.tsx b/src/qqq/components/Temporary/MDInput/MDInputRoot.tsx new file mode 100644 index 0000000..9c05184 --- /dev/null +++ b/src/qqq/components/Temporary/MDInput/MDInputRoot.tsx @@ -0,0 +1,77 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {styled, Theme} from "@mui/material/styles"; +import TextField from "@mui/material/TextField"; + +export default styled(TextField)(({theme, ownerState}: { theme?: Theme; ownerState: any }) => +{ + const {palette, functions} = theme; + const {error, success, disabled} = ownerState; + + const {grey, transparent, error: colorError, success: colorSuccess} = palette; + const {pxToRem} = functions; + + // styles for the input with error={true} + const errorStyles = () => ({ + backgroundImage: + "url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23F44335' viewBox='0 0 12 12'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23F44335' stroke='none'/%3E%3C/svg%3E\")", + backgroundRepeat: "no-repeat", + backgroundPosition: `right ${pxToRem(12)} center`, + backgroundSize: `${pxToRem(16)} ${pxToRem(16)}`, + + "& .Mui-focused": { + "& .MuiOutlinedInput-notchedOutline, &:after": { + borderColor: colorError.main, + }, + }, + + "& .MuiInputLabel-root.Mui-focused": { + color: colorError.main, + }, + }); + + // styles for the input with success={true} + const successStyles = () => ({ + backgroundImage: + "url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 8'%3E%3Cpath fill='%234CAF50' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E\")", + backgroundRepeat: "no-repeat", + backgroundPosition: `right ${pxToRem(12)} center`, + backgroundSize: `${pxToRem(16)} ${pxToRem(16)}`, + + "& .Mui-focused": { + "& .MuiOutlinedInput-notchedOutline, &:after": { + borderColor: colorSuccess.main, + }, + }, + + "& .MuiInputLabel-root.Mui-focused": { + color: colorSuccess.main, + }, + }); + + return { + backgroundColor: disabled ? `${grey[200]} !important` : transparent.main, + pointerEvents: disabled ? "none" : "auto", + ...(error && errorStyles()), + ...(success && successStyles()), + }; +}); diff --git a/src/qqq/components/Temporary/MDInput/index.tsx b/src/qqq/components/Temporary/MDInput/index.tsx new file mode 100644 index 0000000..97af216 --- /dev/null +++ b/src/qqq/components/Temporary/MDInput/index.tsx @@ -0,0 +1,44 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {OutlinedTextFieldProps, StandardTextFieldProps} from "@mui/material"; +import {FC, forwardRef} from "react"; +import MDInputRoot from "qqq/components/Temporary/MDInput/MDInputRoot"; + +interface Props extends Omit { + variant?: "standard" | "outlined"; + error?: boolean; + success?: boolean; + disabled?: boolean; +} + +const MDInput: FC = forwardRef(({error, success, disabled, ...rest}, ref) => ( + +)); + +// Declaring default props for MDInput +MDInput.defaultProps = { + error: false, + success: false, + disabled: false, +}; + +export default MDInput; diff --git a/src/qqq/components/Temporary/MDTypography/MDTypographyRoot.tsx b/src/qqq/components/Temporary/MDTypography/MDTypographyRoot.tsx new file mode 100644 index 0000000..e5c573e --- /dev/null +++ b/src/qqq/components/Temporary/MDTypography/MDTypographyRoot.tsx @@ -0,0 +1,74 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {styled} from "@mui/material/styles"; +import Typography from "@mui/material/Typography"; + +export default styled(Typography)(({theme, ownerState}: any): any => +{ + const {palette, typography, functions}: any = theme; + const {color, textTransform, verticalAlign, fontWeight, opacity, textGradient, darkMode} = + ownerState; + + const {gradients, transparent, white} = palette; + const {fontWeightLight, fontWeightRegular, fontWeightMedium, fontWeightBold} = typography; + const {linearGradient} = functions; + + // fontWeight styles + const fontWeights: { [key: string]: number } = { + light: fontWeightLight, + regular: fontWeightRegular, + medium: fontWeightMedium, + bold: fontWeightBold, + }; + + // styles for the typography with textGradient={true} + const gradientStyles = () => ({ + backgroundImage: + color !== "inherit" && color !== "text" && color !== "white" && gradients[color] + ? linearGradient(gradients[color].main, gradients[color].state) + : linearGradient(gradients.dark.main, gradients.dark.state), + display: "inline-block", + WebkitBackgroundClip: "text", + WebkitTextFillColor: transparent.main, + position: "relative", + zIndex: 1, + }); + + // color value + let colorValue = color === "inherit" || !palette[color] ? "inherit" : palette[color].main; + + if (darkMode && (color === "inherit" || !palette[color])) + { + colorValue = "inherit"; + } + else if (darkMode && color === "dark") colorValue = white.main; + + return { + opacity, + textTransform, + verticalAlign, + textDecoration: "none", + color: colorValue, + fontWeight: fontWeights[fontWeight] && fontWeights[fontWeight], + ...(textGradient && gradientStyles()), + }; +}); diff --git a/src/qqq/components/Temporary/MDTypography/index.tsx b/src/qqq/components/Temporary/MDTypography/index.tsx new file mode 100644 index 0000000..f970a1a --- /dev/null +++ b/src/qqq/components/Temporary/MDTypography/index.tsx @@ -0,0 +1,100 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {TypographyProps} from "@mui/material"; +import {FC, ReactNode, forwardRef} from "react"; +import {useMaterialUIController} from "context"; +import MDTypographyRoot from "qqq/components/Temporary/MDTypography/MDTypographyRoot"; + +// Declaring props types for MDTypography +interface Props extends TypographyProps +{ + color?: + | "inherit" + | "primary" + | "secondary" + | "info" + | "success" + | "warning" + | "error" + | "light" + | "dark" + | "text" + | "white"; + fontWeight?: "light" | "regular" | "medium" | "bold" | undefined; + textTransform?: "none" | "capitalize" | "uppercase" | "lowercase"; + verticalAlign?: + | "unset" + | "baseline" + | "sub" + | "super" + | "text-top" + | "text-bottom" + | "middle" + | "top" + | "bottom"; + textGradient?: boolean; + children: ReactNode; + opacity?: number; + + [key: string]: any; +} + +const MDTypography: FC = forwardRef( + ( + {color, fontWeight, textTransform, verticalAlign, textGradient, opacity, children, ...rest}, + ref + ) => + { + const [controller] = useMaterialUIController(); + const {darkMode} = controller; + + return ( + + {children} + + ); + } +); + +// Declaring default props for MDTypography +MDTypography.defaultProps = { + color: "dark", + fontWeight: undefined, + textTransform: "none", + verticalAlign: "unset", + textGradient: false, + opacity: 1, +}; + +export default MDTypography; diff --git a/src/qqq/components/Temporary/MiniStatisticsCard/index.tsx b/src/qqq/components/Temporary/MiniStatisticsCard/index.tsx new file mode 100644 index 0000000..9d24dcd --- /dev/null +++ b/src/qqq/components/Temporary/MiniStatisticsCard/index.tsx @@ -0,0 +1,162 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Card from "@mui/material/Card"; +import Grid from "@mui/material/Grid"; +import Icon from "@mui/material/Icon"; +import {ReactNode} from "react"; +import {useMaterialUIController} from "context"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; + +// Decalaring props types for MiniStatisticsCard +interface Props { + bgColor?: "white" | "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark"; + title?: { + fontWeight?: "light" | "regular" | "medium" | "bold"; + text?: string; + }; + count: string | number; + percentage?: { + color: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark" | "white"; + text: string | number; + }; + icon: { + color: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark"; + component: ReactNode; + }; + direction?: "right" | "left"; + [key: string]: any; +} + +function MiniStatisticsCard({ + bgColor, + title, + count, + percentage, + icon, + direction, +}: Props): JSX.Element +{ + const [controller] = useMaterialUIController(); + const {darkMode} = controller; + + return ( + + ({ + background: darkMode && background.card, + })} + > + + + {direction === "left" ? ( + + + + {icon.component} + + + + ) : null} + + + + {title.text} + + + {count}{" "} + + {percentage.text} + + + + + {direction === "right" ? ( + + + + {icon.component} + + + + ) : null} + + + + + ); +} + +// Declaring default props for MiniStatisticsCard +MiniStatisticsCard.defaultProps = { + bgColor: "white", + title: { + fontWeight: "light", + text: "", + }, + percentage: { + color: "success", + text: "", + }, + direction: "right", +}; + +export default MiniStatisticsCard; diff --git a/src/qqq/components/Temporary/NotificationItem/index.tsx b/src/qqq/components/Temporary/NotificationItem/index.tsx new file mode 100644 index 0000000..b17f591 --- /dev/null +++ b/src/qqq/components/Temporary/NotificationItem/index.tsx @@ -0,0 +1,50 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {MenuItemProps} from "@mui/material"; +import Link from "@mui/material/Link"; +import MenuItem from "@mui/material/MenuItem"; +import {forwardRef, FC, ReactNode} from "react"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; +import menuItem from "qqq/components/Temporary/NotificationItem/styles"; + +// Declaring props types for NotificationItem +interface Props extends MenuItemProps { + icon: ReactNode; + title: string; + [key: string]: any; +} + +const NotificationItem : FC = forwardRef(({icon, title, ...rest}, ref) => ( + menuItem(theme)}> + + + {icon} + + + {title} + + + +)); + +export default NotificationItem; diff --git a/src/qqq/components/Temporary/NotificationItem/styles.ts b/src/qqq/components/Temporary/NotificationItem/styles.ts new file mode 100644 index 0000000..62091f6 --- /dev/null +++ b/src/qqq/components/Temporary/NotificationItem/styles.ts @@ -0,0 +1,60 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {Theme} from "@mui/material/styles"; + +function menuItem(theme: Theme) +{ + const {palette, borders, transitions} = theme; + + const {secondary, light, dark} = palette; + const {borderRadius} = borders; + + return { + display: "flex", + alignItems: "center", + width: "100%", + color: secondary.main, + borderRadius: borderRadius.md, + transition: transitions.create("background-color", { + easing: transitions.easing.easeInOut, + duration: transitions.duration.standard, + }), + + "& *": { + transition: "color 100ms linear", + }, + + "&:not(:last-child)": { + mb: 1, + }, + + "&:hover": { + backgroundColor: light.main, + + "& *": { + color: dark.main, + }, + }, + }; +} + +export default menuItem; diff --git a/src/qqq/components/Temporary/Theme.ts b/src/qqq/components/Temporary/Theme.ts new file mode 100644 index 0000000..c7084e1 --- /dev/null +++ b/src/qqq/components/Temporary/Theme.ts @@ -0,0 +1,159 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import {createTheme} from "@mui/material"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; +import breakpoints from "assets/theme/base/breakpoints"; +import colors from "assets/theme/base/colors"; +import globals from "assets/theme/base/globals"; +import typography from "assets/theme/base/typography"; +import appBar from "assets/theme/components/appBar"; +import avatar from "assets/theme/components/avatar"; +import breadcrumbs from "assets/theme/components/breadcrumbs"; +import button from "assets/theme/components/button"; +import buttonBase from "assets/theme/components/buttonBase"; +import card from "assets/theme/components/card"; +import cardContent from "assets/theme/components/card/cardContent"; +import cardMedia from "assets/theme/components/card/cardMedia"; +import container from "assets/theme/components/container"; +import dialog from "assets/theme/components/dialog"; +import dialogActions from "assets/theme/components/dialog/dialogActions"; +import dialogContent from "assets/theme/components/dialog/dialogContent"; +import dialogContentText from "assets/theme/components/dialog/dialogContentText"; +import dialogTitle from "assets/theme/components/dialog/dialogTitle"; +import divider from "assets/theme/components/divider"; +import flatpickr from "assets/theme/components/flatpickr"; +import autocomplete from "assets/theme/components/form/autocomplete"; +import checkbox from "assets/theme/components/form/checkbox"; +import formControlLabel from "assets/theme/components/form/formControlLabel"; +import formLabel from "assets/theme/components/form/formLabel"; +import input from "assets/theme/components/form/input"; +import inputLabel from "assets/theme/components/form/inputLabel"; +import inputOutlined from "assets/theme/components/form/inputOutlined"; +import radio from "assets/theme/components/form/radio"; +import select from "assets/theme/components/form/select"; +import switchButton from "assets/theme/components/form/switchButton"; +import textField from "assets/theme/components/form/textField"; +import icon from "assets/theme/components/icon"; +import iconButton from "assets/theme/components/iconButton"; +import linearProgress from "assets/theme/components/linearProgress"; +import link from "assets/theme/components/link"; +import list from "assets/theme/components/list"; +import listItem from "assets/theme/components/list/listItem"; +import listItemText from "assets/theme/components/list/listItemText"; +import menu from "assets/theme/components/menu"; +import menuItem from "assets/theme/components/menu/menuItem"; +import popover from "assets/theme/components/popover"; +import sidenav from "assets/theme/components/sidenav"; +import slider from "assets/theme/components/slider"; +import stepper from "assets/theme/components/stepper"; +import step from "assets/theme/components/stepper/step"; +import stepConnector from "assets/theme/components/stepper/stepConnector"; +import stepIcon from "assets/theme/components/stepper/stepIcon"; +import stepLabel from "assets/theme/components/stepper/stepLabel"; +import svgIcon from "assets/theme/components/svgIcon"; +import tableCell from "assets/theme/components/table/tableCell"; +import tableContainer from "assets/theme/components/table/tableContainer"; +import tableHead from "assets/theme/components/table/tableHead"; +import tabs from "assets/theme/components/tabs"; +import tab from "assets/theme/components/tabs/tab"; +import tooltip from "assets/theme/components/tooltip"; +import boxShadow from "assets/theme/functions/boxShadow"; +import hexToRgb from "assets/theme/functions/hexToRgb"; +import linearGradient from "assets/theme/functions/linearGradient"; +import pxToRem from "assets/theme/functions/pxToRem"; +import rgba from "assets/theme/functions/rgba"; + +export default createTheme({ + breakpoints: {...breakpoints}, + palette: {...colors}, + typography: {...typography}, + boxShadows: {...boxShadows}, + borders: {...borders}, + functions: { + boxShadow, + hexToRgb, + linearGradient, + pxToRem, + rgba, + }, + + components: { + MuiCssBaseline: { + + styleOverrides: { + ...globals, + ...flatpickr, + ...container, + }, + }, + MuiDrawer: {...sidenav}, + MuiList: {...list}, + MuiListItem: {...listItem}, + MuiListItemText: {...listItemText}, + MuiCard: {...card}, + MuiCardMedia: {...cardMedia}, + MuiCardContent: {...cardContent}, + MuiButton: {...button}, + MuiIconButton: {...iconButton}, + MuiInput: {...input}, + MuiInputLabel: {...inputLabel}, + MuiOutlinedInput: {...inputOutlined}, + MuiTextField: {...textField}, + MuiMenu: {...menu}, + MuiMenuItem: {...menuItem}, + MuiSwitch: {...switchButton}, + MuiDivider: {...divider}, + MuiTableContainer: {...tableContainer}, + MuiTableHead: {...tableHead}, + MuiTableCell: {...tableCell}, + MuiLinearProgress: {...linearProgress}, + MuiBreadcrumbs: {...breadcrumbs}, + MuiSlider: {...slider}, + MuiAvatar: {...avatar}, + MuiTooltip: {...tooltip}, + MuiAppBar: {...appBar}, + MuiTabs: {...tabs}, + MuiTab: {...tab}, + MuiStepper: {...stepper}, + MuiStep: {...step}, + MuiStepConnector: {...stepConnector}, + MuiStepLabel: {...stepLabel}, + MuiStepIcon: {...stepIcon}, + MuiSelect: {...select}, + MuiFormControlLabel: {...formControlLabel}, + MuiFormLabel: {...formLabel}, + MuiCheckbox: {...checkbox}, + MuiRadio: {...radio}, + MuiAutocomplete: {...autocomplete}, + MuiPopover: {...popover}, + MuiButtonBase: {...buttonBase}, + MuiIcon: {...icon}, + MuiSvgIcon: {...svgIcon}, + MuiLink: {...link}, + MuiDialog: {...dialog}, + MuiDialogTitle: {...dialogTitle}, + MuiDialogContent: {...dialogContent}, + MuiDialogContentText: {...dialogContentText}, + MuiDialogActions: {...dialogActions}, + }, +}); diff --git a/src/qqq/components/Temporary/Theme/base/borders.ts b/src/qqq/components/Temporary/Theme/base/borders.ts new file mode 100644 index 0000000..9e579da --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/borders.ts @@ -0,0 +1,75 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + * The base border styles for the Material Dashboard 2 PRO React TSUI Dashboard PRO Material. + * You can add new border width, border color or border radius using this file. + * You can customized the borders value for the entire Material Dashboard 2 PRO React TSUI Dashboard PRO Material using thie file. + */ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { grey } = colors; + +// types +interface Types { + borderColor: string; + borderWidth: { + 0: number; + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + }; + borderRadius: { + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + xxl: string; + section: string; + }; +} + +const borders: Types = { + borderColor: grey[300], + + borderWidth: { + 0: 0, + 1: pxToRem(1), + 2: pxToRem(2), + 3: pxToRem(3), + 4: pxToRem(4), + 5: pxToRem(5), + }, + + borderRadius: { + xs: pxToRem(1.6), + sm: pxToRem(2), + md: pxToRem(6), + lg: pxToRem(8), + xl: pxToRem(12), + xxl: pxToRem(16), + section: pxToRem(160), + }, +}; + +export default borders; diff --git a/src/qqq/components/Temporary/Theme/base/boxShadows.ts b/src/qqq/components/Temporary/Theme/base/boxShadows.ts new file mode 100644 index 0000000..4fc58ab --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/boxShadows.ts @@ -0,0 +1,148 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + * The base box-shadow styles for the Material Dashboard 2 PRO React TSUI Dashboard PRO Material. + * You can add new box-shadow using this file. + * You can customized the box-shadow for the entire Material Dashboard 2 PRO React TSUI Dashboard PRO Material using thie file. + */ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import boxShadow from "assets/theme/functions/boxShadow"; + +const { black, white, tabs, coloredShadows } = colors; + +// types +interface Types { + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + xxl: string; + inset: string; + colored: + | { + primary: string; + secondary: string; + info: string; + success: string; + warning: string; + error: string; + light: string; + dark: string; + } + | any; + navbarBoxShadow: string; + sliderBoxShadow: { + thumb: string; + }; + tabsBoxShadow: { + indicator: string; + }; +} + +const boxShadows: Types = { + xs: boxShadow([0, 2], [9, -5], black.main, 0.15), + sm: boxShadow([0, 5], [10, 0], black.main, 0.12), + md: `${boxShadow([0, 4], [6, -1], black.main, 0.1)}, ${boxShadow( + [0, 2], + [4, -1], + black.main, + 0.06 + )}`, + lg: `${boxShadow([0, 10], [15, -3], black.main, 0.1)}, ${boxShadow( + [0, 4], + [6, -2], + black.main, + 0.05 + )}`, + xl: `${boxShadow([0, 20], [25, -5], black.main, 0.1)}, ${boxShadow( + [0, 10], + [10, -5], + black.main, + 0.04 + )}`, + xxl: boxShadow([0, 20], [27, 0], black.main, 0.05), + inset: boxShadow([0, 1], [2, 0], black.main, 0.075, "inset"), + colored: { + primary: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.primary, + 0.4 + )}`, + secondary: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.secondary, + 0.4 + )}`, + info: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.info, + 0.4 + )}`, + success: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.success, + 0.4 + )}`, + warning: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.warning, + 0.4 + )}`, + error: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.error, + 0.4 + )}`, + light: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.light, + 0.4 + )}`, + dark: `${boxShadow([0, 4], [20, 0], black.main, 0.14)}, ${boxShadow( + [0, 7], + [10, -5], + coloredShadows.dark, + 0.4 + )}`, + }, + + navbarBoxShadow: `${boxShadow([0, 0], [1, 1], white.main, 0.9, "inset")}, ${boxShadow( + [0, 20], + [27, 0], + black.main, + 0.05 + )}`, + sliderBoxShadow: { + thumb: boxShadow([0, 1], [13, 0], black.main, 0.2), + }, + tabsBoxShadow: { + indicator: boxShadow([0, 1], [5, 1], tabs.indicator.boxShadow, 1), + }, +}; + +export default boxShadows; diff --git a/src/qqq/components/Temporary/Theme/base/breakpoints.ts b/src/qqq/components/Temporary/Theme/base/breakpoints.ts new file mode 100644 index 0000000..5d3fef5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/breakpoints.ts @@ -0,0 +1,33 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + * The base breakpoints for the Material Dashboard 2 PRO React TSUI Dashboard PRO Material. + * You can add new breakpoints using this file. + * You can customized the breakpoints for the entire Material Dashboard 2 PRO React TSUI Dashboard PRO Material using thie file. + */ + +const breakpoints = { + values: { + xs: 0, + sm: 576, + md: 768, + lg: 992, + xl: 1200, + xxl: 1400, + }, +}; + +export default breakpoints; diff --git a/src/qqq/components/Temporary/Theme/base/colors.ts b/src/qqq/components/Temporary/Theme/base/colors.ts new file mode 100644 index 0000000..ee6fae7 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/colors.ts @@ -0,0 +1,389 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + * The base colors for the Material Dashboard 2 PRO React TSUI Dashboard PRO Material. + * You can add new color using this file. + * You can customized the colors for the entire Material Dashboard 2 PRO React TSUI Dashboard PRO Material using thie file. + */ + +// types +interface ColorsTypes { + main: string; + focus: string; +} + +interface GradientsTypes { + main: string; + state: string; +} + +interface SocialMediaColorsTypes { + main: string; + dark: string; +} + +interface BadgeColorsTypes { + background: string; + text: string; +} + +interface Types { + background: + | { + default: string; + sidenav?: string; + card?: string; + } + | any; + white: + | { + main: string; + focus: string; + } + | any; + text: + | { + main: string; + focus: string; + primary?: string; + secondary?: string; + disabled?: string; + } + | any; + transparent: + | { + main: string; + } + | any; + black: + | { + light: string; + main: string; + focus: string; + } + | any; + primary: ColorsTypes | any; + secondary: ColorsTypes | any; + info: ColorsTypes | any; + success: ColorsTypes | any; + warning: ColorsTypes | any; + error: ColorsTypes | any; + light: ColorsTypes | any; + dark: ColorsTypes | any; + grey: + | { + [key: string | number]: string; + } + | any; + gradients: + | { + primary: GradientsTypes; + secondary: GradientsTypes; + info: GradientsTypes; + success: GradientsTypes; + warning: GradientsTypes; + error: GradientsTypes; + light: GradientsTypes; + dark: GradientsTypes; + } + | any; + socialMediaColors: + | { + facebook: SocialMediaColorsTypes; + twitter: SocialMediaColorsTypes; + instagram: SocialMediaColorsTypes; + linkedin: SocialMediaColorsTypes; + pinterest: SocialMediaColorsTypes; + youtube: SocialMediaColorsTypes; + vimeo: SocialMediaColorsTypes; + slack: SocialMediaColorsTypes; + dribbble: SocialMediaColorsTypes; + github: SocialMediaColorsTypes; + reddit: SocialMediaColorsTypes; + tumblr: SocialMediaColorsTypes; + } + | any; + badgeColors: + | { + primary: BadgeColorsTypes; + secondary: BadgeColorsTypes; + info: BadgeColorsTypes; + success: BadgeColorsTypes; + warning: BadgeColorsTypes; + error: BadgeColorsTypes; + light: BadgeColorsTypes; + dark: BadgeColorsTypes; + } + | any; + coloredShadows: + | { + [key: string]: string; + } + | any; + inputBorderColor: string; + tabs: + | { + indicator: + | { + boxShadow: string; + } + | any; + } + | any; +} + +const colors: Types = { + background: { + default: "#f0f2f5", + }, + + text: { + main: "#7b809a", + focus: "#7b809a", + }, + + transparent: { + main: "transparent", + }, + + white: { + main: "#ffffff", + focus: "#ffffff", + }, + + black: { + light: "#000000", + main: "#000000", + focus: "#000000", + }, + + primary: { + main: "#e91e63", + focus: "#e91e63", + }, + + secondary: { + main: "#7b809a", + focus: "#8f93a9", + }, + + info: { + main: "#04aaef", + focus: "#1662C4", + }, + + success: { + main: "#4CAF50", + focus: "#67bb6a", + }, + + warning: { + main: "#fb8c00", + focus: "#fc9d26", + }, + + error: { + main: "#F44335", + focus: "#f65f53", + }, + + light: { + main: "#f0f2f5", + focus: "#f0f2f5", + }, + + dark: { + main: "#344767", + focus: "#2c3c58", + }, + + grey: { + 100: "#f8f9fa", + 200: "#f0f2f5", + 300: "#dee2e6", + 400: "#ced4da", + 500: "#adb5bd", + 600: "#6c757d", + 700: "#495057", + 800: "#343a40", + 900: "#212529", + }, + + gradients: { + primary: { + main: "#EC407A", + state: "#D81B60", + }, + + secondary: { + main: "#747b8a", + state: "#495361", + }, + + info: { + main: "#49a3f1", + state: "#04aaef", + }, + + success: { + main: "#66BB6A", + state: "#43A047", + }, + + warning: { + main: "#FFA726", + state: "#FB8C00", + }, + + error: { + main: "#EF5350", + state: "#E53935", + }, + + light: { + main: "#EBEFF4", + state: "#CED4DA", + }, + + dark: { + main: "#42424a", + state: "#191919", + }, + }, + + socialMediaColors: { + facebook: { + main: "#3b5998", + dark: "#344e86", + }, + + twitter: { + main: "#55acee", + dark: "#3ea1ec", + }, + + instagram: { + main: "#125688", + dark: "#0e456d", + }, + + linkedin: { + main: "#0077b5", + dark: "#00669c", + }, + + pinterest: { + main: "#cc2127", + dark: "#b21d22", + }, + + youtube: { + main: "#e52d27", + dark: "#d41f1a", + }, + + vimeo: { + main: "#1ab7ea", + dark: "#13a3d2", + }, + + slack: { + main: "#3aaf85", + dark: "#329874", + }, + + dribbble: { + main: "#ea4c89", + dark: "#e73177", + }, + + github: { + main: "#24292e", + dark: "#171a1d", + }, + + reddit: { + main: "#ff4500", + dark: "#e03d00", + }, + + tumblr: { + main: "#35465c", + dark: "#2a3749", + }, + }, + + badgeColors: { + primary: { + background: "#f8b3ca", + text: "#cc084b", + }, + + secondary: { + background: "#d7d9e1", + text: "#6c757d", + }, + + info: { + background: "#aecef7", + text: "#095bc6", + }, + + success: { + background: "#bce2be", + text: "#339537", + }, + + warning: { + background: "#ffd59f", + text: "#c87000", + }, + + error: { + background: "#fcd3d0", + text: "#f61200", + }, + + light: { + background: "#ffffff", + text: "#c7d3de", + }, + + dark: { + background: "#8097bf", + text: "#1e2e4a", + }, + }, + + coloredShadows: { + primary: "#e91e62", + secondary: "#110e0e", + info: "#00bbd4", + success: "#4caf4f", + warning: "#ff9900", + error: "#f44336", + light: "#adb5bd", + dark: "#404040", + }, + + inputBorderColor: "#d2d6da", + + tabs: { + indicator: { boxShadow: "#ddd" }, + }, +}; + +export default colors; diff --git a/src/qqq/components/Temporary/Theme/base/globals.ts b/src/qqq/components/Temporary/Theme/base/globals.ts new file mode 100644 index 0000000..f392c56 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/globals.ts @@ -0,0 +1,41 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +const { info, dark } = colors; + +const globals = { + html: { + scrollBehavior: "smooth", + }, + "*, *::before, *::after": { + margin: 0, + padding: 0, + }, + "a, a:link, a:visited": { + textDecoration: "none !important", + }, + "a.link, .link, a.link:link, .link:link, a.link:visited, .link:visited": { + color: `${dark.main} !important`, + transition: "color 150ms ease-in !important", + }, + "a.link:hover, .link:hover, a.link:focus, .link:focus": { + color: `${info.main} !important`, + }, +}; + +export default globals; diff --git a/src/qqq/components/Temporary/Theme/base/typography.ts b/src/qqq/components/Temporary/Theme/base/typography.ts new file mode 100644 index 0000000..cce492b --- /dev/null +++ b/src/qqq/components/Temporary/Theme/base/typography.ts @@ -0,0 +1,320 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + * The base typography styles for the Material Dashboard 2 PRO React TSUI Dashboard PRO Material. + * You can add new typography style using this file. + * You can customized the typography styles for the entire Material Dashboard 2 PRO React TSUI Dashboard PRO Material using thie file. + */ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { dark } = colors; + +// types +interface DisplayTypes { + fontFamily: string; + color: string; + fontWeight: number; + lineHeight: number; + fontSize: string; +} + +interface Types { + fontFamily: string; + fontWeightLighter: number; + fontWeightLight: number; + fontWeightRegular: number; + fontWeightMedium: number; + fontWeightBold: number; + h1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h3: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h4: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h5: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h6: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + subtitle1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + subtitle2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + body1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + body2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + button: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + textTransform: any; + }; + caption: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + overline: { + fontFamily: string; + }; + d1: DisplayTypes; + d2: DisplayTypes; + d3: DisplayTypes; + d4: DisplayTypes; + d5: DisplayTypes; + d6: DisplayTypes; + size: { + xxs: string; + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + "2xl": string; + "3xl": string; + }; + lineHeight: { + sm: number; + md: number; + lg: number; + }; +} + +const baseProperties = { + fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif', + fontWeightLighter: 100, + fontWeightLight: 300, + fontWeightRegular: 400, + fontWeightMedium: 600, + fontWeightBold: 700, + fontSizeXXS: pxToRem(10.4), + fontSizeXS: pxToRem(12), + fontSizeSM: pxToRem(14), + fontSizeMD: pxToRem(16), + fontSizeLG: pxToRem(18), + fontSizeXL: pxToRem(20), + fontSize2XL: pxToRem(24), + fontSize3XL: pxToRem(30), +}; + +const baseHeadingProperties = { + fontFamily: baseProperties.fontFamily, + color: dark.main, + fontWeight: baseProperties.fontWeightBold, +}; + +const baseDisplayProperties = { + fontFamily: baseProperties.fontFamily, + color: dark.main, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.2, +}; + +const typography: Types = { + fontFamily: baseProperties.fontFamily, + fontWeightLighter: baseProperties.fontWeightLighter, + fontWeightLight: baseProperties.fontWeightLight, + fontWeightRegular: baseProperties.fontWeightRegular, + fontWeightMedium: baseProperties.fontWeightMedium, + fontWeightBold: baseProperties.fontWeightBold, + + h1: { + fontSize: pxToRem(48), + lineHeight: 1.25, + ...baseHeadingProperties, + }, + + h2: { + fontSize: pxToRem(36), + lineHeight: 1.3, + ...baseHeadingProperties, + }, + + h3: { + fontSize: pxToRem(30), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h4: { + fontSize: pxToRem(24), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h5: { + fontSize: pxToRem(20), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h6: { + fontSize: pxToRem(16), + lineHeight: 1.625, + ...baseHeadingProperties, + }, + + subtitle1: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXL, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.625, + }, + + subtitle2: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeMD, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.6, + }, + + body1: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXL, + fontWeight: baseProperties.fontWeightRegular, + lineHeight: 1.625, + }, + + body2: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeMD, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.6, + }, + + button: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeSM, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.5, + textTransform: "uppercase", + }, + + caption: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXS, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.25, + }, + + overline: { + fontFamily: baseProperties.fontFamily, + }, + + d1: { + fontSize: pxToRem(80), + ...baseDisplayProperties, + }, + + d2: { + fontSize: pxToRem(72), + ...baseDisplayProperties, + }, + + d3: { + fontSize: pxToRem(64), + ...baseDisplayProperties, + }, + + d4: { + fontSize: pxToRem(56), + ...baseDisplayProperties, + }, + + d5: { + fontSize: pxToRem(48), + ...baseDisplayProperties, + }, + + d6: { + fontSize: pxToRem(40), + ...baseDisplayProperties, + }, + + size: { + xxs: baseProperties.fontSizeXXS, + xs: baseProperties.fontSizeXS, + sm: baseProperties.fontSizeSM, + md: baseProperties.fontSizeMD, + lg: baseProperties.fontSizeLG, + xl: baseProperties.fontSizeXL, + "2xl": baseProperties.fontSize2XL, + "3xl": baseProperties.fontSize3XL, + }, + + lineHeight: { + sm: 1.25, + md: 1.5, + lg: 2, + }, +}; + +export default typography; diff --git a/src/qqq/components/Temporary/Theme/components/appBar.ts b/src/qqq/components/Temporary/Theme/components/appBar.ts new file mode 100644 index 0000000..425e419 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/appBar.ts @@ -0,0 +1,31 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const appBar: Types = { + defaultProps: { + color: "transparent", + }, + + styleOverrides: { + root: { + boxShadow: "none", + }, + }, +}; + +export default appBar; diff --git a/src/qqq/components/Temporary/Theme/components/avatar.ts b/src/qqq/components/Temporary/Theme/components/avatar.ts new file mode 100644 index 0000000..8d4b469 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/avatar.ts @@ -0,0 +1,40 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; + +const { borderRadius } = borders; + +// types +type Types = any; + +const avatar: Types = { + styleOverrides: { + root: { + transition: "all 200ms ease-in-out", + }, + + rounded: { + borderRadius: borderRadius.lg, + }, + + img: { + height: "auto", + }, + }, +}; + +export default avatar; diff --git a/src/qqq/components/Temporary/Theme/components/breadcrumbs.ts b/src/qqq/components/Temporary/Theme/components/breadcrumbs.ts new file mode 100644 index 0000000..2df6924 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/breadcrumbs.ts @@ -0,0 +1,39 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +const { grey } = colors; +const { size } = typography; + +// types +type Types = any; + +const breadcrumbs: Types = { + styleOverrides: { + li: { + lineHeight: 0, + }, + + separator: { + fontSize: size.sm, + color: grey[600], + }, + }, +}; + +export default breadcrumbs; diff --git a/src/qqq/components/Temporary/Theme/components/button/contained.ts b/src/qqq/components/Temporary/Theme/components/button/contained.ts new file mode 100644 index 0000000..fb39334 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/button/contained.ts @@ -0,0 +1,91 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { white, text, info, secondary } = colors; +const { size } = typography; + +const contained = { + base: { + backgroundColor: white.main, + minHeight: pxToRem(40), + color: text.main, + padding: `${pxToRem(10)} ${pxToRem(24)}`, + + "&:hover": { + backgroundColor: white.main, + }, + + "&:active, &:active:focus, &:active:hover": { + opacity: 0.85, + }, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(16)} !important`, + }, + }, + + small: { + minHeight: pxToRem(32), + padding: `${pxToRem(6)} ${pxToRem(16)}`, + fontSize: size.xs, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(12)} !important`, + }, + }, + + large: { + minHeight: pxToRem(47), + padding: `${pxToRem(12)} ${pxToRem(28)}`, + fontSize: size.sm, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(22)} !important`, + }, + }, + + primary: { + backgroundColor: info.main, + + "&:hover": { + backgroundColor: info.main, + }, + + "&:focus:not(:hover)": { + backgroundColor: info.focus, + }, + }, + + secondary: { + backgroundColor: secondary.main, + + "&:hover": { + backgroundColor: secondary.main, + }, + + "&:focus:not(:hover)": { + backgroundColor: secondary.focus, + }, + }, +}; + +export default contained; diff --git a/src/qqq/components/Temporary/Theme/components/button/index.ts b/src/qqq/components/Temporary/Theme/components/button/index.ts new file mode 100644 index 0000000..69fadfc --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/button/index.ts @@ -0,0 +1,49 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React Button Styles +import root from "assets/theme/components/button/root"; +import contained from "assets/theme/components/button/contained"; +import outlined from "assets/theme/components/button/outlined"; +import text from "assets/theme/components/button/text"; + +// types +type Types = any; + +const button: Types = { + defaultProps: { + disableRipple: false, + }, + styleOverrides: { + root: { ...root }, + contained: { ...contained.base }, + containedSizeSmall: { ...contained.small }, + containedSizeLarge: { ...contained.large }, + containedPrimary: { ...contained.primary }, + containedSecondary: { ...contained.secondary }, + outlined: { ...outlined.base }, + outlinedSizeSmall: { ...outlined.small }, + outlinedSizeLarge: { ...outlined.large }, + outlinedPrimary: { ...outlined.primary }, + outlinedSecondary: { ...outlined.secondary }, + text: { ...text.base }, + textSizeSmall: { ...text.small }, + textSizeLarge: { ...text.large }, + textPrimary: { ...text.primary }, + textSecondary: { ...text.secondary }, + }, +}; + +export default button; diff --git a/src/qqq/components/Temporary/Theme/components/button/outlined.ts b/src/qqq/components/Temporary/Theme/components/button/outlined.ts new file mode 100644 index 0000000..c324a5d --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/button/outlined.ts @@ -0,0 +1,82 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { transparent, light, info, secondary } = colors; +const { size } = typography; + +const outlined = { + base: { + minHeight: pxToRem(40), + color: light.main, + borderColor: light.main, + padding: `${pxToRem(10)} ${pxToRem(24)}`, + + "&:hover": { + opacity: 0.75, + backgroundColor: transparent.main, + }, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(16)} !important`, + }, + }, + + small: { + minHeight: pxToRem(32), + padding: `${pxToRem(6)} ${pxToRem(16)}`, + fontSize: size.xs, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(12)} !important`, + }, + }, + + large: { + minHeight: pxToRem(47), + padding: `${pxToRem(12)} ${pxToRem(28)}`, + fontSize: size.sm, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(22)} !important`, + }, + }, + + primary: { + backgroundColor: transparent.main, + borderColor: info.main, + + "&:hover": { + backgroundColor: transparent.main, + }, + }, + + secondary: { + backgroundColor: transparent.main, + borderColor: secondary.main, + + "&:hover": { + backgroundColor: transparent.main, + }, + }, +}; + +export default outlined; diff --git a/src/qqq/components/Temporary/Theme/components/button/root.ts b/src/qqq/components/Temporary/Theme/components/button/root.ts new file mode 100644 index 0000000..a713dda --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/button/root.ts @@ -0,0 +1,53 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { fontWeightBold, size } = typography; +const { borderRadius } = borders; + +const root = { + display: "inline-flex", + justifyContent: "center", + alignItems: "center", + fontSize: size.xs, + fontWeight: fontWeightBold, + borderRadius: borderRadius.lg, + padding: `${pxToRem(6.302)} ${pxToRem(16.604)}`, + lineHeight: 1.4, + textAlign: "center", + textTransform: "uppercase", + userSelect: "none", + backgroundSize: "150% !important", + backgroundPositionX: "25% !important", + transition: "all 150ms ease-in", + + "&:disabled": { + pointerEvent: "none", + opacity: 0.65, + }, + + "& .material-icons": { + fontSize: pxToRem(15), + marginTop: pxToRem(-2), + }, +}; + +export default root; diff --git a/src/qqq/components/Temporary/Theme/components/button/text.ts b/src/qqq/components/Temporary/Theme/components/button/text.ts new file mode 100644 index 0000000..e4d295d --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/button/text.ts @@ -0,0 +1,104 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { text, info, secondary, transparent } = colors; +const { size } = typography; + +const buttonText = { + base: { + backgroundColor: transparent.main, + minHeight: pxToRem(40), + color: text.main, + boxShadow: "none", + padding: `${pxToRem(10)} ${pxToRem(24)}`, + + "&:hover": { + backgroundColor: transparent.main, + boxShadow: "none", + }, + + "&:focus": { + boxShadow: "none", + }, + + "&:active, &:active:focus, &:active:hover": { + opacity: 0.85, + boxShadow: "none", + }, + + "&:disabled": { + boxShadow: "none", + }, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(16)} !important`, + }, + }, + + small: { + minHeight: pxToRem(32), + padding: `${pxToRem(6)} ${pxToRem(16)}`, + fontSize: size.xs, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(12)} !important`, + }, + }, + + large: { + minHeight: pxToRem(47), + padding: `${pxToRem(12)} ${pxToRem(28)}`, + fontSize: size.sm, + + "& .material-icon, .material-icons-round, svg": { + fontSize: `${pxToRem(22)} !important`, + }, + }, + + primary: { + color: info.main, + + "&:hover": { + color: info.main, + }, + + "&:focus:not(:hover)": { + color: info.focus, + boxShadow: "none", + }, + }, + + secondary: { + color: secondary.main, + + "&:hover": { + color: secondary.main, + }, + + "&:focus:not(:hover)": { + color: secondary.focus, + boxShadow: "none", + }, + }, +}; + +export default buttonText; diff --git a/src/qqq/components/Temporary/Theme/components/buttonBase.ts b/src/qqq/components/Temporary/Theme/components/buttonBase.ts new file mode 100644 index 0000000..f91be4a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/buttonBase.ts @@ -0,0 +1,25 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const buttonBase: Types = { + defaultProps: { + disableRipple: false, + }, +}; + +export default buttonBase; diff --git a/src/qqq/components/Temporary/Theme/components/card/cardContent.ts b/src/qqq/components/Temporary/Theme/components/card/cardContent.ts new file mode 100644 index 0000000..9f02af3 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/card/cardContent.ts @@ -0,0 +1,32 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const cardContent: Types = { + styleOverrides: { + root: { + marginTop: 0, + marginBottom: 0, + padding: `${pxToRem(8)} ${pxToRem(24)} ${pxToRem(24)}`, + }, + }, +}; + +export default cardContent; diff --git a/src/qqq/components/Temporary/Theme/components/card/cardMedia.ts b/src/qqq/components/Temporary/Theme/components/card/cardMedia.ts new file mode 100644 index 0000000..da5843f --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/card/cardMedia.ts @@ -0,0 +1,40 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { borderRadius } = borders; + +// types +type Types = any; + +const cardMedia: Types = { + styleOverrides: { + root: { + borderRadius: borderRadius.xl, + margin: `${pxToRem(16)} ${pxToRem(16)} 0`, + }, + + media: { + width: "auto", + }, + }, +}; + +export default cardMedia; diff --git a/src/qqq/components/Temporary/Theme/components/card/index.ts b/src/qqq/components/Temporary/Theme/components/card/index.ts new file mode 100644 index 0000000..eb72fd7 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/card/index.ts @@ -0,0 +1,50 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +// Material Dashboard 2 PRO React Helper Function +import rgba from "assets/theme/functions/rgba"; + +const { black, white } = colors; +const { borderWidth, borderRadius } = borders; +const { md } = boxShadows; + +// types +// types +type Types = any; + +const card: Types = { + styleOverrides: { + root: { + display: "flex", + flexDirection: "column", + position: "relative", + minWidth: 0, + wordWrap: "break-word", + backgroundColor: white.main, + backgroundClip: "border-box", + border: `${borderWidth[0]} solid ${rgba(black.main, 0.125)}`, + borderRadius: borderRadius.xl, + boxShadow: md, + overflow: "visible", + }, + }, +}; + +export default card; diff --git a/src/qqq/components/Temporary/Theme/components/container.ts b/src/qqq/components/Temporary/Theme/components/container.ts new file mode 100644 index 0000000..c41d078 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/container.ts @@ -0,0 +1,77 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import breakpoints from "assets/theme/base/breakpoints"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const { + values: { sm, md, lg, xl, xxl }, +} = breakpoints; + +const SM = `@media (min-width: ${sm}px)`; +const MD = `@media (min-width: ${md}px)`; +const LG = `@media (min-width: ${lg}px)`; +const XL = `@media (min-width: ${xl}px)`; +const XXL = `@media (min-width: ${xxl}px)`; + +const sharedClasses = { + paddingRight: `${pxToRem(24)} !important`, + paddingLeft: `${pxToRem(24)} !important`, + marginRight: "auto !important", + marginLeft: "auto !important", + width: "100% !important", + position: "relative", +}; + +const container: Types = { + [SM]: { + ".MuiContainer-root": { + ...sharedClasses, + maxWidth: "540px !important", + }, + }, + [MD]: { + ".MuiContainer-root": { + ...sharedClasses, + maxWidth: "720px !important", + }, + }, + [LG]: { + ".MuiContainer-root": { + ...sharedClasses, + maxWidth: "960px !important", + }, + }, + [XL]: { + ".MuiContainer-root": { + ...sharedClasses, + maxWidth: "1140px !important", + }, + }, + [XXL]: { + ".MuiContainer-root": { + ...sharedClasses, + maxWidth: "1320px !important", + }, + }, +}; + +export default container; diff --git a/src/qqq/components/Temporary/Theme/components/dialog/dialogActions.ts b/src/qqq/components/Temporary/Theme/components/dialog/dialogActions.ts new file mode 100644 index 0000000..5d672f1 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/dialog/dialogActions.ts @@ -0,0 +1,30 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const dialogActions: Types = { + styleOverrides: { + root: { + padding: pxToRem(16), + }, + }, +}; + +export default dialogActions; diff --git a/src/qqq/components/Temporary/Theme/components/dialog/dialogContent.ts b/src/qqq/components/Temporary/Theme/components/dialog/dialogContent.ts new file mode 100644 index 0000000..04a3609 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/dialog/dialogContent.ts @@ -0,0 +1,46 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { size } = typography; +const { text } = colors; +const { borderWidth, borderColor } = borders; + +// types +type Types = any; + +const dialogContent: Types = { + styleOverrides: { + root: { + padding: pxToRem(16), + fontSize: size.md, + color: text.main, + }, + + dividers: { + borderTop: `${borderWidth[1]} solid ${borderColor}`, + borderBottom: `${borderWidth[1]} solid ${borderColor}`, + }, + }, +}; + +export default dialogContent; diff --git a/src/qqq/components/Temporary/Theme/components/dialog/dialogContentText.ts b/src/qqq/components/Temporary/Theme/components/dialog/dialogContentText.ts new file mode 100644 index 0000000..c3a8b50 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/dialog/dialogContentText.ts @@ -0,0 +1,35 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; +import colors from "assets/theme/base/colors"; + +const { size } = typography; +const { text } = colors; + +// types +type Types = any; + +const dialogContentText: Types = { + styleOverrides: { + root: { + fontSize: size.md, + color: text.main, + }, + }, +}; + +export default dialogContentText; diff --git a/src/qqq/components/Temporary/Theme/components/dialog/dialogTitle.ts b/src/qqq/components/Temporary/Theme/components/dialog/dialogTitle.ts new file mode 100644 index 0000000..331b319 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/dialog/dialogTitle.ts @@ -0,0 +1,36 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { size } = typography; + +// types +type Types = any; + +const dialogTitle: Types = { + styleOverrides: { + root: { + padding: pxToRem(16), + fontSize: size.xl, + }, + }, +}; + +export default dialogTitle; diff --git a/src/qqq/components/Temporary/Theme/components/dialog/index.ts b/src/qqq/components/Temporary/Theme/components/dialog/index.ts new file mode 100644 index 0000000..08cbc4c --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/dialog/index.ts @@ -0,0 +1,39 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +const { borderRadius } = borders; +const { xxl } = boxShadows; + +// types +type Types = any; + +const dialog: Types = { + styleOverrides: { + paper: { + borderRadius: borderRadius.lg, + boxShadow: xxl, + }, + + paperFullScreen: { + borderRadius: 0, + }, + }, +}; + +export default dialog; diff --git a/src/qqq/components/Temporary/Theme/components/divider.ts b/src/qqq/components/Temporary/Theme/components/divider.ts new file mode 100644 index 0000000..3cc9846 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/divider.ts @@ -0,0 +1,71 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import rgba from "assets/theme/functions/rgba"; +import pxToRem from "assets/theme/functions/pxToRem"; + +const { dark, transparent, white } = colors; + +// types +type Types = any; + +const divider: Types = { + styleOverrides: { + root: { + backgroundColor: transparent.main, + backgroundImage: `linear-gradient(to right, ${rgba(dark.main, 0)}, ${rgba( + dark.main, + 0.4 + )}, ${rgba(dark.main, 0)}) !important`, + height: pxToRem(1), + margin: `${pxToRem(16)} 0`, + borderBottom: "none", + opacity: 0.25, + }, + + vertical: { + backgroundColor: transparent.main, + backgroundImage: `linear-gradient(to bottom, ${rgba(dark.main, 0)}, ${rgba( + dark.main, + 0.4 + )}, ${rgba(dark.main, 0)}) !important`, + width: pxToRem(1), + height: "100%", + margin: `0 ${pxToRem(16)}`, + borderRight: "none", + }, + + light: { + backgroundColor: transparent.main, + backgroundImage: `linear-gradient(to right, ${rgba(white.main, 0)}, ${white.main}, ${rgba( + white.main, + 0 + )}) !important`, + + "&.MuiDivider-vertical": { + backgroundImage: `linear-gradient(to bottom, ${rgba(white.main, 0)}, ${white.main}, ${rgba( + white.main, + 0 + )}) !important`, + }, + }, + }, +}; + +export default divider; diff --git a/src/qqq/components/Temporary/Theme/components/flatpickr.ts b/src/qqq/components/Temporary/Theme/components/flatpickr.ts new file mode 100644 index 0000000..15e5a0a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/flatpickr.ts @@ -0,0 +1,58 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import rgba from "assets/theme/functions/rgba"; + +const { info, white, gradients } = colors; + +// types +type Types = any; + +const flatpickr: Types = { + ".flatpickr-day:hover, .flatpickr-day:focus, .flatpickr-day.nextMonthDay:hover, .flatpickr-day.nextMonthDay:focus": + { + background: rgba(info.main, 0.28), + border: "none", + }, + + ".flatpickr-day.today": { + background: info.main, + color: white.main, + border: "none", + + "&:hover, &:focus": { + background: `${info.focus} !important`, + }, + }, + + ".flatpickr-day.selected, .flatpickr-day.selected:hover, .flatpickr-day.nextMonthDay.selected, .flatpickr-day.nextMonthDay.selected:hover, .flatpickr-day.nextMonthDay.selected:focus": + { + background: `${gradients.info.state} !important`, + color: white.main, + border: "none", + }, + + ".flatpickr-months .flatpickr-next-month:hover svg, .flatpickr-months .flatpickr-prev-month:hover svg": + { + color: `${info.main} !important`, + fill: `${info.main} !important`, + }, +}; + +export default flatpickr; diff --git a/src/qqq/components/Temporary/Theme/components/form/autocomplete.ts b/src/qqq/components/Temporary/Theme/components/form/autocomplete.ts new file mode 100644 index 0000000..ed002bc --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/autocomplete.ts @@ -0,0 +1,103 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import boxShadows from "assets/theme/base/boxShadows"; +import typography from "assets/theme/base/typography"; +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { lg } = boxShadows; +const { size } = typography; +const { text, white, transparent, light, dark, gradients } = colors; +const { borderRadius } = borders; + +// types +type Types = any; + +const autocomplete: Types = { + styleOverrides: { + popper: { + boxShadow: lg, + padding: pxToRem(8), + fontSize: size.sm, + color: text.main, + textAlign: "left", + backgroundColor: `${white.main} !important`, + borderRadius: borderRadius.md, + }, + + paper: { + boxShadow: "none", + backgroundColor: transparent.main, + }, + + option: { + padding: `${pxToRem(4.8)} ${pxToRem(16)}`, + borderRadius: borderRadius.md, + fontSize: size.sm, + color: text.main, + transition: "background-color 300ms ease, color 300ms ease", + + "&:hover, &:focus, &.Mui-selected, &.Mui-selected:hover, &.Mui-selected:focus": { + backgroundColor: light.main, + color: dark.main, + }, + + '&[aria-selected="true"]': { + backgroundColor: `${light.main} !important`, + color: `${dark.main} !important`, + }, + }, + + noOptions: { + fontSize: size.sm, + color: text.main, + }, + + groupLabel: { + color: dark.main, + }, + + loading: { + fontSize: size.sm, + color: text.main, + }, + + tag: { + display: "flex", + alignItems: "center", + height: "auto", + padding: pxToRem(4), + backgroundColor: gradients.dark.state, + color: white.main, + + "& .MuiChip-label": { + lineHeight: 1.2, + padding: `0 ${pxToRem(10)} 0 ${pxToRem(4)}`, + }, + + "& .MuiSvgIcon-root, & .MuiSvgIcon-root:hover, & .MuiSvgIcon-root:focus": { + color: white.main, + marginRight: 0, + }, + }, + }, +}; + +export default autocomplete; diff --git a/src/qqq/components/Temporary/Theme/components/form/checkbox.ts b/src/qqq/components/Temporary/Theme/components/form/checkbox.ts new file mode 100644 index 0000000..825bc12 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/checkbox.ts @@ -0,0 +1,86 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import linearGradient from "assets/theme/functions/linearGradient"; + +const { borderWidth, borderColor } = borders; +const { transparent, info } = colors; + +// types +type Types = any; + +const checkbox: Types = { + styleOverrides: { + root: { + "& .MuiSvgIcon-root": { + backgroundPosition: "center", + backgroundSize: "contain", + backgroundRepeat: "no-repeat", + width: pxToRem(20), + height: pxToRem(20), + color: transparent.main, + border: `${borderWidth[1]} solid ${borderColor}`, + borderRadius: pxToRem(5.6), + }, + + "&:hover": { + backgroundColor: transparent.main, + }, + + "&.Mui-focusVisible": { + border: `${borderWidth[2]} solid ${info.main} !important`, + }, + }, + + colorPrimary: { + color: borderColor, + + "&.Mui-checked": { + color: info.main, + + "& .MuiSvgIcon-root": { + backgroundImage: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -1 22 22'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2.5' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"), ${linearGradient( + info.main, + info.main + )}`, + borderColor: info.main, + }, + }, + }, + + colorSecondary: { + color: borderColor, + + "& .MuiSvgIcon-root": { + color: info.main, + "&.Mui-checked": { + backgroundImage: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -1 22 22'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2.5' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"), ${linearGradient( + info.main, + info.main + )}`, + borderColor: info.main, + }, + }, + }, + }, +}; + +export default checkbox; diff --git a/src/qqq/components/Temporary/Theme/components/form/formControlLabel.ts b/src/qqq/components/Temporary/Theme/components/form/formControlLabel.ts new file mode 100644 index 0000000..e807e1e --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/formControlLabel.ts @@ -0,0 +1,53 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { dark } = colors; +const { size, fontWeightBold } = typography; + +// types +type Types = any; + +const formControlLabel: Types = { + styleOverrides: { + root: { + display: "block", + minHeight: pxToRem(24), + marginBottom: pxToRem(2), + }, + + label: { + display: "inline-block", + fontSize: size.sm, + fontWeight: fontWeightBold, + color: dark.main, + lineHeight: 1, + transform: `translateY(${pxToRem(1)})`, + marginLeft: pxToRem(4), + + "&.Mui-disabled": { + color: dark.main, + }, + }, + }, +}; + +export default formControlLabel; diff --git a/src/qqq/components/Temporary/Theme/components/form/formLabel.ts b/src/qqq/components/Temporary/Theme/components/form/formLabel.ts new file mode 100644 index 0000000..028f5b2 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/formLabel.ts @@ -0,0 +1,32 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +const { text } = colors; + +// types +type Types = any; + +const formLabel: Types = { + styleOverrides: { + root: { + color: text.main, + }, + }, +}; + +export default formLabel; diff --git a/src/qqq/components/Temporary/Theme/components/form/input.ts b/src/qqq/components/Temporary/Theme/components/form/input.ts new file mode 100644 index 0000000..6a6f3bc --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/input.ts @@ -0,0 +1,49 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; +import borders from "assets/theme/base/borders"; + +const { info, inputBorderColor, dark } = colors; +const { size } = typography; +const { borderWidth } = borders; + +// types +type Types = any; + +const input: Types = { + styleOverrides: { + root: { + fontSize: size.sm, + color: dark.main, + + "&:hover:not(.Mui-disabled):before": { + borderBottom: `${borderWidth[1]} solid ${inputBorderColor}`, + }, + + "&:before": { + borderColor: inputBorderColor, + }, + + "&:after": { + borderColor: info.main, + }, + }, + }, +}; + +export default input; diff --git a/src/qqq/components/Temporary/Theme/components/form/inputLabel.ts b/src/qqq/components/Temporary/Theme/components/form/inputLabel.ts new file mode 100644 index 0000000..7cf8d03 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/inputLabel.ts @@ -0,0 +1,63 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; + +const { text, info } = colors; +const { size } = typography; + +// types +type Types = any; + +const inputLabel: Types = { + styleOverrides: { + root: { + fontSize: size.sm, + color: text.main, + lineHeight: 0.9, + + "&.Mui-focused": { + color: info.main, + }, + + "&.MuiInputLabel-shrink": { + lineHeight: 1.5, + fontSize: size.md, + + "~ .MuiInputBase-root .MuiOutlinedInput-notchedOutline legend": { + fontSize: "0.85em", + }, + }, + }, + + sizeSmall: { + fontSize: size.xs, + lineHeight: 1.625, + + "&.MuiInputLabel-shrink": { + lineHeight: 1.6, + fontSize: size.sm, + + "~ .MuiInputBase-root .MuiOutlinedInput-notchedOutline legend": { + fontSize: "0.72em", + }, + }, + }, + }, +}; + +export default inputLabel; diff --git a/src/qqq/components/Temporary/Theme/components/form/inputOutlined.ts b/src/qqq/components/Temporary/Theme/components/form/inputOutlined.ts new file mode 100644 index 0000000..c14fd51 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/inputOutlined.ts @@ -0,0 +1,71 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import typography from "assets/theme/base/typography"; + +// // Material Dashboard 2 PRO React TSUI Dashboard PRO helper functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { inputBorderColor, info, grey, transparent } = colors; +const { borderRadius } = borders; +const { size } = typography; + +// types +type Types = any; + +const inputOutlined: Types = { + styleOverrides: { + root: { + backgroundColor: transparent.main, + fontSize: size.sm, + borderRadius: borderRadius.md, + + "&:hover .MuiOutlinedInput-notchedOutline": { + borderColor: inputBorderColor, + }, + + "&.Mui-focused": { + "& .MuiOutlinedInput-notchedOutline": { + borderColor: info.main, + }, + }, + }, + + notchedOutline: { + borderColor: inputBorderColor, + }, + + input: { + color: grey[700], + padding: pxToRem(12), + backgroundColor: transparent.main, + }, + + inputSizeSmall: { + fontSize: size.xs, + padding: pxToRem(10), + }, + + multiline: { + color: grey[700], + padding: 0, + }, + }, +}; + +export default inputOutlined; diff --git a/src/qqq/components/Temporary/Theme/components/form/radio.ts b/src/qqq/components/Temporary/Theme/components/form/radio.ts new file mode 100644 index 0000000..c6153e0 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/radio.ts @@ -0,0 +1,100 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import linearGradient from "assets/theme/functions/linearGradient"; + +const { borderWidth, borderColor } = borders; +const { transparent, info } = colors; + +// types +type Types = any; + +const radio: Types = { + styleOverrides: { + root: { + "& .MuiSvgIcon-root": { + width: pxToRem(20), + height: pxToRem(20), + color: transparent.main, + border: `${borderWidth[1]} solid ${borderColor}`, + borderRadius: "50%", + }, + + "&:after": { + transition: "opacity 250ms ease-in-out", + content: `""`, + position: "absolute", + width: pxToRem(14), + height: pxToRem(14), + borderRadius: "50%", + backgroundImage: linearGradient(info.main, info.main), + opacity: 0, + left: 0, + right: 0, + top: 0, + bottom: 0, + margin: "auto", + }, + + "&:hover": { + backgroundColor: transparent.main, + }, + + "&.Mui-focusVisible": { + border: `${borderWidth[2]} solid ${info.main} !important`, + }, + }, + + colorPrimary: { + color: borderColor, + + "&.Mui-checked": { + color: info.main, + + "& .MuiSvgIcon-root": { + borderColor: info.main, + }, + + "&:after": { + opacity: 1, + }, + }, + }, + + colorSecondary: { + color: borderColor, + + "&.Mui-checked": { + color: info.main, + + "& .MuiSvgIcon-root": { + borderColor: info.main, + }, + + "&:after": { + opacity: 1, + }, + }, + }, + }, +}; + +export default radio; diff --git a/src/qqq/components/Temporary/Theme/components/form/select.ts b/src/qqq/components/Temporary/Theme/components/form/select.ts new file mode 100644 index 0000000..e23e59e --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/select.ts @@ -0,0 +1,52 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { transparent } = colors; + +// types +type Types = any; + +const select: Types = { + styleOverrides: { + select: { + display: "grid", + alignItems: "center", + padding: `0 ${pxToRem(12)} !important`, + + "& .Mui-selected": { + backgroundColor: transparent.main, + }, + }, + + selectMenu: { + background: "none", + height: "none", + minHeight: "none", + overflow: "unset", + }, + + icon: { + display: "none", + }, + }, +}; + +export default select; diff --git a/src/qqq/components/Temporary/Theme/components/form/switchButton.ts b/src/qqq/components/Temporary/Theme/components/form/switchButton.ts new file mode 100644 index 0000000..6897a94 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/switchButton.ts @@ -0,0 +1,90 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import linearGradient from "assets/theme/functions/linearGradient"; + +const { white, gradients, grey, transparent } = colors; +const { borderWidth } = borders; +const { md } = boxShadows; + +// types +type Types = any; + +const switchButton: Types = { + defaultProps: { + disableRipple: false, + }, + + styleOverrides: { + switchBase: { + color: gradients.dark.main, + + "&:hover": { + backgroundColor: transparent.main, + }, + + "&.Mui-checked": { + color: gradients.dark.main, + + "&:hover": { + backgroundColor: transparent.main, + }, + + "& .MuiSwitch-thumb": { + borderColor: `${gradients.dark.main} !important`, + }, + + "& + .MuiSwitch-track": { + backgroundColor: `${gradients.dark.main} !important`, + borderColor: `${gradients.dark.main} !important`, + opacity: 1, + }, + }, + + "&.Mui-disabled + .MuiSwitch-track": { + opacity: "0.3 !important", + }, + + "&.Mui-focusVisible .MuiSwitch-thumb": { + backgroundImage: linearGradient(gradients.info.main, gradients.info.state), + }, + }, + + thumb: { + backgroundColor: white.main, + boxShadow: md, + border: `${borderWidth[1]} solid ${grey[400]}`, + }, + + track: { + width: pxToRem(32), + height: pxToRem(15), + backgroundColor: grey[400], + border: `${borderWidth[1]} solid ${grey[400]}`, + opacity: 1, + }, + + checked: {}, + }, +}; + +export default switchButton; diff --git a/src/qqq/components/Temporary/Theme/components/form/textField.ts b/src/qqq/components/Temporary/Theme/components/form/textField.ts new file mode 100644 index 0000000..0358b09 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/form/textField.ts @@ -0,0 +1,32 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +const { transparent } = colors; + +// types +type Types = any; + +const textField: Types = { + styleOverrides: { + root: { + backgroundColor: transparent.main, + }, + }, +}; + +export default textField; diff --git a/src/qqq/components/Temporary/Theme/components/icon.ts b/src/qqq/components/Temporary/Theme/components/icon.ts new file mode 100644 index 0000000..9170ea3 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/icon.ts @@ -0,0 +1,43 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const icon: Types = { + defaultProps: { + baseClassName: "material-icons-round", + fontSize: "inherit", + }, + + styleOverrides: { + fontSizeInherit: { + fontSize: "inherit !important", + }, + + fontSizeSmall: { + fontSize: `${pxToRem(20)} !important`, + }, + + fontSizeLarge: { + fontSize: `${pxToRem(36)} !important`, + }, + }, +}; + +export default icon; diff --git a/src/qqq/components/Temporary/Theme/components/iconButton.ts b/src/qqq/components/Temporary/Theme/components/iconButton.ts new file mode 100644 index 0000000..4a9e513 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/iconButton.ts @@ -0,0 +1,34 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +const { transparent } = colors; + +// types +type Types = any; + +const iconButton: Types = { + styleOverrides: { + root: { + "&:hover": { + backgroundColor: transparent.main, + }, + }, + }, +}; + +export default iconButton; diff --git a/src/qqq/components/Temporary/Theme/components/linearProgress.ts b/src/qqq/components/Temporary/Theme/components/linearProgress.ts new file mode 100644 index 0000000..7b71257 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/linearProgress.ts @@ -0,0 +1,56 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { borderRadius } = borders; +const { light } = colors; + +// types +type Types = any; + +const linearProgress: Types = { + styleOverrides: { + root: { + height: pxToRem(6), + borderRadius: borderRadius.md, + overflow: "visible", + position: "relative", + }, + + colorPrimary: { + backgroundColor: light.main, + }, + + colorSecondary: { + backgroundColor: light.main, + }, + + bar: { + height: pxToRem(6), + borderRadius: borderRadius.sm, + position: "absolute", + transform: `translate(0, 0) !important`, + transition: "width 0.6s ease !important", + }, + }, +}; + +export default linearProgress; diff --git a/src/qqq/components/Temporary/Theme/components/link.ts b/src/qqq/components/Temporary/Theme/components/link.ts new file mode 100644 index 0000000..0aaf207 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/link.ts @@ -0,0 +1,26 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const link: Types = { + defaultProps: { + underline: "none", + color: "inherit", + }, +}; + +export default link; diff --git a/src/qqq/components/Temporary/Theme/components/list/index.ts b/src/qqq/components/Temporary/Theme/components/list/index.ts new file mode 100644 index 0000000..cddfdae --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/list/index.ts @@ -0,0 +1,28 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const list: Types = { + styleOverrides: { + padding: { + paddingTop: 0, + paddingBottom: 0, + }, + }, +}; + +export default list; diff --git a/src/qqq/components/Temporary/Theme/components/list/listItem.ts b/src/qqq/components/Temporary/Theme/components/list/listItem.ts new file mode 100644 index 0000000..bcd022c --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/list/listItem.ts @@ -0,0 +1,32 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const listItem: Types = { + defaultProps: { + disableGutters: true, + }, + + styleOverrides: { + root: { + paddingTop: 0, + paddingBottom: 0, + }, + }, +}; + +export default listItem; diff --git a/src/qqq/components/Temporary/Theme/components/list/listItemText.ts b/src/qqq/components/Temporary/Theme/components/list/listItemText.ts new file mode 100644 index 0000000..7ca6d40 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/list/listItemText.ts @@ -0,0 +1,28 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// types +type Types = any; + +const listItemText: Types = { + styleOverrides: { + root: { + marginTop: 0, + marginBottom: 0, + }, + }, +}; + +export default listItemText; diff --git a/src/qqq/components/Temporary/Theme/components/menu/index.ts b/src/qqq/components/Temporary/Theme/components/menu/index.ts new file mode 100644 index 0000000..68c6795 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/menu/index.ts @@ -0,0 +1,52 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import boxShadows from "assets/theme/base/boxShadows"; +import typography from "assets/theme/base/typography"; +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { lg } = boxShadows; +const { size } = typography; +const { text, white } = colors; +const { borderRadius } = borders; + +// types +type Types = any; + +const menu: Types = { + defaultProps: { + disableAutoFocusItem: true, + }, + + styleOverrides: { + paper: { + minWidth: pxToRem(160), + boxShadow: lg, + padding: `${pxToRem(16)} ${pxToRem(8)}`, + fontSize: size.sm, + color: text.main, + textAlign: "left", + backgroundColor: `${white.main} !important`, + borderRadius: borderRadius.md, + }, + }, +}; + +export default menu; diff --git a/src/qqq/components/Temporary/Theme/components/menu/menuItem.ts b/src/qqq/components/Temporary/Theme/components/menu/menuItem.ts new file mode 100644 index 0000000..e9a62e0 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/menu/menuItem.ts @@ -0,0 +1,50 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import typography from "assets/theme/base/typography"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { light, text, dark } = colors; +const { borderRadius } = borders; +const { size } = typography; + +// types +type Types = any; + +const menuItem: Types = { + styleOverrides: { + root: { + minWidth: pxToRem(160), + minHeight: "unset", + padding: `${pxToRem(4.8)} ${pxToRem(16)}`, + borderRadius: borderRadius.md, + fontSize: size.sm, + color: text.main, + transition: "background-color 300ms ease, color 300ms ease", + + "&:hover, &:focus, &.Mui-selected, &.Mui-selected:hover, &.Mui-selected:focus": { + backgroundColor: light.main, + color: dark.main, + }, + }, + }, +}; + +export default menuItem; diff --git a/src/qqq/components/Temporary/Theme/components/popover.ts b/src/qqq/components/Temporary/Theme/components/popover.ts new file mode 100644 index 0000000..8e41af5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/popover.ts @@ -0,0 +1,42 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import boxShadows from "assets/theme/base/boxShadows"; +import borders from "assets/theme/base/borders"; + +const { transparent } = colors; +const { lg } = boxShadows; +const { borderRadius } = borders; + +// types +type Types = any; + +const popover: Types = { + styleOverrides: { + paper: { + backgroundColor: transparent.main, + boxShadow: lg, + padding: pxToRem(8), + borderRadius: borderRadius.md, + }, + }, +}; + +export default popover; diff --git a/src/qqq/components/Temporary/Theme/components/sidenav.ts b/src/qqq/components/Temporary/Theme/components/sidenav.ts new file mode 100644 index 0000000..f97505a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/sidenav.ts @@ -0,0 +1,52 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { white } = colors; +const { borderRadius } = borders; + +// types +type Types = any; + +const sidenav: Types = { + styleOverrides: { + root: { + width: pxToRem(250), + whiteSpace: "nowrap", + border: "none", + }, + + paper: { + width: pxToRem(250), + backgroundColor: white.main, + height: `calc(100vh - ${pxToRem(32)})`, + margin: pxToRem(16), + borderRadius: borderRadius.xl, + border: "none", + }, + + paperAnchorDockedLeft: { + borderRight: "none", + }, + }, +}; + +export default sidenav; diff --git a/src/qqq/components/Temporary/Theme/components/slider.ts b/src/qqq/components/Temporary/Theme/components/slider.ts new file mode 100644 index 0000000..0c034c7 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/slider.ts @@ -0,0 +1,84 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import boxShadow from "assets/theme/functions/boxShadow"; + +const { grey, white, black, info } = colors; +const { borderRadius, borderWidth } = borders; +const { sliderBoxShadow } = boxShadows; + +// types +type Types = any; + +const slider: Types = { + styleOverrides: { + root: { + width: "100%", + + "& .MuiSlider-active, & .Mui-focusVisible": { + boxShadow: "none !important", + }, + + "& .MuiSlider-valueLabel": { + color: black.main, + }, + }, + + rail: { + height: pxToRem(2), + background: grey[200], + borderRadius: borderRadius.sm, + opacity: 1, + }, + + track: { + background: info.main, + height: pxToRem(2), + position: "relative", + border: "none", + borderRadius: borderRadius.lg, + zIndex: 1, + }, + + thumb: { + width: pxToRem(14), + height: pxToRem(14), + backgroundColor: white.main, + zIndex: 10, + boxShadow: sliderBoxShadow.thumb, + border: `${borderWidth[1]} solid ${info.main}`, + transition: "all 200ms linear", + + "&:hover": { + boxShadow: "none", + }, + + "&:active": { + transform: "translate(-50%, -50%) scale(1.4)", + }, + + "&.Mui-active": { boxShadow: boxShadow([0, 0], [0, 14], info.main, 0.16) }, + }, + }, +}; + +export default slider; diff --git a/src/qqq/components/Temporary/Theme/components/stepper/index.ts b/src/qqq/components/Temporary/Theme/components/stepper/index.ts new file mode 100644 index 0000000..d3c9827 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/stepper/index.ts @@ -0,0 +1,47 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import linearGradient from "assets/theme/functions/linearGradient"; + +const { transparent, gradients } = colors; +const { borderRadius } = borders; +const { colored } = boxShadows; + +// types +type Types = any; + +const stepper: Types = { + styleOverrides: { + root: { + background: linearGradient(gradients.info.main, gradients.info.state), + padding: `${pxToRem(24)} 0 ${pxToRem(16)}`, + borderRadius: borderRadius.lg, + boxShadow: colored.info, + + "&.MuiPaper-root": { + backgroundColor: transparent.main, + }, + }, + }, +}; + +export default stepper; diff --git a/src/qqq/components/Temporary/Theme/components/stepper/step.ts b/src/qqq/components/Temporary/Theme/components/stepper/step.ts new file mode 100644 index 0000000..ebab7a5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/stepper/step.ts @@ -0,0 +1,30 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const step: Types = { + styleOverrides: { + root: { + padding: `0 ${pxToRem(6)}`, + }, + }, +}; + +export default step; diff --git a/src/qqq/components/Temporary/Theme/components/stepper/stepConnector.ts b/src/qqq/components/Temporary/Theme/components/stepper/stepConnector.ts new file mode 100644 index 0000000..0bd6828 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/stepper/stepConnector.ts @@ -0,0 +1,55 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +const { white } = colors; +const { borderWidth } = borders; + +// types +type Types = any; + +const stepConnector: Types = { + styleOverrides: { + root: { + color: "#9fc9ff", + transition: "all 200ms linear", + + "&.Mui-active": { + color: white.main, + }, + + "&.Mui-completed": { + color: white.main, + }, + }, + + alternativeLabel: { + top: "14%", + left: "-50%", + right: "50%", + }, + + line: { + borderWidth: `${borderWidth[2]} !important`, + borderColor: "currentColor", + opacity: 0.5, + }, + }, +}; + +export default stepConnector; diff --git a/src/qqq/components/Temporary/Theme/components/stepper/stepIcon.ts b/src/qqq/components/Temporary/Theme/components/stepper/stepIcon.ts new file mode 100644 index 0000000..50a8bf3 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/stepper/stepIcon.ts @@ -0,0 +1,60 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import boxShadow from "assets/theme/functions/boxShadow"; + +const { white } = colors; + +// types +type Types = any; + +const stepIcon: Types = { + styleOverrides: { + root: { + background: "#9fc9ff", + fill: "#9fc9ff", + stroke: "#9fc9ff", + strokeWidth: pxToRem(10), + width: pxToRem(13), + height: pxToRem(13), + borderRadius: "50%", + zIndex: 99, + transition: "all 200ms linear", + + "&.Mui-active": { + background: white.main, + fill: white.main, + stroke: white.main, + borderColor: white.main, + boxShadow: boxShadow([0, 0], [0, 2], white.main, 1), + }, + + "&.Mui-completed": { + background: white.main, + fill: white.main, + stroke: white.main, + borderColor: white.main, + boxShadow: boxShadow([0, 0], [0, 2], white.main, 1), + }, + }, + }, +}; + +export default stepIcon; diff --git a/src/qqq/components/Temporary/Theme/components/stepper/stepLabel.ts b/src/qqq/components/Temporary/Theme/components/stepper/stepLabel.ts new file mode 100644 index 0000000..93867a2 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/stepper/stepLabel.ts @@ -0,0 +1,52 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; +import rgba from "assets/theme/functions/rgba"; + +const { size, fontWeightRegular } = typography; +const { white } = colors; + +// types +type Types = any; + +const stepLabel: Types = { + styleOverrides: { + label: { + marginTop: `${pxToRem(8)} !important`, + fontWeight: fontWeightRegular, + fontSize: size.xs, + color: "#9fc9ff", + textTransform: "uppercase", + + "&.Mui-active": { + fontWeight: `${fontWeightRegular} !important`, + color: `${rgba(white.main, 0.8)} !important`, + }, + + "&.Mui-completed": { + fontWeight: `${fontWeightRegular} !important`, + color: `${rgba(white.main, 0.8)} !important`, + }, + }, + }, +}; + +export default stepLabel; diff --git a/src/qqq/components/Temporary/Theme/components/svgIcon.ts b/src/qqq/components/Temporary/Theme/components/svgIcon.ts new file mode 100644 index 0000000..627602c --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/svgIcon.ts @@ -0,0 +1,42 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +// types +type Types = any; + +const svgIcon: Types = { + defaultProps: { + fontSize: "inherit", + }, + + styleOverrides: { + fontSizeInherit: { + fontSize: "inherit !important", + }, + + fontSizeSmall: { + fontSize: `${pxToRem(20)} !important`, + }, + + fontSizeLarge: { + fontSize: `${pxToRem(36)} !important`, + }, + }, +}; + +export default svgIcon; diff --git a/src/qqq/components/Temporary/Theme/components/table/tableCell.ts b/src/qqq/components/Temporary/Theme/components/table/tableCell.ts new file mode 100644 index 0000000..982f3bb --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/table/tableCell.ts @@ -0,0 +1,38 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { borderWidth } = borders; +const { light } = colors; + +// types +type Types = any; + +const tableCell: Types = { + styleOverrides: { + root: { + padding: `${pxToRem(12)} ${pxToRem(16)}`, + borderBottom: `${borderWidth[1]} solid ${light.main}`, + }, + }, +}; + +export default tableCell; diff --git a/src/qqq/components/Temporary/Theme/components/table/tableContainer.ts b/src/qqq/components/Temporary/Theme/components/table/tableContainer.ts new file mode 100644 index 0000000..3095fe7 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/table/tableContainer.ts @@ -0,0 +1,38 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import boxShadows from "assets/theme/base/boxShadows"; +import borders from "assets/theme/base/borders"; + +const { white } = colors; +const { md } = boxShadows; +const { borderRadius } = borders; + +// types +type Types = any; + +const tableContainer: Types = { + styleOverrides: { + root: { + backgroundColor: white.main, + boxShadow: md, + borderRadius: borderRadius.xl, + }, + }, +}; + +export default tableContainer; diff --git a/src/qqq/components/Temporary/Theme/components/table/tableHead.ts b/src/qqq/components/Temporary/Theme/components/table/tableHead.ts new file mode 100644 index 0000000..167f024 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/table/tableHead.ts @@ -0,0 +1,37 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { borderRadius } = borders; + +// types +type Types = any; + +const tableHead: Types = { + styleOverrides: { + root: { + display: "block", + padding: `${pxToRem(16)} ${pxToRem(16)} 0 ${pxToRem(16)}`, + borderRadius: `${borderRadius.xl} ${borderRadius.xl} 0 0`, + }, + }, +}; + +export default tableHead; diff --git a/src/qqq/components/Temporary/Theme/components/tabs/index.ts b/src/qqq/components/Temporary/Theme/components/tabs/index.ts new file mode 100644 index 0000000..d85b14a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/tabs/index.ts @@ -0,0 +1,68 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import borders from "assets/theme/base/borders"; +import boxShadows from "assets/theme/base/boxShadows"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { grey, white } = colors; +const { borderRadius } = borders; +const { tabsBoxShadow } = boxShadows; + +// types +type Types = any; + +const tabs: Types = { + styleOverrides: { + root: { + position: "relative", + backgroundColor: grey[100], + borderRadius: borderRadius.xl, + minHeight: "unset", + padding: pxToRem(4), + }, + + flexContainer: { + height: "100%", + position: "relative", + zIndex: 10, + }, + + fixed: { + overflow: "unset !important", + overflowX: "unset !important", + }, + + vertical: { + "& .MuiTabs-indicator": { + width: "100%", + }, + }, + + indicator: { + height: "100%", + borderRadius: borderRadius.lg, + backgroundColor: white.main, + boxShadow: tabsBoxShadow.indicator, + transition: "all 500ms ease", + }, + }, +}; + +export default tabs; diff --git a/src/qqq/components/Temporary/Theme/components/tabs/tab.ts b/src/qqq/components/Temporary/Theme/components/tabs/tab.ts new file mode 100644 index 0000000..a878fe6 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/tabs/tab.ts @@ -0,0 +1,68 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// Material Dashboard 2 PRO React TS Base Styles +import typography from "assets/theme/base/typography"; +import borders from "assets/theme/base/borders"; +import colors from "assets/theme/base/colors"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { size, fontWeightRegular } = typography; +const { borderRadius } = borders; +const { dark } = colors; + +// types +type Types = any; + +const tab: Types = { + styleOverrides: { + root: { + display: "flex", + alignItems: "center", + flexDirection: "row", + flex: "1 1 auto", + textAlign: "center", + maxWidth: "unset !important", + minWidth: "unset !important", + minHeight: "unset !important", + fontSize: size.md, + fontWeight: fontWeightRegular, + textTransform: "none", + lineHeight: "inherit", + padding: pxToRem(4), + borderRadius: borderRadius.lg, + color: `${dark.main} !important`, + opacity: "1 !important", + + "& .material-icons, .material-icons-round": { + marginBottom: "0 !important", + marginRight: pxToRem(6), + }, + + "& svg": { + marginBottom: "0 !important", + marginRight: pxToRem(6), + }, + }, + + labelIcon: { + paddingTop: pxToRem(4), + }, + }, +}; + +export default tab; diff --git a/src/qqq/components/Temporary/Theme/components/tooltip.ts b/src/qqq/components/Temporary/Theme/components/tooltip.ts new file mode 100644 index 0000000..ee9862a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/components/tooltip.ts @@ -0,0 +1,59 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// @mui material components +import Fade from "@mui/material/Fade"; + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import typography from "assets/theme/base/typography"; +import borders from "assets/theme/base/borders"; + +// Material Dashboard 2 PRO React TS Helper Functions +import pxToRem from "assets/theme/functions/pxToRem"; + +const { black, light } = colors; +const { size, fontWeightRegular } = typography; +const { borderRadius } = borders; + +// types +type Types = any; + +const tooltip: Types = { + defaultProps: { + arrow: true, + TransitionComponent: Fade, + }, + + styleOverrides: { + tooltip: { + maxWidth: pxToRem(200), + backgroundColor: black.main, + color: light.main, + fontSize: size.sm, + fontWeight: fontWeightRegular, + textAlign: "center", + borderRadius: borderRadius.md, + opacity: 0.7, + padding: `${pxToRem(5)} ${pxToRem(8)} ${pxToRem(4)}`, + }, + + arrow: { + color: black.main, + }, + }, +}; + +export default tooltip; diff --git a/src/qqq/components/Temporary/Theme/functions/boxShadow.ts b/src/qqq/components/Temporary/Theme/functions/boxShadow.ts new file mode 100644 index 0000000..a4e7d08 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/boxShadow.ts @@ -0,0 +1,40 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The boxShadow() function helps you to create a box shadow for an element + */ + +// Material Dashboard 2 PRO React TS Helper Functions +import rgba from "assets/theme/functions/rgba"; +import pxToRem from "assets/theme/functions/pxToRem"; + +function boxShadow( + offset: number[], + radius: number[], + color: string, + opacity: number, + inset: string = "" +): string { + const [x, y] = offset; + const [blur, spread] = radius; + + return `${inset} ${pxToRem(x)} ${pxToRem(y)} ${pxToRem(blur)} ${pxToRem(spread)} ${rgba( + color, + opacity + )}`; +} + +export default boxShadow; diff --git a/src/qqq/components/Temporary/Theme/functions/gradientChartLine.ts b/src/qqq/components/Temporary/Theme/functions/gradientChartLine.ts new file mode 100644 index 0000000..78310e5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/gradientChartLine.ts @@ -0,0 +1,35 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The gradientChartLine() function helps you to create a gradient color for the chart line + */ + +// Material Dashboard 2 PRO React TS Helper Functions +import rgba from "assets/theme/functions/rgba"; + +function gradientChartLine(chart: any, color: string, opacity: number = 0.2): any { + const ctx = chart.getContext("2d"); + const gradientStroke = ctx.createLinearGradient(0, 230, 0, 50); + const primaryColor = rgba(color, opacity).toString(); + + gradientStroke.addColorStop(1, primaryColor); + gradientStroke.addColorStop(0.2, "rgba(72, 72, 176, 0.0)"); + gradientStroke.addColorStop(0, "rgba(203, 12, 159, 0)"); + + return gradientStroke; +} + +export default gradientChartLine; diff --git a/src/qqq/components/Temporary/Theme/functions/hexToRgb.ts b/src/qqq/components/Temporary/Theme/functions/hexToRgb.ts new file mode 100644 index 0000000..fc13aeb --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/hexToRgb.ts @@ -0,0 +1,28 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The hexToRgb() function helps you to change the hex color code to rgb + using chroma-js library. + */ + +// chroma-js is a library for all kinds of color conversions and color scales. +import chroma from "chroma-js"; + +function hexToRgb(color: string): string { + return chroma(color).rgb().join(", "); +} + +export default hexToRgb; diff --git a/src/qqq/components/Temporary/Theme/functions/linearGradient.ts b/src/qqq/components/Temporary/Theme/functions/linearGradient.ts new file mode 100644 index 0000000..4c562c5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/linearGradient.ts @@ -0,0 +1,24 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The linearGradient() function helps you to create a linear gradient color background + */ + +function linearGradient(color: string, colorState: string, angle: number = 195): string { + return `linear-gradient(${angle}deg, ${color}, ${colorState})`; +} + +export default linearGradient; diff --git a/src/qqq/components/Temporary/Theme/functions/pxToRem.ts b/src/qqq/components/Temporary/Theme/functions/pxToRem.ts new file mode 100644 index 0000000..35e8103 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/pxToRem.ts @@ -0,0 +1,24 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The pxToRem() function helps you to convert a px unit into a rem unit, + */ + +function pxToRem(number: number, baseNumber: number = 16): string { + return `${number / baseNumber}rem`; +} + +export default pxToRem; diff --git a/src/qqq/components/Temporary/Theme/functions/rgba.ts b/src/qqq/components/Temporary/Theme/functions/rgba.ts new file mode 100644 index 0000000..d914902 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/functions/rgba.ts @@ -0,0 +1,28 @@ +/** +========================================================= +* Material Dashboard 2 PRO React TS - v1.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/material-dashboard-2-pro-react-ts +* Copyright 2022 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +/** + The rgba() function helps you to create a rgba color code, it uses the hexToRgb() function + to convert the hex code into rgb for using it inside the rgba color format. + */ + +// Material Dashboard 2 PRO React TS Helper Functions +import hexToRgb from "assets/theme/functions/hexToRgb"; + +function rgba(color: string, opacity: number): string { + return `rgba(${hexToRgb(color)}, ${opacity})`; +} + +export default rgba; diff --git a/src/qqq/components/Temporary/Theme/index.ts b/src/qqq/components/Temporary/Theme/index.ts new file mode 100644 index 0000000..d04ba7a --- /dev/null +++ b/src/qqq/components/Temporary/Theme/index.ts @@ -0,0 +1,159 @@ +/** +========================================================= +* Material Dashboard 2 PRO React - v2.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/soft-ui-dashboard-pro-material-ui +* Copyright 2021 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// @mui material components +import { createTheme } from "@mui/material"; + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import breakpoints from "assets/theme/base/breakpoints"; +import typography from "assets/theme/base/typography"; +import boxShadows from "assets/theme/base/boxShadows"; +import borders from "assets/theme/base/borders"; +import globals from "assets/theme/base/globals"; + +// Material Dashboard 2 PRO React TS Helper Functions +import boxShadow from "assets/theme/functions/boxShadow"; +import hexToRgb from "assets/theme/functions/hexToRgb"; +import linearGradient from "assets/theme/functions/linearGradient"; +import pxToRem from "assets/theme/functions/pxToRem"; +import rgba from "assets/theme/functions/rgba"; + +// Material Dashboard 2 PRO React TS components base styles for @mui material components +import sidenav from "assets/theme/components/sidenav"; +import list from "assets/theme/components/list"; +import listItem from "assets/theme/components/list/listItem"; +import listItemText from "assets/theme/components/list/listItemText"; +import card from "assets/theme/components/card"; +import cardMedia from "assets/theme/components/card/cardMedia"; +import cardContent from "assets/theme/components/card/cardContent"; +import button from "assets/theme/components/button"; +import iconButton from "assets/theme/components/iconButton"; +import input from "assets/theme/components/form/input"; +import inputLabel from "assets/theme/components/form/inputLabel"; +import inputOutlined from "assets/theme/components/form/inputOutlined"; +import textField from "assets/theme/components/form/textField"; +import menu from "assets/theme/components/menu"; +import menuItem from "assets/theme/components/menu/menuItem"; +import switchButton from "assets/theme/components/form/switchButton"; +import divider from "assets/theme/components/divider"; +import tableContainer from "assets/theme/components/table/tableContainer"; +import tableHead from "assets/theme/components/table/tableHead"; +import tableCell from "assets/theme/components/table/tableCell"; +import linearProgress from "assets/theme/components/linearProgress"; +import breadcrumbs from "assets/theme/components/breadcrumbs"; +import slider from "assets/theme/components/slider"; +import avatar from "assets/theme/components/avatar"; +import tooltip from "assets/theme/components/tooltip"; +import appBar from "assets/theme/components/appBar"; +import tabs from "assets/theme/components/tabs"; +import tab from "assets/theme/components/tabs/tab"; +import stepper from "assets/theme/components/stepper"; +import step from "assets/theme/components/stepper/step"; +import stepConnector from "assets/theme/components/stepper/stepConnector"; +import stepLabel from "assets/theme/components/stepper/stepLabel"; +import stepIcon from "assets/theme/components/stepper/stepIcon"; +import select from "assets/theme/components/form/select"; +import formControlLabel from "assets/theme/components/form/formControlLabel"; +import formLabel from "assets/theme/components/form/formLabel"; +import checkbox from "assets/theme/components/form/checkbox"; +import radio from "assets/theme/components/form/radio"; +import autocomplete from "assets/theme/components/form/autocomplete"; +import flatpickr from "assets/theme/components/flatpickr"; +import container from "assets/theme/components/container"; +import popover from "assets/theme/components/popover"; +import buttonBase from "assets/theme/components/buttonBase"; +import icon from "assets/theme/components/icon"; +import svgIcon from "assets/theme/components/svgIcon"; +import link from "assets/theme/components/link"; +import dialog from "assets/theme/components/dialog"; +import dialogTitle from "assets/theme/components/dialog/dialogTitle"; +import dialogContent from "assets/theme/components/dialog/dialogContent"; +import dialogContentText from "assets/theme/components/dialog/dialogContentText"; +import dialogActions from "assets/theme/components/dialog/dialogActions"; + +export default createTheme({ + breakpoints: { ...breakpoints }, + palette: { ...colors }, + typography: { ...typography }, + boxShadows: { ...boxShadows }, + borders: { ...borders }, + functions: { + boxShadow, + hexToRgb, + linearGradient, + pxToRem, + rgba, + }, + + components: { + MuiCssBaseline: { + styleOverrides: { + ...globals, + ...flatpickr, + ...container, + }, + }, + MuiDrawer: { ...sidenav }, + MuiList: { ...list }, + MuiListItem: { ...listItem }, + MuiListItemText: { ...listItemText }, + MuiCard: { ...card }, + MuiCardMedia: { ...cardMedia }, + MuiCardContent: { ...cardContent }, + MuiButton: { ...button }, + MuiIconButton: { ...iconButton }, + MuiInput: { ...input }, + MuiInputLabel: { ...inputLabel }, + MuiOutlinedInput: { ...inputOutlined }, + MuiTextField: { ...textField }, + MuiMenu: { ...menu }, + MuiMenuItem: { ...menuItem }, + MuiSwitch: { ...switchButton }, + MuiDivider: { ...divider }, + MuiTableContainer: { ...tableContainer }, + MuiTableHead: { ...tableHead }, + MuiTableCell: { ...tableCell }, + MuiLinearProgress: { ...linearProgress }, + MuiBreadcrumbs: { ...breadcrumbs }, + MuiSlider: { ...slider }, + MuiAvatar: { ...avatar }, + MuiTooltip: { ...tooltip }, + MuiAppBar: { ...appBar }, + MuiTabs: { ...tabs }, + MuiTab: { ...tab }, + MuiStepper: { ...stepper }, + MuiStep: { ...step }, + MuiStepConnector: { ...stepConnector }, + MuiStepLabel: { ...stepLabel }, + MuiStepIcon: { ...stepIcon }, + MuiSelect: { ...select }, + MuiFormControlLabel: { ...formControlLabel }, + MuiFormLabel: { ...formLabel }, + MuiCheckbox: { ...checkbox }, + MuiRadio: { ...radio }, + MuiAutocomplete: { ...autocomplete }, + MuiPopover: { ...popover }, + MuiButtonBase: { ...buttonBase }, + MuiIcon: { ...icon }, + MuiSvgIcon: { ...svgIcon }, + MuiLink: { ...link }, + MuiDialog: { ...dialog }, + MuiDialogTitle: { ...dialogTitle }, + MuiDialogContent: { ...dialogContent }, + MuiDialogContentText: { ...dialogContentText }, + MuiDialogActions: { ...dialogActions }, + }, +}); diff --git a/src/qqq/components/Temporary/Theme/theme-rtl.ts b/src/qqq/components/Temporary/Theme/theme-rtl.ts new file mode 100644 index 0000000..6ba1cf5 --- /dev/null +++ b/src/qqq/components/Temporary/Theme/theme-rtl.ts @@ -0,0 +1,161 @@ +/** +========================================================= +* Material Dashboard 2 PRO React - v2.0.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/soft-ui-dashboard-pro-material-ui +* Copyright 2021 Creative Tim (https://www.creative-tim.com) + +Coded by www.creative-tim.com + + ========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +*/ + +// @mui material components +import { createTheme } from "@mui/material/styles"; +// import Fade from "@mui/material/Fade"; + +// Material Dashboard 2 PRO React TS Base Styles +import colors from "assets/theme/base/colors"; +import breakpoints from "assets/theme/base/breakpoints"; +import typography from "assets/theme/base/typography"; +import boxShadows from "assets/theme/base/boxShadows"; +import borders from "assets/theme/base/borders"; +import globals from "assets/theme/base/globals"; + +// Material Dashboard 2 PRO React TS Helper Functions +import boxShadow from "assets/theme/functions/boxShadow"; +import hexToRgb from "assets/theme/functions/hexToRgb"; +import linearGradient from "assets/theme/functions/linearGradient"; +import pxToRem from "assets/theme/functions/pxToRem"; +import rgba from "assets/theme/functions/rgba"; + +// Material Dashboard 2 PRO React TS components base styles for @mui material components +import sidenav from "assets/theme/components/sidenav"; +import list from "assets/theme/components/list"; +import listItem from "assets/theme/components/list/listItem"; +import listItemText from "assets/theme/components/list/listItemText"; +import card from "assets/theme/components/card"; +import cardMedia from "assets/theme/components/card/cardMedia"; +import cardContent from "assets/theme/components/card/cardContent"; +import button from "assets/theme/components/button"; +import iconButton from "assets/theme/components/iconButton"; +import input from "assets/theme/components/form/input"; +import inputLabel from "assets/theme/components/form/inputLabel"; +import inputOutlined from "assets/theme/components/form/inputOutlined"; +import textField from "assets/theme/components/form/textField"; +import menu from "assets/theme/components/menu"; +import menuItem from "assets/theme/components/menu/menuItem"; +import switchButton from "assets/theme/components/form/switchButton"; +import divider from "assets/theme/components/divider"; +import tableContainer from "assets/theme/components/table/tableContainer"; +import tableHead from "assets/theme/components/table/tableHead"; +import tableCell from "assets/theme/components/table/tableCell"; +import linearProgress from "assets/theme/components/linearProgress"; +import breadcrumbs from "assets/theme/components/breadcrumbs"; +import slider from "assets/theme/components/slider"; +import avatar from "assets/theme/components/avatar"; +import tooltip from "assets/theme/components/tooltip"; +import appBar from "assets/theme/components/appBar"; +import tabs from "assets/theme/components/tabs"; +import tab from "assets/theme/components/tabs/tab"; +import stepper from "assets/theme/components/stepper"; +import step from "assets/theme/components/stepper/step"; +import stepConnector from "assets/theme/components/stepper/stepConnector"; +import stepLabel from "assets/theme/components/stepper/stepLabel"; +import stepIcon from "assets/theme/components/stepper/stepIcon"; +import select from "assets/theme/components/form/select"; +import formControlLabel from "assets/theme/components/form/formControlLabel"; +import formLabel from "assets/theme/components/form/formLabel"; +import checkbox from "assets/theme/components/form/checkbox"; +import radio from "assets/theme/components/form/radio"; +import autocomplete from "assets/theme/components/form/autocomplete"; +import flatpickr from "assets/theme/components/flatpickr"; +import container from "assets/theme/components/container"; +import popover from "assets/theme/components/popover"; +import buttonBase from "assets/theme/components/buttonBase"; +import icon from "assets/theme/components/icon"; +import svgIcon from "assets/theme/components/svgIcon"; +import link from "assets/theme/components/link"; +import dialog from "assets/theme/components/dialog"; +import dialogTitle from "assets/theme/components/dialog/dialogTitle"; +import dialogContent from "assets/theme/components/dialog/dialogContent"; +import dialogContentText from "assets/theme/components/dialog/dialogContentText"; +import dialogActions from "assets/theme/components/dialog/dialogActions"; + +export default createTheme({ + direction: "rtl", + breakpoints: { ...breakpoints }, + palette: { ...colors }, + typography: { ...typography }, + boxShadows: { ...boxShadows }, + borders: { ...borders }, + functions: { + boxShadow, + hexToRgb, + linearGradient, + pxToRem, + rgba, + }, + + components: { + MuiCssBaseline: { + styleOverrides: { + ...globals, + ...flatpickr, + ...container, + }, + }, + MuiDrawer: { ...sidenav }, + MuiList: { ...list }, + MuiListItem: { ...listItem }, + MuiListItemText: { ...listItemText }, + MuiCard: { ...card }, + MuiCardMedia: { ...cardMedia }, + MuiCardContent: { ...cardContent }, + MuiButton: { ...button }, + MuiIconButton: { ...iconButton }, + MuiInput: { ...input }, + MuiInputLabel: { ...inputLabel }, + MuiOutlinedInput: { ...inputOutlined }, + MuiTextField: { ...textField }, + MuiMenu: { ...menu }, + MuiMenuItem: { ...menuItem }, + MuiSwitch: { ...switchButton }, + MuiDivider: { ...divider }, + MuiTableContainer: { ...tableContainer }, + MuiTableHead: { ...tableHead }, + MuiTableCell: { ...tableCell }, + MuiLinearProgress: { ...linearProgress }, + MuiBreadcrumbs: { ...breadcrumbs }, + MuiSlider: { ...slider }, + MuiAvatar: { ...avatar }, + MuiTooltip: { ...tooltip }, + MuiAppBar: { ...appBar }, + MuiTabs: { ...tabs }, + MuiTab: { ...tab }, + MuiStepper: { ...stepper }, + MuiStep: { ...step }, + MuiStepConnector: { ...stepConnector }, + MuiStepLabel: { ...stepLabel }, + MuiStepIcon: { ...stepIcon }, + MuiSelect: { ...select }, + MuiFormControlLabel: { ...formControlLabel }, + MuiFormLabel: { ...formLabel }, + MuiCheckbox: { ...checkbox }, + MuiRadio: { ...radio }, + MuiAutocomplete: { ...autocomplete }, + MuiPopover: { ...popover }, + MuiButtonBase: { ...buttonBase }, + MuiIcon: { ...icon }, + MuiSvgIcon: { ...svgIcon }, + MuiLink: { ...link }, + MuiDialog: { ...dialog }, + MuiDialogTitle: { ...dialogTitle }, + MuiDialogContent: { ...dialogContent }, + MuiDialogContentText: { ...dialogContentText }, + MuiDialogActions: { ...dialogActions }, + }, +}); diff --git a/src/qqq/components/Temporary/colors.ts b/src/qqq/components/Temporary/colors.ts new file mode 100644 index 0000000..a8b6076 --- /dev/null +++ b/src/qqq/components/Temporary/colors.ts @@ -0,0 +1,388 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +interface ColorsTypes { + main: string; + focus: string; +} + +interface GradientsTypes { + main: string; + state: string; +} + +interface SocialMediaColorsTypes { + main: string; + dark: string; +} + +interface BadgeColorsTypes { + background: string; + text: string; +} + +interface Types { + background: + | { + default: string; + sidenav?: string; + card?: string; + } + | any; + white: + | { + main: string; + focus: string; + } + | any; + text: + | { + main: string; + focus: string; + primary?: string; + secondary?: string; + disabled?: string; + } + | any; + transparent: + | { + main: string; + } + | any; + black: + | { + light: string; + main: string; + focus: string; + } + | any; + primary: ColorsTypes | any; + secondary: ColorsTypes | any; + info: ColorsTypes | any; + success: ColorsTypes | any; + warning: ColorsTypes | any; + error: ColorsTypes | any; + light: ColorsTypes | any; + dark: ColorsTypes | any; + grey: + | { + [key: string | number]: string; + } + | any; + gradients: + | { + primary: GradientsTypes; + secondary: GradientsTypes; + info: GradientsTypes; + success: GradientsTypes; + warning: GradientsTypes; + error: GradientsTypes; + light: GradientsTypes; + dark: GradientsTypes; + } + | any; + socialMediaColors: + | { + facebook: SocialMediaColorsTypes; + twitter: SocialMediaColorsTypes; + instagram: SocialMediaColorsTypes; + linkedin: SocialMediaColorsTypes; + pinterest: SocialMediaColorsTypes; + youtube: SocialMediaColorsTypes; + vimeo: SocialMediaColorsTypes; + slack: SocialMediaColorsTypes; + dribbble: SocialMediaColorsTypes; + github: SocialMediaColorsTypes; + reddit: SocialMediaColorsTypes; + tumblr: SocialMediaColorsTypes; + } + | any; + badgeColors: + | { + primary: BadgeColorsTypes; + secondary: BadgeColorsTypes; + info: BadgeColorsTypes; + success: BadgeColorsTypes; + warning: BadgeColorsTypes; + error: BadgeColorsTypes; + light: BadgeColorsTypes; + dark: BadgeColorsTypes; + } + | any; + coloredShadows: + | { + [key: string]: string; + } + | any; + inputBorderColor: string; + tabs: + | { + indicator: + | { + boxShadow: string; + } + | any; + } + | any; +} + +const colors: Types = { + background: { + default: "#f0f2f5", + }, + + text: { + main: "#7b809a", + focus: "#7b809a", + }, + + transparent: { + main: "transparent", + }, + + white: { + main: "#ffffff", + focus: "#ffffff", + }, + + black: { + light: "#000000", + main: "#000000", + focus: "#000000", + }, + + primary: { + main: "#e91e63", + focus: "#e91e63", + }, + + secondary: { + main: "#7b809a", + focus: "#8f93a9", + }, + + info: { + main: "#04aaef", + focus: "#1662C4", + }, + + success: { + main: "#4CAF50", + focus: "#67bb6a", + }, + + warning: { + main: "#fb8c00", + focus: "#fc9d26", + }, + + error: { + main: "#F44335", + focus: "#f65f53", + }, + + light: { + main: "#f0f2f5", + focus: "#f0f2f5", + }, + + dark: { + main: "#344767", + focus: "#2c3c58", + }, + + grey: { + 100: "#f8f9fa", + 200: "#f0f2f5", + 300: "#dee2e6", + 400: "#ced4da", + 500: "#adb5bd", + 600: "#6c757d", + 700: "#495057", + 800: "#343a40", + 900: "#212529", + }, + + gradients: { + primary: { + main: "#EC407A", + state: "#D81B60", + }, + + secondary: { + main: "#747b8a", + state: "#495361", + }, + + info: { + main: "#49a3f1", + state: "#04aaef", + }, + + success: { + main: "#66BB6A", + state: "#43A047", + }, + + warning: { + main: "#FFA726", + state: "#FB8C00", + }, + + error: { + main: "#EF5350", + state: "#E53935", + }, + + light: { + main: "#EBEFF4", + state: "#CED4DA", + }, + + dark: { + main: "#42424a", + state: "#191919", + }, + }, + + socialMediaColors: { + facebook: { + main: "#3b5998", + dark: "#344e86", + }, + + twitter: { + main: "#55acee", + dark: "#3ea1ec", + }, + + instagram: { + main: "#125688", + dark: "#0e456d", + }, + + linkedin: { + main: "#0077b5", + dark: "#00669c", + }, + + pinterest: { + main: "#cc2127", + dark: "#b21d22", + }, + + youtube: { + main: "#e52d27", + dark: "#d41f1a", + }, + + vimeo: { + main: "#1ab7ea", + dark: "#13a3d2", + }, + + slack: { + main: "#3aaf85", + dark: "#329874", + }, + + dribbble: { + main: "#ea4c89", + dark: "#e73177", + }, + + github: { + main: "#24292e", + dark: "#171a1d", + }, + + reddit: { + main: "#ff4500", + dark: "#e03d00", + }, + + tumblr: { + main: "#35465c", + dark: "#2a3749", + }, + }, + + badgeColors: { + primary: { + background: "#f8b3ca", + text: "#cc084b", + }, + + secondary: { + background: "#d7d9e1", + text: "#6c757d", + }, + + info: { + background: "#aecef7", + text: "#095bc6", + }, + + success: { + background: "#bce2be", + text: "#339537", + }, + + warning: { + background: "#ffd59f", + text: "#c87000", + }, + + error: { + background: "#fcd3d0", + text: "#f61200", + }, + + light: { + background: "#ffffff", + text: "#c7d3de", + }, + + dark: { + background: "#8097bf", + text: "#1e2e4a", + }, + }, + + coloredShadows: { + primary: "#e91e62", + secondary: "#110e0e", + info: "#00bbd4", + success: "#4caf4f", + warning: "#ff9900", + error: "#f44336", + light: "#adb5bd", + dark: "#404040", + }, + + inputBorderColor: "#d2d6da", + + tabs: { + indicator: {boxShadow: "#ddd"}, + }, +}; + +export default colors; diff --git a/src/qqq/components/Temporary/typography.ts b/src/qqq/components/Temporary/typography.ts new file mode 100644 index 0000000..6377387 --- /dev/null +++ b/src/qqq/components/Temporary/typography.ts @@ -0,0 +1,324 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +import colors from "qqq/components/Temporary/colors"; + +function pxToRem(number: number, baseNumber: number = 16): string +{ + return `${number / baseNumber}rem`; +} + +const {dark} = colors; + +// types +interface DisplayTypes +{ + fontFamily: string; + color: string; + fontWeight: number; + lineHeight: number; + fontSize: string; +} + +interface Types +{ + fontFamily: string; + fontWeightLighter: number; + fontWeightLight: number; + fontWeightRegular: number; + fontWeightMedium: number; + fontWeightBold: number; + h1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h3: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h4: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h5: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + h6: { + fontFamily: string; + fontSize: string; + fontWeight: number; + color: string; + lineHeight: number; + }; + subtitle1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + subtitle2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + body1: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + body2: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + button: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + textTransform: any; + }; + caption: { + fontFamily: string; + fontSize: string; + fontWeight: number; + lineHeight: number; + }; + overline: { + fontFamily: string; + }; + d1: DisplayTypes; + d2: DisplayTypes; + d3: DisplayTypes; + d4: DisplayTypes; + d5: DisplayTypes; + d6: DisplayTypes; + size: { + xxs: string; + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + "2xl": string; + "3xl": string; + }; + lineHeight: { + sm: number; + md: number; + lg: number; + }; +} + +const baseProperties = { + fontFamily: "\"Roboto\", \"Helvetica\", \"Arial\", sans-serif", + fontWeightLighter: 100, + fontWeightLight: 300, + fontWeightRegular: 400, + fontWeightMedium: 600, + fontWeightBold: 700, + fontSizeXXS: pxToRem(10.4), + fontSizeXS: pxToRem(12), + fontSizeSM: pxToRem(14), + fontSizeMD: pxToRem(16), + fontSizeLG: pxToRem(18), + fontSizeXL: pxToRem(20), + fontSize2XL: pxToRem(24), + fontSize3XL: pxToRem(30), +}; + +const baseHeadingProperties = { + fontFamily: baseProperties.fontFamily, + color: dark.main, + fontWeight: baseProperties.fontWeightBold, +}; + +const baseDisplayProperties = { + fontFamily: baseProperties.fontFamily, + color: dark.main, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.2, +}; + +const typography: Types = { + fontFamily: baseProperties.fontFamily, + fontWeightLighter: baseProperties.fontWeightLighter, + fontWeightLight: baseProperties.fontWeightLight, + fontWeightRegular: baseProperties.fontWeightRegular, + fontWeightMedium: baseProperties.fontWeightMedium, + fontWeightBold: baseProperties.fontWeightBold, + + h1: { + fontSize: pxToRem(48), + lineHeight: 1.25, + ...baseHeadingProperties, + }, + + h2: { + fontSize: pxToRem(36), + lineHeight: 1.3, + ...baseHeadingProperties, + }, + + h3: { + fontSize: pxToRem(30), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h4: { + fontSize: pxToRem(24), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h5: { + fontSize: pxToRem(20), + lineHeight: 1.375, + ...baseHeadingProperties, + }, + + h6: { + fontSize: pxToRem(16), + lineHeight: 1.625, + ...baseHeadingProperties, + }, + + subtitle1: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXL, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.625, + }, + + subtitle2: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeMD, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.6, + }, + + body1: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXL, + fontWeight: baseProperties.fontWeightRegular, + lineHeight: 1.625, + }, + + body2: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeMD, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.6, + }, + + button: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeSM, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.5, + textTransform: "uppercase", + }, + + caption: { + fontFamily: baseProperties.fontFamily, + fontSize: baseProperties.fontSizeXS, + fontWeight: baseProperties.fontWeightLight, + lineHeight: 1.25, + }, + + overline: { + fontFamily: baseProperties.fontFamily, + }, + + d1: { + fontSize: pxToRem(80), + ...baseDisplayProperties, + }, + + d2: { + fontSize: pxToRem(72), + ...baseDisplayProperties, + }, + + d3: { + fontSize: pxToRem(64), + ...baseDisplayProperties, + }, + + d4: { + fontSize: pxToRem(56), + ...baseDisplayProperties, + }, + + d5: { + fontSize: pxToRem(48), + ...baseDisplayProperties, + }, + + d6: { + fontSize: pxToRem(40), + ...baseDisplayProperties, + }, + + size: { + xxs: baseProperties.fontSizeXXS, + xs: baseProperties.fontSizeXS, + sm: baseProperties.fontSizeSM, + md: baseProperties.fontSizeMD, + lg: baseProperties.fontSizeLG, + xl: baseProperties.fontSizeXL, + "2xl": baseProperties.fontSize2XL, + "3xl": baseProperties.fontSize3XL, + }, + + lineHeight: { + sm: 1.25, + md: 1.5, + lg: 2, + }, +}; + +export default typography; diff --git a/src/qqq/images/carrier-logos/axlehire.png b/src/qqq/images/carrier-logos/axlehire.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf44a1166d3b98855b5e718db153012d347cf64 GIT binary patch literal 4045 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 literal 0 HcmV?d00001 diff --git a/src/qqq/images/carrier-logos/cdl.png b/src/qqq/images/carrier-logos/cdl.png new file mode 100644 index 0000000000000000000000000000000000000000..b03c8fb5efe37eab0b941386529c6bc2c086e5b5 GIT binary patch literal 36897 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 bOWQG7apzt(l=MI$~a) literal 0 HcmV?d00001 diff --git a/src/qqq/images/carrier-logos/dhl.png b/src/qqq/images/carrier-logos/dhl.png new file mode 100644 index 0000000000000000000000000000000000000000..c930da408a67354998adbeb7cfff34eca71eb748 GIT binary patch literal 10249 zcmeHti96Ko-?n`jyT~>eAq}!;Um7VBp~jv)31t~e_MOOW8yfr8)L6%)9EX`}`CR99e$LN%eHXEJ^|cv5+#nJX5{BDwEd&V( z6Y!A+Nk$I*Ssf6Z0she6y<>D!8+qsZ#cO|lkKA24fOc|kguWq39!Hwvd;$pxgygms z%*bzSrJa-%=nO-hR{W+R#{J))|5ygXMw{$^%9jh#<0wUKT?Gg%1kYD}^E5w&a}>w2 zNff?B2hy$6+*ui8*0#O=g!g$w30SGJhSRq3s6}DgH#{cGu7CTuVu#{Ck3XrXCVrI{ zzRnLq&NRe0&M*s-GcN~Tx%9UjOdDvNsmy&{xe;=@>=4&w*_6Iky3g#_|IIvOaRRev zbNXT+`{VKM;LSMq2Ny$6Kc_U+AMF_DJ{!$F+Sc8-P%KvPe`|S+nnE5g>g7Hi7J1bC zER?ZTW-oQ};T`+!ylG_bfy>KGb?HwPRbSwD+&%3S4xlG``vU9wxolbV%kIY)$8Pb9 zHFY18tg5fyQiIlfKKxh;IyEH}boYnrlGos*ep=;rSGH~xv6!|~Dj}W2eBzsQZN8a1 z20wT}8T0fDtfd=++}Jygo;7GIc?Znyl~5M##-C5tBd7)3bIjd|%~Yqh%IdxZyLQ>E^nDt?TBHWx!lLyPD8G6Sj zk!(nuH6nx&JjHpEH(f)Av7cl@;Ce*9oNwYHXEY}kZFh2}ky4Pq`R~3IG#3=R?t%O^ zJQ7nG5VxWQsGzesT~)}$)O_-EDkmyvQw>*f7)Jh zMsZ8BrNX``n_h&kBz+Kvbop8Kbwtw9F}Pmtx-1+T#V6MJCkN2=wBmPCgMO6F1BJ6= zR8Wnl%(_w`G{M%7-TEO8_6kuy$A|ryPO4-&@Js{r2oR=g4D=bmBP$+>mMN7G-<0GA z7Fq8sUedxxYQ}kLJS3I;a)XD6?s{~sZT};br!+tlxJ#T+_bBkijhP?%Sa5&FPLmcB zkdS{_s|n*+z$B%X!9v33LycK9>wfN*yV~qG9gj>I?Zz_H`}_6BqE{#AS{Db4DTBPm zAEBxXw33gKVULpe?6FN2^0-t%iB00S7Jeh%x^1M$?0{Hq028{|Gj#i9 zWm6v^!ZM|3HZcuq35J0}Tp%QhQI^35H*&fY4^#}=jtd*Vr5HkLGup<5Ej{}SQ)~bh z_!LmwTX~Mns*$HHq++t;Z=%=)BhekBJtU+x8zR!G-}v44Cs({T+V)U_>tv-6Ok~+m63Zm)1W9dqg^t? z!|Z|c3i$Muu4;Jj_m_~~vPo>wF_}Q|Um5;=FAr8(_aEJWw zc?U`h8loDV3<$)iNMdD@kup4!|0Nf8WzhfXqtIx*RHl@Sa{<3lj;l7;Bh{$=lFf40rnS6N5GqU7x-LvIpD=3YUqhQ zL1MD3FvM}sqX}=bk#S1zb;%+9{W36^ryWR|pZ#`L>xOs-t0u<@7Z+AM&>Jxcz+!2B zbId{oeY0|5e0xIE-P4?B9d&wH4xpF&i6Gz!0G)630h@R>dWA6YPqOtT{z*1n#pe%q zo`@3asLt^jEb{aNhJ&)RI-~ur$!N*_a+Sv)`Sp7K_hR$$WTsRN0gXR4P!je>*s*A< zvGTWJjtLLuh{7McA(+l9uzhKqiwgRLoBz=$l;DoMR6wswGnr-R4`5SJDrlo+03@m` zCCJ!!?oSm53|$jlm$zKlkSc$aiHIHw=jyWzA+E0%ZfceLEYrjU=RVZZ{l;_S6;J~X zIogyH`seU0>KA%zZOlnSp}+O$5tpL$7w3Iamw!<^>0?*E`nXaaTTf)msld6oqQQWD zCxPm7iB>jVyFT!+d~yu5|ARMyDHX_yj%Zu$eII9)Us^B(XMcZef>?1LW9drL})DdkN3}URQ^dUFt|tl0iEan zt$(s}?aGNDe4Lv;kcE`3=;gp;nF9vS0e!MUMxs4@#KZ|b))7yLwoZ$Q5w#UTJPLgW z>A1iC38-nmTm5}s_(fPmH5sOclD7OAhF}&$CJVp6hu(+Qq!W;P)RYs(-fPf4QeY)^mk&?~7!Q`6TF7r^Ag?nD7~>}IDdEyKKiCoOZ^ z32Xuu11Tm^pHg;Y{~az91rcV{wZXARq7S3VW7vDs$kKK%Q$R^$gx?6ZP`?Ms>0@(* zN7#^jOyCfY7af=2TwM`lpJ&6%$XuPRuFjZNW5c%mfCI^C{cq+7G~6ke6sSJg#Bb(o zxm3_1w#q3Y{XoK^eiw!9@O>8@ph0|2DY2&W^A>52fAjxgV)QlRNun13*2p6JYEtF@Pr6JB=6}kUOk1-D70FHB`^IP#? zgy{%v)0-i1T)Y=yI>^uW*+Cf)VOC|0Nh)X;o!J`EarLpKA{dQ>pM(8vx~ISBdfr#Q z6X%g9hRkdBla6fr85k-obP}ZA-2T!fC5iIXKpbzw1%8aMq-+9h~)lC;9Z{Hys5uc>ona zGxcx_X96tA8ey*cq?-_)OO|i}Dv(ux)R1YTFXeE`fzx`45nTSTrYR?8b%X0=FAai> zvh>KxKOK!lA%3FFPISrB2ihh-}(4^-DR zto0&*Z`h4iZ#h3(F=`<>#nB~sY)X*>(`IxeMEGOu*T{Bql^HFa%CGm)ZrhAKAQ41F z>MuOm)R35M1lqP>C#h5+rnbuth9Ogjj_=UBs4`H)bZAC}`2t=HD2i8pRqXQEUF>{o zeZq>RkhGZjeD|(qQv_O3oW^-8@x!M}O&x!^C{l$qGH^c^Si?jg0SA;PJxk};@=({?a`N8zfC8jtEC{@}hwDh?zO<+Xs*ZC`G&g7Crpa~8lF3`48;=J}aM7hf{`})*3B>l0cz^lGM zX3!cv7(g#c{%bZnI>_P0KzW+X>kg0$fa2mb=xlfNV^4Y1Re)e2Z!2zhgQ8gWiTj%T zQ6o#=?Rc+bxYSI63Ta1e0H#uHbZHYR}0NKn8M4+B%@Bf5f5-fqXltUyARlU-FZ%l%YY0 zT8Is>K2YtXGXsvtg-XR_)=LRp^(6p^KLC@*2ls>BCg)vIK%T*Avh; zfQ=~5r0l8^R&4x>fhPvP7@vZN{fcg)WZXpPiF_6ccKXFz`v|x|X%V0~AtThlY|;@h zpBkL@YDV#{)F_QK-=CJq0Q{aNiuF=m(U*I%7od)#NM>xW_VW$S;J>^DCN^mimoUi# z3EILDXuA~D1*nJF#_O*-^>Y|Tn?bT0|ZIv+AsbVu*vt$u$9BK zLmF7;`x}MlC?%l4Jj`-gJzpm+b!S5gu*6Iya?T2*4;-}$$-#8ibruScpUj4dl4o{S z?c7o>`&H8}d!Z2mr`6af=z4m^G(JMG^38dM%K{>4GMi};I^2x<*gM+s8{bPr+#}E_ zM1DmWmv5>0uMGj~1Cbil7#`CGmls&>31d9WtXKfDt+bcBE!5`%J+6Vj=_>myFBDhyN@-kTYlBUldDbjbx;wI${I{mu$YP>l*8>7(poJ5(&P z{!BnJdK$W_B$Ef=3&@eGp)$@KIMgx&)@RZJi@Gyaw+Zxj4k95KmE?if5MKf1t!QZ`H8Mt^-<^vXzzP!IKLtOU|bt!lSEvCQogE1wjZZzx9z5+ag z=(0XPDibq_N}u^a|A2@oU2Oy*@u!Ba@x3m8y<>>w*+H*8g9rlzdc+JJn#va!9XGQo zR}-sU0zBLjFe~yW*1Ubm6hu=#T|j4gNJh)0mB1|DgwPIMG3V~2mtIEbMB37 z<@WakMhL)3rsZZJa)6iK7RDqgiti`a_B^#LHldF|e|^SP18f=UpWBmWdYOn5X_gCL zxLs}!y)O-%7#zSI^3`dGrbO_9uI2@7RKDM$7q8^|EcVwgfr_F{?zDfk>{mC*J_i); zh@tzEFt5P)pw`I7XPaMBh{pQ!%&K^pb;X*7ZnVpX07;6CDv!GgKiDGMOgGIBI_!9% zG=i`WzL(hFA2hM2esbJYtigXzYP6CP8aiLnQ(=wdxxZ_4W8y53u-r$~PX)P@eaxqJ zM-pxqm=1~GAx_Jh+P2lQiT5JOae$==g6ulEW(4}@QxdtAzn4jRFOJ8eN!Gn5h-1l2 z;Z9)(fN9!xmL?C7Y&pb5QDt1^050F=d#p-2gye8Ru}W>IHTLVUJE)W{ z90}_KA-P|RB=F}RW~x+FsLEGir1QG*9X}j2NoXxVoVM>NPF~xvNrgo`0lu_~?{ln> z%=e^_QDsQN&Y0!aw#aFo(;`?4C{WBo82?=6>+Qxyq-zImq#w+0vaf5Lf6(}PgSf(!e2TE7n2^X*ogO!_3T`wbWzP!~P;p40H~nabf| ziOZA80;X=d{aTAq^H(ALtxbMq6&M?uzq;wuxV+fpk!w$zakYDILHSgA{L3}`$ z<-`EetS&Q78?=A5?)2>~()?^%`@-YcqWRA4cXfqbAW{9!{_R4tQ~7>Vuk3oI3}aoT z4IInKCk{%tUy&QK!qeeNlS-v8p`mNuX4L*2GsfJyAjNQA=3Vx)KChw<8JZf9ZuQo^ z+nZ!lXm7JFOTO>W0UcG7dg+kD3EA~GFE==yq4tlReuTqx4?ay_EtZp*Xe&@vSq~0n z6e~Pwe5$jc65L@o`KbH~f!^o3Z^v2D$zPe9NrMsSfN&GL+wavyyRC57BGGjeP~FLU z%db-=WC8nyF|c4=EN@u&lKvVEe?kRidZQ`@!*`ax z32Z*NAC;n1(4Jdt&jCj&Kd^&Lt2VDvKWM>|U zmTuvP;oa!!olu^Grl`%<#;9EYiz<2GD$xI_#)bm=Y;Oy1gERLb0FQJ6Td4EqD`^n& z=DenCNJbR`(rg&wFc1g(bvgQJ`%yz-*tF+z90in#0=Pujl_qDRwBdcK2pHUlBma#B zNrI3HvJWx`O{WH+?T1(!;%={mEg0^Av6gK0`M?5bq>T~k*syC-)?m~-5Vqqfi7?)!hEOMO&m!? z$p!LD-7IPqyNBb^$Ntp9tApwR*BA&SI7^aWz`7tbEI|8?qTESanBt7JTu1>jyTPyb zE)M#L7^kU*^}Zxli-NT_T$v!4)Kq_w~YTcE9`|B(N_-~ab-u-B&CbWecR!AOU7nU=U=S!OADGZ80 zhl7iI%Z0Yj7ZgUz^9eR#rhxr?w0l!*t9mPMVL`3(8oc33=nah7<6lA2EI^L{#!;0F zSp4|AVTP4bX}i>%iU@iWrUM=}(xHIz)8A&-$JUhneYekUQuxokOtqLOXHs%(w^9KM zHr|pK^SomWz+w_(YdXGoh1+S(p&Nhtgz@7Mn7>dlZ%i%4U39a?zDdh zK9TvETEU5?YYp9?*g7!ZVD4Xe^Swml@-na!X_EY;=RxltKeQw)CslJf+r)=hu zjB1t0G>YZLf@e~!qmFgLDVzB!9Q|0*iBBa2x7qb?gcM|h_Opw<368T?s|8Gm#PvJY zF*Q1yCWQ1^2eYPT;zN!j+h*NEd&-E__DDMHFPAB19_)J$eogJ?dh_=HKV06TuHOkBdfY3NsKV*XRsUx zOqIXBY=cuOOQ|Po5SBup_ONk)En3%Ckg?i`SUe8A4~`vRM6?s#9$;UiGdHhVuQO~mQqQ^ z2R!jg&m>O|xo{BqMPexiwC|dJ+I&>onv-&4A&aCem{g=z=ff^8`*n_a&NfvGu(?yp zoNuDE7U3h2Z7xd5o>3)P-$c7b2{Tksn}_qb+G#Df^Vp^5u~Re2N2r`8=@j1@r_@sO zxuQIIvi_eIvLt!9Ki5Ak`=W1*Q;c!184%@fWlAS5K&h_~ie*KrL4K9=PtyM#B)2#c zJ4O!7Q?dsywZqgE0qq5oI@apEG9i4Sf*Kfl5ynW$4nAKgF=jQ!MKU0MKOnZO7TLF$ z24lkn2g941;`_qIsG;Mb7!6=hEwwchua9D~XFS>G$EiYP#5wByec^Fu1-ferB~QOu z1sIZsJ~f$Duy-)yXi!3Wgbg=_O$RB5c$z%EHg~vil$`esNQq!hb6$q1>2s{Y0%ab2 zv^A`PZT?Q*_%pA!PW~bYK4gIKLgUvnE&OVZsAy046Y`qjz}JSUN``B|&2h)w0xpxu z7+-ynI*=C^*Kn!#`c|W(_MAep3dg#>-RB|YrHrS!+F)#u%zo1l-Lr=0%!i(z-RpZ{ zc;~~Xvvh$NDaR!>xRMx+H34`PqP_Ca%&V3Uo0Bd$G>4-;T3`N>-}fX{$+(>PHp{Rk zHPpg)-@z=72IFWwkGHz-5H`He@5YI>)QY|)_Tg=BcpQ06D+3kRuw^ba)KSmw>XsIM zgs-Nhh9|WljD9&_%GEN1oP*jac#DBJCi`UTQYm@ajg3h3*?QdjH4~5*DcA5;W?Kp+ zhX)A>buRIL0Up>fTB=YC@9iuVe8?$r|19mB?~OQEEST2H3;DY9l^dJmx=-_@DiWQ0 zK?iV`gqWuij;DY1s3uqYCaoJeF!F2mTZM6`z(*UBuu{L4#+@=+^hEo@HGu1@Y-{UC zG#w4*SF1yU-=(<~>6k)2%}DgSr;|c`zXh&t+64M0DLynaT;24hDEV>I$?9O{was(_ zKIhG9EczV>fszT)DoWT&GxaT#>6#K;ts;@!(ZYY`ih<#0WJ?d|))5BSmE$ORxOuax z@Ku~3BSM`k=x!He&Sh2-N5_Xf{O@-J z7k*}zYo|9Dqqz`y&=9&ByuiC&O%2VK2LU2FT@c4DIZ2wG^$#%%Y^&3)zXEzbk6DRK z6=Xjro1&M7H}sP=1I55}#2wm8zpPpt*7io9I)HKP$~dKpED2@j zy7!l&4)G04nR}64?mnFs+qzqnbZ$=zXdmVfZOr|$)>X(=Fg^1*U}lhxF?Gi0NaY;( z==-5{nay8G-^p#{Lgm{wkrmm#?IMWx!7(8$4ZT{WIDu z$B&(mZI^+MN-fj4rV5qfG8b{`CV^88RM4YZx*Hb4w3HJesLhH!S+ehXAz{ONy6u>< zlqj;_>hK1u7;&`(V4Q2(C2FYbE^bn`)cEg&ac9(Ktt7YA+1pi3SYaS!%GuVxksU>}q>vB$`DGxeUX*yL*jDoM_<_slBl8b(ZMrcOY|Hfl6x$ z!N5C+?{wBNdEKTqIG|wigFQ;JcbluDb;xUYK=oaw+z%{-cLE6o1T^7`@@%>Sq=gL3XHpg(Zc<&T-02GUl9D2o^oRBXt87~Zi&rBtD-DWwW{Ls3GQa42jJv&e%Vcn8O14?*S_)Vs?G-(Yxv zhAtSs|F?IAa`GnCUbUEFoiU_ZCo79R$)`tTp0_VI7bf|qIk^ZuFSzuR#b|5zkBE3p@LX0s<~^xuv9-}e7e4A_c; Xa@ti77p`a%w{`obzE-)WZN&cp@48** literal 0 HcmV?d00001 diff --git a/src/qqq/images/carrier-logos/fedex.jpeg b/src/qqq/images/carrier-logos/fedex.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cb72914501666554332976362ff9bc555cef3e8e GIT binary patch literal 174543 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 b?9~20QuKADp%Yqd00000NkvXXu0mjf6@Wd; literal 0 HcmV?d00001 diff --git a/src/qqq/images/carrier-logos/ontrac.png b/src/qqq/images/carrier-logos/ontrac.png new file mode 100644 index 0000000000000000000000000000000000000000..498f97ba2be3e6943dcdf6feba75c5027a5f95ef GIT binary patch literal 16512 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 BqNM-; literal 0 HcmV?d00001 diff --git a/src/qqq/images/carrier-logos/ups.png b/src/qqq/images/carrier-logos/ups.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8046cf1efd2f400e19e58d4b781e012ef2a0cd GIT binary patch literal 150048 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 h z4OVI(ArCF*DdnW3J*)beNcimJa!Z#&sQ(Y)H`jj4J+kgolyh#ZT$)f)%-M4P3sza`YX-S1?Zyl#Re6`)ji38t93({eFZ3d zZ080no51SxqG@S~_+{l+L*dbnpI#7;{?}*Y#^^X>C;=6)0lW-8>HXPENgFO8cvis` zEK4}MdsAV; z8OYTY<`C>=j`enQ?Tk^g?N9S86{NBFR>Bpe2(hs_!^<{}Ii4LMIDF8c;BP`(8$Sa( z?ZqX8w=y5Do;(TqYjdCEJYXl?Rhk;cyxXNqmSxI$wBnsgojFKLZxQXe&7?td;Q1Lk z_4|C^V~gJzBK+V)-G!4&`o?SIsy<>flyQv*Yem9RYY=^2~JMp_H(05`~~%h?=zfXj>c6 ztUxPRg&xR<1cpb5Psq919BSh_1T^6|K`pt9W$sDNIBnO3Tf6L9u`woknZJcOY2@uX zZpUtRrx1pVkmTofTK2d#V!PwF7wa1j13Mwfk$7C5@9?>9{$IaxfQiPuJ_|TqQk9Lw z@{*F@#EBu8zu9ezu~HY?sgJKBn@$G0ws(dVwF&vg^f(@!_Yy!{>l)Es<Jb>tBYP$Q4F0|yh7|ngLKMrD=-yL6qj;wM3L_ePU!sJB9+H=%B zBVhH3FmV+AM#g(?`}kS-TAD{O4Z|0332r@pZ+omIjo_t%OU543ycZk!5(Qr1En!ab zI!?b^#zqPhd<+V?kcs;3TQ6$OwVd5L2z>1-I8a)h!{}Md;;R(V`WF}{{GSm>KU1vx z?!H|2)mK2&o9YHW#-ov9OhUMQZ`#2KDohZ8P+-69y1eMUqXP(DMhg0RLn*^% zNJS-r`eKqEWjV#_=vppvp9k@pOvaA#FhWAbx5se!{GY|)44xL@ta#7N@e$T{9+p

dvFwiCdZ_ilz3 zpTPkm@u7lK@)RjOSm<9z-pM}!imw7fIeFT9z{|pV2G2#r&wV1w*m(a-R1zTi=E7K( zBi(mkOis=!2a7{Ynq@!CJPd7DKU3z>p&0JL-PXR&r$^Azmc%-B&Y3!Uo@($OcD(oS zQkwId-NeN=6y}L#WYA~6MJ}}A+XUHIV~&@u2eh;9hW-t{&Y)<_qua)a6Wp>>y7ep9 zlXl^|s%B?xspHRoav2`qFN!b*t zU7u3q;6;y(9sX|Nj0$8F!A^3BSooTFlA91y4TL@!s@Qhzs@iYVE?W=bW9N^Ty|jn5 zPO%grvYu!EE-qm2grCo^kbr;W?`@oPecX>9J(ZX_*#ePoogVR>IHyiU$^I0DqMx*8 zKOdb7xCrV2SGBN`+iqk2aw?BPoZ5e=Q{0lHy3(FY-yXF3I=bMkUjp96^fXs{sTLP& zlb||MnwMcGZzdvJDa^%x2WQl;Kp^9Tm zN36B27JvSF!tAf}gN|WSHs-rBj+6fe83Pe!!-gtSk3ups{JpCT()@sN2u8Rj?{$q4 z7=qpC-s?wjtMWp#t2N_p9fjrH5=9lN6edkP!-!R;*HrL?=-)H>PVSpae?^Y!s>xHf ztKDN%QK1CpVcu8PDIb41RSwr+`?H?*G{EH}3iuu|2Z0V4o19sv!t%|CFiF0LdyyTNfQ zM(3RKw;$cQ{-?65e^vHrqM_c-$k!eRGo+{k$^FfB%_|*MS*v~v-B`5SMC(+WX zbHn0YI|EDm109?JY$7vpJkjiWTU_!C6@0brKXZ|emxrIZYyM?aBIiLye>Z^e+0qje zy@|ns@FvOl9aS^?waH~`%?pPH;pDNvT_$)v$4CsUzTH=Ni8lC}o*%d;C4-{Ox#ZJ327ZV<6^AL6F#*JHMA?2h+sMGtOGkXdliViDJ6AlktW0A zYYwfMiEW7=FPnlb$F8k+=v)PV8`CLN|M#y*K67`uPmzpPEb&BnNZD z7KcHYK`gW4LM#?*rW)WTbH~}QL5ql=Ro$+sf4@b2-35TE4Y-4}9(EvZ)|H?9+&sw@ zVGHQarEl{ojcN+#`nTnSy6S6<;zxHauVqnBeH+u``E{Wy|L^DjvIOwa=hyelZa*&Y SuAL;2R#tfbx>){`&;J1<9Plv! literal 0 HcmV?d00001 diff --git a/src/qqq/pages/app-home/index.tsx b/src/qqq/pages/app-home/index.tsx index 1fd4f7b..43038dc 100644 --- a/src/qqq/pages/app-home/index.tsx +++ b/src/qqq/pages/app-home/index.tsx @@ -1,5 +1,4 @@ -/* - * QQQ - Low-code Application Framework for Engineers. +/* QQQ - Low-code Application Framework for Engineers. * Copyright (C) 2021-2022. Kingsrook, LLC * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States * contact@kingsrook.com @@ -29,17 +28,18 @@ import Card from "@mui/material/Card"; import Grid from "@mui/material/Grid"; import React, {useEffect, useState} from "react"; import {Link, useLocation} from "react-router-dom"; -import MDBadgeDot from "components/MDBadgeDot"; -import MDBox from "components/MDBox"; -import MDTypography from "components/MDTypography"; -import DefaultInfoCard from "examples/Cards/InfoCards/DefaultInfoCard"; -import MiniStatisticsCard from "examples/Cards/StatisticsCards/MiniStatisticsCard"; -import DefaultLineChart from "examples/Charts/LineCharts/DefaultLineChart"; import BaseLayout from "qqq/components/BaseLayout"; import ProcessLinkCard from "qqq/components/ProcessLinkCard"; -import BarChart from "qqq/components/Widgets/BarChart"; -import QuickSightChart from "qqq/components/Widgets/QuickSightChart"; +import DefaultInfoCard from "qqq/components/Temporary/DefaultInfoCard"; +import MDBadgeDot from "qqq/components/Temporary/MDBadgeDot"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDTypography from "qqq/components/Temporary/MDTypography"; +import MiniStatisticsCard from "qqq/components/Temporary/MiniStatisticsCard"; +import BarChart from "qqq/pages/dashboards/Widgets/BarChart"; +import QuickSightChart from "qqq/pages/dashboards/Widgets/QuickSightChart"; +import SmallLineChart from "qqq/pages/dashboards/Widgets/SmallLineChart"; import QClient from "qqq/utils/QClient"; +import LineChart from "../dashboards/Widgets/LineChart"; const qController = QClient.getInstance(); @@ -199,7 +199,7 @@ function AppHome({app}: Props): JSX.Element } { chart.type === "lineChart" && ( - diff --git a/src/qqq/pages/dashboards/CarrierPerformance.tsx b/src/qqq/pages/dashboards/CarrierPerformance.tsx new file mode 100644 index 0000000..7de0ca6 --- /dev/null +++ b/src/qqq/pages/dashboards/CarrierPerformance.tsx @@ -0,0 +1,210 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Card from "@mui/material/Card"; +import Grid from "@mui/material/Grid"; +import Icon from "@mui/material/Icon"; +import Menu from "@mui/material/Menu"; +import MenuItem from "@mui/material/MenuItem"; +import Tooltip from "@mui/material/Tooltip"; +import {useState} from "react"; +import DefaultLineChart from "examples/Charts/LineCharts/DefaultLineChart"; +import DashboardLayout from "examples/LayoutContainers/DashboardLayout"; +import DataTable from "examples/Tables/DataTable"; +import Footer from "qqq/components/Footer"; +import Navbar from "qqq/components/Navbar"; +import MDBadgeDot from "qqq/components/Temporary/MDBadgeDot"; +import MDBox from "qqq/components/Temporary/MDBox"; +import MDButton from "qqq/components/Temporary/MDButton"; +import MDTypography from "qqq/components/Temporary/MDTypography"; +import ShipmentsByWarehouseTable from "qqq/pages/dashboards/Tables/ShipmentsByWarehouseTable"; +import carrierSpendData from "qqq/pages/dashboards/Widgets/Data/CarrierSpendData"; +import carrierVolumeLineChartData from "qqq/pages/dashboards/Widgets/Data/CarrierVolumeLineChartData"; +import smallShipmentsByWarehouseData from "qqq/pages/dashboards/Widgets/Data/SmallShipmentsByWarehouseData"; +import timeInTransitBarChartData from "qqq/pages/dashboards/Widgets/Data/timeInTransitBarChartData"; +import ShipmentsByCarrierPieChart from "qqq/pages/dashboards/Widgets/ShipmentsByChannelPieChart"; +import SimpleStatisticsCard from "qqq/pages/dashboards/Widgets/SimpleStatisticsCard"; +import HorizontalBarChart from "./Widgets/HorizontalBarChart"; + +function CarrierPerformance(): JSX.Element +{ + const [salesDropdownValue, setSalesDropdownValue] = useState("Last 30 Days"); + const [customersDropdownValue, setCustomersDropdownValue] = useState("Last 30 Days"); + const [revenueDropdownValue, setRevenueDropdownValue] = useState("Last 30 Days"); + + const [salesDropdown, setSalesDropdown] = useState(null); + const [customersDropdown, setCustomersDropdown] = useState(null); + const [revenueDropdown, setRevenueDropdown] = useState(null); + + const openSalesDropdown = ({currentTarget}: any) => setSalesDropdown(currentTarget); + const closeSalesDropdown = ({currentTarget}: any) => + { + setSalesDropdown(null); + setSalesDropdownValue(currentTarget.innerText || salesDropdownValue); + }; + const openCustomersDropdown = ({currentTarget}: any) => setCustomersDropdown(currentTarget); + const closeCustomersDropdown = ({currentTarget}: any) => + { + setCustomersDropdown(null); + setCustomersDropdownValue(currentTarget.innerText || salesDropdownValue); + }; + const openRevenueDropdown = ({currentTarget}: any) => setRevenueDropdown(currentTarget); + const closeRevenueDropdown = ({currentTarget}: any) => + { + setRevenueDropdown(null); + setRevenueDropdownValue(currentTarget.innerText || salesDropdownValue); + }; + + // Dropdown menu template for the DefaultStatisticsCard + const renderMenu = (state: any, close: any) => ( +

+ Last 7 days + Last week + Last 30 days + + ); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + chart={carrierVolumeLineChartData} + /> + + + + + + + + + Spend by Carrier YTD + + + + + + + + + + + + + + + + + + +

R4*PLB3!T2P&&p`JLxbc><70 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 z z>*1UrfoFn9BrYkxMbyx7GpR%62QC&L^GUnp(f!~ZApTQ2W>3O~b)#-CowpEzHs~u3 zUEvk<(wSR_J8FPJkbfV*u&p z6DLj03Oyz^wqi5z0#i2yC394(P}T}aFSJ$On*I3%FObh91C9@YHK4Blw z+Lx}phO2mj;n67X|3bs2%Yz~I202}k7J5XgQ0Twp+ z+?Urw(yRsY>u(V(_BNOlJ#atwES8kPeM2MQ@$rPv4P2^(gB7-W%6cW%&NV5(Y7=SA z!GN|7n&PVZak#z$#3^|Ow zVIGIP9pg2syVxQqZw@+Y$z3fStwzaLsP5Xe6s@-LpHwhz=cR!pXLqD=bHjK~u$Mc> zOc8fP0bH^NIP|r&C{#DqLX2A==f9FR{dDeYZf>Hbz{piN z2>Hbau(LY4hCSA@5yH3}Sc5^!EbXG9jZ^;fLXgNl z(YPj7WO+vP!Bi+y=#Lr64QK*oy|-t*`;*SQf?XV4xR(rkZ}=DP(EzhCJM~};oa4Vc z$K~nMs+`?fiSGRsgf&X~uBn*!_Ld7n%OD0Npodn{eVVtVPN zt?SB&-PzA78VjXut&ew^pF3@0cdRMDtb|~w?qJ?dX=P2&T&+i;yJDq*=ml}jIy3`yGaxwERIEtEw(;g0F3PX(yha(AynItZF2XKd#@wAPXL*gtFja4j`0L z=8c}cXbvM3ROeCjOGCK+Yydd_ms57I;P#{X_<0|Ri!a5=1!1ngA>v(Sth2QU!z`KZGE8o<^v@Lz_UP4Gefq_Bj(3` z(6)wEot#oPv3PXP>%kS}E}SuoZWZ&sz8El;tX`eYd$?r7Y%)I=)mF3w8yzfHEDha( z5Q27~dFGk5FEk~3TZ~lzClZ6Slk~YR`Vnx>@xn$TUZGNfN}y_#6+e4%hg-6WQUu33 zz1oE=)QE!%K2&OS;!NLd=m%0#IKO=OL}1PPAJ9k{UF@t z9J;t9FXbf_@@@mUZE6FPxWSPva@!6^QhG^FF!P?U=J}1zRVZ!_?*7>i>MWC>e9`&%%1kb#jsnT^NqO(4Onp-X zTi7Cm+Dh=T1On82!r-hpc$gbA^fZo{gsDt7G~$)qyb!~TUI-n#>?R|n%HZYqT{UVM zO!fklUgt)F6J#DVgxZfA*>g?~lLerS+Djc5x%pnvNRX=U&fCR?X(Z5`NU*AnCCfGS5azAlWU;qiw%}Z z`3bNCyUkB+)-#5CX3^rE7C0{JLBVpuT3VEmp*mzzCBC>bs(yE?o|DY!>w36|+v(sM_%y9#$ z7+zUoz)Qb-V3avTt-hOIXcCZA$01Z)&H8eQ+RbKg=U5Nh+3nfy{SlJTAQ@Jb7+jpt zTXb;K5v;mTaqR*`K2~4J#p0{2Q3YPSIcW@gH7Slls`(Cr@&OFL5I))G+=rkTD zc0A*)0IpFht>h>#bkkc#5jszP{P<~vJzEX1SE&tA>aoWG5j7<`>`r3H*;|OH*dUOV z#Wpo+y{>T;)fLq)WD?)=iFXIE+)C`+dL2>(70o)W;~4}~<^Wi)8vRE1YC@U@NH!km zn)jUht*ins#1tRPUQGxbn1QUcAp1DMy7vr-wa$!j zfe80F$tYfP*>dvo`QA}t9sxa__b!pRXpub{w@Yq0TBxKZd`cKen2?4`qul@bYeS;j zqhtW1F^!vj?qSt@58csQE{CyAz_V1SFDV5C4ctHibt9h~=oQ8Xc3^!jWUV1C5z)~G zdFri|ihxrKife9kXIJ7=4=c5i-^&ZDDm`s(BvvFy{MJA(lfm7xG<5JKQ5CtNt*n~m zHB7x8TE2N)r&bQ&!?fV>9tJ<2kt60BH>$Z@juyL9mPKerBoS9euFl>kN@@|w;-Ez3 zDV$FR;f+O+kyYmK(qKiAx2WsDaZ_EeEg8)RiEe*i1ro1eebjs2?j!gug?wJq>vZ%5 zWA_1&3`VAPTGsssF}y(xm8a>~5iWQ;UDZmfG0oh41+OG5EJp&c$G}oSg-MH$BtTzR zLEb~C!!|=JjG|q`pl+9U3C1Bhlz~=uPBiNSE)YI@u*vq>-wpHp3g=lY$rO4|bm?!f zeN9>rjtkNkdP3yAuOi=|6&)3-?;5r$^#~y{oMp7Ftes(1af|WMy+${%t-mKhhTE?X zl|XI~y@%zNBgenTPe{M`a8E@QrR+#UR4sYMK>Z`2pyv+wqzj!TB;}Vs3{Jm8f?4qA z4zaDan63&6n!l#9ch3m+Ed#)`xN1)9=a~(FR3~(C!+|^ez7WCu)D;WP!l>_hW`xic z=@vX_a7xZHcBP!25V0P_G;Fk%`lj(j68dNWDU`pC4C;3Aln4t-5N;*zJCLixT?pJF zP0v~NYD2(r??me@A5U1eN6K8>^l}KNE}r%X%z`ZlH_lgLOZUMn6wI<}KE%xKEzJU` z8jy3c$d*Jf1?)yukXiJE9b<>Q8Q*Kbh*~c|y}QyUXd?@xf;7%|cyvOqvW2n2p$NfC z9$5pxg5NAzc;2kelFB0y5<=6ZJ1pc=QhyZQV(#M_l5>wTd#&8j8S7AWWu${8FZ*kt>J6N=w#n2W7*xh*lOYhXn&`wJetG60b2lZZsRgIR6QY zXTw`9Q(5$cvcFx;MJH;<3tg8bhK(yxflLm%N@|0Y>p zBr{~==cE7p$C9iy5F<4E5g~euJrD+UNPJaEpeJ-{uIjZE3HNr4fRy0rt%E4ydMnMB zo0;bmdy*SoNIbx`4#}(B?nhbP)NF zQ8L3z%qMI=J;uDp^7V3=b))}$ik!WFj{AsFf$L2Muzz5AVr zk_4+zMTUT+1mf&RiMOmkY;O8t$p#<)r18F*+07X7loAYk)kCgf$By$NdZS^Afsf|Y z@;U>0SPoM{0M>*L2TGXoNV9X|w$ZJ*+1Mj_ z(Odov^x)i&Tb3$Hvk8Zw1 zo0x>*9CG464W|U24|}zxs$HvhDMnz)^_e!a}MD9QVoGPJHop3}0E7SX^Hr zmU0xp17-jbxkp#vSUZI2Q(x4&^3QJ}eG#)P+`HmrCQ<5v9MLdItIYfb+j}~k%N>oI zLTRwFrO*eqNu#4#Zj#Pp?8MH@XT{3lpK^EH7)zXN{Kn!H+|CsH$TztBM@{Mg+V@_u zs%pCg{*Guw&~jLLplgA1FZ)ykF)h#;sRIw-lf$g)?HJf}*av()Oc5NH4cf#JLk2#u z%KBg{U-&Mm0KH~$1LyFxEB^oXTG<8CzJT4e#1jKh^%E|L;fekxTfgA(BDc!%S0W$M z&{k2x-uYl8O$s=Gq3N=LF1;rdk~H`btWw}3Z!iMzabT;=-%%k`dPNJmgCJu(9bt?1 zjJ%2L52~JLv})7`_0~{>V8qsf?1$XFhniPgYy%XaiDbdD&HtgB5`ujsjHSm7aFjjl z>;9v}`WrOn%g56L6^SqGa{1<$?z7Y2@*hK?`*yk`n=SL(sJ@~e8hLPk?s-FKbo|en zHK2D9&`Uf!)(Ae@ff2brCp+C#yt0riW7vY$C|fC^y9jX>%b|IFPxhM>H5=H>kb5He z1{y~=)=f}dVf0$cLCg1p5}Vo4vK0{N225>Q;x%OC`nSY4Zz(D-Y&wv*UjXm>vDu~9 z0v2fsST11d$NkELtHDS(dwIA7D73qLi0S1O!M|Rh^8$q-ph-Knqjp|0PPZ zO^|W$dywMX)5Qy<(h)Zp7Z^JJpG3+e2D%QJt#^7)N_kq&vIae1q-W~uGz^DzE4x$US786GP`-AlYL$K1f6YpmGx(gDUaLZ5 zHbD6)nK=A6H0sXF{~F3B&zAxkgNU=3OIAPf_|H)T01eay^WO$lI5zIhUvL=|rO+{B z8)*hT`$|* zAJP8zc3WHOve23LO(U|-Pg*qYe(B`)cH7l=%&%E!CMi6a&006Kg?rSrDLt(NABW-`jF!;L*ei^j|goYFx{r;U9a6Jrt7RGJ=_JC<=Jr=UGsYI}(E zP()DnO3C}ihs*nvNRQew^IU$%<0@`L0PkB*?X{soN(Qt#ME6>H(Kt5NT8d^fu|4Bf z@ayN9e?v!J8f@k}8^>;DC1jy!6%JD4%if>4X!_z_@z%DzL)6b#McAp0@%Qtt3i>Bt zB(D#kFS;=`<=HJRYe_XjpSOLydg~>dU-!>mq*)Cy^?fp?YCEUv;3?ndugPA3?Syo8 zG0sK4z40@naQK{=G4op&Z~e69QrgZ>;nknWPIvf-ufgjN-M+Wj;vCR^z46}C^j~3J zPfMA16THqk=Psq^=g(Vk3|}2}9Ep310W*J2#l<$2EvolN=FievKf3PzzP9{f*0(Bd z?;PX8?Nel9pn0_PC6&S|%3g`TYDzYqYGxux^$@VtAN>^J3nov=Y(Dl0U}(A7k$wPxb%)k8?We98$K@I+VQ{Mw%z1 zM6x%fl9iQFS#e5((j+UhNOnl2a0(4&m6@!{NGX&E@x30;bB;sr*XMWp{ddYakLTlg zJ+6J-uj|3`k5}|rc95#0TzW6zc&lGrTdMJV2%yD_1wPrLM_-Ac4tu}(IIWz0Ag_OL z{8i>YOM+a^@nQPZy4pD4kmH3r|3wG*3Ye92*;ORP55;}oj(eT4Ff)5C$?DfCu>_=K zsX~$7@uaV@&{*JcH3h?^87dp>$sL~HGaT%pM*5#C1+mdDX zx5CGu5l$+AS(04p-fvKXIf8ftKC_Z|?v+~iPM6g`5wa@us9PK0PV2b8k`Mc=Zd3ec z^4FEC)ZwbaltI0n8x$f8@cqkze#SmeNc}e7MlwzrO)Z?X>^$C4(;i%7RdZq&B-NK& zEIL$F=%C%W5j&SeD>x+&KewK_r$ln1bPrzXsJ~of9NKDV^Jjjd@rB>zzdT?;b&1@b zn4UGy)<=Y24LWjx-g^)3HZ~)RmK~bC*qBvfNnPPD%kdWptGc9de>k=jIMr2*G>7$0 zwz{1~7m()m6p7txiPqA>y>1dveJ$y|Hw#<92Hh%q;BVYaD>&`g`K0waY&lp=R!aSL zvH5tJAd@4b=VmTq_KOg62jpe#6>@+}KHtTaX*_pCbNAV(nDJdAGzrk!Zbi#W(qxdGkAVEipWhR@R+V;r8vZolzw+dmC$t_bTpVid9r-!3_~J9S z@!+O2fwzAQ`}{3RT~(%1mN4$Evu*KqvRVADD8IknOL~)P$~-5g?)nLCa}|2MSXt@I ziA&@Sl!hO-Ugxxr`1PxGh&OKCw_RXcW3TIQamKb|v6n~2x+aGDhekX{K6QQ7NstfB z$=q*QBkEr~>GRkB`sLV?RcC)tygU52J16%yo52Y?C#~#CGAl~H6b`q+)213pXe5@D z5T_RrrY}hxZtsacM}AlsHT_p%>C@ybzD~5;LZI_p+=bH?`kgBI##*QSM@*+R+e=5g zRym!_FNi)gwxg-PM>Jq{DSOuO+r#~mdy z--F0Ib=057!==4qPIua#saLJ|TXy?Vw5bB`V8`JN^1HUnah13=Bqes|UQVp}bnH?y z8h_^}z3Z5`USR3Z)<11amqk;>DDEr1_H>8|*Fe6~<~S>Ba@)X@^*XFilNBbEj2ceb zb;LiRm*nBEtv3f;dn1@!EJQSmxWyfL8g6h^Ph7P4jE7)HZ|2Hq%^%^>cgSNu+^0t0 zea2rH{&vrtn^c=a4#-+9(U$W#ze1SnB&(E_X>e&*k%-Y@(ejPHx7b01AmT(r>zbZD zXLOR%9k*!W!@D=k)pW!yDVxlUa-=$Y_7`R;L9^~Au3UEg1!-sZSdd^jV*OJQX<@Op zy%ktNhq4P204qg3{&jKm7MvGQ=FZ&qS#}3Wn9^X(_F+;x%|}ZV-AoekHBR?w$UYAD z_2?Q{8S%I18dzlUw?d+dQKw?s>MQxwO1IA(T-_g>J*9V2t4a@AxFq8V3S4GHZp9NR zYQ%6^Qm)mp=_;)IaTun(R6Z`XqxbWEqd7-^l(;sRynl_EO_5>_xc{nY)C%{GqG zs|j|}#yXw)tjg20_h2Igcm8_ot;@Or@?>qqdP=vc=_h5A9p9>3Uecs@mN$q5SgUh* zq|ecSO&VojJt=~vKBKxjG~Ldm;*Q|dbyoA!fE$?mS zS6U>Ng!Cv6<-6v;;&zbXGLattbLYzr0{^2wO;I%*&<_e~aLPRRyhx6T5B{xSn(2<4 z)3Kl4d7o(ref#6?Qp5mcb9lnxkyht9RzFdXGCn_sML)@n<(*h9IkDuAa%tB|n~ZDo z-4_9hT#GU;q)&^gDy8CAhAg8Cj=(8~^gf;l~9a zTiWq)C?TiBM~uuDm}8_#GNJfp@FXRhZN4oBuwtIHoYTSQSMm&Rq)f3{nf`M7ei0+P zjVUZ^-Tj0PNqA{Na{hW{1h0erJC8rj4G=UU>%Az9;uTsmO43)eQH6Fn^&I3z_94r z@blyK$K-GWgooJdL#qLSQjXY+;a0$o~$K$t@;7)E6Tc6h}feX~{m2+b+LE98QJfp;G0e z$2~hCitPRx`iK1^E_gqW4=qOWLd}XxvnX?zFo^6)@#RmhaBH2Q_;{-3z>DL+feEBp zRqy3H%(dXZ^eOHEUVmN$?kQ^w4cWV+1yA@U%#|(OQ)+v3nF)`e)cbjFwXtQ%^WdoF zn*sj@kxg-33o@+3TxbnBNChe2CsPB20t{e2TowL?nuhC?V!kIp2^K7n7Cy2Duo*I3 z&w_t`4L!{zg+?3_qy#7J)_Nno+J`Rr60{Sid(oKOfCr5d0KDp2YA9}k;42HQA8 zPD&Fekd`VYJQ=Hc99SLc_oLg238P(mk-S1=c-il=vCV+*8X}nKlTbfBG%!FvLDuSi zVTh1c7?l9KIB7SGO{A!z7uSS~Mf#$|1W z(WEgO4ax$WEqfqu3-c3Qs@T7kO7b?FlJF6|P5cLzSSAcy_%ebClnspk`J9D?6WG5o z_Y0=rnV)&7bMHm~3=)ESZ%z1KW+d3DC58Z_8(xpxgx(B>D@X-0hAZTP<62kkwGWc3 zl-~f)Ym861%GjD3yV)5B&46ApGTdDx&3^mC*89B8IyR1q$!+roQG#^~iAz=E=bcQ0 zUqP48VXOmV=o*w3z!W+VqasxGc~G*GaWr0%TqkdB`>=50Yr^y~u9FTcT+bi(*>(s- zmt;>F3_ybUqHDsb`lo_2PL!j*Y43&DzoLdwpwU;bKTPeTPaD$<2B=1;L;h||vM^~y z%DEL+*zI6he*#D`ra}6^vc>QBcQn|@LpkG8pwDv{J9b+JT9CpY!~IK+u$*STTRMsc zC|z*m;KISId!{`lgF$xZbv}7|qL}|Yk5h~RcoqgE|Ae?41Fyk;r^%j=zRL@xht9E} zJIr%=U2f(PZACg`M6U0Q!63Q6(7kKY59ZDzAcx|lm8l_ZdF%1bPbY~BSgU=UjP(sCn81`WIJF$T}4a;>C11VgS zkEeco$@-c$H4t}|g))Hm4}4$!3WKu3B=5EQkBXH&aan}P@z}t>NfDHV%qj`szR-}R zT_)E&5YcVqxLl{sTsdVN`eX&6TvBgAUe-=N`#>XR7m3X>&_^!e%i*4a)3jE$#oN9R z5h-RJSrB;vu2A9&OT!hs1s7q5NJc;biz5LH3^&)F?`K+eqc1~c??AHpvOCVWdywyt z_+Rj8xHy+8N8wiKoF8_}6UYyRC?>Az?nVANbq6;OK;hl^PlmlKd`-E>2mTv0P zr54)%HQ&rj@x}>jVk$RFvtaLwL(Cn&g(RC6VnMDjVCQ7VGpdZ2S%Ajeti#?6hD`Rm z)Hs_O92~9k(L{}_RXN#={HHo?=Y4 znw5ghyesAaq``Fl@zE_uoy~6r`9w=Ey)U}4KRSW@{UTA8+w9}cVB6r;DxU7o>bPTS zDI0plzh3!Va$`A3MRawq{2q?gkJz5B9sRcSLDjB#ZN~RAe!uX%rgq$Pptv!g-N7(p zv@py3$2T!13U_T6jOIf{Z||WboCJu@&^63k;tu-MqFU~cvFYv;)5)h64DEyezyIjA$nKqI{7!Qu;f)qFfvZm zw>Y8D8>t>PUGQ$~^0~j5i)E4$qaE1(dvuRpe9+nCVJE3u-E2LmPVC^bVHeZZNm#=! zzVP2z#jt!dn?RG;8g>T>-y1Jk+1Q)kXHt{3m_Tw+jxiyd$O?E$4BOP75#8xDmB2@| z@YEQ;=vYp+sY?4jyb1rHk7F$z$i~70m zVEWSHUG9bqp~gn)Z_wXa!SkQ+?IAYR(;5y1wR(IV?-!O4g3qdish2g!M$8ZZrnkg| zc%)rh!sH=_0t1_8Ojgs+`5^XHpS)WCa&s!P;&$aOh|L}j@&B6khW`i@4gGrL*A&~L zQ9FB+HT@lJv``B(n;yKid%`U%%Kr;pLUx1G_r0a0Z%e7w{BN-tUIFQj~MBj-SIvY#`=C>9uYW zMH893@Nc=ImRs+6cV3-u)+(PRKv%p-51}J6&dYU*d3YU!5u#kXN&f6x-_{y)X51}E z_s~WjbQqheTHT$|ckiCh+jy0Xr<4`9m_Jlnz0gH-mQy0d4N7!(Qpzlg#$?q|T$1Bz z1vjtldECTIIj-!A2NU_G83|t&&RT#l$ydAQ*Slx*$_8Avf-|{2wxf$<)_3B$302F4 zLgRM~dw8*isn><*Fav@_A>govaEoNxYf`14>&#N)HP&}U|CWP<2j@abuEL`GB6U~z z*J78=kGZEFLEL?q=pZJQ5uf)@w1zDP*%Z@I#By|Q12}FC1?AyH<@({2K{2Phyq`&UOiW}V;I}B-*%s>V&f1wXJ`Z;M)3-~ zZS#gOXcSywCwXp5f4FCO_Pv`K;>VaoC_{QGcc4C3KdN{>2%D{6zL1nGs>N9+q&1DAmW+FhG<_yxTx%QOu>K4>CfFeaR>bJ-2)Uiwd}@rO*$1++Oms` z;YjBLhbWLr?lNi0)D04rBnAKA=a=*H!>to=UA}q6<_RBrklv#lMn2HRYlmPnS1yAB z@plq6K)ZY>+PO;X!CL>hEW4W{`1xW^jopzFv7OHfeL#^&Mv~!)dJ*6pq)R=pC32;a z;g#4lZip~Mc=jolfesaFEDdi7c$glpRf#}C-NdmK#`|;*s|S(WK#}xkmwx-NR{*rM z0^ga4!@e=q3TKGT?U}i!v`~Qzn*O8Hu+Nl!;56evA`8s`VgyQD!C%Wd!e2f zNDs=aZGX~251*>YJLHEZ&lIoQ|4IhqNG`&ey!}$BwB_-Lf)G6FtNm|68eKCnffCWA4y=OE z2pp9Qcl~;ppxT=wd(lJE3`v>WZY8Bvzu$ht`{7E}TP=rj{AfpVTP#sU`hMtn#6SaZ z;`e`gGNHee6t+qI!%QoJPv-^q)bdvB&wifB!Ff=gXm0<;dO;kC?;}KN(e9T2uXkh| z|D^C*m7=Iqq)xj`OsV2M_y&cGmS>3B!EU$6B}VrhU6#Y-yFMeT4rMP~6+%j{Td5*FGw=HQTsGN6(e>m{K$Yx1) zPqpKv%t#7X&ota+->dJ0u~lwRsUN?U)m?7jFgSOq*K&@GbBES)f7K%d?-}^>Fkh~! zPQ3RKUT+7HBc3ImnDj$8+a;)%5oT}LC4ZmY_->OFr0XDS%ec}2ls1l%s~R>? zEkNZP54RAsFmnXXNEBfW98FJaHh?+`JJ>(taC2sNh9qGu*o57fi{WXIRjUoFFZ9$aB_1}lz|o# z$3k8QdM#8kMIAVX#`p#>3`D;_WRto$0}H^usTVW$9rq|_G=Sk^D#yn?wrwGAZ zrEa}jhz<;3Fcy7PZu~O=vvYp=`2@9P9yY8QJe*c6?`8>ot{zxDRRLXajuN+1zI2Z} z2Ifc4gatNBDY@+B>tE3Fb%bA{5LG>sQVOWDj~~OCh=#g3&u5$<=zth-2w;XZY6J2T z>)dH#OsPbM}IJ8!x^0xkFh z$oMsG%llw>=*}ZHvmUyM3!*^QWML$DI{^#s^6Tb5zHUDcNUHZ?E4xAyQK|gwJm#KY z)3evb@y?<} z-)^v@y0xjodg;{Z$&ULqDLrC21#FXb3IpTkndurtxQ}$TDbTd>d7qPj+MKIFW>`0E zPiM#U0g-cLJ=;Lhb<6bEMEU;_cG#`yU}VTaVFD~YV(1N@lSPj zB`QE(A;Lue4}+x{ysbjqb4e~$rNYuP^MG-3Zn9C;e2-b74rwuE`ueV@2^NoB zrbikcO!S_OC{vhhGaaJG6lumlxvYptWy&Qq*+_Xh=hoAOYBp@FuTSO7xeEgXTmtH1 z$A7=j8Tsk{^GTojhP`qMiou%>-#k@IROfxzA*0~NQ#7(6t1fikgX%!8iB+6Yy4#f9 z)Qj4@ZnyNYMk6DD?9nN(N0`3rQv=2fkcd5Wl{}{Kc2!`o<*#eK4BF5X3fUXib#^p4 z_EW=-H8Fz&XM@$%_yj2J_-!jMS3k2&a_sXf)4gSv6vbMz?5gXuRa{^|X`SYE{Wn@m z=rI>mq&7eatVfjAV=8HT))6w8WywTZz+x*h__rr0V#WHqk!uAxK1>Hs58Qed_SoIf zZ|d&!pCetVEt5UXlV2yM6IN}Wo<5}fqW4FW3;+7a;XvFFTS<eON%4}6`&H<~wywV-3ar13U82P>AXU>o5>E9}s!#t<|_*{QGIp1U}+PjFWe~iq|b+} z%>aqr_ef`F;ua*ariM#ri}PjjL*nS)vj)atYOnjNmkB?sDje(>h;{9{*OQ#sxgB?b z?OD~AKcm$jS8r*Jq&^YO%lY$0jg(4#!a6=NA;_sNd#|^u{%1myiL4W`A9JR`xER7K z$9V|-&)AdPn`9^=JzBj&Q822*i{rAQV3qM?0#%JQgLkXK(*C8EH#tS!+U3|(=M~7l zDdMx<(l{!XwfVTVCWZVDHoQYJ4$`to9r>R$s?P7}D@U{6oCo&(s zJSIGkzr0{KrjGndFI^A4TWI5a)Wovlb!C&3dRe3A)JpNm*6L7=A*Zg6njz;fY&zs0 z4hONy(zEMl+g9pg%Bxq;FRWUOfQ^(&ylck^4&|Y;->O0vq#hG)PpH{E@yX|PCD)i1 zjSZcW_vOv4Fn6mL>(`@7sjoPAOrd_VckIc%mwvIAY^IkyFHLxyuYe$Agm7_iDxSnt zq7E8kLh$xbldEZKW?2A-HHr7qxMQ!g^AcJ=1;^G*E!#=`tzPyp_I@-qODx&6YNxx& zDqPY%hbhmk3KyMZ`qkQ&(^!8mV*N(zMw-IGY%8CXP4sV74(TirHr0IXt0AIM^~ujg zl>hL`gkMP}n8iu3f6YIAvg3xP;q!chMN2Hmymhtw4%?=m+;b=qx;3g)B^yT%1-I~- z1&)Q=&rxb5Q`Xl7y%s7*c}caA)Y0e3rf%(FHD#Rj$j#XA8G8#tUIv`&t=1)BeCw_AEI;YIM`Pm}(irD?{$vk+LgRcOwg zMdTjb)RGt<)-$?6kX`$^%ngqC__Hb_9gX6;SO*r$-zL+J`B8=al382^-hZy|-8NbB zPCeW!#DYyQrmW|Oi|Qf$jHgl?Th1MolE}kw7>W1bDbKz3GLz_ZTf`-?gQOtvXvjoW zw0kfrs3BzK^^l*Fqq5Z>7rGkZWbvw=yT=0TMUw^2N8jA!789RS9<{r<_}rJWjm6hv zv3$jP9>@*q-wOsmoyNs5se5~KkM;ICWts#5ym#S!~iVTmGK^W3iuj-?h50)6mF!Vk~x+KwwzcRzytX;0DumpiX?ol zN%uNcERMqLx^EtfQ$C%Gxwd(}qSYZvtwi$Gv~~OW#oJE?@(R_YYg*79ddRQGgg}0s zG>0BwngGa&WY=})dM!wNq_(!_d|J_Z`qy38>}*7t`+aRgDCPZQ+b3>-WvjkB;;?2| z`0mLz&v+d}{pto@8iwdRNUB6U%o?2S?U10p#cpe+Ak5omZd0=LyzbEGLbsy5_-Fm< z=lnKE>v<*n9KVv=Z#Y{2B`dK}Rfx0X ztbP*)rd=`B6U*l;6y>_Xxys4)C$>DLo^5iS!U%iFWojUsnD{bzvv5(UR_FDbt0~0@ zJAQK@*hRA03fu9eG$@{5+f zlEB9cqSS6k{BaNU?YILP&r7EUN617cRxD>Abp zGlE6gj_*-!w&Bv$N9U5BH$C2O`I!5rj*SY6Devw~?#^7U20i$f5hV8%btp0{QhNFKT2=fr&O+rM&rQ}!-i{Yd;WiP^E84r8KSKL1Zb9ka z^>T{JJ`tie8BKZplFQJ6q#44C$9YHo?{H`;3-0Gxk%Y!oEFIyx>?kJDUD;W&i>>{8 zjkC%~+9kmvC}i(C(;;jfX1^R4KnOMtof>~on%Od*x!A>%#!;?71n;ko|JB{C%l>A2 zR!&miZZY}aGB)1HcAX|(5D;fJ;GNwHV4_`iI~Mm z1^!ttdoy>AKEn8CSdgH6UXibR{|kflgjR3!q@-}C%3FM_t+5dXyM5lUIR_|34hCYp zd;VDrTwr`aWt`TV)6b%~Q=rJ`IW;zc91k+i&ayh{0N zybwq8qI8IUH*iNO8$WK`AQ`n5y;-6ZFpP18WgZ-~gjy$x{MN6(I&&Kp)SbGX@6LMk z+V39up%_$QKALXTPTY@GU`jXisKm;44QE=)>7V2OnyD48eZRcLges-s!WKtMs1~7` za`9cP#5Sk4O%qC(tp!WQ9{==nhnTV?#S#a*J~LDvIkjyFe<{*}W6xfteFZDaSz!7= zuGUPU(g@W-L)UB1Y7hgB?5|aVOganYEock{%Ybl`hAltuZPJhT=Jj3*$rY(vm+~9{ zOd&b`wPPx;=da#|?X*$?B^$K4x2PjP!T(29tRMu(I=Ci!vpAkN!7A8U^W6cO6UGL~ ztElP_HsXoxMtbW~FszL^J9xEu&ZlNdurpjJVNT^NxRw#S%N2?)D>7DWvzBgsx^>`F zLl3U&IQeIO+-~S)8Y~7??9ngDi?;C+>6(2bJpVg`f-H*FEzf4TO6@j{Ap%?ts)#mb zsv>#?K@nd<<#Ij?A%h0u-OH&PIIK|mHU9GuW>$=#n3DGKBfVsdjy{l889$+{jE3SE z@D4sE-4DIJtfr}D{P$D0(u?oH^lSkr6>&UsZ^6S#D}l!+3X91OYh1R6a)VRN)h<|J zmhy7c%BLyxA|hMjGT@`OS(n9OlETitvAMWNZVkU9q``y850BbKgyPtvkFuLMn^|p< zyI{Sg6*T0N#oI?)!#+CW4s&=F^JgaX9^NmXha4tK56ECltIBn{OGmRg?0iu-ou5do zm6hZsT>-XqwA0AA$Pwk!cfdROjUgA7X5|y(YF`FBOj|4V1=9i)6IjY(Naa5|z{&oQ z46IOAD*J>(nY|bLM_^>7H8FU8NcQvfizq_)qJ1f8^Ear_%<*B+SF+OGs62%&%+T3T z@i!^$XSw%G7*gv8>UgzU1QHitc=|ah#Qr_pDw7wNkpGoGD#yT<|AlW3YcwXp%YkM` zt-@wpR_y(v*&nJzId%o>B;qLU`ESDV*xBQ3LQ%OctFFrDR1&9v!P=$H9=w8*?vsZ< z9ljc}JCv-8L$0|(_eih{HfktM75In$@Qt~%Ph_NR8ln!TEQi}txF7+zOttOi4jZu1 z$~@EjwPxK~=Y_dU5-+UFUPr87!zGl18R?SjyZs&rmP;`M0v>!NG`Gbz4-H?varm{A zLz9_Fx0ak)Yn-U*H7A_!OS%t`TRboC&+$fG$qMlEqx!)NK{XWC$3mz-n+P}&8wtM1Z2xI2$>QyRu z6JElPSOvZ;yB-IORT86LD$d;(_O2u~%r&xKQg~&9U~^!=i0n^3i!(XV>HG=T1qsbl zUaX;a2Zhom0d0e(Irn5DHZ!~Tg8!)NGcvq0vtj!;|q>C%RbPJk@YssfiiKG`t zr*C&eW3ChZD1+^e$PgNb7ClhJ)WYlldG30NJdiXnHs~vVTd+y@ARG7IMojhC#RYW| zZ6yHPw(x?OEqb>;gpv6HD3e+5N48>3h`LNG{@q>!#ydP+Usp!4v^pDQ52%qQ zm;X4l65IfHQ=5{3mNxsX^b{qM`W~Js%!ITM#>%XfQh2cbw1sOr-&H{w9AN_HA#ad0 z7J4VkCnJBTr)qCSN~G@#T%kq(l6rT%2_K=#Kk2SR#k=LSf=)W*wT(2QMIpYXAPu(p$jQPDh}JW{C_r+n)Fn-KIYa4DIB{L-i~;&3rT4RO zb+KwJ%Eb_gV-F6iR-~;77c%8UAQDr9eU7u7WxYq>4^+yteBmXneL@Zk^k25m8jtNF z(HZ(|?q}o-Xan$L!iTlvR?RY%gWjx`UYV{v7mwk(Mi0AGDGC*~T5qU6Dbcz0sTyz1 z%>HhJNt6iNbROpLhqC$mdX0QMLbYgnvlOkY7a6q7+PlHB5dIOx;lE{N%Q2@*UDL&c z6E$@l`4~=<@scn^!Hy0oqddk59s2Go^HXzP<9e-2vz*>UC01#xdXu59pCig)T}Mc# zp0J@z@y}}VuNiWtfGw1|pEnGnMV7IKt;>k4TqSL)>^XaWZa3ht-Q?KmIOogH~4N6R?UqsjHInBqLBUoOv*Cpnf<-7jJ=> zJKs}&&|+cwpF^QsZ)9sO3OLEV0JN;UYjF^%vKf{A9#2%_~sNdyLj@USMRrr)l8J4ae{G12<15aCFe+?AM`RUJNOio7B? zw&_Wg9+1^>gbd@{s%)QCC%}0g|J=c;*?A-A$Txwr@_yWD2QoHr8Wvk=iOo7X5;wd_ z2%jp<%&kYm)f$d$hxp(8uZ;a{f+ntHwTx>p{A#rRKBt*f1lOEvSKmYK&dJRI)vOD6 zK=(^;qXn4^no@D_V_EW$krAu(sCu{JoC1(9Ke&U^4_*QF2K69?y;x_98uK`SOapjl z@5btymJE*i+=iBZsp{G1OpXUm7|x7MBXUWgSx;>IhEg*e2Ol&wsV4SB{#)1doV`uv z0)faw@Y7KFdw2krTfCVgg zEjRYg#yoOqT3}A|?Rk7wM{$Llq_c1H%&N2`8o;k31opiLaLj6;xR;YK23cmjSNNJi z@4^ymgKZwK)Dr8ns-MRyZ}u@FhtJ-egFHBH#Yx;iwOTFMeAd`a#w9y_Mv3*y65~Xc zW=2qddHgMCVA(5{n@oN2sjemT&c>T$Y09++n~t!3!qhb5nYL>{S=>5E1YdbQ3`a7u zvp&qkeq+bs#5b69S13cyewLG?1=u?y3yp4QJvxS)dU?b86&`kh+$v4W8Mn$zA0r08 z?$M3#mjj#EO8>nt;)THMGXgUo8S4K5;9!3zU7~{bSvWBAu~}&3DCKS8rgzInPGl7` zq3l5bi;Q8wBK0zZws-PdT7=9>wsY;KR-V6V!#R-_WE{0BWe5i#t`gmodSj^Rp7xL( za3Vwj4b7P?b+eD1KKkf>#8UXi4er|ddw|p_63A^ZZ%Tgdx0mGX{rkhZed2nLgMM6p zpTqJ8%c;Ou-vV?b{8)fGy{!)vZB$U~%QO5&n`qCOM}Z~gA7HE+&X z{*6<4L+igU+$j#Snl6oGwX={q^)0G%|-VAkyys6+a3DMzykbj$vAsw6Xx<^8z&n9Tj=|6(!2%i z`Po6b_8lXG^x0c|x)^Iu*=^vZOtXW+k05tCvT`2Roj5TAiM3e*i$LvQ=08CErEx|U zCmb=RflHu}rQ{{3VIXUFZE{(g>_XaQ0O%CgtOmi1HXtxj4Gg9YB3of#f)7hC?(NJD za=H24_XM*`0>p4R#IW6ZqU&b48jOSOBU7b9R*-}a9%gObh$@Ytc;_?LG(-!=J1;fC zePf`2GqcRcTa3ZzeaB7d-SlIt*k2ShDwJYs1~*HgB=T+wxdZoT`s95Ln-0@G)<44l zOVnR!hMWtUeo+Cwu1wN8h|C)Z-_+pW)6WD!cS_kP1_A2#n-l&?QySuXy{w?r^G@2^ z9X<;6FX&eGnU6(Z3!m{}ZYf%gtO2YgB~@qy_FnH4`Fnz$OwxQ0+G9jHPUPr&cz5p% zqFUMbK03K+`u#NVm#|HD#J2D%C?U;A1?4*m@9iDe%;Gw5CD6R*XhA)g2QDLOlTw}% zwY>gbP=x6wNP+9)OnykE-@L{!oO~$XaDKfOQ-uh!2Ck`2G5DB?rsdr?+1HM}J+Onc zFAD3A;SP*sqhRf^{!RL&fbcqrn}Ipn%;}Ak=>4eqI1}6nz>m|2N4BMOY!BO~5&vuu zzmnjP9!UO3#2v>g-0$cboOvM|8(3wYAeHHB%}^dSvQ}z!eC*+n&iS0#sm7{eDu20I z@k6)1xITj~oDfJ>JEeOr;t-IQawwSW?%Y8LqOQUTt+tx4Mp*v6s`_kH(@new7ih9Y z#yludfQ}g)gevusdW+PVM-vHS1&%lkF5C>+;R6pJ{OptlH&%y3KV#ZL^!9K>Wdt)e znZ&64^BJcQPboC^0HiMFe4HdCFoMD^$_K(0gH0HjJ7JUeSG8G*4A zTQ*rvhT0R$d7Ht3f3a+9`^%UepIU@wr4A^+fT>bUdAVmy51)+9k#nam#OgU^=Ld%h z^U)sFc`0aML-tTT(_}& z9gxOGf>k7@Cwav8}kElzE(r3@4J5M zGs#i*(9*>a9F8P8({7VNvi<@{vQ_Mp4`WZPIBvX0Tca@UjPPpqht+go55P)=@^eqw zUE7mRt}C1 zUq|yo^vl{L3|@GyY$+N`U(7M4(zw|tg14wTUFPv^&~CM6NQb>2vlZuYkhpT_ba2n( zvlYiIq=ClwKYGsiPqQKsBs_>$7H-HlM+<}nB^-kETel-?Q_H(;`$X5?4q8^H)*m~u zj1D z8bsmv)-A|&rj)aJ{QZ3JW9Bo6mUgjjf8kr6eL||qyrLo!eP4*sd@_eM#&8oi63^r7 z^)8=wDEZ3WYP1;td;k6bzrovdzz|{+bqM?USfNJ|UX4qa>hTf7Adt7?PF@=MWHlj^ zolke^Y`l?y{nBr*a+>;@}_kH*(~nmG5e7Q>*w_22V5oKe3M);>?=da)KLyh z-AWDkHBpZ>EbWYdiA5ZT*{cjsgL&B!Hjnf9pVE^Mh!c>prQ^M*dN|ihi$vY_A(45x zn+h>zx+pEZrI$m_o_;=Q$#NoE)7QM!~05xFMb;l&cb=3A5ee>8u0_Eu&Feliec zIQU3otxseeY)niKFAV$DA{*L5kS8zMxyh2J61y{YP>tHCvt7c!E+30{dnGM(@BGPD zOk&-{MQDw4l;~%9%S9&`D~%q<#KG$E!=?ht5%Z7r%4i)R1F?1-Sm@l1I|KW2)HfrJ%Z|hUv2`Ih6fZItDmn}jVm5eJFK#HuSMCY&< z*Lk@sU;7Dl2ljwR#E(1hHC2iy!qx+)lAV_PNAA(jK8H2%^Xt-LVK>(pqR`@ z-B(#F!>4UzP{Nv0tET`ccqa+12Rk9-L^I;IQPiK}be@KXU{HQOKg!3hRA9L-DBC$M zRrEwd)IKF5xl%IvCC=n$=tAeQy=+Knpl%%(zedRnXt^De>+IN!goqF>3Q8!`w{p&v z&PTe$SkKzwToaW&JsUl6**V=emqP+B4yV!)G>H^izEfVcF=TwrvxhFk!h8!j5Amv^ z^T;ylfU;1G@LW0THSs+Bxm$IT&u|OCf3D}wbukn>BPH|ZW^7VG4d1bKCfD{lNQ^^! zty62h7Q37dojx#nA|}Ly*%!@pWH1tX$zM5Qcsi@Ps8rx$^W`9yn(?FbDnEFlyMQTF zOmyDhd3eWuHkMAsn`u5{!~#aLSAL35oRhPvw#;1UVn5Z(X0;#kv?82fG92r7@c9tI z&CBr(`3*r@4Hl%4H?U5(JJMj>x250=8Y<6UfbMXtLDrTpTW>}R2wS938|P5pg?*%2 z1L{ZvPwkgt_U85Zrmoimu-X78Bv8u;&A*+I&n&TrBDXL#`X!3m(8Zbe z>34=;vL=GtwmVu=ICw`8wG-z$A9VoQiVaTOsmpkyDj)|92ZdYxP@F**&HF&MblKu^ zq8Dmy|1J|YJIcgPCC!*Lnz|1XgudN3B1ipO^HHGV)ADL&M70g-LVhg)7b)^W~6`L&P9-<4naE!Y6*+6H2sLA2zIII$>8h0d5+n0E&w?!i*Fyzad;DS zZ96+Q0%x|4izYane|cN)%$cP^d>*=zkct~RVOw$I1Bc{P3W5$mPpDyQylh1`gA2$? zaFAGu;5JHddmUN5{@;C(U2&ocq7Khr52W+DEu+-p$NrRgwHDgD@WpA90x3Kuf^SOM z*CRW19M&qL<4FHuhl7AXld4#=nj5#3Blt%GO4Zf8i@8Ki#Fk^aTklz;)T1WyBxHw06PJo)`PTDPA#E=Dxj)s3XdGUa4(nMM zzZqhXQ~?e!#avK-ChlbJYl#(kLwTnt7x_6>)u`O)pTz5cpkgNedl@{q5IUe726+ho zs6)mgT6`$@m0l;W!fmz_a2!aA;gV6*y5DWP8bc=3?)fZ4mo|nWqVEmGdzVU`pIls< zDNM9Q56-LTe<^(s1-Nr|^P1ogYz9|MTXTdL zu|wFl5$~XM8bg33L*-jA*eW|f#co$FCgacT93$1O# zq*?~dg``8dW+Jf1&_Nc_#H0KA<30p0CB8A0-1H$f?l52B zj9IEcrM$ud9)=$=dpFoNGxvsTiI!hYC!3{6DDa;-n~V%X`q9t}ER+h2buR25!hq%f zw0!?_?)W_3+)et&M0p2UKutS9ymMcxj%6%$O|2^R$3uY=dm*$WpMnG9kqNzmNMUmi zixwEG&+Mz5C%4;6#{APZQN8~D`6lAN>HYgw4;lhHZZiBl?WRseEL$(1IOxX@N)^ooDAdx=`6kAoMW&;e2lvc_XMGqh-6ea&)?YJf9(8XTYE^I^|}u4N@7I5_%r* z099%7WXbZqor@{C2cwNct=REz`3E1%w!J@(qCg!mJc|0Bw9D@25SJ2)PmTO~hd)Ky z7*_|I;frg=!yR-fX`LUn=oxU$oxr*4Q(!pUY!1QR2ply3w_B=;!dEt6s;RecBK>oJ zrEDQ}z&KQEUxiHJts#b4x(uO|@1EyBG1>d)9bhrY5;TN}JQXUGq5%6t8p0PU?HN)> zU-4+_VLhr(bAvI5gA=Hs80?8UbpJ=o!2dX`b{}k&|D@ErIg*8P|2|;D9HiJeHB2Nu zG`N=RrH1;IwZx)q-8vvig`OfKtMl)MPV7XbiHT1`FGHnjHu^+E36So27>C}d^PtaN zL23Rf_1S5Dw2nFZnELnr!-oosqBj6Uau-${@Xd>m1cbAH;K)~(!eKU5L(D+^`0+aD z{zAIiIsqK~aZWCA_B#q;&1%Y96f@p|SQ$UU$A*xb$DK>GuBImM2^D+ujm_y#aa=$W zmRuJFBFPfF=g2gj2k)~7+nuxUj2v~xB`vji*fJ6K2laXVt#(ktc_SDm>e04LXwY{v zUnGs3&UMasELNe&!J^)GvAf3$}hZ&0MjOO7KPA$-~ zgQHF0CkTaR8W{blAO+CQ%?43U+fW4o^p9dZcyy=IKf^})_EJmtqizj~2JV2jNQeCe z+bz2QQ4TRo$9QHecNpX85=gny%5;F}iIxCF4-*$g*2cOKEEaWn;ZCzR7ai1_auUyR z;lGM-$EKFfA-t%!oj<^L`_`<1UTxhcsdvo~#}$42l>#Ln%17W7ep3S?Aj)EcbZ>T> ztQ%q)CI>ON&&AHQ8j@3F9UKbW3O8rm{phhmi{wvzC#9kG1#9O8#(cR0_DIW=LvLnu zTHmnN+%7`kU17aX>8=MJ=L^_^O0!|3{E^Z?urvO>o`7-Tz-JzO#8P31)-r>&o>%Zf z&g(F|Z`#F8l`|EHAgU)$v7IZhy8J5=5GdXCtE18#=`49H*B%pw!fh9Xo!?l%h&dB1 z-%pkW&U3n3umwusCdm1_vC{_qmS%l7q1kbFZq7$8b{#s0Rb=U+@@v|9Fc6?+T;}OB zg5)yr^9~zIQGhNslIUF5{nxcLFke9EBbqNTA-HjDAoA#Rehf@2`_pI-!YRvTrUOsT z@KHhK!@J=8X%(w}WGGX{R%m;o^kcO$m*XbZEuuHilg)J6r8GkL)RwfMvyU|(B3za> zs2dB~U08Dz9$lnh)PHLnh@uj1lnq?Z6;RLkUfKgQw~j+x;?-2P8o2Z`ctjGA&rX2l znB>6rKwgYH5D~sIbsZaJGtPBSc2>*xZ`Gn*tdQ;i*FWj51R_o5@sqrE=q9j>p`s{C zmw{rD198o{xotBiJI3EgX%Gc=Y0}=}zdcTDSCl+9 z=l%M}0uDzO1`Sld&A!|RExlovOeE7Ydh%!q-1|V-^sJA=w153W7r00XUIGCCtSI1< zF?xG~$SJUQDcL6l3~Mm=cO-c@4OG%-6n6KE5JB3<(;O2rfLMYrr+1i!u$-Y4{R7F6 zRk`hf__)bd`c? zHcKzPC`3{LmVOnXPM*8z8I#d@l#<)l^5WCg2Hln7!|aeng75?76EpZYE#{+S68fqv zyvTj3=RYbA{S6Sx$T`lG-2W(5I2Ymhg|6P_*Km-Cfiq3zk8pr#AhO^yGh47cP(zd9 z{qni!Q0DeZIF?WTe!T=z0*+wIC72D%W@u{4y$jf#uQU5+ejvZ4t1#^%^;4?{q16LZ zi*1lhpFZ&xO0_g5Q3pdHYO&}hLm+}(CmD1__hi9_ zy;@024nnU4u(b)*1H&9b3Op8};?i{Hrb6ZnZ~_nnDykVBiQ)V9i(stNE-QG50&An{RUhGJ`MT%b?s{&J7z{j@=rH z7R*2@wCZ&oldpifdTB5=fL%7T08yIc$I9uP5jlulrK-n6fBNk=okrma#2euE)8dVO z1hlhnJIt(hqqRo?Ea$bjTn*IX77?3>s9iQ&R_IU_n=UHBkS%D|QQX`LS^V21V0*rF z5^eN>-W?$Jrmu2G=4j)GDB0sjS_y~Q$<3Nkz6JNm5l3X7oO1l7rKW%C3^xyjA1P&I zNVDp~_+OY5Fh(NQ?g5hjJ2r@^>?xm-AVUE{;SZTj6D5LZF5oc-Dc@nTJcD~?jYXiJ z1ENeIKsFh3|6s`rY>Q4#9DXv!UjuiK#loq1WJI07l;JGs+8i!q=sKzaCX>+5>2kRs z{KjdRq(n=;7-sOL?3d=IsYxpk$!@Iwlevc(xdya2Lcy{*?$lj}k+)@~WKjW;@M|^K zNu_F2$$tBt`E8}tSoZL+UcFicKgEVP%-SE2Q0@Sz%W^INTpFlEg|tiR^{p4kVCoxKp7bLj@>21P#3uWrYH3mqi- z4O^|SuaQtm|4ZXeTYMfj6v!DE{xu}`TtDwP@)FhAnvkjmV+Tz>daR{n(r5h{hTSxe z)E~r_N{j#+V`)qhc>gcGY3k($mSQ!Va=>cV45=rrfKhp0>Q&d^52BPaZ5Y|TlrS1g zy#7075YgtqfHrV2euSI0E(!!EXTj)CbY&oN@(3#iKZ;l{vw9`g&oZ) z>SDWr6}`Nq5OvzV1ffU_d!>b>&aG7}eW`1%L;(kvvx_XpU1bA>F<%M043$e0**ECU zSVUP4XB>X0p&SDNsS%rbY$beXJ;YGRWIv(%E+zFI;WLbhl<0ULa+AypA@;8?e}8$Q zX4TLBy>yQMgYbKIOhiPlWP)g3lMSQ(2hXVU!&uOWrcV4d-X#FBM4g{Pq1U9tg0SzB z?*M5wbt^2PY(gsVfBXU(djMrTR)9x@)C6SKK$n`f9mce=H?mI|?RlbH8W1k(n{i^A z_Y9UB5sZn!yb_S6Q2diSchTgj+}l7I(WK=&6G`w+Uf_jFONid3zfT7k%}0C?cgw;l zH3rYe*fx}wiPbVqryph#uKgV!YLRvTX-E@Id(7N{cB_HtMXm{WvvLp4k@(hwOj z+%NT)3EkaMsb(Sfl@IuR&7uIpYX);AK-NFBkFAMtg$e=H161UlAdX5bM0lE{zqb&8 zvyP<%zxJ=kDiP>#WmJJJdU%BwGtOdcv4QO}r{xC0r1K5%GN+Ac1X4lmOg5KA0fN_Q+n|3U?(u76x@<(pZ3f_`h+oT-A;#L@7d`a}?o`#ERu; zPhWix$5>lKd7gXm8*CjPLI3DcY#U$zj+>C>?iREt~a5ximy@_v_K9! zw}IRq=6`hg?<)SK3Tp_r%e@E^oggcV)=EGnK@g@6p*)qxf%ziMZ?Nw<8h{y9I<@kj zexT`33_+p7XuzVuH>1j>_ZAT5sIV1R{fljC?B;;~hWF`MKQ8y`(Kz&7J$JE7$6utK*c4( zezKuMP&1yEmmsglP-!A_OgQ1V79!=|wgW)xE|zOD}4=rchxN)S5ou#H2PlXI%w z{8Fycnx-~@@{ByZ#<^?T&RX9$Y7{$FUC}X- z9Mfy$+-lj*gBfydI$(%K>)gS8^0$R6w_)RvB*G3xIJ99jf?+{5`VXwOuzzE_5|}cv z!dbOc-?Be-LXY)%hFOGY2^16ZZ+r3Zo(h;zPfxQfSd1ii&Pp5Qy$a48Km(?R1##`IocG7ry{TU$~H zdgP%H`d}R-KHB5x`)j8V0M@o}9Rn(ifNn=K0S2>~>>0mQ$adD~$BAuW3qK-`A92jm z2Td_p1XStE_!eo?^1;LC#G#`KT_1K}vnx~P@w6smSnS`#z=2xSC;hwDO$)ONG&FD6 z-%aKJy7ilujryqFcx1MusDadS+m|Av;cM5PFP;C_xL|CRV#$;FAllZ(52Xd6sS;AD z*qjt3sfj&eK#g$3IS48DH8Yu$K8^=%?55be=I^rvu#izQ@dF9nNHz4kdFH|QTj8*W z`KdqAdm^J*Y<`rslabvf`cTkS4$XDdTK$Rx`(*6~?m@6-M1D3u5wO9uLcwTI^CH67 zWdDqMLGJ&~;y<(|+oV&{Qu!{iutZ61cZcbrE}WzpmfvJthsVV~UwNK=@)Rr95}|OF z?8n%n0o0MdQWAkW(65eHsc%Lh)y}_f%_g!EB!%OGQ?rcatkF7*0D@tT%p_XXFB0Ko z+xU1TcbqtPrBnf2erVR!=Z|`I9MWCKjP!w!Tfvs)0hHX!zw{etJ6B*uNEkT02s83> zHC7ODcQDHB#x96z;TxOu=YH6z4`+;C zrZgCcsCIdr;uF~I-7W6n+*KaBHpuu$gpVVud*z{=b=_O6C3DHMudjQZrE^{OqEpoC z*CTHiba~3&E&80@oBq20%l%AjRn$+o?)CXs0^$;j*DSVEz4?7lSeXqElcAO1KNHiV zmAJ4_snc$pnis`^wZi3nuUfCr!jk5aq(d<4{>5GT$tx-@oqz%QD3vmHH#}xPbaQSd zlSn}}VI&0%wtmvW&H_ezE;l#JjsG7d3|bm}FT=gstz$P)z2e=Xs~_D&30F$w%eIWxSXjCT zM`SuP(mE&oY`=}2WtYdltE9wcc;(+ExW^gT1?X3 zi-cW*AIXAYS55{T94&pMs>NBw2RuonX4lx?q3d8FH+miM`q6%7luz)DDXXlmrmdd~ zQgB_*QZ`W8(>&i@1U9yRf#zb2$rMszDe3v8Y(C*~6<1|B?q|F@zk0B-<4rJLm=K#z z;km0y0EBv*jlSt-OlY^l8O0ml|HmeAl<*sSN3S)y&BwitfnN%<9hs!p7dEE3ZeSgB z+5fJYf@#W9x>M@db=$wTH`lUj=<9fIx|ctsg#lbUu`t@9mvcf;SFN_Nw119o%YZYL z*j$V?b+D{p3Hd!tb+q_vVrnIRZU=s|PbFmeqtm4t`xn**bM+oi} z0AgMsYi>x9=V6MB;4=Yr2C<42aLK)!no~t|h@zF#qIX+8*6(t_O`iBEgDDsEXb)+} znAH8>`%O|#V(ig!a+yDy9eoHCxm(ib4Y}AG_FwIYu`4}Hs6|su1GA|U(m%fcI;IOP zz{5hZZAoAL{CZbiR(0G$3Tq06itlpsC(nfbg*{voQByZx<*thn2o~ZdPGFL1!ou8^ zWPTN*Y$7WkwfajAJ|Ktj&N8(5+za#tGqs$UoQr63gXx0{+{w*T&4npZREpxyPnVyC z+JvpT(;Q2^jdPa&d}%v&^*AjQj@ejv-+XwIs{!jQPxhV`9d`8R&(o>?GNF&n!)-F& zzmEK<-Q4O6x9s4)F-b`QZGM-J757Nfim0(kuE0(=Pb5BJCuQ@6Xr_4)$tN&AdH}1t z7}bZ(?&GrZNg}2AS5)~tcvRw>CVVbF> z`3ix5;mmBEaRnDu^y>H8)+RJr%T{pg_v^8%>2KchiIYbnb%iVd4b!2c&g`ndDrmWB&Izn=mnOnW$30Lb9hCu?Uz1@|aPX z$A@Y+14Qc&S?z6-D=}W2rmRx57-}Z<=TDCBx|WfVUoBzA2gFufYQk=lyb5YTK=w9v zbHTJPA(rOl>yNl0&l{wKipwNfHM^hv-{002rQ*bu8RfjyTP%HXFrE=USOQ1?Il}4@ zI(n`!{QV*KCOtK5^ZWko0Mq)}|Lk_u2`1@M{Q3izDL@cmCN>^j&}b=WmY}<9|Hl(Z zs$I{1my1vUIu|CC``u>wO<`AATCK@z7uW-BB*bW@4c@~7Q>_dfy#%XZ72=$S?6*HZatD8|^GiqQ>zE@17_{T85HBi< z#Af@eH)n%bk+3NV3x`fb2q+>srM9h*!t_449^O3Kn`W6YX21mrWI<0geOE&fj9y)4 zjA!kiCa;u@VTs#W;)KreE12xmcij|(Hd<%-Ta>t9%!t|npR|P4aq2bH2wcp{%;lL+ z{w;3eKa)Vo{2sf!#4s%EbM2Lpt8{7>@U6?!9SW_Fj) zkX%EE-FGL>Qqon1(fraSEKG{wcHM??_A+Vmn1SyK@XvtQ0f$1fvHFz{ujrXt%W?2{>p+s22^*Zwtq4jc68K~9NvovBg8S&t8Yfg|l`K*SXK zCZ&k=FzuUJ`;WV`88y75^&XxsX1MialBn*u&t0z=sVlQ_?YweFZ%lv={Njx9Arxzu zo9`Icz$Pj|jBtuopU~ba6kiXwnoZld2c@gnV}nkSP=OSj< zmN8IE$*=f7dv5=dj$+5=rn}!LKM&*T=GHF$0z&`Ezk#j0E73xBjtdGfqa0wl5B^NCHK?%R(TO>c*okk}lQ+eL^SreZ#I#_m`sO)E=yEU#8-Wp{iJJ zNCMwAJ)1NuGu@(mGQZ_{(E#z+uXp_?iqZzP4mMd9`8A^rJ^<_fTz3N)6FNOElxSpO zurxS)p{T%98h53fB{O(2=27--Ho+6VlhxL3y^xx^n67D)M{hpTXtpGCB-;bX&kzPB zaVZkoLLb@ z8%VIg6@oO===H*Z)Re<;_Lq{^f1Pr6xXe8)q{dvo_JJTD!w(($t7TCl%riBaV{k=m z9R2MN)AB!TSF=Lj=UqL8Fh>z~x_&&Nzl}Fs?p5;P7s;uco@c9bS(8!CdwgB(n)T(7 zZKdk*m|T&4+_=pO7qhBLanUK18e!nU4hfU{PEiMN&T_YOA3fQaqRV4epLh9?G#3Of zXswF4(P1*@DB5<40rE0x-?6+tEk@AR10gd zC4wMqi`3tMu8fHb4X&k6{<}qt4$zyK#qwxoBBdJ~p+7jKA6j8CEmkik(H|o1SuIs) zhuCi71(92;y_|M>p(*Rfn};8LOzG71xENzaijAIZu6`GCJ^sX8?(%)$%VUzHVs`ag z(tE8AI67)5oSbnrhVOq-K;K&{@n^<-Y?hzk$4xAe2Hl5lqh>svyZ>Ap;((-S52)6o zrt8h$Z}Rl@jag-vc)WLY_>N+bR)z(bl}qtxQubeYro)I2;N15OFcJ9@A@Iha(t@yE zh)tpn_X4K>M&r=2i63R}ggpl~@Pnf|N<^`zV&5bmV1>c`mExkx1_^iPU>6 zOL^meY=a8+)JfRSaNPy=1&ADaQppS;w=h||qXKE&2$A^#yMUK&Hp>vJYy`R&m$jE{ zeWY_1K;vFG<|(O)iB8jBmZhvZv)Yc!>%t18y-P)!wz>n^VRrcP`WFjc{5$<+&(f|B zhGP3NR)wT#7v0ZXobqs+Jmxn0oL+%-$jsM=NE=za!PP&=zgEdc>a)hT2sVjCN!H6cNQFQ$D}?(*n)GllHXc*bfSOk z%UH>oPT)^kA?)j=I#eB?b(n&pl`W?qX|V?)<>u2D2DKiIqJS<#X4p?p9(SS3Z>(>+r$C$I=h6nJX~58LP;7R&Y6=(1up zVguGJ+^*nMfg?<<7J--ldq5krPLM1Dfv!s#o3=WxFzJhV z?^a%s@xhZs^Y)XzAV9EOHZ+m>bpx-#>l+UWd4l5@Kb~wg8QFH(W+uju75ZyuB4tBM zq|1wjn@npRhU}~<>tbAxY}P678fV&iVF3me&%sivDuC%)&JsutbBU=+W7&H_@QES-CkQPI*{^G%R_A*nL7M-+h6&@?J+aa?i{NfARklI=L$mKH!ywbN{xox##f8w-F zz9VB=WbOf&9>6H(RX!SXG(cZl;@-~af%sb|dEt}OBL@v>$2g|5g>EJFMCq(uO;B5z zdQ=24Q1-0EqC!ZDy;u)9wne!f#*Q<1nk;8in`Gg0{@_|SNatMtAAAFIc<^YU11E$M z!dE*9@|cU@B~Y?)H{UYXg3>|pXyvP@M9qo-7WR}u{DfBjBA$LD#I~y7t8j)HYx9Gj z2i^4H&qhmgwUd*tecZSN+acT{UX`>z&7~7=L6}_oKHjbKiYm&WlCyz-^E&)F02iX5 zw@4{nh7V$mOE}f8>~~+Wb{%CQ9pA%~`<~hDlzWlD`r6vQx;k|f#QuPQ(OA`Lp0k<@G}o*-|lqQ&{=+1 zp>i|z!V%8}LKuxaq+lH)niH4?>cVy3OnZ1*kh>tRpyuAePD*mnVUAkS59yOnAgO-HH!}1+XNZd2rQ&;dlM;urG)ZH-u-Vt8X=0J zxnfaNE|q$q2S-{aWTf0RvB$}~9R*%4aB#Xa-T%1;@+L3JB5!HGF^TpFlT~>~_V(U> z{IN#L!m07GDcJ!MKJODGFWi&vvejSxK+6J$Z-G#z!7w@EKNCHO`Sq|suv>B`JL%1f z5?3jEV16Pd4V60~q#9KaCZpe!MRa}_eDiERhSim^|06xd7{Sk7oOIIG%LE0B@cVJZ zJ2~PX60XEZ9Yc0H{i_6)Fla#8#M)vB(W&q9-~{+luA^;eh?`ZSP+4=Ncx5();E9+c zX5sioPmUHucNf}rt)2{f9=ZWCwoc&}#)U8_;`D>5L>r%u;q{A+=uAHgdcVDKZcU6< znA&Nheapk4m+lv26r)d`vklFy*t=&(xa<2@Nb}{v*=Jlbm6T_%>BXj$3X#bzRIRCi zDnk$E$s~c}zkT`q(-gxl$Z?-o{*VYxLJyv#LArcbac2Hmk4yVB(FhO?S$Nvb!;=4p z>w^w#C!^CLVoBrbRni=EC{7(~sEFreBEKoTVrLp}86l#t1yljJAjggHjJd5!!`4@sG9#y(s z7b!n<%%9=?mS(CEQ`vJa%YzM;N6EK<8;d+l9ZfJ@obOSNY)FB5*Q4gznJ2wG_iz;_ z)$t}AOu9w~=dpi95PX~4tPWp)i@}d)mACV#Q$EBmI3NV-wKL)8LED!h)sxm1`Rrbh zaIkSI7GJR{0cojYVUN^HOOHqt`H6zX{c9|;mUgWklrYl5;$kOW<(t+XpKlS``pvs#o*G5LwRF7GS69iD8c5DtTW7{*_=c+w@jn(RE}k@Q5-*3k@O3JL_!MW5t6pWHs}Svo3L6MD$F)N zV0!Z+EB=>nGwq3-Q*1$$*jXDf?YeD_^rjqOJbK!DMN(ev7Y|-pTVqC{Dxcu|@z%E+ z*lY!L4oJ&o6vgQRyGXIgc)R%Bb`TTNvaS!tUllZFz|U+p7RAaMqF%?ssfRH>OVz%$ z9{!u9(B<_ao~Ff>6?<@FhRq?4a%W5&b4d1T51B=PB&8lJ*!u|gGf2w*=3>{zVyVs3 zJ~_ML+DY*t?TqpBGdM3!Ndqo9=cpx5?J9)WH7CJWHi^#9^C@fOKT^hMl_~mIKE(K} zT{U;rQ?(6IzSy{o)IAb_vpz|*9_=NAMh@#v`nI1 z;@N#rP$EOg+0hop6SgOM9yE*p+nBNb^4?$Y-Xtv&Bl7hhWF6B~E? z-B<;d``!03!=X`%$W z&CM1(SB*IX4L)6URu?D|}pWy}!vQ42WJ{-6|34EoDF_HuQ{#m@VbdRLy+vi~;bo&Sw|#`-Z=9N84?gQKzSd>(^VV!*0s z8?fFH-Bw%IkqOmp`+>JRxF^dvh?#XodD{z(Qr_R4e;iTSy?icaSyk?wTO+}VHeZy1 z2u((ez)Qf#b(XVz_Le)Rh|47~IIfCMG#-W?X4tbv-aHraz%tWdT~K1#e7+_YtZg6` z%uu@)@cYD>_vFt@(%Ef6&`FE0o*QLsyKXxc3>E*3@8tWg;y5d^H0Yigoh65J-rTBR zvo?WPkY8{!@i#gui1RA+H@Hy$OtC2Y2dX;G`ID>MYa4-v%~@G5>rK^=)}K=B3|Sn} z{W8lJn}m56!oTPfVR$U@r_JXZ|50w~pqI4cC><5ax#lGDG<`5{<(~D}7{tF+PC>Yi z_wS6a{pSK8R$j%9m96bqrXKEFn%~ReID)G z#?`jt%h#>eIc7acISUu4Rux9aOz-6efF3HUd5H!56*JDVzN6gpPCw03DhfAkhVEV_ zd{-PA_Wf1bG*@F9ZWPG_s90{P9M0$yF1bf_T1F^OC54_n@JkZAhSFYK?NE!4$keUV zIq=;=#h#=8v3f+XOIXp;{uymf8X37jD%smI57`Yu}4NaWS|H|fA}709IweU%6m=PI{OP(VM=J^IHr1LRN5 z+u=j5cS!%4>i_}IYxj=?=F)uaILPscnBDBDO4b$j%#M>+`o`C@md zmnG&2UXZP|t-QNjIAa6rz};y|;|fw59`~?r4nE#B?=J`z)#son!tLo?MoJoXZJGARK_2dqe zt-_8qOWrY*Ig;ohx*bm7fbKm*I`t1OX68Vr^*pvNfSX#wLZ8=O`N#>y1K|cL)ABEe z|8i~$lP+7kDyo^?rSx}81rVovB!)O}UEnHwTda-TTOTgb8TR<afSm#alcn;>A{CJmSPDWk(ruC+^-@Pqb#Hr^+9<4vLA}D1JDy&=rAGR++{!q z9K1?*Z{)Wr##CVtaFHVNVb~iE7S}m`e9~`>qW|{@9PiNMG{lSk4i4vN%a3xv#0i(N zG#7a*R#;deu-RIa57}`giE~${_G$^Z0h`>%HU@kut`z4T6jWWIc7X$Ye=XrA-k!Nd zHhT$L`^OEittGcwU@_F$nBiXS;R#sKSz>CUqb$A`n1(`6W$E!~8;alcz2kzpmTi=Q z1vdYTahXqrio=YLh43U+F@0~;2hCrm&;YBwZ+eYGg{X7iV|m}B^UX6Y9`#Z&@sGSg zr4-btuVBxtf=HMolHI#U30C)AuB+T`jjg=vSLJ)toJp8Ch2+$0Q^&#KZCkI!=wvD+ zJei)XgyKk8XsOK@x>x-)!Pj47aZ!1eZ;Y+2DoToV4<9Z0+y6%{p?`b+{e%C)2;~DG zwgMGy;?5oO8&M+MRW5l2QHOG0&@D3?guy zV-Q_o&-N}~r9yaC{U#1T4pg@{_+Ba6GyICS^Oz)#JkLCUQpyCTiPDn+A?sJ1C;7mW z*a%5lJe~jH0rd|G&*0uGI~74yJ)6%S_bwcr(vm%Vv6m>x=`n@;);(ER%v!mT)&Fw* zU22dKsWU%v?{1`Ke!~Ml*WCf{^^Ox1G*XgnLLk2`|xn(X$tlkssgytDzaP0D{hA9f)N$F zU?axPN1L!l5(>@?jSEzPt&$FIvv)@ zzbRS`HU*_jr&P_W9&j7MK@5roI_OXoT|UZ7cz7*j)eZqKgp8dz(k>(zd8BcyH#xUWk8IL%d5;25IaoK%Pnqp{I#l- zG$hz?WC^cjcvabJgr(Kg-)$o9q?xK>NY;;AWA=n=YmlC8L z0X1o6B6q5>Mw3T-)@=@64wM7A>-sOq>Z*{`qRREemdz!<7~WhT+ZGn)HYbB1==4N-@|6K+Us8{zpe}Tzh>;h{d@HPh}OnxbJ1&*Sm0>u{9HN0*zQ@2t8 zpu|32E8NDi-`_Mc>G)UISXFPo9-BAtcymc=DzLhAt}(fKNE}|%^5huaiI`Wakr5Z# zb0WUllvHN{S;T);jeJy^T0oPL&c2B+yk&w$GF^cyh4MVHw}Ab)#9uIO<9ABnJS&Kv zDz#)L?l-@02=nA_-Q&w%{Ja;SE^^|J-LO4X0lcRZIL~3SHy5F0RvM;^MCE%3 z*E^ECopPH)B}|K#Vr~;8Fg@LTSZ;@3(Tqr?+qG65e^hHkUX$@{BJ)n2Q{75)%Let_ z4+)}#CYNgC29KWt$H_eNY@eLgRyPOdQwS*;r_`E(el7s5K(6cB_>>3FSjiJKcxZk= zv7DgiaYdQJCp|$7{I3#Y{@WRp?E4*`#l25lpIq3hQ{L$EVc&^g%hyFY%Z1&%3DLh6 z;FI#$5hb9jqn;sjHQ?X1Pp;S$$d)P~2rqHr@6ozfxJP0K({Y}Jxlz^z&>PlwPnD-`$nFgIfcs*72#K42h|m45=E7p+zqb zD%b01=B1;PoIv=Ce2*tz>l6YB z6>yILj$6bCHsRrUIu_38owBk$1Ic8Pq*lH)Fw^ zb!*H$kEG5KUW&&UG4d)sVa@`%y%?t{0F+PU$WRv#!2*BuJ2LgW{y9I@8t9w%ziQ0bDg zdiBXc$M;qCvOU=Cq<~k_KA9kq`%smHLZ#zkVlRCUIAT@0nP*Za&f&tsR-I}twq?++ zNiOccb%Z`E<{s5rN~3Rv2ybuU_BF2RA{ERANLeL-`_;n6y20h3bdiFyQLkvO&hl=Q zX7{lz%MQ_Q1iWg|-wKf214TJw4UI`8)2g`T3%I>IMepD>bcR=~C_G z!dANqoR|FGZgJv#$d7KV{}w6m6rEK=%YCzj0{TO?@lj-MDJH!ZkgGP{6B;x8>Q+X^uZ0rpkMi`kwAb{nhy3*)v9~wl;TH7t z7=qv%dvLfv92rG6mBeGP3?+fc?hLipM;dvEs&RDryo=`A?H2~cHs9#%0#DJJx)k9K zTj0X0%*K)RG)v3vYa^T=Pzyfvtj~GBwquhtKrHU0pIw%5;&R9jKlT6K3Fe1cn~?1r zh}!2HTizIMa# z*zQj?U+nT-b0K&j#x|?9Ht6%4nwx7F3+$Eg{@%LIOr5xq5<%1n4lpV1+u5m%secJj z|F0trc7wC)%1BJMQj!=p9@=7`Lm%_;h8mwh@+oB;%`yf=i*4;L!Vwr7W~Zs(%g+*H zT$*v-4|7nj0PixFuNPBOm0yxW2)OR~3E#@@5jHg7p?qckLs4}v4h-{uqIg5(yFwrM z#-!(8dvT|sIy3>83QssJPBUs~uU`C!5Np0`{*SB2wpnT%p7p&fg1)<7%YQUNC55b= zpD~K4Ko$qdd$31uAu>>c+fb?KbcTT2St_0}^w_?jOZ2M3W=MhXWl#A)FV>^Hl;6ln zv(6yNkwr(C3XF&NHvFQqYs1fpitYtu(P2TtQ=6x6<~nK(Y$I2HX>y;9Fo>|SnUHgm z5Oiqb7{g<@?o-U}%kE zD;ZCfn)gtDlIE&#;OD~nt9_VA&gHvq`RI)LJF|;2A$vG z#ODv~`EjAcwdX%#N6*s2b$^)XD@$HWGs=rdJ+T#ZHRYb~A-Y?%}U6gdCWI_m~ep9Z*++#Ny z1w%Gd>CPK2UC5mbF1v+DPW)1Sh$_5f@!t${texe`j9SNNGnDKgKc7M=P?NqJEs zZJm}-7Zx@-Q8wv93R{`@RO{#Z`Mz(6p@4D!B2J_{-%;6PfUV33$Yk(L1DYP6lhic5 z;`~H38S`;5tHZBaTS7M2Z;FK0{KeLFxMD%@ehx^q}XP7+a_`VgK= z+>-nP3pMW1MG9Z9?Woy6wht5#e>xmuNIJnkR@8uCVvrjv!$PX@jSA&^aoxx4;4OEZ zs{)I6o&vjOTxqdjd2Lu&`N8wG?p2jGo6Hqu6cy|SDkMr@C3N2|DaPtAwy2h7`y>KE z00j5~MOJCMOBnk;+#n$C_(KlJY4q3yQsVyH?gyZs(#MpDkN330jysV}PuUkoAf zPf=QoU|r+Boi1&=VMlPtisNfZLvxqjuFJtWmk)As z6qIdUohAbIZO~RAEvWc)hhvTW5~&BOf~v8F^AEIFDESfXce)BZEcpYiSG$tU!`v1z zyf3V&)+c$&*)NuVe`t|TD~brvh%x7xjXH?mQlJ3i=Y!^JBKHR@FK797FNs1y- z`$LWL38r0yoz7%q?CYOT-wkf#qy+_`G1W=x3g*dW>?GSq6U|D;&jW7xDn-`bQ5OKQ zJx&Gz3lc>IYiia;J48xxDhx5i>h{N$d+u01lhh={8e9!lZqyF8F*h%8R!_(_+GT#i zZ>L78_b;EtB}Px&AMgkEw1v+<;bng@V`$JH#hZvuI8<1R)qr?_2DcK;>UH{X;peQF zXCZn#!SBabYzkJ>5+;aSJNy|rOj5Nj$SoAwm6zmPvEk}^<~)Plui2{0NKtKdvcux4 z_BqD4ZZntStBs?#=>9tK;A734bjip%aj_j8Sxe&5kIt;DKFasUPE*?iKjd+DO5U6V;8kyfk+M{K=HFsn8M zL=CQE5HP3U0@YVao#Y_%d5bpwB44$GrKVlI+h}t{MeZg3gv{(>c3sVw6uYSJ#Ne{! z$DGco2-XUywj7?jP}1tyY5wXfGwT-T+#$7e?HiY#VW98#ZawKMukryg4o))?l_Gx~ zl0j*1!4Mh8n@pp~_-D3VpFIq+9cW4Iv^krKif_8c+|63|@KpFx!I-9k*dVgu))sX9 zLOABz61{Gzm$H@mxbEw{6+d`PB4maeYrJvc#Be|W)sD@)3K z++6df+v{P4RZda6sn1(6gzhLiAT5a;AO@70u^dxWxm`aHeOvd(a;3sM^hg1Db|04u#4@L7M($~erY zb&=J7%B>()Vp8e%sn7kX@6SHn{5US~4;wY>11%X_%L$7n`f8c=`wGuex!pyAxV)xaN28TC<12Jj!51>@9ZTtB z!xP~NI+uFehI$AKOAE9^UtP2+BnBRe$(eYwHiFf^G~tDvj(D=Dc-%eLdu6-7x-A*x z)MD^%(3xm?=txAw3V@_m$4@rz9mYVwvK6B5@K`e;A6qX3!(`UI zuHf{+nI>7qrjBv+W|5d@zDcYfIA%{O&6+fsu#Nt(8kV0C8x{Qucl(e3&!-2L-;d+jD!2DY+QG)&y}Ou${OW># zOdK~bGAsT_YVE!+z`Ld(Z>jyPqM9pzYHN?#t=v+#Bx=!l^)WT#QYA)J*-YoB)rv~& zz9LJIQj1M}XQ&mpKNH=Zlizv*i+Y4c*J+3+{M1e!TxxHhv}1n!$#zbH7DWRVMEj21 z2~THMb3~Qk(=1BLJDaoR0?*ZAnxmc{VlJdCB&tnH3!0OE{Vo_g)*bAkzjgCH74H!p z-F3&zBNe{t=sM`Ui)|b2ZT;9J68n3#gO|IVP>8g5-=~j0i7|OlmS7A(__M#)1;E&< zfIoS+n-)(kSRkT0L!n1exv#M-*cz_wbNC>?PGNU z&rhx#`-8XO3p~^ozSp|iH<5UJ{kqF1=ZPAt=H7gtKHeN&9{b_^tCfq=#1|zjy6iqq zlGtd>@b)MfOCER=FTBG62^8F7;gp*7l07cONEXzJ<;$O(3IgaESv3b&QcGf4=z@TG z+H1=H1P>N=pL`VYsJX8DhryqqQ`efa)`xdoIk~^FqfOx1P`+gEH=_VKsB>)o(>R-G zavvWrWbJeIi~sRtQT{V;zZE|Hr1X2WmiD)2>Mz#vF0`9yc#Vq0glMvNW+1u3h)(Um zIs94s^HX1w-Ji8=lSwO<=zToX}zdnwantha&P@Y6ihMp;{$$G&1>!NXe&K;`hdma(x%@- zOB@2uzKXX(swIh4d!(q99S%k-dHWDQAKWN~1tv(*VUp~+t!t>FWK-sDZBHcFmf_a zNaeNHR$X=C6t++!U|Fg4Zm2)Dl^6*3)9-&Y*^V#gZE7wYX&=qQD%66N+gSn?#}9F? z$q}^c`mz1(nLDiwi`gr+p)g~5TgUdlQzUpgXW!bC&HzfK*fPAc4yG|% zzDqzq8aNIV$I+iWUwwYxVEryxR`=&u1uBQnhlvpNoHDI5F4-|*)0}T**K-#=*}<-z zk=fYOEnhj;y4gczp?TYd;{iW(rLNeAAbKVcD2?s<0}c~ta7NyE2g)bSVAz8{`5qxm z;moKO4DY+HTBokPTg9&CH}j3DM(!}iW7|B0i_uPaG=$+a1w$xc_(Ediv9osr?XxY) zc;-^n{%MvgaAiGYT&~Q7HU#vBrM$L%cynO z`QMA@D#>q`f}OKWsSm%HI!*jRP;IZyFfsHlvNp;??bTm{CyEw~9R6PT;ziKre?}T` zSA-Yl_kAI|yxxTOAXL%sN`E zCPAn6NmUP^orP~}LVW^Qa0?LU;PYT>Y(z3J^C3mYzGnsZXnzlnO;52@M)ERMjQ4OfvG z6pb5h-?;|?s4t28Bnx$RP7JT9tJH@}3lZANwx;-i$j9|$`=QTQo3F@5nJ7%lv!mT*L%B|)WE^Kk4$P;Fs%lf0 zSv#GVV4Uw_XFe0prsWc8Y!Zy~`Fd-VC5B)vQp3na^77ON0|8v1d^1aA5%|Q))c(~23y_9f775TGM0TKt*K^CBNe7E=|NUXXrC}v zVVR>K=q!KtY-i+x7g(AtO9{G{e9}EOvWX=Og-bMu00~)xeAn>@9Q-KZJAwu{IAnvw zr7*E}!=$5kHw@yoXdRPpO(w&xqQmjiL99kUp8rt%+RtwDD0jHs=Yh28M}G zfD205hdF@S0**u5_@U!sDi6)!idjNXqUk<uds+mrF$zRcH4{A!(hO#-IL>0FzJ#00@Z%xd z;<#75NyeHpY^Z(83e*-ecv&6R6b!{FKkvF`e6TVNAkc zdXEcCLi`|stFUy-a%6c}&PX8~Vgk&bAMc4urhqtHMT|91k+$xsNjfe!1$bl=PLTww z+_A|=}uKe9>h{yJm}qFA@J&gfRc0Jfa5m zR*2~m9-fqUJW@HR^9!UFdQ+9gWk25gNlI%PyTFZ$ z9XU(n(@{Me-oVimFg=hEs3+AMIpREl;tl_eE_;vwnUEJAstPM;bG-tM4a%Ism#ob| zeorX%V_&yk+V$=*@45S2(qKoX%u7D<{Gvj0o~xTVCPR!N6`$Y zpF2k|+rR~XGG<}y@97x3DcCjsg-mt*D!!^D1xnbHn@gwfnWWNn-MRjg$Qndtk{qbD za$&i)LHw7&6MmEJ`~e^cR5>^ZZuL3kIFEex``#B=W(Ct5i&| z>_Na6pta}b0Bd0Cj@5!gt$o=gcLXjIW91GjY|i%zjA}%)@AgQhu>LvQlRQrg_EaSe<&@Y%1@FudroV3o7HCEy-A&wk0$EDxR$RA& zrTSq`r!P#FRK4cRv7*$|xT}$sE0hG}IwCQ>CMuw$YMAMEb+hgDYcC%2 z!TrK8f{x$-Bj_+o90aykQR6_lTqKi)OyJ6=+bujA7pp4Rh3^*NHBhCf=6?mO4{Wz` za~G2PHYZ_r6RlE8B&D+ryJ-(iM|!%G`S5jItJTK6>F2G~z1r~4Q8B?VS$`9<%Gdd` zrN1V}+~f|08^JpG?Eg?Auz6=r1d2@9RqO4NVHf+J->8T9`3ilv*V>f_z9gEd>LY!; z7WCZ6&CLDK`xhIU-u+JUrzT@4&s3+mWHgwAyoQNaZTM>T+!L5q-yOd(Hb|>=1~0p8 zp(x_rU!!yt6*r5e6tyLkPDCfby|1ol<{7tTYQ8<$-qnhx;VZ%6Ju7JaI4FBw8y!AG zTW!@E6IthR7&(lTy51x-9^2-HqMchmN-&3D1VuaYmkssk)F7Ov>+4GmG}@lVoWg@{ z8i-+Nm%&^AjBSt#cROT7QmWTV7VRJ4)H}j?(I~H;H$`urWbWlJ*iJh#sc$xIrU5uB zhp$##_uSWI7Le4xdXx3@w*nX=s%6mizN{bjL9nQP-tsJhr?c~w>kn~j01fYwTMHvc zW-yF-%S{K*mH5g2Ky!79rGzn`}uaN*>SlyLPTG(bl-+FbLUr)`}~-j zf~XjuvyMV>iHm7hlXtWVTsdc*D#@F9Y-zYS5GVHzl_En_FY#)lFG93}_hqA047;Bl z0{R_fd&fEAsYQePI1|k{>c>b0xagkmgWqwX1qi(X{p0xZ&aFZEe(&`)zVfb#UV`Om zAA^TS!UlcV6Wjb(`3p#&qwm}BR_8;bF@-`jYkDVk*%vJoI$O;idtF{vmB`Kl5dh2; z31F^KZ8_$`QJ2iU(AO%g#ynO!exxH2^B89^-hhU53U^~qI?YlLOwKW<<;lg=U>m36 zc(iAT!1x?6guHx#-!y{?d1XyAu)_?Z>va^r(t*i2b*sw{rhcOZtb8D>z_0>Ny%+EI zRxXmtYN+Ll^f51{pGxi7>WX@fxn|jtB1jBXzHPC~NdSR%VVpLtGQr2+5J7A^gknUJ zCS0&)5L+}o?citx+*l!nwGJvv(bjt^3#!sq`@P|Y(HvSrKXW8S(PeAIB8VbiHP8iO z;K@R~3r|WrjW#qO&7rHAjSYFMqyf_hZxTWsO*zDju`)%A&OyXeN|am6ZX04@?q2ph zF{{UHMDQD&=bk5G`!jW`da&@1N=~M~^}^6p=(Md75jVM=nZaculk6Ga@;=-S&2UJ$K*1qlyj}?)FXE$QacCvuA?R$KdejWDEHNPo;V< zFPcam#pEIe`cChh7}eeT0CR1~kfPN2LF{!*uTbeY&U-w0xF(_!cD#{H681}3apicH z$g>XL&;BE;XsC<|qwApJWPJT946b4w+3xh^)o&xZ2f*W+>9DaNQ`Gc45MKEzE0( zM*YpvrlCep z@rH~(Hh=}-AEpTYfpIkj>a2F$h-R8)P?;m=_3fPufzEI7-QD!l`d z`c)+j!@(rsNy0uociFQ>=37DnDCO5Gd0H8kf9PAXH(n^-P$S~dxe^NH`En&ENW}m+ znAuE%h&X?a+dB=^E4~nQ${;!z0v%Qu8@|6v8O>SqFnA-Kh5n-DRONgF(6>43^`8e% zI3wI19d1X5UPf-P_GYJ}6^*1C;MEzAWeK2#hbc6Y@BsAzO$@B>LpxN9rtkhp8y*;y zTzhEX95UVHp%U<}26c@m_MfK^zFs9}X1C*b*BqzaR_&LfoM*Z&JdYMY0_z(B(=`71E9LDUDwXCCD(6&{a)|E_N zl5qCuSI?91{JuIX2oa*CL5U{XXNP@9reoXSF|QLmO(RYB@4`%uNB@to?+&E;|NhU7 zcU%oyrD0}eWmd)|R7#OmMx=~NMphwQrHn*{2)R+Btc;R*OGtJ@6cX7xDckQnU)SpW z>HYovchkMk*YkDO^E}UaoO1wPwo!2vH_#S5!~|xOsK=9QSXuO9%~$fmpWfK0_9#(X z`W&=NMI8`+3c^Zo%Sq#5P`un{V}*(|=S?&PZ@buO3^k6pfFq5wsBeb-oRW5e&%_g_rvO3>&EaEL_=!Jb)|B#DSYwq zH&@y9mOs3Sz846}DQfr(CXMn?s)4iO;l2Q+=_t;dpk8pZ{2!pYfV!DWo%Hl2v2E6r z5^k9Du<3xL##JqK+Xqt&pyZ&oYqvteY2+s1IC z*s?*hG$tAR(Vx7>taf1$#>JkVi8@$(aM#{&Pu+Vf_SqfR2tM&oVEWpNf+GQ#>J`#m z;W+rsE~nA2Fmm9hKhX!A+yOI}P1V9eb+564TS4{R zpCPY5WuXXjeL_*=w+A-Ol!ldn~->5h%!z}=U!^KsuKbW_HCNDESRT0Rydsm*kLD;h!xobLK@*?$j(%ztsu$NhGY$lL0|xO3fvYau+qYj4 zwQuCrJ%NSHPr;^dD#IHA1^`uLoW16qjhws10;}1#En4 z)=Czb!OLQAtm&8XBoP<>Jm_tb1Qb6pMJNcgPrHz)c?W+X9e-`2-`tF@1A6OfTOreW z2&CCrP?{6<-oM2nD|V08ukV=q*>B$!n_lZ{>AEKb1;fxC>Q`0OTjzchzX^(O+QEbM zXcf@o++?)b;6T;AoXdpq)whuePQu~c4pc=$F%M$qQqYHkR^U{_igV?n_h^se+B?GF zb>8?^gsHZGAtA63ho9Gn4rvQe3V*3*86v8DNFi@l#W_*Me#6?C4dAbg8haIgt|)p) zZtrNCc?uO!+;Gm3iyrl9z{!t2t`_(0!QA-3U^#-^t>48qg93CiMEeunkbx>Mxo*Gi zEJxG``sxbeeQHs=`D9+k6@bD+cKEeb#YB$DVRf1S@mDI*?1^SA?EA$ant3N}0k+U`)!H&FiidWlz zv$F{{IZbhRqzFf}iKT1IgNeZ)P#QXD zZ#ssqae+mT?tM5wm5RCJ*6N&_PKsGgIgVyTCO?<1wRdc}{_j7VlCufnW3@w=}YA9FiILHi@7l1P|3y$ zTxO)7{4vE9h0y8&h<%3GC{b_YrT6H?#LGyD9IUazF?wS*reilG`nJ=hN>TkT)2Kjm zB5C26^jHhZDnv5l+VY%#B_Oz3j^y}l2=An0#~VJ!uHj9*472)IA9AxYHuH8+#%$MW zavF=#uG=M7>f)H`+=$CuEh4XlzA@{H*S?4AO1tvt{0{lK#=4qpVB4HP-{2;Sl=NRsr zhy3;@9J4{8tS_u#DNUe9*7b*h*rm{^pa;8*EJ6-I2c)Szl1x{YZ{wi9AawrZuH8(W zTIt^0aXz>Coq!$?O5@yg)(dW}O!#d9v`0h0lxXQnG349QNpXVT^3N?BzhiXh#ulST zK)3-wDb5vkx}eq^NTna1o_sE#dHTu%%sJ#J z+GHmC{9_N_4-^b`N>n3xRn|kB2U^p6ub50kf?lLO-Gcl?Q2{`( zeZ@iZ(TbYSQ^PMt?Q-lKpi5VXirHX7!VsSznNlZIg}>71*OX%;GxN`u{jF_ZLsnhl zK6d6RArSX%`Zs1uq!riIW{p#Ii+92a{@r|Z)n=Ec*x{m!gzeqyjcio7bF>28);u*k zgLW9_uU1pL=T|8xY!2zeC*&qIT{Tsc5gSS~j9pM278iKz&`^#;BUM!bwLWd-mY)*t z!+2ghMoxQ8g7%O!lUOnXZRY#53tx;j)1U}oivxQUdRY#5S*&34Gb6lgp=ZHZu#0-r z(7xi^xNqi1iVCa|AmyIlG}ewQluO)oj}D{u20>_L zv)f)ycH#?1v$A&MTimD$65<*mAmcu_DD%FVXb=37MzQ>Qg*YB(xw|Vjs%q|dL zL`8mUOQKIKex!=k-fF$@=F=5Aoc_%Mf@%!3?j%CM7@(gUIHQ++j)rl@dFx=`!S#cNXD(x#FTIuV>(BT8Pa|0-cib+5#-dHs83I$#jQ)AtvjjNlp*PO(*id{dCI-^7&l}gkc_?Ab zn|ngij(MLb1HSncv&e~mQohH)AOfgeeKjJs`kh4jq%J>4D{8vB+mf%n9vYToh&Xa zkUs<|PI1)0no?9BUxz%6_eD2>xh_O|<@UC1bKU087}V6V`M->VyAqM-pQI&mKQ9$g zjC78w?CY~pyPqBOS4KzS3aP$jQc&rRdhIi^jb%$<-?{K#wo~!772T{%W3L`-BN;}i zxP}jOsL$b7>Q_!5@0%5SQG=1wrQoVI5rs1u1i6Lyol#DB1xyimB{6=UjZpUWm7|~s zPT9=Gb4x0Z@39Rc#7;+L(rPL-Rg3RQ-vx>#zHxhg{msoMF&(uzs8IEcrX(oCdMNO# z6CZSg>T^KGM;__f(iP9Jsra_VHy^ENwrmyBR$`;t0ZG=e_9uF{Y`RL(@Z-}}IgTU0 zi)m6mGug-^eF{k-_peX(6ZpbHcO98YJ9!q?$P@wmBXwvBA?|umhFM$e)kd^gkcDta z^%_!&`dPMN&24j5d{@HpLGc$hPeDAI+_XbTG<@xyf8b&QcK0&QQIcxcKe7>Cdu$EJ zJKdm8;D-l|3L_R=5A=$?Q9hB7^!UxIgU)(utXp5AxV1+sgA-UHVhZTOIn6|PsthZw zX#yrin!lfeNOsUyiXOeHk|Q2An0Z-JGB`9=p9dyxkejM1hF!^DeS%m9u&@%f40D9= zcjwhD*K3bcKW2zf+AC|M%_=DEhokAdQ6AujuQV;^GE(EV{e?1sH@?KxBYGTf)t?ka zNfM}Ze_zx*ISDOQ&+#za)4vGXzQ0q(?^l%yw66E%KM_r~yt!7Hp8vhh=zg zzn)QhAFY6m2~=RgZIfGk_u6X~H_mLh?EqyarqCVyySzeS3V?3`d3~y@RFZKn%8+w9 z#cSr1&L<1*m)E@BD@~W(*~%mR2*DIrgF_TY>Eg^lYx1=NB5YU}j+(}xj=I9oQCAJ8P2FkP z?QFYAO_wJMj{#G93V*>Nxq|2hB>xy?!~=b~l;OZsVmUD$3=@+w>BHF%Tf|(cc@`J9 zG2_hY6ubcE8R^kdtfK4%ZDn(ER}pgV+EMTbA};8m=mA*cDLxKkPiW+W@CN< zw@xFds-J+pu(=UJ%s|KYG_S2Q4U=8j)i&u>3|uSQd>_P;j3Zg_TH;rw==KO6 zxv;|O_bOWUR~(00`*Hm8b>dFvOV`ujHrfs(=CS)1(aV&n`t$SIoMloEQ~ zQP^`LxS($)m@I(H%*$(YwByLq&ajQqp|6~^?y0Ctk~{&EOu%~Snf=OaV6%+(#3e^T z<@%_vnuO7(zOk;#)t}fSSQ%cFTVC2@b%>v#dFJbR;{`0h_XLjSH%PX%GC_duW}dXg z1RYAmaM}%E#|OQQ{i|LAXfJ2D#M-II(X}J!%={?L9%@UaK%O}B7N=BhMoz6mW-bL= zc+^j5Pd_QP7Z^8vf@8E9bS+}K!`rdTcWv7>_+|V}tRa_~v_2g|j<8kv3zanp2ydv|_w5>CmP1HNm z1mQJf{#L6IXB7G(u~U8OFF1Anx^tzcjF(9N=96{$joIF3TYvTxjNQ@kaz9)n#7%`` zrt3Z^#h8DBjzNyO!Sm_Z;CHX;d+u2;2p){g0}o__d2z&FG@V9Irfy}-co-@x5|5Q# zPCM7=y!Gu~ksavdW;iM!KDF{;Yzh5EXpaJufdf+;PbT5>cWYiaS#dt5>FBG2cgU}C zBVVtlq_q26oj?WK4J&{@u^$q^)IlWyL6H`=-Dq+ z#U{xwZYuvXyPYVe*5x4&*K}aYP8zo9P4zV5{5cKq8!r2iToVUv_R}f0jG3`@yH@Jo z*~t8MJHwo&^JNRe@5`BqZ+Pxt=oQb*Ijqe8jJ!^@Xu4!}(mSOi3 z(`{RuTE*i}Fq0=vwA=J71^4d^^YUv{1t(!jrBXDMveDgzEED% zy5YJPJU?W=najYIZ(YyT0=rVb?s++9U}eA5({MFTBDufI_DVq9{qav#9QRv+GEntLmiB0#D3{1)|nCL3C=<(vR4_)-v zoy5-wM6xIJ8cyK+9#QKv_|2`Ib;&VVqc5J7kwww?%I+3ee?Cyx?MIk-_8_4}<> z_9n5u6R{oawi!uh<1F`(7^yxL_Aop5i9MR_ymwDe6-T{|tv1rSje0$5r@Ip@2XiiS z2Mb#i1o|dK{%N1P%w80#YnIh;F3TWoVuxxWM!hhk|98B@Q)>bJUB7*; zi|C*4z^%dO?9P1oKw7TD&~tC>jDr*7xBhhrfh`AS3|Ur`Twtdsnr~7P(>WW683aKZ zOQi!{UbeZ4R%-*C;`B%eVySG&4I-DQKa!&i;-)gU6C4b~*} z{aFWU)EzWb(F*DHB#9fkqCi_^ZJE!>#I7OIb)pB?-7q72TqC59E#g@(93q9A$Gs3d zH!bez70EhVsnjBuPD!MaP7u{f)SpHl+Z%G+HgURur>wqSZ}Up4A|9z|4ITd4Fz>#W zpFK@2iZd=#CG~kfZ>k}6%YxCBQT1QD!FDj@6uD1#{&bq!%6|Np(@HASPCM@|T^uv* z>pM1?F1-@d{UdQ=T+Jg#Wt3%`lqYifZLU+G1ig$Ab3EUs+uba!w;@AGAmx+$t=jr? zJ!LKj*0hf`O3(F2OxW(t{M5GFd%`DXV&GtVgutPISNA5o+Q$OZssg;)3L59Q2TR5? ze_PH~yD~Tm%8fwI?{iKWlh{!|#`p&w*!UyXcUw@{{ zf)gapc6P32G`KymEYMU&NXAg~{fJucG<$|aegA=XkyD@cJqt3v@j)Bg-h6(TGu?;m zd$vZ&cKh9R5_6jg`LkmaB`WtCM;nVAy8A~;yxI$tW?dy_x7u9*ufqU0a_NKt{oM-^ zMeNpF4$ITSJZA!DFfdU*HI4}yybyHl=YBl@Iz&1qdF8z*?duYv*h*2-1r5?3;&|Ig z+uSEH#n|Sa3s1YPOY3w->PkdaGNr2nuCz@w-O0`r)3v%bfz@ncwglZ{un*|5&1Pao z+g-xe2ZCK9JVg0U&FiNjdB+(>Fy8c9?N!s(Dji=oNHv#ITh49HIeJRUsI=shRmtAW z-|b(Y;BR&YM=IQCdvL5Q)?!Odb>86D33F1TL#A`pJ+B!9_WSgl_pnR)!XvR~Ul&e) z``fKuDCOA?WR>)H7uUgttoK5sZTE{EIxyh&wV3InM_=aFTfU@W+sIDG9!QN}eHK92 z8`+QQKFECQb)YlYq|>3@IDrze`Qxy_PJbo*VBe`@pVa2s5%3@A?J3+#fjp` z)mtRP(g&g?jg3RNjPt6w+%d<`esMqtfDOWMppIf2T842=PN5ewOyR%chnrjO4|u-2 z6|h*OOE425su{VYvcB2BTndgJX&oCaUUy(iFJ;8zupO+XNDE(CuWI(Yy1Yy|{7mH1 z4<57niTFKXUh$LC}*!%{i_8wc@Oou9u-A3rb#B_s2`;RBb5wDei*OTQB!x*|X$YLjY-cS5! zth@758|m!=LCjdG)MlSp??ljs`ArfvY5EP*lUh4Q*UdWjbycLfAspEyxE1#b$LjAP z2~!naf2i42kjEcvBK1I;l`_E;?T!2x4!sni&V`;hXiXVL`#r_m+yZN|^GeOx)0jA+ z%ZGVf;g8eO@VFd(vRZMrJW5C`J%4c{Pys>LkWG5xWVjms7Jv}g>gPCd)cUMijRlVz zs><@La~j_;F46W+8CgYaNa1u5={_Nnoy_I(5jmHs;S&+7V6F48)>}SdQ7Rk<{kVnA z$yW!cY@A*EU(^5BS_i1|Se+vE1JNam5%{YXu|@?=gwg(1F!-X{XnSkhiKl@E3k*`4 z&Kg}qvp`SE`_u+{H{;(~y-VHLqX`TEC@RQYXG!uOd;T9PK>4vqb-j7s2yfn*rhVU6 zz(8*VpWDwZav53$3+2DJ`juBuytgMlU^y6m83oY=-RzFf&&c#Bbxed34L}78UP!>i zD^F%Wyj@ZB!#RO`PtS3#OS+2^c8-2LE_+})a^7SE^q`o?()Woe4Q-X8G(AeRF7Nl*A&-9y5OR-YWi25&X+VWNKF5#pKZyFZh2GVw z16{TF#ih{)v$GXr=Ozy;_s22joqiC!9hL!%90u2`3|IjThKi!APVjnIKgqljp)#*o zCbZoLKd5aKK~STA^Od*;1zu>oA?E&;R<*=6^5%7{v;cii{IU0L*}YZy&dXl}(&2f` z4{9EnNWF^!S`(TQlJqQnvwQf832h+{Rg; zw_!!Z1k-wBvc6T1(h5;gj1hm~E&N;q-{8v`{LDo1M^1poLc_S58&E_h&pYsX|LcGL z_CV~#VK~WI^^J6bYWz0eX(m)5Ag4HW2_iv${xC>-= zvZe@=HjR9gjb$O|Vv0v3G%GBkOQfzDm9T$$vrJF-KOP)%z-*|euFLpo2^Qpa0EG&Q zau?>W&GHTymhZ{@cx;P-_J2H|u$FkI=0@Rnzuj(?=+boE)@+8F_Bu>PweFubQb1?4 zbG=RPL2Q!F-(DNw21e1%dG0^tlm)mtshesQuYKbJ@C+(^kr`t<1VL@1n2vH&8)r85 ztrz10DfJtFS?K{&ddV@N{SN5ATH}Cxf!z1Nx4!QEc33{?{K)_H{zu4cR)W$s=8c=% zD_`;8s7nD;DP=pDf;LT0W9+e=(s=4G4`oPHhu>a2!YG^ZWiwB33gY+@@f~sNj&D|q zbniXEO>8i2)VJ~%_l48^uadrjx_?IqmEJzYqjBiOTDO&D3)s*&@098vr>fNU{U0pA z6Ni4S-TKgvr}QESP|WXPXoR`QL^#XCaL;z--74kyx9H4kr`ZvzJo@k7o|jPAY^?*w zO4LP37zA2~Z|L1#vzP1HF87(~;XU`d!MpvB?f2muOw6#r8ayxqR6IQFJhb@v2rDFi z{t$uHEzawkBQDjXQ+z%qg6+u+cpROg={n&5OfE0HEDFVvL4eY)7{R$t9nNYmk&ztQ z{x|Z&b_g4&^6=jsTfiw0HFdfPa$1WzeLVYN@eIm08PY#C;zCu$UI^@`7DUd+-&Wbj zIgI=%>JwLTI7zqrX&4T})|bF zZui>l*wRZHtJH76akm`|$jOc`XJB9Hw+P0euS?1`_;>#A_=kC^*e9C)`)9Y~4-(F{ zWKG{Qxlv_!Me;>hq)R~_LUGzutnCv_U2VLvDR2I|6L{n?OddqslPM&F00tBf)j0w! zKf(!_0|ND+Sl{ZRvD$o^ zx5lYJ$=H>MSpsOr&4Xu80rx3n_9W9I-{EGQ?-@l?#Agsi;x1}Wh5WJf8<7z-e==8& zxi+l3l6#Ct_VFV&R>0sK2WMyO*8V;uGL}^A!jVMZWlr}WN=Z+BTyghgMyrL`IRUf4 z%r#Uo(7*W;P%-yVS_$L&!>uo$wDY&8flB!@c4U{zj!IZPtxUZ+z19=s=iPvN&1 zwmSiI8eGYcfcFw&2>Y(KYSXFooTE=aHgc9f!;0?ymyn4n&n83EyxQFYriT^=Ia=okjwP5iF>|hr$hp`*Y1~#3@g83Gn%;_JG6$TRn!?9KW zs?@}b#7{Nrlq!{eQ=~N%)uL#8hQ97Fc=_WoMO${U2^%$pPyLhfly{KC&V|Y?Q?e=E z9Pi(|!R?FS1tgrTNMdE=9FFq7WIK9kwQ>IUOxFJrqATRVnA^dKfC)E`lh^c6PGlt{ ziX9&U&=t=N!WX+4E>gF(@rj!MP-Xv5p9>`cB5~M0BQ!v16@?YL+EUb^)GY4(K4kh7bg0zePx&?i4&?!^WHz45g1ABr}7su#Pnn*v4OR{#JwR&26joql+Mv5j*ygyGrxB~pE3#qrY&+h>~qS8xacTO`^4a#;?DQhR7(abmtov?Xjq$_{wc%-7O9*;t7^dgY0WX~xy>Ke zbYsFqT4FD!7Nls-w6!HPc>jYSo)jsoO()OIe5<~8^^slg(n_?a*lNQBw%Rvcumwda zM2dp-#6N#V4TZC`PJ2@Ej_9z<`YZdQ)ZzaMEYzSo@on5Ozy?`D=u!gJ>XB@>0V4Mh z&fg>8p?9=(X80Q{?)=XWWFcHy?AG2>x%h^FvfL35HSuczwL!BNzbWBXz;~gmYG8EL z8ns0dLL=Ue%y_Yxw0Fp)F6`*&Uh>$hU1us{P6lRnL~nuuXd<%wqZ_xt`=pRj#4y*y zn1B~RL*=GdF#TVc^fqBOe^~^3c822I;K= z@3*7*g6E&!{$%hU_W&pvwEZxH#K24V$w@U^sWhH-mdf4)cTlO%6_Fd5QETM4qtf5P ztMv#t}{~PfvO;e(~NKL6-Zk@+T6)K3*U;udk=Qg-_ zd?KMH>LR)%3nMTOuRCv3)4 z(BH<-_&}Vpe=;u)J6%qhU0%!8>e|8e&gSOQn}sv^aX6Y>7FElxSGHv{46H)2t|iY> zJivR#VbpS$sHYSE+q2sdDiZ`X?PI(EHXfAG%k9RH&Osk zLxU4~$4=t)5ES)kGZ#3q@BW_}wy3cLb{tCXxjqfiVE=aYhX(UWL%4w>mpjQR68M!w z9mm})b~{Om9a{QiHIzJABuG2HyLIQhQ&0IL`5>q5Yb20${V%-U)92im$F6nPq4BSE zezXy)stADKZOEXiS|S9A77UOdd3Gx1OVGiOQp;5L4R5P@)4_Dp;?kh+&*UmFf}R8; zy^*Ize?L%&h%QHH<~$vZF$>>o7D}^|1>P^d>|J({MmxMS-&>5v?Pvx5Px_GH#=$j6 zgs^}7)}ZQt(>Q?!9W}K-aT_D@Q&rdSmb1_?Sfjd6=F>a&qhML0Rt=v!n}KVbBz^GW zLrdAP1Ev9|zZ9S~v!OEa|Izt%&385%Yp z$-FJ=u%M(sLK&u7Xm3&Y@Q};Oi6aNsBK0}~>J@H&9&0sc!`;e#npvT1ndMqAhoD`A zKHRRb&MLDeIk4;brJxn!$hm*|<6Jg!?k^1Yj+gt~DG1dfs~u4}_#Z+;5+vq)`-Kia zP0ie=<-HmoP$n5+xWLTEax+5=?+UtR36-eyLEPw;dvGX1xVA(!3co9M1yPh*H@WL@eBi_BQuTQov7yk_ZUGB`GLM)E%C)j~ zS(Hm;f*J}Oe`p)TeR$l}{^G=R{xvK3-+ibJu5a9W5N|OC);`b1$|&__{~wb9P|AqZ z62=_%-z?Q;Sw?EmZxge*fk!LZF48oKQ*^8pVrx>CEh%@Aj(Ij31KaqT{h2P~=X2M* z?88$U=Z{b=lVup??wzVSp|e#s;7i-~qD)3Gt%t#By0G&(jDARE7_R7K6{j<;j}hQX z(4xEtATeV6Gt%*sdW5HU=gUAb1!gt1#YFdZQm+p zy>BfGIuR47S)NFTiQZnioTT4`?Qo2UIA^4)9+23H8e5!&fDXl^{S+ekD0o@M@76X} z?bupQJ5N{QM;aEzG~3SAe~>31iAkCB6_6Hl{Us_bmA z#*M&R1*({n^^T5^LSM$OXu8*HvcC>&R@~)Y62A$%tKr zo2)1w)^&|rov5-X-MV6=QN1z29m-1!?gtWSyt;6XLH4R?1vc%=2CBEMu_LWp6YTzu z4Ig6?uV-p6Dr_%f?Zo4I#u0Rj+aem{a+x}ADQx`|^bNZxdK1ooSSG2JU`VNl)Nq^z zlq=6O>jb!byAFgVFpF(IYtK~J z5ht|7bS7BmmNG_{Ql(mB|6Kn*{>WZy(0S$T;$ZbSHX8V{b57A*L~oMAMgG4*N$V( z4tk}H0*gO+Pv7k!eQ9mwf~f}kAqr;fe0cz*-l=dpU`_9;G)I6&aWPB{^d1UT(yNQ< zMme8}y*ntk1Be}2!duzOoX1e@iyJg%vv2RWxVA)`!V_EN56zM^^cj(Xbffb8VhqDb|3wxNfX)%WY38-p= zpl#JzOZsihLlUl&mZSR`kgDpi^1`bSEX+=p2BVz%as-LG3VAlqLU9#xE^Y*-?ug&8 zkReDvN+6D6xu0b=nrsd5-I_;CaS!iZ2(dju%jG>{R$q`s1_5D`bz$=Jx}_a`XBy7CB-%LY(A;{d zr5G|uw4o>mbL7iWbli}3YrkO0T`z2P4scbJ9}#!priNT??`$YvQa7ltfwNuUPJc&E zE|ZDO2;!{<%I)!;!?tyFKQJsTXVZV&t!b#6XpL4(Jm&&~L6Lc5@Z-9LHl%^?+lr?O z8#W-Hx-fyVVtKBI6fJ2*AltvF>&rjDgACw7GP}lS2S=iUaFno=3^?LhjIp;NmZwKh z^LSA?q@XZqY%9gHbd!C<-@3N*j|hkW7lSN0e7)6Ai8ecN1bYe^L;-Dvh$BGa(8WLUfkuJ)~Rx zdEfHanRgw4@b<^i9d56Qe|6M%w*+Br(PIvv$LV)L@IK~mLRVEKu9Onb{;9BF;RIU3(Cegsu@(jK2W-zU9l4v$b)3Hoh5>-U~kh5ZPAl`Mlvg*(1Qb zTOa3{Ye&BR_pK$EFR~0ONIVOR<^IE8Y?RAvL10}RAI_PF5vXyM#B#3fr*3Mvd&MD% z^Jz)rkyX2}c3w-Fb2m0PE^J)dxor_JAtQd{lI2^z2(>zc{hqUp+xs+h>%Ukd#v=^= z4via#@l4>Nh!8`ELkb@4jb*;d{2zA`TAPxfWFYMnXSc?@s2){=RfG(004?F%07vKY z?QbH@{yRwcg}E`DA$nMZ z#RxPx*sO5TW~eu#bJ=OI##yeb*ah=L%%hYzMY@t#fd= zv&=zVu2{6Ig&1U0OV=b{7A+djaOM*_WQz{`WT*|c<`Z3o?3g833tJhDi&q9!1*J=t z?1dnSLGe*)14Y>o%j((DEuij~W#3eaV?wHGU*gVd@b?bbP*|o6^rKiw*L_G=rqSUh zJG;BZUg?dC8zFwA{`GaJ>G;6vz4MuCw5k>*WW&_HzTFkh9uFq;H`LO3((x2jS4#?>T~!YoRLKooB(ai<7_)v$(y5{ZcM- zn6&I7k;p%=^GnPt3mJt433wyIuzAQam}@o?ZWvZGnPUxK(6SNu-MXX;vwMX-!BhR8m zGZsU)_g`asDFXv2azJdtIq+Z3+qVuDXK?3#>+?WA~zb!&Zz;qzfZy>THi z$!!*usm!EMx8pac+&ydS;za^N%8(rNs6z?P`gut>f?x-Hf-ujAIvjXtP4{5+wT8j% zlp`2KO$RQ`yEKz6mK+jJ@hoy**R`!}rSI=E;>8s4{@@&4x0Qn@^MZpGO0h%RdEfJlabeS zjl;5A=-vKd)bf_!7sqediDYWq#?R@CRHDAhnqF{h;sYEb6k7nzi6R8D6XDcnIEq4( zd?7nFwZ%y+zL_L?vjf%^6^#%^%*zmrL^PNesZ<&pI~h&4nKh?2y2iuaA;xYV7kbwm zs9?4qtY!EW4UeP!{+ro@{fif(6iX^gQJgTkh8CNvOyK;pIrXKv6zEe0>FCD99Z?opCNN^K?_t z!o6ob1Z*HEUAHEA$;=Vx0OraUDi(ZSxXuC_20cIJvpS!Sp<5lTa^&Z{&JqSzh&n{qOkVb z#;B9M8cvxvd4OU7jxmo5&#*`ZXHU5GPXFm69PD9(M!Q(SYIHE*kYiP3Dg)t%oG*$*??!8x{P zmnf~J!fCsy!1ecc2mhzn9gcIln90orpnw@?Z7yuDUebCNwudytDJiSD(dn1^(r*{+ zKF|vc>@(Rfy7n`p%>o65F_P#MSt`+4&4+&9^X&is`-0KECg%lmAu=WCak^dz)koMEy}1m^Fv_zAPhNE%yW?1 zEHBf)bqy9$0kW?rkY%h^@-{Lpo~r?%oXP9Q9una)uiA#tlTK)sUS6mnM0^!!Rb9Dh z)ZSaXbFq5g$gvm?K5&2 zhbzYa&EKEfNs`(%joC5_5>31XJQhy690Nl1gXRV-1MWAGMAEhxoF^f?0P98+(34d*Q4_qv2b2oKe6oKD+C( zdYoJQs_&3htuB2BI^^r<Rj@t_AD@b_y{-J`PWe!Ymyra~pyR zQdB8>9#!T1DTC}_;wkz&uT`OJz_8OJqwOVM1t1tI5YZPV2UFxSkbuIn;_hqa9BAjbdH;2fYc! z7#s6*tg&jF&&SsPJ*_`O4=32iV4C=CjkNJ=-mO^4wxz zakTwlqnHziP|EO;;4~IGACFK*7O~lH@cR*Ry&t4{A$T>T6TJw$q~D0 z(?YB#v%YYhnA{YB+Ce8kgh9&rpXKmhL7O`q5QQ|Dfzx+sTaa%A8JdsQ_>wB~*Chij@8fHt)ErRt0!7`I ze<)@3Q{ny+r5WqBoBLqwN=bMYK?IJ!Gv!wL3-iq zWG!6Xgb7#OPr*-N*7J0k?+sgtg0p978wPFATfHtx9jIP@MOd~7K$xcNlr}pRkk#3& z_^+rlS=@!q3ZO<-3|S{&+kiFgtBcO9D7z7OoJOs}edl6`Vp(7bLi*E7UXiu{{_$Ft_p1F24H&=)jgaVl6WKZ^91RJJcb851NBt8 zM(UO5BF#ZN{?Kb>{*_0iYUw~{pTE)>ifk|vWs}s|T~$2K5bXNBq<5dQixHYwyJB6iLZix z@Uje7c&SvbQ7I`IMiRtv#s2U9SS}MLK_71(*}eJ0%~hF5f>MwKRb9V`O#Mn?PQ2OW z_c3?(af$}Cx5;VCA$~67{XDs9lL=1e4fg5oowTvj-@By}A?l?O4t(eCPINp<)5Pt* z=@TbC!W5f868H~wml8ymdga^9L-y}n`yO>b9N41)= z0-f_GO@$ZYSc^;DeL^reYAnWqx>s{7MwtG$=c+UH|h*#*IvnD$|W^O&K_ zkxS%%EETs*@h7O`Lb{uOuUa=6#Q8%AdF3urM>{r^A=3wimI3~yRRv*? z()NQZ3OLy;EG24ACYd`>>pzTnL?%kmeSO*b`M<#8XBZk#gzW0Yh~oP2fhrHIyuu7k z|9%p%6V+m_!8Z&hr#>iA%kqiKJ#Q|vw3t}z=1YPSH_-VvFB%6S0P=YVVr24T^4I6` zyf?4L;zWey>jmL+jwbRuI4};RM!WquL8`}~b-}^e{P|Jz<)<~& zHg+zS-=G}|r0K;V8g@~5FS-q#ruq`|F|1HPARw?e*V1BPZ_8)~yFF^kxhq4M*YK;@ zSmZO=10q7uRgAh6GG$VSQd7`yEQp_e9OLo}JVT@A-0>QUy(q7k$g!s z^Ynjo@7hQW^|WRy2JeO^EY@A1$rp7o*6ve3za+5NHGYpL35aIwHVW@pBoRP}s~TbE z_@ZO##Dj^yY+#QW*E88ZPXBNqCXo)@B~3p&Yj`-+S>$C3en{IYDVo8`Vq*6lDiF{f z3x`jIE?@zc8B}<=URJ-g{V3g*>Uy=ks-FTc{TzUtjwOf{fy70{&gcxqP8rSFItGU- zDG`aqjba~&9UyZ8yVAv6v*I;q8}5^?AhaoG?Q`%73P;a6!$xwBkV{^NN!`w8q)~II zQz&o!XFeoeP1g|6yXhJ~9d?JiB_6%(blnEiYNamXMK!?_zOyeM6Q8qiwJ=;+B?xPF zE0bNU#w;WTTeP)wO^;V%(dtrWtzn7d)dy0J-ZvCH-M+ZdPzDU|us4qB-IJgbRz8$e z1{E$4NGRfh_0+zKRiIk>`O0MNqfuMKSD}k&K{BGE+1i{?|7wBb@Z^2G48E#Eg-RD9 z1fs?Lsr&bZ%wN?TAQQg_afXO&T43O$;tDWF?CoP!mDiX3enAt!<$`+cU+<}|<$~<$ z8z^GrO#$0@M&WWN@;%njKn{S*Ea82-xv{eLHe+aXfb@6`l+ET*z4>yMe%vNSvuiPy zN({hoVfM(r1tgpjDuP>4Wf{izBM^zvND@S;){U(8H?>XM+RU4p6~;PBu$`H$ruq^c zbhArPzb6yADkFE0qOM2qs$AMm`iD2@Bv;Y&6VhMYr$vHgkD%%l93~()0)r-xYz59b z9RFHL;lsb)mRJW}V?RbZe2MxP$({)jNdVbENlp!E0;0#9H&M7mdD~iM*9idujq5@H z;z!S*Y+&JoFdY^i;HlF%rMC8l3is}HEcaz-;hR_Cz?Cw7D}s!w0ewz)&S%TFt}HB? zNp_f4uGhwr0z9c-?v4Vv{>V4EfhXYhd*)>^lp{CkwxUd)=1Dn9RAf6!AQ~+6@0TW4BV&RA zul&LI?LqX)6Ex;|nK|pr0Y9P7>KEurqxR%6W|RMCH9ZWeMGCRj%idA;r6rjH?^wRA z9CdQZ8)-S_LRR*n&-lX;EB2tbA~WES72jZfpY512+3JbhizVbvJ&T`8Tz6<;XV0Mu z0l3It&r!jCvK81nOB%*RuM>n=CQbWOJ2Jr&izXOaFJU;}V?kjbcv~~|bYw8M65DpG z5QL))$`8)v4pb%75I2A@n6bcd6MyRSE)dQ1s~|D;1YswQCe{a}M22U7^E_5_LwDOj z)i2tl!RZLpiDd~TNrl@$9Y+$_bCipj79`GF;7{Piyy(qg7^%8?%Q4UO&z>JH3ffH5 z8*@Jr8D+v@ct5wd3EA*f&fA2nLscw>4Nw)xLa7SGWR{?e1zuP-RWGw?;cP%J*RNaU zjVGyBv9bCML1QddK3P<&f{l2d-n#+`f-M`k3{~nnTkeyrH7=c8kgag`28eCCPsDFt z%y|(=*P*BJj_RoE=BtRBKcle_2{c&RX1KR%C(v@e7P&;Dd4I4^TuyhIdpK0y{jZ=A zG;t#_Z3rzPT~%&ejgnklrX!T84&T8o3jNxEl)hV?tahL|>AK8od_ZsYO;o-3@5K`L zbK?C`{>%7%bY;guFx-?32Lel!EabZqXv`0H=3F@K#u#&0QFNA-#rfW;iuu&rT~>q( zJg^+kM;wHSc6~2v@czA;XFb^M%Dml1PgTgUenrUvB!~6| z-hmN)ml8Y;lozh1OKV_@K|?4|QG^#5tFEoYq$CEnkMdth;JIn?*`X#LQrj8WB^)H) z4>RS)PJ;I~E}}N2XEUUt@HJTLiHKU2g3GC+6JmAZPDKQqUo!Gr{h>& z3&qi1N*YqFM*&8pWmeW#4ROo2(g%h z{QJd@Ckqk=IbaO;J}#R6>|$h%1#w{Dy`5N5FEkB?t&5{+uBT^$AizURg=sKbih9l{ z$B3#cYd`YO-u@RMD56v4s>>T%x8+r$DJKMsQR(??+Y|y4m3OZJoD2-}uyL(F zbexqX`?j#;U!V$b?@@`1y3*@r%B5{GA&y-Yo zWr^2;&O6#HX$uN2O`f}&PPvy8PXW(vY2&fv(J0oz0P22nj#JU7jdhk*{_z$RQEuWT zg>-MbpW6~VQ1#5zrr^n0eM`zKSA);AYv>!+-I|xlFObXCfcMpQ2B0z3sXdrB{;6&I zw!?4+3F}UK?R}@*Gb`V`LKc?51U72_dKx6pL}&sBp4;BQmQlk?K-}I6{|$e!cR3o+ zfLd>db0Gu)s`DdQ(Nne~y_!dXhwS4V%+S&brOhO)r%|H`S@V~akl7yK5C`s%{p3t@ zyDanSvy|8nWp;Q&G)A5$v^o0>)y__yWM$E$1atmv#qGm@Nl#AoUQ)2l2|6^3tPw`R zr8+)%sns}#n^_nSYE>+mU|)3l2o?5k0zvC%-p?!S;&jg0$zaX3;PmAI+Hj2Q#A4^+ ztbRV+Ut&a_=#@DDY2I8u_U{#7OnOcfLmm#>|@H<;y5jT!12Gt6u3DDMw&U-P)2@n{S-)<>JeadLC^ z=^AYyqX*~ML-zT&Nm{)S!{$j=rjK_wk0P@`v;gBT z68{~`;O!G)VApmqP=81Av0w+P$24F)bF};+{~)yg%IPKQtv3eC7`4?K=I^YXIal41 zj2`YyMzas*FUd?qvY;O-O&hoH;Aa8(sj~hr0*d5L>;_xV@-2Rl{c{g)2%Q*Cr^B&m z&}A@m8>d&AO~C4aJW>Ya(J@a&d_ef~^NYvYBE85BI0v2MEKDV?XHFi-%9}*TQhd8- zp0GH!J5GDl1nSATe9VRd@uPtF)WxNDwxYXj;vQ|>!M~6!m&I?WIG*#t$kAVKSWS2YZ2uMx-Z3$px@~YRjhcu>{|{pbl~6FGe~JeA0tzdA z4GVhyqfkGYXTE?H__ALz zMYc1^a1uVYM-+#GI`g<*ol`#O9}GB$rwKteQ?b4%s5}Jd9<)_sL&{4aXLMn+WOL&9 zpfKLQEib)f?}cnuxKsyJPoz|S0;CQy_CmnMB;FG2SnUT}k-^NqfwNHcB3!)p(5R{9 zEY&$JE~=%)SvVRnRLH`_s#+rzsuFiF9ZTL2n8AqM-FJIG7S22fg4G7SX`6}$@UQO( zJ+<;!6m2k?XK<*KPSqJJIqbwhd?E3HbO;xYo;h9JnR^tD?s;4}Sq_#hEzb@^@j?!w zweS;CVz5)`y%BuCdiH7hEwR&R!Au`#261vjG&B<)e$SR z)8zt^1xWEmLKA+hgaC-4LNr}x_u{tP{YP3>SXo)D!swy{4_z;PRSQo2`0Z>1IXaHb zKc)=BK4MP?yxlW{-A$+s7HmQ1U>r85U@dACj544sQZJF+$D)&79I3zLF*bpo0uz~zB1=9^` z;!l$m6(dJQcP&`V zQ=m+3Qx=71VQX4>1P^}JubL&Uy4f`!r}dc|P}99^Nrc@75-bmD7en-;SM1}6g=W9n z)|3ZRMls7vuIHuYg8;)gn%)s~I{Dsc$IAQRX|33}J2fzj}EJZk~3wB8W* z7uyr8{|itp+4W`~hvgwqxF#pQ^*^a4y<4#Vy=y&hOo#THllK~x+@bdgn)FLd=c>ah?W6Rsk z{~lyP*_oSx$F}`5^eKTOCxZc_=PqKdg7Gj;PWqzb8{{l@4ZZ)F5=~39c=YgC z+Tz8rRw}*Eb~XO%SQNog87UMS_Q1!E{4ruU$Itgo^2VpzdB~e2wVj^WG&mXk@RG~m zd$Cqrf0w+R$BsWd|8tt|$aD*p?I{laoTozVio~7M{F>iBw<(&4xvDo_4!-c@RB=_z zgFziXZ%o+ZHh25kKh;SzGEHe`7UZBR)IbZGB|3j4A)=I_q$q+8MUlBHcD6^RlpioH zEkdaMj6#H#EskqUQC8|#lr5kw;5z?2Yk8u-vmLnHFL6Y@Oc%9~tXI@NH{ zg6h1Oyru660C@AeQ{wB@rk#%NS~Ne|p5;A_QX8AGsd>G}_hqw|0YxZq{(D38c)GcME-NiGGz7*1@!;K%_FV#Yny*rlj5 z#K&l521UA+(0SR~s@hcVSGp__1!*b5=r2aEp!G=f>SJA*(dZF>W;1zyPYjqW6c_X%^{DZ}=Tf{sr7)rQXto_dUFvafjC+i(Zj+bBgH)4SpN z5{=+jWB|VIlRmIA(FKd0KfXQbO)we81Nv29y=;4>=O>=Ege$d2SxAYr9i?Aau_#3u2ym zRpV~qg&1JVVwC->|-E!F2~?<3DATv7Cx>jzU$7w_-$p>!d7lM&1Er zS z3Mz=|$ygSvM5uJ;FxY6VDk_P*ptCCTMqNKR%i`}blJkLRF!DwT&MYu6v3pKNL%G@t zvI)n1n^gECBA!bTyBE2sajWHMTwICaF#0QkzkZuFC%j(W;Hgu{)5Lh6Hl3^WsRO6L>7>YUvgYrxldj;+UAdP|1`A0z9LA` zP?{?sT&MHKrU~|KT9Bm}F)U;~UClX)*nuH>lIl(iuMAJ+HOi zc$Y9rgsq(@o$(4aa34%yj+>ySP%Bm;*Me z*k(!sw_9>AC&a;pY{~QI-|{}BfYsw1xh5pF2)mlwLIw?5joIlkXN1>GP-jTc}3 zmn=Hp5dwZHGf}YEP3B~stBOhvN`B7~m+0H583)sb-S<|;2F}>?`o`&dUl5~2(QyC`_6D?MsG_UiSpvqm0~F`=sn5BKj=W|46+G!C<-=tX(^WzH!Z$DLlbfA;j~ zU9;!YTO!%F1Gf@rsNa=ccsmb)6s4Lx=ZXF8xaU+Tf#SDm%)&3IA|{3Hd*4bHw%hK9 zn|kqQM{TNKsZUACn$>pGjS?@C>PL7Qnh;<+94}C)B~!JxP_w*sblke;JeU%o+en6j zcjD$Ds^N!DB5Uq#dpREWMOLum>P!$ktXR3qkZP?e!7bGjHy=(B9t+Gl{MO#lcgY<} z9TBQv){C|0o>R71y0j)d!M1(~D!4hNTSXH}zl|Q}T5NT{&p=2s>yh z5n-O+qiaq0L*9T|NF}zM7xfy6A{B~)qmy-yfB$Yu?l4o2^eMG{90)kjZDnYrnYZCa zaP_O_-%l<%UaGh^?R@#HJ#X&K`}(n$S#wYxsR2tc+jybjdBCf}^>f$X8E~!tu>N%} zRRQCF`gJ)%BVR*4Y9UAdR1JV>`rpM63FJ-Izk1cJ)PA9 z5{RBXf>P39kd`gILh2}W+z$(RCb$oIBa4(0bLzp?m@|$%?TccmrU# zJh{2wm2f`qZx}8n(-&rFHQ4`;5OGR4go;J%A$0^l^Rh-$V)!2yD3Ib?g;e9F&T#m> z7XoJto@!Sf{CoWyyBVv;kUKuaWDBV_2dMwA^w%kU=jr+Eq&=PocF|a}{V~N>U9gL8 z(_6dEs7Uwv%QUmIp?F<(&0xK$HSc(e5%IGUBPdftV2J6-)YVeF`7!`SpOmpzC|x@#~%FsCb;Hj zTg$^K61HH+ppEN}_o=G<(rf*HDpOsy$d8l#y2jQmE!R<(@C&%=syd z+a)x7d*Q3{kdlp?v+0QGI=Rq@_mSV|K+75~*S4bTh75O;be#v6b*Ui%V%#s*t~E-# z)9vAcvs?J;FRSTC_`NyWk+Qzjb=ceydy4Bm-v9oias9@mbr&7>gg8Vt#uZpgBM?J* ztOqxmPrNr#E}}KzP&O@z9b~TXZ4|zbr})Opm6sy)Y}r}3+RE;~s}7>lc1ntIrrUBu z!+WmXUe$5RealtL6GJAa$!<>@LXl}%RLBUsDN!-RgG4MqQC`J3%k_)fi?M#zlMKy% zx2*I$`p%kMXo9ni#4s7QPgI*UN)>5i<>d5BW)eY)`+Xo>bD?w;Zd**#2 zdx|=WBj)aJy5#Si9ANgBs(2gZpn}t~2~#U#)&%~PM~|L^I>kl;SJ}{rCFQM{9)%UA zPv@oRq%K%IJJKO?)PUGk(v)7jQ$~Zo=EQ^xYtOaqTru#sd&=|V3-3R)-Ce=Fs7+D6 zPvwM-iPXlr%E(yAbw7DkEy2D*<5G_FQao9~iuA`FM_&}K`?)no{Dzy-ck(_D$Fyddqk^NbJb9v<&^ zE?QULnD^+)L$-^BIn_$pE8hH}MICLK&-+Hca=)6bF+D$U+>@+S=ZTCac%UHPXV#n7 zx->(Dh4|h(^^e1Si*r8=-hR|!TTd81c-nhK|8m2g^X_PHryKnpPfyk3$pMS1-CcJO zEZQCf7Ck=gF8BL3>&Vu5o85}~n{Mp4Xp?Vey|V)X&}*dG^4~VRsGC$n4IW>Q^EGJn zdrlvspOUtE#>`zBOuq5dny1q&{mc6225&6Z@~p(C&5=ylmS zn@-0j7k1j40mOE^#qGR33i7=tX1t=B=wO(5V2$&dm*}>+FbG^#lSe(DtZH-pyWzA{ z1VE4tc5B4&>H9cw#FBE1DlKzW@8x$ISNV;x#h4 zlMdazMO(&(jI-jM%Ns3aI}4ul>#eb|8thI3qI78fkt@jdY8Y2LRU z*(`|#{v3L#b6#vu^ybgre$xn+K|ZZ%K~XAWC6nITdU|M7;s?<;lg>2#g$8UC~gq&n&=Njy2{yOxyhi^<>g9>eeo>Jjxm#kVA zNpozo(wQ&EHhp@sc1@eBU!N*^@-Tz?63&Wr*M6&K7AR#Zrp2?Ij06*$mIK)l_4o#M^7-bA&CUlyd`lbS3;k(;G=kT&Y^HCbzRw-pHB-gY=-AE~ zJ%VR^c>SPtbt>L0q~FX)vBg{*uKPAeUIY#|KirMRo*ba0I?fSS#1cg`3=;5M#c|)| z&dHU=%WEVxV~Sx{jkME8ng>sRJ(^kZh#q*Vad8Dr|D)98tCBWBNPLiQ*||N|?rrX* z+g>hK648JV-W6i(t{)e6K+T-bGSG>K`Lw8zSJ4Cm-Q*U~;VpZW6;^hU4!VWfsbXqo z-h7R4`Y-3J%RhYi+kNEMlVb$jS|d$*x;J9Xe}e)3%{VfZVwI?qym9GXqu&1ByHd&O z-gIvJwx^eeo8`>wk#zBna9O(K8AEu}u)!wzOZWYL{<`IxsqADDBid) zYP!ABC$Q>YYh9CH7uwB*Iv>VolSUZ^eO+Zv%9@8a%wM;@Ir59km4_E~;S?R}znSJO z`PW=P?rL-eJyK0kc}26U#@0K+9?r?0Mg~$_N|6JDLj3P=m)XKE92dld{uTpN(YI2f z=`vv}Wq?X||DB_~QqwNfr!(#Y%^XICTz*Bquq~-KK(?!(e6Me5(!N%@K7_}$0Hjnh z)3m95+X~=`>HV{6q2adY*Cu?c%M5T%)*ADVxNQZD!ac=1bN^jU$9(41j)y!5 z??`W9loQth%gy{dlTIAkZeaj#XFhzx&1u{O`!zJbOd9PVl_RNFmd{j9Z2wV}+;sF+ zbKtYDJq50E2~&-Z#=fDA3xOkqiGAYEbF?tAkg?Xy_IjjH(Abz4x-C^j40JMr22|c{ zq@i&Ec9xOR%B4{fB>?wzn_^GbQVAzxGoRah-d-#+bh(=UpwUjKlM^VE>V4TEf9C!& z<%u8e>a&j7r%N9uGOyzK5bhHR+*RN{r;e@-!e1?gf7`Gg||f@xUuE!xHYAahA6sy+5uo@KB+hhNgD1Xze@!)Ge`x_q2(n3&AF2UZh?$LfPlhDXHn_{l% zsE9+-5F^2IbG*L{51W^70IH9)x1K%<^)R>X-PWB(Ge${7va~*oOHcn^VvZrffYFNA)xjmkngGp*?ZTpv|vZ zY7ZtqJl^fz+_i4urS$vgW1>Q=HREea2b9VqsMBxS zQL-Vt>pLurIQAQ>Ql3h+Tt7J&Om;9L@@4Ei;+~0yLQoZ_5$I#9!1r_cT z#@?@orrYj3{T4Lc;;1LgE7PFIEfy3|Ng_D)TVRmc$C}p|%d1vS46c#jua?6hobo-| zmmXYVP2+;1Jav|e0*N^=a;OutNhNt`m#(JA$7piQEe1`>U1oeL)zF?xRZe18 zH~HK--fLT%<^?M%dyYC`etS)SyVR|fRLTgYVF;w?=pDb#pwm$fJl?ptF-yOFNj7yX8(W?3+T($B;WUl3HA@eVV&u^#$fM6okC-!m?t`AuyzI7CTkzc4 zc^Jc35v5nfydXbBhs%$ywbe7w4Gkypr(YMJxrR0Sibi{cL!J-bsm36Gl^RE{BydAr z#V|+5y9NQ`;jw^N;qq>Mtu?b(wtBa{GfK;^Pi2a8xbv{7prx6s=uM?8AWltppR;E{ zybV`x9LPC4_X{SZiT8v6oTg8|r)$3|$}890eu*1pC}I|zh5WA1_{5ay+NR-fRtY{y z6BShJ#*cLp)0NPI2}lwx=eFVD(hbBKTCT0fc!wp#Ra&(B97C@C)nKXKI`Vtk)!S~n zi)YHb7;8aP%R2k=nac)B*oxe=;wL5FZr?f{{7aXwqWt*2gTm*Z`>O!3$Bw-=imHd^ zYvZ_aXH2OIXpAq=u5HYFqMfv)$lSvFu7#8Mm_Ec%U~H>g&s^^og)fa(d7{uMFJ&AS zdO0;)gMphjft#Vv#Xz|$l}lNTm9VbI2S#&HD4Ul=bm*4c95Zti$BVblebjYWV2GM1#ULaH@Z@ zA0|u#MHt=Jt=Kzz20*7-^h z*@oO|@l|mMEYTr5A`hL*a@G2%!G!S}xO;8yVRqi^VbVYtkpqv{Gj#F@5_^Z?vR|$& zfw?~WNXG{mjE9B?b+cE7@1VEemfS;#=WNe|&YP3F{9?#x7i8cu<*7T2xSY+e+Gs<+ z+XzFk*iTs@C^+!(AZ;4(!+M!){Sq2J>YshgBppOoLL;*K7cOB~JC^Jz%eUE8E;Mq9 z>L>B#0fG&%U%hCxCfGl#so%y^iC<{4ay=!d$JU)l;-L%OLeS*id!C6N3SeI5CSHnA#mgO-3MUQpF^T%W{Fj zCvB&z9{`0m0|F&bXeqP&dG}#+md?J<|I};|uJinH7Bd=72yG_36xYOb@i*{rDD{-; zR=cjLY10DRqgZhq!uuj)&VRh;gs|Hj@7WdOj2S=15!Suq<){Kia~~NDqFl2ib>D9V zc~!bUf?h#qhJ-*kW%6LwZY($6dR8e*Kyz(kZ)UR6zw8u_;?}LO#t}zx7#S$y>=525 zJa=n%M#&XyqwbM0!(1u|ZaJ2XC}5=FYb|W!LcPUqic}FGNZs4`M-U>HP>_$ z&+9gQiC#e8msWY_-W=b^;MxGVK2@K^%p-uu0H4R?%$3_ci^4ZFqg8(V9vt`+ZrgFP&q>7=U5 zM_|&Jd8s43U&pt#1q`&0z=nd3bMy@(_WRuD3=WYb2AvjU`5pI`yAs^XA0i@S)3ep0 z{|$uyEukhqFe^3w;>yaxC));f!QXw0D;z;l-$S&j}q7`z`|%>XQ57>Kv#6XFt;DTzIbYC zRIn^WnhFcY0GM+UmR1}rU|`;=L`^SyaoH155ZJ{B8emA0cP_6fird|B?=@!X&>4lf3Qj+&Ac;>dY(nH3 z66W<&00C(EB_kyiE=mbO>J0-YoU6}qXBa~Uyrj4-A#jJeMO-gi(*HrL1qb*(vu4#@ zj*sAv9IoA2H9u=(12*^9_t@f;BoIe{3RjOD2{WK){6ScxYtOdh!7c+R1u)25Q zy?mJ$MkEt=H~-#7Q8ooP&n`$ad6Ub43f+aNX_4C!y^ms7J*^*$c4Y?0{^GqH5P_ds zqvSnVF)<1$$CAaiB`i7(G(mh8pD$F$gxK1--~S?FK8*Mb7kb+@8EbKum14OX#GD7V<1-L?E3EiT`v@1cWkBy=~U>@>Sg6@-l)TUHdXsj&4k zAtUy@{pM;#NNv^>Lk1uuVjkX@6x>*&q?|rUqm8wFS_wFo&emh2V0>kcUgQ;@a(Nj_ z2uC&z)_mk9nut`p5{z?WQ+vKUXf2>=`8t|3LU<8?hL*LH4f{4+7_w;$vRo!ut}(PG zgZ*3&yU6}`=#0#V+&se0hpi828wE*YJ;KBCMjeoh5oL8%m|{as%+8+ zPGL;YP6SbMYEO1Q)nrip%&IT(B0(Kn6U6s1CvD4={gILCnVH( z=*bs1N0^Ovlj(F27^j4IwB{=g4)EsUy zd1o`fKbG{4Hf5{|j*c@p=IP^@ia3s)<%0^U@D&4`n6SIMr6 zKo=Xz;I)!T8sx1hTx@8|HrEyUFNz$9XN9!Z`kQV{d%pZ)Xx8Y*#nEi!YPuZ=p2$?> z^Hjz8yeh~oM^2Cp^ zgILimznBY-y&M(&t&sTI%|kQ?brV5HD(VM83bd&r>uNP)oxM0E#I@ZCVjFqb;L_ff z=L3ml`Eo!dS0wcwg5+HH*nDImo=;T;R5{f)0+Fid|#nhfeUBF&i2iw=05i{uI7?V}$aeHJ% zo3X}b#?P9O!)|6L=zr9}xpnDEst6yJk;!;iKPnoF*uS#9GZ@snr}i72U?;+^70=(= zGhM(we+sBAiC;Ra1|bY1zl#jJXF=bjk5O(j9RkVvVkrU1_N0%SSg_(gE9g&2A*HB# z#&oX9Jh(D_pCp}DgfFeP{tQbI`}#n_Qtm|Xgdt=5%he3#Y~h>pzZQREf(6*uTEf@6 zW|GnCL}v*^`vNtywJ*Mn?#J2x9|KMJ#P;+w2OMygr5jy7Lr7T_r0l4j+LPHU?>gL* zqwBxP<-@NR*SriF-14Qg_9Y3f4}qPL7B!9dDvWtIu{CxOD}7PJZ4Cu*ey=X80Bm!i zK+fjnq>fHa>z{FK8vP<}3?Odc+Vmd`y~tFbSuCgo(U5!g@!ROuFJdcqsI6#=>t%iy z0&BdDO*4HUUNz3)x1)NwonUit>k~`<4n1*Zk{f_CRSZ4C3NM_=+(NZiQOLuvNX38B z)EJO?VTp1t!+$Ngh;X6|A|n5SCo2`u0jLG8tQe=liUKaOx0Oqgy-kFpW#`|=fl0`5 z9C+b68My_Epp~!N7O+M^2u~_oM8tG3cmE;Qa zOV5=R4i(XF74Ym~Q%ovH37)&kjD}Dsy;k=^7KGgU-^hKU!)Wk7qxM17?=Pi3UM>(@ z3v6$Tkg`}8hpBtS` zQLsPU{!ruwb`P@W5I1QwuSpW^Y8TN0Q@vAngFQ^P6fz>Z>WJDh7R27(6RMeW z;L+)GK`Gyrbw%D?Ey;3E)O!5}`9D=r{;#XdSFl%2=F5%vSXts@WDhkE-VQrAQG_-G z990o;^tug<8*Z&;Y^+#!UbvUP$?&xXU{55$VE6=>%2$gd;t+j+=be`dYjSW$9EZ_z zVb!x4mOPhaaYL-Ka>VNDE9gFW1u8JjkWR^*HLds@x4m$I5l zp=K@PkltxKdO7dl-ojI?*I#P~)c^-~!~*;b-G10e#0Ntl{r3I4BTWSJcomMGkNpET z4~5YEkyoA(u^!;GbrXGbfeA5&5;iJ$Z0FcDEc&z}-@)9BsQ@5IDvN>cl(YpKNIE~U zwfe$jLCfEoLz82Yl~j$xedxj;UhP~ehWGdRtG=0=p51B2_APFIHS9h?^+E+l31+3tTcyNdA4F$Sh!Wg&^eq0lN+J-{2N7+Kp95q?4R9%O-wR`*DGru-;SI2MTUMNDjj@_0MBQ2Kx+c`66;wYOzjGsk2+B& zVz}16tRj2!Jff$3yA4ms7H~xm2Yfnq`ZkOZ$CG>fYNT7l2&Q;?5N=sB&DBLGyaf@d zWu_^27bIXbIQ9m8vTit8zwVY1Hn0#TTE1qXi{sgWNzz)~ME47%@FC24XS%JkF}Dan z)jC<&b{mO8?x2cPjBm#-&GCTwWD+O_^bulzJ>ge~Bz;s^@$0Y8?vWC%pI74z{!729 z3t=m&BtdCmI7$n3JpDloio=&9zED5+8ddN{Q=hyM$-4cM9wwqk9}rRY%Er2{29AJ8 z02K!K4kwc&gxYPmvJr6F`-{FUe}w2BQ9TbnkIDkVGPXK=ISjeBr}Y~(w}#{8A(;r9 z-E^or3S*1S`8~F}iJZ$2%%i@-@3GL0jj+OPMkVmsqxXV(TJ@0+E?W&(;yX!Z)t<_K z(MZ_^r|95IWP&}!rj^bfks9GN*h0=p)@eoSa~&PuFY|prQz)!|+eFPshH}s(%HgE! zm7*E`48yu?bP)wBV6H3y$HuSB7uRqIHUh-&JwKM-AqLu@lvaXzZXoFI^|T|!u<*kr zEPO1$#{#|kg^m&dtwc4p{n^j&O_ldIRwW;p@XBpMAHD2=)*r+w7PwG>$16`zyO684 zD{NWKLoDca__WB*>w-G*(1`v+3%DZc68t1PTKBOAW_Kj(`J}ir=^&-#brb$RKXx!O z{W}jkiFP5s2AZ}a{nAAdgJcubuX^WXWauc0ru6_J8;5&m4FQCx_|!g~smdZIkd?m! z&KGB^$&L)PArp~>eW3QOc}?BR&!1X%5KZFkoNYq!IPMeY*!`?uyHlUbSE;IM6fgEf z4Pw^)>1OdK?@9WSq^9o{Zn8{~2ghjsCsZKIc=4nN>aW|bTX?-eP?kFc$8KjQNJO}5oE9vlMHBV-LL|Dc?<){B8+8$k z2gvI~Ke?%a++BBC?j@Tq3&9cp3Xhp?4fZ>`S4Scks{;9^b4*R7j=3jdc}QFmS{SNo zSl`gR2J78V+=Ux>QK2{zM0LIWLShEilPYrtnOxzYT%5x?V({F$0y^C|hI{kDfA?S6 zQBxG}aEUFfY1#pE%lNAAK&_|?lp|%5_xi>Wa&Hi$g?2%u7?*g{HJp@WSP3=o@{F6Y zx}c@7hACROKBzcjwAumkOtA`+;#iyZTE%7HEh}#O&&N;;LyxAZiuV-48;ou48sR3c zq~c8goSMf~r%%9kSwWu%qp7sM?rjhd&>DBZN<@+J*GOl8mam6+tIB|n=1Vsd1w7AI zTAmrqs;N?^CF|w~xrPE>%8M#QzEu~&R4`%x1^KL>3r6#2)6k{w*J^R*!FsxMQk?*# z)*DdI+-17=IPcrn92mNGD9(*p-j}Iwr+}7X2|Q{W=ZG7-QU(idze@kqR{3%5wCd^@ z-Wu$$;o2CYB@`-|A zw*Khav_TQQVYXN$WG9KAxrV@0z9LuWod(=wy#DfjL zMZ@{oLZ(*K>28XILn)g9^C`Y}$s!TC$*w|(sU%=kW0Dg>Ds)YLioeL3&mDF2=W5#x zUt#yyxCD!zdWqcn^_2yBV!8L4SUxCl)r7fWv890I%M_Inl|fp6y(4nir{OCFe%3G( zTLmE9zd)0{ioek{qZEGZK~u!wdyk+qg0!S;p%KBI?2R1-Ylib3Zy#x6G7F#%ZZ0gR zIrEN+jUO17LSkGVTL6@An`{VKB0xb{I4KBw1M@q6N9hdlA>>Vw|M}cy=W_7^LW|ng z^>0l-pM#f^o4$0@LtRcsR5Q|dpLz{)KHaENMs29~`kzZytVAQgmk;9tN-v)FzgqO1 zRCf~_^T`IOqDu&}2naGZ9S-wlHms-Dy{b?3k6ZW#Qa--VU0-bJCLi)?|76|O8ld>F zZx=*X7ogM!P_pUroz24GOiuu8pF`^}{!&z>`weV~Sc+R+S;+(jCF+>Dy8$I}tp<75 zTtMlkvd?@gKuI^%6b_6)R_@{K|K@#}*Q4lS^`J9XMqU1{lQkY&L0vN4qC!z5>Oim+ zsq9=Ogox9gqU`#xNIG44a}G}OsjFVF4<66TG8JVnaP~i}3SO2}$?~v*X`7VK=u(C% z8;@AN`T23elbHXjk>>xa`B|>0*yH@s8Zo0l);B5i`L04_B4fiMFKk<0;W*HMk0^4~ zWS^~F1n=aYUFtXIU(^-J9m*S&-Yo-WN4(6f!4g!#M{QALi7(YnN3VqnRaH`&`9J~D+$Y;vLjSvm5h&~dq3Y=CV zDySuAu}ucnH;t~6AR0t2ED*U!5JLE*ZM8#G$Q8og(|FkRFlMPf}h7_33@r-%4%u&S#gf6P3 z0w7=tO@pPYzVy7r{#H!khQcOZ^VhZEJNhDExA|KCA-vk%C|pwK%$uzNXGfeZ#bYUo z&}Mr79kUe6dv8!*`uM(1*HtMsL@Hj+oOdBca}6RJ0k8b4{Gm0@wG|R%uqZ4==+Jn% z58X~gGsF@iZIti4vLKcm%UwIXruUJRcQh0Q>Rw;YHtSYt3|U)q(^xEpQue}dsQ+I)KQ4E+*xKUFCuWjd z%Z2zH5G3i%5H!lp@tlp<22Ei*tNep*4;L$BkTr3ZR}QWeIm=xHtH2H=ap~3>fNuP= z5)f8C%-M?E!kYWa@J7Ye=+2F7@@4_^f|#L`vlEj{;Mu5~k>l zl9g~$vhrRT^fGNlyV!K>B9N{aA#jh@f=~0%G+=ZhWX>AvBU#P3_ydS2wn@BJ*Q{27OuLmdA4ooq1 z#2&F0LC4kgVw~D`KmutlMlWb$oO&Aif3oNLgNYI7Mdh( z;R-j?bK<1y5^I*7z?xT6V#JKbW0@mnH!x_DXR9Dc5UG)~B?fPFvo{ggA*(29h-N_o zNJUX(_4+`xEUSI;%b6!^n5S3-bGsX!>vzJ`?FhuI)Io5?0SteM+!2xW_ccwG7dwaa{hQfNGH4fFWZ$rNyK+vlk7ku(kKm2>W0in zq*`Y-sNqq$k0@>hr74eg7D))t1VZ-h9doT_Fl|AT-&mO}cx|NFqCkt&@%t)c z!ajVMBu=mr?s$)t&e|N5-*B3(1+e`kL9R1FTt=$jfOX`;P76^;>@OcwRC33X zKi0PWlnIX8I5l^HBwdq;8Rvn$#BxW#vC$nn9sfbxg_2-LxGfW@K=1+ci9Xyik`?UR z_(j50OECib-q+5?-Kruc$^gT}N8XwehNG&QxcE7N?HrpMj5kl=g*SBDHcu=}fzQc! zUasp!Nlow!pbETa)3yT)XITHnPsT&(!luz@nAhJXFaQ{0#$eV8};5iLJ{U!Sd^*@pMp%CQNW`T)Y-y z>2c|W$tkn2fiVTm2eJWmdU zx@(Kt9`_uWam~U3tg|sY0o#YjEK49p#+ATbjB!LMg&t6R#vxvmA5Y8<9I+AVID6?s zlV5gFTvyha1x!RczWo5kbJRBz3Z16|yDT zy)c*o!Tkk=-sUpa`c_{5Slx1yK+v%PcBTS3s4q3y&r)sS{r{xe3SE+ac;8FVlyEV3 zr1XIgi z4GoY#Ba^dxeAB88*vi`+Q&$pS`9As~9eATRfdHOlMK?iN6l0Oi_La%y`R;l$H3Bk2 z%j6%=0Hk>;6wc3*)PN(9&n};{Y_5cbA5#1oB=f*M@YGDf2j>*3O=-#YbDAsMsdAyq z?^`x(3b?R|v^T;m!k>EpW+Jk$yhv%Y1e`@v3E4Y#eaXR^D zr!C1I$E#V0!+hX!J#cwetf_>@&_%%1F4$j^d7)^OniljXv-P*^rFow9L(+cFY|r)w zsKixg6a{vwucfetf^j`X&-1uH`-Se=kwD>pI))XeiobHo&;JrM{d7BB=n)V4madS+ z1UMLEo$5<@DUz;%K=YyMk;Dhfe{-0QvC&K=kBr?+lChISB?rYVIx^W>c@SNw z`nayv&SXms8(iOo8;>E??K|fW9Lg*~$d9)TUgbHD#DjaVl1bjz)zWmjs z&HWj>^b>TsWQLz2UsF8)Nf;=~)j!5w;v7PE2+sH4n>tVoVlhc!B#~A^x6$iJ=njt2>u1}^Y-sTz=C1{n z5CKaeo0c8|YrNZ}t}sv&YeaO{{4@$qJL0*AVd08f0q8YQX{e1#!$=8JGNhQi`?u>i zr;GU6c6amMyJ6vK<)8esfD&n212h34<+XP7a>+e$bwLwH{!5LeQ<3+URil3Yd)sj{ zQh*S5Aa{;TIgXW9?#AY)sjWOltj=?SNtlF{#H&3GEco@BSBc1hZ9CiD@=!OW>8C8~ zdWMC+fAI058^oSZ;)P3+z-h?`cR!e#BmpjxwWq4y%1qCn)IBpWwoaxMqhg=&hgj+uXhv7Fm+? zsq{SrAX;c;Z~0&O76A8NG+u#SG8X9^uO*{~O99Xfi?uJwc)0|KjBlH{(pZD^t7YU8 z*CZ+Am*gR%GGR%Ids66S>wAkL@y;ow*WaYefU6Y$d6}q&fL+M9eZ{|#Onm4^M_ER5 zCFmd9KrtN#a9lTK(&N;|1oQ%FYHF}k+`@-P9DEMXKh%8A(wJ-GRQ85L5Nd9t!`q3WoN~z4CknplHg3U~wV^DUwZTGay%mNL z=xUfrE{KwJSecl0V58W+_S`Czmkn`P+6#`{)a9>20j=Hxci*R(g5FxxNkFUf)RcJC ze)zamY#2{`!_ft#lAI*ptu?KdYU^3T0MpquUMQ}i1_h*pRu7oCZjzGMj0fhnlP9kl zwqz1iyLg8l62+#dYLx>av%Y2ps_cY*Z;N_2peV|vL z5xqLhQ6>1bIsfCXW+0sN2f`6})Fy#Pwg8DBjdxpA5*1TeppJCvrR~%_kTVzo5jS&z zoQfu&)R%B9a6-kS7Lrs&{QCvOzn5ZBS%2u}nlCL*iA1;hzo$#dA0}iTC?T~IgjxF4 zG)O^8b``0@^IO;`DPVY-2-~Sxt#q@~{L60YQW*`G*ZFCWzfYlCN0T*(0Wt^jQq<1P zkicuyc1J(RuVAlyCX9_>8yO=(e6hJ)?&TLcSx#N6QfA#SyfdBb$#D@w)2!YAP0ZXJClJHU$QW%vG8Q+PvYzb{`cm?CE zu`M*b|8E!95vv6)_rlmNmO7y{W4OK=&mfU5lUp_)g`)#bJmPDrRKoAbkQI5_aT(x@g+;~=w(rO z+lLh1N^XQyR8ZBmx)!xR-&&+5KhikN`B(AhJM?2I{nj^CQE4}mfivgBDE9@>f%;~21d*i32&x^iJ)LHXssri(##_jQ>eeZX-v514% zn7x&>^#P-(?GP^mSKBi~WNEU^hCiLX@J>8DK(tP1@KoYqN^FkqFAXr{QX-H`feR`D z>js42h3>&r8*K3};Qj0QZ{i#s5ow5&%p{Q#DZApOEExhswC#1{3=Oj4&8hGc*p9L> z7W$&X1lnx4gOsV!(1a?9SHqq1AZFqOMYVz^e=>QX!T>Jmr_XH?Zf6%vkHpN3#EW;O z@SF}jpZfPu8a|9V0BJS*mAzEU4=xUZ$2dY*C;dKkXuY)w%?NY};$a~8#Gjrkxh$_% z12Sp*;vfl!2p~YJTn~K;WQqjuJ}E#%Zp8B3^y`wc87rdyH==X@uRK!{96$i6gVViq zY?Cy%G0+%--cYYWGV6n)DQl9~2!b1sIA?((m3O);XC9)X@?r>zVN>a0k*wC5?g%eV z+`7deU9Im5xAK?UX5&wuE>ktxh~Y<8Z!HH&5&&GRZ6GOB^hgE(LU{I2dzQPVjKp_w zA$_>e$^Veld3jx-Rph$cDM>Acaji@^Erh24YSNl%*GuXP2v&^f6s!Q~?ux2M6Z@u7 zr}J_o!45c#rZ83W>3D6SrDr_mv0fc2vCO_ zLF!PY$-=m+b4tNfKjMlSX%nk#|-7Nc03FIlY3@C_Uhqa86zrN}hJN|Z4@Q0hx2 z!70F;(HbGEB^IIt@5Vq;<+a9pGjqG1}Q`(?FwsbHj3*0uEQvT~WE9`|=6o0Wo-5_JoYsyN9VYVo5dD0a;7y zamPVPwFA34$JK0o=`QsYFXbXot1^XFN6;Fj`~%KzlL9EW58g^Ac_hwob4IbZMPTWS0>r3?B1J+f ze!r~ECwCo7e2Y6`2b=%{wzYHQ{;`LW#5*hpuG|`ExhnZd1lJ?wS z-F9gk3PJeVd?s-c#CU?&p5N*zbx^EHy3AZoJ?wN;2OM>lLLK;YpNf3fG}~B?-M&|L z;%GMY>i^}203Yi~oS`cD`lkZa`jsl2DLFQNhQ5@f0oOvZN|g&!;77;5wLZDtjq3zU z&T;7BVbXXh+X*=_diQKeTNnVe1IwnJaEnF(3R3wuotCUFmdxaly>>3vr>Qysr>q>m z&ZAF*8&@{mya#L~n=2jC5K5T{0DU>uEG^?@`zw>$nO;gc=r14OTBeDI&J3>A%aba* zqX-#|YJHrHmgPtbV^^G1&o}9u2Do4;m0TlH?35Po{CAYGj+k3D>DrNee#{BWd^J73dj|>J_6`5NwxC zm`xA<;_^lFY(%d#MakUf*xkvU&?~A2GlGV!;AW(E+RkO7X?i)6yt`Pw@M_OP)vQza zJp;FTKnSUm61~R8Ifc^S3MsyTr$3bh(qr313oO>-xx~EycboT#PX^E0APF&~h!3 zj8b9<_>gXTXXU1j4J1)rspGUd#c^TiRcVw+YmgWGQIJMKikAi*9?^5Et8B+SUii%$ ztgv8L4Tnvp;!yQO8e&}1af6AI?P(;vC+@yw0kIE`Ao?T~B@#=F;8G)kt3m_xg1q+( zX?RBM12bAZuw}bzn7!QO!719Rp*wOTSoqyEp@??rU!tVuz=@FGFqbutYBp)og!HgtlDx?-q)*_AK3lbcq^pSHFyc3NV&+rmy7;2{uXSNM|@ zJAKM?#6B(R3f61OSZheO{;`PIfQRUjy<)`j^nvo65!FLT{oA!}Y5z)}jaN&muZBjL zvLwKQ)X1<_F+am1=iok`JSS`eF}!pu)73gX9fJ8dSNIQf0;MMUVBg`I&>kqxYo1=L z%U8c#%?!$5SLb-aL>1au?~rEvt}++^^C0peya;LrkO%4;0<@Mh^A<&i;{GrD6xdv? zG%kk}{GZl=Bvm`#2gFg%>4h; zI)zYR%VxL1cIm$*zk6pcNe9J>TlGb_ZSmlpXgDAG+k+2%b>(O7D0hDO`OZ|PfW7`< zr9%hU2ybqmKaj}A!}aQ&PMES7RMdG|91QcUkojmJOFre7$)U{wDbS}_;VHcvx!%&N z*=~oAt-dCYgz%zEVtTFeMws*ms}ijmx=dY2jJw z5-!o_E_xqCMJ$!p7JWkh5`p*WoD|$~+1;gcqJUc26t@0n`P~w2R`hcLunFsomuvhn zgA51a_5yfJ>yKD<2AgNs%NP-r`E(dif0$UVy7NAE5@}eyxI2zGdVXLhZ=KXb33YbG zO$hrVFbVq6A?IuF*CcA`VOZ5`I`4!~I{)YYsGp@cC&dj?dE%rEnVgC5UuBA!>CnN91zox*^s?kncBJVG zL;pe}&Q%nS?ZmCN`5_M?{r6Pq@(U*hb(UG2>2`4DuV)FR5|#w!)+rAkL?)O!KAq+| zMf_UoRlFBKVpuPijh#PtLwIlYYn8P8N$avZS;4s5h19#|M89FVLG*ABrRcS8d%M_O z9mEkgm$AHKLYl(5)WnFs&HN%bBy%=-_7MJ>)$!~wKK2pBhTL(e58tz-2KnJZotfN& z44V5i$>t>X6PT|fRToQtMF+_PA@XpY zbtA?T%|3BcmtPRH<+HR`i&LHfD>ZEH`@EAG2^U18j4zxXqO-$JU)09VYQ(Zg5Ok+R zH?@arePfMXhVWH_wbyc6f}5Y7R4B$RoMqEDC~d#RaW$H-_^)*jF0DktnHdMcZx)r2LtmFa7=e;($`(F zJB2C|?2>IV$kxViJjiYJSkFG|M!a|rT!l@{tp@~U;ZDbbh4%XPm=t9PZIO> b1%sZ2@BhB;)FtmO_-AQh&CfNTzvce{!|J?0 literal 0 HcmV?d00001 diff --git a/src/qqq/images/logo-blue.png b/src/qqq/images/logo-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ad772a557029f51a37eabe54f8bc7c82ef9b6a34 GIT binary patch literal 61917 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

+