aboutsummaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2022-12-19 12:23:39 -0300
committerSebastian <sebasjm@gmail.com>2022-12-19 12:23:39 -0300
commit72b429321553841ac1ff48cf974bfc65da01bb06 (patch)
tree7db9a4462f02de6cb86de695a1e64772b00ead5f /packages
parent770ab6f01dc81a16f384f314982bd761540f8e65 (diff)
pretty
Diffstat (limited to 'packages')
-rw-r--r--packages/merchant-backoffice-ui/src/AdminRoutes.tsx65
-rw-r--r--packages/merchant-backoffice-ui/src/Application.tsx168
-rw-r--r--packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx7
-rw-r--r--packages/merchant-backoffice-ui/src/InstanceRoutes.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx28
-rw-r--r--packages/merchant-backoffice-ui/src/components/exception/loading.tsx32
-rw-r--r--packages/merchant-backoffice-ui/src/components/exception/login.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/FormProvider.tsx76
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/Input.tsx118
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputArray.tsx156
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx89
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx51
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx82
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputImage.tsx144
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx51
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx44
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx41
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx199
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx56
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx222
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputStock.tsx232
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx119
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx118
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/TextField.tsx64
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/useField.tsx65
-rw-r--r--packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx17
-rw-r--r--packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx99
-rw-r--r--packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx74
-rw-r--r--packages/merchant-backoffice-ui/src/components/modal/index.tsx561
-rw-r--r--packages/merchant-backoffice-ui/src/components/notifications/CreatedSuccessfully.tsx48
-rw-r--r--packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx55
-rw-r--r--packages/merchant-backoffice-ui/src/components/notifications/index.tsx55
-rw-r--r--packages/merchant-backoffice-ui/src/components/picker/DatePicker.tsx315
-rw-r--r--packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx43
-rw-r--r--packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx46
-rw-r--r--packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx98
-rw-r--r--packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx215
-rw-r--r--packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/components/product/ProductList.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/context/backend.ts81
-rw-r--r--packages/merchant-backoffice-ui/src/context/config.ts14
-rw-r--r--packages/merchant-backoffice-ui/src/context/instance.ts16
-rw-r--r--packages/merchant-backoffice-ui/src/context/listener.ts16
-rw-r--r--packages/merchant-backoffice-ui/src/context/translation.ts47
-rw-r--r--packages/merchant-backoffice-ui/src/custom.d.ts8
-rw-r--r--packages/merchant-backoffice-ui/src/declaration.d.ts2338
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/async.ts41
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/backend.ts21
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/index.ts114
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/instance.ts22
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/listener.ts42
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/notifications.ts38
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/order.ts76
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/product.ts39
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/reserves.ts34
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/transfer.ts69
-rw-r--r--packages/merchant-backoffice-ui/src/i18n/index.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/i18n/strings.ts4603
-rw-r--r--packages/merchant-backoffice-ui/src/index.html12
-rw-r--r--packages/merchant-backoffice-ui/src/index.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/manifest.json2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx31
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx85
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx278
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx104
-rw-r--r--packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx114
-rw-r--r--packages/merchant-backoffice-ui/src/paths/index.stories.ts2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx84
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx68
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx20
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx123
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx89
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx6
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx69
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx256
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx10
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx258
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx29
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx71
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx73
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx57
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx59
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx14
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx112
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx54
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx92
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx78
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx29
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx296
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx40
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx112
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx7
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx107
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx4
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx28
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx148
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx67
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx135
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx100
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/transfers/update/index.tsx14
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx2
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx8
-rw-r--r--packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx10
-rw-r--r--packages/merchant-backoffice-ui/src/paths/login/index.tsx12
-rw-r--r--packages/merchant-backoffice-ui/src/paths/notfound/index.tsx25
-rw-r--r--packages/merchant-backoffice-ui/src/schemas/index.ts258
-rw-r--r--packages/merchant-backoffice-ui/src/scss/DurationPicker.scss1
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_aside.scss30
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_card.scss4
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_custom-calendar.scss83
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_footer.scss2
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_form.scss33
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_hero-bar.scss8
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_main-section.scss2
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_mixins.scss6
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_modal.scss2
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_nav-bar.scss16
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_table.scss28
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_tiles.scss3
-rw-r--r--packages/merchant-backoffice-ui/src/scss/_title-bar.scss8
-rw-r--r--packages/merchant-backoffice-ui/src/scss/fonts/nunito.css4
-rw-r--r--packages/merchant-backoffice-ui/src/scss/icons/materialdesignicons-4.9.95.min.css15108
-rw-r--r--packages/merchant-backoffice-ui/src/scss/libs/_all.scss2
-rw-r--r--packages/merchant-backoffice-ui/src/sw.js2
-rw-r--r--packages/merchant-backoffice-ui/src/utils/amount.ts56
-rw-r--r--packages/merchant-backoffice-ui/src/utils/constants.ts33
-rw-r--r--packages/merchant-backoffice-ui/src/utils/switchableAxios.ts47
-rw-r--r--packages/merchant-backoffice-ui/src/utils/table.ts36
142 files changed, 22720 insertions, 7970 deletions
diff --git a/packages/merchant-backoffice-ui/src/AdminRoutes.tsx b/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
index d3eb8a5b9..7f86d92ab 100644
--- a/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
@@ -16,43 +16,38 @@
import { h, VNode } from "preact";
import Router, { route, Route } from "preact-router";
import InstanceCreatePage from "./paths/admin/create/index.js";
-import InstanceListPage from './paths/admin/list/index.js';
-
+import InstanceListPage from "./paths/admin/list/index.js";
export enum AdminPaths {
- list_instances = '/instances',
- new_instance = '/instance/new',
+ list_instances = "/instances",
+ new_instance = "/instance/new",
}
export function AdminRoutes(): VNode {
-
- return <Router>
-
- <Route path={AdminPaths.list_instances} component={InstanceListPage}
-
- onCreate={() => {
- route(AdminPaths.new_instance);
- }}
-
- onUpdate={(id: string): void => {
- route(`/instance/${id}/update`);
- }}
-
- />
-
- <Route path={AdminPaths.new_instance} component={InstanceCreatePage}
-
- onBack={() => route(AdminPaths.list_instances)}
-
- onConfirm={() => {
- // route(AdminPaths.list_instances);
- }}
-
- // onError={(error: any) => {
- // }}
-
- />
-
-
- </Router>
-} \ No newline at end of file
+ return (
+ <Router>
+ <Route
+ path={AdminPaths.list_instances}
+ component={InstanceListPage}
+ onCreate={() => {
+ route(AdminPaths.new_instance);
+ }}
+ onUpdate={(id: string): void => {
+ route(`/instance/${id}/update`);
+ }}
+ />
+
+ <Route
+ path={AdminPaths.new_instance}
+ component={InstanceCreatePage}
+ onBack={() => route(AdminPaths.list_instances)}
+ onConfirm={() => {
+ // route(AdminPaths.list_instances);
+ }}
+
+ // onError={(error: any) => {
+ // }}
+ />
+ </Router>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/Application.tsx b/packages/merchant-backoffice-ui/src/Application.tsx
index 4aa0f7891..0b92375c1 100644
--- a/packages/merchant-backoffice-ui/src/Application.tsx
+++ b/packages/merchant-backoffice-ui/src/Application.tsx
@@ -15,95 +15,125 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
-import { route } from 'preact-router';
+import { h, VNode } from "preact";
+import { route } from "preact-router";
import { useMemo } from "preact/hooks";
import { ApplicationReadyRoutes } from "./ApplicationReadyRoutes.js";
import { Loading } from "./components/exception/loading.js";
-import { NotificationCard, NotYetReadyAppMenu } from "./components/menu/index.js";
-import { BackendContextProvider, useBackendContext } from './context/backend.js';
-import { ConfigContextProvider } from './context/config.js';
-import { TranslationProvider } from './context/translation.js';
+import {
+ NotificationCard,
+ NotYetReadyAppMenu,
+} from "./components/menu/index.js";
+import {
+ BackendContextProvider,
+ useBackendContext,
+} from "./context/backend.js";
+import { ConfigContextProvider } from "./context/config.js";
+import { TranslationProvider } from "./context/translation.js";
import { useBackendConfig } from "./hooks/backend.js";
-import { useTranslator } from './i18n/index.js';
-import LoginPage from './paths/login/index.js';
+import { useTranslator } from "./i18n/index.js";
+import LoginPage from "./paths/login/index.js";
export function Application(): VNode {
return (
// <FetchContextProvider>
- <BackendContextProvider>
- <TranslationProvider>
- <ApplicationStatusRoutes />
- </TranslationProvider>
- </BackendContextProvider>
+ <BackendContextProvider>
+ <TranslationProvider>
+ <ApplicationStatusRoutes />
+ </TranslationProvider>
+ </BackendContextProvider>
// </FetchContextProvider>
);
}
function ApplicationStatusRoutes(): VNode {
- const { updateLoginStatus, triedToLog } = useBackendContext()
+ const { updateLoginStatus, triedToLog } = useBackendContext();
const result = useBackendConfig();
- const i18n = useTranslator()
+ const i18n = useTranslator();
const updateLoginInfoAndGoToRoot = (url: string, token?: string) => {
- updateLoginStatus(url, token)
- route('/')
- }
+ updateLoginStatus(url, token);
+ route("/");
+ };
- const { currency, version } = result.ok ? result.data : { currency: 'unknown', version: 'unknown' }
- const ctx = useMemo(() => ({ currency, version }), [currency, version])
+ const { currency, version } = result.ok
+ ? result.data
+ : { currency: "unknown", version: "unknown" };
+ const ctx = useMemo(() => ({ currency, version }), [currency, version]);
if (!triedToLog) {
- return <div id="app">
- <NotYetReadyAppMenu title="Welcome!" />
- <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
- </div>
+ return (
+ <div id="app">
+ <NotYetReadyAppMenu title="Welcome!" />
+ <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
+ </div>
+ );
}
- if (result.clientError && result.isUnauthorized) return <div id="app">
- <NotYetReadyAppMenu title="Login" />
- <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
- </div>
-
- if (result.clientError && result.isNotfound) return <div id="app">
- <NotYetReadyAppMenu title="Error" />
- <NotificationCard notification={{
- message: i18n`Server not found`,
- type: 'ERROR',
- description: `Check your url`,
- }} />
- <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
- </div>
-
- if (result.serverError) return <div id="app">
- <NotYetReadyAppMenu title="Error" />
- <NotificationCard notification={{
- message: i18n`Couldn't access the server`,
- type: 'ERROR',
- description: i18n`Got message ${result.message} from ${result.info?.url}`,
- }} />
- <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
- </div>
-
- if (result.loading) return <Loading />
-
- if (!result.ok) return <div id="app">
- <NotYetReadyAppMenu title="Error" />
- <NotificationCard notification={{
- message: i18n`Unexpected Error`,
- type: 'ERROR',
- description: i18n`Got message ${result.message} from ${result.info?.url}`,
- }} />
- <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
- </div>
-
- return <div id="app" class="has-navbar-fixed-top">
- <ConfigContextProvider value={ctx}>
- <ApplicationReadyRoutes />
- </ConfigContextProvider>
- </div>
+ if (result.clientError && result.isUnauthorized)
+ return (
+ <div id="app">
+ <NotYetReadyAppMenu title="Login" />
+ <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
+ </div>
+ );
+
+ if (result.clientError && result.isNotfound)
+ return (
+ <div id="app">
+ <NotYetReadyAppMenu title="Error" />
+ <NotificationCard
+ notification={{
+ message: i18n`Server not found`,
+ type: "ERROR",
+ description: `Check your url`,
+ }}
+ />
+ <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
+ </div>
+ );
+
+ if (result.serverError)
+ return (
+ <div id="app">
+ <NotYetReadyAppMenu title="Error" />
+ <NotificationCard
+ notification={{
+ message: i18n`Couldn't access the server`,
+ type: "ERROR",
+ description: i18n`Got message ${result.message} from ${result.info?.url}`,
+ }}
+ />
+ <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
+ </div>
+ );
+
+ if (result.loading) return <Loading />;
+
+ if (!result.ok)
+ return (
+ <div id="app">
+ <NotYetReadyAppMenu title="Error" />
+ <NotificationCard
+ notification={{
+ message: i18n`Unexpected Error`,
+ type: "ERROR",
+ description: i18n`Got message ${result.message} from ${result.info?.url}`,
+ }}
+ />
+ <LoginPage onConfirm={updateLoginInfoAndGoToRoot} />
+ </div>
+ );
+
+ return (
+ <div id="app" class="has-navbar-fixed-top">
+ <ConfigContextProvider value={ctx}>
+ <ApplicationReadyRoutes />
+ </ConfigContextProvider>
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
index 78cbd505b..fe4493bff 100644
--- a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
@@ -25,7 +25,10 @@ import { useBackendInstancesTestForAdmin } from "./hooks/backend.js";
import { InstanceRoutes } from "./InstanceRoutes.js";
import LoginPage from "./paths/login/index.js";
import { INSTANCE_ID_LOOKUP } from "./utils/constants.js";
-import { NotYetReadyAppMenu, NotificationCard } from "./components/menu/index.js";
+import {
+ NotYetReadyAppMenu,
+ NotificationCard,
+} from "./components/menu/index.js";
import { useTranslator } from "./i18n/index.js";
import { createHashHistory } from "history";
import { useState } from "preact/hooks";
@@ -107,7 +110,7 @@ export function ApplicationReadyRoutes(): VNode {
function DefaultMainRoute({ instance, admin, instanceNameByBackendURL }: any) {
const [instanceName, setInstanceName] = useState(
- instanceNameByBackendURL || instance || "default"
+ instanceNameByBackendURL || instance || "default",
);
return (
diff --git a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
index eef8e68ac..adfc73e20 100644
--- a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
@@ -131,7 +131,7 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode {
const value = useMemo(
() => ({ id, token, admin, changeToken }),
- [id, token, admin]
+ [id, token, admin],
);
function ServerErrorRedirectTo(to: InstancePaths | AdminPaths) {
@@ -451,7 +451,7 @@ function AdminInstanceUpdatePage({
};
const value = useMemo(
() => ({ id, token, admin: true, changeToken }),
- [id, token]
+ [id, token],
);
const i18n = useTranslator();
diff --git a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
index b234ce847..510bc29b8 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h } from "preact";
import { LoadingModal } from "../modal/index.js";
@@ -25,10 +25,10 @@ import { useAsync } from "../../hooks/async.js";
import { Translate } from "../../i18n/index.js";
type Props = {
- children: ComponentChildren,
+ children: ComponentChildren;
disabled: boolean;
onClick?: () => Promise<void>;
- [rest:string]: any,
+ [rest: string]: any;
};
export function AsyncButton({ onClick, disabled, children, ...rest }: Props) {
@@ -38,12 +38,18 @@ export function AsyncButton({ onClick, disabled, children, ...rest }: Props) {
return <LoadingModal onCancel={cancel} />;
}
if (isLoading) {
- return <button class="button"><Translate>Loading...</Translate></button>;
+ return (
+ <button class="button">
+ <Translate>Loading...</Translate>
+ </button>
+ );
}
- return <span {...rest}>
- <button class="button is-success" onClick={request} disabled={disabled}>
- {children}
- </button>
- </span>;
+ return (
+ <span {...rest}>
+ <button class="button is-success" onClick={request} disabled={disabled}>
+ {children}
+ </button>
+ </span>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/exception/loading.tsx b/packages/merchant-backoffice-ui/src/components/exception/loading.tsx
index 9c9b4daae..a043b81eb 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/loading.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/loading.tsx
@@ -15,18 +15,34 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
export function Loading(): VNode {
- return <div class="columns is-centered is-vcentered" style={{ height: 'calc(100% - 3rem)', position: 'absolute', width: '100%' }}>
- <Spinner />
- </div>
+ return (
+ <div
+ class="columns is-centered is-vcentered"
+ style={{
+ height: "calc(100% - 3rem)",
+ position: "absolute",
+ width: "100%",
+ }}
+ >
+ <Spinner />
+ </div>
+ );
}
export function Spinner(): VNode {
- return <div class="lds-ring"><div /><div /><div /><div /></div>
-} \ No newline at end of file
+ return (
+ <div class="lds-ring">
+ <div />
+ <div />
+ <div />
+ <div />
+ </div>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
index c2af2a83a..d1898915d 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
@@ -46,7 +46,7 @@ export function LoginModal({ onConfirm, withMessage }: Props): VNode {
const { url: backendUrl, token: baseToken } = useBackendContext();
const { admin, token: instanceToken } = useInstanceContext();
const currentToken = getTokenValuePart(
- !admin ? baseToken : instanceToken || ""
+ !admin ? baseToken : instanceToken || "",
);
const [token, setToken] = useState(currentToken);
diff --git a/packages/merchant-backoffice-ui/src/components/form/FormProvider.tsx b/packages/merchant-backoffice-ui/src/components/form/FormProvider.tsx
index ab32b6bed..7bcebd706 100644
--- a/packages/merchant-backoffice-ui/src/components/form/FormProvider.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/FormProvider.tsx
@@ -15,37 +15,59 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, createContext, h, VNode } from "preact";
import { useContext, useMemo } from "preact/hooks";
-type Updater<S> = (value: ((prevState: S) => S) ) => void;
+type Updater<S> = (value: (prevState: S) => S) => void;
export interface Props<T> {
object?: Partial<T>;
errors?: FormErrors<T>;
name?: string;
valueHandler: Updater<Partial<T>> | null;
- children: ComponentChildren
+ children: ComponentChildren;
}
-const noUpdater: Updater<Partial<unknown>> = () => (s: unknown) => s
+const noUpdater: Updater<Partial<unknown>> = () => (s: unknown) => s;
-export function FormProvider<T>({ object = {}, errors = {}, name = '', valueHandler, children }: Props<T>): VNode {
+export function FormProvider<T>({
+ object = {},
+ errors = {},
+ name = "",
+ valueHandler,
+ children,
+}: Props<T>): VNode {
const initialObject = useMemo(() => object, []);
- const value = useMemo<FormType<T>>(() => ({ errors, object, initialObject, valueHandler: valueHandler ? valueHandler : noUpdater, name, toStr: {}, fromStr: {} }), [errors, object, valueHandler]);
-
- return <FormContext.Provider value={value}>
- <form class="field" onSubmit={(e) => {
- e.preventDefault();
- // if (valueHandler) valueHandler(object);
- }}>
- {children}
- </form>
- </FormContext.Provider>;
+ const value = useMemo<FormType<T>>(
+ () => ({
+ errors,
+ object,
+ initialObject,
+ valueHandler: valueHandler ? valueHandler : noUpdater,
+ name,
+ toStr: {},
+ fromStr: {},
+ }),
+ [errors, object, valueHandler],
+ );
+
+ return (
+ <FormContext.Provider value={value}>
+ <form
+ class="field"
+ onSubmit={(e) => {
+ e.preventDefault();
+ // if (valueHandler) valueHandler(object);
+ }}
+ >
+ {children}
+ </form>
+ </FormContext.Provider>
+ );
}
export interface FormType<T> {
@@ -58,24 +80,24 @@ export interface FormType<T> {
valueHandler: Updater<Partial<T>>;
}
-const FormContext = createContext<FormType<unknown>>(null!)
+const FormContext = createContext<FormType<unknown>>(null!);
export function useFormContext<T>() {
- return useContext<FormType<T>>(FormContext)
+ return useContext<FormType<T>>(FormContext);
}
export type FormErrors<T> = {
- [P in keyof T]?: string | FormErrors<T[P]>
-}
+ [P in keyof T]?: string | FormErrors<T[P]>;
+};
export type FormtoStr<T> = {
- [P in keyof T]?: ((f?: T[P]) => string)
-}
+ [P in keyof T]?: (f?: T[P]) => string;
+};
export type FormfromStr<T> = {
- [P in keyof T]?: ((f: string) => T[P])
-}
+ [P in keyof T]?: (f: string) => T[P];
+};
export type FormUpdater<T> = {
- [P in keyof T]?: (f: keyof T) => (v: T[P]) => void
-}
+ [P in keyof T]?: (f: keyof T) => (v: T[P]) => void;
+};
diff --git a/packages/merchant-backoffice-ui/src/components/form/Input.tsx b/packages/merchant-backoffice-ui/src/components/form/Input.tsx
index 793477f3d..54140ba4d 100644
--- a/packages/merchant-backoffice-ui/src/components/form/Input.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/Input.tsx
@@ -15,57 +15,101 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { useField, InputProps } from "./useField.js";
interface Props<T> extends InputProps<T> {
- inputType?: 'text' | 'number' | 'multiline' | 'password';
+ inputType?: "text" | "number" | "multiline" | "password";
expand?: boolean;
toStr?: (v?: any) => string;
fromStr?: (s: string) => any;
- inputExtra?: any,
+ inputExtra?: any;
side?: ComponentChildren;
children?: ComponentChildren;
}
-const defaultToString = (f?: any): string => f || ''
-const defaultFromString = (v: string): any => v as any
+const defaultToString = (f?: any): string => f || "";
+const defaultFromString = (v: string): any => v as any;
-const TextInput = ({ inputType, error, ...rest }: any) => inputType === 'multiline' ?
- <textarea {...rest} class={error ? "textarea is-danger" : "textarea"} rows="3" /> :
- <input {...rest} class={error ? "input is-danger" : "input"} type={inputType} />;
+const TextInput = ({ inputType, error, ...rest }: any) =>
+ inputType === "multiline" ? (
+ <textarea
+ {...rest}
+ class={error ? "textarea is-danger" : "textarea"}
+ rows="3"
+ />
+ ) : (
+ <input
+ {...rest}
+ class={error ? "input is-danger" : "input"}
+ type={inputType}
+ />
+ );
-export function Input<T>({ name, readonly, placeholder, tooltip, label, expand, help, children, inputType, inputExtra, side, fromStr = defaultFromString, toStr = defaultToString }: Props<keyof T>): VNode {
+export function Input<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ expand,
+ help,
+ children,
+ inputType,
+ inputExtra,
+ side,
+ fromStr = defaultFromString,
+ toStr = defaultToString,
+}: Props<keyof T>): VNode {
const { error, value, onChange, required } = useField<T>(name);
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class={expand ? "control is-expanded has-icons-right" : "control has-icons-right"}>
- <TextInput error={error} {...inputExtra}
- inputType={inputType}
- placeholder={placeholder} readonly={readonly}
- name={String(name)} value={toStr(value)}
- onChange={(e: h.JSX.TargetedEvent<HTMLInputElement>): void => onChange(fromStr(e.currentTarget.value))} />
- {help}
- {children}
- { required && <span class="icon has-text-danger is-right">
- <i class="mdi mdi-alert" />
- </span> }
- </p>
- {error && <p class="help is-danger">{error}</p>}
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p
+ class={
+ expand
+ ? "control is-expanded has-icons-right"
+ : "control has-icons-right"
+ }
+ >
+ <TextInput
+ error={error}
+ {...inputExtra}
+ inputType={inputType}
+ placeholder={placeholder}
+ readonly={readonly}
+ name={String(name)}
+ value={toStr(value)}
+ onChange={(e: h.JSX.TargetedEvent<HTMLInputElement>): void =>
+ onChange(fromStr(e.currentTarget.value))
+ }
+ />
+ {help}
+ {children}
+ {required && (
+ <span class="icon has-text-danger is-right">
+ <i class="mdi mdi-alert" />
+ </span>
+ )}
+ </p>
+ {error && <p class="help is-danger">{error}</p>}
+ </div>
+ {side}
</div>
- {side}
</div>
- </div>;
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx b/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
index f8bf6437d..b5da1117a 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { Translate, useTranslator } from "../../i18n/index.js";
@@ -30,68 +30,110 @@ export interface Props<T> extends InputProps<T> {
fromStr?: (s: string) => any;
}
-const defaultToString = (f?: any): string => f || ''
-const defaultFromString = (v: string): any => v as any
+const defaultToString = (f?: any): string => f || "";
+const defaultFromString = (v: string): any => v as any;
-export function InputArray<T>({ name, readonly, placeholder, tooltip, label, help, addonBefore, isValid = () => true, fromStr = defaultFromString, toStr = defaultToString }: Props<keyof T>): VNode {
+export function InputArray<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+ addonBefore,
+ isValid = () => true,
+ fromStr = defaultFromString,
+ toStr = defaultToString,
+}: Props<keyof T>): VNode {
const { error: formError, value, onChange, required } = useField<T>(name);
- const [localError, setLocalError] = useState<string | null>(null)
+ const [localError, setLocalError] = useState<string | null>(null);
- const error = localError || formError
+ const error = localError || formError;
const array: any[] = (value ? value! : []) as any;
- const [currentValue, setCurrentValue] = useState('');
+ const [currentValue, setCurrentValue] = useState("");
const i18n = useTranslator();
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <div class="field has-addons">
- {addonBefore && <div class="control">
- <a class="button is-static">{addonBefore}</a>
- </div>}
- <p class="control is-expanded has-icons-right">
- <input class={error ? "input is-danger" : "input"} type="text"
- placeholder={placeholder} readonly={readonly} disabled={readonly}
- name={String(name)} value={currentValue}
- onChange={(e): void => setCurrentValue(e.currentTarget.value)} />
- {required && <span class="icon has-text-danger is-right">
- <i class="mdi mdi-alert" />
- </span>}
- </p>
- <p class="control">
- <button class="button is-info has-tooltip-left" disabled={!currentValue} onClick={(): void => {
- const v = fromStr(currentValue)
- if (!isValid(v)) {
- setLocalError(i18n`The value ${v} is invalid for a payment url`)
- return;
- }
- setLocalError(null)
- onChange([v, ...array] as any);
- setCurrentValue('');
- }} data-tooltip={i18n`add element to the list`}><Translate>add</Translate></button>
- </p>
- </div>
- {help}
- {error && <p class="help is-danger"> {error} </p>}
- {array.map((v, i) => <div key={i} class="tags has-addons mt-3 mb-0">
- <span class="tag is-medium is-info mb-0" style={{ maxWidth: '90%' }}>{v}</span>
- <a class="tag is-medium is-danger is-delete mb-0" onClick={() => {
- onChange(array.filter(f => f !== v) as any);
- setCurrentValue(toStr(v));
- }} />
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <div class="field has-addons">
+ {addonBefore && (
+ <div class="control">
+ <a class="button is-static">{addonBefore}</a>
+ </div>
+ )}
+ <p class="control is-expanded has-icons-right">
+ <input
+ class={error ? "input is-danger" : "input"}
+ type="text"
+ placeholder={placeholder}
+ readonly={readonly}
+ disabled={readonly}
+ name={String(name)}
+ value={currentValue}
+ onChange={(e): void => setCurrentValue(e.currentTarget.value)}
+ />
+ {required && (
+ <span class="icon has-text-danger is-right">
+ <i class="mdi mdi-alert" />
+ </span>
+ )}
+ </p>
+ <p class="control">
+ <button
+ class="button is-info has-tooltip-left"
+ disabled={!currentValue}
+ onClick={(): void => {
+ const v = fromStr(currentValue);
+ if (!isValid(v)) {
+ setLocalError(
+ i18n`The value ${v} is invalid for a payment url`,
+ );
+ return;
+ }
+ setLocalError(null);
+ onChange([v, ...array] as any);
+ setCurrentValue("");
+ }}
+ data-tooltip={i18n`add element to the list`}
+ >
+ <Translate>add</Translate>
+ </button>
+ </p>
+ </div>
+ {help}
+ {error && <p class="help is-danger"> {error} </p>}
+ {array.map((v, i) => (
+ <div key={i} class="tags has-addons mt-3 mb-0">
+ <span
+ class="tag is-medium is-info mb-0"
+ style={{ maxWidth: "90%" }}
+ >
+ {v}
+ </span>
+ <a
+ class="tag is-medium is-danger is-delete mb-0"
+ onClick={() => {
+ onChange(array.filter((f) => f !== v) as any);
+ setCurrentValue(toStr(v));
+ }}
+ />
+ </div>
+ ))}
</div>
- )}
</div>
-
</div>
- </div>;
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx b/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
index 4c40cacf6..f79e16c07 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { InputProps, useField } from "./useField.js";
@@ -30,43 +30,62 @@ interface Props<T> extends InputProps<T> {
fromBoolean?: (s: boolean | undefined) => any;
}
-const defaultToBoolean = (f?: any): boolean | undefined => f || ''
-const defaultFromBoolean = (v: boolean | undefined): any => v as any
-
+const defaultToBoolean = (f?: any): boolean | undefined => f || "";
+const defaultFromBoolean = (v: boolean | undefined): any => v as any;
-export function InputBoolean<T>({ name, readonly, placeholder, tooltip, label, help, threeState, expand, fromBoolean = defaultFromBoolean, toBoolean = defaultToBoolean }: Props<keyof T>): VNode {
+export function InputBoolean<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+ threeState,
+ expand,
+ fromBoolean = defaultFromBoolean,
+ toBoolean = defaultToBoolean,
+}: Props<keyof T>): VNode {
const { error, value, onChange } = useField<T>(name);
const onCheckboxClick = (): void => {
- const c = toBoolean(value)
- if (c === false && threeState) return onChange(undefined as any)
- return onChange(fromBoolean(!c))
- }
+ const c = toBoolean(value);
+ if (c === false && threeState) return onChange(undefined as any);
+ return onChange(fromBoolean(!c));
+ };
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class={expand ? "control is-expanded" : "control"}>
- <label class="b-checkbox checkbox">
- <input type="checkbox" class={toBoolean(value) === undefined ? "is-indeterminate" : ""}
- checked={toBoolean(value)}
- placeholder={placeholder} readonly={readonly}
- name={String(name)} disabled={readonly}
- onChange={onCheckboxClick} />
- <span class="check" />
- </label>
- {help}
- </p>
- {error && <p class="help is-danger">{error}</p>}
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class={expand ? "control is-expanded" : "control"}>
+ <label class="b-checkbox checkbox">
+ <input
+ type="checkbox"
+ class={toBoolean(value) === undefined ? "is-indeterminate" : ""}
+ checked={toBoolean(value)}
+ placeholder={placeholder}
+ readonly={readonly}
+ name={String(name)}
+ disabled={readonly}
+ onChange={onCheckboxClick}
+ />
+ <span class="check" />
+ </label>
+ {help}
+ </p>
+ {error && <p class="help is-danger">{error}</p>}
+ </div>
</div>
</div>
- </div>;
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
index 6191d7ba5..57a5163b7 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h } from "preact";
import { useConfigContext } from "../../context/config.js";
import { Amount } from "../../declaration.js";
@@ -31,17 +31,36 @@ export interface Props<T> extends InputProps<T> {
side?: ComponentChildren;
}
-export function InputCurrency<T>({ name, readonly, label, placeholder, help, tooltip, expand, addonAfter, children, side }: Props<keyof T>) {
- const config = useConfigContext()
- return <InputWithAddon<T> name={name} readonly={readonly} addonBefore={config.currency}
- side={side}
- label={label} placeholder={placeholder} help={help} tooltip={tooltip}
- addonAfter={addonAfter}
- inputType='number' expand={expand}
- toStr={(v?: Amount) => v?.split(':')[1] || ''}
- fromStr={(v: string) => !v ? '' : `${config.currency}:${v}`}
- inputExtra={{ min: 0 }}
- children={children}
- />
+export function InputCurrency<T>({
+ name,
+ readonly,
+ label,
+ placeholder,
+ help,
+ tooltip,
+ expand,
+ addonAfter,
+ children,
+ side,
+}: Props<keyof T>) {
+ const config = useConfigContext();
+ return (
+ <InputWithAddon<T>
+ name={name}
+ readonly={readonly}
+ addonBefore={config.currency}
+ side={side}
+ label={label}
+ placeholder={placeholder}
+ help={help}
+ tooltip={tooltip}
+ addonAfter={addonAfter}
+ inputType="number"
+ expand={expand}
+ toStr={(v?: Amount) => v?.split(":")[1] || ""}
+ fromStr={(v: string) => (!v ? "" : `${config.currency}:${v}`)}
+ inputExtra={{ min: 0 }}
+ children={children}
+ />
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx b/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
index dd21a4708..658cc4db7 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
@@ -81,7 +81,7 @@ export function InputDuration<T>({
era: () => "e",
},
},
- }
+ },
);
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx b/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
index 26d0292d6..b5e0bd52b 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { useGroupField } from "./useGroupField.js";
@@ -32,35 +32,55 @@ export interface Props<T> {
initialActive?: boolean;
}
-export function InputGroup<T>({ name, label, children, tooltip, alternative, fixed, initialActive }: Props<keyof T>): VNode {
+export function InputGroup<T>({
+ name,
+ label,
+ children,
+ tooltip,
+ alternative,
+ fixed,
+ initialActive,
+}: Props<keyof T>): VNode {
const [active, setActive] = useState(initialActive || fixed);
const group = useGroupField<T>(name);
- return <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- {group?.hasError && <span class="icon has-text-danger" data-tooltip={tooltip}>
- <i class="mdi mdi-alert" />
- </span>}
- </p>
- { !fixed && <button class="card-header-icon" aria-label="more options" onClick={(): void => setActive(!active)}>
- <span class="icon">
- {active ?
- <i class="mdi mdi-arrow-up" /> :
- <i class="mdi mdi-arrow-down" />}
- </span>
- </button> }
- </header>
- {active ? <div class="card-content">
- {children}
- </div> : (
- alternative ? <div class="card-content">
- {alternative}
- </div> : undefined
- )}
- </div>;
+ return (
+ <div class="card">
+ <header class="card-header">
+ <p class="card-header-title">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ {group?.hasError && (
+ <span class="icon has-text-danger" data-tooltip={tooltip}>
+ <i class="mdi mdi-alert" />
+ </span>
+ )}
+ </p>
+ {!fixed && (
+ <button
+ class="card-header-icon"
+ aria-label="more options"
+ onClick={(): void => setActive(!active)}
+ >
+ <span class="icon">
+ {active ? (
+ <i class="mdi mdi-arrow-up" />
+ ) : (
+ <i class="mdi mdi-arrow-down" />
+ )}
+ </span>
+ </button>
+ )}
+ </header>
+ {active ? (
+ <div class="card-content">{children}</div>
+ ) : alternative ? (
+ <div class="card-content">{alternative}</div>
+ ) : undefined}
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx b/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
index 51ac23ca1..d5b2aadb6 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { useRef, useState } from "preact/hooks";
import { Translate } from "../../i18n/index.js";
@@ -30,65 +30,93 @@ export interface Props<T> extends InputProps<T> {
children?: ComponentChildren;
}
-export function InputImage<T>({ name, readonly, placeholder, tooltip, label, help, children, expand }: Props<keyof T>): VNode {
+export function InputImage<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+ children,
+ expand,
+}: Props<keyof T>): VNode {
const { error, value, onChange } = useField<T>(name);
- const image = useRef<HTMLInputElement>(null)
+ const image = useRef<HTMLInputElement>(null);
- const [sizeError, setSizeError] = useState(false)
+ const [sizeError, setSizeError] = useState(false);
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class={expand ? "control is-expanded" : "control"}>
- {value &&
- <img src={value} style={{ width: 200, height: 200 }} onClick={() => image.current?.click()} />
- }
- <input
- ref={image} style={{ display: 'none' }}
- type="file" name={String(name)}
- placeholder={placeholder} readonly={readonly}
- onChange={e => {
- const f: FileList | null = e.currentTarget.files
- if (!f || f.length != 1) {
- return onChange(undefined!)
- }
- if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
- setSizeError(true)
- return onChange(undefined!)
- }
- setSizeError(false)
- return f[0].arrayBuffer().then(b => {
- const b64 = btoa(
- new Uint8Array(b)
- .reduce((data, byte) => data + String.fromCharCode(byte), '')
- )
- return onChange(`data:${f[0].type};base64,${b64}` as any)
- })
- }} />
- {help}
- {children}
- </p>
- {error && <p class="help is-danger">{error}</p>}
- {sizeError && <p class="help is-danger">
- <Translate>Image should be smaller than 1 MB</Translate>
- </p>}
- {!value &&
- <button class="button" onClick={() => image.current?.click()} ><Translate>Add</Translate></button>
- }
- {value &&
- <button class="button" onClick={() => onChange(undefined!)} ><Translate>Remove</Translate></button>
- }
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class={expand ? "control is-expanded" : "control"}>
+ {value && (
+ <img
+ src={value}
+ style={{ width: 200, height: 200 }}
+ onClick={() => image.current?.click()}
+ />
+ )}
+ <input
+ ref={image}
+ style={{ display: "none" }}
+ type="file"
+ name={String(name)}
+ placeholder={placeholder}
+ readonly={readonly}
+ onChange={(e) => {
+ const f: FileList | null = e.currentTarget.files;
+ if (!f || f.length != 1) {
+ return onChange(undefined!);
+ }
+ if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
+ setSizeError(true);
+ return onChange(undefined!);
+ }
+ setSizeError(false);
+ return f[0].arrayBuffer().then((b) => {
+ const b64 = btoa(
+ new Uint8Array(b).reduce(
+ (data, byte) => data + String.fromCharCode(byte),
+ "",
+ ),
+ );
+ return onChange(`data:${f[0].type};base64,${b64}` as any);
+ });
+ }}
+ />
+ {help}
+ {children}
+ </p>
+ {error && <p class="help is-danger">{error}</p>}
+ {sizeError && (
+ <p class="help is-danger">
+ <Translate>Image should be smaller than 1 MB</Translate>
+ </p>
+ )}
+ {!value && (
+ <button class="button" onClick={() => image.current?.click()}>
+ <Translate>Add</Translate>
+ </button>
+ )}
+ {value && (
+ <button class="button" onClick={() => onChange(undefined!)}>
+ <Translate>Remove</Translate>
+ </button>
+ )}
+ </div>
</div>
</div>
- </div>
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx b/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
index c97fe928b..613b2f1e6 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
@@ -15,29 +15,36 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { Fragment, h } from "preact";
import { useTranslator } from "../../i18n/index.js";
import { Input } from "./Input.js";
-export function InputLocation({name}:{name:string}) {
- const i18n = useTranslator()
- return <>
- <Input name={`${name}.country`} label={i18n`Country`} />
- <Input name={`${name}.address_lines`} inputType="multiline"
- label={i18n`Address`}
- toStr={(v: string[] | undefined) => !v ? '' : v.join('\n')}
- fromStr={(v: string) => v.split('\n')}
- />
- <Input name={`${name}.building_number`} label={i18n`Building number`} />
- <Input name={`${name}.building_name`} label={i18n`Building name`} />
- <Input name={`${name}.street`} label={i18n`Street`} />
- <Input name={`${name}.post_code`} label={i18n`Post code`} />
- <Input name={`${name}.town_location`} label={i18n`Town location`} />
- <Input name={`${name}.town`} label={i18n`Town`} />
- <Input name={`${name}.district`} label={i18n`District`} />
- <Input name={`${name}.country_subdivision`} label={i18n`Country subdivision`} />
- </>
-} \ No newline at end of file
+export function InputLocation({ name }: { name: string }) {
+ const i18n = useTranslator();
+ return (
+ <>
+ <Input name={`${name}.country`} label={i18n`Country`} />
+ <Input
+ name={`${name}.address_lines`}
+ inputType="multiline"
+ label={i18n`Address`}
+ toStr={(v: string[] | undefined) => (!v ? "" : v.join("\n"))}
+ fromStr={(v: string) => v.split("\n")}
+ />
+ <Input name={`${name}.building_number`} label={i18n`Building number`} />
+ <Input name={`${name}.building_name`} label={i18n`Building name`} />
+ <Input name={`${name}.street`} label={i18n`Street`} />
+ <Input name={`${name}.post_code`} label={i18n`Post code`} />
+ <Input name={`${name}.town_location`} label={i18n`Town location`} />
+ <Input name={`${name}.town`} label={i18n`Town`} />
+ <Input name={`${name}.district`} label={i18n`District`} />
+ <Input
+ name={`${name}.country_subdivision`}
+ label={i18n`Country subdivision`}
+ />
+ </>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx b/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
index 9f0b28ff2..3b5df1474 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h } from "preact";
import { InputWithAddon } from "./InputWithAddon.js";
import { InputProps } from "./useField.js";
@@ -29,14 +29,32 @@ export interface Props<T> extends InputProps<T> {
children?: ComponentChildren;
}
-export function InputNumber<T>({ name, readonly, placeholder, tooltip, label, help, expand, children, side }: Props<keyof T>) {
- return <InputWithAddon<T> name={name} readonly={readonly}
- fromStr={(v) => !v ? undefined : parseInt(v, 10) } toStr={(v) => `${v}`}
- inputType='number' expand={expand}
- label={label} placeholder={placeholder} help={help} tooltip={tooltip}
- inputExtra={{ min: 0 }}
- children={children}
- side={side}
- />
+export function InputNumber<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+ expand,
+ children,
+ side,
+}: Props<keyof T>) {
+ return (
+ <InputWithAddon<T>
+ name={name}
+ readonly={readonly}
+ fromStr={(v) => (!v ? undefined : parseInt(v, 10))}
+ toStr={(v) => `${v}`}
+ inputType="number"
+ expand={expand}
+ label={label}
+ placeholder={placeholder}
+ help={help}
+ tooltip={tooltip}
+ inputExtra={{ min: 0 }}
+ children={children}
+ side={side}
+ />
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx b/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
index 021616e3f..6e88e8f2c 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { InputArray } from "./InputArray.js";
import { PAYTO_REGEX } from "../../utils/constants.js";
@@ -25,15 +25,28 @@ import { InputProps } from "./useField.js";
export type Props<T> = InputProps<T>;
-const PAYTO_START_REGEX = /^payto:\/\//
-
-export function InputPayto<T>({ name, readonly, placeholder, tooltip, label, help }: Props<keyof T>): VNode {
- return <InputArray<T> name={name} readonly={readonly}
- addonBefore="payto://"
- label={label} placeholder={placeholder} help={help} tooltip={tooltip}
- isValid={(v) => v && PAYTO_REGEX.test(v) }
- toStr={(v?: string) => !v ? '': v.replace(PAYTO_START_REGEX, '')}
- fromStr={(v: string) => `payto://${v}` }
- />
+const PAYTO_START_REGEX = /^payto:\/\//;
+
+export function InputPayto<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+}: Props<keyof T>): VNode {
+ return (
+ <InputArray<T>
+ name={name}
+ readonly={readonly}
+ addonBefore="payto://"
+ label={label}
+ placeholder={placeholder}
+ help={help}
+ tooltip={tooltip}
+ isValid={(v) => v && PAYTO_REGEX.test(v)}
+ toStr={(v?: string) => (!v ? "" : v.replace(PAYTO_START_REGEX, ""))}
+ fromStr={(v: string) => `payto://${v}`}
+ />
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
index 0c91cc5a1..fceee9d56 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import emptyImage from "../../assets/empty.png";
@@ -26,74 +26,97 @@ import { Translate, useTranslator } from "../../i18n/index.js";
import { FormErrors, FormProvider } from "./FormProvider.js";
import { InputWithAddon } from "./InputWithAddon.js";
-type Entity = MerchantBackend.Products.ProductDetail & WithId
+type Entity = MerchantBackend.Products.ProductDetail & WithId;
export interface Props {
selected?: Entity;
onChange: (p?: Entity) => void;
- products: (MerchantBackend.Products.ProductDetail & WithId)[],
+ products: (MerchantBackend.Products.ProductDetail & WithId)[];
}
interface ProductSearch {
name: string;
}
-export function InputSearchProduct({ selected, onChange, products }: Props): VNode {
- const [prodForm, setProdName] = useState<Partial<ProductSearch>>({ name: '' })
+export function InputSearchProduct({
+ selected,
+ onChange,
+ products,
+}: Props): VNode {
+ const [prodForm, setProdName] = useState<Partial<ProductSearch>>({
+ name: "",
+ });
const errors: FormErrors<ProductSearch> = {
- name: undefined
- }
- const i18n = useTranslator()
-
+ name: undefined,
+ };
+ const i18n = useTranslator();
if (selected) {
- return <article class="media">
- <figure class="media-left">
- <p class="image is-128x128">
- <img src={selected.image ? selected.image : emptyImage} />
- </p>
- </figure>
- <div class="media-content">
- <div class="content">
- <p class="media-meta"><Translate>Product id</Translate>: <b>{selected.id}</b></p>
- <p><Translate>Description</Translate>: {selected.description}</p>
- <div class="buttons is-right mt-5">
- <button class="button is-info" onClick={() => onChange(undefined)}>clear</button>
+ return (
+ <article class="media">
+ <figure class="media-left">
+ <p class="image is-128x128">
+ <img src={selected.image ? selected.image : emptyImage} />
+ </p>
+ </figure>
+ <div class="media-content">
+ <div class="content">
+ <p class="media-meta">
+ <Translate>Product id</Translate>: <b>{selected.id}</b>
+ </p>
+ <p>
+ <Translate>Description</Translate>: {selected.description}
+ </p>
+ <div class="buttons is-right mt-5">
+ <button
+ class="button is-info"
+ onClick={() => onChange(undefined)}
+ >
+ clear
+ </button>
+ </div>
</div>
</div>
- </div>
- </article>
+ </article>
+ );
}
- return <FormProvider<ProductSearch> errors={errors} object={prodForm} valueHandler={setProdName} >
-
- <InputWithAddon<ProductSearch>
- name="name"
- label={i18n`Product`}
- tooltip={i18n`search products by it's description or id`}
- addonAfter={<span class="icon" ><i class="mdi mdi-magnify" /></span>}
+ return (
+ <FormProvider<ProductSearch>
+ errors={errors}
+ object={prodForm}
+ valueHandler={setProdName}
>
- <div>
- <ProductList
- name={prodForm.name}
- list={products}
- onSelect={(p) => {
- setProdName({ name: '' })
- onChange(p)
- }}
- />
- </div>
- </InputWithAddon>
-
- </FormProvider>
-
+ <InputWithAddon<ProductSearch>
+ name="name"
+ label={i18n`Product`}
+ tooltip={i18n`search products by it's description or id`}
+ addonAfter={
+ <span class="icon">
+ <i class="mdi mdi-magnify" />
+ </span>
+ }
+ >
+ <div>
+ <ProductList
+ name={prodForm.name}
+ list={products}
+ onSelect={(p) => {
+ setProdName({ name: "" });
+ onChange(p);
+ }}
+ />
+ </div>
+ </InputWithAddon>
+ </FormProvider>
+ );
}
interface ProductListProps {
name?: string;
onSelect: (p: MerchantBackend.Products.ProductDetail & WithId) => void;
- list: (MerchantBackend.Products.ProductDetail & WithId)[]
+ list: (MerchantBackend.Products.ProductDetail & WithId)[];
}
function ProductList({ name, onSelect, list }: ProductListProps) {
@@ -102,37 +125,61 @@ function ProductList({ name, onSelect, list }: ProductListProps) {
this BR is added to occupy the space that will be added when the
dropdown appears
*/
- return <div ><br /></div>
+ return (
+ <div>
+ <br />
+ </div>
+ );
}
- const filtered = list.filter(p => p.id.includes(name) || p.description.includes(name))
-
- return <div class="dropdown is-active">
- <div class="dropdown-menu" id="dropdown-menu" role="menu" style={{ minWidth: '20rem' }}>
- <div class="dropdown-content">
- {!filtered.length ?
- <div class="dropdown-item" >
- <Translate>no products found with that description</Translate>
- </div> :
- filtered.map(p => (
- <div key={p.id} class="dropdown-item" onClick={() => onSelect(p)} style={{ cursor: 'pointer' }}>
- <article class="media">
- <div class="media-left">
- <div class="image" style={{ minWidth: 64 }}><img src={p.image ? p.image : emptyImage} style={{ width: 64, height: 64 }} /></div>
- </div>
- <div class="media-content">
- <div class="content">
- <p>
- <strong>{p.id}</strong> <small>{p.price}</small>
- <br />
- {p.description}
- </p>
- </div>
- </div>
- </article>
+ const filtered = list.filter(
+ (p) => p.id.includes(name) || p.description.includes(name),
+ );
+
+ return (
+ <div class="dropdown is-active">
+ <div
+ class="dropdown-menu"
+ id="dropdown-menu"
+ role="menu"
+ style={{ minWidth: "20rem" }}
+ >
+ <div class="dropdown-content">
+ {!filtered.length ? (
+ <div class="dropdown-item">
+ <Translate>no products found with that description</Translate>
</div>
- ))
- }
+ ) : (
+ filtered.map((p) => (
+ <div
+ key={p.id}
+ class="dropdown-item"
+ onClick={() => onSelect(p)}
+ style={{ cursor: "pointer" }}
+ >
+ <article class="media">
+ <div class="media-left">
+ <div class="image" style={{ minWidth: 64 }}>
+ <img
+ src={p.image ? p.image : emptyImage}
+ style={{ width: 64, height: 64 }}
+ />
+ </div>
+ </div>
+ <div class="media-content">
+ <div class="content">
+ <p>
+ <strong>{p.id}</strong> <small>{p.price}</small>
+ <br />
+ {p.description}
+ </p>
+ </div>
+ </div>
+ </article>
+ </div>
+ ))
+ )}
+ </div>
</div>
</div>
- </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx b/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
index 061525d9e..12ce6c6aa 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
@@ -15,41 +15,47 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { FormProvider } from "./FormProvider.js";
-import { InputSecured } from './InputSecured.js';
+import { InputSecured } from "./InputSecured.js";
export default {
- title: 'Components/Form/InputSecured',
+ title: "Components/Form/InputSecured",
component: InputSecured,
};
-type T = { auth_token: string | null }
+type T = { auth_token: string | null };
export const InitialValueEmpty = (): VNode => {
- const [state, setState] = useState<Partial<T>>({ auth_token: '' })
- return <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
- Initial value: ''
- <InputSecured<T> name="auth_token" label="Access token" />
- </FormProvider>
-}
+ const [state, setState] = useState<Partial<T>>({ auth_token: "" });
+ return (
+ <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
+ Initial value: ''
+ <InputSecured<T> name="auth_token" label="Access token" />
+ </FormProvider>
+ );
+};
export const InitialValueToken = (): VNode => {
- const [state, setState] = useState<Partial<T>>({ auth_token: 'token' })
- return <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
- <InputSecured<T> name="auth_token" label="Access token" />
- </FormProvider>
-}
+ const [state, setState] = useState<Partial<T>>({ auth_token: "token" });
+ return (
+ <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
+ <InputSecured<T> name="auth_token" label="Access token" />
+ </FormProvider>
+ );
+};
export const InitialValueNull = (): VNode => {
- const [state, setState] = useState<Partial<T>>({ auth_token: null })
- return <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
- Initial value: ''
- <InputSecured<T> name="auth_token" label="Access token" />
- </FormProvider>
-}
+ const [state, setState] = useState<Partial<T>>({ auth_token: null });
+ return (
+ <FormProvider<T> object={state} errors={{}} valueHandler={setState}>
+ Initial value: ''
+ <InputSecured<T> name="auth_token" label="Access token" />
+ </FormProvider>
+ );
+};
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx b/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
index b0168e505..799978683 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { Translate, useTranslator } from "../../i18n/index.js";
@@ -26,94 +26,160 @@ import { InputProps, useField } from "./useField.js";
export type Props<T> = InputProps<T>;
const TokenStatus = ({ prev, post }: any) => {
- if ((prev === undefined || prev === null) && (post === undefined || post === null))
- return null
- return (prev === post) ? null : (
- post === null ?
- <span class="tag is-danger is-align-self-center ml-2"><Translate>Deleting</Translate></span> :
- <span class="tag is-warning is-align-self-center ml-2"><Translate>Changing</Translate></span>
+ if (
+ (prev === undefined || prev === null) &&
+ (post === undefined || post === null)
)
-}
+ return null;
+ return prev === post ? null : post === null ? (
+ <span class="tag is-danger is-align-self-center ml-2">
+ <Translate>Deleting</Translate>
+ </span>
+ ) : (
+ <span class="tag is-warning is-align-self-center ml-2">
+ <Translate>Changing</Translate>
+ </span>
+ );
+};
-export function InputSecured<T>({ name, readonly, placeholder, tooltip, label, help }: Props<keyof T>): VNode {
+export function InputSecured<T>({
+ name,
+ readonly,
+ placeholder,
+ tooltip,
+ label,
+ help,
+}: Props<keyof T>): VNode {
const { error, value, initial, onChange, toStr, fromStr } = useField<T>(name);
const [active, setActive] = useState(false);
- const [newValue, setNuewValue] = useState("")
+ const [newValue, setNuewValue] = useState("");
- const i18n = useTranslator()
+ const i18n = useTranslator();
- return <Fragment>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- {!active ?
- <Fragment>
- <div class="field has-addons">
- <button class="button"
- onClick={(): void => { setActive(!active); }} >
- <div class="icon is-left"><i class="mdi mdi-lock-reset" /></div>
- <span><Translate>Manage access token</Translate></span>
- </button>
- <TokenStatus prev={initial} post={value} />
- </div>
- </Fragment> :
- <Fragment>
- <div class="field has-addons">
- <div class="control">
- <a class="button is-static">secret-token:</a>
- </div>
- <div class="control is-expanded">
- <input class="input" type="text"
- placeholder={placeholder} readonly={readonly || !active}
- disabled={readonly || !active}
- name={String(name)} value={newValue}
- onInput={(e): void => {
- setNuewValue(e.currentTarget.value)
- }} />
- {help}
- </div>
- <div class="control">
- <button class="button is-info" disabled={fromStr(newValue) === value} onClick={(): void => { onChange(fromStr(newValue)); setActive(!active); setNuewValue(""); }} >
- <div class="icon is-left"><i class="mdi mdi-lock-outline" /></div>
- <span><Translate>Update</Translate></span>
- </button>
- </div>
- </div>
- </Fragment>
- }
- {error ? <p class="help is-danger">{error}</p> : null}
- </div>
- </div>
- {active &&
+ return (
+ <Fragment>
<div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
<div class="field-body is-flex-grow-3">
- <div class="level" style={{ width: '100%' }}>
- <div class="level-right is-flex-grow-1">
- <div class="level-item">
- <button class="button is-danger" disabled={null === value || undefined === value} onClick={(): void => { onChange(null!); setActive(!active); setNuewValue(""); }} >
- <div class="icon is-left"><i class="mdi mdi-lock-open-variant" /></div>
- <span><Translate>Remove</Translate></span>
+ {!active ? (
+ <Fragment>
+ <div class="field has-addons">
+ <button
+ class="button"
+ onClick={(): void => {
+ setActive(!active);
+ }}
+ >
+ <div class="icon is-left">
+ <i class="mdi mdi-lock-reset" />
+ </div>
+ <span>
+ <Translate>Manage access token</Translate>
+ </span>
</button>
+ <TokenStatus prev={initial} post={value} />
</div>
- <div class="level-item">
- <button class="button " onClick={(): void => { onChange(initial!); setActive(!active); setNuewValue(""); }} >
- <div class="icon is-left"><i class="mdi mdi-lock-open-variant" /></div>
- <span><Translate>Cancel</Translate></span>
- </button>
+ </Fragment>
+ ) : (
+ <Fragment>
+ <div class="field has-addons">
+ <div class="control">
+ <a class="button is-static">secret-token:</a>
+ </div>
+ <div class="control is-expanded">
+ <input
+ class="input"
+ type="text"
+ placeholder={placeholder}
+ readonly={readonly || !active}
+ disabled={readonly || !active}
+ name={String(name)}
+ value={newValue}
+ onInput={(e): void => {
+ setNuewValue(e.currentTarget.value);
+ }}
+ />
+ {help}
+ </div>
+ <div class="control">
+ <button
+ class="button is-info"
+ disabled={fromStr(newValue) === value}
+ onClick={(): void => {
+ onChange(fromStr(newValue));
+ setActive(!active);
+ setNuewValue("");
+ }}
+ >
+ <div class="icon is-left">
+ <i class="mdi mdi-lock-outline" />
+ </div>
+ <span>
+ <Translate>Update</Translate>
+ </span>
+ </button>
+ </div>
+ </div>
+ </Fragment>
+ )}
+ {error ? <p class="help is-danger">{error}</p> : null}
+ </div>
+ </div>
+ {active && (
+ <div class="field is-horizontal">
+ <div class="field-body is-flex-grow-3">
+ <div class="level" style={{ width: "100%" }}>
+ <div class="level-right is-flex-grow-1">
+ <div class="level-item">
+ <button
+ class="button is-danger"
+ disabled={null === value || undefined === value}
+ onClick={(): void => {
+ onChange(null!);
+ setActive(!active);
+ setNuewValue("");
+ }}
+ >
+ <div class="icon is-left">
+ <i class="mdi mdi-lock-open-variant" />
+ </div>
+ <span>
+ <Translate>Remove</Translate>
+ </span>
+ </button>
+ </div>
+ <div class="level-item">
+ <button
+ class="button "
+ onClick={(): void => {
+ onChange(initial!);
+ setActive(!active);
+ setNuewValue("");
+ }}
+ >
+ <div class="icon is-left">
+ <i class="mdi mdi-lock-open-variant" />
+ </div>
+ <span>
+ <Translate>Cancel</Translate>
+ </span>
+ </button>
+ </div>
</div>
</div>
-
</div>
</div>
- </div>
- }
- </Fragment >;
+ )}
+ </Fragment>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
index 74806734c..57aa5968d 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { Fragment, h } from "preact";
import { MerchantBackend, Timestamp } from "../../declaration.js";
import { InputProps, useField } from "./useField.js";
@@ -34,8 +34,7 @@ export interface Props<T> extends InputProps<T> {
alreadyExist?: boolean;
}
-
-type Entity = Stock
+type Entity = Stock;
export interface Stock {
current: number;
@@ -50,66 +49,96 @@ interface StockDelta {
lost: number;
}
-
-export function InputStock<T>({ name, tooltip, label, alreadyExist }: Props<keyof T>) {
+export function InputStock<T>({
+ name,
+ tooltip,
+ label,
+ alreadyExist,
+}: Props<keyof T>) {
const { error, value, onChange } = useField<T>(name);
- const [errors, setErrors] = useState<FormErrors<Entity>>({})
-
- const [formValue, valueHandler] = useState<Partial<Entity>>(value)
- const [addedStock, setAddedStock] = useState<StockDelta>({ incoming: 0, lost: 0 })
- const i18n = useTranslator()
+ const [errors, setErrors] = useState<FormErrors<Entity>>({});
+ const [formValue, valueHandler] = useState<Partial<Entity>>(value);
+ const [addedStock, setAddedStock] = useState<StockDelta>({
+ incoming: 0,
+ lost: 0,
+ });
+ const i18n = useTranslator();
useLayoutEffect(() => {
if (!formValue) {
- onChange(undefined as any)
+ onChange(undefined as any);
} else {
onChange({
...formValue,
current: (formValue?.current || 0) + addedStock.incoming,
- lost: (formValue?.lost || 0) + addedStock.lost
- } as any)
+ lost: (formValue?.lost || 0) + addedStock.lost,
+ } as any);
}
- }, [formValue, addedStock])
+ }, [formValue, addedStock]);
if (!formValue) {
- return <Fragment>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field has-addons">
- {!alreadyExist ?
- <button class="button"
- data-tooltip={i18n`click here to configure the stock of the product, leave it as is and the backend will not control stock`}
- onClick={(): void => { valueHandler({ current: 0, lost: 0, sold: 0 } as Stock as any); }} >
- <span><Translate>Manage stock</Translate></span>
- </button> : <button class="button"
- data-tooltip={i18n`this product has been configured without stock control`}
- disabled >
- <span><Translate>Infinite</Translate></span>
- </button>
- }
+ return (
+ <Fragment>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field has-addons">
+ {!alreadyExist ? (
+ <button
+ class="button"
+ data-tooltip={i18n`click here to configure the stock of the product, leave it as is and the backend will not control stock`}
+ onClick={(): void => {
+ valueHandler({
+ current: 0,
+ lost: 0,
+ sold: 0,
+ } as Stock as any);
+ }}
+ >
+ <span>
+ <Translate>Manage stock</Translate>
+ </span>
+ </button>
+ ) : (
+ <button
+ class="button"
+ data-tooltip={i18n`this product has been configured without stock control`}
+ disabled
+ >
+ <span>
+ <Translate>Infinite</Translate>
+ </span>
+ </button>
+ )}
+ </div>
</div>
</div>
- </div>
- </Fragment >
+ </Fragment>
+ );
}
- const currentStock = (formValue.current || 0) - (formValue.lost || 0) - (formValue.sold || 0)
+ const currentStock =
+ (formValue.current || 0) - (formValue.lost || 0) - (formValue.sold || 0);
const stockAddedErrors: FormErrors<typeof addedStock> = {
- lost: currentStock + addedStock.incoming < addedStock.lost ?
- i18n`lost cannot be greater than current and incoming (max ${currentStock + addedStock.incoming})`
- : undefined
- }
+ lost:
+ currentStock + addedStock.incoming < addedStock.lost
+ ? i18n`lost cannot be greater than current and incoming (max ${
+ currentStock + addedStock.incoming
+ })`
+ : undefined,
+ };
// const stockUpdateDescription = stockAddedErrors.lost ? '' : (
// !!addedStock.incoming || !!addedStock.lost ?
@@ -117,26 +146,39 @@ export function InputStock<T>({ name, tooltip, label, alreadyExist }: Props<keyo
// i18n`current stock will stay at ${currentStock}`
// )
- return <Fragment>
- <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- {label}
- {tooltip && <span class="icon" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </p>
- </header>
- <div class="card-content">
- <FormProvider<Entity> name="stock" errors={errors} object={formValue} valueHandler={valueHandler}>
- {alreadyExist ? <Fragment>
-
- <FormProvider name="added" errors={stockAddedErrors} object={addedStock} valueHandler={setAddedStock as any}>
- <InputNumber name="incoming" label={i18n`Incoming`} />
- <InputNumber name="lost" label={i18n`Lost`} />
- </FormProvider>
-
- {/* <div class="field is-horizontal">
+ return (
+ <Fragment>
+ <div class="card">
+ <header class="card-header">
+ <p class="card-header-title">
+ {label}
+ {tooltip && (
+ <span class="icon" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </p>
+ </header>
+ <div class="card-content">
+ <FormProvider<Entity>
+ name="stock"
+ errors={errors}
+ object={formValue}
+ valueHandler={valueHandler}
+ >
+ {alreadyExist ? (
+ <Fragment>
+ <FormProvider
+ name="added"
+ errors={stockAddedErrors}
+ object={addedStock}
+ valueHandler={setAddedStock as any}
+ >
+ <InputNumber name="incoming" label={i18n`Incoming`} />
+ <InputNumber name="lost" label={i18n`Lost`} />
+ </FormProvider>
+
+ {/* <div class="field is-horizontal">
<div class="field-label is-normal" />
<div class="field-body is-flex-grow-3">
<div class="field">
@@ -144,28 +186,40 @@ export function InputStock<T>({ name, tooltip, label, alreadyExist }: Props<keyo
</div>
</div>
</div> */}
-
- </Fragment> : <InputNumber<Entity> name="current"
- label={i18n`Current`}
- side={
- <button class="button is-danger"
- data-tooltip={i18n`remove stock control for this product`}
- onClick={(): void => { valueHandler(undefined as any) }} >
- <span><Translate>without stock</Translate></span>
- </button>
- }
- />}
-
- <InputDate<Entity> name="nextRestock" label={i18n`Next restock`} withTimestampSupport />
-
- <InputGroup<Entity> name="address" label={i18n`Delivery address`}>
- <InputLocation name="address" />
- </InputGroup>
- </FormProvider>
+ </Fragment>
+ ) : (
+ <InputNumber<Entity>
+ name="current"
+ label={i18n`Current`}
+ side={
+ <button
+ class="button is-danger"
+ data-tooltip={i18n`remove stock control for this product`}
+ onClick={(): void => {
+ valueHandler(undefined as any);
+ }}
+ >
+ <span>
+ <Translate>without stock</Translate>
+ </span>
+ </button>
+ }
+ />
+ )}
+
+ <InputDate<Entity>
+ name="nextRestock"
+ label={i18n`Next restock`}
+ withTimestampSupport
+ />
+
+ <InputGroup<Entity> name="address" label={i18n`Delivery address`}>
+ <InputLocation name="address" />
+ </InputGroup>
+ </FormProvider>
+ </div>
</div>
- </div>
- </Fragment>
+ </Fragment>
+ );
}
- // (
-
-
+// (
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
index 84f9234e9..d95463790 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useCallback, useState } from "preact/hooks";
-import * as yup from 'yup';
+import * as yup from "yup";
import { MerchantBackend } from "../../declaration.js";
import { Translate, useTranslator } from "../../i18n/index.js";
import { TaxSchema as schema } from "../../schemas/index.js";
@@ -33,65 +33,114 @@ export interface Props<T> extends InputProps<T> {
isValid?: (e: any) => boolean;
}
-type Entity = MerchantBackend.Tax
-export function InputTaxes<T>({ name, readonly, label }: Props<keyof T>): VNode {
- const { value: taxes, onChange, } = useField<T>(name);
+type Entity = MerchantBackend.Tax;
+export function InputTaxes<T>({
+ name,
+ readonly,
+ label,
+}: Props<keyof T>): VNode {
+ const { value: taxes, onChange } = useField<T>(name);
- const [value, valueHandler] = useState<Partial<Entity>>({})
+ const [value, valueHandler] = useState<Partial<Entity>>({});
// const [errors, setErrors] = useState<FormErrors<Entity>>({})
- let errors: FormErrors<Entity> = {}
+ let errors: FormErrors<Entity> = {};
try {
- schema.validateSync(value, { abortEarly: false })
+ schema.validateSync(value, { abortEarly: false });
} catch (err) {
if (err instanceof yup.ValidationError) {
- const yupErrors = err.inner as yup.ValidationError[]
- errors = yupErrors.reduce((prev, cur) => !cur.path ? prev : ({ ...prev, [cur.path]: cur.message }), {})
+ const yupErrors = err.inner as yup.ValidationError[];
+ errors = yupErrors.reduce(
+ (prev, cur) =>
+ !cur.path ? prev : { ...prev, [cur.path]: cur.message },
+ {},
+ );
}
}
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
const submit = useCallback((): void => {
- onChange([value as any, ...taxes] as any)
- valueHandler({})
- }, [value])
+ onChange([value as any, ...taxes] as any);
+ valueHandler({});
+ }, [value]);
- const i18n = useTranslator()
+ const i18n = useTranslator();
//FIXME: translating plural singular
return (
- <InputGroup name="tax" label={label} alternative={taxes.length > 0 && <p>This product has {taxes.length} applicable taxes configured.</p>}>
- <FormProvider<Entity> name="tax" errors={errors} object={value} valueHandler={valueHandler} >
-
+ <InputGroup
+ name="tax"
+ label={label}
+ alternative={
+ taxes.length > 0 && (
+ <p>This product has {taxes.length} applicable taxes configured.</p>
+ )
+ }
+ >
+ <FormProvider<Entity>
+ name="tax"
+ errors={errors}
+ object={value}
+ valueHandler={valueHandler}
+ >
<div class="field is-horizontal">
<div class="field-label is-normal" />
- <div class="field-body" style={{ display: 'block' }}>
- {taxes.map((v: any, i: number) => <div key={i} class="tags has-addons mt-3 mb-0 mr-3" style={{ flexWrap: 'nowrap' }}>
- <span class="tag is-medium is-info mb-0" style={{ maxWidth: '90%' }}><b>{v.tax}</b>: {v.name}</span>
- <a class="tag is-medium is-danger is-delete mb-0" onClick={() => {
- onChange(taxes.filter((f: any) => f !== v) as any);
- valueHandler(v);
- }} />
- </div>
- )}
+ <div class="field-body" style={{ display: "block" }}>
+ {taxes.map((v: any, i: number) => (
+ <div
+ key={i}
+ class="tags has-addons mt-3 mb-0 mr-3"
+ style={{ flexWrap: "nowrap" }}
+ >
+ <span
+ class="tag is-medium is-info mb-0"
+ style={{ maxWidth: "90%" }}
+ >
+ <b>{v.tax}</b>: {v.name}
+ </span>
+ <a
+ class="tag is-medium is-danger is-delete mb-0"
+ onClick={() => {
+ onChange(taxes.filter((f: any) => f !== v) as any);
+ valueHandler(v);
+ }}
+ />
+ </div>
+ ))}
{!taxes.length && i18n`No taxes configured for this product.`}
</div>
</div>
- <Input<Entity> name="tax" label={i18n`Amount`} tooltip={i18n`Taxes can be in currencies that differ from the main currency used by the merchant.`}>
- <Translate>Enter currency and value separated with a colon, e.g. "USD:2.3".</Translate>
+ <Input<Entity>
+ name="tax"
+ label={i18n`Amount`}
+ tooltip={i18n`Taxes can be in currencies that differ from the main currency used by the merchant.`}
+ >
+ <Translate>
+ Enter currency and value separated with a colon, e.g. "USD:2.3".
+ </Translate>
</Input>
- <Input<Entity> name="name" label={i18n`Description`} tooltip={i18n`Legal name of the tax, e.g. VAT or import duties.`} />
+ <Input<Entity>
+ name="name"
+ label={i18n`Description`}
+ tooltip={i18n`Legal name of the tax, e.g. VAT or import duties.`}
+ />
<div class="buttons is-right mt-5">
- <button class="button is-info"
+ <button
+ class="button is-info"
data-tooltip={i18n`add tax to the tax list`}
disabled={hasErrors}
- onClick={submit}><Translate>Add</Translate></button>
+ onClick={submit}
+ >
+ <Translate>Add</Translate>
+ </button>
</div>
</FormProvider>
</InputGroup>
- )
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
index bdc9eaa0c..620922584 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
@@ -15,63 +15,99 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { InputProps, useField } from "./useField.js";
export interface Props<T> extends InputProps<T> {
expand?: boolean;
- inputType?: 'text' | 'number';
+ inputType?: "text" | "number";
addonBefore?: ComponentChildren;
addonAfter?: ComponentChildren;
toStr?: (v?: any) => string;
fromStr?: (s: string) => any;
- inputExtra?: any,
- children?: ComponentChildren,
+ inputExtra?: any;
+ children?: ComponentChildren;
side?: ComponentChildren;
}
-const defaultToString = (f?: any): string => f || ''
-const defaultFromString = (v: string): any => v as any
+const defaultToString = (f?: any): string => f || "";
+const defaultFromString = (v: string): any => v as any;
-export function InputWithAddon<T>({ name, readonly, addonBefore, children, expand, label, placeholder, help, tooltip, inputType, inputExtra, side, addonAfter, toStr = defaultToString, fromStr = defaultFromString }: Props<keyof T>): VNode {
+export function InputWithAddon<T>({
+ name,
+ readonly,
+ addonBefore,
+ children,
+ expand,
+ label,
+ placeholder,
+ help,
+ tooltip,
+ inputType,
+ inputExtra,
+ side,
+ addonAfter,
+ toStr = defaultToString,
+ fromStr = defaultFromString,
+}: Props<keyof T>): VNode {
const { error, value, onChange, required } = useField<T>(name);
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <div class="field has-addons">
- {addonBefore && <div class="control">
- <a class="button is-static">{addonBefore}</a>
- </div>}
- <p class={`control${expand ? " is-expanded" :""}${required ? " has-icons-right" : ''}`}>
- <input {...(inputExtra || {})} class={error ? "input is-danger" : "input"} type={inputType}
- placeholder={placeholder} readonly={readonly}
- name={String(name)} value={toStr(value)}
- onChange={(e): void => onChange(fromStr(e.currentTarget.value))} />
- {required && <span class="icon has-text-danger is-right">
- <i class="mdi mdi-alert" />
- </span>}
- {help}
- {children}
- </p>
- {addonAfter && <div class="control">
- <a class="button is-static">{addonAfter}</a>
- </div>}
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <div class="field has-addons">
+ {addonBefore && (
+ <div class="control">
+ <a class="button is-static">{addonBefore}</a>
+ </div>
+ )}
+ <p
+ class={`control${expand ? " is-expanded" : ""}${
+ required ? " has-icons-right" : ""
+ }`}
+ >
+ <input
+ {...(inputExtra || {})}
+ class={error ? "input is-danger" : "input"}
+ type={inputType}
+ placeholder={placeholder}
+ readonly={readonly}
+ name={String(name)}
+ value={toStr(value)}
+ onChange={(e): void => onChange(fromStr(e.currentTarget.value))}
+ />
+ {required && (
+ <span class="icon has-text-danger is-right">
+ <i class="mdi mdi-alert" />
+ </span>
+ )}
+ {help}
+ {children}
+ </p>
+ {addonAfter && (
+ <div class="control">
+ <a class="button is-static">{addonAfter}</a>
+ </div>
+ )}
+ </div>
+ {error && <p class="help is-danger">{error}</p>}
</div>
- {error && <p class="help is-danger">{error}</p>}
+ {side}
</div>
- {side}
</div>
- </div>;
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/TextField.tsx b/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
index 2cda71599..03f36dcbb 100644
--- a/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
@@ -15,39 +15,57 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { useField, InputProps } from "./useField.js";
interface Props<T> extends InputProps<T> {
- inputType?: 'text' | 'number' | 'multiline' | 'password';
+ inputType?: "text" | "number" | "multiline" | "password";
expand?: boolean;
side?: ComponentChildren;
children: ComponentChildren;
}
-export function TextField<T>({ name, tooltip, label, expand, help, children, side}: Props<keyof T>): VNode {
+export function TextField<T>({
+ name,
+ tooltip,
+ label,
+ expand,
+ help,
+ children,
+ side,
+}: Props<keyof T>): VNode {
const { error } = useField<T>(name);
- return <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- {label}
- {tooltip && <span class="icon has-tooltip-right" data-tooltip={tooltip}>
- <i class="mdi mdi-information" />
- </span>}
- </label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class={expand ? "control is-expanded has-icons-right" : "control has-icons-right"}>
- {children}
- {help}
- </p>
- {error && <p class="help is-danger">{error}</p>}
+ return (
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ {label}
+ {tooltip && (
+ <span class="icon has-tooltip-right" data-tooltip={tooltip}>
+ <i class="mdi mdi-information" />
+ </span>
+ )}
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p
+ class={
+ expand
+ ? "control is-expanded has-icons-right"
+ : "control has-icons-right"
+ }
+ >
+ {children}
+ {help}
+ </p>
+ {error && <p class="help is-danger">{error}</p>}
+ </div>
+ {side}
</div>
- {side}
</div>
- </div>;
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/form/useField.tsx b/packages/merchant-backoffice-ui/src/components/form/useField.tsx
index 6b685d722..dffb0cc66 100644
--- a/packages/merchant-backoffice-ui/src/components/form/useField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/useField.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, VNode } from "preact";
import { useFormContext } from "./FormProvider.js";
@@ -29,26 +29,29 @@ interface Use<V> {
initial: any;
onChange: (v: V) => void;
toStr: (f: V | undefined) => string;
- fromStr: (v: string) => V
+ fromStr: (v: string) => V;
}
export function useField<T>(name: keyof T): Use<T[typeof name]> {
- const { errors, object, initialObject, toStr, fromStr, valueHandler } = useFormContext<T>()
- type P = typeof name
- type V = T[P]
+ const { errors, object, initialObject, toStr, fromStr, valueHandler } =
+ useFormContext<T>();
+ type P = typeof name;
+ type V = T[P];
- const updateField = (field: P) => (value: V): void => {
- return valueHandler((prev) => {
- return setValueDeeper(prev, String(field).split('.'), value)
- })
- }
+ const updateField =
+ (field: P) =>
+ (value: V): void => {
+ return valueHandler((prev) => {
+ return setValueDeeper(prev, String(field).split("."), value);
+ });
+ };
- const defaultToString = ((f?: V): string => String(!f ? '' : f))
- const defaultFromString = ((v: string): V => v as any)
- const value = readField(object, String(name))
- const initial = readField(initialObject, String(name))
- const isDirty = value !== initial
- const hasError = readField(errors, String(name))
+ const defaultToString = (f?: V): string => String(!f ? "" : f);
+ const defaultFromString = (v: string): V => v as any;
+ const value = readField(object, String(name));
+ const initial = readField(initialObject, String(name));
+ const isDirty = value !== initial;
+ const hasError = readField(errors, String(name));
return {
error: isDirty ? hasError : undefined,
required: !isDirty && hasError,
@@ -57,24 +60,26 @@ export function useField<T>(name: keyof T): Use<T[typeof name]> {
onChange: updateField(name) as any,
toStr: toStr[name] ? toStr[name]! : defaultToString,
fromStr: fromStr[name] ? fromStr[name]! : defaultFromString,
- }
+ };
}
/**
* read the field of an object an support accessing it using '.'
- *
- * @param object
- * @param name
- * @returns
+ *
+ * @param object
+ * @param name
+ * @returns
*/
const readField = (object: any, name: string) => {
- return name.split('.').reduce((prev, current) => prev && prev[current], object)
-}
+ return name
+ .split(".")
+ .reduce((prev, current) => prev && prev[current], object);
+};
const setValueDeeper = (object: any, names: string[], value: any): any => {
- if (names.length === 0) return value
- const [head, ...rest] = names
- return { ...object, [head]: setValueDeeper(object[head] || {}, rest, value) }
-}
+ if (names.length === 0) return value;
+ const [head, ...rest] = names;
+ return { ...object, [head]: setValueDeeper(object[head] || {}, rest, value) };
+};
export interface InputProps<T> {
name: T;
@@ -83,4 +88,4 @@ export interface InputProps<T> {
tooltip?: ComponentChildren;
readonly?: boolean;
help?: ComponentChildren;
-} \ No newline at end of file
+}
diff --git a/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx b/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
index e6365e3ad..9a445eb32 100644
--- a/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { useFormContext } from "./FormProvider.js";
@@ -27,14 +27,15 @@ interface Use {
export function useGroupField<T>(name: keyof T): Use {
const f = useFormContext<T>();
- if (!f)
- return {};
+ if (!f) return {};
return {
- hasError: readField(f.errors, String(name))
+ hasError: readField(f.errors, String(name)),
};
}
const readField = (object: any, name: string) => {
- return name.split('.').reduce((prev, current) => prev && prev[current], object)
-}
+ return name
+ .split(".")
+ .reduce((prev, current) => prev && prev[current], object);
+};
diff --git a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
index e5c6b6914..d618d6480 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
@@ -15,59 +15,78 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import langIcon from '../../assets/icons/languageicon.svg';
+import langIcon from "../../assets/icons/languageicon.svg";
import { useTranslationContext } from "../../context/translation.js";
-import { strings as messages } from '../../i18n/strings'
+import { strings as messages } from "../../i18n/strings";
type LangsNames = {
- [P in keyof typeof messages]: string
-}
+ [P in keyof typeof messages]: string;
+};
const names: LangsNames = {
- es: 'Español [es]',
- en: 'English [en]',
- fr: 'Français [fr]',
- de: 'Deutsch [de]',
- sv: 'Svenska [sv]',
- it: 'Italiano [it]',
-}
+ es: "Español [es]",
+ en: "English [en]",
+ fr: "Français [fr]",
+ de: "Deutsch [de]",
+ sv: "Svenska [sv]",
+ it: "Italiano [it]",
+};
function getLangName(s: keyof LangsNames | string) {
- if (names[s]) return names[s]
- return s
+ if (names[s]) return names[s];
+ return s;
}
export function LangSelector(): VNode {
- const [updatingLang, setUpdatingLang] = useState(false)
- const { lang, changeLanguage } = useTranslationContext()
+ const [updatingLang, setUpdatingLang] = useState(false);
+ const { lang, changeLanguage } = useTranslationContext();
- return <div class="dropdown is-active ">
- <div class="dropdown-trigger">
- <button class="button has-tooltip-left"
- data-tooltip="change language selection"
- aria-haspopup="true"
- aria-controls="dropdown-menu" onClick={() => setUpdatingLang(!updatingLang)}>
- <div class="icon is-small is-left">
- <img src={langIcon} />
- </div>
- <span>{getLangName(lang)}</span>
- <div class="icon is-right">
- <i class="mdi mdi-chevron-down" />
+ return (
+ <div class="dropdown is-active ">
+ <div class="dropdown-trigger">
+ <button
+ class="button has-tooltip-left"
+ data-tooltip="change language selection"
+ aria-haspopup="true"
+ aria-controls="dropdown-menu"
+ onClick={() => setUpdatingLang(!updatingLang)}
+ >
+ <div class="icon is-small is-left">
+ <img src={langIcon} />
+ </div>
+ <span>{getLangName(lang)}</span>
+ <div class="icon is-right">
+ <i class="mdi mdi-chevron-down" />
+ </div>
+ </button>
+ </div>
+ {updatingLang && (
+ <div class="dropdown-menu" id="dropdown-menu" role="menu">
+ <div class="dropdown-content">
+ {Object.keys(messages)
+ .filter((l) => l !== lang)
+ .map((l) => (
+ <a
+ key={l}
+ class="dropdown-item"
+ value={l}
+ onClick={() => {
+ changeLanguage(l);
+ setUpdatingLang(false);
+ }}
+ >
+ {getLangName(l)}
+ </a>
+ ))}
+ </div>
</div>
- </button>
+ )}
</div>
- {updatingLang && <div class="dropdown-menu" id="dropdown-menu" role="menu">
- <div class="dropdown-content">
- {Object.keys(messages)
- .filter((l) => l !== lang)
- .map(l => <a key={l} class="dropdown-item" value={l} onClick={() => { changeLanguage(l); setUpdatingLang(false) }}>{getLangName(l)}</a>)}
- </div>
- </div>}
- </div>
-} \ No newline at end of file
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx b/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
index 39d1b0e35..46c13adf0 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
-import logo from '../../assets/logo.jpeg';
+import { h, VNode } from "preact";
+import logo from "../../assets/logo.jpeg";
import { LangSelector } from "./LangSelector.js";
interface Props {
@@ -29,30 +29,46 @@ interface Props {
}
export function NavigationBar({ onMobileMenu, title }: Props): VNode {
- return (<nav class="navbar is-fixed-top" role="navigation" aria-label="main navigation">
- <div class="navbar-brand">
- <span class="navbar-item" style={{ fontSize: 24, fontWeight: 900 }}>{title}</span>
-
- <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" onClick={(e) => {
- onMobileMenu()
- e.stopPropagation()
- }}>
- <span aria-hidden="true" />
- <span aria-hidden="true" />
- <span aria-hidden="true" />
- </a>
- </div>
-
- <div class="navbar-menu ">
- <a class="navbar-start is-justify-content-center is-flex-grow-1" href="https://taler.net">
- <img src={logo} style={{ height: 50, maxHeight: 50 }} />
- </a>
- <div class="navbar-end">
- <div class="navbar-item" style={{ paddingTop: 4, paddingBottom: 4 }}>
- <LangSelector />
+ return (
+ <nav
+ class="navbar is-fixed-top"
+ role="navigation"
+ aria-label="main navigation"
+ >
+ <div class="navbar-brand">
+ <span class="navbar-item" style={{ fontSize: 24, fontWeight: 900 }}>
+ {title}
+ </span>
+
+ <a
+ role="button"
+ class="navbar-burger"
+ aria-label="menu"
+ aria-expanded="false"
+ onClick={(e) => {
+ onMobileMenu();
+ e.stopPropagation();
+ }}
+ >
+ <span aria-hidden="true" />
+ <span aria-hidden="true" />
+ <span aria-hidden="true" />
+ </a>
+ </div>
+
+ <div class="navbar-menu ">
+ <a
+ class="navbar-start is-justify-content-center is-flex-grow-1"
+ href="https://taler.net"
+ >
+ <img src={logo} style={{ height: 50, maxHeight: 50 }} />
+ </a>
+ <div class="navbar-end">
+ <div class="navbar-item" style={{ paddingTop: 4, paddingBottom: 4 }}>
+ <LangSelector />
+ </div>
</div>
</div>
- </div>
- </nav>
+ </nav>
);
-} \ No newline at end of file
+}
diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx b/packages/merchant-backoffice-ui/src/components/modal/index.tsx
index 7c7e19316..6e5575f63 100644
--- a/packages/merchant-backoffice-ui/src/components/modal/index.tsx
+++ b/packages/merchant-backoffice-ui/src/components/modal/index.tsx
@@ -15,10 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
-
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
import { useState } from "preact/hooks";
@@ -40,104 +39,220 @@ interface Props {
disabled?: boolean;
}
-export function ConfirmModal({ active, description, onCancel, onConfirm, children, danger, disabled, label = 'Confirm' }: Props): VNode {
- return <div class={active ? "modal is-active" : "modal"}>
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card" style={{maxWidth: 700}}>
- <header class="modal-card-head">
- {!description ? null : <p class="modal-card-title"><b>{description}</b></p>}
- <button class="delete " aria-label="close" onClick={onCancel} />
- </header>
- <section class="modal-card-body">
- {children}
- </section>
- <footer class="modal-card-foot">
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button " onClick={onCancel} ><Translate>Cancel</Translate></button>
- <button class={danger ? "button is-danger " : "button is-info "} disabled={disabled} onClick={onConfirm} ><Translate>{label}</Translate></button>
- </div>
- </footer>
+export function ConfirmModal({
+ active,
+ description,
+ onCancel,
+ onConfirm,
+ children,
+ danger,
+ disabled,
+ label = "Confirm",
+}: Props): VNode {
+ return (
+ <div class={active ? "modal is-active" : "modal"}>
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card" style={{ maxWidth: 700 }}>
+ <header class="modal-card-head">
+ {!description ? null : (
+ <p class="modal-card-title">
+ <b>{description}</b>
+ </p>
+ )}
+ <button class="delete " aria-label="close" onClick={onCancel} />
+ </header>
+ <section class="modal-card-body">{children}</section>
+ <footer class="modal-card-foot">
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button class="button " onClick={onCancel}>
+ <Translate>Cancel</Translate>
+ </button>
+ <button
+ class={danger ? "button is-danger " : "button is-info "}
+ disabled={disabled}
+ onClick={onConfirm}
+ >
+ <Translate>{label}</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
-export function ContinueModal({ active, description, onCancel, onConfirm, children, disabled }: Props): VNode {
- return <div class={active ? "modal is-active" : "modal"}>
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card">
- <header class="modal-card-head has-background-success">
- {!description ? null : <p class="modal-card-title">{description}</p>}
- <button class="delete " aria-label="close" onClick={onCancel} />
- </header>
- <section class="modal-card-body">
- {children}
- </section>
- <footer class="modal-card-foot">
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button is-success " disabled={disabled} onClick={onConfirm} ><Translate>Continue</Translate></button>
- </div>
- </footer>
+export function ContinueModal({
+ active,
+ description,
+ onCancel,
+ onConfirm,
+ children,
+ disabled,
+}: Props): VNode {
+ return (
+ <div class={active ? "modal is-active" : "modal"}>
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card">
+ <header class="modal-card-head has-background-success">
+ {!description ? null : <p class="modal-card-title">{description}</p>}
+ <button class="delete " aria-label="close" onClick={onCancel} />
+ </header>
+ <section class="modal-card-body">{children}</section>
+ <footer class="modal-card-foot">
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button
+ class="button is-success "
+ disabled={disabled}
+ onClick={onConfirm}
+ >
+ <Translate>Continue</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
export function SimpleModal({ onCancel, children }: any): VNode {
- return <div class="modal is-active">
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card">
- <section class="modal-card-body is-main-section">
- {children}
- </section>
+ return (
+ <div class="modal is-active">
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card">
+ <section class="modal-card-body is-main-section">{children}</section>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
-export function ClearConfirmModal({ description, onCancel, onClear, onConfirm, children }: Props & { onClear?: () => void }): VNode {
- return <div class="modal is-active">
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card">
- <header class="modal-card-head">
- {!description ? null : <p class="modal-card-title">{description}</p>}
- <button class="delete " aria-label="close" onClick={onCancel} />
- </header>
- <section class="modal-card-body is-main-section">
- {children}
- </section>
- <footer class="modal-card-foot">
- {onClear && <button class="button is-danger" onClick={onClear} disabled={onClear === undefined} ><Translate>Clear</Translate></button>}
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button " onClick={onCancel} ><Translate>Cancel</Translate></button>
- <button class="button is-info" onClick={onConfirm} disabled={onConfirm === undefined} ><Translate>Confirm</Translate></button>
- </div>
- </footer>
+export function ClearConfirmModal({
+ description,
+ onCancel,
+ onClear,
+ onConfirm,
+ children,
+}: Props & { onClear?: () => void }): VNode {
+ return (
+ <div class="modal is-active">
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card">
+ <header class="modal-card-head">
+ {!description ? null : <p class="modal-card-title">{description}</p>}
+ <button class="delete " aria-label="close" onClick={onCancel} />
+ </header>
+ <section class="modal-card-body is-main-section">{children}</section>
+ <footer class="modal-card-foot">
+ {onClear && (
+ <button
+ class="button is-danger"
+ onClick={onClear}
+ disabled={onClear === undefined}
+ >
+ <Translate>Clear</Translate>
+ </button>
+ )}
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button class="button " onClick={onCancel}>
+ <Translate>Cancel</Translate>
+ </button>
+ <button
+ class="button is-info"
+ onClick={onConfirm}
+ disabled={onConfirm === undefined}
+ >
+ <Translate>Confirm</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
interface DeleteModalProps {
- element: { id: string, name: string };
+ element: { id: string; name: string };
onCancel: () => void;
onConfirm: (id: string) => void;
}
-export function DeleteModal({ element, onCancel, onConfirm }: DeleteModalProps): VNode {
- return <ConfirmModal label={`Delete instance`} description={`Delete the instance "${element.name}"`} danger active onCancel={onCancel} onConfirm={() => onConfirm(element.id)}>
- <p>If you delete the instance named <b>"{element.name}"</b> (ID: <b>{element.id}</b>), the merchant will no longer be able to process orders or refunds</p>
- <p>This action deletes the instance private key, but preserves all transaction data. You can still access that data after deleting the instance.</p>
- <p class="warning">Deleting an instance <b>cannot be undone</b>.</p>
- </ConfirmModal>
+export function DeleteModal({
+ element,
+ onCancel,
+ onConfirm,
+}: DeleteModalProps): VNode {
+ return (
+ <ConfirmModal
+ label={`Delete instance`}
+ description={`Delete the instance "${element.name}"`}
+ danger
+ active
+ onCancel={onCancel}
+ onConfirm={() => onConfirm(element.id)}
+ >
+ <p>
+ If you delete the instance named <b>"{element.name}"</b> (ID:{" "}
+ <b>{element.id}</b>), the merchant will no longer be able to process
+ orders or refunds
+ </p>
+ <p>
+ This action deletes the instance private key, but preserves all
+ transaction data. You can still access that data after deleting the
+ instance.
+ </p>
+ <p class="warning">
+ Deleting an instance <b>cannot be undone</b>.
+ </p>
+ </ConfirmModal>
+ );
}
-export function PurgeModal({ element, onCancel, onConfirm }: DeleteModalProps): VNode {
- return <ConfirmModal label={`Purge the instance`} description={`Purge the instance "${element.name}"`} danger active onCancel={onCancel} onConfirm={() => onConfirm(element.id)}>
- <p>If you purge the instance named <b>"{element.name}"</b> (ID: <b>{element.id}</b>), you will also delete all it's transaction data.</p>
- <p>The instance will disappear from your list, and you will no longer be able to access it's data.</p>
- <p class="warning">Purging an instance <b>cannot be undone</b>.</p>
- </ConfirmModal>
+export function PurgeModal({
+ element,
+ onCancel,
+ onConfirm,
+}: DeleteModalProps): VNode {
+ return (
+ <ConfirmModal
+ label={`Purge the instance`}
+ description={`Purge the instance "${element.name}"`}
+ danger
+ active
+ onCancel={onCancel}
+ onConfirm={() => onConfirm(element.id)}
+ >
+ <p>
+ If you purge the instance named <b>"{element.name}"</b> (ID:{" "}
+ <b>{element.id}</b>), you will also delete all it's transaction data.
+ </p>
+ <p>
+ The instance will disappear from your list, and you will no longer be
+ able to access it's data.
+ </p>
+ <p class="warning">
+ Purging an instance <b>cannot be undone</b>.
+ </p>
+ </ConfirmModal>
+ );
}
interface UpdateTokenModalProps {
@@ -148,115 +263,217 @@ interface UpdateTokenModalProps {
}
//FIXME: merge UpdateTokenModal with SetTokenNewInstanceModal
-export function UpdateTokenModal({ onCancel, onClear, onConfirm, oldToken }: UpdateTokenModalProps): VNode {
- type State = { old_token: string, new_token: string, repeat_token: string }
+export function UpdateTokenModal({
+ onCancel,
+ onClear,
+ onConfirm,
+ oldToken,
+}: UpdateTokenModalProps): VNode {
+ type State = { old_token: string; new_token: string; repeat_token: string };
const [form, setValue] = useState<Partial<State>>({
- old_token: '', new_token: '', repeat_token: '',
- })
- const i18n = useTranslator()
+ old_token: "",
+ new_token: "",
+ repeat_token: "",
+ });
+ const i18n = useTranslator();
- const hasInputTheCorrectOldToken = oldToken && oldToken !== form.old_token
+ const hasInputTheCorrectOldToken = oldToken && oldToken !== form.old_token;
const errors = {
- old_token: hasInputTheCorrectOldToken ? i18n`is not the same as the current access token` : undefined,
- new_token: !form.new_token ? i18n`cannot be empty` : (form.new_token === form.old_token ? i18n`cannot be the same as the old token` : undefined),
- repeat_token: form.new_token !== form.repeat_token ? i18n`is not the same` : undefined
- }
+ old_token: hasInputTheCorrectOldToken
+ ? i18n`is not the same as the current access token`
+ : undefined,
+ new_token: !form.new_token
+ ? i18n`cannot be empty`
+ : form.new_token === form.old_token
+ ? i18n`cannot be the same as the old token`
+ : undefined,
+ repeat_token:
+ form.new_token !== form.repeat_token ? i18n`is not the same` : undefined,
+ };
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
- const instance = useInstanceContext()
+ const instance = useInstanceContext();
- const text = i18n`You are updating the access token from instance with id ${instance.id}`
+ const text = i18n`You are updating the access token from instance with id ${instance.id}`;
- return <ClearConfirmModal description={text}
- onCancel={onCancel}
- onConfirm={!hasErrors ? () => onConfirm(form.new_token!) : undefined}
- onClear={!hasInputTheCorrectOldToken && oldToken ? onClear : undefined}
- >
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths" >
- <FormProvider errors={errors} object={form} valueHandler={setValue}>
- {oldToken && <Input<State> name="old_token" label={i18n`Old access token`} tooltip={i18n`access token currently in use`} inputType="password" />}
- <Input<State> name="new_token" label={i18n`New access token`} tooltip={i18n`next access token to be used`} inputType="password" />
- <Input<State> name="repeat_token" label={i18n`Repeat access token`} tooltip={i18n`confirm the same access token`} inputType="password" />
- </FormProvider>
- <p><Translate>Clearing the access token will mean public access to the instance</Translate></p>
+ return (
+ <ClearConfirmModal
+ description={text}
+ onCancel={onCancel}
+ onConfirm={!hasErrors ? () => onConfirm(form.new_token!) : undefined}
+ onClear={!hasInputTheCorrectOldToken && oldToken ? onClear : undefined}
+ >
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <FormProvider errors={errors} object={form} valueHandler={setValue}>
+ {oldToken && (
+ <Input<State>
+ name="old_token"
+ label={i18n`Old access token`}
+ tooltip={i18n`access token currently in use`}
+ inputType="password"
+ />
+ )}
+ <Input<State>
+ name="new_token"
+ label={i18n`New access token`}
+ tooltip={i18n`next access token to be used`}
+ inputType="password"
+ />
+ <Input<State>
+ name="repeat_token"
+ label={i18n`Repeat access token`}
+ tooltip={i18n`confirm the same access token`}
+ inputType="password"
+ />
+ </FormProvider>
+ <p>
+ <Translate>
+ Clearing the access token will mean public access to the instance
+ </Translate>
+ </p>
+ </div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </ClearConfirmModal>
+ </ClearConfirmModal>
+ );
}
-export function SetTokenNewInstanceModal({ onCancel, onClear, onConfirm }: UpdateTokenModalProps): VNode {
- type State = { old_token: string, new_token: string, repeat_token: string }
+export function SetTokenNewInstanceModal({
+ onCancel,
+ onClear,
+ onConfirm,
+}: UpdateTokenModalProps): VNode {
+ type State = { old_token: string; new_token: string; repeat_token: string };
const [form, setValue] = useState<Partial<State>>({
- new_token: '', repeat_token: '',
- })
- const i18n = useTranslator()
+ new_token: "",
+ repeat_token: "",
+ });
+ const i18n = useTranslator();
const errors = {
- new_token: !form.new_token ? i18n`cannot be empty` : (form.new_token === form.old_token ? i18n`cannot be the same as the old access token` : undefined),
- repeat_token: form.new_token !== form.repeat_token ? i18n`is not the same` : undefined
- }
-
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ new_token: !form.new_token
+ ? i18n`cannot be empty`
+ : form.new_token === form.old_token
+ ? i18n`cannot be the same as the old access token`
+ : undefined,
+ repeat_token:
+ form.new_token !== form.repeat_token ? i18n`is not the same` : undefined,
+ };
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
- return <div class="modal is-active">
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title">{i18n`You are setting the access token for the new instance`}</p>
- <button class="delete " aria-label="close" onClick={onCancel} />
- </header>
- <section class="modal-card-body is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths" >
- <FormProvider errors={errors} object={form} valueHandler={setValue}>
- <Input<State> name="new_token" label={i18n`New access token`} tooltip={i18n`next access token to be used`} inputType="password" />
- <Input<State> name="repeat_token" label={i18n`Repeat access token`} tooltip={i18n`confirm the same access token`} inputType="password" />
- </FormProvider>
- <p><Translate>With external authorization method no check will be done by the merchant backend</Translate></p>
+ return (
+ <div class="modal is-active">
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card">
+ <header class="modal-card-head">
+ <p class="modal-card-title">{i18n`You are setting the access token for the new instance`}</p>
+ <button class="delete " aria-label="close" onClick={onCancel} />
+ </header>
+ <section class="modal-card-body is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <FormProvider
+ errors={errors}
+ object={form}
+ valueHandler={setValue}
+ >
+ <Input<State>
+ name="new_token"
+ label={i18n`New access token`}
+ tooltip={i18n`next access token to be used`}
+ inputType="password"
+ />
+ <Input<State>
+ name="repeat_token"
+ label={i18n`Repeat access token`}
+ tooltip={i18n`confirm the same access token`}
+ inputType="password"
+ />
+ </FormProvider>
+ <p>
+ <Translate>
+ With external authorization method no check will be done by
+ the merchant backend
+ </Translate>
+ </p>
+ </div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
- <footer class="modal-card-foot">
- {onClear && <button class="button is-danger" onClick={onClear} disabled={onClear === undefined} ><Translate>Set external authorization</Translate></button>}
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button " onClick={onCancel} ><Translate>Cancel</Translate></button>
- <button class="button is-info" onClick={() => onConfirm(form.new_token!)} disabled={hasErrors} ><Translate>Set access token</Translate></button>
- </div>
- </footer>
+ </section>
+ <footer class="modal-card-foot">
+ {onClear && (
+ <button
+ class="button is-danger"
+ onClick={onClear}
+ disabled={onClear === undefined}
+ >
+ <Translate>Set external authorization</Translate>
+ </button>
+ )}
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button class="button " onClick={onCancel}>
+ <Translate>Cancel</Translate>
+ </button>
+ <button
+ class="button is-info"
+ onClick={() => onConfirm(form.new_token!)}
+ disabled={hasErrors}
+ >
+ <Translate>Set access token</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
export function LoadingModal({ onCancel }: { onCancel: () => void }): VNode {
- const i18n = useTranslator()
- return <div class="modal is-active">
- <div class="modal-background " onClick={onCancel} />
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title"><Translate>Operation in progress...</Translate></p>
- </header>
- <section class="modal-card-body">
- <div class="columns">
- <div class="column" />
- <Spinner />
- <div class="column" />
- </div>
- <p>{i18n`The operation will be automatically canceled after ${DEFAULT_REQUEST_TIMEOUT} seconds`}</p>
- </section>
- <footer class="modal-card-foot">
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button " onClick={onCancel} ><Translate>Cancel</Translate></button>
- </div>
- </footer>
+ const i18n = useTranslator();
+ return (
+ <div class="modal is-active">
+ <div class="modal-background " onClick={onCancel} />
+ <div class="modal-card">
+ <header class="modal-card-head">
+ <p class="modal-card-title">
+ <Translate>Operation in progress...</Translate>
+ </p>
+ </header>
+ <section class="modal-card-body">
+ <div class="columns">
+ <div class="column" />
+ <Spinner />
+ <div class="column" />
+ </div>
+ <p>{i18n`The operation will be automatically canceled after ${DEFAULT_REQUEST_TIMEOUT} seconds`}</p>
+ </section>
+ <footer class="modal-card-foot">
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button class="button " onClick={onCancel}>
+ <Translate>Cancel</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={onCancel}
+ />
</div>
- <button class="modal-close is-large " aria-label="close" onClick={onCancel} />
- </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/notifications/CreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/components/notifications/CreatedSuccessfully.tsx
index 4089f2222..073382fb1 100644
--- a/packages/merchant-backoffice-ui/src/components/notifications/CreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/components/notifications/CreatedSuccessfully.tsx
@@ -14,9 +14,9 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { ComponentChildren, h, VNode } from "preact";
interface Props {
@@ -25,25 +25,33 @@ interface Props {
children: ComponentChildren;
}
-export function CreatedSuccessfully({ children, onConfirm, onCreateAnother }: Props): VNode {
- return <div class="columns is-fullwidth is-vcentered mt-3">
- <div class="column" />
- <div class="column is-four-fifths">
- <div class="card">
- <header class="card-header has-background-success">
- <p class="card-header-title has-text-white-ter">
- Success.
- </p>
- </header>
- <div class="card-content">
- {children}
+export function CreatedSuccessfully({
+ children,
+ onConfirm,
+ onCreateAnother,
+}: Props): VNode {
+ return (
+ <div class="columns is-fullwidth is-vcentered mt-3">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <div class="card">
+ <header class="card-header has-background-success">
+ <p class="card-header-title has-text-white-ter">Success.</p>
+ </header>
+ <div class="card-content">{children}</div>
</div>
- </div>
<div class="buttons is-right">
- {onCreateAnother && <button class="button is-info" onClick={onCreateAnother}>Create another</button>}
- <button class="button is-info" onClick={onConfirm}>Continue</button>
+ {onCreateAnother && (
+ <button class="button is-info" onClick={onCreateAnother}>
+ Create another
+ </button>
+ )}
+ <button class="button is-info" onClick={onConfirm}>
+ Continue
+ </button>
</div>
+ </div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx b/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
index 8bc6818b7..af594de0f 100644
--- a/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
@@ -15,43 +15,48 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h } from 'preact';
+import { h } from "preact";
import { Notifications } from "./index.js";
-
export default {
- title: 'Components/Notification',
+ title: "Components/Notification",
component: Notifications,
argTypes: {
- removeNotification: { action: 'removeNotification' },
+ removeNotification: { action: "removeNotification" },
},
};
export const Info = (a: any) => <Notifications {...a} />;
Info.args = {
- notifications: [{
- message: 'Title',
- description: 'Some large description',
- type: 'INFO',
- }]
-}
+ notifications: [
+ {
+ message: "Title",
+ description: "Some large description",
+ type: "INFO",
+ },
+ ],
+};
export const Warn = (a: any) => <Notifications {...a} />;
Warn.args = {
- notifications: [{
- message: 'Title',
- description: 'Some large description',
- type: 'WARN',
- }]
-}
+ notifications: [
+ {
+ message: "Title",
+ description: "Some large description",
+ type: "WARN",
+ },
+ ],
+};
export const Error = (a: any) => <Notifications {...a} />;
Error.args = {
- notifications: [{
- message: 'Title',
- description: 'Some large description',
- type: 'ERROR',
- }]
-}
+ notifications: [
+ {
+ message: "Title",
+ description: "Some large description",
+ type: "ERROR",
+ },
+ ],
+};
diff --git a/packages/merchant-backoffice-ui/src/components/notifications/index.tsx b/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
index 7c4ab7e2d..235c75577 100644
--- a/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
+++ b/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { MessageType, Notification } from "../../utils/types.js";
@@ -29,24 +29,37 @@ interface Props {
function messageStyle(type: MessageType): string {
switch (type) {
- case "INFO": return "message is-info";
- case "WARN": return "message is-warning";
- case "ERROR": return "message is-danger";
- case "SUCCESS": return "message is-success";
- default: return "message"
+ case "INFO":
+ return "message is-info";
+ case "WARN":
+ return "message is-warning";
+ case "ERROR":
+ return "message is-danger";
+ case "SUCCESS":
+ return "message is-success";
+ default:
+ return "message";
}
}
-export function Notifications({ notifications, removeNotification }: Props): VNode {
- return <div class="toast">
- {notifications.map((n,i) => <article key={i} class={messageStyle(n.type)}>
- <div class="message-header">
- <p>{n.message}</p>
- <button class="delete" onClick={() => removeNotification && removeNotification(n)} />
- </div>
- {n.description && <div class="message-body">
- {n.description}
- </div>}
- </article>)}
- </div>
-} \ No newline at end of file
+export function Notifications({
+ notifications,
+ removeNotification,
+}: Props): VNode {
+ return (
+ <div class="toast">
+ {notifications.map((n, i) => (
+ <article key={i} class={messageStyle(n.type)}>
+ <div class="message-header">
+ <p>{n.message}</p>
+ <button
+ class="delete"
+ onClick={() => removeNotification && removeNotification(n)}
+ />
+ </div>
+ {n.description && <div class="message-body">{n.description}</div>}
+ </article>
+ ))}
+ </div>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/components/picker/DatePicker.tsx b/packages/merchant-backoffice-ui/src/components/picker/DatePicker.tsx
index 79b4fa5b1..0bc629d46 100644
--- a/packages/merchant-backoffice-ui/src/components/picker/DatePicker.tsx
+++ b/packages/merchant-backoffice-ui/src/components/picker/DatePicker.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, Component } from "preact";
@@ -35,36 +35,33 @@ interface State {
// inspired by https://codepen.io/m4r1vs/pen/MOOxyE
export class DatePicker extends Component<Props, State> {
-
closeDatePicker() {
this.props.closeFunction && this.props.closeFunction(); // Function gets passed by parent
}
/**
- * Gets fired when a day gets clicked.
- * @param {object} e The event thrown by the <span /> element clicked
- */
+ * Gets fired when a day gets clicked.
+ * @param {object} e The event thrown by the <span /> element clicked
+ */
dayClicked(e: any) {
-
const element = e.target; // the actual element clicked
- if (element.innerHTML === '') return false; // don't continue if <span /> empty
+ if (element.innerHTML === "") return false; // don't continue if <span /> empty
// get date from clicked element (gets attached when rendered)
- const date = new Date(element.getAttribute('data-value'));
+ const date = new Date(element.getAttribute("data-value"));
// update the state
this.setState({ currentDate: date });
- this.passDateToParent(date)
+ this.passDateToParent(date);
}
/**
- * returns days in month as array
- * @param {number} month the month to display
- * @param {number} year the year to display
- */
+ * returns days in month as array
+ * @param {number} month the month to display
+ * @param {number} year the year to display
+ */
getDaysByMonth(month: number, year: number) {
-
const calendar = [];
const date = new Date(year, month, 1); // month to display
@@ -76,15 +73,17 @@ export class DatePicker extends Component<Props, State> {
// the calendar is 7*6 fields big, so 42 loops
for (let i = 0; i < 42; i++) {
-
if (i >= firstDay && day !== null) day = day + 1;
if (day !== null && day > lastDate) day = null;
// append the calendar Array
calendar.push({
- day: (day === 0 || day === null) ? null : day, // null or number
- date: (day === 0 || day === null) ? null : new Date(year, month, day), // null or Date()
- today: (day === now.getDate() && month === now.getMonth() && year === now.getFullYear()) // boolean
+ day: day === 0 || day === null ? null : day, // null or number
+ date: day === 0 || day === null ? null : new Date(year, month, day), // null or Date()
+ today:
+ day === now.getDate() &&
+ month === now.getMonth() &&
+ year === now.getFullYear(), // boolean
});
}
@@ -92,51 +91,48 @@ export class DatePicker extends Component<Props, State> {
}
/**
- * Display previous month by updating state
- */
+ * Display previous month by updating state
+ */
displayPrevMonth() {
if (this.state.displayedMonth <= 0) {
this.setState({
displayedMonth: 11,
- displayedYear: this.state.displayedYear - 1
+ displayedYear: this.state.displayedYear - 1,
});
- }
- else {
+ } else {
this.setState({
- displayedMonth: this.state.displayedMonth - 1
+ displayedMonth: this.state.displayedMonth - 1,
});
}
}
/**
- * Display next month by updating state
- */
+ * Display next month by updating state
+ */
displayNextMonth() {
if (this.state.displayedMonth >= 11) {
this.setState({
displayedMonth: 0,
- displayedYear: this.state.displayedYear + 1
+ displayedYear: this.state.displayedYear + 1,
});
- }
- else {
+ } else {
this.setState({
- displayedMonth: this.state.displayedMonth + 1
+ displayedMonth: this.state.displayedMonth + 1,
});
}
}
/**
- * Display the selected month (gets fired when clicking on the date string)
- */
+ * Display the selected month (gets fired when clicking on the date string)
+ */
displaySelectedMonth() {
if (this.state.selectYearMode) {
this.toggleYearSelector();
- }
- else {
+ } else {
if (!this.state.currentDate) return false;
this.setState({
displayedMonth: this.state.currentDate.getMonth(),
- displayedYear: this.state.currentDate.getFullYear()
+ displayedYear: this.state.currentDate.getFullYear(),
});
}
}
@@ -148,23 +144,27 @@ export class DatePicker extends Component<Props, State> {
changeDisplayedYear(e: any) {
const element = e.target;
this.toggleYearSelector();
- this.setState({ displayedYear: parseInt(element.innerHTML, 10), displayedMonth: 0 });
+ this.setState({
+ displayedYear: parseInt(element.innerHTML, 10),
+ displayedMonth: 0,
+ });
}
/**
- * Pass the selected date to parent when 'OK' is clicked
- */
+ * Pass the selected date to parent when 'OK' is clicked
+ */
passSavedDateDateToParent() {
- this.passDateToParent(this.state.currentDate)
+ this.passDateToParent(this.state.currentDate);
}
passDateToParent(date: Date) {
- if (typeof this.props.dateReceiver === 'function') this.props.dateReceiver(date);
+ if (typeof this.props.dateReceiver === "function")
+ this.props.dateReceiver(date);
this.closeDatePicker();
}
componentDidUpdate() {
if (this.state.selectYearMode) {
- document.getElementsByClassName('selected')[0].scrollIntoView(); // works in every browser incl. IE, replace with scrollIntoViewIfNeeded when browsers support it
+ document.getElementsByClassName("selected")[0].scrollIntoView(); // works in every browser incl. IE, replace with scrollIntoViewIfNeeded when browsers support it
}
}
@@ -181,143 +181,168 @@ export class DatePicker extends Component<Props, State> {
this.toggleYearSelector = this.toggleYearSelector.bind(this);
this.displaySelectedMonth = this.displaySelectedMonth.bind(this);
-
this.state = {
currentDate: now,
displayedMonth: now.getMonth(),
displayedYear: now.getFullYear(),
- selectYearMode: false
- }
+ selectYearMode: false,
+ };
}
render() {
-
- const { currentDate, displayedMonth, displayedYear, selectYearMode } = this.state;
+ const { currentDate, displayedMonth, displayedYear, selectYearMode } =
+ this.state;
return (
<div>
- <div class={`datePicker ${ this.props.opened && "datePicker--opened"}`} >
-
+ <div class={`datePicker ${this.props.opened && "datePicker--opened"}`}>
<div class="datePicker--titles">
- <h3 style={{
- color: selectYearMode ? 'rgba(255,255,255,.87)' : 'rgba(255,255,255,.57)'
- }} onClick={this.toggleYearSelector}>{currentDate.getFullYear()}</h3>
- <h2 style={{
- color: !selectYearMode ? 'rgba(255,255,255,.87)' : 'rgba(255,255,255,.57)'
- }} onClick={this.displaySelectedMonth}>
- {dayArr[currentDate.getDay()]}, {monthArrShort[currentDate.getMonth()]} {currentDate.getDate()}
+ <h3
+ style={{
+ color: selectYearMode
+ ? "rgba(255,255,255,.87)"
+ : "rgba(255,255,255,.57)",
+ }}
+ onClick={this.toggleYearSelector}
+ >
+ {currentDate.getFullYear()}
+ </h3>
+ <h2
+ style={{
+ color: !selectYearMode
+ ? "rgba(255,255,255,.87)"
+ : "rgba(255,255,255,.57)",
+ }}
+ onClick={this.displaySelectedMonth}
+ >
+ {dayArr[currentDate.getDay()]},{" "}
+ {monthArrShort[currentDate.getMonth()]} {currentDate.getDate()}
</h2>
</div>
- {!selectYearMode && <nav>
- <span onClick={this.displayPrevMonth} class="icon"><i style={{ transform: 'rotate(180deg)' }} class="mdi mdi-forward" /></span>
- <h4>{monthArrShortFull[displayedMonth]} {displayedYear}</h4>
- <span onClick={this.displayNextMonth} class="icon"><i class="mdi mdi-forward" /></span>
- </nav>}
+ {!selectYearMode && (
+ <nav>
+ <span onClick={this.displayPrevMonth} class="icon">
+ <i
+ style={{ transform: "rotate(180deg)" }}
+ class="mdi mdi-forward"
+ />
+ </span>
+ <h4>
+ {monthArrShortFull[displayedMonth]} {displayedYear}
+ </h4>
+ <span onClick={this.displayNextMonth} class="icon">
+ <i class="mdi mdi-forward" />
+ </span>
+ </nav>
+ )}
<div class="datePicker--scroll">
-
- {!selectYearMode && <div class="datePicker--calendar" >
-
- <div class="datePicker--dayNames">
- {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day,i) => <span key={i}>{day}</span>)}
- </div>
-
- <div onClick={this.dayClicked} class="datePicker--days">
-
- {/*
+ {!selectYearMode && (
+ <div class="datePicker--calendar">
+ <div class="datePicker--dayNames">
+ {["S", "M", "T", "W", "T", "F", "S"].map((day, i) => (
+ <span key={i}>{day}</span>
+ ))}
+ </div>
+
+ <div onClick={this.dayClicked} class="datePicker--days">
+ {/*
Loop through the calendar object returned by getDaysByMonth().
*/}
- {this.getDaysByMonth(this.state.displayedMonth, this.state.displayedYear)
- .map(
- day => {
- let selected = false;
-
- if (currentDate && day.date) selected = (currentDate.toLocaleDateString() === day.date.toLocaleDateString());
-
- return (<span key={day.day}
- class={(day.today ? 'datePicker--today ' : '') + (selected ? 'datePicker--selected' : '')}
+ {this.getDaysByMonth(
+ this.state.displayedMonth,
+ this.state.displayedYear,
+ ).map((day) => {
+ let selected = false;
+
+ if (currentDate && day.date)
+ selected =
+ currentDate.toLocaleDateString() ===
+ day.date.toLocaleDateString();
+
+ return (
+ <span
+ key={day.day}
+ class={
+ (day.today ? "datePicker--today " : "") +
+ (selected ? "datePicker--selected" : "")
+ }
disabled={!day.date}
data-value={day.date}
>
{day.day}
- </span>)
- }
- )
- }
-
+ </span>
+ );
+ })}
+ </div>
</div>
-
- </div>}
-
- {selectYearMode && <div class="datePicker--selectYear">
-
- {yearArr.map(year => (
- <span key={year} class={(year === displayedYear) ? 'selected' : ''} onClick={this.changeDisplayedYear}>
- {year}
- </span>
- ))}
-
- </div>}
-
+ )}
+
+ {selectYearMode && (
+ <div class="datePicker--selectYear">
+ {yearArr.map((year) => (
+ <span
+ key={year}
+ class={year === displayedYear ? "selected" : ""}
+ onClick={this.changeDisplayedYear}
+ >
+ {year}
+ </span>
+ ))}
+ </div>
+ )}
</div>
</div>
- <div class="datePicker--background" onClick={this.closeDatePicker} style={{
- display: this.props.opened ? 'block' : 'none'
- }}
+ <div
+ class="datePicker--background"
+ onClick={this.closeDatePicker}
+ style={{
+ display: this.props.opened ? "block" : "none",
+ }}
/>
-
</div>
- )
+ );
}
}
-
const monthArrShortFull = [
- 'January',
- 'February',
- 'March',
- 'April',
- 'May',
- 'June',
- 'July',
- 'August',
- 'September',
- 'October',
- 'November',
- 'December'
-]
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December",
+];
const monthArrShort = [
- 'Jan',
- 'Feb',
- 'Mar',
- 'Apr',
- 'May',
- 'Jun',
- 'Jul',
- 'Aug',
- 'Sep',
- 'Oct',
- 'Nov',
- 'Dec'
-]
-
-const dayArr = [
- 'Sun',
- 'Mon',
- 'Tue',
- 'Wed',
- 'Thu',
- 'Fri',
- 'Sat'
-]
-
-const now = new Date()
-
-const yearArr: number[] = []
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+];
+
+const dayArr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
+
+const now = new Date();
+
+const yearArr: number[] = [];
for (let i = 2010; i <= now.getFullYear() + 10; i++) {
yearArr.push(i);
diff --git a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
index 888bf17b0..8f74d55ac 100644
--- a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
@@ -15,36 +15,41 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, FunctionalComponent } from 'preact';
-import { useState } from 'preact/hooks';
+import { h, FunctionalComponent } from "preact";
+import { useState } from "preact/hooks";
import { DurationPicker as TestedComponent } from "./DurationPicker.js";
-
export default {
- title: 'Components/Picker/Duration',
+ title: "Components/Picker/Duration",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- goBack: { action: 'goBack' },
- }
+ onCreate: { action: "onCreate" },
+ goBack: { action: "goBack" },
+ },
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
export const Example = createExample(TestedComponent, {
- days: true, minutes: true, hours: true, seconds: true,
- value: 10000000
+ days: true,
+ minutes: true,
+ hours: true,
+ seconds: true,
+ value: 10000000,
});
export const WithState = () => {
- const [v,s] = useState<number>(1000000)
- return <TestedComponent value={v} onChange={s} days minutes hours seconds />
-}
+ const [v, s] = useState<number>(1000000);
+ return <TestedComponent value={v} onChange={s} days minutes hours seconds />;
+};
diff --git a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
index 68bf7e438..2d5a54cde 100644
--- a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
@@ -15,44 +15,48 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { InventoryProductForm as TestedComponent } from "./InventoryProductForm.js";
-
export default {
- title: 'Components/Product/Add',
+ title: "Components/Product/Add",
component: TestedComponent,
argTypes: {
- onAddProduct: { action: 'onAddProduct' },
+ onAddProduct: { action: "onAddProduct" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
export const WithASimpleList = createExample(TestedComponent, {
- inventory:[{
- id: 'this id',
- description: 'this is the description',
- } as any]
+ inventory: [
+ {
+ id: "this id",
+ description: "this is the description",
+ } as any,
+ ],
});
export const WithAProductSelected = createExample(TestedComponent, {
- inventory:[],
+ inventory: [],
currentProducts: {
thisid: {
quantity: 1,
product: {
- id: 'asd',
- description: 'asdsadsad',
- } as any
- }
- }
+ id: "asd",
+ description: "asdsadsad",
+ } as any,
+ },
+ },
});
diff --git a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
index e44044372..da47f1be3 100644
--- a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
@@ -23,24 +23,32 @@ import { Translate, useTranslator } from "../../i18n/index.js";
import { ProductMap } from "../../paths/instance/orders/create/CreatePage.js";
type Form = {
- product: MerchantBackend.Products.ProductDetail & WithId,
+ product: MerchantBackend.Products.ProductDetail & WithId;
quantity: number;
-}
+};
interface Props {
- currentProducts: ProductMap,
- onAddProduct: (product: MerchantBackend.Products.ProductDetail & WithId, quantity: number) => void,
- inventory: (MerchantBackend.Products.ProductDetail & WithId)[],
+ currentProducts: ProductMap;
+ onAddProduct: (
+ product: MerchantBackend.Products.ProductDetail & WithId,
+ quantity: number,
+ ) => void;
+ inventory: (MerchantBackend.Products.ProductDetail & WithId)[];
}
-export function InventoryProductForm({ currentProducts, onAddProduct, inventory }: Props): VNode {
- const initialState = { quantity: 1 }
- const [state, setState] = useState<Partial<Form>>(initialState)
- const [errors, setErrors] = useState<FormErrors<Form>>({})
+export function InventoryProductForm({
+ currentProducts,
+ onAddProduct,
+ inventory,
+}: Props): VNode {
+ const initialState = { quantity: 1 };
+ const [state, setState] = useState<Partial<Form>>(initialState);
+ const [errors, setErrors] = useState<FormErrors<Form>>({});
- const i18n = useTranslator()
+ const i18n = useTranslator();
- const productWithInfiniteStock = state.product && state.product.total_stock === -1
+ const productWithInfiniteStock =
+ state.product && state.product.total_stock === -1;
const submit = (): void => {
if (!state.product) {
@@ -48,48 +56,68 @@ export function InventoryProductForm({ currentProducts, onAddProduct, inventory
return;
}
if (productWithInfiniteStock) {
- onAddProduct(state.product, 1)
+ onAddProduct(state.product, 1);
} else {
if (!state.quantity || state.quantity <= 0) {
setErrors({ quantity: i18n`Quantity must be greater than 0!` });
return;
}
- const currentStock = state.product.total_stock - state.product.total_lost - state.product.total_sold
- const p = currentProducts[state.product.id]
+ const currentStock =
+ state.product.total_stock -
+ state.product.total_lost -
+ state.product.total_sold;
+ const p = currentProducts[state.product.id];
if (p) {
if (state.quantity + p.quantity > currentStock) {
const left = currentStock - p.quantity;
- setErrors({ quantity: i18n`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.` });
+ setErrors({
+ quantity: i18n`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.`,
+ });
return;
}
- onAddProduct(state.product, state.quantity + p.quantity)
+ onAddProduct(state.product, state.quantity + p.quantity);
} else {
if (state.quantity > currentStock) {
const left = currentStock;
- setErrors({ quantity: i18n`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.` });
+ setErrors({
+ quantity: i18n`This quantity exceeds remaining stock. Currently, only ${left} units remain unreserved in stock.`,
+ });
return;
}
- onAddProduct(state.product, state.quantity)
+ onAddProduct(state.product, state.quantity);
}
}
- setState(initialState)
- }
+ setState(initialState);
+ };
- return <FormProvider<Form> errors={errors} object={state} valueHandler={setState}>
- <InputSearchProduct selected={state.product} onChange={(p) => setState(v => ({ ...v, product: p }))} products={inventory} />
- { state.product && <div class="columns mt-5">
- <div class="column is-two-thirds">
- {!productWithInfiniteStock &&
- <InputNumber<Form> name="quantity" label={i18n`Quantity`} tooltip={i18n`how many products will be added`} />
- }
- </div>
- <div class="column">
- <div class="buttons is-right">
- <button class="button is-success" onClick={submit}><Translate>Add from inventory</Translate></button>
+ return (
+ <FormProvider<Form> errors={errors} object={state} valueHandler={setState}>
+ <InputSearchProduct
+ selected={state.product}
+ onChange={(p) => setState((v) => ({ ...v, product: p }))}
+ products={inventory}
+ />
+ {state.product && (
+ <div class="columns mt-5">
+ <div class="column is-two-thirds">
+ {!productWithInfiniteStock && (
+ <InputNumber<Form>
+ name="quantity"
+ label={i18n`Quantity`}
+ tooltip={i18n`how many products will be added`}
+ />
+ )}
+ </div>
+ <div class="column">
+ <div class="buttons is-right">
+ <button class="button is-success" onClick={submit}>
+ <Translate>Add from inventory</Translate>
+ </button>
+ </div>
+ </div>
</div>
- </div>
- </div> }
-
- </FormProvider>
+ )}
+ </FormProvider>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
index b468a4e86..fe9692c02 100644
--- a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
@@ -15,7 +15,7 @@
*/
import { Fragment, h, VNode } from "preact";
import { useCallback, useEffect, useState } from "preact/hooks";
-import * as yup from 'yup';
+import * as yup from "yup";
import { FormErrors, FormProvider } from "../form/FormProvider.js";
import { Input } from "../form/Input.js";
import { InputCurrency } from "../form/InputCurrency.js";
@@ -25,67 +25,104 @@ import { InputTaxes } from "../form/InputTaxes.js";
import { MerchantBackend } from "../../declaration.js";
import { useListener } from "../../hooks/listener.js";
import { Translate, useTranslator } from "../../i18n/index.js";
-import {
- NonInventoryProductSchema as schema
-} from "../../schemas/index.js";
+import { NonInventoryProductSchema as schema } from "../../schemas/index.js";
-
-type Entity = MerchantBackend.Product
+type Entity = MerchantBackend.Product;
interface Props {
onAddProduct: (p: Entity) => Promise<void>;
productToEdit?: Entity;
}
-export function NonInventoryProductFrom({ productToEdit, onAddProduct }: Props): VNode {
- const [showCreateProduct, setShowCreateProduct] = useState(false)
+export function NonInventoryProductFrom({
+ productToEdit,
+ onAddProduct,
+}: Props): VNode {
+ const [showCreateProduct, setShowCreateProduct] = useState(false);
- const isEditing = !!productToEdit
+ const isEditing = !!productToEdit;
useEffect(() => {
- setShowCreateProduct(isEditing)
- }, [isEditing])
+ setShowCreateProduct(isEditing);
+ }, [isEditing]);
- const [submitForm, addFormSubmitter] = useListener<Partial<MerchantBackend.Product> | undefined>((result) => {
+ const [submitForm, addFormSubmitter] = useListener<
+ Partial<MerchantBackend.Product> | undefined
+ >((result) => {
if (result) {
- setShowCreateProduct(false)
+ setShowCreateProduct(false);
return onAddProduct({
quantity: result.quantity || 0,
taxes: result.taxes || [],
- description: result.description || '',
- image: result.image || '',
- price: result.price || '',
- unit: result.unit || ''
- })
+ description: result.description || "",
+ image: result.image || "",
+ price: result.price || "",
+ unit: result.unit || "",
+ });
}
- return Promise.resolve()
- })
-
- const i18n = useTranslator()
-
- return <Fragment>
- <div class="buttons">
- <button class="button is-success" data-tooltip={i18n`describe and add a product that is not in the inventory list`} onClick={() => setShowCreateProduct(true)} ><Translate>Add custom product</Translate></button>
- </div>
- {showCreateProduct && <div class="modal is-active">
- <div class="modal-background " onClick={() => setShowCreateProduct(false)} />
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title">{i18n`Complete information of the product`}</p>
- <button class="delete " aria-label="close" onClick={() => setShowCreateProduct(false)} />
- </header>
- <section class="modal-card-body">
- <ProductForm initial={productToEdit} onSubscribe={addFormSubmitter} />
- </section>
- <footer class="modal-card-foot">
- <div class="buttons is-right" style={{ width: '100%' }}>
- <button class="button " onClick={() => setShowCreateProduct(false)} ><Translate>Cancel</Translate></button>
- <button class="button is-info " disabled={!submitForm} onClick={submitForm} ><Translate>Confirm</Translate></button>
- </div>
- </footer>
+ return Promise.resolve();
+ });
+
+ const i18n = useTranslator();
+
+ return (
+ <Fragment>
+ <div class="buttons">
+ <button
+ class="button is-success"
+ data-tooltip={i18n`describe and add a product that is not in the inventory list`}
+ onClick={() => setShowCreateProduct(true)}
+ >
+ <Translate>Add custom product</Translate>
+ </button>
</div>
- <button class="modal-close is-large " aria-label="close" onClick={() => setShowCreateProduct(false)} />
- </div>}
- </Fragment>
+ {showCreateProduct && (
+ <div class="modal is-active">
+ <div
+ class="modal-background "
+ onClick={() => setShowCreateProduct(false)}
+ />
+ <div class="modal-card">
+ <header class="modal-card-head">
+ <p class="modal-card-title">{i18n`Complete information of the product`}</p>
+ <button
+ class="delete "
+ aria-label="close"
+ onClick={() => setShowCreateProduct(false)}
+ />
+ </header>
+ <section class="modal-card-body">
+ <ProductForm
+ initial={productToEdit}
+ onSubscribe={addFormSubmitter}
+ />
+ </section>
+ <footer class="modal-card-foot">
+ <div class="buttons is-right" style={{ width: "100%" }}>
+ <button
+ class="button "
+ onClick={() => setShowCreateProduct(false)}
+ >
+ <Translate>Cancel</Translate>
+ </button>
+ <button
+ class="button is-info "
+ disabled={!submitForm}
+ onClick={submitForm}
+ >
+ <Translate>Confirm</Translate>
+ </button>
+ </div>
+ </footer>
+ </div>
+ <button
+ class="modal-close is-large "
+ aria-label="close"
+ onClick={() => setShowCreateProduct(false)}
+ />
+ </div>
+ )}
+ </Fragment>
+ );
}
interface ProductProps {
@@ -106,41 +143,73 @@ export function ProductForm({ onSubscribe, initial }: ProductProps): VNode {
const [value, valueHandler] = useState<Partial<NonInventoryProduct>>({
taxes: [],
...initial,
- })
- let errors: FormErrors<Entity> = {}
+ });
+ let errors: FormErrors<Entity> = {};
try {
- schema.validateSync(value, { abortEarly: false })
+ schema.validateSync(value, { abortEarly: false });
} catch (err) {
if (err instanceof yup.ValidationError) {
- const yupErrors = err.inner as yup.ValidationError[]
- errors = yupErrors.reduce((prev, cur) => !cur.path ? prev : ({ ...prev, [cur.path]: cur.message }), {})
+ const yupErrors = err.inner as yup.ValidationError[];
+ errors = yupErrors.reduce(
+ (prev, cur) =>
+ !cur.path ? prev : { ...prev, [cur.path]: cur.message },
+ {},
+ );
}
}
const submit = useCallback((): Entity | undefined => {
- return value as MerchantBackend.Product
- }, [value])
+ return value as MerchantBackend.Product;
+ }, [value]);
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
useEffect(() => {
- onSubscribe(hasErrors ? undefined : submit)
- }, [submit, hasErrors])
-
- const i18n = useTranslator()
-
- return <div>
- <FormProvider<NonInventoryProduct> name="product" errors={errors} object={value} valueHandler={valueHandler} >
-
- <InputImage<NonInventoryProduct> name="image" label={i18n`Image`} tooltip={i18n`photo of the product`} />
- <Input<NonInventoryProduct> name="description" inputType="multiline" label={i18n`Description`} tooltip={i18n`full product description`} />
- <Input<NonInventoryProduct> name="unit" label={i18n`Unit`} tooltip={i18n`name of the product unit`} />
- <InputCurrency<NonInventoryProduct> name="price" label={i18n`Price`} tooltip={i18n`amount in the current currency`} />
-
- <InputNumber<NonInventoryProduct> name="quantity" label={i18n`Quantity`} tooltip={i18n`how many products will be added`} />
-
- <InputTaxes<NonInventoryProduct> name="taxes" label={i18n`Taxes`} />
-
- </FormProvider>
- </div>
+ onSubscribe(hasErrors ? undefined : submit);
+ }, [submit, hasErrors]);
+
+ const i18n = useTranslator();
+
+ return (
+ <div>
+ <FormProvider<NonInventoryProduct>
+ name="product"
+ errors={errors}
+ object={value}
+ valueHandler={valueHandler}
+ >
+ <InputImage<NonInventoryProduct>
+ name="image"
+ label={i18n`Image`}
+ tooltip={i18n`photo of the product`}
+ />
+ <Input<NonInventoryProduct>
+ name="description"
+ inputType="multiline"
+ label={i18n`Description`}
+ tooltip={i18n`full product description`}
+ />
+ <Input<NonInventoryProduct>
+ name="unit"
+ label={i18n`Unit`}
+ tooltip={i18n`name of the product unit`}
+ />
+ <InputCurrency<NonInventoryProduct>
+ name="price"
+ label={i18n`Price`}
+ tooltip={i18n`amount in the current currency`}
+ />
+
+ <InputNumber<NonInventoryProduct>
+ name="quantity"
+ label={i18n`Quantity`}
+ tooltip={i18n`how many products will be added`}
+ />
+
+ <InputTaxes<NonInventoryProduct> name="taxes" label={i18n`Taxes`} />
+ </FormProvider>
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
index c078e7cee..a6bb090a5 100644
--- a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
@@ -77,12 +77,12 @@ export function ProductForm({ onSubscribe, initial, alreadyExist }: Props) {
errors = yupErrors.reduce(
(prev, cur) =>
!cur.path ? prev : { ...prev, [cur.path]: cur.message },
- {}
+ {},
);
}
}
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const submit = useCallback((): Entity | undefined => {
diff --git a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
index d8b0104ea..774da8975 100644
--- a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
@@ -59,8 +59,8 @@ export function ProductList({ list, actions = [] }: Props): VNode {
: Amounts.stringify(
Amounts.mult(
Amounts.parseOrThrow(entry.price),
- entry.quantity
- ).amount
+ entry.quantity,
+ ).amount,
);
return (
diff --git a/packages/merchant-backoffice-ui/src/context/backend.ts b/packages/merchant-backoffice-ui/src/context/backend.ts
index 1d11a3aad..f8d1bc397 100644
--- a/packages/merchant-backoffice-ui/src/context/backend.ts
+++ b/packages/merchant-backoffice-ui/src/context/backend.ts
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { createContext, h, VNode } from 'preact'
-import { useCallback, useContext, useState } from 'preact/hooks'
+import { createContext, h, VNode } from "preact";
+import { useCallback, useContext, useState } from "preact/hooks";
import { useBackendDefaultToken, useBackendURL } from "../hooks/index.js";
interface BackendContextType {
@@ -34,49 +34,76 @@ interface BackendContextType {
}
const BackendContext = createContext<BackendContextType>({
- url: '',
+ url: "",
token: undefined,
triedToLog: false,
resetBackend: () => null,
clearAllTokens: () => null,
addTokenCleaner: () => null,
updateLoginStatus: () => null,
-})
-
-function useBackendContextState(defaultUrl?: string, initialToken?: string): BackendContextType {
- const [url, triedToLog, changeBackend, resetBackend] = useBackendURL(defaultUrl);
+});
+
+function useBackendContextState(
+ defaultUrl?: string,
+ initialToken?: string,
+): BackendContextType {
+ const [url, triedToLog, changeBackend, resetBackend] =
+ useBackendURL(defaultUrl);
const [token, _updateToken] = useBackendDefaultToken(initialToken);
const updateToken = (t?: string) => {
- _updateToken(t)
- }
+ _updateToken(t);
+ };
- const tokenCleaner = useCallback(() => { updateToken(undefined) }, [])
- const [cleaners, setCleaners] = useState([tokenCleaner])
- const addTokenCleaner = (c: () => void) => setCleaners(cs => [...cs, c])
- const addTokenCleanerMemo = useCallback((c: () => void) => { addTokenCleaner(c) }, [tokenCleaner])
+ const tokenCleaner = useCallback(() => {
+ updateToken(undefined);
+ }, []);
+ const [cleaners, setCleaners] = useState([tokenCleaner]);
+ const addTokenCleaner = (c: () => void) => setCleaners((cs) => [...cs, c]);
+ const addTokenCleanerMemo = useCallback(
+ (c: () => void) => {
+ addTokenCleaner(c);
+ },
+ [tokenCleaner],
+ );
const clearAllTokens = () => {
- cleaners.forEach(c => c())
+ cleaners.forEach((c) => c());
for (let i = 0; i < localStorage.length; i++) {
- const k = localStorage.key(i)
- if (k && /^backend-token/.test(k)) localStorage.removeItem(k)
+ const k = localStorage.key(i);
+ if (k && /^backend-token/.test(k)) localStorage.removeItem(k);
}
- resetBackend()
- }
+ resetBackend();
+ };
const updateLoginStatus = (url: string, token?: string) => {
changeBackend(url);
if (token) updateToken(token);
};
-
- return { url, token, triedToLog, updateLoginStatus, resetBackend, clearAllTokens, addTokenCleaner: addTokenCleanerMemo }
+ return {
+ url,
+ token,
+ triedToLog,
+ updateLoginStatus,
+ resetBackend,
+ clearAllTokens,
+ addTokenCleaner: addTokenCleanerMemo,
+ };
}
-export const BackendContextProvider = ({ children, defaultUrl, initialToken }: { children: any, defaultUrl?: string, initialToken?: string }): VNode => {
- const value = useBackendContextState(defaultUrl, initialToken)
+export const BackendContextProvider = ({
+ children,
+ defaultUrl,
+ initialToken,
+}: {
+ children: any;
+ defaultUrl?: string;
+ initialToken?: string;
+}): VNode => {
+ const value = useBackendContextState(defaultUrl, initialToken);
return h(BackendContext.Provider, { value, children });
-}
+};
-export const useBackendContext = (): BackendContextType => useContext(BackendContext);
+export const useBackendContext = (): BackendContextType =>
+ useContext(BackendContext);
diff --git a/packages/merchant-backoffice-ui/src/context/config.ts b/packages/merchant-backoffice-ui/src/context/config.ts
index a0d530830..040bd0341 100644
--- a/packages/merchant-backoffice-ui/src/context/config.ts
+++ b/packages/merchant-backoffice-ui/src/context/config.ts
@@ -15,18 +15,18 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { createContext } from 'preact'
-import { useContext } from 'preact/hooks'
+import { createContext } from "preact";
+import { useContext } from "preact/hooks";
interface Type {
currency: string;
version: string;
}
-const Context = createContext<Type>(null!)
+const Context = createContext<Type>(null!);
-export const ConfigContextProvider = Context.Provider
+export const ConfigContextProvider = Context.Provider;
export const useConfigContext = (): Type => useContext(Context);
diff --git a/packages/merchant-backoffice-ui/src/context/instance.ts b/packages/merchant-backoffice-ui/src/context/instance.ts
index a45e8283c..9a25fe80c 100644
--- a/packages/merchant-backoffice-ui/src/context/instance.ts
+++ b/packages/merchant-backoffice-ui/src/context/instance.ts
@@ -15,21 +15,21 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { createContext } from 'preact'
-import { useContext } from 'preact/hooks'
+import { createContext } from "preact";
+import { useContext } from "preact/hooks";
interface Type {
id: string;
token?: string;
admin?: boolean;
- changeToken: (t?:string) => void;
+ changeToken: (t?: string) => void;
}
-const Context = createContext<Type>({} as any)
+const Context = createContext<Type>({} as any);
-export const InstanceContextProvider = Context.Provider
+export const InstanceContextProvider = Context.Provider;
export const useInstanceContext = (): Type => useContext(Context);
diff --git a/packages/merchant-backoffice-ui/src/context/listener.ts b/packages/merchant-backoffice-ui/src/context/listener.ts
index 097810273..cf51bb718 100644
--- a/packages/merchant-backoffice-ui/src/context/listener.ts
+++ b/packages/merchant-backoffice-ui/src/context/listener.ts
@@ -15,21 +15,21 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { createContext } from 'preact'
-import { useContext } from 'preact/hooks'
+import { createContext } from "preact";
+import { useContext } from "preact/hooks";
interface Type {
id: string;
token?: string;
admin?: boolean;
- changeToken: (t?:string) => void;
+ changeToken: (t?: string) => void;
}
-const Context = createContext<Type>({} as any)
+const Context = createContext<Type>({} as any);
-export const ListenerContextProvider = Context.Provider
+export const ListenerContextProvider = Context.Provider;
export const useListenerContext = (): Type => useContext(Context);
diff --git a/packages/merchant-backoffice-ui/src/context/translation.ts b/packages/merchant-backoffice-ui/src/context/translation.ts
index 88359a149..027eac14c 100644
--- a/packages/merchant-backoffice-ui/src/context/translation.ts
+++ b/packages/merchant-backoffice-ui/src/context/translation.ts
@@ -15,13 +15,13 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { createContext, h, VNode } from 'preact'
-import { useContext, useEffect } from 'preact/hooks'
-import { useLang } from '../hooks'
+import { createContext, h, VNode } from "preact";
+import { useContext, useEffect } from "preact/hooks";
+import { useLang } from "../hooks";
import * as jedLib from "jed";
import { strings } from "../i18n/strings";
@@ -31,29 +31,36 @@ interface Type {
changeLanguage: (l: string) => void;
}
const initial = {
- lang: 'en',
+ lang: "en",
handler: null,
changeLanguage: () => {
// do not change anything
- }
-}
-const Context = createContext<Type>(initial)
+ },
+};
+const Context = createContext<Type>(initial);
interface Props {
- initial?: string,
- children: any,
- forceLang?: string
+ initial?: string;
+ children: any;
+ forceLang?: string;
}
-export const TranslationProvider = ({ initial, children, forceLang }: Props): VNode => {
- const [lang, changeLanguage] = useLang(initial)
+export const TranslationProvider = ({
+ initial,
+ children,
+ forceLang,
+}: Props): VNode => {
+ const [lang, changeLanguage] = useLang(initial);
useEffect(() => {
if (forceLang) {
- changeLanguage(forceLang)
+ changeLanguage(forceLang);
}
- })
+ });
const handler = new jedLib.Jed(strings[lang]);
- return h(Context.Provider, { value: { lang, handler, changeLanguage }, children });
-}
+ return h(Context.Provider, {
+ value: { lang, handler, changeLanguage },
+ children,
+ });
+};
-export const useTranslationContext = (): Type => useContext(Context); \ No newline at end of file
+export const useTranslationContext = (): Type => useContext(Context);
diff --git a/packages/merchant-backoffice-ui/src/custom.d.ts b/packages/merchant-backoffice-ui/src/custom.d.ts
index e60fa0c83..e693c2951 100644
--- a/packages/merchant-backoffice-ui/src/custom.d.ts
+++ b/packages/merchant-backoffice-ui/src/custom.d.ts
@@ -13,11 +13,11 @@
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-declare module '*.po' {
+declare module "*.po" {
const content: any;
export default content;
}
-declare module 'jed' {
+declare module "jed" {
const x: any;
export = x;
}
@@ -29,12 +29,12 @@ declare module "*.png" {
const content: any;
export default content;
}
-declare module '*.svg' {
+declare module "*.svg" {
const content: any;
export default content;
}
-declare module '*.scss' {
+declare module "*.scss" {
const content: Record<string, string>;
export default content;
}
diff --git a/packages/merchant-backoffice-ui/src/declaration.d.ts b/packages/merchant-backoffice-ui/src/declaration.d.ts
index 7737c2cbc..75bc66201 100644
--- a/packages/merchant-backoffice-ui/src/declaration.d.ts
+++ b/packages/merchant-backoffice-ui/src/declaration.d.ts
@@ -15,10 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
-
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
type HashCode = string;
type EddsaPublicKey = string;
@@ -28,21 +27,21 @@ type RelativeTime = Duration;
type ImageDataUrl = string;
export interface WithId {
- id: string
+ id: string;
}
interface Timestamp {
- // Milliseconds since epoch, or the special
- // value "forever" to represent an event that will
- // never happen.
- t_s: number | "never";
+ // Milliseconds since epoch, or the special
+ // value "forever" to represent an event that will
+ // never happen.
+ t_s: number | "never";
}
interface Duration {
- d_us: number | "forever";
+ d_us: number | "forever";
}
interface WithId {
- id: string;
+ id: string;
}
type Amount = string;
@@ -50,1394 +49,1353 @@ type UUID = string;
type Integer = number;
export namespace ExchangeBackend {
- interface WireResponse {
-
- // Master public key of the exchange, must match the key returned in /keys.
- master_public_key: EddsaPublicKey;
-
- // Array of wire accounts operated by the exchange for
- // incoming wire transfers.
- accounts: WireAccount[];
-
- // Object mapping names of wire methods (i.e. "sepa" or "x-taler-bank")
- // to wire fees.
- fees: { method: AggregateTransferFee };
- }
- interface WireAccount {
- // payto:// URI identifying the account and wire method
- payto_uri: string;
-
- // Signature using the exchange's offline key
- // with purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS.
- master_sig: EddsaSignature;
- }
- interface AggregateTransferFee {
- // Per transfer wire transfer fee.
- wire_fee: Amount;
-
- // Per transfer closing fee.
- closing_fee: Amount;
-
- // What date (inclusive) does this fee go into effect?
- // The different fees must cover the full time period in which
- // any of the denomination keys are valid without overlap.
- start_date: Timestamp;
-
- // What date (exclusive) does this fee stop going into effect?
- // The different fees must cover the full time period in which
- // any of the denomination keys are valid without overlap.
- end_date: Timestamp;
-
- // Signature of TALER_MasterWireFeePS with
- // purpose TALER_SIGNATURE_MASTER_WIRE_FEES.
- sig: EddsaSignature;
- }
-
+ interface WireResponse {
+ // Master public key of the exchange, must match the key returned in /keys.
+ master_public_key: EddsaPublicKey;
+
+ // Array of wire accounts operated by the exchange for
+ // incoming wire transfers.
+ accounts: WireAccount[];
+
+ // Object mapping names of wire methods (i.e. "sepa" or "x-taler-bank")
+ // to wire fees.
+ fees: { method: AggregateTransferFee };
+ }
+ interface WireAccount {
+ // payto:// URI identifying the account and wire method
+ payto_uri: string;
+
+ // Signature using the exchange's offline key
+ // with purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS.
+ master_sig: EddsaSignature;
+ }
+ interface AggregateTransferFee {
+ // Per transfer wire transfer fee.
+ wire_fee: Amount;
+
+ // Per transfer closing fee.
+ closing_fee: Amount;
+
+ // What date (inclusive) does this fee go into effect?
+ // The different fees must cover the full time period in which
+ // any of the denomination keys are valid without overlap.
+ start_date: Timestamp;
+
+ // What date (exclusive) does this fee stop going into effect?
+ // The different fees must cover the full time period in which
+ // any of the denomination keys are valid without overlap.
+ end_date: Timestamp;
+
+ // Signature of TALER_MasterWireFeePS with
+ // purpose TALER_SIGNATURE_MASTER_WIRE_FEES.
+ sig: EddsaSignature;
+ }
}
export namespace MerchantBackend {
- interface ErrorDetail {
-
- // Numeric error code unique to the condition.
- // The other arguments are specific to the error value reported here.
- code: number;
+ interface ErrorDetail {
+ // Numeric error code unique to the condition.
+ // The other arguments are specific to the error value reported here.
+ code: number;
- // Human-readable description of the error, i.e. "missing parameter", "commitment violation", ...
- // Should give a human-readable hint about the error's nature. Optional, may change without notice!
- hint?: string;
+ // Human-readable description of the error, i.e. "missing parameter", "commitment violation", ...
+ // Should give a human-readable hint about the error's nature. Optional, may change without notice!
+ hint?: string;
- // Optional detail about the specific input value that failed. May change without notice!
- detail?: string;
+ // Optional detail about the specific input value that failed. May change without notice!
+ detail?: string;
- // Name of the parameter that was bogus (if applicable).
- parameter?: string;
+ // Name of the parameter that was bogus (if applicable).
+ parameter?: string;
- // Path to the argument that was bogus (if applicable).
- path?: string;
+ // Path to the argument that was bogus (if applicable).
+ path?: string;
- // Offset of the argument that was bogus (if applicable).
- offset?: string;
+ // Offset of the argument that was bogus (if applicable).
+ offset?: string;
- // Index of the argument that was bogus (if applicable).
- index?: string;
+ // Index of the argument that was bogus (if applicable).
+ index?: string;
- // Name of the object that was bogus (if applicable).
- object?: string;
+ // Name of the object that was bogus (if applicable).
+ object?: string;
- // Name of the currency than was problematic (if applicable).
- currency?: string;
+ // Name of the currency than was problematic (if applicable).
+ currency?: string;
- // Expected type (if applicable).
- type_expected?: string;
-
- // Type that was provided instead (if applicable).
- type_actual?: string;
- }
+ // Expected type (if applicable).
+ type_expected?: string;
+ // Type that was provided instead (if applicable).
+ type_actual?: string;
+ }
- // Delivery location, loosely modeled as a subset of
- // ISO20022's PostalAddress25.
- interface Tax {
- // the name of the tax
- name: string;
+ // Delivery location, loosely modeled as a subset of
+ // ISO20022's PostalAddress25.
+ interface Tax {
+ // the name of the tax
+ name: string;
- // amount paid in tax
- tax: Amount;
- }
+ // amount paid in tax
+ tax: Amount;
+ }
- interface Auditor {
- // official name
- name: string;
+ interface Auditor {
+ // official name
+ name: string;
- // Auditor's public key
- auditor_pub: EddsaPublicKey;
+ // Auditor's public key
+ auditor_pub: EddsaPublicKey;
- // Base URL of the auditor
- url: string;
- }
- interface Exchange {
- // the exchange's base URL
- url: string;
+ // Base URL of the auditor
+ url: string;
+ }
+ interface Exchange {
+ // the exchange's base URL
+ url: string;
- // master public key of the exchange
- master_pub: EddsaPublicKey;
- }
+ // master public key of the exchange
+ master_pub: EddsaPublicKey;
+ }
- interface Product {
- // merchant-internal identifier for the product.
- product_id?: string;
+ interface Product {
+ // merchant-internal identifier for the product.
+ product_id?: string;
+
+ // Human-readable product description.
+ description: string;
+
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n?: { [lang_tag: string]: string };
+
+ // The number of units of the product to deliver to the customer.
+ quantity: Integer;
+
+ // The unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
+
+ // The price of the product; this is the total price for quantity times unit of this product.
+ price?: Amount;
+
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
+
+ // a list of taxes paid by the merchant for this product. Can be empty.
+ taxes: Tax[];
+
+ // time indicating when this product should be delivered
+ delivery_date?: TalerProtocolTimestamp;
+
+ // Minimum age buyer must have (in years). Default is 0.
+ minimum_age?: Integer;
+ }
+ interface Merchant {
+ // label for a location with the business address of the merchant
+ address: Location;
+
+ // the merchant's legal name of business
+ name: string;
- // Human-readable product description.
- description: string;
+ // label for a location that denotes the jurisdiction for disputes.
+ // Some of the typical fields for a location (such as a street address) may be absent.
+ jurisdiction: Location;
+ }
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n?: { [lang_tag: string]: string };
+ interface VersionResponse {
+ // libtool-style representation of the Merchant protocol version, see
+ // https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+ // The format is "current:revision:age".
+ version: string;
+
+ // Name of the protocol.
+ name: "taler-merchant";
+
+ // Currency supported by this backend.
+ currency: string;
+ }
+ interface Location {
+ // Nation with its own government.
+ country?: string;
+
+ // Identifies a subdivision of a country such as state, region, county.
+ country_subdivision?: string;
+
+ // Identifies a subdivision within a country sub-division.
+ district?: string;
+
+ // Name of a built-up area, with defined boundaries, and a local government.
+ town?: string;
+
+ // Specific location name within the town.
+ town_location?: string;
+
+ // Identifier consisting of a group of letters and/or numbers that
+ // is added to a postal address to assist the sorting of mail.
+ post_code?: string;
+
+ // Name of a street or thoroughfare.
+ street?: string;
+
+ // Name of the building or house.
+ building_name?: string;
+
+ // Number that identifies the position of a building on a street.
+ building_number?: string;
+
+ // Free-form address lines, should not exceed 7 elements.
+ address_lines?: string[];
+ }
+ namespace Instances {
+ //POST /private/instances/$INSTANCE/auth
+ interface InstanceAuthConfigurationMessage {
+ // Type of authentication.
+ // "external": The mechant backend does not do
+ // any authentication checks. Instead an API
+ // gateway must do the authentication.
+ // "token": The merchant checks an auth token.
+ // See "token" for details.
+ method: "external" | "token";
+
+ // For method "external", this field is mandatory.
+ // The token MUST begin with the string "secret-token:".
+ // After the auth token has been set (with method "token"),
+ // the value must be provided in a "Authorization: Bearer $token"
+ // header.
+ token?: string;
+ }
+ //POST /private/instances
+ interface InstanceConfigurationMessage {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array. Note that by
+ // removing URIs from this list the respective account is set to
+ // inactive and thus unavailable for new contracts, but preserved
+ // in the database as existing offers and contracts may still refer
+ // to it.
+ payto_uris: string[];
+
+ // Name of the merchant instance to create (will become $INSTANCE).
+ id: string;
+
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ email: string;
+ website: string;
+ // An optional base64-encoded logo image
+ logo: ImageDataUrl;
+
+ // "Authentication" header required to authorize management access the instance.
+ // Optional, if not given authentication will be disabled for
+ // this instance (hopefully authentication checks are still
+ // done by some reverse proxy).
+ auth: InstanceAuthConfigurationMessage;
+
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
+
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
+
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
+
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
+
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
+
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
+
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
+ }
- // The number of units of the product to deliver to the customer.
- quantity: Integer;
+ // PATCH /private/instances/$INSTANCE
+ interface InstanceReconfigurationMessage {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array. Note that by
+ // removing URIs from this list
+ payto_uris: string[];
- // The unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
+ // Merchant name corresponding to this instance.
+ name: string;
- // The price of the product; this is the total price for quantity times unit of this product.
- price?: Amount;
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
- // An optional base64-encoded product image
- image: ImageDataUrl;
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
- // a list of taxes paid by the merchant for this product. Can be empty.
- taxes: Tax[];
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
- // time indicating when this product should be delivered
- delivery_date?: TalerProtocolTimestamp;
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
- // Minimum age buyer must have (in years). Default is 0.
- minimum_age?: Integer;
- }
- interface Merchant {
- // label for a location with the business address of the merchant
- address: Location;
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
- // the merchant's legal name of business
- name: string;
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
- // label for a location that denotes the jurisdiction for disputes.
- // Some of the typical fields for a location (such as a street address) may be absent.
- jurisdiction: Location;
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
}
- interface VersionResponse {
- // libtool-style representation of the Merchant protocol version, see
- // https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
- // The format is "current:revision:age".
- version: string;
-
- // Name of the protocol.
- name: "taler-merchant";
-
- // Currency supported by this backend.
- currency: string;
-
+ // GET /private/instances
+ interface InstancesResponse {
+ // List of instances that are present in the backend (see Instance)
+ instances: Instance[];
}
- interface Location {
- // Nation with its own government.
- country?: string;
- // Identifies a subdivision of a country such as state, region, county.
- country_subdivision?: string;
+ interface Instance {
+ // Merchant name corresponding to this instance.
+ name: string;
- // Identifies a subdivision within a country sub-division.
- district?: string;
+ deleted?: boolean;
- // Name of a built-up area, with defined boundaries, and a local government.
- town?: string;
+ // Merchant instance this response is about ($INSTANCE)
+ id: string;
- // Specific location name within the town.
- town_location?: string;
+ // Public key of the merchant/instance, in Crockford Base32 encoding.
+ merchant_pub: EddsaPublicKey;
- // Identifier consisting of a group of letters and/or numbers that
- // is added to a postal address to assist the sorting of mail.
- post_code?: string;
+ // List of the payment targets supported by this instance. Clients can
+ // specify the desired payment target in /order requests. Note that
+ // front-ends do not have to support wallets selecting payment targets.
+ payment_targets: string[];
+ }
- // Name of a street or thoroughfare.
- street?: string;
+ //GET /private/instances/$INSTANCE/kyc
+ interface AccountKycRedirects {
+ // Array of pending KYCs.
+ pending_kycs: MerchantAccountKycRedirect[];
- // Name of the building or house.
- building_name?: string;
+ // Array of exchanges with no reply.
+ timeout_kycs: ExchangeKycTimeout[];
+ }
+ interface MerchantAccountKycRedirect {
+ // URL that the user should open in a browser to
+ // proceed with the KYC process (as returned
+ // by the exchange's /kyc-check/ endpoint).
+ kyc_url: string;
- // Number that identifies the position of a building on a street.
- building_number?: string;
+ // Base URL of the exchange this is about.
+ exchange_url: string;
- // Free-form address lines, should not exceed 7 elements.
- address_lines?: string[];
+ // Our bank wire account this is about.
+ payto_uri: string;
+ }
+ interface ExchangeKycTimeout {
+ // Base URL of the exchange this is about.
+ exchange_url: string;
+
+ // Numeric error code indicating errors the exchange
+ // returned, or TALER_EC_INVALID for none.
+ exchange_code: number;
+
+ // HTTP status code returned by the exchange when we asked for
+ // information about the KYC status.
+ // 0 if there was no response at all.
+ exchange_http_status: number;
}
- namespace Instances {
-
- //POST /private/instances/$INSTANCE/auth
- interface InstanceAuthConfigurationMessage {
- // Type of authentication.
- // "external": The mechant backend does not do
- // any authentication checks. Instead an API
- // gateway must do the authentication.
- // "token": The merchant checks an auth token.
- // See "token" for details.
- method: "external" | "token";
-
- // For method "external", this field is mandatory.
- // The token MUST begin with the string "secret-token:".
- // After the auth token has been set (with method "token"),
- // the value must be provided in a "Authorization: Bearer $token"
- // header.
- token?: string;
-
- }
- //POST /private/instances
- interface InstanceConfigurationMessage {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array. Note that by
- // removing URIs from this list the respective account is set to
- // inactive and thus unavailable for new contracts, but preserved
- // in the database as existing offers and contracts may still refer
- // to it.
- payto_uris: string[];
-
- // Name of the merchant instance to create (will become $INSTANCE).
- id: string;
-
- // Merchant name corresponding to this instance.
- name: string;
-
- email: string;
- website: string;
- // An optional base64-encoded logo image
- logo: ImageDataUrl;
-
-
- // "Authentication" header required to authorize management access the instance.
- // Optional, if not given authentication will be disabled for
- // this instance (hopefully authentication checks are still
- // done by some reverse proxy).
- auth: InstanceAuthConfigurationMessage;
-
- // The merchant's physical address (to be put into contracts).
- address: Location;
-
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
-
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
-
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
-
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
-
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
-
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
-
- }
-
- // PATCH /private/instances/$INSTANCE
- interface InstanceReconfigurationMessage {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array. Note that by
- // removing URIs from this list
- payto_uris: string[];
-
- // Merchant name corresponding to this instance.
- name: string;
-
- // The merchant's physical address (to be put into contracts).
- address: Location;
-
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
-
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
-
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
-
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
+ //GET /private/instances/$INSTANCE
+ interface QueryInstancesResponse {
+ // The URI where the wallet will send coins. A merchant may have
+ // multiple accounts, thus this is an array.
+ accounts: MerchantAccount[];
+
+ // Merchant name corresponding to this instance.
+ name: string;
+
+ // Public key of the merchant/instance, in Crockford Base32 encoding.
+ merchant_pub: EddsaPublicKey;
+
+ // The merchant's physical address (to be put into contracts).
+ address: Location;
+
+ // The jurisdiction under which the merchant conducts its business
+ // (to be put into contracts).
+ jurisdiction: Location;
+
+ // Maximum wire fee this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_wire_fee: Amount;
+
+ // Default factor for wire fee amortization calculations.
+ // Can be overridden by the frontend on a per-order basis.
+ default_wire_fee_amortization: Integer;
+
+ // Maximum deposit fee (sum over all coins) this instance is willing to pay.
+ // Can be overridden by the frontend on a per-order basis.
+ default_max_deposit_fee: Amount;
+
+ // If the frontend does NOT specify an execution date, how long should
+ // we tell the exchange to wait to aggregate transactions before
+ // executing the wire transfer? This delay is added to the current
+ // time when we generate the advisory execution time for the exchange.
+ default_wire_transfer_delay: RelativeTime;
+
+ // If the frontend does NOT specify a payment deadline, how long should
+ // offers we make be valid by default?
+ default_pay_delay: RelativeTime;
+
+ // Authentication configuration.
+ // Does not contain the token when token auth is configured.
+ auth: {
+ method: "external" | "token";
+ token?: string;
+ };
+ }
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
+ interface MerchantAccount {
+ // payto:// URI of the account.
+ payto_uri: string;
- }
+ // Hash over the wire details (including over the salt)
+ h_wire: HashCode;
- // GET /private/instances
- interface InstancesResponse {
- // List of instances that are present in the backend (see Instance)
- instances: Instance[];
- }
+ // salt used to compute h_wire
+ salt: HashCode;
- interface Instance {
- // Merchant name corresponding to this instance.
- name: string;
+ // true if this account is active,
+ // false if it is historic.
+ active: boolean;
+ }
- deleted?: boolean;
+ // DELETE /private/instances/$INSTANCE
+ }
- // Merchant instance this response is about ($INSTANCE)
- id: string;
+ namespace Products {
+ // POST /private/products
+ interface ProductAddDetail {
+ // product ID to use.
+ product_id: string;
- // Public key of the merchant/instance, in Crockford Base32 encoding.
- merchant_pub: EddsaPublicKey;
+ // Human-readable product description.
+ description: string;
- // List of the payment targets supported by this instance. Clients can
- // specify the desired payment target in /order requests. Note that
- // front-ends do not have to support wallets selecting payment targets.
- payment_targets: string[];
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
- }
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
- //GET /private/instances/$INSTANCE/kyc
- interface AccountKycRedirects {
- // Array of pending KYCs.
- pending_kycs: MerchantAccountKycRedirect[];
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
- // Array of exchanges with no reply.
- timeout_kycs: ExchangeKycTimeout[];
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
- }
- interface MerchantAccountKycRedirect {
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
- // URL that the user should open in a browser to
- // proceed with the KYC process (as returned
- // by the exchange's /kyc-check/ endpoint).
- kyc_url: string;
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
- // Base URL of the exchange this is about.
- exchange_url: string;
+ // Identifies where the product is in stock.
+ address: Location;
- // Our bank wire account this is about.
- payto_uri: string;
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
- }
- interface ExchangeKycTimeout {
+ // Minimum age buyer must have (in years). Default is 0.
+ minimum_age?: Integer;
+ }
+ // PATCH /private/products/$PRODUCT_ID
+ interface ProductPatchDetail {
+ // Human-readable product description.
+ description: string;
- // Base URL of the exchange this is about.
- exchange_url: string;
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
- // Numeric error code indicating errors the exchange
- // returned, or TALER_EC_INVALID for none.
- exchange_code: number;
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
- // HTTP status code returned by the exchange when we asked for
- // information about the KYC status.
- // 0 if there was no response at all.
- exchange_http_status: number;
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
- }
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
- //GET /private/instances/$INSTANCE
- interface QueryInstancesResponse {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array.
- accounts: MerchantAccount[];
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
- // Merchant name corresponding to this instance.
- name: string;
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
- // Public key of the merchant/instance, in Crockford Base32 encoding.
- merchant_pub: EddsaPublicKey;
+ // Number of units of the product that were lost (spoiled, stolen, etc.)
+ total_lost: Integer;
- // The merchant's physical address (to be put into contracts).
- address: Location;
+ // Identifies where the product is in stock.
+ address: Location;
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
+ // Minimum age buyer must have (in years). Default is 0.
+ minimum_age?: Integer;
+ }
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
+ // GET /private/products
+ interface InventorySummaryResponse {
+ // List of products that are present in the inventory
+ products: InventoryEntry[];
+ }
+ interface InventoryEntry {
+ // Product identifier, as found in the product.
+ product_id: string;
+ }
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
+ // GET /private/products/$PRODUCT_ID
+ interface ProductDetail {
+ // Human-readable product description.
+ description: string;
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
+ // Map from IETF BCP 47 language tags to localized descriptions
+ description_i18n: { [lang_tag: string]: string };
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
+ // unit in which the product is measured (liters, kilograms, packages, etc.)
+ unit: string;
- // Authentication configuration.
- // Does not contain the token when token auth is configured.
- auth: {
- method: "external" | "token";
- token?: string;
- };
- }
+ // The price for one unit of the product. Zero is used
+ // to imply that this product is not sold separately, or
+ // that the price is not fixed, and must be supplied by the
+ // front-end. If non-zero, this price MUST include applicable
+ // taxes.
+ price: Amount;
- interface MerchantAccount {
+ // An optional base64-encoded product image
+ image: ImageDataUrl;
- // payto:// URI of the account.
- payto_uri: string;
+ // a list of taxes paid by the merchant for one unit of this product
+ taxes: Tax[];
- // Hash over the wire details (including over the salt)
- h_wire: HashCode;
+ // Number of units of the product in stock in sum in total,
+ // including all existing sales ever. Given in product-specific
+ // units.
+ // A value of -1 indicates "infinite" (i.e. for "electronic" books).
+ total_stock: Integer;
- // salt used to compute h_wire
- salt: HashCode;
+ // Number of units of the product that have already been sold.
+ total_sold: Integer;
- // true if this account is active,
- // false if it is historic.
- active: boolean;
- }
+ // Number of units of the product that were lost (spoiled, stolen, etc.)
+ total_lost: Integer;
- // DELETE /private/instances/$INSTANCE
+ // Identifies where the product is in stock.
+ address: Location;
+ // Identifies when we expect the next restocking to happen.
+ next_restock?: Timestamp;
+ // Minimum age buyer must have (in years). Default is 0.
+ minimum_age?: Integer;
}
- namespace Products {
- // POST /private/products
- interface ProductAddDetail {
-
- // product ID to use.
- product_id: string;
+ // POST /private/products/$PRODUCT_ID/lock
+ interface LockRequest {
+ // UUID that identifies the frontend performing the lock
+ // It is suggested that clients use a timeflake for this,
+ // see https://github.com/anthonynsimon/timeflake
+ lock_uuid: UUID;
- // Human-readable product description.
- description: string;
+ // How long does the frontend intend to hold the lock
+ duration: RelativeTime;
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
+ // How many units should be locked?
+ quantity: Integer;
+ }
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
+ // DELETE /private/products/$PRODUCT_ID
+ }
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
+ namespace Orders {
+ type MerchantOrderStatusResponse =
+ | CheckPaymentPaidResponse
+ | CheckPaymentClaimedResponse
+ | CheckPaymentUnpaidResponse;
+ interface CheckPaymentPaidResponse {
+ // The customer paid for this contract.
+ order_status: "paid";
- // An optional base64-encoded product image
- image: ImageDataUrl;
+ // Was the payment refunded (even partially)?
+ refunded: boolean;
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
+ // True if there are any approved refunds that the wallet has
+ // not yet obtained.
+ refund_pending: boolean;
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
+ // Did the exchange wire us the funds?
+ wired: boolean;
- // Identifies where the product is in stock.
- address: Location;
+ // Total amount the exchange deposited into our bank account
+ // for this contract, excluding fees.
+ deposit_total: Amount;
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
+ // Numeric error code indicating errors the exchange
+ // encountered tracking the wire transfer for this purchase (before
+ // we even got to specific coin issues).
+ // 0 if there were no issues.
+ exchange_ec: number;
- // Minimum age buyer must have (in years). Default is 0.
- minimum_age?: Integer;
- }
- // PATCH /private/products/$PRODUCT_ID
- interface ProductPatchDetail {
+ // HTTP status code returned by the exchange when we asked for
+ // information to track the wire transfer for this purchase.
+ // 0 if there were no issues.
+ exchange_hc: number;
- // Human-readable product description.
- description: string;
+ // Total amount that was refunded, 0 if refunded is false.
+ refund_amount: Amount;
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
+ // Contract terms.
+ contract_terms: ContractTerms;
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
+ // The wire transfer status from the exchange for this order if
+ // available, otherwise empty array.
+ wire_details: TransactionWireTransfer[];
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
+ // Reports about trouble obtaining wire transfer details,
+ // empty array if no trouble were encountered.
+ wire_reports: TransactionWireReport[];
- // An optional base64-encoded product image
- image: ImageDataUrl;
+ // The refund details for this order. One entry per
+ // refunded coin; empty array if there are no refunds.
+ refund_details: RefundDetails[];
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
+ // Status URL, can be used as a redirect target for the browser
+ // to show the order QR code / trigger the wallet.
+ order_status_url: string;
+ }
+ interface CheckPaymentClaimedResponse {
+ // A wallet claimed the order, but did not yet pay for the contract.
+ order_status: "claimed";
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
+ // Contract terms.
+ contract_terms: ContractTerms;
+ }
+ interface CheckPaymentUnpaidResponse {
+ // The order was neither claimed nor paid.
+ order_status: "unpaid";
- // Number of units of the product that were lost (spoiled, stolen, etc.)
- total_lost: Integer;
+ // when was the order created
+ creation_time: Timestamp;
- // Identifies where the product is in stock.
- address: Location;
+ // Order summary text.
+ summary: string;
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
+ // Total amount of the order (to be paid by the customer).
+ total_amount: Amount;
- // Minimum age buyer must have (in years). Default is 0.
- minimum_age?: Integer;
- }
+ // URI that the wallet must process to complete the payment.
+ taler_pay_uri: string;
- // GET /private/products
- interface InventorySummaryResponse {
- // List of products that are present in the inventory
- products: InventoryEntry[];
- }
- interface InventoryEntry {
- // Product identifier, as found in the product.
- product_id: string;
+ // Alternative order ID which was paid for already in the same session.
+ // Only given if the same product was purchased before in the same session.
+ already_paid_order_id?: string;
- }
+ // Fulfillment URL of an already paid order. Only given if under this
+ // session an already paid order with a fulfillment URL exists.
+ already_paid_fulfillment_url?: string;
- // GET /private/products/$PRODUCT_ID
- interface ProductDetail {
+ // Status URL, can be used as a redirect target for the browser
+ // to show the order QR code / trigger the wallet.
+ order_status_url: string;
- // Human-readable product description.
- description: string;
+ // We do we NOT return the contract terms here because they may not
+ // exist in case the wallet did not yet claim them.
+ }
+ interface RefundDetails {
+ // Reason given for the refund.
+ reason: string;
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
+ // When was the refund approved.
+ timestamp: Timestamp;
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
+ // Set to true if a refund is still available for the wallet for this payment.
+ pending: boolean;
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
+ // Total amount that was refunded (minus a refund fee).
+ amount: Amount;
+ }
+ interface TransactionWireTransfer {
+ // Responsible exchange.
+ exchange_url: string;
- // An optional base64-encoded product image
- image: ImageDataUrl;
+ // 32-byte wire transfer identifier.
+ wtid: Base32;
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
+ // Execution time of the wire transfer.
+ execution_time: Timestamp;
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
+ // Total amount that has been wire transferred
+ // to the merchant.
+ amount: Amount;
- // Number of units of the product that have already been sold.
- total_sold: Integer;
+ // Was this transfer confirmed by the merchant via the
+ // POST /transfers API, or is it merely claimed by the exchange?
+ confirmed: boolean;
+ }
+ interface TransactionWireReport {
+ // Numerical error code.
+ code: number;
- // Number of units of the product that were lost (spoiled, stolen, etc.)
- total_lost: Integer;
+ // Human-readable error description.
+ hint: string;
- // Identifies where the product is in stock.
- address: Location;
+ // Numerical error code from the exchange.
+ exchange_ec: number;
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
+ // HTTP status code received from the exchange.
+ exchange_hc: number;
- // Minimum age buyer must have (in years). Default is 0.
- minimum_age?: Integer;
- }
+ // Public key of the coin for which we got the exchange error.
+ coin_pub: CoinPublicKey;
+ }
- // POST /private/products/$PRODUCT_ID/lock
- interface LockRequest {
+ interface OrderHistory {
+ // timestamp-sorted array of all orders matching the query.
+ // The order of the sorting depends on the sign of delta.
+ orders: OrderHistoryEntry[];
+ }
+ interface OrderHistoryEntry {
+ // order ID of the transaction related to this entry.
+ order_id: string;
- // UUID that identifies the frontend performing the lock
- // It is suggested that clients use a timeflake for this,
- // see https://github.com/anthonynsimon/timeflake
- lock_uuid: UUID;
+ // row ID of the order in the database
+ row_id: number;
- // How long does the frontend intend to hold the lock
- duration: RelativeTime;
+ // when the order was created
+ timestamp: Timestamp;
- // How many units should be locked?
- quantity: Integer;
+ // the amount of money the order is for
+ amount: Amount;
- }
+ // the summary of the order
+ summary: string;
- // DELETE /private/products/$PRODUCT_ID
+ // whether some part of the order is refundable,
+ // that is the refund deadline has not yet expired
+ // and the total amount refunded so far is below
+ // the value of the original transaction.
+ refundable: boolean;
+ // whether the order has been paid or not
+ paid: boolean;
}
- namespace Orders {
-
- type MerchantOrderStatusResponse = CheckPaymentPaidResponse |
- CheckPaymentClaimedResponse |
- CheckPaymentUnpaidResponse;
- interface CheckPaymentPaidResponse {
- // The customer paid for this contract.
- order_status: "paid";
-
- // Was the payment refunded (even partially)?
- refunded: boolean;
-
- // True if there are any approved refunds that the wallet has
- // not yet obtained.
- refund_pending: boolean;
+ interface PostOrderRequest {
+ // The order must at least contain the minimal
+ // order detail, but can override all
+ order: Order;
+
+ // if set, the backend will then set the refund deadline to the current
+ // time plus the specified delay. If it's not set, refunds will not be
+ // possible.
+ refund_delay?: RelativeTime;
+
+ // specifies the payment target preferred by the client. Can be used
+ // to select among the various (active) wire methods supported by the instance.
+ payment_target?: string;
+
+ // specifies that some products are to be included in the
+ // order from the inventory. For these inventory management
+ // is performed (so the products must be in stock) and
+ // details are completed from the product data of the backend.
+ inventory_products?: MinimalInventoryProduct[];
+
+ // Specifies a lock identifier that was used to
+ // lock a product in the inventory. Only useful if
+ // manage_inventory is set. Used in case a frontend
+ // reserved quantities of the individual products while
+ // the shopping card was being built. Multiple UUIDs can
+ // be used in case different UUIDs were used for different
+ // products (i.e. in case the user started with multiple
+ // shopping sessions that were combined during checkout).
+ lock_uuids?: UUID[];
+
+ // Should a token for claiming the order be generated?
+ // False can make sense if the ORDER_ID is sufficiently
+ // high entropy to prevent adversarial claims (like it is
+ // if the backend auto-generates one). Default is 'true'.
+ create_token?: boolean;
+ }
+ type Order = MinimalOrderDetail | ContractTerms;
+
+ interface MinimalOrderDetail {
+ // Amount to be paid by the customer
+ amount: Amount;
+
+ // Short summary of the order
+ summary: string;
+
+ // URL that will show that the order was successful after
+ // it has been paid for. Optional. When POSTing to the
+ // merchant, the placeholder "${ORDER_ID}" will be
+ // replaced with the actual order ID (useful if the
+ // order ID is generated server-side and needs to be
+ // in the URL).
+ fulfillment_url?: string;
+ }
- // Did the exchange wire us the funds?
- wired: boolean;
+ interface MinimalInventoryProduct {
+ // Which product is requested (here mandatory!)
+ product_id: string;
- // Total amount the exchange deposited into our bank account
- // for this contract, excluding fees.
- deposit_total: Amount;
+ // How many units of the product are requested
+ quantity: Integer;
+ }
+ interface PostOrderResponse {
+ // Order ID of the response that was just created
+ order_id: string;
+
+ // Token that authorizes the wallet to claim the order.
+ // Provided only if "create_token" was set to 'true'
+ // in the request.
+ token?: ClaimToken;
+ }
+ interface OutOfStockResponse {
+ // Product ID of an out-of-stock item
+ product_id: string;
- // Numeric error code indicating errors the exchange
- // encountered tracking the wire transfer for this purchase (before
- // we even got to specific coin issues).
- // 0 if there were no issues.
- exchange_ec: number;
-
- // HTTP status code returned by the exchange when we asked for
- // information to track the wire transfer for this purchase.
- // 0 if there were no issues.
- exchange_hc: number;
+ // Requested quantity
+ requested_quantity: Integer;
- // Total amount that was refunded, 0 if refunded is false.
- refund_amount: Amount;
+ // Available quantity (must be below requested_quanitity)
+ available_quantity: Integer;
- // Contract terms.
- contract_terms: ContractTerms;
+ // When do we expect the product to be again in stock?
+ // Optional, not given if unknown.
+ restock_expected?: Timestamp;
+ }
- // The wire transfer status from the exchange for this order if
- // available, otherwise empty array.
- wire_details: TransactionWireTransfer[];
+ interface ForgetRequest {
+ // Array of valid JSON paths to forgettable fields in the order's
+ // contract terms.
+ fields: string[];
+ }
+ interface RefundRequest {
+ // Amount to be refunded
+ refund: Amount;
- // Reports about trouble obtaining wire transfer details,
- // empty array if no trouble were encountered.
- wire_reports: TransactionWireReport[];
-
- // The refund details for this order. One entry per
- // refunded coin; empty array if there are no refunds.
- refund_details: RefundDetails[];
-
- // Status URL, can be used as a redirect target for the browser
- // to show the order QR code / trigger the wallet.
- order_status_url: string;
- }
- interface CheckPaymentClaimedResponse {
- // A wallet claimed the order, but did not yet pay for the contract.
- order_status: "claimed";
+ // Human-readable refund justification
+ reason: string;
+ }
+ interface MerchantRefundResponse {
+ // URL (handled by the backend) that the wallet should access to
+ // trigger refund processing.
+ // taler://refund/...
+ taler_refund_uri: string;
+
+ // Contract hash that a client may need to authenticate an
+ // HTTP request to obtain the above URI in a wallet-friendly way.
+ h_contract: HashCode;
+ }
+ }
- // Contract terms.
- contract_terms: ContractTerms;
+ namespace Tips {
+ // GET /private/reserves
+ interface TippingReserveStatus {
+ // Array of all known reserves (possibly empty!)
+ reserves: ReserveStatusEntry[];
+ }
+ interface ReserveStatusEntry {
+ // Public key of the reserve
+ reserve_pub: EddsaPublicKey;
- }
- interface CheckPaymentUnpaidResponse {
- // The order was neither claimed nor paid.
- order_status: "unpaid";
+ // Timestamp when it was established
+ creation_time: Timestamp;
- // when was the order created
- creation_time: Timestamp;
+ // Timestamp when it expires
+ expiration_time: Timestamp;
- // Order summary text.
- summary: string;
+ // Initial amount as per reserve creation call
+ merchant_initial_amount: Amount;
- // Total amount of the order (to be paid by the customer).
- total_amount: Amount;
+ // Initial amount as per exchange, 0 if exchange did
+ // not confirm reserve creation yet.
+ exchange_initial_amount: Amount;
- // URI that the wallet must process to complete the payment.
- taler_pay_uri: string;
+ // Amount picked up so far.
+ pickup_amount: Amount;
- // Alternative order ID which was paid for already in the same session.
- // Only given if the same product was purchased before in the same session.
- already_paid_order_id?: string;
-
- // Fulfillment URL of an already paid order. Only given if under this
- // session an already paid order with a fulfillment URL exists.
- already_paid_fulfillment_url?: string;
-
- // Status URL, can be used as a redirect target for the browser
- // to show the order QR code / trigger the wallet.
- order_status_url: string;
-
- // We do we NOT return the contract terms here because they may not
- // exist in case the wallet did not yet claim them.
- }
- interface RefundDetails {
- // Reason given for the refund.
- reason: string;
-
- // When was the refund approved.
- timestamp: Timestamp;
-
- // Set to true if a refund is still available for the wallet for this payment.
- pending: boolean;
-
- // Total amount that was refunded (minus a refund fee).
- amount: Amount;
- }
- interface TransactionWireTransfer {
- // Responsible exchange.
- exchange_url: string;
-
- // 32-byte wire transfer identifier.
- wtid: Base32;
-
- // Execution time of the wire transfer.
- execution_time: Timestamp;
-
- // Total amount that has been wire transferred
- // to the merchant.
- amount: Amount;
-
- // Was this transfer confirmed by the merchant via the
- // POST /transfers API, or is it merely claimed by the exchange?
- confirmed: boolean;
- }
- interface TransactionWireReport {
- // Numerical error code.
- code: number;
-
- // Human-readable error description.
- hint: string;
-
- // Numerical error code from the exchange.
- exchange_ec: number;
-
- // HTTP status code received from the exchange.
- exchange_hc: number;
-
- // Public key of the coin for which we got the exchange error.
- coin_pub: CoinPublicKey;
- }
-
- interface OrderHistory {
- // timestamp-sorted array of all orders matching the query.
- // The order of the sorting depends on the sign of delta.
- orders: OrderHistoryEntry[];
- }
- interface OrderHistoryEntry {
-
- // order ID of the transaction related to this entry.
- order_id: string;
-
- // row ID of the order in the database
- row_id: number;
-
- // when the order was created
- timestamp: Timestamp;
-
- // the amount of money the order is for
- amount: Amount;
-
- // the summary of the order
- summary: string;
-
- // whether some part of the order is refundable,
- // that is the refund deadline has not yet expired
- // and the total amount refunded so far is below
- // the value of the original transaction.
- refundable: boolean;
-
- // whether the order has been paid or not
- paid: boolean;
- }
-
- interface PostOrderRequest {
- // The order must at least contain the minimal
- // order detail, but can override all
- order: Order;
-
- // if set, the backend will then set the refund deadline to the current
- // time plus the specified delay. If it's not set, refunds will not be
- // possible.
- refund_delay?: RelativeTime;
-
- // specifies the payment target preferred by the client. Can be used
- // to select among the various (active) wire methods supported by the instance.
- payment_target?: string;
-
- // specifies that some products are to be included in the
- // order from the inventory. For these inventory management
- // is performed (so the products must be in stock) and
- // details are completed from the product data of the backend.
- inventory_products?: MinimalInventoryProduct[];
-
- // Specifies a lock identifier that was used to
- // lock a product in the inventory. Only useful if
- // manage_inventory is set. Used in case a frontend
- // reserved quantities of the individual products while
- // the shopping card was being built. Multiple UUIDs can
- // be used in case different UUIDs were used for different
- // products (i.e. in case the user started with multiple
- // shopping sessions that were combined during checkout).
- lock_uuids?: UUID[];
-
- // Should a token for claiming the order be generated?
- // False can make sense if the ORDER_ID is sufficiently
- // high entropy to prevent adversarial claims (like it is
- // if the backend auto-generates one). Default is 'true'.
- create_token?: boolean;
-
- }
- type Order = MinimalOrderDetail | ContractTerms;
-
- interface MinimalOrderDetail {
- // Amount to be paid by the customer
- amount: Amount;
-
- // Short summary of the order
- summary: string;
-
- // URL that will show that the order was successful after
- // it has been paid for. Optional. When POSTing to the
- // merchant, the placeholder "${ORDER_ID}" will be
- // replaced with the actual order ID (useful if the
- // order ID is generated server-side and needs to be
- // in the URL).
- fulfillment_url?: string;
- }
-
- interface MinimalInventoryProduct {
- // Which product is requested (here mandatory!)
- product_id: string;
-
- // How many units of the product are requested
- quantity: Integer;
- }
- interface PostOrderResponse {
- // Order ID of the response that was just created
- order_id: string;
-
- // Token that authorizes the wallet to claim the order.
- // Provided only if "create_token" was set to 'true'
- // in the request.
- token?: ClaimToken;
- }
- interface OutOfStockResponse {
-
- // Product ID of an out-of-stock item
- product_id: string;
-
- // Requested quantity
- requested_quantity: Integer;
-
- // Available quantity (must be below requested_quanitity)
- available_quantity: Integer;
-
- // When do we expect the product to be again in stock?
- // Optional, not given if unknown.
- restock_expected?: Timestamp;
- }
-
- interface ForgetRequest {
-
- // Array of valid JSON paths to forgettable fields in the order's
- // contract terms.
- fields: string[];
- }
- interface RefundRequest {
- // Amount to be refunded
- refund: Amount;
-
- // Human-readable refund justification
- reason: string;
- }
- interface MerchantRefundResponse {
-
- // URL (handled by the backend) that the wallet should access to
- // trigger refund processing.
- // taler://refund/...
- taler_refund_uri: string;
-
- // Contract hash that a client may need to authenticate an
- // HTTP request to obtain the above URI in a wallet-friendly way.
- h_contract: HashCode;
- }
+ // Amount approved for tips that exceeds the pickup_amount.
+ committed_amount: Amount;
+ // Is this reserve active (false if it was deleted but not purged)
+ active: boolean;
}
- namespace Tips {
+ interface ReserveCreateRequest {
+ // Amount that the merchant promises to put into the reserve
+ initial_balance: Amount;
- // GET /private/reserves
- interface TippingReserveStatus {
- // Array of all known reserves (possibly empty!)
- reserves: ReserveStatusEntry[];
- }
- interface ReserveStatusEntry {
- // Public key of the reserve
- reserve_pub: EddsaPublicKey;
+ // Exchange the merchant intends to use for tipping
+ exchange_url: string;
- // Timestamp when it was established
- creation_time: Timestamp;
+ // Desired wire method, for example "iban" or "x-taler-bank"
+ wire_method: string;
+ }
+ interface ReserveCreateConfirmation {
+ // Public key identifying the reserve
+ reserve_pub: EddsaPublicKey;
- // Timestamp when it expires
- expiration_time: Timestamp;
+ // Wire account of the exchange where to transfer the funds
+ payto_uri: string;
+ }
+ interface TipCreateRequest {
+ // Amount that the customer should be tipped
+ amount: Amount;
- // Initial amount as per reserve creation call
- merchant_initial_amount: Amount;
+ // Justification for giving the tip
+ justification: string;
- // Initial amount as per exchange, 0 if exchange did
- // not confirm reserve creation yet.
- exchange_initial_amount: Amount;
+ // URL that the user should be directed to after tipping,
+ // will be included in the tip_token.
+ next_url: string;
+ }
+ interface TipCreateConfirmation {
+ // Unique tip identifier for the tip that was created.
+ tip_id: HashCode;
- // Amount picked up so far.
- pickup_amount: Amount;
+ // taler://tip URI for the tip
+ taler_tip_uri: string;
- // Amount approved for tips that exceeds the pickup_amount.
- committed_amount: Amount;
+ // URL that will directly trigger processing
+ // the tip when the browser is redirected to it
+ tip_status_url: string;
- // Is this reserve active (false if it was deleted but not purged)
- active: boolean;
- }
+ // when does the tip expire
+ tip_expiration: Timestamp;
+ }
- interface ReserveCreateRequest {
- // Amount that the merchant promises to put into the reserve
- initial_balance: Amount;
+ interface ReserveDetail {
+ // Timestamp when it was established.
+ creation_time: Timestamp;
- // Exchange the merchant intends to use for tipping
- exchange_url: string;
+ // Timestamp when it expires.
+ expiration_time: Timestamp;
- // Desired wire method, for example "iban" or "x-taler-bank"
- wire_method: string;
- }
- interface ReserveCreateConfirmation {
- // Public key identifying the reserve
- reserve_pub: EddsaPublicKey;
+ // Initial amount as per reserve creation call.
+ merchant_initial_amount: Amount;
- // Wire account of the exchange where to transfer the funds
- payto_uri: string;
- }
- interface TipCreateRequest {
- // Amount that the customer should be tipped
- amount: Amount;
+ // Initial amount as per exchange, 0 if exchange did
+ // not confirm reserve creation yet.
+ exchange_initial_amount: Amount;
- // Justification for giving the tip
- justification: string;
+ // Amount picked up so far.
+ pickup_amount: Amount;
- // URL that the user should be directed to after tipping,
- // will be included in the tip_token.
- next_url: string;
- }
- interface TipCreateConfirmation {
- // Unique tip identifier for the tip that was created.
- tip_id: HashCode;
+ // Amount approved for tips that exceeds the pickup_amount.
+ committed_amount: Amount;
- // taler://tip URI for the tip
- taler_tip_uri: string;
+ // Array of all tips created by this reserves (possibly empty!).
+ // Only present if asked for explicitly.
+ tips?: TipStatusEntry[];
- // URL that will directly trigger processing
- // the tip when the browser is redirected to it
- tip_status_url: string;
+ // Is this reserve active (false if it was deleted but not purged)?
+ active: boolean;
- // when does the tip expire
- tip_expiration: Timestamp;
- }
+ // URI to use to fill the reserve, can be NULL
+ // if the reserve is inactive or was already filled
+ payto_uri: string;
- interface ReserveDetail {
- // Timestamp when it was established.
- creation_time: Timestamp;
+ // URL of the exchange hosting the reserve,
+ // NULL if the reserve is inactive
+ exchange_url: string;
+ }
- // Timestamp when it expires.
- expiration_time: Timestamp;
+ interface TipStatusEntry {
+ // Unique identifier for the tip.
+ tip_id: HashCode;
- // Initial amount as per reserve creation call.
- merchant_initial_amount: Amount;
+ // Total amount of the tip that can be withdrawn.
+ total_amount: Amount;
- // Initial amount as per exchange, 0 if exchange did
- // not confirm reserve creation yet.
- exchange_initial_amount: Amount;
+ // Human-readable reason for why the tip was granted.
+ reason: string;
+ }
- // Amount picked up so far.
- pickup_amount: Amount;
+ interface TipDetails {
+ // Amount that we authorized for this tip.
+ total_authorized: Amount;
- // Amount approved for tips that exceeds the pickup_amount.
- committed_amount: Amount;
+ // Amount that was picked up by the user already.
+ total_picked_up: Amount;
- // Array of all tips created by this reserves (possibly empty!).
- // Only present if asked for explicitly.
- tips?: TipStatusEntry[];
+ // Human-readable reason given when authorizing the tip.
+ reason: string;
- // Is this reserve active (false if it was deleted but not purged)?
- active: boolean;
+ // Timestamp indicating when the tip is set to expire (may be in the past).
+ expiration: Timestamp;
- // URI to use to fill the reserve, can be NULL
- // if the reserve is inactive or was already filled
- payto_uri: string;
+ // Reserve public key from which the tip is funded.
+ reserve_pub: EddsaPublicKey;
- // URL of the exchange hosting the reserve,
- // NULL if the reserve is inactive
- exchange_url: string;
+ // Array showing the pickup operations of the wallet (possibly empty!).
+ // Only present if asked for explicitly.
+ pickups?: PickupDetail[];
+ }
+ interface PickupDetail {
+ // Unique identifier for the pickup operation.
+ pickup_id: HashCode;
- }
+ // Number of planchets involved.
+ num_planchets: Integer;
- interface TipStatusEntry {
+ // Total amount requested for this pickup_id.
+ requested_amount: Amount;
+ }
+ }
- // Unique identifier for the tip.
- tip_id: HashCode;
+ namespace Transfers {
+ interface TransferList {
+ // list of all the transfers that fit the filter that we know
+ transfers: TransferDetails[];
+ }
+ interface TransferDetails {
+ // how much was wired to the merchant (minus fees)
+ credit_amount: Amount;
- // Total amount of the tip that can be withdrawn.
- total_amount: Amount;
+ // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
+ wtid: string;
- // Human-readable reason for why the tip was granted.
- reason: string;
- }
+ // target account that received the wire transfer
+ payto_uri: string;
- interface TipDetails {
- // Amount that we authorized for this tip.
- total_authorized: Amount;
+ // base URL of the exchange that made the wire transfer
+ exchange_url: string;
- // Amount that was picked up by the user already.
- total_picked_up: Amount;
+ // Serial number identifying the transfer in the merchant backend.
+ // Used for filgering via offset.
+ transfer_serial_id: number;
- // Human-readable reason given when authorizing the tip.
- reason: string;
+ // Time of the execution of the wire transfer by the exchange, according to the exchange
+ // Only provided if we did get an answer from the exchange.
+ execution_time?: Timestamp;
- // Timestamp indicating when the tip is set to expire (may be in the past).
- expiration: Timestamp;
+ // True if we checked the exchange's answer and are happy with it.
+ // False if we have an answer and are unhappy, missing if we
+ // do not have an answer from the exchange.
+ verified?: boolean;
- // Reserve public key from which the tip is funded.
- reserve_pub: EddsaPublicKey;
+ // True if the merchant uses the POST /transfers API to confirm
+ // that this wire transfer took place (and it is thus not
+ // something merely claimed by the exchange).
+ confirmed?: boolean;
+ }
- // Array showing the pickup operations of the wallet (possibly empty!).
- // Only present if asked for explicitly.
- pickups?: PickupDetail[];
- }
- interface PickupDetail {
- // Unique identifier for the pickup operation.
- pickup_id: HashCode;
+ interface TransferInformation {
+ // how much was wired to the merchant (minus fees)
+ credit_amount: Amount;
- // Number of planchets involved.
- num_planchets: Integer;
+ // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
+ wtid: WireTransferIdentifierRawP;
- // Total amount requested for this pickup_id.
- requested_amount: Amount;
- }
+ // target account that received the wire transfer
+ payto_uri: string;
+ // base URL of the exchange that made the wire transfer
+ exchange_url: string;
}
+ interface MerchantTrackTransferResponse {
+ // Total amount transferred
+ total: Amount;
- namespace Transfers {
-
- interface TransferList {
- // list of all the transfers that fit the filter that we know
- transfers: TransferDetails[];
- }
- interface TransferDetails {
- // how much was wired to the merchant (minus fees)
- credit_amount: Amount;
-
- // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
- wtid: string;
+ // Applicable wire fee that was charged
+ wire_fee: Amount;
- // target account that received the wire transfer
- payto_uri: string;
+ // Time of the execution of the wire transfer by the exchange, according to the exchange
+ execution_time: Timestamp;
- // base URL of the exchange that made the wire transfer
- exchange_url: string;
-
- // Serial number identifying the transfer in the merchant backend.
- // Used for filgering via offset.
- transfer_serial_id: number;
-
- // Time of the execution of the wire transfer by the exchange, according to the exchange
- // Only provided if we did get an answer from the exchange.
- execution_time?: Timestamp;
-
- // True if we checked the exchange's answer and are happy with it.
- // False if we have an answer and are unhappy, missing if we
- // do not have an answer from the exchange.
- verified?: boolean;
-
- // True if the merchant uses the POST /transfers API to confirm
- // that this wire transfer took place (and it is thus not
- // something merely claimed by the exchange).
- confirmed?: boolean;
- }
-
- interface TransferInformation {
- // how much was wired to the merchant (minus fees)
- credit_amount: Amount;
-
- // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
- wtid: WireTransferIdentifierRawP;
-
- // target account that received the wire transfer
- payto_uri: string;
-
- // base URL of the exchange that made the wire transfer
- exchange_url: string;
- }
- interface MerchantTrackTransferResponse {
- // Total amount transferred
- total: Amount;
-
- // Applicable wire fee that was charged
- wire_fee: Amount;
-
- // Time of the execution of the wire transfer by the exchange, according to the exchange
- execution_time: Timestamp;
-
- // details about the deposits
- deposits_sums: MerchantTrackTransferDetail[];
- }
- interface MerchantTrackTransferDetail {
- // Business activity associated with the wire transferred amount
- // deposit_value.
- order_id: string;
-
- // The total amount the exchange paid back for order_id.
- deposit_value: Amount;
-
- // applicable fees for the deposit
- deposit_fee: Amount;
- }
-
- type ExchangeConflictDetails = WireFeeConflictDetails | TrackTransferConflictDetails
- // Note: this is not the full 'proof' of missbehavior, as
- // the bogus message from the exchange with a signature
- // over the 'different' wire fee is missing.
- //
- // This information is NOT provided by the current implementation,
- // because this would be quite expensive to generate and is
- // hardly needed _here_. Once we add automated reports for
- // the Taler auditor, we need to generate this data anyway
- // and should probably return it here as well.
- interface WireFeeConflictDetails {
- // Numerical error code:
- code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_BAD_WIRE_FEE";
+ // details about the deposits
+ deposits_sums: MerchantTrackTransferDetail[];
+ }
+ interface MerchantTrackTransferDetail {
+ // Business activity associated with the wire transferred amount
+ // deposit_value.
+ order_id: string;
- // Text describing the issue for humans.
- hint: string;
-
-
- // Wire fee (wrongly) charged by the exchange, breaking the
- // contract affirmed by the exchange_sig.
- wire_fee: Amount;
-
- // Timestamp of the wire transfer
- execution_time: Timestamp;
-
- // The expected wire fee (as signed by the exchange)
- expected_wire_fee: Amount;
-
- // Expected closing fee (needed to verify signature)
- expected_closing_fee: Amount;
-
- // Start date of the expected fee structure
- start_date: Timestamp;
+ // The total amount the exchange paid back for order_id.
+ deposit_value: Amount;
- // End date of the expected fee structure
- end_date: Timestamp;
+ // applicable fees for the deposit
+ deposit_fee: Amount;
+ }
- // Signature of the exchange affirming the expected fee structure
- master_sig: EddsaSignature;
-
- // Master public key of the exchange
- master_pub: EddsaPublicKey;
- }
- interface TrackTransferConflictDetails {
- // Numerical error code
- code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_REPORTS";
-
- // Text describing the issue for humans.
- hint: string;
-
- // Offset in the exchange_transfer where the
- // exchange's response fails to match the exchange_deposit_proof.
- conflict_offset: number;
-
- // The response from the exchange which tells us when the
- // coin was returned to us, except that it does not match
- // the expected value of the coin.
- //
- // This field is NOT provided by the current implementation,
- // because this would be quite expensive to generate and is
- // hardly needed _here_. Once we add automated reports for
- // the Taler auditor, we need to generate this data anyway
- // and should probably return it here as well.
- // exchange_transfer?: TrackTransferResponse;
+ type ExchangeConflictDetails =
+ | WireFeeConflictDetails
+ | TrackTransferConflictDetails;
+ // Note: this is not the full 'proof' of missbehavior, as
+ // the bogus message from the exchange with a signature
+ // over the 'different' wire fee is missing.
+ //
+ // This information is NOT provided by the current implementation,
+ // because this would be quite expensive to generate and is
+ // hardly needed _here_. Once we add automated reports for
+ // the Taler auditor, we need to generate this data anyway
+ // and should probably return it here as well.
+ interface WireFeeConflictDetails {
+ // Numerical error code:
+ code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_BAD_WIRE_FEE";
+
+ // Text describing the issue for humans.
+ hint: string;
+
+ // Wire fee (wrongly) charged by the exchange, breaking the
+ // contract affirmed by the exchange_sig.
+ wire_fee: Amount;
+
+ // Timestamp of the wire transfer
+ execution_time: Timestamp;
+
+ // The expected wire fee (as signed by the exchange)
+ expected_wire_fee: Amount;
+
+ // Expected closing fee (needed to verify signature)
+ expected_closing_fee: Amount;
+
+ // Start date of the expected fee structure
+ start_date: Timestamp;
+
+ // End date of the expected fee structure
+ end_date: Timestamp;
+
+ // Signature of the exchange affirming the expected fee structure
+ master_sig: EddsaSignature;
+
+ // Master public key of the exchange
+ master_pub: EddsaPublicKey;
+ }
+ interface TrackTransferConflictDetails {
+ // Numerical error code
+ code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_REPORTS";
- // Public key of the exchange used to sign the response to
- // our deposit request.
- deposit_exchange_pub: EddsaPublicKey;
+ // Text describing the issue for humans.
+ hint: string;
- // Signature of the exchange signing the (conflicting) response.
- // Signs over a struct TALER_DepositConfirmationPS.
- deposit_exchange_sig: EddsaSignature;
-
- // Hash of the merchant's bank account the wire transfer went to
- h_wire: HashCode;
-
- // Hash of the contract terms with the conflicting deposit.
- h_contract_terms: HashCode;
+ // Offset in the exchange_transfer where the
+ // exchange's response fails to match the exchange_deposit_proof.
+ conflict_offset: number;
- // At what time the exchange received the deposit. Needed
- // to verify the \exchange_sig\.
- deposit_timestamp: Timestamp;
-
- // At what time the refund possibility expired (needed to verify exchange_sig).
- refund_deadline: Timestamp;
-
- // Public key of the coin for which we have conflicting information.
- coin_pub: EddsaPublicKey;
+ // The response from the exchange which tells us when the
+ // coin was returned to us, except that it does not match
+ // the expected value of the coin.
+ //
+ // This field is NOT provided by the current implementation,
+ // because this would be quite expensive to generate and is
+ // hardly needed _here_. Once we add automated reports for
+ // the Taler auditor, we need to generate this data anyway
+ // and should probably return it here as well.
+ // exchange_transfer?: TrackTransferResponse;
- // Amount the exchange counted the coin for in the transfer.
- amount_with_fee: Amount;
+ // Public key of the exchange used to sign the response to
+ // our deposit request.
+ deposit_exchange_pub: EddsaPublicKey;
- // Expected value of the coin.
- coin_value: Amount;
+ // Signature of the exchange signing the (conflicting) response.
+ // Signs over a struct TALER_DepositConfirmationPS.
+ deposit_exchange_sig: EddsaSignature;
- // Expected deposit fee of the coin.
- coin_fee: Amount;
+ // Hash of the merchant's bank account the wire transfer went to
+ h_wire: HashCode;
- // Expected deposit fee of the coin.
- deposit_fee: Amount;
+ // Hash of the contract terms with the conflicting deposit.
+ h_contract_terms: HashCode;
- }
+ // At what time the exchange received the deposit. Needed
+ // to verify the \exchange_sig\.
+ deposit_timestamp: Timestamp;
- // interface TrackTransferProof {
- // // signature from the exchange made with purpose
- // // TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT
- // exchange_sig: EddsaSignature;
+ // At what time the refund possibility expired (needed to verify exchange_sig).
+ refund_deadline: Timestamp;
- // // public EdDSA key of the exchange that was used to generate the signature.
- // // Should match one of the exchange's signing keys from /keys. Again given
- // // explicitly as the client might otherwise be confused by clock skew as to
- // // which signing key was used.
- // exchange_pub: EddsaSignature;
+ // Public key of the coin for which we have conflicting information.
+ coin_pub: EddsaPublicKey;
- // // hash of the wire details (identical for all deposits)
- // // Needed to check the exchange_sig
- // h_wire: HashCode;
- // }
+ // Amount the exchange counted the coin for in the transfer.
+ amount_with_fee: Amount;
- }
+ // Expected value of the coin.
+ coin_value: Amount;
+ // Expected deposit fee of the coin.
+ coin_fee: Amount;
- interface ContractTerms {
- // Human-readable description of the whole purchase
- summary: string;
-
- // Map from IETF BCP 47 language tags to localized summaries
- summary_i18n?: { [lang_tag: string]: string };
-
- // Unique, free-form identifier for the proposal.
- // Must be unique within a merchant instance.
- // For merchants that do not store proposals in their DB
- // before the customer paid for them, the order_id can be used
- // by the frontend to restore a proposal from the information
- // encoded in it (such as a short product identifier and timestamp).
- order_id: string;
-
- // Total price for the transaction.
- // The exchange will subtract deposit fees from that amount
- // before transferring it to the merchant.
- amount: Amount;
-
- // The URL for this purchase. Every time is is visited, the merchant
- // will send back to the customer the same proposal. Clearly, this URL
- // can be bookmarked and shared by users.
- fulfillment_url?: string;
-
- // Maximum total deposit fee accepted by the merchant for this contract
- max_fee: Amount;
-
- // Maximum wire fee accepted by the merchant (customer share to be
- // divided by the 'wire_fee_amortization' factor, and further reduced
- // if deposit fees are below 'max_fee'). Default if missing is zero.
- max_wire_fee: Amount;
-
- // Over how many customer transactions does the merchant expect to
- // amortize wire fees on average? If the exchange's wire fee is
- // above 'max_wire_fee', the difference is divided by this number
- // to compute the expected customer's contribution to the wire fee.
- // The customer's contribution may further be reduced by the difference
- // between the 'max_fee' and the sum of the actual deposit fees.
- // Optional, default value if missing is 1. 0 and negative values are
- // invalid and also interpreted as 1.
- wire_fee_amortization: number;
-
- // List of products that are part of the purchase (see Product).
- products: Product[];
-
- // Time when this contract was generated
- timestamp: TalerProtocolTimestamp;
-
- // After this deadline has passed, no refunds will be accepted.
- refund_deadline: TalerProtocolTimestamp;
-
- // After this deadline, the merchant won't accept payments for the contact
- pay_deadline: TalerProtocolTimestamp;
-
- // Transfer deadline for the exchange. Must be in the
- // deposit permissions of coins used to pay for this order.
- wire_transfer_deadline: TalerProtocolTimestamp;
-
- // Merchant's public key used to sign this proposal; this information
- // is typically added by the backend Note that this can be an ephemeral key.
- merchant_pub: EddsaPublicKey;
-
- // Base URL of the (public!) merchant backend API.
- // Must be an absolute URL that ends with a slash.
- merchant_base_url: string;
-
- // More info about the merchant, see below
- merchant: Merchant;
-
- // The hash of the merchant instance's wire details.
- h_wire: HashCode;
-
- // Wire transfer method identifier for the wire method associated with h_wire.
- // The wallet may only select exchanges via a matching auditor if the
- // exchange also supports this wire method.
- // The wire transfer fees must be added based on this wire transfer method.
- wire_method: string;
-
- // Any exchanges audited by these auditors are accepted by the merchant.
- auditors: Auditor[];
-
- // Exchanges that the merchant accepts even if it does not accept any auditors that audit them.
- exchanges: Exchange[];
-
- // Delivery location for (all!) products.
- delivery_location?: Location;
-
- // Time indicating when the order should be delivered.
- // May be overwritten by individual products.
- delivery_date?: TalerProtocolTimestamp;
-
- // Nonce generated by the wallet and echoed by the merchant
- // in this field when the proposal is generated.
- nonce: string;
-
- // Specifies for how long the wallet should try to get an
- // automatic refund for the purchase. If this field is
- // present, the wallet should wait for a few seconds after
- // the purchase and then automatically attempt to obtain
- // a refund. The wallet should probe until "delay"
- // after the payment was successful (i.e. via long polling
- // or via explicit requests with exponential back-off).
- //
- // In particular, if the wallet is offline
- // at that time, it MUST repeat the request until it gets
- // one response from the merchant after the delay has expired.
- // If the refund is granted, the wallet MUST automatically
- // recover the payment. This is used in case a merchant
- // knows that it might be unable to satisfy the contract and
- // desires for the wallet to attempt to get the refund without any
- // customer interaction. Note that it is NOT an error if the
- // merchant does not grant a refund.
- auto_refund?: RelativeTime;
-
- // Extra data that is only interpreted by the merchant frontend.
- // Useful when the merchant needs to store extra information on a
- // contract without storing it separately in their database.
- extra?: any;
-
- // Minimum age buyer must have (in years). Default is 0.
- minimum_age?: Integer;
+ // Expected deposit fee of the coin.
+ deposit_fee: Amount;
}
+ // interface TrackTransferProof {
+ // // signature from the exchange made with purpose
+ // // TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT
+ // exchange_sig: EddsaSignature;
+
+ // // public EdDSA key of the exchange that was used to generate the signature.
+ // // Should match one of the exchange's signing keys from /keys. Again given
+ // // explicitly as the client might otherwise be confused by clock skew as to
+ // // which signing key was used.
+ // exchange_pub: EddsaSignature;
+
+ // // hash of the wire details (identical for all deposits)
+ // // Needed to check the exchange_sig
+ // h_wire: HashCode;
+ // }
+ }
+
+ interface ContractTerms {
+ // Human-readable description of the whole purchase
+ summary: string;
+
+ // Map from IETF BCP 47 language tags to localized summaries
+ summary_i18n?: { [lang_tag: string]: string };
+
+ // Unique, free-form identifier for the proposal.
+ // Must be unique within a merchant instance.
+ // For merchants that do not store proposals in their DB
+ // before the customer paid for them, the order_id can be used
+ // by the frontend to restore a proposal from the information
+ // encoded in it (such as a short product identifier and timestamp).
+ order_id: string;
+
+ // Total price for the transaction.
+ // The exchange will subtract deposit fees from that amount
+ // before transferring it to the merchant.
+ amount: Amount;
+
+ // The URL for this purchase. Every time is is visited, the merchant
+ // will send back to the customer the same proposal. Clearly, this URL
+ // can be bookmarked and shared by users.
+ fulfillment_url?: string;
+
+ // Maximum total deposit fee accepted by the merchant for this contract
+ max_fee: Amount;
+
+ // Maximum wire fee accepted by the merchant (customer share to be
+ // divided by the 'wire_fee_amortization' factor, and further reduced
+ // if deposit fees are below 'max_fee'). Default if missing is zero.
+ max_wire_fee: Amount;
+
+ // Over how many customer transactions does the merchant expect to
+ // amortize wire fees on average? If the exchange's wire fee is
+ // above 'max_wire_fee', the difference is divided by this number
+ // to compute the expected customer's contribution to the wire fee.
+ // The customer's contribution may further be reduced by the difference
+ // between the 'max_fee' and the sum of the actual deposit fees.
+ // Optional, default value if missing is 1. 0 and negative values are
+ // invalid and also interpreted as 1.
+ wire_fee_amortization: number;
+
+ // List of products that are part of the purchase (see Product).
+ products: Product[];
+
+ // Time when this contract was generated
+ timestamp: TalerProtocolTimestamp;
+
+ // After this deadline has passed, no refunds will be accepted.
+ refund_deadline: TalerProtocolTimestamp;
+
+ // After this deadline, the merchant won't accept payments for the contact
+ pay_deadline: TalerProtocolTimestamp;
+
+ // Transfer deadline for the exchange. Must be in the
+ // deposit permissions of coins used to pay for this order.
+ wire_transfer_deadline: TalerProtocolTimestamp;
+
+ // Merchant's public key used to sign this proposal; this information
+ // is typically added by the backend Note that this can be an ephemeral key.
+ merchant_pub: EddsaPublicKey;
+
+ // Base URL of the (public!) merchant backend API.
+ // Must be an absolute URL that ends with a slash.
+ merchant_base_url: string;
+
+ // More info about the merchant, see below
+ merchant: Merchant;
+
+ // The hash of the merchant instance's wire details.
+ h_wire: HashCode;
+
+ // Wire transfer method identifier for the wire method associated with h_wire.
+ // The wallet may only select exchanges via a matching auditor if the
+ // exchange also supports this wire method.
+ // The wire transfer fees must be added based on this wire transfer method.
+ wire_method: string;
+
+ // Any exchanges audited by these auditors are accepted by the merchant.
+ auditors: Auditor[];
+
+ // Exchanges that the merchant accepts even if it does not accept any auditors that audit them.
+ exchanges: Exchange[];
+
+ // Delivery location for (all!) products.
+ delivery_location?: Location;
+
+ // Time indicating when the order should be delivered.
+ // May be overwritten by individual products.
+ delivery_date?: TalerProtocolTimestamp;
+
+ // Nonce generated by the wallet and echoed by the merchant
+ // in this field when the proposal is generated.
+ nonce: string;
+
+ // Specifies for how long the wallet should try to get an
+ // automatic refund for the purchase. If this field is
+ // present, the wallet should wait for a few seconds after
+ // the purchase and then automatically attempt to obtain
+ // a refund. The wallet should probe until "delay"
+ // after the payment was successful (i.e. via long polling
+ // or via explicit requests with exponential back-off).
+ //
+ // In particular, if the wallet is offline
+ // at that time, it MUST repeat the request until it gets
+ // one response from the merchant after the delay has expired.
+ // If the refund is granted, the wallet MUST automatically
+ // recover the payment. This is used in case a merchant
+ // knows that it might be unable to satisfy the contract and
+ // desires for the wallet to attempt to get the refund without any
+ // customer interaction. Note that it is NOT an error if the
+ // merchant does not grant a refund.
+ auto_refund?: RelativeTime;
+
+ // Extra data that is only interpreted by the merchant frontend.
+ // Useful when the merchant needs to store extra information on a
+ // contract without storing it separately in their database.
+ extra?: any;
+
+ // Minimum age buyer must have (in years). Default is 0.
+ minimum_age?: Integer;
+ }
}
diff --git a/packages/merchant-backoffice-ui/src/hooks/async.ts b/packages/merchant-backoffice-ui/src/hooks/async.ts
index a842c73e4..6c116e628 100644
--- a/packages/merchant-backoffice-ui/src/hooks/async.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/async.ts
@@ -15,38 +15,41 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { useState } from "preact/hooks";
import { cancelPendingRequest } from "./backend.js";
export interface Options {
- slowTolerance: number,
+ slowTolerance: number;
}
export interface AsyncOperationApi<T> {
- request: (...a: any) => void,
- cancel: () => void,
- data: T | undefined,
- isSlow: boolean,
- isLoading: boolean,
- error: string | undefined
+ request: (...a: any) => void;
+ cancel: () => void;
+ data: T | undefined;
+ isSlow: boolean;
+ isLoading: boolean;
+ error: string | undefined;
}
-export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: tooLong }: Options = { slowTolerance: 1000 }): AsyncOperationApi<T> {
+export function useAsync<T>(
+ fn?: (...args: any) => Promise<T>,
+ { slowTolerance: tooLong }: Options = { slowTolerance: 1000 },
+): AsyncOperationApi<T> {
const [data, setData] = useState<T | undefined>(undefined);
const [isLoading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<any>(undefined);
- const [isSlow, setSlow] = useState(false)
+ const [isSlow, setSlow] = useState(false);
const request = async (...args: any) => {
if (!fn) return;
setLoading(true);
const handler = setTimeout(() => {
- setSlow(true)
- }, tooLong)
+ setSlow(true);
+ }, tooLong);
try {
const result = await fn(...args);
@@ -55,14 +58,14 @@ export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance:
setError(error);
}
setLoading(false);
- setSlow(false)
- clearTimeout(handler)
+ setSlow(false);
+ clearTimeout(handler);
};
function cancel() {
- cancelPendingRequest()
+ cancelPendingRequest();
setLoading(false);
- setSlow(false)
+ setSlow(false);
}
return {
@@ -71,6 +74,6 @@ export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance:
data,
isSlow,
isLoading,
- error
+ error,
};
}
diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts
index 0c844700b..cbfac35de 100644
--- a/packages/merchant-backoffice-ui/src/hooks/backend.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts
@@ -25,17 +25,20 @@ import { MerchantBackend } from "../declaration.js";
import { useBackendContext } from "../context/backend.js";
import { useEffect, useState } from "preact/hooks";
import { DEFAULT_REQUEST_TIMEOUT } from "../utils/constants.js";
-import { axiosHandler, removeAxiosCancelToken } from "../utils/switchableAxios.js";
+import {
+ axiosHandler,
+ removeAxiosCancelToken,
+} from "../utils/switchableAxios.js";
export function useMatchMutate(): (
re: RegExp,
- value?: unknown
+ value?: unknown,
) => Promise<any> {
const { cache, mutate } = useSWRConfig();
if (!(cache instanceof Map)) {
throw new Error(
- "matchMutate requires the cache provider to be a Map instance"
+ "matchMutate requires the cache provider to be a Map instance",
);
}
@@ -154,7 +157,7 @@ interface RequestOptions {
function buildRequestOk<T>(
res: AxiosResponse<T>,
url: string,
- hasToken: boolean
+ hasToken: boolean,
): HttpResponseOk<T> {
return {
ok: true,
@@ -177,7 +180,7 @@ function buildRequestOk<T>(
function buildRequestFailed(
ex: AxiosError<MerchantBackend.ErrorDetail>,
url: string,
- hasToken: boolean
+ hasToken: boolean,
):
| HttpResponseClientError
| HttpResponseServerError
@@ -236,14 +239,14 @@ export function cancelPendingRequest(): void {
}
export function isAxiosError<T>(
- error: AxiosError | any
+ error: AxiosError | any,
): error is AxiosError<T> {
return error && error.isAxiosError;
}
export async function request<T>(
url: string,
- options: RequestOptions = {}
+ options: RequestOptions = {},
): Promise<HttpResponseOk<T>> {
const headers = options.token
? { Authorization: `Bearer ${options.token}` }
@@ -273,7 +276,7 @@ export async function request<T>(
export function multiFetcher<T>(
urls: string[],
token: string,
- backend: string
+ backend: string,
): Promise<HttpResponseOk<T>[]> {
return Promise.all(urls.map((url) => fetcher<T>(url, token, backend)));
}
@@ -281,7 +284,7 @@ export function multiFetcher<T>(
export function fetcher<T>(
url: string,
token: string,
- backend: string
+ backend: string,
): Promise<HttpResponseOk<T>> {
return request<T>(`${backend}${url}`, { token });
}
diff --git a/packages/merchant-backoffice-ui/src/hooks/index.ts b/packages/merchant-backoffice-ui/src/hooks/index.ts
index 9194ec0e9..0581d9938 100644
--- a/packages/merchant-backoffice-ui/src/hooks/index.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/index.ts
@@ -15,81 +15,109 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { StateUpdater, useCallback, useState } from "preact/hooks";
import { ValueOrFunction } from "../utils/types.js";
-
const calculateRootPath = () => {
- const rootPath = typeof window !== undefined ? window.location.origin + window.location.pathname : '/'
- return rootPath
-}
-
-export function useBackendURL(url?: string): [string, boolean, StateUpdater<string>, () => void] {
- const [value, setter] = useNotNullLocalStorage('backend-url', url || calculateRootPath())
- const [triedToLog, setTriedToLog] = useLocalStorage('tried-login')
+ const rootPath =
+ typeof window !== undefined
+ ? window.location.origin + window.location.pathname
+ : "/";
+ return rootPath;
+};
+
+export function useBackendURL(
+ url?: string,
+): [string, boolean, StateUpdater<string>, () => void] {
+ const [value, setter] = useNotNullLocalStorage(
+ "backend-url",
+ url || calculateRootPath(),
+ );
+ const [triedToLog, setTriedToLog] = useLocalStorage("tried-login");
const checkedSetter = (v: ValueOrFunction<string>) => {
- setTriedToLog('yes')
- return setter(p => (v instanceof Function ? v(p) : v).replace(/\/$/, ''))
- }
+ setTriedToLog("yes");
+ return setter((p) => (v instanceof Function ? v(p) : v).replace(/\/$/, ""));
+ };
const resetBackend = () => {
- setTriedToLog(undefined)
- }
- return [value, !!triedToLog, checkedSetter, resetBackend]
+ setTriedToLog(undefined);
+ };
+ return [value, !!triedToLog, checkedSetter, resetBackend];
}
-export function useBackendDefaultToken(initialValue?: string): [string | undefined, StateUpdater<string | undefined>] {
- return useLocalStorage('backend-token', initialValue)
+export function useBackendDefaultToken(
+ initialValue?: string,
+): [string | undefined, StateUpdater<string | undefined>] {
+ return useLocalStorage("backend-token", initialValue);
}
-export function useBackendInstanceToken(id: string): [string | undefined, StateUpdater<string | undefined>] {
- const [token, setToken] = useLocalStorage(`backend-token-${id}`)
- const [defaultToken, defaultSetToken] = useBackendDefaultToken()
+export function useBackendInstanceToken(
+ id: string,
+): [string | undefined, StateUpdater<string | undefined>] {
+ const [token, setToken] = useLocalStorage(`backend-token-${id}`);
+ const [defaultToken, defaultSetToken] = useBackendDefaultToken();
// instance named 'default' use the default token
- if (id === 'default') {
- return [defaultToken, defaultSetToken]
+ if (id === "default") {
+ return [defaultToken, defaultSetToken];
}
- return [token, setToken]
+ return [token, setToken];
}
export function useLang(initial?: string): [string, StateUpdater<string>] {
- const browserLang = typeof window !== "undefined" ? navigator.language || (navigator as any).userLanguage : undefined;
- const defaultLang = (browserLang || initial || 'en').substring(0, 2)
- return useNotNullLocalStorage('lang-preference', defaultLang)
+ const browserLang =
+ typeof window !== "undefined"
+ ? navigator.language || (navigator as any).userLanguage
+ : undefined;
+ const defaultLang = (browserLang || initial || "en").substring(0, 2);
+ return useNotNullLocalStorage("lang-preference", defaultLang);
}
-export function useLocalStorage(key: string, initialValue?: string): [string | undefined, StateUpdater<string | undefined>] {
- const [storedValue, setStoredValue] = useState<string | undefined>((): string | undefined => {
- return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue;
- });
-
- const setValue = (value?: string | ((val?: string) => string | undefined)) => {
- setStoredValue(p => {
- const toStore = value instanceof Function ? value(p) : value
+export function useLocalStorage(
+ key: string,
+ initialValue?: string,
+): [string | undefined, StateUpdater<string | undefined>] {
+ const [storedValue, setStoredValue] = useState<string | undefined>(
+ (): string | undefined => {
+ return typeof window !== "undefined"
+ ? window.localStorage.getItem(key) || initialValue
+ : initialValue;
+ },
+ );
+
+ const setValue = (
+ value?: string | ((val?: string) => string | undefined),
+ ) => {
+ setStoredValue((p) => {
+ const toStore = value instanceof Function ? value(p) : value;
if (typeof window !== "undefined") {
if (!toStore) {
- window.localStorage.removeItem(key)
+ window.localStorage.removeItem(key);
} else {
window.localStorage.setItem(key, toStore);
}
}
- return toStore
- })
+ return toStore;
+ });
};
return [storedValue, setValue];
}
-export function useNotNullLocalStorage(key: string, initialValue: string): [string, StateUpdater<string>] {
+export function useNotNullLocalStorage(
+ key: string,
+ initialValue: string,
+): [string, StateUpdater<string>] {
const [storedValue, setStoredValue] = useState<string>((): string => {
- return typeof window !== "undefined" ? window.localStorage.getItem(key) || initialValue : initialValue;
+ return typeof window !== "undefined"
+ ? window.localStorage.getItem(key) || initialValue
+ : initialValue;
});
const setValue = (value: string | ((val: string) => string)) => {
@@ -97,7 +125,7 @@ export function useNotNullLocalStorage(key: string, initialValue: string): [stri
setStoredValue(valueToStore);
if (typeof window !== "undefined") {
if (!valueToStore) {
- window.localStorage.removeItem(key)
+ window.localStorage.removeItem(key);
} else {
window.localStorage.setItem(key, valueToStore);
}
@@ -106,5 +134,3 @@ export function useNotNullLocalStorage(key: string, initialValue: string): [stri
return [storedValue, setValue];
}
-
-
diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.ts b/packages/merchant-backoffice-ui/src/hooks/instance.ts
index 7564f8ef6..ab59487de 100644
--- a/packages/merchant-backoffice-ui/src/hooks/instance.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/instance.ts
@@ -28,7 +28,7 @@ import {
interface InstanceAPI {
updateInstance: (
- data: MerchantBackend.Instances.InstanceReconfigurationMessage
+ data: MerchantBackend.Instances.InstanceReconfigurationMessage,
) => Promise<void>;
deleteInstance: () => Promise<void>;
clearToken: () => Promise<void>;
@@ -40,7 +40,7 @@ export function useAdminAPI(): AdminAPI {
const mutateAll = useMatchMutate();
const createInstance = async (
- instance: MerchantBackend.Instances.InstanceConfigurationMessage
+ instance: MerchantBackend.Instances.InstanceConfigurationMessage,
): Promise<void> => {
await request(`${url}/management/instances`, {
method: "post",
@@ -77,7 +77,7 @@ export function useAdminAPI(): AdminAPI {
export interface AdminAPI {
createInstance: (
- data: MerchantBackend.Instances.InstanceConfigurationMessage
+ data: MerchantBackend.Instances.InstanceConfigurationMessage,
) => Promise<void>;
deleteInstance: (id: string) => Promise<void>;
purgeInstance: (id: string) => Promise<void>;
@@ -88,7 +88,7 @@ export function useManagementAPI(instanceId: string): InstanceAPI {
const { url, token, updateLoginStatus } = useBackendContext();
const updateInstance = async (
- instance: MerchantBackend.Instances.InstanceReconfigurationMessage
+ instance: MerchantBackend.Instances.InstanceReconfigurationMessage,
): Promise<void> => {
await request(`${url}/management/instances/${instanceId}`, {
method: "patch",
@@ -125,7 +125,7 @@ export function useManagementAPI(instanceId: string): InstanceAPI {
data: { method: "token", token: newToken },
});
- updateLoginStatus(url, newToken)
+ updateLoginStatus(url, newToken);
mutateAll(/\/management\/instances/);
};
@@ -134,7 +134,11 @@ export function useManagementAPI(instanceId: string): InstanceAPI {
export function useInstanceAPI(): InstanceAPI {
const { mutate } = useSWRConfig();
- const { url: baseUrl, token: adminToken, updateLoginStatus } = useBackendContext();
+ const {
+ url: baseUrl,
+ token: adminToken,
+ updateLoginStatus,
+ } = useBackendContext();
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
@@ -142,7 +146,7 @@ export function useInstanceAPI(): InstanceAPI {
: { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const updateInstance = async (
- instance: MerchantBackend.Instances.InstanceReconfigurationMessage
+ instance: MerchantBackend.Instances.InstanceReconfigurationMessage,
): Promise<void> => {
await request(`${url}/private/`, {
method: "patch",
@@ -181,7 +185,7 @@ export function useInstanceAPI(): InstanceAPI {
data: { method: "token", token: newToken },
});
- updateLoginStatus(baseUrl, newToken)
+ updateLoginStatus(baseUrl, newToken);
mutate([`/private/`, token, url], null);
};
@@ -252,7 +256,7 @@ export function useInstanceKYCDetails(): HttpResponse<KYCStatus> {
}
export function useManagedInstanceDetails(
- instanceId: string
+ instanceId: string,
): HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> {
const { url, token } = useBackendContext();
diff --git a/packages/merchant-backoffice-ui/src/hooks/listener.ts b/packages/merchant-backoffice-ui/src/hooks/listener.ts
index df037de7f..d101f7bb8 100644
--- a/packages/merchant-backoffice-ui/src/hooks/listener.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/listener.ts
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { useState } from "preact/hooks";
@@ -26,25 +26,27 @@ import { useState } from "preact/hooks";
* an action (a button) and other child have the action implemented (like
* gathering information with a form). The difference with other approaches is
* that in this case the parent component is not holding the state.
- *
- * It will return a subscriber and activator.
- *
+ *
+ * It will return a subscriber and activator.
+ *
* The activator may be undefined, if it is undefined it is indicating that the
* subscriber is not ready to be called.
*
* The subscriber will receive a function (the listener) that will be call when the
* activator runs. The listener must return the collected information.
- *
+ *
* As a result, when the activator is triggered by a child component, the
* @action function is called receives the information from the listener defined by other
- * child component
+ * child component
*
* @param action from <T> to <R>
* @returns activator and subscriber, undefined activator means that there is not subscriber
*/
-export function useListener<T, R = any>(action: (r: T) => Promise<R>): [undefined | (() => Promise<R>), (listener?: () => T) => void] {
- type RunnerHandler = { toBeRan?: () => Promise<R>; };
+export function useListener<T, R = any>(
+ action: (r: T) => Promise<R>,
+): [undefined | (() => Promise<R>), (listener?: () => T) => void] {
+ type RunnerHandler = { toBeRan?: () => Promise<R> };
const [state, setState] = useState<RunnerHandler>({});
/**
@@ -58,24 +60,26 @@ export function useListener<T, R = any>(action: (r: T) => Promise<R>): [undefine
toBeRan: () => {
const whatWeGetFromTheListener = listener();
return action(whatWeGetFromTheListener);
- }
+ },
});
} else {
setState({
- toBeRan: undefined
- })
+ toBeRan: undefined,
+ });
}
};
/**
* activator will call runner if there is someone subscribed
*/
- const activator = state.toBeRan ? async () => {
- if (state.toBeRan) {
- return state.toBeRan();
- }
- return Promise.reject();
- } : undefined;
+ const activator = state.toBeRan
+ ? async () => {
+ if (state.toBeRan) {
+ return state.toBeRan();
+ }
+ return Promise.reject();
+ }
+ : undefined;
return [activator, subscriber];
}
diff --git a/packages/merchant-backoffice-ui/src/hooks/notifications.ts b/packages/merchant-backoffice-ui/src/hooks/notifications.ts
index 63b1e5e16..133ddd80b 100644
--- a/packages/merchant-backoffice-ui/src/hooks/notifications.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/notifications.ts
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { useState } from "preact/hooks";
import { Notification } from "../utils/types.js";
@@ -28,21 +28,29 @@ interface Result {
removeNotification: (n: Notification) => void;
}
-type NotificationWithDate = Notification & { since: Date }
+type NotificationWithDate = Notification & { since: Date };
-export function useNotifications(initial: Notification[] = [], timeout = 3000): Result {
- const [notifications, setNotifications] = useState<(NotificationWithDate)[]>(initial.map(i => ({...i, since: new Date() })))
+export function useNotifications(
+ initial: Notification[] = [],
+ timeout = 3000,
+): Result {
+ const [notifications, setNotifications] = useState<NotificationWithDate[]>(
+ initial.map((i) => ({ ...i, since: new Date() })),
+ );
const pushNotification = (n: Notification): void => {
- const entry = { ...n, since: new Date() }
- setNotifications(ns => [...ns, entry])
- if (n.type !== 'ERROR') setTimeout(() => {
- setNotifications(ns => ns.filter(x => x.since !== entry.since))
- }, timeout)
- }
+ const entry = { ...n, since: new Date() };
+ setNotifications((ns) => [...ns, entry]);
+ if (n.type !== "ERROR")
+ setTimeout(() => {
+ setNotifications((ns) => ns.filter((x) => x.since !== entry.since));
+ }, timeout);
+ };
const removeNotification = (notif: Notification) => {
- setNotifications((ns: NotificationWithDate[]) => ns.filter(n => n !== notif))
- }
- return { notifications, pushNotification, removeNotification }
+ setNotifications((ns: NotificationWithDate[]) =>
+ ns.filter((n) => n !== notif),
+ );
+ };
+ return { notifications, pushNotification, removeNotification };
}
diff --git a/packages/merchant-backoffice-ui/src/hooks/order.ts b/packages/merchant-backoffice-ui/src/hooks/order.ts
index 75c474187..d1e26b671 100644
--- a/packages/merchant-backoffice-ui/src/hooks/order.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/order.ts
@@ -32,15 +32,15 @@ import {
export interface OrderAPI {
//FIXME: add OutOfStockResponse on 410
createOrder: (
- data: MerchantBackend.Orders.PostOrderRequest
+ data: MerchantBackend.Orders.PostOrderRequest,
) => Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>>;
forgetOrder: (
id: string,
- data: MerchantBackend.Orders.ForgetRequest
+ data: MerchantBackend.Orders.ForgetRequest,
) => Promise<HttpResponseOk<void>>;
refundOrder: (
id: string,
- data: MerchantBackend.Orders.RefundRequest
+ data: MerchantBackend.Orders.RefundRequest,
) => Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>>;
deleteOrder: (id: string) => Promise<HttpResponseOk<void>>;
getPaymentURL: (id: string) => Promise<HttpResponseOk<string>>;
@@ -56,7 +56,7 @@ export function orderFetcher<T>(
refunded?: YesOrNo,
wired?: YesOrNo,
searchDate?: Date,
- delta?: number
+ delta?: number,
): Promise<HttpResponseOk<T>> {
const date_ms =
delta && delta < 0 && searchDate
@@ -78,16 +78,16 @@ export function useOrderAPI(): OrderAPI {
const { url, token } = !admin
? {
- url: baseUrl,
- token: adminToken,
- }
+ url: baseUrl,
+ token: adminToken,
+ }
: {
- url: `${baseUrl}/instances/${id}`,
- token: instanceToken,
- };
+ url: `${baseUrl}/instances/${id}`,
+ token: instanceToken,
+ };
const createOrder = async (
- data: MerchantBackend.Orders.PostOrderRequest
+ data: MerchantBackend.Orders.PostOrderRequest,
): Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>> => {
const res = await request<MerchantBackend.Orders.PostOrderResponse>(
`${url}/private/orders`,
@@ -95,7 +95,7 @@ export function useOrderAPI(): OrderAPI {
method: "post",
token,
data,
- }
+ },
);
await mutateAll(/.*private\/orders.*/);
// mutate('')
@@ -103,7 +103,7 @@ export function useOrderAPI(): OrderAPI {
};
const refundOrder = async (
orderId: string,
- data: MerchantBackend.Orders.RefundRequest
+ data: MerchantBackend.Orders.RefundRequest,
): Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>> => {
mutateAll(/@"\/private\/orders"@/);
const res = request<MerchantBackend.Orders.MerchantRefundResponse>(
@@ -112,17 +112,17 @@ export function useOrderAPI(): OrderAPI {
method: "post",
token,
data,
- }
+ },
);
// order list returns refundable information, so we must evict everything
await mutateAll(/.*private\/orders.*/);
- return res
+ return res;
};
const forgetOrder = async (
orderId: string,
- data: MerchantBackend.Orders.ForgetRequest
+ data: MerchantBackend.Orders.ForgetRequest,
): Promise<HttpResponseOk<void>> => {
mutateAll(/@"\/private\/orders"@/);
const res = request<void>(`${url}/private/orders/${orderId}/forget`, {
@@ -132,10 +132,10 @@ export function useOrderAPI(): OrderAPI {
});
// we may be forgetting some fields that are pare of the listing, so we must evict everything
await mutateAll(/.*private\/orders.*/);
- return res
+ return res;
};
const deleteOrder = async (
- orderId: string
+ orderId: string,
): Promise<HttpResponseOk<void>> => {
mutateAll(/@"\/private\/orders"@/);
const res = request<void>(`${url}/private/orders/${orderId}`, {
@@ -143,18 +143,18 @@ export function useOrderAPI(): OrderAPI {
token,
});
await mutateAll(/.*private\/orders.*/);
- return res
+ return res;
};
const getPaymentURL = async (
- orderId: string
+ orderId: string,
): Promise<HttpResponseOk<string>> => {
return request<MerchantBackend.Orders.MerchantOrderStatusResponse>(
`${url}/private/orders/${orderId}`,
{
method: "get",
token,
- }
+ },
).then((res) => {
const url =
res.data.order_status === "unpaid"
@@ -170,14 +170,14 @@ export function useOrderAPI(): OrderAPI {
}
export function useOrderDetails(
- oderId: string
+ oderId: string,
): HttpResponse<MerchantBackend.Orders.MerchantOrderStatusResponse> {
const { url: baseUrl, token: baseToken } = useBackendContext();
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: baseToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: baseToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const { data, error, isValidating } = useSWR<
HttpResponseOk<MerchantBackend.Orders.MerchantOrderStatusResponse>,
@@ -205,14 +205,14 @@ export interface InstanceOrderFilter {
export function useInstanceOrders(
args?: InstanceOrderFilter,
- updateFilter?: (d: Date) => void
+ updateFilter?: (d: Date) => void,
): HttpResponsePaginated<MerchantBackend.Orders.OrderHistory> {
const { url: baseUrl, token: baseToken } = useBackendContext();
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: baseToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: baseToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const [pageBefore, setPageBefore] = useState(1);
const [pageAfter, setPageAfter] = useState(1);
@@ -241,7 +241,7 @@ export function useInstanceOrders(
args?.date,
totalBefore,
],
- orderFetcher
+ orderFetcher,
);
const {
data: afterData,
@@ -258,7 +258,7 @@ export function useInstanceOrders(
args?.date,
-totalAfter,
],
- orderFetcher
+ orderFetcher,
);
//this will save last result
@@ -278,7 +278,8 @@ export function useInstanceOrders(
// if the query returns less that we ask, then we have reach the end or beginning
const isReachingEnd = afterData && afterData.data.orders.length < totalAfter;
- const isReachingStart = args?.date === undefined ||
+ const isReachingStart =
+ args?.date === undefined ||
(beforeData && beforeData.data.orders.length < totalBefore);
const pagination = {
@@ -290,9 +291,9 @@ export function useInstanceOrders(
setPageAfter(pageAfter + 1);
} else {
const from =
- afterData.data.orders[afterData.data.orders.length - 1].timestamp
- .t_s;
- if (from && from !== "never" && updateFilter) updateFilter(new Date(from * 1000));
+ afterData.data.orders[afterData.data.orders.length - 1].timestamp.t_s;
+ if (from && from !== "never" && updateFilter)
+ updateFilter(new Date(from * 1000));
}
},
loadMorePrev: () => {
@@ -303,7 +304,8 @@ export function useInstanceOrders(
const from =
beforeData.data.orders[beforeData.data.orders.length - 1].timestamp
.t_s;
- if (from && from !== "never" && updateFilter) updateFilter(new Date(from * 1000));
+ if (from && from !== "never" && updateFilter)
+ updateFilter(new Date(from * 1000));
}
},
};
@@ -312,9 +314,9 @@ export function useInstanceOrders(
!beforeData || !afterData
? []
: (beforeData || lastBefore).data.orders
- .slice()
- .reverse()
- .concat((afterData || lastAfter).data.orders);
+ .slice()
+ .reverse()
+ .concat((afterData || lastAfter).data.orders);
if (loadingAfter || loadingBefore) return { loading: true, data: { orders } };
if (beforeData && afterData) {
return { ok: true, data: { orders }, ...pagination };
diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts b/packages/merchant-backoffice-ui/src/hooks/product.ts
index 7a0c4dec1..fb7889834 100644
--- a/packages/merchant-backoffice-ui/src/hooks/product.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/product.ts
@@ -24,21 +24,21 @@ import {
HttpResponseOk,
multiFetcher,
request,
- useMatchMutate
+ useMatchMutate,
} from "./backend.js";
export interface ProductAPI {
createProduct: (
- data: MerchantBackend.Products.ProductAddDetail
+ data: MerchantBackend.Products.ProductAddDetail,
) => Promise<void>;
updateProduct: (
id: string,
- data: MerchantBackend.Products.ProductPatchDetail
+ data: MerchantBackend.Products.ProductPatchDetail,
) => Promise<void>;
deleteProduct: (id: string) => Promise<void>;
lockProduct: (
id: string,
- data: MerchantBackend.Products.LockRequest
+ data: MerchantBackend.Products.LockRequest,
) => Promise<void>;
}
@@ -49,11 +49,11 @@ export function useProductAPI(): ProductAPI {
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: adminToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: adminToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const createProduct = async (
- data: MerchantBackend.Products.ProductAddDetail
+ data: MerchantBackend.Products.ProductAddDetail,
): Promise<void> => {
const res = await request(`${url}/private/products`, {
method: "post",
@@ -66,7 +66,7 @@ export function useProductAPI(): ProductAPI {
const updateProduct = async (
productId: string,
- data: MerchantBackend.Products.ProductPatchDetail
+ data: MerchantBackend.Products.ProductPatchDetail,
): Promise<void> => {
const r = await request(`${url}/private/products/${productId}`, {
method: "patch",
@@ -87,7 +87,7 @@ export function useProductAPI(): ProductAPI {
const lockProduct = async (
productId: string,
- data: MerchantBackend.Products.LockRequest
+ data: MerchantBackend.Products.LockRequest,
): Promise<void> => {
await request(`${url}/private/products/${productId}/lock`, {
method: "post",
@@ -108,8 +108,8 @@ export function useInstanceProducts(): HttpResponse<
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: baseToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: baseToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const { data: list, error: listError } = useSWR<
HttpResponseOk<MerchantBackend.Products.InventorySummaryResponse>,
@@ -123,7 +123,7 @@ export function useInstanceProducts(): HttpResponse<
});
const paths = (list?.data.products || []).map(
- (p) => `/private/products/${p.product_id}`
+ (p) => `/private/products/${p.product_id}`,
);
const { data: products, error: productError } = useSWR<
HttpResponseOk<MerchantBackend.Products.ProductDetail>[],
@@ -136,7 +136,6 @@ export function useInstanceProducts(): HttpResponse<
refreshWhenOffline: false,
});
-
if (listError) return listError;
if (productError) return productError;
@@ -154,20 +153,20 @@ export function useInstanceProducts(): HttpResponse<
}
export function useProductDetails(
- productId: string
+ productId: string,
): HttpResponse<MerchantBackend.Products.ProductDetail> {
const { url: baseUrl, token: baseToken } = useBackendContext();
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
? {
- url: baseUrl,
- token: baseToken,
- }
+ url: baseUrl,
+ token: baseToken,
+ }
: {
- url: `${baseUrl}/instances/${id}`,
- token: instanceToken,
- };
+ url: `${baseUrl}/instances/${id}`,
+ token: instanceToken,
+ };
const { data, error, isValidating } = useSWR<
HttpResponseOk<MerchantBackend.Products.ProductDetail>,
diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts b/packages/merchant-backoffice-ui/src/hooks/reserves.ts
index 0810ad26c..f6d77f113 100644
--- a/packages/merchant-backoffice-ui/src/hooks/reserves.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/reserves.ts
@@ -33,11 +33,11 @@ export function useReservesAPI(): ReserveMutateAPI {
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: adminToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: adminToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const createReserve = async (
- data: MerchantBackend.Tips.ReserveCreateRequest
+ data: MerchantBackend.Tips.ReserveCreateRequest,
): Promise<
HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation>
> => {
@@ -47,7 +47,7 @@ export function useReservesAPI(): ReserveMutateAPI {
method: "post",
token,
data,
- }
+ },
);
//evict reserve list query
@@ -58,7 +58,7 @@ export function useReservesAPI(): ReserveMutateAPI {
const authorizeTipReserve = async (
pub: string,
- data: MerchantBackend.Tips.TipCreateRequest
+ data: MerchantBackend.Tips.TipCreateRequest,
): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => {
const res = await request<MerchantBackend.Tips.TipCreateConfirmation>(
`${url}/private/reserves/${pub}/authorize-tip`,
@@ -66,7 +66,7 @@ export function useReservesAPI(): ReserveMutateAPI {
method: "post",
token,
data,
- }
+ },
);
//evict reserve details query
@@ -76,7 +76,7 @@ export function useReservesAPI(): ReserveMutateAPI {
};
const authorizeTip = async (
- data: MerchantBackend.Tips.TipCreateRequest
+ data: MerchantBackend.Tips.TipCreateRequest,
): Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>> => {
const res = await request<MerchantBackend.Tips.TipCreateConfirmation>(
`${url}/private/tips`,
@@ -84,7 +84,7 @@ export function useReservesAPI(): ReserveMutateAPI {
method: "post",
token,
data,
- }
+ },
);
//evict all details query
@@ -110,14 +110,14 @@ export function useReservesAPI(): ReserveMutateAPI {
export interface ReserveMutateAPI {
createReserve: (
- data: MerchantBackend.Tips.ReserveCreateRequest
+ data: MerchantBackend.Tips.ReserveCreateRequest,
) => Promise<HttpResponseOk<MerchantBackend.Tips.ReserveCreateConfirmation>>;
authorizeTipReserve: (
id: string,
- data: MerchantBackend.Tips.TipCreateRequest
+ data: MerchantBackend.Tips.TipCreateRequest,
) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>;
authorizeTip: (
- data: MerchantBackend.Tips.TipCreateRequest
+ data: MerchantBackend.Tips.TipCreateRequest,
) => Promise<HttpResponseOk<MerchantBackend.Tips.TipCreateConfirmation>>;
deleteReserve: (id: string) => Promise<HttpResponse<void>>;
}
@@ -127,8 +127,8 @@ export function useInstanceReserves(): HttpResponse<MerchantBackend.Tips.Tipping
const { token: instanceToken, id, admin } = useInstanceContext();
const { url, token } = !admin
- ? { url: baseUrl, token: baseToken, }
- : { url: `${baseUrl}/instances/${id}`, token: instanceToken, };
+ ? { url: baseUrl, token: baseToken }
+ : { url: `${baseUrl}/instances/${id}`, token: instanceToken };
const { data, error, isValidating } = useSWR<
HttpResponseOk<MerchantBackend.Tips.TippingReserveStatus>,
@@ -142,7 +142,7 @@ export function useInstanceReserves(): HttpResponse<MerchantBackend.Tips.Tipping
}
export function useReserveDetails(
- reserveId: string
+ reserveId: string,
): HttpResponse<MerchantBackend.Tips.ReserveDetail> {
const { url: baseUrl } = useBackendContext();
const { token, id: instanceId, admin } = useInstanceContext();
@@ -167,7 +167,7 @@ export function useReserveDetails(
}
export function useTipDetails(
- tipId: string
+ tipId: string,
): HttpResponse<MerchantBackend.Tips.TipDetails> {
const { url: baseUrl } = useBackendContext();
const { token, id: instanceId, admin } = useInstanceContext();
@@ -194,7 +194,7 @@ export function useTipDetails(
function reserveDetailFetcher<T>(
url: string,
token: string,
- backend: string
+ backend: string,
): Promise<HttpResponseOk<T>> {
return request<T>(`${backend}${url}`, {
token,
@@ -207,7 +207,7 @@ function reserveDetailFetcher<T>(
function tipsDetailFetcher<T>(
url: string,
token: string,
- backend: string
+ backend: string,
): Promise<HttpResponseOk<T>> {
return request<T>(`${backend}${url}`, {
token,
diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.ts
index 2ab22b1a1..d1ac2c285 100644
--- a/packages/merchant-backoffice-ui/src/hooks/transfer.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/transfer.ts
@@ -35,7 +35,7 @@ async function transferFetcher<T>(
payto_uri?: string,
verified?: string,
position?: string,
- delta?: number
+ delta?: number,
): Promise<HttpResponseOk<T>> {
const params: any = {};
if (payto_uri !== undefined) params.payto_uri = payto_uri;
@@ -55,28 +55,31 @@ export function useTransferAPI(): TransferAPI {
const { url, token } = !admin
? {
- url: baseUrl,
- token: adminToken,
- }
+ url: baseUrl,
+ token: adminToken,
+ }
: {
- url: `${baseUrl}/instances/${id}`,
- token: instanceToken,
- };
+ url: `${baseUrl}/instances/${id}`,
+ token: instanceToken,
+ };
const informTransfer = async (
- data: MerchantBackend.Transfers.TransferInformation
+ data: MerchantBackend.Transfers.TransferInformation,
): Promise<
HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse>
> => {
- const res = await request<MerchantBackend.Transfers.MerchantTrackTransferResponse>(
- `${url}/private/transfers`, {
- method: "post",
- token,
- data,
- });
+ const res =
+ await request<MerchantBackend.Transfers.MerchantTrackTransferResponse>(
+ `${url}/private/transfers`,
+ {
+ method: "post",
+ token,
+ data,
+ },
+ );
await mutateAll(/.*private\/transfers.*/);
- return res
+ return res;
};
return { informTransfer };
@@ -84,7 +87,7 @@ export function useTransferAPI(): TransferAPI {
export interface TransferAPI {
informTransfer: (
- data: MerchantBackend.Transfers.TransferInformation
+ data: MerchantBackend.Transfers.TransferInformation,
) => Promise<
HttpResponseOk<MerchantBackend.Transfers.MerchantTrackTransferResponse>
>;
@@ -98,7 +101,7 @@ export interface InstanceTransferFilter {
export function useInstanceTransfers(
args?: InstanceTransferFilter,
- updatePosition?: (id: string) => void
+ updatePosition?: (id: string) => void,
): HttpResponsePaginated<MerchantBackend.Transfers.TransferList> {
const { url: baseUrl, token: baseToken } = useBackendContext();
const { token: instanceToken, id, admin } = useInstanceContext();
@@ -133,7 +136,7 @@ export function useInstanceTransfers(
args?.position,
totalBefore,
],
- transferFetcher
+ transferFetcher,
);
const {
data: afterData,
@@ -149,7 +152,7 @@ export function useInstanceTransfers(
args?.position,
-totalAfter,
],
- transferFetcher
+ transferFetcher,
);
//this will save last result
@@ -168,8 +171,10 @@ export function useInstanceTransfers(
if (afterError) return afterError;
// if the query returns less that we ask, then we have reach the end or beginning
- const isReachingEnd = afterData && afterData.data.transfers.length < totalAfter;
- const isReachingStart = args?.position === undefined ||
+ const isReachingEnd =
+ afterData && afterData.data.transfers.length < totalAfter;
+ const isReachingStart =
+ args?.position === undefined ||
(beforeData && beforeData.data.transfers.length < totalBefore);
const pagination = {
@@ -180,10 +185,10 @@ export function useInstanceTransfers(
if (afterData.data.transfers.length < MAX_RESULT_SIZE) {
setPageAfter(pageAfter + 1);
} else {
- const from =
- `${afterData.data
- .transfers[afterData.data.transfers.length - 1]
- .transfer_serial_id}`;
+ const from = `${
+ afterData.data.transfers[afterData.data.transfers.length - 1]
+ .transfer_serial_id
+ }`;
if (from && updatePosition) updatePosition(from);
}
},
@@ -192,10 +197,10 @@ export function useInstanceTransfers(
if (beforeData.data.transfers.length < MAX_RESULT_SIZE) {
setPageBefore(pageBefore + 1);
} else if (beforeData) {
- const from =
- `${beforeData.data
- .transfers[beforeData.data.transfers.length - 1]
- .transfer_serial_id}`;
+ const from = `${
+ beforeData.data.transfers[beforeData.data.transfers.length - 1]
+ .transfer_serial_id
+ }`;
if (from && updatePosition) updatePosition(from);
}
},
@@ -205,9 +210,9 @@ export function useInstanceTransfers(
!beforeData || !afterData
? []
: (beforeData || lastBefore).data.transfers
- .slice()
- .reverse()
- .concat((afterData || lastAfter).data.transfers);
+ .slice()
+ .reverse()
+ .concat((afterData || lastAfter).data.transfers);
if (loadingAfter || loadingBefore)
return { loading: true, data: { transfers } };
if (beforeData && afterData) {
diff --git a/packages/merchant-backoffice-ui/src/i18n/index.tsx b/packages/merchant-backoffice-ui/src/i18n/index.tsx
index 4afbfe2ba..da8d2dece 100644
--- a/packages/merchant-backoffice-ui/src/i18n/index.tsx
+++ b/packages/merchant-backoffice-ui/src/i18n/index.tsx
@@ -93,7 +93,7 @@ interface TranslateProps {
function getTranslatedChildren(
translation: string,
- children: ComponentChildren
+ children: ComponentChildren,
): ComponentChild[] {
const tr = translation.split(/%(\d+)\$s/);
const childArray = children instanceof Array ? children : [children];
@@ -167,7 +167,7 @@ export function TranslateSwitch({ children, target }: TranslateSwitchProps) {
if (child.type === TranslateSingular) {
singular = child;
}
- }
+ },
);
}
if (!singular || !plural) {
diff --git a/packages/merchant-backoffice-ui/src/i18n/strings.ts b/packages/merchant-backoffice-ui/src/i18n/strings.ts
index 0b270cb3c..f3049ec4c 100644
--- a/packages/merchant-backoffice-ui/src/i18n/strings.ts
+++ b/packages/merchant-backoffice-ui/src/i18n/strings.ts
@@ -15,3431 +15,1272 @@
*/
/*eslint quote-props: ["error", "consistent"]*/
-export const strings: {[s: string]: any} = {};
+export const strings: { [s: string]: any } = {};
-strings['de'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["de"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- ""
- ],
- "Check your token is valid": [
- ""
- ],
- "Couldn't access the server.": [
- ""
- ],
- "Could not infer instance id from url %1$s": [
- ""
- ],
- "HTTP status #%1$s: Server reported a problem": [
- ""
- ],
- "Got message: \"%1$s\" from: %2$s": [
- ""
- ],
- "No default instance": [
- ""
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- ""
- ],
- "Server reported a problem: HTTP status #%1$s": [
- ""
- ],
- "Got message: %1$s from: %2$s": [
- ""
- ],
- "Login required": [
- ""
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- ""
- ],
- "Confirm": [
- ""
- ],
- "The value %1$s is invalid for a payment url": [
- ""
- ],
- "pick a date": [
- ""
- ],
- "clear": [
- ""
- ],
- "never": [
- ""
- ],
- "Image should be smaller than 1 MB": [
- ""
- ],
- "Country": [
- ""
- ],
- "Address": [
- ""
- ],
- "Building number": [
- ""
- ],
- "Building name": [
- ""
- ],
- "Street": [
- ""
- ],
- "Post code": [
- ""
- ],
- "Town location": [
- ""
- ],
- "Town": [
- ""
- ],
- "District": [
- ""
- ],
- "Country subdivision": [
- ""
- ],
- "Product id": [
- ""
- ],
- "Description": [
- ""
- ],
- "Name": [
- ""
- ],
- "loading...": [
- ""
- ],
- "no products found": [
- ""
- ],
- "no results": [
- ""
- ],
- "Deleting": [
- ""
- ],
- "Changing": [
- ""
- ],
- "Manage token": [
- ""
- ],
- "Update": [
- ""
- ],
- "Remove": [
- ""
- ],
- "Cancel": [
- ""
- ],
- "Manage stock": [
- ""
- ],
- "Infinite": [
- ""
- ],
- "lost cannot be greater that current + incoming (max %1$s)": [
- ""
- ],
- "current stock will change from %1$s to %2$s": [
- ""
- ],
- "current stock will stay at %1$s": [
- ""
- ],
- "Incoming": [
- ""
- ],
- "Lost": [
- ""
- ],
- "Current": [
- ""
- ],
- "without stock": [
- ""
- ],
- "Next restock": [
- ""
- ],
- "Delivery address": [
- ""
- ],
- "this product has no taxes": [
- ""
- ],
- "Amount": [
- ""
- ],
- "currency and value separated with colon": [
- ""
- ],
- "Add": [
- ""
- ],
- "Instance": [
- ""
- ],
- "Settings": [
- ""
- ],
- "Orders": [
- ""
- ],
- "Products": [
- ""
- ],
- "Transfers": [
- ""
- ],
- "Connection": [
- ""
- ],
- "Instances": [
- ""
- ],
- "New": [
- ""
- ],
- "List": [
- ""
- ],
- "Log out": [
- ""
- ],
- "Clear": [
- ""
- ],
- "should be the same": [
- ""
- ],
- "cannot be the same as before": [
- ""
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- ""
- ],
- "Old token": [
- ""
- ],
- "New token": [
- ""
- ],
- "Clearing the auth token will mean public access to the instance": [
- ""
- ],
- "ID": [
- ""
- ],
- "Image": [
- ""
- ],
- "Unit": [
- ""
- ],
- "Price": [
- ""
- ],
- "Stock": [
- ""
- ],
- "Taxes": [
- ""
- ],
- "Server not found": [
- ""
- ],
- "Couldn't access the server": [
- ""
- ],
- "Got message %1$s from %2$s": [
- ""
- ],
- "Unexpected Error": [
- ""
- ],
- "Auth token": [
- ""
- ],
- "Account address": [
- ""
- ],
- "Default max deposit fee": [
- ""
- ],
- "Default max wire fee": [
- ""
- ],
- "Default wire fee amortization": [
- ""
- ],
- "Jurisdiction": [
- ""
- ],
- "Default pay delay": [
- ""
- ],
- "Default wire transfer delay": [
- ""
- ],
- "could not create instance": [
- ""
- ],
- "Delete": [
- ""
- ],
- "Edit": [
- ""
- ],
- "There is no instances yet, add more pressing the + sign": [
- ""
- ],
- "Inventory products": [
- ""
- ],
- "Total price": [
- ""
- ],
- "Total tax": [
- ""
- ],
- "Order price": [
- ""
- ],
- "Net": [
- ""
- ],
- "Summary": [
- ""
- ],
- "Payments options": [
- ""
- ],
- "Auto refund deadline": [
- ""
- ],
- "Refund deadline": [
- ""
- ],
- "Pay deadline": [
- ""
- ],
- "Delivery date": [
- ""
- ],
- "Location": [
- ""
- ],
- "Max fee": [
- ""
- ],
- "Max wire fee": [
- ""
- ],
- "Wire fee amortization": [
- ""
- ],
- "Fullfilment url": [
- ""
- ],
- "Extra information": [
- ""
- ],
- "select a product first": [
- ""
- ],
- "should be greater than 0": [
- ""
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- ""
- ],
- "cannot be greater than current stock %1$s": [
- ""
- ],
- "Quantity": [
- ""
- ],
- "Order": [
- ""
- ],
- "claimed": [
- ""
- ],
- "copy url": [
- ""
- ],
- "pay at": [
- ""
- ],
- "created at": [
- ""
- ],
- "Timeline": [
- ""
- ],
- "Payment details": [
- ""
- ],
- "Order status": [
- ""
- ],
- "Product list": [
- ""
- ],
- "paid": [
- ""
- ],
- "wired": [
- ""
- ],
- "refunded": [
- ""
- ],
- "refund": [
- ""
- ],
- "Refunded amount": [
- ""
- ],
- "Deposit total": [
- ""
- ],
- "unpaid": [
- ""
- ],
- "Order status URL": [
- ""
- ],
- "Pay URI": [
- ""
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- ""
- ],
- "refund created successfully": [
- ""
- ],
- "could not create the refund": [
- ""
- ],
- "load newer orders": [
- ""
- ],
- "Date": [
- ""
- ],
- "Refund": [
- ""
- ],
- "load older orders": [
- ""
- ],
- "No orders has been found": [
- ""
- ],
- "date": [
- ""
- ],
- "amount": [
- ""
- ],
- "reason": [
- ""
- ],
- "Max refundable:": [
- ""
- ],
- "Reason": [
- ""
- ],
- "duplicated": [
- ""
- ],
- "requested by the customer": [
- ""
- ],
- "other": [
- ""
- ],
- "go to order id": [
- ""
- ],
- "Paid": [
- ""
- ],
- "Refunded": [
- ""
- ],
- "Not wired": [
- ""
- ],
- "All": [
- ""
- ],
- "could not create product": [
- ""
- ],
- "Sell": [
- ""
- ],
- "Profit": [
- ""
- ],
- "Sold": [
- ""
- ],
- "product updated successfully": [
- ""
- ],
- "could not update the product": [
- ""
- ],
- "product delete successfully": [
- ""
- ],
- "could not delete the product": [
- ""
- ],
- "Tips": [
- ""
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
- "There is no tips yet, add more pressing the + sign": [
- ""
- ],
- "cannot be empty": [
- ""
- ],
- "check the id, doest look valid": [
- ""
- ],
- "should have 52 characters, current %1$s": [
- ""
- ],
- "URL doesn't have the right format": [
- ""
- ],
- "Transfer ID": [
- ""
- ],
- "Account Address": [
- ""
- ],
- "Exchange URL": [
- ""
- ],
- "could not inform transfer": [
- ""
- ],
- "load newer transfers": [
- ""
- ],
- "Credit": [
- ""
- ],
- "Confirmed": [
- ""
- ],
- "Verified": [
- ""
- ],
- "Executed at": [
- ""
- ],
- "yes": [
- ""
- ],
- "no": [
- ""
- ],
- "unknown": [
- ""
- ],
- "load older transfers": [
- ""
- ],
- "There is no transfer yet, add more pressing the + sign": [
- ""
- ]
- }
- }
+ "Access denied": [""],
+ "Check your token is valid": [""],
+ "Couldn't access the server.": [""],
+ "Could not infer instance id from url %1$s": [""],
+ "HTTP status #%1$s: Server reported a problem": [""],
+ 'Got message: "%1$s" from: %2$s': [""],
+ "No default instance": [""],
+ "in order to use merchant backoffice, you should create the default instance":
+ [""],
+ "Server reported a problem: HTTP status #%1$s": [""],
+ "Got message: %1$s from: %2$s": [""],
+ "Login required": [""],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [""],
+ Confirm: [""],
+ "The value %1$s is invalid for a payment url": [""],
+ "pick a date": [""],
+ clear: [""],
+ never: [""],
+ "Image should be smaller than 1 MB": [""],
+ Country: [""],
+ Address: [""],
+ "Building number": [""],
+ "Building name": [""],
+ Street: [""],
+ "Post code": [""],
+ "Town location": [""],
+ Town: [""],
+ District: [""],
+ "Country subdivision": [""],
+ "Product id": [""],
+ Description: [""],
+ Name: [""],
+ "loading...": [""],
+ "no products found": [""],
+ "no results": [""],
+ Deleting: [""],
+ Changing: [""],
+ "Manage token": [""],
+ Update: [""],
+ Remove: [""],
+ Cancel: [""],
+ "Manage stock": [""],
+ Infinite: [""],
+ "lost cannot be greater that current + incoming (max %1$s)": [""],
+ "current stock will change from %1$s to %2$s": [""],
+ "current stock will stay at %1$s": [""],
+ Incoming: [""],
+ Lost: [""],
+ Current: [""],
+ "without stock": [""],
+ "Next restock": [""],
+ "Delivery address": [""],
+ "this product has no taxes": [""],
+ Amount: [""],
+ "currency and value separated with colon": [""],
+ Add: [""],
+ Instance: [""],
+ Settings: [""],
+ Orders: [""],
+ Products: [""],
+ Transfers: [""],
+ Connection: [""],
+ Instances: [""],
+ New: [""],
+ List: [""],
+ "Log out": [""],
+ Clear: [""],
+ "should be the same": [""],
+ "cannot be the same as before": [""],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [""],
+ "Old token": [""],
+ "New token": [""],
+ "Clearing the auth token will mean public access to the instance": [""],
+ ID: [""],
+ Image: [""],
+ Unit: [""],
+ Price: [""],
+ Stock: [""],
+ Taxes: [""],
+ "Server not found": [""],
+ "Couldn't access the server": [""],
+ "Got message %1$s from %2$s": [""],
+ "Unexpected Error": [""],
+ "Auth token": [""],
+ "Account address": [""],
+ "Default max deposit fee": [""],
+ "Default max wire fee": [""],
+ "Default wire fee amortization": [""],
+ Jurisdiction: [""],
+ "Default pay delay": [""],
+ "Default wire transfer delay": [""],
+ "could not create instance": [""],
+ Delete: [""],
+ Edit: [""],
+ "There is no instances yet, add more pressing the + sign": [""],
+ "Inventory products": [""],
+ "Total price": [""],
+ "Total tax": [""],
+ "Order price": [""],
+ Net: [""],
+ Summary: [""],
+ "Payments options": [""],
+ "Auto refund deadline": [""],
+ "Refund deadline": [""],
+ "Pay deadline": [""],
+ "Delivery date": [""],
+ Location: [""],
+ "Max fee": [""],
+ "Max wire fee": [""],
+ "Wire fee amortization": [""],
+ "Fullfilment url": [""],
+ "Extra information": [""],
+ "select a product first": [""],
+ "should be greater than 0": [""],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [""],
+ "cannot be greater than current stock %1$s": [""],
+ Quantity: [""],
+ Order: [""],
+ claimed: [""],
+ "copy url": [""],
+ "pay at": [""],
+ "created at": [""],
+ Timeline: [""],
+ "Payment details": [""],
+ "Order status": [""],
+ "Product list": [""],
+ paid: [""],
+ wired: [""],
+ refunded: [""],
+ refund: [""],
+ "Refunded amount": [""],
+ "Deposit total": [""],
+ unpaid: [""],
+ "Order status URL": [""],
+ "Pay URI": [""],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [""],
+ "refund created successfully": [""],
+ "could not create the refund": [""],
+ "load newer orders": [""],
+ Date: [""],
+ Refund: [""],
+ "load older orders": [""],
+ "No orders has been found": [""],
+ date: [""],
+ amount: [""],
+ reason: [""],
+ "Max refundable:": [""],
+ Reason: [""],
+ duplicated: [""],
+ "requested by the customer": [""],
+ other: [""],
+ "go to order id": [""],
+ Paid: [""],
+ Refunded: [""],
+ "Not wired": [""],
+ All: [""],
+ "could not create product": [""],
+ Sell: [""],
+ Profit: [""],
+ Sold: [""],
+ "product updated successfully": [""],
+ "could not update the product": [""],
+ "product delete successfully": [""],
+ "could not delete the product": [""],
+ Tips: [""],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
+ "There is no tips yet, add more pressing the + sign": [""],
+ "cannot be empty": [""],
+ "check the id, doest look valid": [""],
+ "should have 52 characters, current %1$s": [""],
+ "URL doesn't have the right format": [""],
+ "Transfer ID": [""],
+ "Account Address": [""],
+ "Exchange URL": [""],
+ "could not inform transfer": [""],
+ "load newer transfers": [""],
+ Credit: [""],
+ Confirmed: [""],
+ Verified: [""],
+ "Executed at": [""],
+ yes: [""],
+ no: [""],
+ unknown: [""],
+ "load older transfers": [""],
+ "There is no transfer yet, add more pressing the + sign": [""],
+ },
+ },
};
-strings['en'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["en"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- ""
- ],
- "Check your token is valid": [
- ""
- ],
- "Couldn't access the server.": [
- ""
- ],
- "Could not infer instance id from url %1$s": [
- ""
- ],
- "HTTP status #%1$s: Server reported a problem": [
- ""
- ],
- "Got message: \"%1$s\" from: %2$s": [
- ""
- ],
- "No default instance": [
- ""
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- ""
- ],
- "Server reported a problem: HTTP status #%1$s": [
- ""
- ],
- "Got message: %1$s from: %2$s": [
- ""
- ],
- "Login required": [
- ""
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- ""
- ],
- "Confirm": [
- ""
- ],
- "The value %1$s is invalid for a payment url": [
- ""
- ],
- "pick a date": [
- ""
- ],
- "clear": [
- ""
- ],
- "never": [
- ""
- ],
- "Image should be smaller than 1 MB": [
- ""
- ],
- "Country": [
- ""
- ],
- "Address": [
- ""
- ],
- "Building number": [
- ""
- ],
- "Building name": [
- ""
- ],
- "Street": [
- ""
- ],
- "Post code": [
- ""
- ],
- "Town location": [
- ""
- ],
- "Town": [
- ""
- ],
- "District": [
- ""
- ],
- "Country subdivision": [
- ""
- ],
- "Product id": [
- ""
- ],
- "Description": [
- ""
- ],
- "Name": [
- ""
- ],
- "loading...": [
- ""
- ],
- "no products found": [
- ""
- ],
- "no results": [
- ""
- ],
- "Deleting": [
- ""
- ],
- "Changing": [
- ""
- ],
- "Manage token": [
- ""
- ],
- "Update": [
- ""
- ],
- "Remove": [
- ""
- ],
- "Cancel": [
- ""
- ],
- "Manage stock": [
- ""
- ],
- "Infinite": [
- ""
- ],
- "lost cannot be greater that current + incoming (max %1$s)": [
- ""
- ],
- "current stock will change from %1$s to %2$s": [
- ""
- ],
- "current stock will stay at %1$s": [
- ""
- ],
- "Incoming": [
- ""
- ],
- "Lost": [
- ""
- ],
- "Current": [
- ""
- ],
- "without stock": [
- ""
- ],
- "Next restock": [
- ""
- ],
- "Delivery address": [
- ""
- ],
- "this product has no taxes": [
- ""
- ],
- "Amount": [
- ""
- ],
- "currency and value separated with colon": [
- ""
- ],
- "Add": [
- ""
- ],
- "Instance": [
- ""
- ],
- "Settings": [
- ""
- ],
- "Orders": [
- ""
- ],
- "Products": [
- ""
- ],
- "Transfers": [
- ""
- ],
- "Connection": [
- ""
- ],
- "Instances": [
- ""
- ],
- "New": [
- ""
- ],
- "List": [
- ""
- ],
- "Log out": [
- ""
- ],
- "Clear": [
- ""
- ],
- "should be the same": [
- ""
- ],
- "cannot be the same as before": [
- ""
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- ""
- ],
- "Old token": [
- ""
- ],
- "New token": [
- ""
- ],
- "Clearing the auth token will mean public access to the instance": [
- ""
- ],
- "ID": [
- ""
- ],
- "Image": [
- ""
- ],
- "Unit": [
- ""
- ],
- "Price": [
- ""
- ],
- "Stock": [
- ""
- ],
- "Taxes": [
- ""
- ],
- "Server not found": [
- ""
- ],
- "Couldn't access the server": [
- ""
- ],
- "Got message %1$s from %2$s": [
- ""
- ],
- "Unexpected Error": [
- ""
- ],
- "Auth token": [
- ""
- ],
- "Account address": [
- ""
- ],
- "Default max deposit fee": [
- ""
- ],
- "Default max wire fee": [
- ""
- ],
- "Default wire fee amortization": [
- ""
- ],
- "Jurisdiction": [
- ""
- ],
- "Default pay delay": [
- ""
- ],
- "Default wire transfer delay": [
- ""
- ],
- "could not create instance": [
- ""
- ],
- "Delete": [
- ""
- ],
- "Edit": [
- ""
- ],
- "There is no instances yet, add more pressing the + sign": [
- ""
- ],
- "Inventory products": [
- ""
- ],
- "Total price": [
- ""
- ],
- "Total tax": [
- ""
- ],
- "Order price": [
- ""
- ],
- "Net": [
- ""
- ],
- "Summary": [
- ""
- ],
- "Payments options": [
- ""
- ],
- "Auto refund deadline": [
- ""
- ],
- "Refund deadline": [
- ""
- ],
- "Pay deadline": [
- ""
- ],
- "Delivery date": [
- ""
- ],
- "Location": [
- ""
- ],
- "Max fee": [
- ""
- ],
- "Max wire fee": [
- ""
- ],
- "Wire fee amortization": [
- ""
- ],
- "Fullfilment url": [
- ""
- ],
- "Extra information": [
- ""
- ],
- "select a product first": [
- ""
- ],
- "should be greater than 0": [
- ""
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- ""
- ],
- "cannot be greater than current stock %1$s": [
- ""
- ],
- "Quantity": [
- ""
- ],
- "Order": [
- ""
- ],
- "claimed": [
- ""
- ],
- "copy url": [
- ""
- ],
- "pay at": [
- ""
- ],
- "created at": [
- ""
- ],
- "Timeline": [
- ""
- ],
- "Payment details": [
- ""
- ],
- "Order status": [
- ""
- ],
- "Product list": [
- ""
- ],
- "paid": [
- ""
- ],
- "wired": [
- ""
- ],
- "refunded": [
- ""
- ],
- "refund": [
- ""
- ],
- "Refunded amount": [
- ""
- ],
- "Deposit total": [
- ""
- ],
- "unpaid": [
- ""
- ],
- "Order status URL": [
- ""
- ],
- "Pay URI": [
- ""
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- ""
- ],
- "refund created successfully": [
- ""
- ],
- "could not create the refund": [
- ""
- ],
- "load newer orders": [
- ""
- ],
- "Date": [
- ""
- ],
- "Refund": [
- ""
- ],
- "load older orders": [
- ""
- ],
- "No orders has been found": [
- ""
- ],
- "date": [
- ""
- ],
- "amount": [
- ""
- ],
- "reason": [
- ""
- ],
- "Max refundable:": [
- ""
- ],
- "Reason": [
- ""
- ],
- "duplicated": [
- ""
- ],
- "requested by the customer": [
- ""
- ],
- "other": [
- ""
- ],
- "go to order id": [
- ""
- ],
- "Paid": [
- ""
- ],
- "Refunded": [
- ""
- ],
- "Not wired": [
- ""
- ],
- "All": [
- ""
- ],
- "could not create product": [
- ""
- ],
- "Sell": [
- ""
- ],
- "Profit": [
- ""
- ],
- "Sold": [
- ""
- ],
- "product updated successfully": [
- ""
- ],
- "could not update the product": [
- ""
- ],
- "product delete successfully": [
- ""
- ],
- "could not delete the product": [
- ""
- ],
- "Tips": [
- ""
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
- "There is no tips yet, add more pressing the + sign": [
- ""
- ],
- "cannot be empty": [
- ""
- ],
- "check the id, doest look valid": [
- ""
- ],
- "should have 52 characters, current %1$s": [
- ""
- ],
- "URL doesn't have the right format": [
- ""
- ],
- "Transfer ID": [
- ""
- ],
- "Account Address": [
- ""
- ],
- "Exchange URL": [
- ""
- ],
- "could not inform transfer": [
- ""
- ],
- "load newer transfers": [
- ""
- ],
- "Credit": [
- ""
- ],
- "Confirmed": [
- ""
- ],
- "Verified": [
- ""
- ],
- "Executed at": [
- ""
- ],
- "yes": [
- ""
- ],
- "no": [
- ""
- ],
- "unknown": [
- ""
- ],
- "load older transfers": [
- ""
- ],
- "There is no transfer yet, add more pressing the + sign": [
- ""
- ]
- }
- }
+ "Access denied": [""],
+ "Check your token is valid": [""],
+ "Couldn't access the server.": [""],
+ "Could not infer instance id from url %1$s": [""],
+ "HTTP status #%1$s: Server reported a problem": [""],
+ 'Got message: "%1$s" from: %2$s': [""],
+ "No default instance": [""],
+ "in order to use merchant backoffice, you should create the default instance":
+ [""],
+ "Server reported a problem: HTTP status #%1$s": [""],
+ "Got message: %1$s from: %2$s": [""],
+ "Login required": [""],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [""],
+ Confirm: [""],
+ "The value %1$s is invalid for a payment url": [""],
+ "pick a date": [""],
+ clear: [""],
+ never: [""],
+ "Image should be smaller than 1 MB": [""],
+ Country: [""],
+ Address: [""],
+ "Building number": [""],
+ "Building name": [""],
+ Street: [""],
+ "Post code": [""],
+ "Town location": [""],
+ Town: [""],
+ District: [""],
+ "Country subdivision": [""],
+ "Product id": [""],
+ Description: [""],
+ Name: [""],
+ "loading...": [""],
+ "no products found": [""],
+ "no results": [""],
+ Deleting: [""],
+ Changing: [""],
+ "Manage token": [""],
+ Update: [""],
+ Remove: [""],
+ Cancel: [""],
+ "Manage stock": [""],
+ Infinite: [""],
+ "lost cannot be greater that current + incoming (max %1$s)": [""],
+ "current stock will change from %1$s to %2$s": [""],
+ "current stock will stay at %1$s": [""],
+ Incoming: [""],
+ Lost: [""],
+ Current: [""],
+ "without stock": [""],
+ "Next restock": [""],
+ "Delivery address": [""],
+ "this product has no taxes": [""],
+ Amount: [""],
+ "currency and value separated with colon": [""],
+ Add: [""],
+ Instance: [""],
+ Settings: [""],
+ Orders: [""],
+ Products: [""],
+ Transfers: [""],
+ Connection: [""],
+ Instances: [""],
+ New: [""],
+ List: [""],
+ "Log out": [""],
+ Clear: [""],
+ "should be the same": [""],
+ "cannot be the same as before": [""],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [""],
+ "Old token": [""],
+ "New token": [""],
+ "Clearing the auth token will mean public access to the instance": [""],
+ ID: [""],
+ Image: [""],
+ Unit: [""],
+ Price: [""],
+ Stock: [""],
+ Taxes: [""],
+ "Server not found": [""],
+ "Couldn't access the server": [""],
+ "Got message %1$s from %2$s": [""],
+ "Unexpected Error": [""],
+ "Auth token": [""],
+ "Account address": [""],
+ "Default max deposit fee": [""],
+ "Default max wire fee": [""],
+ "Default wire fee amortization": [""],
+ Jurisdiction: [""],
+ "Default pay delay": [""],
+ "Default wire transfer delay": [""],
+ "could not create instance": [""],
+ Delete: [""],
+ Edit: [""],
+ "There is no instances yet, add more pressing the + sign": [""],
+ "Inventory products": [""],
+ "Total price": [""],
+ "Total tax": [""],
+ "Order price": [""],
+ Net: [""],
+ Summary: [""],
+ "Payments options": [""],
+ "Auto refund deadline": [""],
+ "Refund deadline": [""],
+ "Pay deadline": [""],
+ "Delivery date": [""],
+ Location: [""],
+ "Max fee": [""],
+ "Max wire fee": [""],
+ "Wire fee amortization": [""],
+ "Fullfilment url": [""],
+ "Extra information": [""],
+ "select a product first": [""],
+ "should be greater than 0": [""],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [""],
+ "cannot be greater than current stock %1$s": [""],
+ Quantity: [""],
+ Order: [""],
+ claimed: [""],
+ "copy url": [""],
+ "pay at": [""],
+ "created at": [""],
+ Timeline: [""],
+ "Payment details": [""],
+ "Order status": [""],
+ "Product list": [""],
+ paid: [""],
+ wired: [""],
+ refunded: [""],
+ refund: [""],
+ "Refunded amount": [""],
+ "Deposit total": [""],
+ unpaid: [""],
+ "Order status URL": [""],
+ "Pay URI": [""],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [""],
+ "refund created successfully": [""],
+ "could not create the refund": [""],
+ "load newer orders": [""],
+ Date: [""],
+ Refund: [""],
+ "load older orders": [""],
+ "No orders has been found": [""],
+ date: [""],
+ amount: [""],
+ reason: [""],
+ "Max refundable:": [""],
+ Reason: [""],
+ duplicated: [""],
+ "requested by the customer": [""],
+ other: [""],
+ "go to order id": [""],
+ Paid: [""],
+ Refunded: [""],
+ "Not wired": [""],
+ All: [""],
+ "could not create product": [""],
+ Sell: [""],
+ Profit: [""],
+ Sold: [""],
+ "product updated successfully": [""],
+ "could not update the product": [""],
+ "product delete successfully": [""],
+ "could not delete the product": [""],
+ Tips: [""],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
+ "There is no tips yet, add more pressing the + sign": [""],
+ "cannot be empty": [""],
+ "check the id, doest look valid": [""],
+ "should have 52 characters, current %1$s": [""],
+ "URL doesn't have the right format": [""],
+ "Transfer ID": [""],
+ "Account Address": [""],
+ "Exchange URL": [""],
+ "could not inform transfer": [""],
+ "load newer transfers": [""],
+ Credit: [""],
+ Confirmed: [""],
+ Verified: [""],
+ "Executed at": [""],
+ yes: [""],
+ no: [""],
+ unknown: [""],
+ "load older transfers": [""],
+ "There is no transfer yet, add more pressing the + sign": [""],
+ },
+ },
};
-strings['es'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["es"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- "Acceso denegado"
- ],
- "Check your token is valid": [
- "Verifica que el token sea valido"
- ],
- "Couldn't access the server.": [
- "No se pudo acceder al servidor"
- ],
+ "Access denied": ["Acceso denegado"],
+ "Check your token is valid": ["Verifica que el token sea valido"],
+ "Couldn't access the server.": ["No se pudo acceder al servidor"],
"Could not infer instance id from url %1$s": [
- "No se pudo inferir el id de la instancia con la url %1$s"
+ "No se pudo inferir el id de la instancia con la url %1$s",
],
"HTTP status #%1$s: Server reported a problem": [
- "HTTP status #%1$s: Servidor reporto un problema"
- ],
- "Got message: \"%1$s\" from: %2$s": [
- "Recivimos el mensaje %1$s desde %2$s"
+ "HTTP status #%1$s: Servidor reporto un problema",
],
- "No default instance": [
- "Sin instancia default"
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- "para usar el merchant backoffice, debería crear la instancia default"
+ 'Got message: "%1$s" from: %2$s': [
+ "Recivimos el mensaje %1$s desde %2$s",
],
+ "No default instance": ["Sin instancia default"],
+ "in order to use merchant backoffice, you should create the default instance":
+ [
+ "para usar el merchant backoffice, debería crear la instancia default",
+ ],
"Server reported a problem: HTTP status #%1$s": [
- "Servidir reporto un problema: HTTP status #%1$s"
- ],
- "Got message: %1$s from: %2$s": [
- "Recivimos el mensaje %1$s desde %2$s"
- ],
- "Login required": [
- "Login necesario"
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- "Por favor ingrese su token de autorización. El token debe tener \"secret-token\" y comenzar con Bearer o ApiKey"
- ],
- "Confirm": [
- "Confirmar"
- ],
+ "Servidir reporto un problema: HTTP status #%1$s",
+ ],
+ "Got message: %1$s from: %2$s": ["Recivimos el mensaje %1$s desde %2$s"],
+ "Login required": ["Login necesario"],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [
+ 'Por favor ingrese su token de autorización. El token debe tener "secret-token" y comenzar con Bearer o ApiKey',
+ ],
+ Confirm: ["Confirmar"],
"The value %1$s is invalid for a payment url": [
- "El valor %1$s es invalido para una URL de pago"
- ],
- "pick a date": [
- "elegir una fecha"
- ],
- "clear": [
- "Limpiar"
- ],
- "never": [
- "nunca"
+ "El valor %1$s es invalido para una URL de pago",
],
+ "pick a date": ["elegir una fecha"],
+ clear: ["Limpiar"],
+ never: ["nunca"],
"Image should be smaller than 1 MB": [
- "La imagen debe ser mas chica que 1 MB"
- ],
- "Country": [
- "País"
- ],
- "Address": [
- "Dirección"
- ],
- "Building number": [
- "Número de edificio"
- ],
- "Building name": [
- "Nombre de edificio"
- ],
- "Street": [
- "Calle"
- ],
- "Post code": [
- "Código postal"
- ],
- "Town location": [
- "Ubicación de ciudad"
- ],
- "Town": [
- "Ciudad"
- ],
- "District": [
- "Distrito"
- ],
- "Country subdivision": [
- "Provincia"
- ],
- "Product id": [
- "Id de producto"
- ],
- "Description": [
- "Descripcion"
- ],
- "Name": [
- "Nombre"
- ],
- "loading...": [
- "Cargando..."
- ],
- "no products found": [
- "No se encontraron productos"
- ],
- "no results": [
- "Sin resultados"
- ],
- "Deleting": [
- "Borrando"
- ],
- "Changing": [
- "Cambiando"
- ],
- "Manage token": [
- "Administrar token"
- ],
- "Update": [
- "Actualizar"
- ],
- "Remove": [
- "Eliminar"
- ],
- "Cancel": [
- "Cancelar"
- ],
- "Manage stock": [
- "Administrar stock"
- ],
- "Infinite": [
- "Inifinito"
- ],
+ "La imagen debe ser mas chica que 1 MB",
+ ],
+ Country: ["País"],
+ Address: ["Dirección"],
+ "Building number": ["Número de edificio"],
+ "Building name": ["Nombre de edificio"],
+ Street: ["Calle"],
+ "Post code": ["Código postal"],
+ "Town location": ["Ubicación de ciudad"],
+ Town: ["Ciudad"],
+ District: ["Distrito"],
+ "Country subdivision": ["Provincia"],
+ "Product id": ["Id de producto"],
+ Description: ["Descripcion"],
+ Name: ["Nombre"],
+ "loading...": ["Cargando..."],
+ "no products found": ["No se encontraron productos"],
+ "no results": ["Sin resultados"],
+ Deleting: ["Borrando"],
+ Changing: ["Cambiando"],
+ "Manage token": ["Administrar token"],
+ Update: ["Actualizar"],
+ Remove: ["Eliminar"],
+ Cancel: ["Cancelar"],
+ "Manage stock": ["Administrar stock"],
+ Infinite: ["Inifinito"],
"lost cannot be greater that current + incoming (max %1$s)": [
- "no puede ser mayor al stock actual %1$s"
+ "no puede ser mayor al stock actual %1$s",
],
"current stock will change from %1$s to %2$s": [
- "stock actual cambiará desde %1$s a %2$s"
- ],
- "current stock will stay at %1$s": [
- "stock actual seguirá en %1$s"
- ],
- "Incoming": [
- "Ingresando"
- ],
- "Lost": [
- "Perdido"
- ],
- "Current": [
- "Actual"
- ],
- "without stock": [
- "sin stock"
- ],
- "Next restock": [
- "Próximo reabastecimiento"
- ],
- "Delivery address": [
- "Dirección de entrega"
- ],
- "this product has no taxes": [
- "este producto no tiene impuestos"
- ],
- "Amount": [
- "Monto"
- ],
+ "stock actual cambiará desde %1$s a %2$s",
+ ],
+ "current stock will stay at %1$s": ["stock actual seguirá en %1$s"],
+ Incoming: ["Ingresando"],
+ Lost: ["Perdido"],
+ Current: ["Actual"],
+ "without stock": ["sin stock"],
+ "Next restock": ["Próximo reabastecimiento"],
+ "Delivery address": ["Dirección de entrega"],
+ "this product has no taxes": ["este producto no tiene impuestos"],
+ Amount: ["Monto"],
"currency and value separated with colon": [
- "Moneda y valor separado por dos puntos"
- ],
- "Add": [
- "Agregar"
- ],
- "Instance": [
- "Instancia"
- ],
- "Settings": [
- "Configuración"
- ],
- "Orders": [
- "Ordenes"
- ],
- "Products": [
- "Productos"
- ],
- "Transfers": [
- "Transferencias"
- ],
- "Connection": [
- "Conexión"
- ],
- "Instances": [
- "Instancias"
- ],
- "New": [
- "Nuevo"
- ],
- "List": [
- "Lista"
- ],
- "Log out": [
- "Salir"
- ],
- "Clear": [
- "Limpiar"
- ],
- "should be the same": [
- "deberían ser iguales"
- ],
- "cannot be the same as before": [
- "no puede ser igual al anterior"
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- "Está actualizando el token de autorización para la instancia %1$s con id %2$s"
- ],
- "Old token": [
- "Viejo token"
- ],
- "New token": [
- "Nuevo token"
- ],
+ "Moneda y valor separado por dos puntos",
+ ],
+ Add: ["Agregar"],
+ Instance: ["Instancia"],
+ Settings: ["Configuración"],
+ Orders: ["Ordenes"],
+ Products: ["Productos"],
+ Transfers: ["Transferencias"],
+ Connection: ["Conexión"],
+ Instances: ["Instancias"],
+ New: ["Nuevo"],
+ List: ["Lista"],
+ "Log out": ["Salir"],
+ Clear: ["Limpiar"],
+ "should be the same": ["deberían ser iguales"],
+ "cannot be the same as before": ["no puede ser igual al anterior"],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [
+ "Está actualizando el token de autorización para la instancia %1$s con id %2$s",
+ ],
+ "Old token": ["Viejo token"],
+ "New token": ["Nuevo token"],
"Clearing the auth token will mean public access to the instance": [
- "Limpiar el token de autorización significa acceso publico a la instancia"
- ],
- "ID": [
- "ID"
- ],
- "Image": [
- "Imagen"
- ],
- "Unit": [
- "Unidad"
- ],
- "Price": [
- "Precio"
- ],
- "Stock": [
- "Stock"
- ],
- "Taxes": [
- "Impuesto"
- ],
- "Server not found": [
- "Servidor no encontrado"
- ],
- "Couldn't access the server": [
- "No se pudo aceder al servidor"
- ],
- "Got message %1$s from %2$s": [
- "Recivimos el mensaje %1$s desde %2$s"
- ],
- "Unexpected Error": [
- "Error inesperado"
- ],
- "Auth token": [
- "Token de autorización"
- ],
- "Account address": [
- "Dirección de cuenta"
- ],
- "Default max deposit fee": [
- "Impuesto máximo de deposito por omisión"
- ],
- "Default max wire fee": [
- "Impuesto máximo de transferencia por omisión"
- ],
+ "Limpiar el token de autorización significa acceso publico a la instancia",
+ ],
+ ID: ["ID"],
+ Image: ["Imagen"],
+ Unit: ["Unidad"],
+ Price: ["Precio"],
+ Stock: ["Stock"],
+ Taxes: ["Impuesto"],
+ "Server not found": ["Servidor no encontrado"],
+ "Couldn't access the server": ["No se pudo aceder al servidor"],
+ "Got message %1$s from %2$s": ["Recivimos el mensaje %1$s desde %2$s"],
+ "Unexpected Error": ["Error inesperado"],
+ "Auth token": ["Token de autorización"],
+ "Account address": ["Dirección de cuenta"],
+ "Default max deposit fee": ["Impuesto máximo de deposito por omisión"],
+ "Default max wire fee": ["Impuesto máximo de transferencia por omisión"],
"Default wire fee amortization": [
- "Amortización de impuesto de transferencia por omisión"
- ],
- "Jurisdiction": [
- "Jurisdicción"
- ],
- "Default pay delay": [
- "Retrazo de pago por omisión"
- ],
- "Default wire transfer delay": [
- "Retrazo de transferencia por omisión"
- ],
- "could not create instance": [
- "no se pudo crear la instancia"
- ],
- "Delete": [
- "Borrando"
- ],
- "Edit": [
- ""
- ],
+ "Amortización de impuesto de transferencia por omisión",
+ ],
+ Jurisdiction: ["Jurisdicción"],
+ "Default pay delay": ["Retrazo de pago por omisión"],
+ "Default wire transfer delay": ["Retrazo de transferencia por omisión"],
+ "could not create instance": ["no se pudo crear la instancia"],
+ Delete: ["Borrando"],
+ Edit: [""],
"There is no instances yet, add more pressing the + sign": [
- "No hay instancias todavían, agregue mas presionando el signo +"
- ],
- "Inventory products": [
- "Productos de inventario"
- ],
- "Total price": [
- "Precio total"
- ],
- "Total tax": [
- "Impuesto total"
- ],
- "Order price": [
- "Precio de la orden"
- ],
- "Net": [
- "Neto"
- ],
- "Summary": [
- "Resumen"
- ],
- "Payments options": [
- "Opciones de pago"
- ],
- "Auto refund deadline": [
- "Plazo de reembolso automático"
- ],
- "Refund deadline": [
- "Plazo de reembolso"
- ],
- "Pay deadline": [
- "Plazo de pago"
- ],
- "Delivery date": [
- "Fecha de entrega"
- ],
- "Location": [
- "Ubicación"
- ],
- "Max fee": [
- "Impuesto máximo"
- ],
- "Max wire fee": [
- "Impuesto de transferencia máximo"
- ],
- "Wire fee amortization": [
- "Amortización de impuesto de transferencia"
- ],
- "Fullfilment url": [
- "URL de completitud"
- ],
- "Extra information": [
- "Información extra"
- ],
- "select a product first": [
- "seleccione un producto primero"
- ],
- "should be greater than 0": [
- "La imagen debe ser mas chica que 1 MB"
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- "no puede ser mayor al stock actual y la cantidad previamente agregada. máximo: %1$s"
- ],
+ "No hay instancias todavían, agregue mas presionando el signo +",
+ ],
+ "Inventory products": ["Productos de inventario"],
+ "Total price": ["Precio total"],
+ "Total tax": ["Impuesto total"],
+ "Order price": ["Precio de la orden"],
+ Net: ["Neto"],
+ Summary: ["Resumen"],
+ "Payments options": ["Opciones de pago"],
+ "Auto refund deadline": ["Plazo de reembolso automático"],
+ "Refund deadline": ["Plazo de reembolso"],
+ "Pay deadline": ["Plazo de pago"],
+ "Delivery date": ["Fecha de entrega"],
+ Location: ["Ubicación"],
+ "Max fee": ["Impuesto máximo"],
+ "Max wire fee": ["Impuesto de transferencia máximo"],
+ "Wire fee amortization": ["Amortización de impuesto de transferencia"],
+ "Fullfilment url": ["URL de completitud"],
+ "Extra information": ["Información extra"],
+ "select a product first": ["seleccione un producto primero"],
+ "should be greater than 0": ["La imagen debe ser mas chica que 1 MB"],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [
+ "no puede ser mayor al stock actual y la cantidad previamente agregada. máximo: %1$s",
+ ],
"cannot be greater than current stock %1$s": [
- "no puede ser mayor al stock actual %1$s"
- ],
- "Quantity": [
- "Cantidad"
- ],
- "Order": [
- "Orden"
- ],
- "claimed": [
- "reclamado"
- ],
- "copy url": [
- "copiar url"
- ],
- "pay at": [
- "pagar en"
- ],
- "created at": [
- "creado"
- ],
- "Timeline": [
- "Cronología"
- ],
- "Payment details": [
- "Detalles de pago"
- ],
- "Order status": [
- "Estado de orden"
- ],
- "Product list": [
- "Lista de producto"
- ],
- "paid": [
- "pagados"
- ],
- "wired": [
- "transferido"
- ],
- "refunded": [
- "reembolzado"
- ],
- "refund": [
- "reembolzar"
- ],
- "Refunded amount": [
- "Monto reembolzado"
- ],
- "Deposit total": [
- "Total depositado"
- ],
- "unpaid": [
- "impago"
- ],
- "Order status URL": [
- "URL de estado de orden"
- ],
- "Pay URI": [
- "URI de pago"
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- "Estado de orden desconocido. Esto es un error, por favor contacte a su administrador"
- ],
- "refund created successfully": [
- "reembolzo creado satisfactoriamente"
- ],
- "could not create the refund": [
- "No se pudo aceder al servidor"
- ],
- "load newer orders": [
- "cargar nuevas ordenes"
- ],
- "Date": [
- "Fecha"
- ],
- "Refund": [
- "Reembolzar"
- ],
- "load older orders": [
- "cargar viejas ordenes"
- ],
- "No orders has been found": [
- "No se enconraron ordenes"
- ],
- "date": [
- "fecha"
- ],
- "amount": [
- "monto"
- ],
- "reason": [
- "razón"
- ],
- "Max refundable:": [
- "Máximo reembolzable:"
- ],
- "Reason": [
- "Razón"
- ],
- "duplicated": [
- "duplicado"
- ],
- "requested by the customer": [
- "pedido por el consumidor"
- ],
- "other": [
- "otro"
- ],
- "go to order id": [
- "ir a id de orden"
- ],
- "Paid": [
- "Pagado"
- ],
- "Refunded": [
- "Reembolzado"
- ],
- "Not wired": [
- "No transferido"
- ],
- "All": [
- "Todo"
- ],
- "could not create product": [
- "no se pudo crear el producto"
- ],
- "Sell": [
- "Venta"
- ],
- "Profit": [
- "Ganancia"
- ],
- "Sold": [
- "Vendido"
- ],
- "product updated successfully": [
- "producto actualizado correctamente"
- ],
- "could not update the product": [
- "no se pudo actualizar el producto"
- ],
- "product delete successfully": [
- "producto fue eliminado correctamente"
- ],
- "could not delete the product": [
- "no se pudo eliminar el producto"
- ],
- "Tips": [
- "Propinas"
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
+ "no puede ser mayor al stock actual %1$s",
+ ],
+ Quantity: ["Cantidad"],
+ Order: ["Orden"],
+ claimed: ["reclamado"],
+ "copy url": ["copiar url"],
+ "pay at": ["pagar en"],
+ "created at": ["creado"],
+ Timeline: ["Cronología"],
+ "Payment details": ["Detalles de pago"],
+ "Order status": ["Estado de orden"],
+ "Product list": ["Lista de producto"],
+ paid: ["pagados"],
+ wired: ["transferido"],
+ refunded: ["reembolzado"],
+ refund: ["reembolzar"],
+ "Refunded amount": ["Monto reembolzado"],
+ "Deposit total": ["Total depositado"],
+ unpaid: ["impago"],
+ "Order status URL": ["URL de estado de orden"],
+ "Pay URI": ["URI de pago"],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [
+ "Estado de orden desconocido. Esto es un error, por favor contacte a su administrador",
+ ],
+ "refund created successfully": ["reembolzo creado satisfactoriamente"],
+ "could not create the refund": ["No se pudo aceder al servidor"],
+ "load newer orders": ["cargar nuevas ordenes"],
+ Date: ["Fecha"],
+ Refund: ["Reembolzar"],
+ "load older orders": ["cargar viejas ordenes"],
+ "No orders has been found": ["No se enconraron ordenes"],
+ date: ["fecha"],
+ amount: ["monto"],
+ reason: ["razón"],
+ "Max refundable:": ["Máximo reembolzable:"],
+ Reason: ["Razón"],
+ duplicated: ["duplicado"],
+ "requested by the customer": ["pedido por el consumidor"],
+ other: ["otro"],
+ "go to order id": ["ir a id de orden"],
+ Paid: ["Pagado"],
+ Refunded: ["Reembolzado"],
+ "Not wired": ["No transferido"],
+ All: ["Todo"],
+ "could not create product": ["no se pudo crear el producto"],
+ Sell: ["Venta"],
+ Profit: ["Ganancia"],
+ Sold: ["Vendido"],
+ "product updated successfully": ["producto actualizado correctamente"],
+ "could not update the product": ["no se pudo actualizar el producto"],
+ "product delete successfully": ["producto fue eliminado correctamente"],
+ "could not delete the product": ["no se pudo eliminar el producto"],
+ Tips: ["Propinas"],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
"There is no tips yet, add more pressing the + sign": [
- "No hay propinas todavía, agregar mas presionando el signo +"
- ],
- "cannot be empty": [
- "no puede ser vacío"
- ],
- "check the id, doest look valid": [
- "verificar el id, no parece válido"
+ "No hay propinas todavía, agregar mas presionando el signo +",
],
+ "cannot be empty": ["no puede ser vacío"],
+ "check the id, doest look valid": ["verificar el id, no parece válido"],
"should have 52 characters, current %1$s": [
- "debería tener 52 caracteres, actualmente %1$s"
+ "debería tener 52 caracteres, actualmente %1$s",
],
"URL doesn't have the right format": [
- "La URL no tiene el formato correcto"
- ],
- "Transfer ID": [
- "Transferencias"
- ],
- "Account Address": [
- "Dirección de cuenta"
- ],
- "Exchange URL": [
- "URL del Exchange"
- ],
- "could not inform transfer": [
- "no se pudo crear la instancia"
- ],
- "load newer transfers": [
- "cargar nuevas ordenes"
- ],
- "Credit": [
- "Crédito"
- ],
- "Confirmed": [
- "Confirmar"
- ],
- "Verified": [
- "Verificado"
- ],
- "Executed at": [
- "creado"
- ],
- "yes": [
- "si"
- ],
- "no": [
- "no"
- ],
- "unknown": [
- "desconocido"
- ],
- "load older transfers": [
- "cargar viejas transferencias"
- ],
+ "La URL no tiene el formato correcto",
+ ],
+ "Transfer ID": ["Transferencias"],
+ "Account Address": ["Dirección de cuenta"],
+ "Exchange URL": ["URL del Exchange"],
+ "could not inform transfer": ["no se pudo crear la instancia"],
+ "load newer transfers": ["cargar nuevas ordenes"],
+ Credit: ["Crédito"],
+ Confirmed: ["Confirmar"],
+ Verified: ["Verificado"],
+ "Executed at": ["creado"],
+ yes: ["si"],
+ no: ["no"],
+ unknown: ["desconocido"],
+ "load older transfers": ["cargar viejas transferencias"],
"There is no transfer yet, add more pressing the + sign": [
- "No hay transferencias todavía, agregar mas presionando el signo +"
- ]
- }
- }
+ "No hay transferencias todavía, agregar mas presionando el signo +",
+ ],
+ },
+ },
};
-strings['fr'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["fr"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- ""
- ],
- "Check your token is valid": [
- ""
- ],
- "Couldn't access the server.": [
- ""
- ],
- "Could not infer instance id from url %1$s": [
- ""
- ],
- "HTTP status #%1$s: Server reported a problem": [
- ""
- ],
- "Got message: \"%1$s\" from: %2$s": [
- ""
- ],
- "No default instance": [
- ""
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- ""
- ],
- "Server reported a problem: HTTP status #%1$s": [
- ""
- ],
- "Got message: %1$s from: %2$s": [
- ""
- ],
- "Login required": [
- ""
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- ""
- ],
- "Confirm": [
- ""
- ],
- "The value %1$s is invalid for a payment url": [
- ""
- ],
- "pick a date": [
- ""
- ],
- "clear": [
- ""
- ],
- "never": [
- ""
- ],
- "Image should be smaller than 1 MB": [
- ""
- ],
- "Country": [
- ""
- ],
- "Address": [
- ""
- ],
- "Building number": [
- ""
- ],
- "Building name": [
- ""
- ],
- "Street": [
- ""
- ],
- "Post code": [
- ""
- ],
- "Town location": [
- ""
- ],
- "Town": [
- ""
- ],
- "District": [
- ""
- ],
- "Country subdivision": [
- ""
- ],
- "Product id": [
- ""
- ],
- "Description": [
- ""
- ],
- "Name": [
- ""
- ],
- "loading...": [
- ""
- ],
- "no products found": [
- ""
- ],
- "no results": [
- ""
- ],
- "Deleting": [
- ""
- ],
- "Changing": [
- ""
- ],
- "Manage token": [
- ""
- ],
- "Update": [
- ""
- ],
- "Remove": [
- ""
- ],
- "Cancel": [
- ""
- ],
- "Manage stock": [
- ""
- ],
- "Infinite": [
- ""
- ],
- "lost cannot be greater that current + incoming (max %1$s)": [
- ""
- ],
- "current stock will change from %1$s to %2$s": [
- ""
- ],
- "current stock will stay at %1$s": [
- ""
- ],
- "Incoming": [
- ""
- ],
- "Lost": [
- ""
- ],
- "Current": [
- ""
- ],
- "without stock": [
- ""
- ],
- "Next restock": [
- ""
- ],
- "Delivery address": [
- ""
- ],
- "this product has no taxes": [
- ""
- ],
- "Amount": [
- ""
- ],
- "currency and value separated with colon": [
- ""
- ],
- "Add": [
- ""
- ],
- "Instance": [
- ""
- ],
- "Settings": [
- ""
- ],
- "Orders": [
- ""
- ],
- "Products": [
- ""
- ],
- "Transfers": [
- ""
- ],
- "Connection": [
- ""
- ],
- "Instances": [
- ""
- ],
- "New": [
- ""
- ],
- "List": [
- ""
- ],
- "Log out": [
- ""
- ],
- "Clear": [
- ""
- ],
- "should be the same": [
- ""
- ],
- "cannot be the same as before": [
- ""
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- ""
- ],
- "Old token": [
- ""
- ],
- "New token": [
- ""
- ],
- "Clearing the auth token will mean public access to the instance": [
- ""
- ],
- "ID": [
- ""
- ],
- "Image": [
- ""
- ],
- "Unit": [
- ""
- ],
- "Price": [
- ""
- ],
- "Stock": [
- ""
- ],
- "Taxes": [
- ""
- ],
- "Server not found": [
- ""
- ],
- "Couldn't access the server": [
- ""
- ],
- "Got message %1$s from %2$s": [
- ""
- ],
- "Unexpected Error": [
- ""
- ],
- "Auth token": [
- ""
- ],
- "Account address": [
- ""
- ],
- "Default max deposit fee": [
- ""
- ],
- "Default max wire fee": [
- ""
- ],
- "Default wire fee amortization": [
- ""
- ],
- "Jurisdiction": [
- ""
- ],
- "Default pay delay": [
- ""
- ],
- "Default wire transfer delay": [
- ""
- ],
- "could not create instance": [
- ""
- ],
- "Delete": [
- ""
- ],
- "Edit": [
- ""
- ],
- "There is no instances yet, add more pressing the + sign": [
- ""
- ],
- "Inventory products": [
- ""
- ],
- "Total price": [
- ""
- ],
- "Total tax": [
- ""
- ],
- "Order price": [
- ""
- ],
- "Net": [
- ""
- ],
- "Summary": [
- ""
- ],
- "Payments options": [
- ""
- ],
- "Auto refund deadline": [
- ""
- ],
- "Refund deadline": [
- ""
- ],
- "Pay deadline": [
- ""
- ],
- "Delivery date": [
- ""
- ],
- "Location": [
- ""
- ],
- "Max fee": [
- ""
- ],
- "Max wire fee": [
- ""
- ],
- "Wire fee amortization": [
- ""
- ],
- "Fullfilment url": [
- ""
- ],
- "Extra information": [
- ""
- ],
- "select a product first": [
- ""
- ],
- "should be greater than 0": [
- ""
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- ""
- ],
- "cannot be greater than current stock %1$s": [
- ""
- ],
- "Quantity": [
- ""
- ],
- "Order": [
- ""
- ],
- "claimed": [
- ""
- ],
- "copy url": [
- ""
- ],
- "pay at": [
- ""
- ],
- "created at": [
- ""
- ],
- "Timeline": [
- ""
- ],
- "Payment details": [
- ""
- ],
- "Order status": [
- ""
- ],
- "Product list": [
- ""
- ],
- "paid": [
- ""
- ],
- "wired": [
- ""
- ],
- "refunded": [
- ""
- ],
- "refund": [
- ""
- ],
- "Refunded amount": [
- ""
- ],
- "Deposit total": [
- ""
- ],
- "unpaid": [
- ""
- ],
- "Order status URL": [
- ""
- ],
- "Pay URI": [
- ""
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- ""
- ],
- "refund created successfully": [
- ""
- ],
- "could not create the refund": [
- ""
- ],
- "load newer orders": [
- ""
- ],
- "Date": [
- ""
- ],
- "Refund": [
- ""
- ],
- "load older orders": [
- ""
- ],
- "No orders has been found": [
- ""
- ],
- "date": [
- ""
- ],
- "amount": [
- ""
- ],
- "reason": [
- ""
- ],
- "Max refundable:": [
- ""
- ],
- "Reason": [
- ""
- ],
- "duplicated": [
- ""
- ],
- "requested by the customer": [
- ""
- ],
- "other": [
- ""
- ],
- "go to order id": [
- ""
- ],
- "Paid": [
- ""
- ],
- "Refunded": [
- ""
- ],
- "Not wired": [
- ""
- ],
- "All": [
- ""
- ],
- "could not create product": [
- ""
- ],
- "Sell": [
- ""
- ],
- "Profit": [
- ""
- ],
- "Sold": [
- ""
- ],
- "product updated successfully": [
- ""
- ],
- "could not update the product": [
- ""
- ],
- "product delete successfully": [
- ""
- ],
- "could not delete the product": [
- ""
- ],
- "Tips": [
- ""
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
- "There is no tips yet, add more pressing the + sign": [
- ""
- ],
- "cannot be empty": [
- ""
- ],
- "check the id, doest look valid": [
- ""
- ],
- "should have 52 characters, current %1$s": [
- ""
- ],
- "URL doesn't have the right format": [
- ""
- ],
- "Transfer ID": [
- ""
- ],
- "Account Address": [
- ""
- ],
- "Exchange URL": [
- ""
- ],
- "could not inform transfer": [
- ""
- ],
- "load newer transfers": [
- ""
- ],
- "Credit": [
- ""
- ],
- "Confirmed": [
- ""
- ],
- "Verified": [
- ""
- ],
- "Executed at": [
- ""
- ],
- "yes": [
- ""
- ],
- "no": [
- ""
- ],
- "unknown": [
- ""
- ],
- "load older transfers": [
- ""
- ],
- "There is no transfer yet, add more pressing the + sign": [
- ""
- ]
- }
- }
+ "Access denied": [""],
+ "Check your token is valid": [""],
+ "Couldn't access the server.": [""],
+ "Could not infer instance id from url %1$s": [""],
+ "HTTP status #%1$s: Server reported a problem": [""],
+ 'Got message: "%1$s" from: %2$s': [""],
+ "No default instance": [""],
+ "in order to use merchant backoffice, you should create the default instance":
+ [""],
+ "Server reported a problem: HTTP status #%1$s": [""],
+ "Got message: %1$s from: %2$s": [""],
+ "Login required": [""],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [""],
+ Confirm: [""],
+ "The value %1$s is invalid for a payment url": [""],
+ "pick a date": [""],
+ clear: [""],
+ never: [""],
+ "Image should be smaller than 1 MB": [""],
+ Country: [""],
+ Address: [""],
+ "Building number": [""],
+ "Building name": [""],
+ Street: [""],
+ "Post code": [""],
+ "Town location": [""],
+ Town: [""],
+ District: [""],
+ "Country subdivision": [""],
+ "Product id": [""],
+ Description: [""],
+ Name: [""],
+ "loading...": [""],
+ "no products found": [""],
+ "no results": [""],
+ Deleting: [""],
+ Changing: [""],
+ "Manage token": [""],
+ Update: [""],
+ Remove: [""],
+ Cancel: [""],
+ "Manage stock": [""],
+ Infinite: [""],
+ "lost cannot be greater that current + incoming (max %1$s)": [""],
+ "current stock will change from %1$s to %2$s": [""],
+ "current stock will stay at %1$s": [""],
+ Incoming: [""],
+ Lost: [""],
+ Current: [""],
+ "without stock": [""],
+ "Next restock": [""],
+ "Delivery address": [""],
+ "this product has no taxes": [""],
+ Amount: [""],
+ "currency and value separated with colon": [""],
+ Add: [""],
+ Instance: [""],
+ Settings: [""],
+ Orders: [""],
+ Products: [""],
+ Transfers: [""],
+ Connection: [""],
+ Instances: [""],
+ New: [""],
+ List: [""],
+ "Log out": [""],
+ Clear: [""],
+ "should be the same": [""],
+ "cannot be the same as before": [""],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [""],
+ "Old token": [""],
+ "New token": [""],
+ "Clearing the auth token will mean public access to the instance": [""],
+ ID: [""],
+ Image: [""],
+ Unit: [""],
+ Price: [""],
+ Stock: [""],
+ Taxes: [""],
+ "Server not found": [""],
+ "Couldn't access the server": [""],
+ "Got message %1$s from %2$s": [""],
+ "Unexpected Error": [""],
+ "Auth token": [""],
+ "Account address": [""],
+ "Default max deposit fee": [""],
+ "Default max wire fee": [""],
+ "Default wire fee amortization": [""],
+ Jurisdiction: [""],
+ "Default pay delay": [""],
+ "Default wire transfer delay": [""],
+ "could not create instance": [""],
+ Delete: [""],
+ Edit: [""],
+ "There is no instances yet, add more pressing the + sign": [""],
+ "Inventory products": [""],
+ "Total price": [""],
+ "Total tax": [""],
+ "Order price": [""],
+ Net: [""],
+ Summary: [""],
+ "Payments options": [""],
+ "Auto refund deadline": [""],
+ "Refund deadline": [""],
+ "Pay deadline": [""],
+ "Delivery date": [""],
+ Location: [""],
+ "Max fee": [""],
+ "Max wire fee": [""],
+ "Wire fee amortization": [""],
+ "Fullfilment url": [""],
+ "Extra information": [""],
+ "select a product first": [""],
+ "should be greater than 0": [""],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [""],
+ "cannot be greater than current stock %1$s": [""],
+ Quantity: [""],
+ Order: [""],
+ claimed: [""],
+ "copy url": [""],
+ "pay at": [""],
+ "created at": [""],
+ Timeline: [""],
+ "Payment details": [""],
+ "Order status": [""],
+ "Product list": [""],
+ paid: [""],
+ wired: [""],
+ refunded: [""],
+ refund: [""],
+ "Refunded amount": [""],
+ "Deposit total": [""],
+ unpaid: [""],
+ "Order status URL": [""],
+ "Pay URI": [""],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [""],
+ "refund created successfully": [""],
+ "could not create the refund": [""],
+ "load newer orders": [""],
+ Date: [""],
+ Refund: [""],
+ "load older orders": [""],
+ "No orders has been found": [""],
+ date: [""],
+ amount: [""],
+ reason: [""],
+ "Max refundable:": [""],
+ Reason: [""],
+ duplicated: [""],
+ "requested by the customer": [""],
+ other: [""],
+ "go to order id": [""],
+ Paid: [""],
+ Refunded: [""],
+ "Not wired": [""],
+ All: [""],
+ "could not create product": [""],
+ Sell: [""],
+ Profit: [""],
+ Sold: [""],
+ "product updated successfully": [""],
+ "could not update the product": [""],
+ "product delete successfully": [""],
+ "could not delete the product": [""],
+ Tips: [""],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
+ "There is no tips yet, add more pressing the + sign": [""],
+ "cannot be empty": [""],
+ "check the id, doest look valid": [""],
+ "should have 52 characters, current %1$s": [""],
+ "URL doesn't have the right format": [""],
+ "Transfer ID": [""],
+ "Account Address": [""],
+ "Exchange URL": [""],
+ "could not inform transfer": [""],
+ "load newer transfers": [""],
+ Credit: [""],
+ Confirmed: [""],
+ Verified: [""],
+ "Executed at": [""],
+ yes: [""],
+ no: [""],
+ unknown: [""],
+ "load older transfers": [""],
+ "There is no transfer yet, add more pressing the + sign": [""],
+ },
+ },
};
-strings['it'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["it"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- ""
- ],
- "Check your token is valid": [
- ""
- ],
- "Couldn't access the server.": [
- ""
- ],
- "Could not infer instance id from url %1$s": [
- ""
- ],
- "HTTP status #%1$s: Server reported a problem": [
- ""
- ],
- "Got message: \"%1$s\" from: %2$s": [
- ""
- ],
- "No default instance": [
- ""
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- ""
- ],
- "Server reported a problem: HTTP status #%1$s": [
- ""
- ],
- "Got message: %1$s from: %2$s": [
- ""
- ],
- "Login required": [
- ""
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- ""
- ],
- "Confirm": [
- ""
- ],
- "The value %1$s is invalid for a payment url": [
- ""
- ],
- "pick a date": [
- ""
- ],
- "clear": [
- ""
- ],
- "never": [
- ""
- ],
- "Image should be smaller than 1 MB": [
- ""
- ],
- "Country": [
- ""
- ],
- "Address": [
- ""
- ],
- "Building number": [
- ""
- ],
- "Building name": [
- ""
- ],
- "Street": [
- ""
- ],
- "Post code": [
- ""
- ],
- "Town location": [
- ""
- ],
- "Town": [
- ""
- ],
- "District": [
- ""
- ],
- "Country subdivision": [
- ""
- ],
- "Product id": [
- ""
- ],
- "Description": [
- ""
- ],
- "Name": [
- ""
- ],
- "loading...": [
- ""
- ],
- "no products found": [
- ""
- ],
- "no results": [
- ""
- ],
- "Deleting": [
- ""
- ],
- "Changing": [
- ""
- ],
- "Manage token": [
- ""
- ],
- "Update": [
- ""
- ],
- "Remove": [
- ""
- ],
- "Cancel": [
- ""
- ],
- "Manage stock": [
- ""
- ],
- "Infinite": [
- ""
- ],
- "lost cannot be greater that current + incoming (max %1$s)": [
- ""
- ],
- "current stock will change from %1$s to %2$s": [
- ""
- ],
- "current stock will stay at %1$s": [
- ""
- ],
- "Incoming": [
- ""
- ],
- "Lost": [
- ""
- ],
- "Current": [
- ""
- ],
- "without stock": [
- ""
- ],
- "Next restock": [
- ""
- ],
- "Delivery address": [
- ""
- ],
- "this product has no taxes": [
- ""
- ],
- "Amount": [
- ""
- ],
- "currency and value separated with colon": [
- ""
- ],
- "Add": [
- ""
- ],
- "Instance": [
- ""
- ],
- "Settings": [
- ""
- ],
- "Orders": [
- ""
- ],
- "Products": [
- ""
- ],
- "Transfers": [
- ""
- ],
- "Connection": [
- ""
- ],
- "Instances": [
- ""
- ],
- "New": [
- ""
- ],
- "List": [
- ""
- ],
- "Log out": [
- ""
- ],
- "Clear": [
- ""
- ],
- "should be the same": [
- ""
- ],
- "cannot be the same as before": [
- ""
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- ""
- ],
- "Old token": [
- ""
- ],
- "New token": [
- ""
- ],
- "Clearing the auth token will mean public access to the instance": [
- ""
- ],
- "ID": [
- ""
- ],
- "Image": [
- ""
- ],
- "Unit": [
- ""
- ],
- "Price": [
- ""
- ],
- "Stock": [
- ""
- ],
- "Taxes": [
- ""
- ],
- "Server not found": [
- ""
- ],
- "Couldn't access the server": [
- ""
- ],
- "Got message %1$s from %2$s": [
- ""
- ],
- "Unexpected Error": [
- ""
- ],
- "Auth token": [
- ""
- ],
- "Account address": [
- ""
- ],
- "Default max deposit fee": [
- ""
- ],
- "Default max wire fee": [
- ""
- ],
- "Default wire fee amortization": [
- ""
- ],
- "Jurisdiction": [
- ""
- ],
- "Default pay delay": [
- ""
- ],
- "Default wire transfer delay": [
- ""
- ],
- "could not create instance": [
- ""
- ],
- "Delete": [
- ""
- ],
- "Edit": [
- ""
- ],
- "There is no instances yet, add more pressing the + sign": [
- ""
- ],
- "Inventory products": [
- ""
- ],
- "Total price": [
- ""
- ],
- "Total tax": [
- ""
- ],
- "Order price": [
- ""
- ],
- "Net": [
- ""
- ],
- "Summary": [
- ""
- ],
- "Payments options": [
- ""
- ],
- "Auto refund deadline": [
- ""
- ],
- "Refund deadline": [
- ""
- ],
- "Pay deadline": [
- ""
- ],
- "Delivery date": [
- ""
- ],
- "Location": [
- ""
- ],
- "Max fee": [
- ""
- ],
- "Max wire fee": [
- ""
- ],
- "Wire fee amortization": [
- ""
- ],
- "Fullfilment url": [
- ""
- ],
- "Extra information": [
- ""
- ],
- "select a product first": [
- ""
- ],
- "should be greater than 0": [
- ""
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- ""
- ],
- "cannot be greater than current stock %1$s": [
- ""
- ],
- "Quantity": [
- ""
- ],
- "Order": [
- ""
- ],
- "claimed": [
- ""
- ],
- "copy url": [
- ""
- ],
- "pay at": [
- ""
- ],
- "created at": [
- ""
- ],
- "Timeline": [
- ""
- ],
- "Payment details": [
- ""
- ],
- "Order status": [
- ""
- ],
- "Product list": [
- ""
- ],
- "paid": [
- ""
- ],
- "wired": [
- ""
- ],
- "refunded": [
- ""
- ],
- "refund": [
- ""
- ],
- "Refunded amount": [
- ""
- ],
- "Deposit total": [
- ""
- ],
- "unpaid": [
- ""
- ],
- "Order status URL": [
- ""
- ],
- "Pay URI": [
- ""
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- ""
- ],
- "refund created successfully": [
- ""
- ],
- "could not create the refund": [
- ""
- ],
- "load newer orders": [
- ""
- ],
- "Date": [
- ""
- ],
- "Refund": [
- ""
- ],
- "load older orders": [
- ""
- ],
- "No orders has been found": [
- ""
- ],
- "date": [
- ""
- ],
- "amount": [
- ""
- ],
- "reason": [
- ""
- ],
- "Max refundable:": [
- ""
- ],
- "Reason": [
- ""
- ],
- "duplicated": [
- ""
- ],
- "requested by the customer": [
- ""
- ],
- "other": [
- ""
- ],
- "go to order id": [
- ""
- ],
- "Paid": [
- ""
- ],
- "Refunded": [
- ""
- ],
- "Not wired": [
- ""
- ],
- "All": [
- ""
- ],
- "could not create product": [
- ""
- ],
- "Sell": [
- ""
- ],
- "Profit": [
- ""
- ],
- "Sold": [
- ""
- ],
- "product updated successfully": [
- ""
- ],
- "could not update the product": [
- ""
- ],
- "product delete successfully": [
- ""
- ],
- "could not delete the product": [
- ""
- ],
- "Tips": [
- ""
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
- "There is no tips yet, add more pressing the + sign": [
- ""
- ],
- "cannot be empty": [
- ""
- ],
- "check the id, doest look valid": [
- ""
- ],
- "should have 52 characters, current %1$s": [
- ""
- ],
- "URL doesn't have the right format": [
- ""
- ],
- "Transfer ID": [
- ""
- ],
- "Account Address": [
- ""
- ],
- "Exchange URL": [
- ""
- ],
- "could not inform transfer": [
- ""
- ],
- "load newer transfers": [
- ""
- ],
- "Credit": [
- ""
- ],
- "Confirmed": [
- ""
- ],
- "Verified": [
- ""
- ],
- "Executed at": [
- ""
- ],
- "yes": [
- ""
- ],
- "no": [
- ""
- ],
- "unknown": [
- ""
- ],
- "load older transfers": [
- ""
- ],
- "There is no transfer yet, add more pressing the + sign": [
- ""
- ]
- }
- }
+ "Access denied": [""],
+ "Check your token is valid": [""],
+ "Couldn't access the server.": [""],
+ "Could not infer instance id from url %1$s": [""],
+ "HTTP status #%1$s: Server reported a problem": [""],
+ 'Got message: "%1$s" from: %2$s': [""],
+ "No default instance": [""],
+ "in order to use merchant backoffice, you should create the default instance":
+ [""],
+ "Server reported a problem: HTTP status #%1$s": [""],
+ "Got message: %1$s from: %2$s": [""],
+ "Login required": [""],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [""],
+ Confirm: [""],
+ "The value %1$s is invalid for a payment url": [""],
+ "pick a date": [""],
+ clear: [""],
+ never: [""],
+ "Image should be smaller than 1 MB": [""],
+ Country: [""],
+ Address: [""],
+ "Building number": [""],
+ "Building name": [""],
+ Street: [""],
+ "Post code": [""],
+ "Town location": [""],
+ Town: [""],
+ District: [""],
+ "Country subdivision": [""],
+ "Product id": [""],
+ Description: [""],
+ Name: [""],
+ "loading...": [""],
+ "no products found": [""],
+ "no results": [""],
+ Deleting: [""],
+ Changing: [""],
+ "Manage token": [""],
+ Update: [""],
+ Remove: [""],
+ Cancel: [""],
+ "Manage stock": [""],
+ Infinite: [""],
+ "lost cannot be greater that current + incoming (max %1$s)": [""],
+ "current stock will change from %1$s to %2$s": [""],
+ "current stock will stay at %1$s": [""],
+ Incoming: [""],
+ Lost: [""],
+ Current: [""],
+ "without stock": [""],
+ "Next restock": [""],
+ "Delivery address": [""],
+ "this product has no taxes": [""],
+ Amount: [""],
+ "currency and value separated with colon": [""],
+ Add: [""],
+ Instance: [""],
+ Settings: [""],
+ Orders: [""],
+ Products: [""],
+ Transfers: [""],
+ Connection: [""],
+ Instances: [""],
+ New: [""],
+ List: [""],
+ "Log out": [""],
+ Clear: [""],
+ "should be the same": [""],
+ "cannot be the same as before": [""],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [""],
+ "Old token": [""],
+ "New token": [""],
+ "Clearing the auth token will mean public access to the instance": [""],
+ ID: [""],
+ Image: [""],
+ Unit: [""],
+ Price: [""],
+ Stock: [""],
+ Taxes: [""],
+ "Server not found": [""],
+ "Couldn't access the server": [""],
+ "Got message %1$s from %2$s": [""],
+ "Unexpected Error": [""],
+ "Auth token": [""],
+ "Account address": [""],
+ "Default max deposit fee": [""],
+ "Default max wire fee": [""],
+ "Default wire fee amortization": [""],
+ Jurisdiction: [""],
+ "Default pay delay": [""],
+ "Default wire transfer delay": [""],
+ "could not create instance": [""],
+ Delete: [""],
+ Edit: [""],
+ "There is no instances yet, add more pressing the + sign": [""],
+ "Inventory products": [""],
+ "Total price": [""],
+ "Total tax": [""],
+ "Order price": [""],
+ Net: [""],
+ Summary: [""],
+ "Payments options": [""],
+ "Auto refund deadline": [""],
+ "Refund deadline": [""],
+ "Pay deadline": [""],
+ "Delivery date": [""],
+ Location: [""],
+ "Max fee": [""],
+ "Max wire fee": [""],
+ "Wire fee amortization": [""],
+ "Fullfilment url": [""],
+ "Extra information": [""],
+ "select a product first": [""],
+ "should be greater than 0": [""],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [""],
+ "cannot be greater than current stock %1$s": [""],
+ Quantity: [""],
+ Order: [""],
+ claimed: [""],
+ "copy url": [""],
+ "pay at": [""],
+ "created at": [""],
+ Timeline: [""],
+ "Payment details": [""],
+ "Order status": [""],
+ "Product list": [""],
+ paid: [""],
+ wired: [""],
+ refunded: [""],
+ refund: [""],
+ "Refunded amount": [""],
+ "Deposit total": [""],
+ unpaid: [""],
+ "Order status URL": [""],
+ "Pay URI": [""],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [""],
+ "refund created successfully": [""],
+ "could not create the refund": [""],
+ "load newer orders": [""],
+ Date: [""],
+ Refund: [""],
+ "load older orders": [""],
+ "No orders has been found": [""],
+ date: [""],
+ amount: [""],
+ reason: [""],
+ "Max refundable:": [""],
+ Reason: [""],
+ duplicated: [""],
+ "requested by the customer": [""],
+ other: [""],
+ "go to order id": [""],
+ Paid: [""],
+ Refunded: [""],
+ "Not wired": [""],
+ All: [""],
+ "could not create product": [""],
+ Sell: [""],
+ Profit: [""],
+ Sold: [""],
+ "product updated successfully": [""],
+ "could not update the product": [""],
+ "product delete successfully": [""],
+ "could not delete the product": [""],
+ Tips: [""],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
+ "There is no tips yet, add more pressing the + sign": [""],
+ "cannot be empty": [""],
+ "check the id, doest look valid": [""],
+ "should have 52 characters, current %1$s": [""],
+ "URL doesn't have the right format": [""],
+ "Transfer ID": [""],
+ "Account Address": [""],
+ "Exchange URL": [""],
+ "could not inform transfer": [""],
+ "load newer transfers": [""],
+ Credit: [""],
+ Confirmed: [""],
+ Verified: [""],
+ "Executed at": [""],
+ yes: [""],
+ no: [""],
+ unknown: [""],
+ "load older transfers": [""],
+ "There is no transfer yet, add more pressing the + sign": [""],
+ },
+ },
};
-strings['sv'] = {
- "domain": "messages",
- "locale_data": {
- "messages": {
+strings["sv"] = {
+ domain: "messages",
+ locale_data: {
+ messages: {
"": {
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": ""
+ domain: "messages",
+ plural_forms: "nplurals=2; plural=(n != 1);",
+ lang: "",
},
- "Access denied": [
- ""
- ],
- "Check your token is valid": [
- ""
- ],
- "Couldn't access the server.": [
- ""
- ],
- "Could not infer instance id from url %1$s": [
- ""
- ],
- "HTTP status #%1$s: Server reported a problem": [
- ""
- ],
- "Got message: \"%1$s\" from: %2$s": [
- ""
- ],
- "No default instance": [
- ""
- ],
- "in order to use merchant backoffice, you should create the default instance": [
- ""
- ],
- "Server reported a problem: HTTP status #%1$s": [
- ""
- ],
- "Got message: %1$s from: %2$s": [
- ""
- ],
- "Login required": [
- ""
- ],
- "Please enter your auth token. Token should have \"secret-token:\" and start with Bearer or ApiKey": [
- ""
- ],
- "Confirm": [
- ""
- ],
- "The value %1$s is invalid for a payment url": [
- ""
- ],
- "pick a date": [
- ""
- ],
- "clear": [
- ""
- ],
- "never": [
- ""
- ],
- "Image should be smaller than 1 MB": [
- ""
- ],
- "Country": [
- ""
- ],
- "Address": [
- ""
- ],
- "Building number": [
- ""
- ],
- "Building name": [
- ""
- ],
- "Street": [
- ""
- ],
- "Post code": [
- ""
- ],
- "Town location": [
- ""
- ],
- "Town": [
- ""
- ],
- "District": [
- ""
- ],
- "Country subdivision": [
- ""
- ],
- "Product id": [
- ""
- ],
- "Description": [
- ""
- ],
- "Name": [
- ""
- ],
- "loading...": [
- ""
- ],
- "no products found": [
- ""
- ],
- "no results": [
- ""
- ],
- "Deleting": [
- ""
- ],
- "Changing": [
- ""
- ],
- "Manage token": [
- ""
- ],
- "Update": [
- ""
- ],
- "Remove": [
- ""
- ],
- "Cancel": [
- ""
- ],
- "Manage stock": [
- ""
- ],
- "Infinite": [
- ""
- ],
- "lost cannot be greater that current + incoming (max %1$s)": [
- ""
- ],
- "current stock will change from %1$s to %2$s": [
- ""
- ],
- "current stock will stay at %1$s": [
- ""
- ],
- "Incoming": [
- ""
- ],
- "Lost": [
- ""
- ],
- "Current": [
- ""
- ],
- "without stock": [
- ""
- ],
- "Next restock": [
- ""
- ],
- "Delivery address": [
- ""
- ],
- "this product has no taxes": [
- ""
- ],
- "Amount": [
- ""
- ],
- "currency and value separated with colon": [
- ""
- ],
- "Add": [
- ""
- ],
- "Instance": [
- ""
- ],
- "Settings": [
- ""
- ],
- "Orders": [
- ""
- ],
- "Products": [
- ""
- ],
- "Transfers": [
- ""
- ],
- "Connection": [
- ""
- ],
- "Instances": [
- ""
- ],
- "New": [
- ""
- ],
- "List": [
- ""
- ],
- "Log out": [
- ""
- ],
- "Clear": [
- ""
- ],
- "should be the same": [
- ""
- ],
- "cannot be the same as before": [
- ""
- ],
- "You are updating the authorization token from instance %1$s with id %2$s": [
- ""
- ],
- "Old token": [
- ""
- ],
- "New token": [
- ""
- ],
- "Clearing the auth token will mean public access to the instance": [
- ""
- ],
- "ID": [
- ""
- ],
- "Image": [
- ""
- ],
- "Unit": [
- ""
- ],
- "Price": [
- ""
- ],
- "Stock": [
- ""
- ],
- "Taxes": [
- ""
- ],
- "Server not found": [
- ""
- ],
- "Couldn't access the server": [
- ""
- ],
- "Got message %1$s from %2$s": [
- ""
- ],
- "Unexpected Error": [
- ""
- ],
- "Auth token": [
- ""
- ],
- "Account address": [
- ""
- ],
- "Default max deposit fee": [
- ""
- ],
- "Default max wire fee": [
- ""
- ],
- "Default wire fee amortization": [
- ""
- ],
- "Jurisdiction": [
- ""
- ],
- "Default pay delay": [
- ""
- ],
- "Default wire transfer delay": [
- ""
- ],
- "could not create instance": [
- ""
- ],
- "Delete": [
- ""
- ],
- "Edit": [
- ""
- ],
- "There is no instances yet, add more pressing the + sign": [
- ""
- ],
- "Inventory products": [
- ""
- ],
- "Total price": [
- ""
- ],
- "Total tax": [
- ""
- ],
- "Order price": [
- ""
- ],
- "Net": [
- ""
- ],
- "Summary": [
- ""
- ],
- "Payments options": [
- ""
- ],
- "Auto refund deadline": [
- ""
- ],
- "Refund deadline": [
- ""
- ],
- "Pay deadline": [
- ""
- ],
- "Delivery date": [
- ""
- ],
- "Location": [
- ""
- ],
- "Max fee": [
- ""
- ],
- "Max wire fee": [
- ""
- ],
- "Wire fee amortization": [
- ""
- ],
- "Fullfilment url": [
- ""
- ],
- "Extra information": [
- ""
- ],
- "select a product first": [
- ""
- ],
- "should be greater than 0": [
- ""
- ],
- "cannot be greater than current stock and quantity previously added. max: %1$s": [
- ""
- ],
- "cannot be greater than current stock %1$s": [
- ""
- ],
- "Quantity": [
- ""
- ],
- "Order": [
- ""
- ],
- "claimed": [
- ""
- ],
- "copy url": [
- ""
- ],
- "pay at": [
- ""
- ],
- "created at": [
- ""
- ],
- "Timeline": [
- ""
- ],
- "Payment details": [
- ""
- ],
- "Order status": [
- ""
- ],
- "Product list": [
- ""
- ],
- "paid": [
- ""
- ],
- "wired": [
- ""
- ],
- "refunded": [
- ""
- ],
- "refund": [
- ""
- ],
- "Refunded amount": [
- ""
- ],
- "Deposit total": [
- ""
- ],
- "unpaid": [
- ""
- ],
- "Order status URL": [
- ""
- ],
- "Pay URI": [
- ""
- ],
- "Unknown order status. This is an error, please contact the administrator.": [
- ""
- ],
- "refund created successfully": [
- ""
- ],
- "could not create the refund": [
- ""
- ],
- "load newer orders": [
- ""
- ],
- "Date": [
- ""
- ],
- "Refund": [
- ""
- ],
- "load older orders": [
- ""
- ],
- "No orders has been found": [
- ""
- ],
- "date": [
- ""
- ],
- "amount": [
- ""
- ],
- "reason": [
- ""
- ],
- "Max refundable:": [
- ""
- ],
- "Reason": [
- ""
- ],
- "duplicated": [
- ""
- ],
- "requested by the customer": [
- ""
- ],
- "other": [
- ""
- ],
- "go to order id": [
- ""
- ],
- "Paid": [
- ""
- ],
- "Refunded": [
- ""
- ],
- "Not wired": [
- ""
- ],
- "All": [
- ""
- ],
- "could not create product": [
- ""
- ],
- "Sell": [
- ""
- ],
- "Profit": [
- ""
- ],
- "Sold": [
- ""
- ],
- "product updated successfully": [
- ""
- ],
- "could not update the product": [
- ""
- ],
- "product delete successfully": [
- ""
- ],
- "could not delete the product": [
- ""
- ],
- "Tips": [
- ""
- ],
- "Committed amount": [
- ""
- ],
- "Exchange initial amount": [
- ""
- ],
- "Merchant initial amount": [
- ""
- ],
- "There is no tips yet, add more pressing the + sign": [
- ""
- ],
- "cannot be empty": [
- ""
- ],
- "check the id, doest look valid": [
- ""
- ],
- "should have 52 characters, current %1$s": [
- ""
- ],
- "URL doesn't have the right format": [
- ""
- ],
- "Transfer ID": [
- ""
- ],
- "Account Address": [
- ""
- ],
- "Exchange URL": [
- ""
- ],
- "could not inform transfer": [
- ""
- ],
- "load newer transfers": [
- ""
- ],
- "Credit": [
- ""
- ],
- "Confirmed": [
- ""
- ],
- "Verified": [
- ""
- ],
- "Executed at": [
- ""
- ],
- "yes": [
- ""
- ],
- "no": [
- ""
- ],
- "unknown": [
- ""
- ],
- "load older transfers": [
- ""
- ],
- "There is no transfer yet, add more pressing the + sign": [
- ""
- ]
- }
- }
+ "Access denied": [""],
+ "Check your token is valid": [""],
+ "Couldn't access the server.": [""],
+ "Could not infer instance id from url %1$s": [""],
+ "HTTP status #%1$s: Server reported a problem": [""],
+ 'Got message: "%1$s" from: %2$s': [""],
+ "No default instance": [""],
+ "in order to use merchant backoffice, you should create the default instance":
+ [""],
+ "Server reported a problem: HTTP status #%1$s": [""],
+ "Got message: %1$s from: %2$s": [""],
+ "Login required": [""],
+ 'Please enter your auth token. Token should have "secret-token:" and start with Bearer or ApiKey':
+ [""],
+ Confirm: [""],
+ "The value %1$s is invalid for a payment url": [""],
+ "pick a date": [""],
+ clear: [""],
+ never: [""],
+ "Image should be smaller than 1 MB": [""],
+ Country: [""],
+ Address: [""],
+ "Building number": [""],
+ "Building name": [""],
+ Street: [""],
+ "Post code": [""],
+ "Town location": [""],
+ Town: [""],
+ District: [""],
+ "Country subdivision": [""],
+ "Product id": [""],
+ Description: [""],
+ Name: [""],
+ "loading...": [""],
+ "no products found": [""],
+ "no results": [""],
+ Deleting: [""],
+ Changing: [""],
+ "Manage token": [""],
+ Update: [""],
+ Remove: [""],
+ Cancel: [""],
+ "Manage stock": [""],
+ Infinite: [""],
+ "lost cannot be greater that current + incoming (max %1$s)": [""],
+ "current stock will change from %1$s to %2$s": [""],
+ "current stock will stay at %1$s": [""],
+ Incoming: [""],
+ Lost: [""],
+ Current: [""],
+ "without stock": [""],
+ "Next restock": [""],
+ "Delivery address": [""],
+ "this product has no taxes": [""],
+ Amount: [""],
+ "currency and value separated with colon": [""],
+ Add: [""],
+ Instance: [""],
+ Settings: [""],
+ Orders: [""],
+ Products: [""],
+ Transfers: [""],
+ Connection: [""],
+ Instances: [""],
+ New: [""],
+ List: [""],
+ "Log out": [""],
+ Clear: [""],
+ "should be the same": [""],
+ "cannot be the same as before": [""],
+ "You are updating the authorization token from instance %1$s with id %2$s":
+ [""],
+ "Old token": [""],
+ "New token": [""],
+ "Clearing the auth token will mean public access to the instance": [""],
+ ID: [""],
+ Image: [""],
+ Unit: [""],
+ Price: [""],
+ Stock: [""],
+ Taxes: [""],
+ "Server not found": [""],
+ "Couldn't access the server": [""],
+ "Got message %1$s from %2$s": [""],
+ "Unexpected Error": [""],
+ "Auth token": [""],
+ "Account address": [""],
+ "Default max deposit fee": [""],
+ "Default max wire fee": [""],
+ "Default wire fee amortization": [""],
+ Jurisdiction: [""],
+ "Default pay delay": [""],
+ "Default wire transfer delay": [""],
+ "could not create instance": [""],
+ Delete: [""],
+ Edit: [""],
+ "There is no instances yet, add more pressing the + sign": [""],
+ "Inventory products": [""],
+ "Total price": [""],
+ "Total tax": [""],
+ "Order price": [""],
+ Net: [""],
+ Summary: [""],
+ "Payments options": [""],
+ "Auto refund deadline": [""],
+ "Refund deadline": [""],
+ "Pay deadline": [""],
+ "Delivery date": [""],
+ Location: [""],
+ "Max fee": [""],
+ "Max wire fee": [""],
+ "Wire fee amortization": [""],
+ "Fullfilment url": [""],
+ "Extra information": [""],
+ "select a product first": [""],
+ "should be greater than 0": [""],
+ "cannot be greater than current stock and quantity previously added. max: %1$s":
+ [""],
+ "cannot be greater than current stock %1$s": [""],
+ Quantity: [""],
+ Order: [""],
+ claimed: [""],
+ "copy url": [""],
+ "pay at": [""],
+ "created at": [""],
+ Timeline: [""],
+ "Payment details": [""],
+ "Order status": [""],
+ "Product list": [""],
+ paid: [""],
+ wired: [""],
+ refunded: [""],
+ refund: [""],
+ "Refunded amount": [""],
+ "Deposit total": [""],
+ unpaid: [""],
+ "Order status URL": [""],
+ "Pay URI": [""],
+ "Unknown order status. This is an error, please contact the administrator.":
+ [""],
+ "refund created successfully": [""],
+ "could not create the refund": [""],
+ "load newer orders": [""],
+ Date: [""],
+ Refund: [""],
+ "load older orders": [""],
+ "No orders has been found": [""],
+ date: [""],
+ amount: [""],
+ reason: [""],
+ "Max refundable:": [""],
+ Reason: [""],
+ duplicated: [""],
+ "requested by the customer": [""],
+ other: [""],
+ "go to order id": [""],
+ Paid: [""],
+ Refunded: [""],
+ "Not wired": [""],
+ All: [""],
+ "could not create product": [""],
+ Sell: [""],
+ Profit: [""],
+ Sold: [""],
+ "product updated successfully": [""],
+ "could not update the product": [""],
+ "product delete successfully": [""],
+ "could not delete the product": [""],
+ Tips: [""],
+ "Committed amount": [""],
+ "Exchange initial amount": [""],
+ "Merchant initial amount": [""],
+ "There is no tips yet, add more pressing the + sign": [""],
+ "cannot be empty": [""],
+ "check the id, doest look valid": [""],
+ "should have 52 characters, current %1$s": [""],
+ "URL doesn't have the right format": [""],
+ "Transfer ID": [""],
+ "Account Address": [""],
+ "Exchange URL": [""],
+ "could not inform transfer": [""],
+ "load newer transfers": [""],
+ Credit: [""],
+ Confirmed: [""],
+ Verified: [""],
+ "Executed at": [""],
+ yes: [""],
+ no: [""],
+ unknown: [""],
+ "load older transfers": [""],
+ "There is no transfer yet, add more pressing the + sign": [""],
+ },
+ },
};
-
diff --git a/packages/merchant-backoffice-ui/src/index.html b/packages/merchant-backoffice-ui/src/index.html
index 5f7080df8..3e027f056 100644
--- a/packages/merchant-backoffice-ui/src/index.html
+++ b/packages/merchant-backoffice-ui/src/index.html
@@ -16,7 +16,10 @@
@author Sebastian Javier Marchano
-->
<!DOCTYPE html>
-<html lang="en" class="has-aside-left has-aside-mobile-transition has-navbar-fixed-top has-aside-expanded">
+<html
+ lang="en"
+ class="has-aside-left has-aside-mobile-transition has-navbar-fixed-top has-aside-expanded"
+>
<head>
<meta charset="utf-8" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
@@ -24,8 +27,11 @@
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
- <link rel="icon" href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" />
- <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+ <link
+ rel="icon"
+ href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
+ />
+ <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
<title>Merchant Backoffice</title>
<!-- Optional customization script. -->
<script src="merchant-backoffice-ui-settings.js"></script>
diff --git a/packages/merchant-backoffice-ui/src/index.tsx b/packages/merchant-backoffice-ui/src/index.tsx
index c60471099..87ed8e26f 100644
--- a/packages/merchant-backoffice-ui/src/index.tsx
+++ b/packages/merchant-backoffice-ui/src/index.tsx
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import {Application} from "./Application.js";
+import { Application } from "./Application.js";
import { h, render } from "preact";
import "./scss/main.scss";
diff --git a/packages/merchant-backoffice-ui/src/manifest.json b/packages/merchant-backoffice-ui/src/manifest.json
index d0d3ea463..2c3de2339 100644
--- a/packages/merchant-backoffice-ui/src/manifest.json
+++ b/packages/merchant-backoffice-ui/src/manifest.json
@@ -18,4 +18,4 @@
"sizes": "512x512"
}
]
-} \ No newline at end of file
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
index cb62b0224..052d61544 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
@@ -15,31 +15,32 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CreatePage as TestedComponent } from "./CreatePage.js";
-
export default {
- title: 'Pages/Instance/Create',
+ title: "Pages/Instance/Create",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- goBack: { action: 'goBack' },
- }
+ onCreate: { action: "onCreate" },
+ goBack: { action: "goBack" },
+ },
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
-export const Example = createExample(TestedComponent, {
-});
+export const Example = createExample(TestedComponent, {});
// export const Example = (a: any): VNode => <CreatePage {...a} />;
// Example.args = {
// isLoading: false
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
index 089d4ea80..6fcabb18b 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
@@ -76,7 +76,7 @@ export function CreatePage({ onCreate, onBack, forceId }: Props): VNode {
: undefinedIfEmpty(
value.payto_uris.map((p) => {
return !PAYTO_REGEX.test(p) ? i18n`is not valid` : undefined;
- })
+ }),
),
default_max_deposit_fee: !value.default_max_deposit_fee
? i18n`required`
@@ -115,7 +115,7 @@ export function CreatePage({ onCreate, onBack, forceId }: Props): VNode {
};
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const submit = (): Promise<void> => {
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
index fde2410e9..c620c6482 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
@@ -14,52 +14,61 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { CreatedSuccessfully } from "../../../components/notifications/CreatedSuccessfully.js";
import { Entity } from "./index.js";
-export function InstanceCreatedSuccessfully({ entity, onConfirm }: { entity: Entity; onConfirm: () => void; }): VNode {
- return <CreatedSuccessfully onConfirm={onConfirm}>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">ID</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.id} />
- </p>
+export function InstanceCreatedSuccessfully({
+ entity,
+ onConfirm,
+}: {
+ entity: Entity;
+ onConfirm: () => void;
+}): VNode {
+ return (
+ <CreatedSuccessfully onConfirm={onConfirm}>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">ID</label>
</div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Business Name</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.name} />
- </p>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input class="input" readonly value={entity.id} />
+ </p>
+ </div>
</div>
</div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Access token</label>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Business Name</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input class="input" readonly value={entity.name} />
+ </p>
+ </div>
+ </div>
</div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- {entity.auth.method === 'external' && 'external'}
- {entity.auth.method === 'token' &&
- <input class="input" readonly value={entity.auth.token} />}
- </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Access token</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ {entity.auth.method === "external" && "external"}
+ {entity.auth.method === "token" && (
+ <input class="input" readonly value={entity.auth.token} />
+ )}
+ </p>
+ </div>
</div>
</div>
- </div>
- </CreatedSuccessfully>;
+ </CreatedSuccessfully>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
index 8e83b75ff..ed2f3f068 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
@@ -54,7 +54,7 @@ export default function Create({ onBack, onConfirm, forceId }: Props): VNode {
onBack={onBack}
forceId={forceId}
onCreate={(
- d: MerchantBackend.Instances.InstanceConfigurationMessage
+ d: MerchantBackend.Instances.InstanceConfigurationMessage,
) => {
return createInstance(d)
.then(() => {
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
index 8f2829112..546f34f3a 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { StateUpdater, useEffect, useState } from "preact/hooks";
@@ -34,57 +34,96 @@ interface Props {
setInstanceName: (s: string) => void;
}
-export function CardTable({ instances, onCreate, onUpdate, onPurge, setInstanceName, onDelete, selected }: Props): VNode {
+export function CardTable({
+ instances,
+ onCreate,
+ onUpdate,
+ onPurge,
+ setInstanceName,
+ onDelete,
+ selected,
+}: Props): VNode {
const [actionQueue, actionQueueHandler] = useState<Actions[]>([]);
- const [rowSelection, rowSelectionHandler] = useState<string[]>([])
+ const [rowSelection, rowSelectionHandler] = useState<string[]>([]);
useEffect(() => {
- if (actionQueue.length > 0 && !selected && actionQueue[0].type == 'DELETE') {
- onDelete(actionQueue[0].element)
- actionQueueHandler(actionQueue.slice(1))
+ if (
+ actionQueue.length > 0 &&
+ !selected &&
+ actionQueue[0].type == "DELETE"
+ ) {
+ onDelete(actionQueue[0].element);
+ actionQueueHandler(actionQueue.slice(1));
}
- }, [actionQueue, selected, onDelete])
+ }, [actionQueue, selected, onDelete]);
useEffect(() => {
- if (actionQueue.length > 0 && !selected && actionQueue[0].type == 'UPDATE') {
- onUpdate(actionQueue[0].element.id)
- actionQueueHandler(actionQueue.slice(1))
+ if (
+ actionQueue.length > 0 &&
+ !selected &&
+ actionQueue[0].type == "UPDATE"
+ ) {
+ onUpdate(actionQueue[0].element.id);
+ actionQueueHandler(actionQueue.slice(1));
}
- }, [actionQueue, selected, onUpdate])
-
- const i18n = useTranslator()
+ }, [actionQueue, selected, onUpdate]);
- return <div class="card has-table">
- <header class="card-header">
- <p class="card-header-title"><span class="icon"><i class="mdi mdi-desktop-mac" /></span><Translate>Instances</Translate></p>
+ const i18n = useTranslator();
- <div class="card-header-icon" aria-label="more options">
+ return (
+ <div class="card has-table">
+ <header class="card-header">
+ <p class="card-header-title">
+ <span class="icon">
+ <i class="mdi mdi-desktop-mac" />
+ </span>
+ <Translate>Instances</Translate>
+ </p>
- <button class={rowSelection.length > 0 ? "button is-danger" : "is-hidden"}
- type="button" onClick={(): void => actionQueueHandler(buildActions(instances, rowSelection, 'DELETE'))} >
- <Translate>Delete</Translate>
- </button>
- </div>
- <div class="card-header-icon" aria-label="more options">
- <span class="has-tooltip-left" data-tooltip={i18n`add new instance`}>
- <button class="button is-info" type="button" onClick={onCreate}>
- <span class="icon is-small" ><i class="mdi mdi-plus mdi-36px" /></span>
+ <div class="card-header-icon" aria-label="more options">
+ <button
+ class={rowSelection.length > 0 ? "button is-danger" : "is-hidden"}
+ type="button"
+ onClick={(): void =>
+ actionQueueHandler(
+ buildActions(instances, rowSelection, "DELETE"),
+ )
+ }
+ >
+ <Translate>Delete</Translate>
</button>
- </span>
- </div>
-
- </header>
- <div class="card-content">
- <div class="b-table has-pagination">
- <div class="table-wrapper has-mobile-cards">
- {instances.length > 0 ?
- <Table instances={instances} onPurge={onPurge} onUpdate={onUpdate} setInstanceName={setInstanceName} onDelete={onDelete} rowSelection={rowSelection} rowSelectionHandler={rowSelectionHandler} /> :
- <EmptyTable />
- }
+ </div>
+ <div class="card-header-icon" aria-label="more options">
+ <span class="has-tooltip-left" data-tooltip={i18n`add new instance`}>
+ <button class="button is-info" type="button" onClick={onCreate}>
+ <span class="icon is-small">
+ <i class="mdi mdi-plus mdi-36px" />
+ </span>
+ </button>
+ </span>
+ </div>
+ </header>
+ <div class="card-content">
+ <div class="b-table has-pagination">
+ <div class="table-wrapper has-mobile-cards">
+ {instances.length > 0 ? (
+ <Table
+ instances={instances}
+ onPurge={onPurge}
+ onUpdate={onUpdate}
+ setInstanceName={setInstanceName}
+ onDelete={onDelete}
+ rowSelection={rowSelection}
+ rowSelectionHandler={rowSelectionHandler}
+ />
+ ) : (
+ <EmptyTable />
+ )}
+ </div>
</div>
</div>
</div>
- </div>
+ );
}
interface TableProps {
rowSelection: string[];
@@ -93,14 +132,23 @@ interface TableProps {
onDelete: (id: MerchantBackend.Instances.Instance) => void;
onPurge: (id: MerchantBackend.Instances.Instance) => void;
rowSelectionHandler: StateUpdater<string[]>;
- setInstanceName: (s:string) => void;
+ setInstanceName: (s: string) => void;
}
function toggleSelected<T>(id: T): (prev: T[]) => T[] {
- return (prev: T[]): T[] => prev.indexOf(id) == -1 ? [...prev, id] : prev.filter(e => e != id)
+ return (prev: T[]): T[] =>
+ prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id);
}
-function Table({ rowSelection, rowSelectionHandler, setInstanceName, instances, onUpdate, onDelete, onPurge }: TableProps): VNode {
+function Table({
+ rowSelection,
+ rowSelectionHandler,
+ setInstanceName,
+ instances,
+ onUpdate,
+ onDelete,
+ onPurge,
+}: TableProps): VNode {
return (
<div class="table-container">
<table class="table is-fullwidth is-striped is-hoverable is-fullwidth">
@@ -108,75 +156,127 @@ function Table({ rowSelection, rowSelectionHandler, setInstanceName, instances,
<tr>
<th class="is-checkbox-cell">
<label class="b-checkbox checkbox">
- <input type="checkbox" checked={rowSelection.length === instances.length} onClick={(): void => rowSelectionHandler(rowSelection.length === instances.length ? [] : instances.map(i => i.id))} />
+ <input
+ type="checkbox"
+ checked={rowSelection.length === instances.length}
+ onClick={(): void =>
+ rowSelectionHandler(
+ rowSelection.length === instances.length
+ ? []
+ : instances.map((i) => i.id),
+ )
+ }
+ />
<span class="check" />
</label>
</th>
- <th><Translate>ID</Translate></th>
- <th><Translate>Name</Translate></th>
+ <th>
+ <Translate>ID</Translate>
+ </th>
+ <th>
+ <Translate>Name</Translate>
+ </th>
<th />
</tr>
</thead>
<tbody>
- {instances.map(i => {
- return <tr key={i.id}>
- <td class="is-checkbox-cell">
- <label class="b-checkbox checkbox">
- <input type="checkbox" checked={rowSelection.indexOf(i.id) != -1} onClick={(): void => rowSelectionHandler(toggleSelected(i.id))} />
- <span class="check" />
- </label>
- </td>
- <td><a href={`#/orders?instance=${i.id}`} onClick={(e) => {
- setInstanceName(i.id);
- }}>{i.id}</a></td>
- <td >{i.name}</td>
- <td class="is-actions-cell right-sticky">
- <div class="buttons is-right">
- <button class="button is-small is-success jb-modal" type="button" onClick={(): void => onUpdate(i.id)}>
- <Translate>Edit</Translate>
- </button>
- {!i.deleted &&
- <button class="button is-small is-danger jb-modal is-outlined" type="button" onClick={(): void => onDelete(i)}>
- <Translate>Delete</Translate>
- </button>
- }
- {i.deleted &&
- <button class="button is-small is-danger jb-modal" type="button" onClick={(): void => onPurge(i)}>
- <Translate>Purge</Translate>
- </button>
- }
- </div>
- </td>
- </tr>
+ {instances.map((i) => {
+ return (
+ <tr key={i.id}>
+ <td class="is-checkbox-cell">
+ <label class="b-checkbox checkbox">
+ <input
+ type="checkbox"
+ checked={rowSelection.indexOf(i.id) != -1}
+ onClick={(): void =>
+ rowSelectionHandler(toggleSelected(i.id))
+ }
+ />
+ <span class="check" />
+ </label>
+ </td>
+ <td>
+ <a
+ href={`#/orders?instance=${i.id}`}
+ onClick={(e) => {
+ setInstanceName(i.id);
+ }}
+ >
+ {i.id}
+ </a>
+ </td>
+ <td>{i.name}</td>
+ <td class="is-actions-cell right-sticky">
+ <div class="buttons is-right">
+ <button
+ class="button is-small is-success jb-modal"
+ type="button"
+ onClick={(): void => onUpdate(i.id)}
+ >
+ <Translate>Edit</Translate>
+ </button>
+ {!i.deleted && (
+ <button
+ class="button is-small is-danger jb-modal is-outlined"
+ type="button"
+ onClick={(): void => onDelete(i)}
+ >
+ <Translate>Delete</Translate>
+ </button>
+ )}
+ {i.deleted && (
+ <button
+ class="button is-small is-danger jb-modal"
+ type="button"
+ onClick={(): void => onPurge(i)}
+ >
+ <Translate>Purge</Translate>
+ </button>
+ )}
+ </div>
+ </td>
+ </tr>
+ );
})}
-
</tbody>
</table>
</div>
- )
+ );
}
function EmptyTable(): VNode {
- return <div class="content has-text-grey has-text-centered">
- <p>
- <span class="icon is-large"><i class="mdi mdi-emoticon-sad mdi-48px" /></span>
- </p>
- <p><Translate>There is no instances yet, add more pressing the + sign</Translate></p>
- </div>
+ return (
+ <div class="content has-text-grey has-text-centered">
+ <p>
+ <span class="icon is-large">
+ <i class="mdi mdi-emoticon-sad mdi-48px" />
+ </span>
+ </p>
+ <p>
+ <Translate>
+ There is no instances yet, add more pressing the + sign
+ </Translate>
+ </p>
+ </div>
+ );
}
-
interface Actions {
element: MerchantBackend.Instances.Instance;
- type: 'DELETE' | 'UPDATE';
+ type: "DELETE" | "UPDATE";
}
function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
return value !== null && value !== undefined;
}
-function buildActions(instances: MerchantBackend.Instances.Instance[], selected: string[], action: 'DELETE'): Actions[] {
- return selected.map(id => instances.find(i => i.id === id))
+function buildActions(
+ instances: MerchantBackend.Instances.Instance[],
+ selected: string[],
+ action: "DELETE",
+): Actions[] {
+ return selected
+ .map((id) => instances.find((i) => i.id === id))
.filter(notEmpty)
- .map(id => ({ element: id, type: action }))
+ .map((id) => ({ element: id, type: action }));
}
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
index 87d68232a..e0f5d5430 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
@@ -15,68 +15,76 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h } from 'preact';
+import { h } from "preact";
import { View } from "./View.js";
-
export default {
- title: 'Pages/Instance/List',
+ title: "Pages/Instance/List",
component: View,
argTypes: {
- onSelect: { action: 'onSelect' },
+ onSelect: { action: "onSelect" },
},
};
export const Empty = (a: any) => <View {...a} />;
Empty.args = {
- instances: []
-}
+ instances: [],
+};
export const WithDefaultInstance = (a: any) => <View {...a} />;
WithDefaultInstance.args = {
- instances: [{
- id: 'default',
- name: 'the default instance',
- merchant_pub: 'abcdef',
- payment_targets: []
- }]
-}
+ instances: [
+ {
+ id: "default",
+ name: "the default instance",
+ merchant_pub: "abcdef",
+ payment_targets: [],
+ },
+ ],
+};
export const WithFiveInstance = (a: any) => <View {...a} />;
WithFiveInstance.args = {
- instances: [{
- id: 'first',
- name: 'the first instance',
- merchant_pub: 'abcdefgh',
- payment_targets: ['asd']
- }, {
- id: 'second',
- name: 'the second instance',
- merchant_pub: 'zxczxcz',
- payment_targets: ['asd']
- }, {
- id: 'third',
- name: 'the third instance',
- merchant_pub: 'QWEQWEWQE',
- payment_targets: ['asd']
- }, {
- id: 'other',
- name: 'the other instance',
- merchant_pub: 'FHJHGJGHJ',
- payment_targets: ['asd']
- }, {
- id: 'another',
- name: 'the another instance',
- merchant_pub: 'abcd3423423efgh',
- payment_targets: ['asd']
- }, {
- id: 'last',
- name: 'last instance',
- merchant_pub: 'zxcvvbnm',
- payment_targets: ['pay-to', 'asd']
- }]
-}
+ instances: [
+ {
+ id: "first",
+ name: "the first instance",
+ merchant_pub: "abcdefgh",
+ payment_targets: ["asd"],
+ },
+ {
+ id: "second",
+ name: "the second instance",
+ merchant_pub: "zxczxcz",
+ payment_targets: ["asd"],
+ },
+ {
+ id: "third",
+ name: "the third instance",
+ merchant_pub: "QWEQWEWQE",
+ payment_targets: ["asd"],
+ },
+ {
+ id: "other",
+ name: "the other instance",
+ merchant_pub: "FHJHGJGHJ",
+ payment_targets: ["asd"],
+ },
+ {
+ id: "another",
+ name: "the another instance",
+ merchant_pub: "abcd3423423efgh",
+ payment_targets: ["asd"],
+ },
+ {
+ id: "last",
+ name: "last instance",
+ merchant_pub: "zxcvvbnm",
+ payment_targets: ["pay-to", "asd"],
+ },
+ ],
+};
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
index 2af9dea71..5180c671c 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
@@ -15,14 +15,14 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { MerchantBackend } from "../../../declaration.js";
import { CardTable as CardTableActive } from "./TableActive.js";
-import { useState } from 'preact/hooks';
+import { useState } from "preact/hooks";
import { Translate, useTranslator } from "../../../i18n/index.js";
interface Props {
@@ -35,46 +35,78 @@ interface Props {
setInstanceName: (s: string) => void;
}
-export function View({ instances, onCreate, onDelete, onPurge, onUpdate, setInstanceName, selected }: Props): VNode {
+export function View({
+ instances,
+ onCreate,
+ onDelete,
+ onPurge,
+ onUpdate,
+ setInstanceName,
+ selected,
+}: Props): VNode {
const [show, setShow] = useState<"active" | "deleted" | null>("active");
- const showIsActive = show === 'active' ? "is-active" : ''
- const showIsDeleted = show === 'deleted' ? "is-active" : ''
- const showAll = show === null ? "is-active" : ''
- const i18n = useTranslator()
+ const showIsActive = show === "active" ? "is-active" : "";
+ const showIsDeleted = show === "deleted" ? "is-active" : "";
+ const showAll = show === null ? "is-active" : "";
+ const i18n = useTranslator();
- const showingInstances = showIsDeleted ?
- instances.filter(i => i.deleted) : (showIsActive ?
- instances.filter(i => !i.deleted) :
- instances)
-
- return <div id="app">
+ const showingInstances = showIsDeleted
+ ? instances.filter((i) => i.deleted)
+ : showIsActive
+ ? instances.filter((i) => !i.deleted)
+ : instances;
- <section class="section is-main-section">
- <div class="columns">
- <div class="column is-two-thirds">
- <div class="tabs" style={{ overflow: 'inherit' }}>
- <ul>
- <li class={showIsActive}>
- <div class="has-tooltip-right" data-tooltip={i18n`Only show active instances`}>
- <a onClick={() => setShow("active")}><Translate>Active</Translate></a>
- </div>
- </li>
- <li class={showIsDeleted}>
- <div class="has-tooltip-right" data-tooltip={i18n`Only show deleted instances`}>
- <a onClick={() => setShow("deleted")}><Translate>Deleted</Translate></a>
- </div>
- </li>
- <li class={showAll}>
- <div class="has-tooltip-right" data-tooltip={i18n`Show all instances`}>
- <a onClick={() => setShow(null)}><Translate>All</Translate></a>
- </div>
- </li>
- </ul>
+ return (
+ <div id="app">
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column is-two-thirds">
+ <div class="tabs" style={{ overflow: "inherit" }}>
+ <ul>
+ <li class={showIsActive}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`Only show active instances`}
+ >
+ <a onClick={() => setShow("active")}>
+ <Translate>Active</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={showIsDeleted}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`Only show deleted instances`}
+ >
+ <a onClick={() => setShow("deleted")}>
+ <Translate>Deleted</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={showAll}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`Show all instances`}
+ >
+ <a onClick={() => setShow(null)}>
+ <Translate>All</Translate>
+ </a>
+ </div>
+ </li>
+ </ul>
+ </div>
</div>
</div>
- </div>
- <CardTableActive instances={showingInstances} onDelete={onDelete} onPurge={onPurge} setInstanceName={setInstanceName} onUpdate={onUpdate} selected={selected} onCreate={onCreate} />
- </section>
-
- </div >
+ <CardTableActive
+ instances={showingInstances}
+ onDelete={onDelete}
+ onPurge={onPurge}
+ setInstanceName={setInstanceName}
+ onUpdate={onUpdate}
+ selected={selected}
+ onCreate={onCreate}
+ />
+ </section>
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/index.stories.ts b/packages/merchant-backoffice-ui/src/paths/index.stories.ts
index b3811fd4f..ecf28445b 100644
--- a/packages/merchant-backoffice-ui/src/paths/index.stories.ts
+++ b/packages/merchant-backoffice-ui/src/paths/index.stories.ts
@@ -1,2 +1,2 @@
export * as a1 from "./admin/create/Create.stories.js";
-export * as a2 from "./instance/details/Details.stories.js"; \ No newline at end of file
+export * as a2 from "./instance/details/Details.stories.js";
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
index 01e7771cf..59aa7a1d2 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
@@ -33,55 +33,57 @@ interface Props {
selected: MerchantBackend.Instances.QueryInstancesResponse;
}
-function convert(from: MerchantBackend.Instances.QueryInstancesResponse): Entity {
- const { accounts, ...rest } = from
- const payto_uris = accounts.filter(a => a.active).map(a => a.payto_uri)
+function convert(
+ from: MerchantBackend.Instances.QueryInstancesResponse,
+): Entity {
+ const { accounts, ...rest } = from;
+ const payto_uris = accounts.filter((a) => a.active).map((a) => a.payto_uri);
const defaults = {
default_wire_fee_amortization: 1,
default_pay_delay: { d_us: 1000 * 60 * 60 }, //one hour
default_wire_transfer_delay: { d_us: 1000 * 60 * 60 * 2 }, //two hours
- }
+ };
return { ...defaults, ...rest, payto_uris };
}
export function DetailPage({ selected }: Props): VNode {
- const [value, valueHandler] = useState<Partial<Entity>>(convert(selected))
+ const [value, valueHandler] = useState<Partial<Entity>>(convert(selected));
+
+ const i18n = useTranslator();
- const i18n = useTranslator()
-
- return <div>
- <section class="hero is-hero-bar">
- <div class="hero-body">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <h1 class="title">
- Here goes the instance description
- </h1>
+ return (
+ <div>
+ <section class="hero is-hero-bar">
+ <div class="hero-body">
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <h1 class="title">Here goes the instance description</h1>
+ </div>
+ </div>
+ <div class="level-right" style="display: none;">
+ <div class="level-item" />
</div>
- </div>
- <div class="level-right" style="display: none;">
- <div class="level-item" />
</div>
</div>
- </div>
- </section>
-
- <section class="section is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-6">
- <FormProvider<Entity> object={value} valueHandler={valueHandler} >
+ </section>
- <Input<Entity> name="name" readonly label={i18n`Name`} />
- <Input<Entity> name="payto_uris" readonly label={i18n`Account address`} />
-
- </FormProvider>
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-6">
+ <FormProvider<Entity> object={value} valueHandler={valueHandler}>
+ <Input<Entity> name="name" readonly label={i18n`Name`} />
+ <Input<Entity>
+ name="payto_uris"
+ readonly
+ label={i18n`Account address`}
+ />
+ </FormProvider>
+ </div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
-
- </div>
-
-} \ No newline at end of file
+ </section>
+ </div>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
index f7772895f..9ac1c4381 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
@@ -33,7 +33,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
index 09b692e00..49b64262b 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
@@ -30,36 +30,44 @@ interface Props {
onDelete: () => void;
}
-export default function Detail({ onUpdate, onLoadError, onUnauthorized, onDelete, onNotFound }: Props): VNode {
- const { id } = useInstanceContext()
- const result = useInstanceDetails()
- const [deleting, setDeleting] = useState<boolean>(false)
+export default function Detail({
+ onUpdate,
+ onLoadError,
+ onUnauthorized,
+ onDelete,
+ onNotFound,
+}: Props): VNode {
+ const { id } = useInstanceContext();
+ const result = useInstanceDetails();
+ const [deleting, setDeleting] = useState<boolean>(false);
- const { deleteInstance } = useInstanceAPI()
+ const { deleteInstance } = useInstanceAPI();
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
- return <Fragment>
- <DetailPage
- selected={result.data}
- onUpdate={onUpdate}
- onDelete={() => setDeleting(true)}
- />
- {deleting && <DeleteModal
- element={{ name: result.data.name, id }}
- onCancel={() => setDeleting(false)}
- onConfirm={async (): Promise<void> => {
- try {
- await deleteInstance()
- onDelete()
- } catch (error) {
- }
- setDeleting(false)
- }}
- />}
-
- </Fragment>
-} \ No newline at end of file
+ return (
+ <Fragment>
+ <DetailPage
+ selected={result.data}
+ onUpdate={onUpdate}
+ onDelete={() => setDeleting(true)}
+ />
+ {deleting && (
+ <DeleteModal
+ element={{ name: result.data.name, id }}
+ onCancel={() => setDeleting(false)}
+ onConfirm={async (): Promise<void> => {
+ try {
+ await deleteInstance();
+ onDelete();
+ } catch (error) {}
+ setDeleting(false);
+ }}
+ />
+ )}
+ </Fragment>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
index 4ce2eb43d..5f8dbbdd9 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
@@ -33,7 +33,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
index 379c5eab5..145df717d 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
@@ -166,7 +166,7 @@ export function CreatePage({
: value.payments.wire_transfer_deadline &&
isBefore(
value.payments.wire_transfer_deadline,
- value.payments.refund_deadline
+ value.payments.refund_deadline,
)
? i18n`wire transfer deadline cannot be before refund deadline`
: undefined,
@@ -177,7 +177,7 @@ export function CreatePage({
: value.payments.wire_transfer_deadline &&
isBefore(
value.payments.wire_transfer_deadline,
- value.payments.pay_deadline
+ value.payments.pay_deadline,
)
? i18n`wire transfer deadline cannot be before pay deadline`
: undefined,
@@ -189,7 +189,7 @@ export function CreatePage({
? i18n`should have a refund deadline`
: !isAfter(
value.payments.refund_deadline,
- value.payments.auto_refund_deadline
+ value.payments.auto_refund_deadline,
)
? i18n`auto refund cannot be after refund deadline`
: undefined,
@@ -203,7 +203,7 @@ export function CreatePage({
}),
};
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const submit = (): void => {
@@ -225,7 +225,7 @@ export function CreatePage({
wire_transfer_deadline: value.payments.wire_transfer_deadline
? {
t_s: Math.floor(
- value.payments.wire_transfer_deadline.getTime() / 1000
+ value.payments.wire_transfer_deadline.getTime() / 1000,
),
}
: undefined,
@@ -237,7 +237,7 @@ export function CreatePage({
auto_refund: value.payments.auto_refund_deadline
? {
d_us: Math.floor(
- value.payments.auto_refund_deadline.getTime() * 1000
+ value.payments.auto_refund_deadline.getTime() * 1000,
),
}
: undefined,
@@ -264,7 +264,7 @@ export function CreatePage({
const addProductToTheInventoryList = (
product: MerchantBackend.Products.ProductDetail & WithId,
- quantity: number
+ quantity: number,
) => {
valueHandler((v) => {
const inventoryProducts = { ...v.inventoryProducts };
@@ -332,13 +332,13 @@ export function CreatePage({
const discountOrRise = rate(
value.pricing?.order_price || `${config.currency}:0`,
- totalAsString
+ totalAsString,
);
const minAgeByProducts = allProducts.reduce(
(cur, prev) =>
!prev.minimum_age || cur > prev.minimum_age ? cur : prev.minimum_age,
- 0
+ 0,
);
return (
<div>
@@ -415,7 +415,7 @@ export function CreatePage({
discountOrRise > 0 &&
(discountOrRise < 1
? `discount of %${Math.round(
- (1 - discountOrRise) * 100
+ (1 - discountOrRise) * 100,
)}`
: `rise of %${Math.round((discountOrRise - 1) * 100)}`)
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
index bd63ca371..6d3ac311a 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
@@ -26,64 +26,89 @@ interface Props {
onCreateAnother?: () => void;
}
-export function OrderCreatedSuccessfully({ entity, onConfirm, onCreateAnother }: Props): VNode {
- const { getPaymentURL } = useOrderAPI()
- const [url, setURL] = useState<string | undefined>(undefined)
+export function OrderCreatedSuccessfully({
+ entity,
+ onConfirm,
+ onCreateAnother,
+}: Props): VNode {
+ const { getPaymentURL } = useOrderAPI();
+ const [url, setURL] = useState<string | undefined>(undefined);
useEffect(() => {
- getPaymentURL(entity.response.order_id).then(response => {
- setURL(response.data)
- })
- }, [getPaymentURL, entity.response.order_id])
+ getPaymentURL(entity.response.order_id).then((response) => {
+ setURL(response.data);
+ });
+ }, [getPaymentURL, entity.response.order_id]);
- return <CreatedSuccessfully onConfirm={onConfirm} onCreateAnother={onCreateAnother}>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label"><Translate>Amount</Translate></label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.request.order.amount} />
- </p>
+ return (
+ <CreatedSuccessfully
+ onConfirm={onConfirm}
+ onCreateAnother={onCreateAnother}
+ >
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ <Translate>Amount</Translate>
+ </label>
</div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label"><Translate>Summary</Translate></label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.request.order.summary} />
- </p>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input
+ class="input"
+ readonly
+ value={entity.request.order.amount}
+ />
+ </p>
+ </div>
</div>
</div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label"><Translate>Order ID</Translate></label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.response.order_id} />
- </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ <Translate>Summary</Translate>
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input
+ class="input"
+ readonly
+ value={entity.request.order.summary}
+ />
+ </p>
+ </div>
</div>
</div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label"><Translate>Payment URL</Translate></label>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ <Translate>Order ID</Translate>
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input class="input" readonly value={entity.response.order_id} />
+ </p>
+ </div>
+ </div>
</div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={url} />
- </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ <Translate>Payment URL</Translate>
+ </label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input class="input" readonly value={url} />
+ </p>
+ </div>
</div>
</div>
- </div>
- </CreatedSuccessfully>;
+ </CreatedSuccessfully>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
index feb75aa25..95232da92 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { Fragment, h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { Fragment, h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { Loading } from "../../../../components/exception/loading.js";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend } from "../../../../declaration.js";
@@ -33,9 +33,9 @@ import { CreatePage } from "./CreatePage.js";
import { OrderCreatedSuccessfully } from "./OrderCreatedSuccessfully.js";
export type Entity = {
- request: MerchantBackend.Orders.PostOrderRequest,
- response: MerchantBackend.Orders.PostOrderResponse
-}
+ request: MerchantBackend.Orders.PostOrderRequest;
+ response: MerchantBackend.Orders.PostOrderResponse;
+};
interface Props {
onBack?: () => void;
onConfirm: () => void;
@@ -43,40 +43,53 @@ interface Props {
onNotFound: () => VNode;
onLoadError: (error: HttpError) => VNode;
}
-export default function OrderCreate({ onConfirm, onBack, onLoadError, onNotFound, onUnauthorized }: Props): VNode {
- const { createOrder } = useOrderAPI()
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
+export default function OrderCreate({
+ onConfirm,
+ onBack,
+ onLoadError,
+ onNotFound,
+ onUnauthorized,
+}: Props): VNode {
+ const { createOrder } = useOrderAPI();
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
- const detailsResult = useInstanceDetails()
- const inventoryResult = useInstanceProducts()
+ const detailsResult = useInstanceDetails();
+ const inventoryResult = useInstanceProducts();
- if (detailsResult.clientError && detailsResult.isUnauthorized) return onUnauthorized()
- if (detailsResult.clientError && detailsResult.isNotfound) return onNotFound()
- if (detailsResult.loading) return <Loading />
- if (!detailsResult.ok) return onLoadError(detailsResult)
+ if (detailsResult.clientError && detailsResult.isUnauthorized)
+ return onUnauthorized();
+ if (detailsResult.clientError && detailsResult.isNotfound)
+ return onNotFound();
+ if (detailsResult.loading) return <Loading />;
+ if (!detailsResult.ok) return onLoadError(detailsResult);
- if (inventoryResult.clientError && inventoryResult.isUnauthorized) return onUnauthorized()
- if (inventoryResult.clientError && inventoryResult.isNotfound) return onNotFound()
- if (inventoryResult.loading) return <Loading />
- if (!inventoryResult.ok) return onLoadError(inventoryResult)
+ if (inventoryResult.clientError && inventoryResult.isUnauthorized)
+ return onUnauthorized();
+ if (inventoryResult.clientError && inventoryResult.isNotfound)
+ return onNotFound();
+ if (inventoryResult.loading) return <Loading />;
+ if (!inventoryResult.ok) return onLoadError(inventoryResult);
- return <Fragment>
-
- <NotificationCard notification={notif} />
+ return (
+ <Fragment>
+ <NotificationCard notification={notif} />
- <CreatePage
- onBack={onBack}
- onCreate={(request: MerchantBackend.Orders.PostOrderRequest) => {
- createOrder(request).then(onConfirm).catch((error) => {
- setNotif({
- message: 'could not create order',
- type: "ERROR",
- description: error.message
- })
- })
- }}
- instanceConfig={detailsResult.data}
- instanceInventory={inventoryResult.data}
+ <CreatePage
+ onBack={onBack}
+ onCreate={(request: MerchantBackend.Orders.PostOrderRequest) => {
+ createOrder(request)
+ .then(onConfirm)
+ .catch((error) => {
+ setNotif({
+ message: "could not create order",
+ type: "ERROR",
+ description: error.message,
+ });
+ });
+ }}
+ instanceConfig={detailsResult.data}
+ instanceInventory={inventoryResult.data}
/>
- </Fragment>
+ </Fragment>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
index 878ee7bde..e430ede56 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
@@ -35,7 +35,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
index 2074eeb32..e8927dd70 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
@@ -248,7 +248,7 @@ function ClaimedPage({
</b>{" "}
{format(
new Date(order.contract_terms.timestamp.t_s * 1000),
- "yyyy-MM-dd HH:mm:ss"
+ "yyyy-MM-dd HH:mm:ss",
)}
</p>
</div>
@@ -519,7 +519,7 @@ function PaidPage({
<p>
{format(
new Date(order.contract_terms.timestamp.t_s * 1000),
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)}
</p>
</div>
@@ -669,7 +669,7 @@ function UnpaidPage({
? "never"
: format(
new Date(order.creation_time.t_s * 1000),
- "yyyy-MM-dd HH:mm:ss"
+ "yyyy-MM-dd HH:mm:ss",
)}
</p>
</div>
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
index dbf1b685a..4633688ba 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
@@ -32,36 +32,49 @@ export interface Props {
onLoadError: (error: HttpError) => VNode;
}
-export default function Update({ oid, onBack, onLoadError, onNotFound, onUnauthorized }: Props): VNode {
+export default function Update({
+ oid,
+ onBack,
+ onLoadError,
+ onNotFound,
+ onUnauthorized,
+}: Props): VNode {
const { refundOrder } = useOrderAPI();
- const result = useOrderDetails(oid)
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
+ const result = useOrderDetails(oid);
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
- const i18n = useTranslator()
+ const i18n = useTranslator();
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
- return <Fragment>
+ return (
+ <Fragment>
+ <NotificationCard notification={notif} />
- <NotificationCard notification={notif} />
-
- <DetailPage
- onBack={onBack}
- id={oid}
- onRefund={(id, value) => refundOrder(id, value)
- .then(() => setNotif({
- message: i18n`refund created successfully`,
- type: "SUCCESS"
- })).catch((error) => setNotif({
- message: i18n`could not create the refund`,
- type: "ERROR",
- description: error.message
- }))
- }
- selected={result.data}
- />
- </Fragment>
-} \ No newline at end of file
+ <DetailPage
+ onBack={onBack}
+ id={oid}
+ onRefund={(id, value) =>
+ refundOrder(id, value)
+ .then(() =>
+ setNotif({
+ message: i18n`refund created successfully`,
+ type: "SUCCESS",
+ }),
+ )
+ .catch((error) =>
+ setNotif({
+ message: i18n`could not create the refund`,
+ type: "ERROR",
+ description: error.message,
+ }),
+ )
+ }
+ selected={result.data}
+ />
+ </Fragment>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
index 8cddd7fd6..156c577f4 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
@@ -43,7 +43,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
index 60be23c21..bca90e352 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
@@ -15,33 +15,33 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { format } from 'date-fns';
-import { h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { format } from "date-fns";
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { DatePicker } from "../../../../components/picker/DatePicker.js";
import { MerchantBackend, WithId } from "../../../../declaration.js";
-import { Translate, useTranslator } from '../../../../i18n/index.js';
+import { Translate, useTranslator } from "../../../../i18n/index.js";
import { CardTable } from "./Table.js";
export interface ListPageProps {
- errorOrderId: string | undefined,
+ errorOrderId: string | undefined;
- onShowAll: () => void,
- onShowPaid: () => void,
- onShowRefunded: () => void,
- onShowNotWired: () => void,
+ onShowAll: () => void;
+ onShowPaid: () => void;
+ onShowRefunded: () => void;
+ onShowNotWired: () => void;
onCopyURL: (id: string) => void;
- isAllActive: string,
- isPaidActive: string,
- isRefundedActive: string,
- isNotWiredActive: string,
+ isAllActive: string;
+ isPaidActive: string;
+ isRefundedActive: string;
+ isNotWiredActive: string;
- jumpToDate?: Date,
- onSelectDate: (date?: Date) => void,
+ jumpToDate?: Date;
+ onSelectDate: (date?: Date) => void;
orders: (MerchantBackend.Orders.OrderHistoryEntry & WithId)[];
onLoadMoreBefore?: () => void;
@@ -55,92 +55,168 @@ export interface ListPageProps {
onCreate: () => void;
}
-export function ListPage({ orders, errorOrderId, isAllActive, onSelectOrder, onRefundOrder, onSearchOrderById, jumpToDate, onCopyURL, onShowAll, onShowPaid, onShowRefunded, onShowNotWired, onSelectDate, isPaidActive, isRefundedActive, isNotWiredActive, onCreate }: ListPageProps): VNode {
+export function ListPage({
+ orders,
+ errorOrderId,
+ isAllActive,
+ onSelectOrder,
+ onRefundOrder,
+ onSearchOrderById,
+ jumpToDate,
+ onCopyURL,
+ onShowAll,
+ onShowPaid,
+ onShowRefunded,
+ onShowNotWired,
+ onSelectDate,
+ isPaidActive,
+ isRefundedActive,
+ isNotWiredActive,
+ onCreate,
+}: ListPageProps): VNode {
const i18n = useTranslator();
const dateTooltip = i18n`select date to show nearby orders`;
const [pickDate, setPickDate] = useState(false);
- const [orderId, setOrderId] = useState<string>('');
-
- return <section class="section is-main-section">
+ const [orderId, setOrderId] = useState<string>("");
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <div class="field has-addons">
- <div class="control">
- <input class={errorOrderId ? "input is-danger" : "input"} type="text" value={orderId} onChange={e => setOrderId(e.currentTarget.value)} placeholder={i18n`order id`} />
- {errorOrderId && <p class="help is-danger">{errorOrderId}</p>}
+ return (
+ <section class="section is-main-section">
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <div class="field has-addons">
+ <div class="control">
+ <input
+ class={errorOrderId ? "input is-danger" : "input"}
+ type="text"
+ value={orderId}
+ onChange={(e) => setOrderId(e.currentTarget.value)}
+ placeholder={i18n`order id`}
+ />
+ {errorOrderId && <p class="help is-danger">{errorOrderId}</p>}
+ </div>
+ <span
+ class="has-tooltip-bottom"
+ data-tooltip={i18n`jump to order with the given order ID`}
+ >
+ <button
+ class="button"
+ onClick={(e) => onSearchOrderById(orderId)}
+ >
+ <span class="icon">
+ <i class="mdi mdi-arrow-right" />
+ </span>
+ </button>
+ </span>
</div>
- <span class="has-tooltip-bottom" data-tooltip={i18n`jump to order with the given order ID`}>
- <button class="button" onClick={(e) => onSearchOrderById(orderId)}>
- <span class="icon"><i class="mdi mdi-arrow-right" /></span>
- </button>
- </span>
</div>
</div>
</div>
- </div>
- <div class="columns">
- <div class="column is-two-thirds">
- <div class="tabs" style={{overflow:'inherit'}}>
- <ul>
- <li class={isAllActive}>
- <div class="has-tooltip-right" data-tooltip={i18n`remove all filters`}>
- <a onClick={onShowAll}><Translate>All</Translate></a>
- </div>
- </li>
- <li class={isPaidActive}>
- <div class="has-tooltip-right" data-tooltip={i18n`only show paid orders`}>
- <a onClick={onShowPaid}><Translate>Paid</Translate></a>
- </div>
- </li>
- <li class={isRefundedActive}>
- <div class="has-tooltip-right" data-tooltip={i18n`only show orders with refunds`}>
- <a onClick={onShowRefunded}><Translate>Refunded</Translate></a>
+ <div class="columns">
+ <div class="column is-two-thirds">
+ <div class="tabs" style={{ overflow: "inherit" }}>
+ <ul>
+ <li class={isAllActive}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`remove all filters`}
+ >
+ <a onClick={onShowAll}>
+ <Translate>All</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={isPaidActive}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`only show paid orders`}
+ >
+ <a onClick={onShowPaid}>
+ <Translate>Paid</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={isRefundedActive}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`only show orders with refunds`}
+ >
+ <a onClick={onShowRefunded}>
+ <Translate>Refunded</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={isNotWiredActive}>
+ <div
+ class="has-tooltip-left"
+ data-tooltip={i18n`only show orders where customers paid, but wire payments from payment provider are still pending`}
+ >
+ <a onClick={onShowNotWired}>
+ <Translate>Not wired</Translate>
+ </a>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="column ">
+ <div class="buttons is-right">
+ <div class="field has-addons">
+ {jumpToDate && (
+ <div class="control">
+ <a class="button" onClick={() => onSelectDate(undefined)}>
+ <span class="icon" data-tooltip={i18n`clear date filter`}>
+ <i class="mdi mdi-close" />
+ </span>
+ </a>
+ </div>
+ )}
+ <div class="control">
+ <span class="has-tooltip-top" data-tooltip={dateTooltip}>
+ <input
+ class="input"
+ type="text"
+ readonly
+ value={!jumpToDate ? "" : format(jumpToDate, "yyyy/MM/dd")}
+ placeholder={i18n`date (YYYY/MM/DD)`}
+ onClick={() => {
+ setPickDate(true);
+ }}
+ />
+ </span>
</div>
- </li>
- <li class={isNotWiredActive}>
- <div class="has-tooltip-left" data-tooltip={i18n`only show orders where customers paid, but wire payments from payment provider are still pending`}>
- <a onClick={onShowNotWired}><Translate>Not wired</Translate></a>
+ <div class="control">
+ <span class="has-tooltip-left" data-tooltip={dateTooltip}>
+ <a
+ class="button"
+ onClick={() => {
+ setPickDate(true);
+ }}
+ >
+ <span class="icon">
+ <i class="mdi mdi-calendar" />
+ </span>
+ </a>
+ </span>
</div>
- </li>
- </ul>
- </div>
- </div>
- <div class="column ">
- <div class="buttons is-right">
- <div class="field has-addons">
- {jumpToDate && <div class="control">
- <a class="button" onClick={() => onSelectDate(undefined)}>
- <span class="icon" data-tooltip={i18n`clear date filter`}><i class="mdi mdi-close" /></span>
- </a>
- </div>}
- <div class="control">
- <span class="has-tooltip-top" data-tooltip={dateTooltip}>
- <input class="input" type="text" readonly value={!jumpToDate ? '' : format(jumpToDate, 'yyyy/MM/dd')} placeholder={i18n`date (YYYY/MM/DD)`} onClick={() => { setPickDate(true); }} />
- </span>
- </div>
- <div class="control">
- <span class="has-tooltip-left" data-tooltip={dateTooltip}>
- <a class="button" onClick={() => { setPickDate(true); }}>
- <span class="icon"><i class="mdi mdi-calendar" /></span>
- </a>
- </span>
</div>
</div>
</div>
</div>
- </div>
- <DatePicker
- opened={pickDate}
- closeFunction={() => setPickDate(false)}
- dateReceiver={onSelectDate} />
+ <DatePicker
+ opened={pickDate}
+ closeFunction={() => setPickDate(false)}
+ dateReceiver={onSelectDate}
+ />
- <CardTable orders={orders}
- onCreate={onCreate}
- onCopyURL={onCopyURL}
- onSelect={onSelectOrder}
- onRefund={onRefundOrder} />
- </section>;
+ <CardTable
+ orders={orders}
+ onCreate={onCreate}
+ onCopyURL={onCopyURL}
+ onSelect={onSelectOrder}
+ onRefund={onRefundOrder}
+ />
+ </section>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
index 924d09682..a1ec8d291 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
@@ -173,7 +173,7 @@ function Table({
? "never"
: format(
new Date(i.timestamp.t_s * 1000),
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)}
</td>
<td
@@ -268,7 +268,7 @@ export function RefundModal({
.map((r) => r.amount)
.reduce(
(p, c) => Amounts.add(p, Amounts.parseOrThrow(c)).amount,
- Amounts.zeroOfCurrency(config.currency)
+ Amounts.zeroOfCurrency(config.currency),
);
const orderPrice =
order.order_status === "paid"
@@ -298,7 +298,7 @@ export function RefundModal({
: undefined,
};
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const validateAndConfirm = () => {
@@ -306,7 +306,7 @@ export function RefundModal({
if (!form.refund) return;
onConfirm({
refund: Amounts.stringify(
- Amounts.add(Amounts.parse(form.refund)!, totalRefunded).amount
+ Amounts.add(Amounts.parse(form.refund)!, totalRefunded).amount,
),
reason:
form.description === undefined
@@ -358,7 +358,7 @@ export function RefundModal({
? "never"
: format(
new Date(r.timestamp.t_s * 1000),
- "yyyy-MM-dd HH:mm:ss"
+ "yyyy-MM-dd HH:mm:ss",
)}
</td>
<td>{r.amount}</td>
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
index a033e7b3a..b5fe7611c 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
@@ -15,18 +15,23 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, Fragment } from 'preact';
-import { useState } from 'preact/hooks';
+import { h, VNode, Fragment } from "preact";
+import { useState } from "preact/hooks";
import { Loading } from "../../../../components/exception/loading.js";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend, WithId } from "../../../../declaration.js";
import { HttpError } from "../../../../hooks/backend.js";
-import { InstanceOrderFilter, useInstanceOrders, useOrderAPI, useOrderDetails } from "../../../../hooks/order.js";
-import { useTranslator } from '../../../../i18n/index.js';
+import {
+ InstanceOrderFilter,
+ useInstanceOrders,
+ useOrderAPI,
+ useOrderDetails,
+} from "../../../../hooks/order.js";
+import { useTranslator } from "../../../../i18n/index.js";
import { Notification } from "../../../../utils/types.js";
import { RefundModal } from "./Table.js";
import { ListPage } from "./ListPage.js";
@@ -39,107 +44,133 @@ interface Props {
onCreate: () => void;
}
-export default function ({ onUnauthorized, onLoadError, onCreate, onSelect, onNotFound }: Props): VNode {
- const [filter, setFilter] = useState<InstanceOrderFilter>({})
- const [orderToBeRefunded, setOrderToBeRefunded] = useState<MerchantBackend.Orders.OrderHistoryEntry | undefined>(undefined)
-
- const setNewDate = (date?: Date) => setFilter(prev => ({ ...prev, date }))
-
- const result = useInstanceOrders(filter, setNewDate)
- const { refundOrder, getPaymentURL } = useOrderAPI()
-
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
-
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
-
- const isPaidActive = filter.paid === 'yes' ? "is-active" : ''
- const isRefundedActive = filter.refunded === 'yes' ? "is-active" : ''
- const isNotWiredActive = filter.wired === 'no' ? "is-active" : ''
- const isAllActive = filter.paid === undefined && filter.refunded === undefined && filter.wired === undefined ? 'is-active' : ''
-
- const i18n = useTranslator()
- const [errorOrderId, setErrorOrderId] = useState<string | undefined>(undefined)
+export default function ({
+ onUnauthorized,
+ onLoadError,
+ onCreate,
+ onSelect,
+ onNotFound,
+}: Props): VNode {
+ const [filter, setFilter] = useState<InstanceOrderFilter>({});
+ const [orderToBeRefunded, setOrderToBeRefunded] = useState<
+ MerchantBackend.Orders.OrderHistoryEntry | undefined
+ >(undefined);
+
+ const setNewDate = (date?: Date) => setFilter((prev) => ({ ...prev, date }));
+
+ const result = useInstanceOrders(filter, setNewDate);
+ const { refundOrder, getPaymentURL } = useOrderAPI();
+
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
+
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
+
+ const isPaidActive = filter.paid === "yes" ? "is-active" : "";
+ const isRefundedActive = filter.refunded === "yes" ? "is-active" : "";
+ const isNotWiredActive = filter.wired === "no" ? "is-active" : "";
+ const isAllActive =
+ filter.paid === undefined &&
+ filter.refunded === undefined &&
+ filter.wired === undefined
+ ? "is-active"
+ : "";
+
+ const i18n = useTranslator();
+ const [errorOrderId, setErrorOrderId] = useState<string | undefined>(
+ undefined,
+ );
async function testIfOrderExistAndSelect(orderId: string) {
if (!orderId) {
- setErrorOrderId(i18n`Enter an order id`)
+ setErrorOrderId(i18n`Enter an order id`);
return;
}
try {
- await getPaymentURL(orderId)
- onSelect(orderId)
- setErrorOrderId(undefined)
+ await getPaymentURL(orderId);
+ onSelect(orderId);
+ setErrorOrderId(undefined);
} catch {
- setErrorOrderId(i18n`order not found`)
+ setErrorOrderId(i18n`order not found`);
}
}
- return <Fragment>
- <NotificationCard notification={notif} />
-
- <ListPage
- orders={result.data.orders.map(o => ({ ...o, id: o.order_id }))}
- onLoadMoreBefore={result.loadMorePrev} hasMoreBefore={!result.isReachingStart}
- onLoadMoreAfter={result.loadMore} hasMoreAfter={!result.isReachingEnd}
-
- onSelectOrder={(order) => onSelect(order.id)}
- onRefundOrder={(value) => setOrderToBeRefunded(value)}
-
- errorOrderId={errorOrderId}
- isAllActive={isAllActive}
- isNotWiredActive={isNotWiredActive}
- isPaidActive={isPaidActive}
- isRefundedActive={isRefundedActive}
- jumpToDate={filter.date}
- onCopyURL={(id) => getPaymentURL(id).then((resp) => copyToClipboard(resp.data))}
-
- onCreate={onCreate}
- onSearchOrderById={testIfOrderExistAndSelect}
- onSelectDate={setNewDate}
- onShowAll={() => setFilter({})}
- onShowPaid={() => setFilter({ paid: 'yes' })}
- onShowRefunded={() => setFilter({ refunded: 'yes' })}
- onShowNotWired={() => setFilter({ wired: 'no' })}
-
- />
-
- {orderToBeRefunded && <RefundModalForTable
- id={orderToBeRefunded.order_id}
- onCancel={() => setOrderToBeRefunded(undefined)}
- onConfirm={(value) => refundOrder(orderToBeRefunded.order_id, value)
- .then(() => setNotif({
- message: i18n`refund created successfully`,
- type: "SUCCESS"
- }))
- .catch((error) => setNotif({
- message: i18n`could not create the refund`,
- type: "ERROR",
- description: error.message
- }))
- .then(() => setOrderToBeRefunded(undefined))}
- onLoadError={(error) => {
- setNotif({
- message: i18n`could not create the refund`,
- type: "ERROR",
- description: error.message
- });
- setOrderToBeRefunded(undefined);
- return <div />;
- }}
- onUnauthorized={onUnauthorized}
- onNotFound={() => {
- setNotif({
- message: i18n`could not get the order to refund`,
- type: "ERROR",
- // description: error.message
- });
- setOrderToBeRefunded(undefined);
- return <div />;
- }} />}
- </Fragment>
+ return (
+ <Fragment>
+ <NotificationCard notification={notif} />
+
+ <ListPage
+ orders={result.data.orders.map((o) => ({ ...o, id: o.order_id }))}
+ onLoadMoreBefore={result.loadMorePrev}
+ hasMoreBefore={!result.isReachingStart}
+ onLoadMoreAfter={result.loadMore}
+ hasMoreAfter={!result.isReachingEnd}
+ onSelectOrder={(order) => onSelect(order.id)}
+ onRefundOrder={(value) => setOrderToBeRefunded(value)}
+ errorOrderId={errorOrderId}
+ isAllActive={isAllActive}
+ isNotWiredActive={isNotWiredActive}
+ isPaidActive={isPaidActive}
+ isRefundedActive={isRefundedActive}
+ jumpToDate={filter.date}
+ onCopyURL={(id) =>
+ getPaymentURL(id).then((resp) => copyToClipboard(resp.data))
+ }
+ onCreate={onCreate}
+ onSearchOrderById={testIfOrderExistAndSelect}
+ onSelectDate={setNewDate}
+ onShowAll={() => setFilter({})}
+ onShowPaid={() => setFilter({ paid: "yes" })}
+ onShowRefunded={() => setFilter({ refunded: "yes" })}
+ onShowNotWired={() => setFilter({ wired: "no" })}
+ />
+
+ {orderToBeRefunded && (
+ <RefundModalForTable
+ id={orderToBeRefunded.order_id}
+ onCancel={() => setOrderToBeRefunded(undefined)}
+ onConfirm={(value) =>
+ refundOrder(orderToBeRefunded.order_id, value)
+ .then(() =>
+ setNotif({
+ message: i18n`refund created successfully`,
+ type: "SUCCESS",
+ }),
+ )
+ .catch((error) =>
+ setNotif({
+ message: i18n`could not create the refund`,
+ type: "ERROR",
+ description: error.message,
+ }),
+ )
+ .then(() => setOrderToBeRefunded(undefined))
+ }
+ onLoadError={(error) => {
+ setNotif({
+ message: i18n`could not create the refund`,
+ type: "ERROR",
+ description: error.message,
+ });
+ setOrderToBeRefunded(undefined);
+ return <div />;
+ }}
+ onUnauthorized={onUnauthorized}
+ onNotFound={() => {
+ setNotif({
+ message: i18n`could not get the order to refund`,
+ type: "ERROR",
+ // description: error.message
+ });
+ setOrderToBeRefunded(undefined);
+ return <div />;
+ }}
+ />
+ )}
+ </Fragment>
+ );
}
interface RefundProps {
@@ -151,21 +182,30 @@ interface RefundProps {
onConfirm: (m: MerchantBackend.Orders.RefundRequest) => void;
}
-function RefundModalForTable({ id, onUnauthorized, onLoadError, onNotFound, onConfirm, onCancel }: RefundProps) {
+function RefundModalForTable({
+ id,
+ onUnauthorized,
+ onLoadError,
+ onNotFound,
+ onConfirm,
+ onCancel,
+}: RefundProps) {
const result = useOrderDetails(id);
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
- return <RefundModal
- order={result.data}
- onCancel={onCancel}
- onConfirm={onConfirm}
- />
+ return (
+ <RefundModal
+ order={result.data}
+ onCancel={onCancel}
+ onConfirm={onConfirm}
+ />
+ );
}
async function copyToClipboard(text: string) {
- return navigator.clipboard.writeText(text)
+ return navigator.clipboard.writeText(text);
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
index b5e0ff9c7..2fc0819bb 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
@@ -15,28 +15,29 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CreatePage as TestedComponent } from "./CreatePage.js";
-
export default {
- title: 'Pages/Product/Create',
+ title: "Pages/Product/Create",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- onBack: { action: 'onBack' },
+ onCreate: { action: "onCreate" },
+ onBack: { action: "onBack" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
-export const Example = createExample(TestedComponent, {
-});
+export const Example = createExample(TestedComponent, {});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
index 3b475cb82..f6d7000ef 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
@@ -26,40 +26,55 @@ import { MerchantBackend } from "../../../../declaration.js";
import { useListener } from "../../../../hooks/listener.js";
import { Translate, useTranslator } from "../../../../i18n/index.js";
-type Entity = MerchantBackend.Products.ProductAddDetail & { product_id: string}
+type Entity = MerchantBackend.Products.ProductAddDetail & {
+ product_id: string;
+};
interface Props {
onCreate: (d: Entity) => Promise<void>;
onBack?: () => void;
}
-
export function CreatePage({ onCreate, onBack }: Props): VNode {
+ const [submitForm, addFormSubmitter] = useListener<Entity | undefined>(
+ (result) => {
+ if (result) return onCreate(result);
+ return Promise.reject();
+ },
+ );
- const [submitForm, addFormSubmitter] = useListener<Entity | undefined>((result) => {
- if (result) return onCreate(result)
- return Promise.reject()
- })
-
- const i18n = useTranslator()
+ const i18n = useTranslator();
- return <div>
- <section class="section is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths">
- <ProductForm onSubscribe={addFormSubmitter} />
+ return (
+ <div>
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <ProductForm onSubscribe={addFormSubmitter} />
- <div class="buttons is-right mt-5">
- {onBack && <button class="button" onClick={onBack} ><Translate>Cancel</Translate></button>}
- <AsyncButton onClick={submitForm} data-tooltip={
- !submitForm ? i18n`Need to complete marked fields` : 'confirm operation'
- } disabled={!submitForm}><Translate>Confirm</Translate></AsyncButton>
+ <div class="buttons is-right mt-5">
+ {onBack && (
+ <button class="button" onClick={onBack}>
+ <Translate>Cancel</Translate>
+ </button>
+ )}
+ <AsyncButton
+ onClick={submitForm}
+ data-tooltip={
+ !submitForm
+ ? i18n`Need to complete marked fields`
+ : "confirm operation"
+ }
+ disabled={!submitForm}
+ >
+ <Translate>Confirm</Translate>
+ </AsyncButton>
+ </div>
</div>
-
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
- </div>
-} \ No newline at end of file
+ </section>
+ </div>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
index e9880b73a..6b02430cc 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
@@ -24,44 +24,49 @@ interface Props {
onCreateAnother?: () => void;
}
-export function CreatedSuccessfully({ entity, onConfirm, onCreateAnother }: Props): VNode {
-
- return <Template onConfirm={onConfirm} onCreateAnother={onCreateAnother}>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Image</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <img src={entity.image} style={{ width: 200, height: 200 }} />
- </p>
+export function CreatedSuccessfully({
+ entity,
+ onConfirm,
+ onCreateAnother,
+}: Props): VNode {
+ return (
+ <Template onConfirm={onConfirm} onCreateAnother={onCreateAnother}>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Image</label>
</div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Description</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <textarea class="input" readonly value={entity.description} />
- </p>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <img src={entity.image} style={{ width: 200, height: 200 }} />
+ </p>
+ </div>
</div>
</div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Price</label>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Description</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <textarea class="input" readonly value={entity.description} />
+ </p>
+ </div>
+ </div>
</div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.price} />
- </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Price</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input class="input" readonly value={entity.price} />
+ </p>
+ </div>
</div>
</div>
- </div>
- </Template>;
+ </Template>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
index 90b4d01a6..62ecaf512 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
@@ -15,41 +15,46 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { Fragment, h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { Fragment, h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend } from "../../../../declaration.js";
import { useProductAPI } from "../../../../hooks/product.js";
-import { useTranslator } from '../../../../i18n/index.js';
+import { useTranslator } from "../../../../i18n/index.js";
import { Notification } from "../../../../utils/types.js";
import { CreatePage } from "./CreatePage.js";
-export type Entity = MerchantBackend.Products.ProductAddDetail
+export type Entity = MerchantBackend.Products.ProductAddDetail;
interface Props {
onBack?: () => void;
onConfirm: () => void;
}
export default function CreateProduct({ onConfirm, onBack }: Props): VNode {
- const { createProduct } = useProductAPI()
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
- const i18n = useTranslator()
-
- return <Fragment>
- <NotificationCard notification={notif} />
- <CreatePage
- onBack={onBack}
- onCreate={(request: MerchantBackend.Products.ProductAddDetail) => {
- return createProduct(request).then(() => onConfirm()).catch((error) => {
- setNotif({
- message: i18n`could not create product`,
- type: "ERROR",
- description: error.message
- })
- })
- }} />
- </Fragment>
-} \ No newline at end of file
+ const { createProduct } = useProductAPI();
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
+ const i18n = useTranslator();
+
+ return (
+ <Fragment>
+ <NotificationCard notification={notif} />
+ <CreatePage
+ onBack={onBack}
+ onCreate={(request: MerchantBackend.Products.ProductAddDetail) => {
+ return createProduct(request)
+ .then(() => onConfirm())
+ .catch((error) => {
+ setNotif({
+ message: i18n`could not create product`,
+ type: "ERROR",
+ description: error.message,
+ });
+ });
+ }}
+ />
+ </Fragment>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
index ac22960b2..c2c4d548c 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
@@ -15,44 +15,47 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CardTable as TestedComponent } from "./Table.js";
-
export default {
- title: 'Pages/Product/List',
+ title: "Pages/Product/List",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- onSelect: { action: 'onSelect' },
- onDelete: { action: 'onDelete' },
- onUpdate: { action: 'onUpdate' },
+ onCreate: { action: "onCreate" },
+ onSelect: { action: "onSelect" },
+ onDelete: { action: "onDelete" },
+ onUpdate: { action: "onUpdate" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
-
export const Example = createExample(TestedComponent, {
- instances: [{
- id: 'orderid',
- description: 'description1',
- description_i18n: {} as any,
- image: '',
- price: 'TESTKUDOS:10',
- taxes: [],
- total_lost: 10,
- total_sold: 5,
- total_stock: 15,
- unit: 'bar',
- address: {}
- }]
+ instances: [
+ {
+ id: "orderid",
+ description: "description1",
+ description_i18n: {} as any,
+ image: "",
+ price: "TESTKUDOS:10",
+ taxes: [],
+ total_lost: 10,
+ total_sold: 5,
+ total_stock: 15,
+ unit: "bar",
+ address: {},
+ },
+ ],
});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
index dfa66fcf4..515b36895 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
@@ -41,7 +41,7 @@ interface Props {
onSelect: (product: Entity) => void;
onUpdate: (
id: string,
- data: MerchantBackend.Products.ProductPatchDetail
+ data: MerchantBackend.Products.ProductPatchDetail,
) => Promise<void>;
onCreate: () => void;
selected?: boolean;
@@ -55,7 +55,7 @@ export function CardTable({
onDelete,
}: Props): VNode {
const [rowSelection, rowSelectionHandler] = useState<string | undefined>(
- undefined
+ undefined,
);
const i18n = useTranslator();
return (
@@ -107,7 +107,7 @@ interface TableProps {
onSelect: (id: Entity) => void;
onUpdate: (
id: string,
- data: MerchantBackend.Products.ProductPatchDetail
+ data: MerchantBackend.Products.ProductPatchDetail,
) => Promise<void>;
onDelete: (id: Entity) => void;
rowSelectionHandler: StateUpdater<string | undefined>;
@@ -159,7 +159,7 @@ function Table({
? "never"
: `restock at ${format(
new Date(i.next_restock.t_s * 1000),
- "yyyy/MM/dd"
+ "yyyy/MM/dd",
)}`;
let stockInfo: ComponentChildren = "";
if (i.total_stock < 0) {
@@ -277,7 +277,7 @@ function Table({
product={i}
onUpdate={(prod) =>
onUpdate(i.id, prod).then((r) =>
- rowSelectionHandler(undefined)
+ rowSelectionHandler(undefined),
)
}
onCancel={() => rowSelectionHandler(undefined)}
@@ -297,7 +297,7 @@ function Table({
interface FastProductUpdateFormProps {
product: Entity;
onUpdate: (
- data: MerchantBackend.Products.ProductPatchDetail
+ data: MerchantBackend.Products.ProductPatchDetail,
) => Promise<void>;
onCancel: () => void;
}
@@ -381,7 +381,7 @@ function FastProductWithManagedStockUpdateForm({
};
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const i18n = useTranslator();
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
index 9f1d077ac..7e9118d24 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
@@ -15,18 +15,21 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { Loading } from "../../../../components/exception/loading.js";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend, WithId } from "../../../../declaration.js";
import { HttpError } from "../../../../hooks/backend.js";
-import { useInstanceProducts, useProductAPI } from "../../../../hooks/product.js";
-import { useTranslator } from '../../../../i18n/index.js';
+import {
+ useInstanceProducts,
+ useProductAPI,
+} from "../../../../hooks/product.js";
+import { useTranslator } from "../../../../i18n/index.js";
import { Notification } from "../../../../utils/types.js";
import { CardTable } from "./Table.js";
@@ -37,44 +40,65 @@ interface Props {
onSelect: (id: string) => void;
onLoadError: (e: HttpError) => VNode;
}
-export default function ProductList({ onUnauthorized, onLoadError, onCreate, onSelect, onNotFound }: Props): VNode {
- const result = useInstanceProducts()
- const { deleteProduct, updateProduct } = useProductAPI()
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
+export default function ProductList({
+ onUnauthorized,
+ onLoadError,
+ onCreate,
+ onSelect,
+ onNotFound,
+}: Props): VNode {
+ const result = useInstanceProducts();
+ const { deleteProduct, updateProduct } = useProductAPI();
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
- const i18n = useTranslator()
+ const i18n = useTranslator();
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
- return <section class="section is-main-section">
- <NotificationCard notification={notif} />
+ return (
+ <section class="section is-main-section">
+ <NotificationCard notification={notif} />
- <CardTable instances={result.data}
- onCreate={onCreate}
- onUpdate={(id, prod) => updateProduct(id, prod)
- .then(() => setNotif({
- message: i18n`product updated successfully`,
- type: "SUCCESS"
- })).catch((error) => setNotif({
- message: i18n`could not update the product`,
- type: "ERROR",
- description: error.message
- }))
- }
- onSelect={(product) => onSelect(product.id)}
- onDelete={(prod: (MerchantBackend.Products.ProductDetail & WithId)) => deleteProduct(prod.id)
- .then(() => setNotif({
- message: i18n`product delete successfully`,
- type: "SUCCESS"
- })).catch((error) => setNotif({
- message: i18n`could not delete the product`,
- type: "ERROR",
- description: error.message
- }))
- }
- />
- </section>
-} \ No newline at end of file
+ <CardTable
+ instances={result.data}
+ onCreate={onCreate}
+ onUpdate={(id, prod) =>
+ updateProduct(id, prod)
+ .then(() =>
+ setNotif({
+ message: i18n`product updated successfully`,
+ type: "SUCCESS",
+ }),
+ )
+ .catch((error) =>
+ setNotif({
+ message: i18n`could not update the product`,
+ type: "ERROR",
+ description: error.message,
+ }),
+ )
+ }
+ onSelect={(product) => onSelect(product.id)}
+ onDelete={(prod: MerchantBackend.Products.ProductDetail & WithId) =>
+ deleteProduct(prod.id)
+ .then(() =>
+ setNotif({
+ message: i18n`product delete successfully`,
+ type: "SUCCESS",
+ }),
+ )
+ .catch((error) =>
+ setNotif({
+ message: i18n`could not delete the product`,
+ type: "ERROR",
+ description: error.message,
+ }),
+ )
+ }
+ />
+ </section>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
index 95dd1f5cc..a85b13b8b 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
@@ -15,57 +15,59 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { UpdatePage as TestedComponent } from "./UpdatePage.js";
-
export default {
- title: 'Pages/Product/Update',
+ title: "Pages/Product/Update",
component: TestedComponent,
argTypes: {
- onUpdate: { action: 'onUpdate' },
- onBack: { action: 'onBack' },
+ onUpdate: { action: "onUpdate" },
+ onBack: { action: "onBack" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
export const WithManagedStock = createExample(TestedComponent, {
product: {
- product_id: '20102-ASDAS-QWE',
- description: 'description1',
+ product_id: "20102-ASDAS-QWE",
+ description: "description1",
description_i18n: {} as any,
- image: '',
- price: 'TESTKUDOS:10',
+ image: "",
+ price: "TESTKUDOS:10",
taxes: [],
total_lost: 10,
total_sold: 5,
total_stock: 15,
- unit: 'bar',
- address: {}
- }
+ unit: "bar",
+ address: {},
+ },
});
export const WithInfiniteStock = createExample(TestedComponent, {
product: {
- product_id: '20102-ASDAS-QWE',
- description: 'description1',
+ product_id: "20102-ASDAS-QWE",
+ description: "description1",
description_i18n: {} as any,
- image: '',
- price: 'TESTKUDOS:10',
+ image: "",
+ price: "TESTKUDOS:10",
taxes: [],
total_lost: 10,
total_sold: 5,
total_stock: -1,
- unit: 'bar',
- address: {}
- }
+ unit: "bar",
+ address: {},
+ },
});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
index 54fef6003..841c0222f 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
@@ -15,9 +15,9 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
@@ -26,7 +26,7 @@ import { MerchantBackend, WithId } from "../../../../declaration.js";
import { useListener } from "../../../../hooks/listener.js";
import { Translate, useTranslator } from "../../../../i18n/index.js";
-type Entity = MerchantBackend.Products.ProductDetail & { product_id: string }
+type Entity = MerchantBackend.Products.ProductDetail & { product_id: string };
interface Props {
onUpdate: (d: Entity) => Promise<void>;
@@ -35,43 +35,65 @@ interface Props {
}
export function UpdatePage({ product, onUpdate, onBack }: Props): VNode {
- const [submitForm, addFormSubmitter] = useListener<Entity | undefined>((result) => {
- if (result) return onUpdate(result)
- return Promise.resolve()
- })
-
- const i18n = useTranslator()
+ const [submitForm, addFormSubmitter] = useListener<Entity | undefined>(
+ (result) => {
+ if (result) return onUpdate(result);
+ return Promise.resolve();
+ },
+ );
- return <div>
- <section class="section">
- <section class="hero is-hero-bar">
- <div class="hero-body">
+ const i18n = useTranslator();
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <span class="is-size-4"><Translate>Product id:</Translate><b>{product.product_id}</b></span>
+ return (
+ <div>
+ <section class="section">
+ <section class="hero is-hero-bar">
+ <div class="hero-body">
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <span class="is-size-4">
+ <Translate>Product id:</Translate>
+ <b>{product.product_id}</b>
+ </span>
+ </div>
</div>
</div>
</div>
- </div>
- </section>
- <hr />
+ </section>
+ <hr />
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths">
- <ProductForm initial={product} onSubscribe={addFormSubmitter} alreadyExist />
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <ProductForm
+ initial={product}
+ onSubscribe={addFormSubmitter}
+ alreadyExist
+ />
- <div class="buttons is-right mt-5">
- {onBack && <button class="button" onClick={onBack} ><Translate>Cancel</Translate></button>}
- <AsyncButton onClick={submitForm} data-tooltip={
- !submitForm ? i18n`Need to complete marked fields` : 'confirm operation'
- } disabled={!submitForm}><Translate>Confirm</Translate></AsyncButton>
+ <div class="buttons is-right mt-5">
+ {onBack && (
+ <button class="button" onClick={onBack}>
+ <Translate>Cancel</Translate>
+ </button>
+ )}
+ <AsyncButton
+ onClick={submitForm}
+ data-tooltip={
+ !submitForm
+ ? i18n`Need to complete marked fields`
+ : "confirm operation"
+ }
+ disabled={!submitForm}
+ >
+ <Translate>Confirm</Translate>
+ </AsyncButton>
+ </div>
</div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
- </div>
-} \ No newline at end of file
+ </section>
+ </div>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
index c32424348..3988fc9f0 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
@@ -15,22 +15,22 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { Fragment, h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { Fragment, h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { Loading } from "../../../../components/exception/loading.js";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend } from "../../../../declaration.js";
import { HttpError } from "../../../../hooks/backend.js";
import { useProductAPI, useProductDetails } from "../../../../hooks/product.js";
-import { useTranslator } from '../../../../i18n/index.js';
+import { useTranslator } from "../../../../i18n/index.js";
import { Notification } from "../../../../utils/types.js";
import { UpdatePage } from "./UpdatePage.js";
-export type Entity = MerchantBackend.Products.ProductAddDetail
+export type Entity = MerchantBackend.Products.ProductAddDetail;
interface Props {
onBack?: () => void;
onConfirm: () => void;
@@ -39,33 +39,43 @@ interface Props {
onLoadError: (e: HttpError) => VNode;
pid: string;
}
-export default function UpdateProduct({ pid, onConfirm, onBack, onUnauthorized, onNotFound, onLoadError }: Props): VNode {
- const { updateProduct } = useProductAPI()
- const result = useProductDetails(pid)
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
+export default function UpdateProduct({
+ pid,
+ onConfirm,
+ onBack,
+ onUnauthorized,
+ onNotFound,
+ onLoadError,
+}: Props): VNode {
+ const { updateProduct } = useProductAPI();
+ const result = useProductDetails(pid);
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
- const i18n = useTranslator()
+ const i18n = useTranslator();
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
- return <Fragment>
- <NotificationCard notification={notif} />
- <UpdatePage
- product={{ ...result.data, product_id: pid }}
- onBack={onBack}
- onUpdate={(data) => {
- return updateProduct(pid, data)
- .then(onConfirm)
- .catch((error) => {
- setNotif({
- message: i18n`could not create product`,
- type: "ERROR",
- description: error.message
- })
- })
- }} />
- </Fragment>
-} \ No newline at end of file
+ return (
+ <Fragment>
+ <NotificationCard notification={notif} />
+ <UpdatePage
+ product={{ ...result.data, product_id: pid }}
+ onBack={onBack}
+ onUpdate={(data) => {
+ return updateProduct(pid, data)
+ .then(onConfirm)
+ .catch((error) => {
+ setNotif({
+ message: i18n`could not create product`,
+ type: "ERROR",
+ description: error.message,
+ });
+ });
+ }}
+ />
+ </Fragment>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
index 2f7f25b09..5542c028a 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
@@ -15,28 +15,29 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CreatePage as TestedComponent } from "./CreatePage.js";
-
export default {
- title: 'Pages/Reserve/Create',
+ title: "Pages/Reserve/Create",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- onBack: { action: 'onBack' },
+ onCreate: { action: "onCreate" },
+ onBack: { action: "onBack" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
-export const Example = createExample(TestedComponent, {
-});
+export const Example = createExample(TestedComponent, {});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
index 4910f9345..2c3e963b8 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
@@ -15,154 +15,252 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { Fragment, h, VNode } from "preact";
import { StateUpdater, useEffect, useState } from "preact/hooks";
-import { FormErrors, FormProvider } from "../../../../components/form/FormProvider.js";
+import {
+ FormErrors,
+ FormProvider,
+} from "../../../../components/form/FormProvider.js";
import { Input } from "../../../../components/form/Input.js";
import { InputCurrency } from "../../../../components/form/InputCurrency.js";
import { ExchangeBackend, MerchantBackend } from "../../../../declaration.js";
import { Translate, useTranslator } from "../../../../i18n/index.js";
import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
-import { canonicalizeBaseUrl, ExchangeKeysJson } from "@gnu-taler/taler-util"
-import { PAYTO_WIRE_METHOD_LOOKUP, URL_REGEX } from "../../../../utils/constants.js";
+import { canonicalizeBaseUrl, ExchangeKeysJson } from "@gnu-taler/taler-util";
+import {
+ PAYTO_WIRE_METHOD_LOOKUP,
+ URL_REGEX,
+} from "../../../../utils/constants.js";
import { request } from "../../../../hooks/backend.js";
import { InputSelector } from "../../../../components/form/InputSelector.js";
-type Entity = MerchantBackend.Tips.ReserveCreateRequest
+type Entity = MerchantBackend.Tips.ReserveCreateRequest;
interface Props {
onCreate: (d: Entity) => Promise<void>;
onBack?: () => void;
}
-
enum Steps {
EXCHANGE,
WIRE_METHOD,
}
interface ViewProps {
- step: Steps,
+ step: Steps;
setCurrentStep: (s: Steps) => void;
reserve: Partial<Entity>;
onBack?: () => void;
submitForm: () => Promise<void>;
setReserve: StateUpdater<Partial<Entity>>;
}
-function ViewStep({ step, setCurrentStep, reserve, onBack, submitForm, setReserve }: ViewProps): VNode {
- const i18n = useTranslator()
- const [wireMethods, setWireMethods] = useState<Array<string>>([])
- const [exchangeQueryError, setExchangeQueryError] = useState<string | undefined>(undefined)
+function ViewStep({
+ step,
+ setCurrentStep,
+ reserve,
+ onBack,
+ submitForm,
+ setReserve,
+}: ViewProps): VNode {
+ const i18n = useTranslator();
+ const [wireMethods, setWireMethods] = useState<Array<string>>([]);
+ const [exchangeQueryError, setExchangeQueryError] = useState<
+ string | undefined
+ >(undefined);
useEffect(() => {
- setExchangeQueryError(undefined)
- }, [reserve.exchange_url])
+ setExchangeQueryError(undefined);
+ }, [reserve.exchange_url]);
switch (step) {
case Steps.EXCHANGE: {
const errors: FormErrors<Entity> = {
- initial_balance: !reserve.initial_balance ? 'cannot be empty' : !(parseInt(reserve.initial_balance.split(':')[1], 10) > 0) ? i18n`it should be greater than 0` : undefined,
- exchange_url: !reserve.exchange_url ? i18n`cannot be empty` : !URL_REGEX.test(reserve.exchange_url) ? i18n`must be a valid URL` : !exchangeQueryError ? undefined : exchangeQueryError,
- }
-
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
-
- return <Fragment>
- <FormProvider<Entity> object={reserve} errors={errors} valueHandler={setReserve}>
- <InputCurrency<Entity> name="initial_balance" label={i18n`Initial balance`} tooltip={i18n`balance prior to deposit`} />
- <Input<Entity> name="exchange_url" label={i18n`Exchange URL`} tooltip={i18n`URL of exchange`} />
- </FormProvider>
-
- <div class="buttons is-right mt-5">
- {onBack && <button class="button" onClick={onBack} ><Translate>Cancel</Translate></button>}
- <AsyncButton class="has-tooltip-left" onClick={() => {
- return request<ExchangeBackend.WireResponse>(`${reserve.exchange_url}wire`).then(r => {
- const wireMethods = r.data.accounts.map(a => {
- const match = PAYTO_WIRE_METHOD_LOOKUP.exec(a.payto_uri)
- return match && match[1] || ''
- })
- setWireMethods(wireMethods)
- setCurrentStep(Steps.WIRE_METHOD)
- return
- }).catch((r: any) => {
- setExchangeQueryError(r.message)
- })
- }} data-tooltip={
- hasErrors ? i18n`Need to complete marked fields` : 'confirm operation'
- } disabled={hasErrors} ><Translate>Next</Translate></AsyncButton>
- </div>
- </Fragment>
+ initial_balance: !reserve.initial_balance
+ ? "cannot be empty"
+ : !(parseInt(reserve.initial_balance.split(":")[1], 10) > 0)
+ ? i18n`it should be greater than 0`
+ : undefined,
+ exchange_url: !reserve.exchange_url
+ ? i18n`cannot be empty`
+ : !URL_REGEX.test(reserve.exchange_url)
+ ? i18n`must be a valid URL`
+ : !exchangeQueryError
+ ? undefined
+ : exchangeQueryError,
+ };
+
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
+
+ return (
+ <Fragment>
+ <FormProvider<Entity>
+ object={reserve}
+ errors={errors}
+ valueHandler={setReserve}
+ >
+ <InputCurrency<Entity>
+ name="initial_balance"
+ label={i18n`Initial balance`}
+ tooltip={i18n`balance prior to deposit`}
+ />
+ <Input<Entity>
+ name="exchange_url"
+ label={i18n`Exchange URL`}
+ tooltip={i18n`URL of exchange`}
+ />
+ </FormProvider>
+
+ <div class="buttons is-right mt-5">
+ {onBack && (
+ <button class="button" onClick={onBack}>
+ <Translate>Cancel</Translate>
+ </button>
+ )}
+ <AsyncButton
+ class="has-tooltip-left"
+ onClick={() => {
+ return request<ExchangeBackend.WireResponse>(
+ `${reserve.exchange_url}wire`,
+ )
+ .then((r) => {
+ const wireMethods = r.data.accounts.map((a) => {
+ const match = PAYTO_WIRE_METHOD_LOOKUP.exec(a.payto_uri);
+ return (match && match[1]) || "";
+ });
+ setWireMethods(wireMethods);
+ setCurrentStep(Steps.WIRE_METHOD);
+ return;
+ })
+ .catch((r: any) => {
+ setExchangeQueryError(r.message);
+ });
+ }}
+ data-tooltip={
+ hasErrors
+ ? i18n`Need to complete marked fields`
+ : "confirm operation"
+ }
+ disabled={hasErrors}
+ >
+ <Translate>Next</Translate>
+ </AsyncButton>
+ </div>
+ </Fragment>
+ );
}
case Steps.WIRE_METHOD: {
const errors: FormErrors<Entity> = {
wire_method: !reserve.wire_method ? i18n`cannot be empty` : undefined,
- }
-
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
- return <Fragment>
- <FormProvider<Entity> object={reserve} errors={errors} valueHandler={setReserve}>
- <InputCurrency<Entity> name="initial_balance" label={i18n`Initial balance`} tooltip={i18n`balance prior to deposit`} readonly />
- <Input<Entity> name="exchange_url" label={i18n`Exchange URL`} tooltip={i18n`URL of exchange`} readonly />
- <InputSelector<Entity> name="wire_method" label={i18n`Wire method`} tooltip={i18n`method to use for wire transfer`} values={wireMethods} placeholder={i18n`Select one wire method`} />
- </FormProvider>
- <div class="buttons is-right mt-5">
- {onBack && <button class="button" onClick={() => setCurrentStep(Steps.EXCHANGE)} ><Translate>Back</Translate></button>}
- <AsyncButton onClick={submitForm} data-tooltip={
- hasErrors ? i18n`Need to complete marked fields` : 'confirm operation'
- } disabled={hasErrors} ><Translate>Confirm</Translate></AsyncButton>
- </div>
- </Fragment>
+ };
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
+ return (
+ <Fragment>
+ <FormProvider<Entity>
+ object={reserve}
+ errors={errors}
+ valueHandler={setReserve}
+ >
+ <InputCurrency<Entity>
+ name="initial_balance"
+ label={i18n`Initial balance`}
+ tooltip={i18n`balance prior to deposit`}
+ readonly
+ />
+ <Input<Entity>
+ name="exchange_url"
+ label={i18n`Exchange URL`}
+ tooltip={i18n`URL of exchange`}
+ readonly
+ />
+ <InputSelector<Entity>
+ name="wire_method"
+ label={i18n`Wire method`}
+ tooltip={i18n`method to use for wire transfer`}
+ values={wireMethods}
+ placeholder={i18n`Select one wire method`}
+ />
+ </FormProvider>
+ <div class="buttons is-right mt-5">
+ {onBack && (
+ <button
+ class="button"
+ onClick={() => setCurrentStep(Steps.EXCHANGE)}
+ >
+ <Translate>Back</Translate>
+ </button>
+ )}
+ <AsyncButton
+ onClick={submitForm}
+ data-tooltip={
+ hasErrors
+ ? i18n`Need to complete marked fields`
+ : "confirm operation"
+ }
+ disabled={hasErrors}
+ >
+ <Translate>Confirm</Translate>
+ </AsyncButton>
+ </div>
+ </Fragment>
+ );
}
}
}
export function CreatePage({ onCreate, onBack }: Props): VNode {
- const [reserve, setReserve] = useState<Partial<Entity>>({})
-
+ const [reserve, setReserve] = useState<Partial<Entity>>({});
const submitForm = () => {
- return onCreate(reserve as Entity)
- }
+ return onCreate(reserve as Entity);
+ };
- const [currentStep, setCurrentStep] = useState(Steps.EXCHANGE)
-
-
- return <div>
- <section class="section is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths">
-
- <div class="tabs is-toggle is-fullwidth is-small">
- <ul>
- <li class={currentStep === Steps.EXCHANGE ? "is-active" : ""}>
- <a style={{ cursor: 'initial' }}>
- <span>Step 1: Specify exchange</span>
- </a>
- </li>
- <li class={currentStep === Steps.WIRE_METHOD ? "is-active" : ""}>
- <a style={{ cursor: 'initial' }}>
- <span>Step 2: Select wire method</span>
- </a>
- </li>
- </ul>
- </div>
+ const [currentStep, setCurrentStep] = useState(Steps.EXCHANGE);
+
+ return (
+ <div>
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <div class="tabs is-toggle is-fullwidth is-small">
+ <ul>
+ <li class={currentStep === Steps.EXCHANGE ? "is-active" : ""}>
+ <a style={{ cursor: "initial" }}>
+ <span>Step 1: Specify exchange</span>
+ </a>
+ </li>
+ <li
+ class={currentStep === Steps.WIRE_METHOD ? "is-active" : ""}
+ >
+ <a style={{ cursor: "initial" }}>
+ <span>Step 2: Select wire method</span>
+ </a>
+ </li>
+ </ul>
+ </div>
- <ViewStep step={currentStep} reserve={reserve}
- setCurrentStep={setCurrentStep}
- setReserve={setReserve}
- submitForm={submitForm}
- onBack={onBack}
- />
+ <ViewStep
+ step={currentStep}
+ reserve={reserve}
+ setCurrentStep={setCurrentStep}
+ setReserve={setReserve}
+ submitForm={submitForm}
+ onBack={onBack}
+ />
+ </div>
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
- </div>
+ </section>
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
index 453147cdf..1d848a033 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
@@ -15,39 +15,41 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CreatedSuccessfully as TestedComponent } from "./CreatedSuccessfully.js";
-
export default {
- title: 'Pages/Reserve/CreatedSuccessfully',
+ title: "Pages/Reserve/CreatedSuccessfully",
component: TestedComponent,
argTypes: {
- onCreate: { action: 'onCreate' },
- onBack: { action: 'onBack' },
+ onCreate: { action: "onCreate" },
+ onBack: { action: "onBack" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
export const Example = createExample(TestedComponent, {
entity: {
request: {
- exchange_url: 'http://exchange.taler/',
- initial_balance: 'TESTKUDOS:1',
- wire_method: 'x-taler-bank',
+ exchange_url: "http://exchange.taler/",
+ initial_balance: "TESTKUDOS:1",
+ wire_method: "x-taler-bank",
},
response: {
- payto_uri: 'payto://x-taler-bank/bank.taler:8080/exchange_account',
- reserve_pub: 'WEQWDASDQWEASDADASDQWEQWEASDAS'
- }
- }
+ payto_uri: "payto://x-taler-bank/bank.taler:8080/exchange_account",
+ reserve_pub: "WEQWDASDQWEASDADASDQWEQWEASDAS",
+ },
+ },
});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
index 3da8beff8..9bb228e1f 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
@@ -20,7 +20,10 @@ import { MerchantBackend } from "../../../../declaration.js";
import { Translate } from "../../../../i18n/index.js";
import { QR } from "../../../../components/exception/QR.js";
-type Entity = { request: MerchantBackend.Tips.ReserveCreateRequest, response: MerchantBackend.Tips.ReserveCreateConfirmation };
+type Entity = {
+ request: MerchantBackend.Tips.ReserveCreateRequest;
+ response: MerchantBackend.Tips.ReserveCreateConfirmation;
+};
interface Props {
entity: Entity;
@@ -28,52 +31,77 @@ interface Props {
onCreateAnother?: () => void;
}
-export function CreatedSuccessfully({ entity, onConfirm, onCreateAnother }: Props): VNode {
- const link = `${entity.response.payto_uri}?message=${entity.response.reserve_pub}&amount=${entity.request.initial_balance}`
+export function CreatedSuccessfully({
+ entity,
+ onConfirm,
+ onCreateAnother,
+}: Props): VNode {
+ const link = `${entity.response.payto_uri}?message=${entity.response.reserve_pub}&amount=${entity.request.initial_balance}`;
- return <Template onConfirm={onConfirm} onCreateAnother={onCreateAnother}>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Amount</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input readonly class="input" value={entity.request.initial_balance} />
- </p>
+ return (
+ <Template onConfirm={onConfirm} onCreateAnother={onCreateAnother}>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Amount</label>
</div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Exchange bank account</label>
- </div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input readonly class="input" value={entity.response.payto_uri} />
- </p>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input
+ readonly
+ class="input"
+ value={entity.request.initial_balance}
+ />
+ </p>
+ </div>
</div>
</div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Wire transfer subject</label>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Exchange bank account</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input readonly class="input" value={entity.response.payto_uri} />
+ </p>
+ </div>
+ </div>
</div>
- <div class="field-body is-flex-grow-3">
- <div class="field">
- <p class="control">
- <input class="input" readonly value={entity.response.reserve_pub} />
- </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">Wire transfer subject</label>
+ </div>
+ <div class="field-body is-flex-grow-3">
+ <div class="field">
+ <p class="control">
+ <input
+ class="input"
+ readonly
+ value={entity.response.reserve_pub}
+ />
+ </p>
+ </div>
</div>
</div>
- </div>
- <p class="is-size-5"><Translate>To complete the setup of the reserve, you must now initiate a wire transfer using the given wire transfer subject and crediting the specified amount to the indicated account of the exchange.</Translate></p>
- <p class="is-size-5"><Translate>If your system supports RFC 8905, you can do this by opening this URI:</Translate></p>
- <pre>
- <a target="_blank" rel="noreferrer" href={link}>{link}</a>
- </pre>
- <QR text={link} />
- </Template>;
+ <p class="is-size-5">
+ <Translate>
+ To complete the setup of the reserve, you must now initiate a wire
+ transfer using the given wire transfer subject and crediting the
+ specified amount to the indicated account of the exchange.
+ </Translate>
+ </p>
+ <p class="is-size-5">
+ <Translate>
+ If your system supports RFC 8905, you can do this by opening this URI:
+ </Translate>
+ </p>
+ <pre>
+ <a target="_blank" rel="noreferrer" href={link}>
+ {link}
+ </a>
+ </pre>
+ <QR text={link} />
+ </Template>
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
index 689cdaaf5..b0b291859 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
@@ -29,7 +29,10 @@ import { Input } from "../../../../components/form/Input.js";
import { InputCurrency } from "../../../../components/form/InputCurrency.js";
import { InputDate } from "../../../../components/form/InputDate.js";
import { TextField } from "../../../../components/form/TextField.js";
-import { ContinueModal, SimpleModal } from "../../../../components/modal/index.js";
+import {
+ ContinueModal,
+ SimpleModal,
+} from "../../../../components/modal/index.js";
import { MerchantBackend } from "../../../../declaration.js";
import { useTipDetails } from "../../../../hooks/reserves.js";
import { Translate, useTranslator } from "../../../../i18n/index.js";
@@ -47,7 +50,7 @@ interface Props {
export function DetailPage({ id, selected, onBack }: Props): VNode {
const i18n = useTranslator();
const didExchangeAckTransfer = Amounts.isNonZero(
- Amounts.parseOrThrow(selected.exchange_initial_amount)
+ Amounts.parseOrThrow(selected.exchange_initial_amount),
);
const link = `${selected.payto_uri}?message=${id}&amount=${selected.merchant_initial_amount}`;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
index fbf3e4fa4..cd1318922 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
@@ -33,7 +33,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
index d31310cc9..360d39aba 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
@@ -74,7 +74,7 @@ export function TipInfo({ id, amount, entity }: Props): VNode {
? "never"
: format(
entity.expiration.t_s * 1000,
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)
}
/>
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
index 24bd011e2..5200abedf 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
@@ -15,21 +15,27 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import { FormErrors, FormProvider } from "../../../../components/form/FormProvider.js";
+import {
+ FormErrors,
+ FormProvider,
+} from "../../../../components/form/FormProvider.js";
import { Input } from "../../../../components/form/Input.js";
import { InputCurrency } from "../../../../components/form/InputCurrency.js";
-import { ConfirmModal, ContinueModal } from "../../../../components/modal/index.js";
+import {
+ ConfirmModal,
+ ContinueModal,
+} from "../../../../components/modal/index.js";
import { MerchantBackend } from "../../../../declaration.js";
import { useTranslator } from "../../../../i18n/index.js";
import { AuthorizeTipSchema } from "../../../../schemas/index.js";
import { CreatedSuccessfully } from "./CreatedSuccessfully.js";
-import * as yup from 'yup';
+import * as yup from "yup";
interface AuthorizeTipModalProps {
onCancel: () => void;
@@ -40,46 +46,79 @@ interface AuthorizeTipModalProps {
};
}
-export function AuthorizeTipModal({ onCancel, onConfirm, tipAuthorized }: AuthorizeTipModalProps): VNode {
+export function AuthorizeTipModal({
+ onCancel,
+ onConfirm,
+ tipAuthorized,
+}: AuthorizeTipModalProps): VNode {
// const result = useOrderDetails(id)
- type State = MerchantBackend.Tips.TipCreateRequest
- const [form, setValue] = useState<Partial<State>>({})
+ type State = MerchantBackend.Tips.TipCreateRequest;
+ const [form, setValue] = useState<Partial<State>>({});
const i18n = useTranslator();
// const [errors, setErrors] = useState<FormErrors<State>>({})
- let errors: FormErrors<State> = {}
+ let errors: FormErrors<State> = {};
try {
- AuthorizeTipSchema.validateSync(form, { abortEarly: false })
+ AuthorizeTipSchema.validateSync(form, { abortEarly: false });
} catch (err) {
if (err instanceof yup.ValidationError) {
- const yupErrors = err.inner as any[]
- errors = yupErrors.reduce((prev, cur) => !cur.path ? prev : ({ ...prev, [cur.path]: cur.message }), {})
+ const yupErrors = err.inner as any[];
+ errors = yupErrors.reduce(
+ (prev, cur) =>
+ !cur.path ? prev : { ...prev, [cur.path]: cur.message },
+ {},
+ );
}
}
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
const validateAndConfirm = () => {
- onConfirm(form as State)
- }
+ onConfirm(form as State);
+ };
if (tipAuthorized) {
- return <ContinueModal description="tip" active onConfirm={onCancel}>
- <CreatedSuccessfully
- entity={tipAuthorized.response}
- request={tipAuthorized.request}
- onConfirm={onCancel}
- />
- </ContinueModal>
+ return (
+ <ContinueModal description="tip" active onConfirm={onCancel}>
+ <CreatedSuccessfully
+ entity={tipAuthorized.response}
+ request={tipAuthorized.request}
+ onConfirm={onCancel}
+ />
+ </ContinueModal>
+ );
}
- return <ConfirmModal description="tip" active onCancel={onCancel} disabled={hasErrors} onConfirm={validateAndConfirm}>
-
- <FormProvider<State> errors={errors} object={form} valueHandler={setValue} >
- <InputCurrency<State> name="amount" label={i18n`Amount`} tooltip={i18n`amount of tip`} />
- <Input<State> name="justification" label={i18n`Justification`} inputType="multiline" tooltip={i18n`reason for the tip`} />
- <Input<State> name="next_url" label={i18n`URL after tip`} tooltip={i18n`URL to visit after tip payment`} />
- </FormProvider>
-
- </ConfirmModal>
+ return (
+ <ConfirmModal
+ description="tip"
+ active
+ onCancel={onCancel}
+ disabled={hasErrors}
+ onConfirm={validateAndConfirm}
+ >
+ <FormProvider<State>
+ errors={errors}
+ object={form}
+ valueHandler={setValue}
+ >
+ <InputCurrency<State>
+ name="amount"
+ label={i18n`Amount`}
+ tooltip={i18n`amount of tip`}
+ />
+ <Input<State>
+ name="justification"
+ label={i18n`Justification`}
+ inputType="multiline"
+ tooltip={i18n`reason for the tip`}
+ />
+ <Input<State>
+ name="next_url"
+ label={i18n`URL after tip`}
+ tooltip={i18n`URL to visit after tip payment`}
+ />
+ </FormProvider>
+ </ConfirmModal>
+ );
}
-
-
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
index 62f6ac538..643651b52 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
@@ -87,7 +87,7 @@ export function CreatedSuccessfully({
? "never"
: format(
entity.tip_expiration.t_s * 1000,
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)
}
/>
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
index db4f3c51e..fe305f4fd 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
@@ -35,7 +35,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
index f9efad91e..86b79d1dd 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
@@ -171,7 +171,7 @@ function Table({ instances, onNewTip, onSelect, onDelete }: TableProps): VNode {
? "never"
: format(
i.expiration_time.t_s * 1000,
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)}
</td>
<td
@@ -282,7 +282,7 @@ function TableWithoutFund({
? "never"
: format(
i.expiration_time.t_s * 1000,
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)}
</td>
<td
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
index 680589eed..182b3f72c 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
@@ -59,7 +59,7 @@ export default function ListTips({
const [notif, setNotif] = useState<Notification | undefined>(undefined);
const i18n = useTranslator();
const [reserveForTip, setReserveForTip] = useState<string | undefined>(
- undefined
+ undefined,
);
const [tipAuthorized, setTipAuthorized] = useState<
TipConfirmation | undefined
@@ -85,7 +85,7 @@ export default function ListTips({
try {
const response = await authorizeTipReserve(
reserveForTip,
- request
+ request,
);
setTipAuthorized({
request,
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
index d4fbaa901..64b67335c 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
@@ -15,29 +15,31 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode, FunctionalComponent } from 'preact';
+import { h, VNode, FunctionalComponent } from "preact";
import { CreatePage as TestedComponent } from "./CreatePage.js";
-
export default {
- title: 'Pages/Transfer/Create',
+ title: "Pages/Transfer/Create",
component: TestedComponent,
argTypes: {
- onUpdate: { action: 'onUpdate' },
- onBack: { action: 'onBack' },
+ onUpdate: { action: "onUpdate" },
+ onBack: { action: "onBack" },
},
};
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
+function createExample<Props>(
+ Component: FunctionalComponent<Props>,
+ props: Partial<Props>,
+) {
+ const r = (args: any) => <Component {...args} />;
+ r.args = props;
+ return r;
}
export const Example = createExample(TestedComponent, {
- accounts: ['payto://x-taler-bank/account1','payto://x-taler-bank/account2']
+ accounts: ["payto://x-taler-bank/account1", "payto://x-taler-bank/account2"],
});
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
index 4b4a079d3..5b041df7c 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
@@ -15,90 +15,132 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
-import { FormErrors, FormProvider } from "../../../../components/form/FormProvider.js";
+import {
+ FormErrors,
+ FormProvider,
+} from "../../../../components/form/FormProvider.js";
import { Input } from "../../../../components/form/Input.js";
import { InputCurrency } from "../../../../components/form/InputCurrency.js";
import { InputSelector } from "../../../../components/form/InputSelector.js";
import { useConfigContext } from "../../../../context/config.js";
import { MerchantBackend } from "../../../../declaration.js";
import { Translate, useTranslator } from "../../../../i18n/index.js";
-import { CROCKFORD_BASE32_REGEX, URL_REGEX } from "../../../../utils/constants.js";
+import {
+ CROCKFORD_BASE32_REGEX,
+ URL_REGEX,
+} from "../../../../utils/constants.js";
-type Entity = MerchantBackend.Transfers.TransferInformation
+type Entity = MerchantBackend.Transfers.TransferInformation;
interface Props {
onCreate: (d: Entity) => Promise<void>;
onBack?: () => void;
- accounts: string[],
+ accounts: string[];
}
export function CreatePage({ accounts, onCreate, onBack }: Props): VNode {
- const i18n = useTranslator()
- const { currency } = useConfigContext()
+ const i18n = useTranslator();
+ const { currency } = useConfigContext();
const [state, setState] = useState<Partial<Entity>>({
- wtid: '',
+ wtid: "",
// payto_uri: ,
// exchange_url: 'http://exchange.taler:8081/',
credit_amount: ``,
});
const errors: FormErrors<Entity> = {
- wtid: !state.wtid ? i18n`cannot be empty` :
- (!CROCKFORD_BASE32_REGEX.test(state.wtid) ? i18n`check the id, does not look valid` :
- (state.wtid.length !== 52 ? i18n`should have 52 characters, current ${state.wtid.length}` :
- undefined)),
+ wtid: !state.wtid
+ ? i18n`cannot be empty`
+ : !CROCKFORD_BASE32_REGEX.test(state.wtid)
+ ? i18n`check the id, does not look valid`
+ : state.wtid.length !== 52
+ ? i18n`should have 52 characters, current ${state.wtid.length}`
+ : undefined,
payto_uri: !state.payto_uri ? i18n`cannot be empty` : undefined,
credit_amount: !state.credit_amount ? i18n`cannot be empty` : undefined,
- exchange_url: !state.exchange_url ? i18n`cannot be empty` :
- (!URL_REGEX.test(state.exchange_url) ? i18n`URL doesn't have the right format` : undefined),
- }
+ exchange_url: !state.exchange_url
+ ? i18n`cannot be empty`
+ : !URL_REGEX.test(state.exchange_url)
+ ? i18n`URL doesn't have the right format`
+ : undefined,
+ };
- const hasErrors = Object.keys(errors).some(k => (errors as any)[k] !== undefined)
+ const hasErrors = Object.keys(errors).some(
+ (k) => (errors as any)[k] !== undefined,
+ );
const submitForm = () => {
- if (hasErrors) return Promise.reject()
- return onCreate(state as any)
- }
-
- return <div>
- <section class="section is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-four-fifths">
-
- <FormProvider object={state} valueHandler={setState} errors={errors}>
- <InputSelector name="payto_uri" label={i18n`Credited bank account`}
- values={accounts}
- placeholder={i18n`Select one account`}
- tooltip={i18n`Bank account of the merchant where the payment was received`}
- />
- <Input<Entity> name="wtid" label={i18n`Wire transfer ID`} help="" tooltip={i18n`unique identifier of the wire transfer used by the exchange, must be 52 characters long`} />
- <Input<Entity> name="exchange_url"
- label={i18n`Exchange URL`}
- tooltip={i18n`Base URL of the exchange that made the transfer, should have been in the wire transfer subject`}
- help="http://exchange.taler:8081/" />
- <InputCurrency<Entity> name="credit_amount" label={i18n`Amount credited`} tooltip={i18n`Actual amount that was wired to the merchant's bank account`} />
-
- </FormProvider>
-
- <div class="buttons is-right mt-5">
- {onBack && <button class="button" onClick={onBack} ><Translate>Cancel</Translate></button>}
- <AsyncButton disabled={hasErrors} data-tooltip={
- hasErrors ? i18n`Need to complete marked fields` : 'confirm operation'
- } onClick={submitForm} ><Translate>Confirm</Translate></AsyncButton>
+ if (hasErrors) return Promise.reject();
+ return onCreate(state as any);
+ };
+
+ return (
+ <div>
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-four-fifths">
+ <FormProvider
+ object={state}
+ valueHandler={setState}
+ errors={errors}
+ >
+ <InputSelector
+ name="payto_uri"
+ label={i18n`Credited bank account`}
+ values={accounts}
+ placeholder={i18n`Select one account`}
+ tooltip={i18n`Bank account of the merchant where the payment was received`}
+ />
+ <Input<Entity>
+ name="wtid"
+ label={i18n`Wire transfer ID`}
+ help=""
+ tooltip={i18n`unique identifier of the wire transfer used by the exchange, must be 52 characters long`}
+ />
+ <Input<Entity>
+ name="exchange_url"
+ label={i18n`Exchange URL`}
+ tooltip={i18n`Base URL of the exchange that made the transfer, should have been in the wire transfer subject`}
+ help="http://exchange.taler:8081/"
+ />
+ <InputCurrency<Entity>
+ name="credit_amount"
+ label={i18n`Amount credited`}
+ tooltip={i18n`Actual amount that was wired to the merchant's bank account`}
+ />
+ </FormProvider>
+
+ <div class="buttons is-right mt-5">
+ {onBack && (
+ <button class="button" onClick={onBack}>
+ <Translate>Cancel</Translate>
+ </button>
+ )}
+ <AsyncButton
+ disabled={hasErrors}
+ data-tooltip={
+ hasErrors
+ ? i18n`Need to complete marked fields`
+ : "confirm operation"
+ }
+ onClick={submitForm}
+ >
+ <Translate>Confirm</Translate>
+ </AsyncButton>
+ </div>
</div>
-
+ <div class="column" />
</div>
- <div class="column" />
- </div>
- </section>
- </div>
+ </section>
+ </div>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
index eb48aaf83..db01a57b6 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
@@ -15,46 +15,53 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { Fragment, h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { Fragment, h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { NotificationCard } from "../../../../components/menu/index.js";
import { MerchantBackend } from "../../../../declaration.js";
import { useInstanceDetails } from "../../../../hooks/instance.js";
import { useTransferAPI } from "../../../../hooks/transfer.js";
-import { useTranslator } from '../../../../i18n/index.js';
+import { useTranslator } from "../../../../i18n/index.js";
import { Notification } from "../../../../utils/types.js";
import { CreatePage } from "./CreatePage.js";
-export type Entity = MerchantBackend.Transfers.TransferInformation
+export type Entity = MerchantBackend.Transfers.TransferInformation;
interface Props {
onBack?: () => void;
onConfirm: () => void;
}
-export default function CreateTransfer({onConfirm, onBack}:Props): VNode {
- const { informTransfer } = useTransferAPI()
- const [notif, setNotif] = useState<Notification | undefined>(undefined)
- const i18n = useTranslator()
- const instance = useInstanceDetails()
- const accounts = !instance.ok ? [] : instance.data.accounts.map(a => a.payto_uri)
-
- return <>
- <NotificationCard notification={notif} />
- <CreatePage
- onBack={onBack}
- accounts={accounts}
- onCreate={(request: MerchantBackend.Transfers.TransferInformation) => {
- return informTransfer(request).then(() => onConfirm()).catch((error) => {
- setNotif({
- message: i18n`could not inform transfer`,
- type: "ERROR",
- description: error.message
- })
- })
- }} />
- </>
-} \ No newline at end of file
+export default function CreateTransfer({ onConfirm, onBack }: Props): VNode {
+ const { informTransfer } = useTransferAPI();
+ const [notif, setNotif] = useState<Notification | undefined>(undefined);
+ const i18n = useTranslator();
+ const instance = useInstanceDetails();
+ const accounts = !instance.ok
+ ? []
+ : instance.data.accounts.map((a) => a.payto_uri);
+
+ return (
+ <>
+ <NotificationCard notification={notif} />
+ <CreatePage
+ onBack={onBack}
+ accounts={accounts}
+ onCreate={(request: MerchantBackend.Transfers.TransferInformation) => {
+ return informTransfer(request)
+ .then(() => onConfirm())
+ .catch((error) => {
+ setNotif({
+ message: i18n`could not inform transfer`,
+ type: "ERROR",
+ description: error.message,
+ });
+ });
+ }}
+ />
+ </>
+ );
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
index 42fcdd733..92b3f9853 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
@@ -39,7 +39,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
index 539f1ae34..cad989980 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
@@ -15,15 +15,15 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
+import { h, VNode } from "preact";
import { FormProvider } from "../../../../components/form/FormProvider.js";
import { InputSelector } from "../../../../components/form/InputSelector.js";
import { MerchantBackend } from "../../../../declaration.js";
-import { Translate, useTranslator } from '../../../../i18n/index.js';
+import { Translate, useTranslator } from "../../../../i18n/index.js";
import { CardTable } from "./Table.js";
export interface Props {
@@ -43,47 +43,92 @@ export interface Props {
onDelete: () => void;
}
-export function ListPage({ payTo, onChangePayTo, transfers, onCreate, onDelete, accounts, onLoadMoreBefore, onLoadMoreAfter, isAllTransfers, isNonVerifiedTransfers, isVerifiedTransfers, onShowAll, onShowUnverified, onShowVerified }: Props): VNode {
- const form = { payto_uri: payTo }
+export function ListPage({
+ payTo,
+ onChangePayTo,
+ transfers,
+ onCreate,
+ onDelete,
+ accounts,
+ onLoadMoreBefore,
+ onLoadMoreAfter,
+ isAllTransfers,
+ isNonVerifiedTransfers,
+ isVerifiedTransfers,
+ onShowAll,
+ onShowUnverified,
+ onShowVerified,
+}: Props): VNode {
+ const form = { payto_uri: payTo };
const i18n = useTranslator();
- return <section class="section is-main-section">
- <div class="columns">
- <div class="column" />
- <div class="column is-10">
- <FormProvider object={form} valueHandler={(updater) => onChangePayTo(updater(form).payto_uri)}>
- <InputSelector name="payto_uri" label={i18n`Address`}
- values={accounts}
- placeholder={i18n`Select one account`}
- tooltip={i18n`filter by account address`} />
- </FormProvider>
+ return (
+ <section class="section is-main-section">
+ <div class="columns">
+ <div class="column" />
+ <div class="column is-10">
+ <FormProvider
+ object={form}
+ valueHandler={(updater) => onChangePayTo(updater(form).payto_uri)}
+ >
+ <InputSelector
+ name="payto_uri"
+ label={i18n`Address`}
+ values={accounts}
+ placeholder={i18n`Select one account`}
+ tooltip={i18n`filter by account address`}
+ />
+ </FormProvider>
+ </div>
+ <div class="column" />
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class={isAllTransfers ? "is-active" : ""}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`remove all filters`}
+ >
+ <a onClick={onShowAll}>
+ <Translate>All</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={isVerifiedTransfers ? "is-active" : ""}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`only show wire transfers confirmed by the merchant`}
+ >
+ <a onClick={onShowVerified}>
+ <Translate>Verified</Translate>
+ </a>
+ </div>
+ </li>
+ <li class={isNonVerifiedTransfers ? "is-active" : ""}>
+ <div
+ class="has-tooltip-right"
+ data-tooltip={i18n`only show wire transfers claimed by the exchange`}
+ >
+ <a onClick={onShowUnverified}>
+ <Translate>Unverified</Translate>
+ </a>
+ </div>
+ </li>
+ </ul>
</div>
- <div class="column" />
- </div>
- <div class="tabs">
- <ul>
- <li class={isAllTransfers ? 'is-active' : ''}>
- <div class="has-tooltip-right" data-tooltip={i18n`remove all filters`}>
- <a onClick={onShowAll}><Translate>All</Translate></a>
- </div>
- </li>
- <li class={isVerifiedTransfers ? 'is-active' : ''}>
- <div class="has-tooltip-right" data-tooltip={i18n`only show wire transfers confirmed by the merchant`}>
- <a onClick={onShowVerified}><Translate>Verified</Translate></a>
- </div>
- </li>
- <li class={isNonVerifiedTransfers ? 'is-active' : ''}>
- <div class="has-tooltip-right" data-tooltip={i18n`only show wire transfers claimed by the exchange`}>
- <a onClick={onShowUnverified}><Translate>Unverified</Translate></a>
- </div>
- </li>
- </ul>
- </div>
- <CardTable transfers={transfers.map(o => ({ ...o, id: String(o.transfer_serial_id) }))}
- accounts={accounts}
- onCreate={onCreate}
- onDelete={onDelete}
- onLoadMoreBefore={onLoadMoreBefore} hasMoreBefore={!onLoadMoreBefore}
- onLoadMoreAfter={onLoadMoreAfter} hasMoreAfter={!onLoadMoreAfter} />
- </section>;
+ <CardTable
+ transfers={transfers.map((o) => ({
+ ...o,
+ id: String(o.transfer_serial_id),
+ }))}
+ accounts={accounts}
+ onCreate={onCreate}
+ onDelete={onDelete}
+ onLoadMoreBefore={onLoadMoreBefore}
+ hasMoreBefore={!onLoadMoreBefore}
+ onLoadMoreAfter={onLoadMoreAfter}
+ hasMoreAfter={!onLoadMoreAfter}
+ />
+ </section>
+ );
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
index 0f9b87732..2341fb80a 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
@@ -173,7 +173,7 @@ function Table({
? i18n`never`
: format(
i.execution_time.t_s * 1000,
- "yyyy/MM/dd HH:mm:ss"
+ "yyyy/MM/dd HH:mm:ss",
)
: i18n`unknown`}
</td>
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
index 439e81f9f..242380fbc 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
-import { useState } from 'preact/hooks';
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
import { Loading } from "../../../../components/exception/loading.js";
import { MerchantBackend } from "../../../../declaration.js";
import { HttpError } from "../../../../hooks/backend.js";
@@ -35,51 +35,65 @@ interface Props {
onCreate: () => void;
}
interface Form {
- verified?: 'yes' | 'no';
+ verified?: "yes" | "no";
payto_uri?: string;
}
-export default function ListTransfer({ onUnauthorized, onLoadError, onCreate, onNotFound }: Props): VNode {
- const [form, setForm] = useState<Form>({ payto_uri: '' })
- const setFilter = (s?: 'yes' | 'no') => setForm({ ...form, verified: s })
-
- const [position, setPosition] = useState<string | undefined>(undefined)
+export default function ListTransfer({
+ onUnauthorized,
+ onLoadError,
+ onCreate,
+ onNotFound,
+}: Props): VNode {
+ const [form, setForm] = useState<Form>({ payto_uri: "" });
+ const setFilter = (s?: "yes" | "no") => setForm({ ...form, verified: s });
- const instance = useInstanceDetails()
- const accounts = !instance.ok ? [] : instance.data.accounts.map(a => a.payto_uri)
+ const [position, setPosition] = useState<string | undefined>(undefined);
- const isVerifiedTransfers = form.verified === 'yes'
- const isNonVerifiedTransfers = form.verified === 'no'
- const isAllTransfers = form.verified === undefined
+ const instance = useInstanceDetails();
+ const accounts = !instance.ok
+ ? []
+ : instance.data.accounts.map((a) => a.payto_uri);
- const result = useInstanceTransfers({
- position,
- payto_uri: form.payto_uri === '' ? undefined : form.payto_uri,
- verified: form.verified,
- }, (id) => setPosition(id))
+ const isVerifiedTransfers = form.verified === "yes";
+ const isNonVerifiedTransfers = form.verified === "no";
+ const isAllTransfers = form.verified === undefined;
- if (result.clientError && result.isUnauthorized) return onUnauthorized()
- if (result.clientError && result.isNotfound) return onNotFound()
- if (result.loading) return <Loading />
- if (!result.ok) return onLoadError(result)
+ const result = useInstanceTransfers(
+ {
+ position,
+ payto_uri: form.payto_uri === "" ? undefined : form.payto_uri,
+ verified: form.verified,
+ },
+ (id) => setPosition(id),
+ );
- return <ListPage
- accounts={accounts}
- transfers={result.data.transfers}
- onLoadMoreBefore={result.isReachingStart ? result.loadMorePrev : undefined}
- onLoadMoreAfter={result.isReachingEnd ? result.loadMore : undefined}
- onCreate={onCreate}
- onDelete={() => {null}}
- // position={position} setPosition={setPosition}
- onShowAll={() => setFilter(undefined)}
- onShowUnverified={() => setFilter('no')}
- onShowVerified={() => setFilter('yes')}
- isAllTransfers={isAllTransfers}
- isVerifiedTransfers={isVerifiedTransfers}
- isNonVerifiedTransfers={isNonVerifiedTransfers}
- payTo={form.payto_uri}
- onChangePayTo={(p) => setForm(v => ({ ...v, payto_uri: p }))}
- />
+ if (result.clientError && result.isUnauthorized) return onUnauthorized();
+ if (result.clientError && result.isNotfound) return onNotFound();
+ if (result.loading) return <Loading />;
+ if (!result.ok) return onLoadError(result);
+ return (
+ <ListPage
+ accounts={accounts}
+ transfers={result.data.transfers}
+ onLoadMoreBefore={
+ result.isReachingStart ? result.loadMorePrev : undefined
+ }
+ onLoadMoreAfter={result.isReachingEnd ? result.loadMore : undefined}
+ onCreate={onCreate}
+ onDelete={() => {
+ null;
+ }}
+ // position={position} setPosition={setPosition}
+ onShowAll={() => setFilter(undefined)}
+ onShowUnverified={() => setFilter("no")}
+ onShowVerified={() => setFilter("yes")}
+ isAllTransfers={isAllTransfers}
+ isVerifiedTransfers={isVerifiedTransfers}
+ isNonVerifiedTransfers={isNonVerifiedTransfers}
+ payTo={form.payto_uri}
+ onChangePayTo={(p) => setForm((v) => ({ ...v, payto_uri: p }))}
+ />
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/update/index.tsx
index cc9cd8afc..84cc95e72 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/update/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/update/index.tsx
@@ -15,12 +15,12 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { h, VNode } from 'preact';
+import { h, VNode } from "preact";
-export default function UpdateTransfer():VNode {
- return <div>order transfer page</div>
-} \ No newline at end of file
+export default function UpdateTransfer(): VNode {
+ return <div>order transfer page</div>;
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
index fa9163ac6..58b8d87ea 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
@@ -33,7 +33,7 @@ export default {
function createExample<Props>(
Component: FunctionalComponent<Props>,
- props: Partial<Props>
+ props: Partial<Props>,
) {
const r = (args: any) => <Component {...args} />;
r.args = props;
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
index 833592fcb..d7acdf023 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
@@ -44,7 +44,7 @@ type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage & {
interface Props {
onUpdate: (d: Entity) => void;
onChangeAuth: (
- d: MerchantBackend.Instances.InstanceAuthConfigurationMessage
+ d: MerchantBackend.Instances.InstanceAuthConfigurationMessage,
) => Promise<void>;
selected: MerchantBackend.Instances.QueryInstancesResponse;
isLoading: boolean;
@@ -52,7 +52,7 @@ interface Props {
}
function convert(
- from: MerchantBackend.Instances.QueryInstancesResponse
+ from: MerchantBackend.Instances.QueryInstancesResponse,
): Entity {
const { accounts, ...rest } = from;
const payto_uris = accounts.filter((a) => a.active).map((a) => a.payto_uri);
@@ -105,7 +105,7 @@ export function UpdatePage({
: undefinedIfEmpty(
value.payto_uris.map((p) => {
return !PAYTO_REGEX.test(p) ? i18n`is not valid` : undefined;
- })
+ }),
),
default_max_deposit_fee: !value.default_max_deposit_fee
? i18n`required`
@@ -144,7 +144,7 @@ export function UpdatePage({
};
const hasErrors = Object.keys(errors).some(
- (k) => (errors as any)[k] !== undefined
+ (k) => (errors as any)[k] !== undefined,
);
const submit = async (): Promise<void> => {
await onUpdate(value as Entity);
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
index 78d470b88..480274e66 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
@@ -48,7 +48,7 @@ export default function Update(props: Props): VNode {
export function AdminUpdate(props: Props & { instanceId: string }): VNode {
const { updateInstance, clearToken, setNewToken } = useManagementAPI(
- props.instanceId
+ props.instanceId,
);
const result = useManagedInstanceDetails(props.instanceId);
return CommonUpdate(props, result, updateInstance, clearToken, setNewToken);
@@ -66,7 +66,7 @@ function CommonUpdate(
result: HttpResponse<MerchantBackend.Instances.QueryInstancesResponse>,
updateInstance: any,
clearToken: any,
- setNewToken: any
+ setNewToken: any,
): VNode {
const { changeToken } = useInstanceContext();
const [notif, setNotif] = useState<Notification | undefined>(undefined);
@@ -85,7 +85,7 @@ function CommonUpdate(
isLoading={false}
selected={result.data}
onUpdate={(
- d: MerchantBackend.Instances.InstanceReconfigurationMessage
+ d: MerchantBackend.Instances.InstanceReconfigurationMessage,
): Promise<void> => {
return updateInstance(d)
.then(onConfirm)
@@ -94,11 +94,11 @@ function CommonUpdate(
message: i18n`Failed to create instance`,
type: "ERROR",
description: error.message,
- })
+ }),
);
}}
onChangeAuth={(
- d: MerchantBackend.Instances.InstanceAuthConfigurationMessage
+ d: MerchantBackend.Instances.InstanceAuthConfigurationMessage,
): Promise<void> => {
const apiCall =
d.method === "external" ? clearToken() : setNewToken(d.token!);
diff --git a/packages/merchant-backoffice-ui/src/paths/login/index.tsx b/packages/merchant-backoffice-ui/src/paths/login/index.tsx
index 6784e493a..caa63c714 100644
--- a/packages/merchant-backoffice-ui/src/paths/login/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/login/index.tsx
@@ -14,10 +14,10 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+/**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
import { h, VNode } from "preact";
import { LoginModal } from "../../components/exception/login.js";
@@ -25,5 +25,5 @@ interface Props {
onConfirm: (url: string, token?: string) => void;
}
export default function LoginPage({ onConfirm }: Props): VNode {
- return <LoginModal onConfirm={onConfirm} />
-} \ No newline at end of file
+ return <LoginModal onConfirm={onConfirm} />;
+}
diff --git a/packages/merchant-backoffice-ui/src/paths/notfound/index.tsx b/packages/merchant-backoffice-ui/src/paths/notfound/index.tsx
index fb468a411..452908154 100644
--- a/packages/merchant-backoffice-ui/src/paths/notfound/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/notfound/index.tsx
@@ -14,23 +14,22 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
-import { h, VNode } from 'preact';
-import { Link } from 'preact-router/match';
+import { h, VNode } from "preact";
+import { Link } from "preact-router/match";
export default function NotFoundPage(): VNode {
- return (
- <div>
- <h1>Error 404</h1>
- <p>That page doesn&apos;t exist.</p>
- <Link href="/">
- <h4>Back to Home</h4>
- </Link>
- </div>
- );
+ return (
+ <div>
+ <h1>Error 404</h1>
+ <p>That page doesn&apos;t exist.</p>
+ <Link href="/">
+ <h4>Back to Home</h4>
+ </Link>
+ </div>
+ );
}
-
diff --git a/packages/merchant-backoffice-ui/src/schemas/index.ts b/packages/merchant-backoffice-ui/src/schemas/index.ts
index 7822afc2d..149761c55 100644
--- a/packages/merchant-backoffice-ui/src/schemas/index.ts
+++ b/packages/merchant-backoffice-ui/src/schemas/index.ts
@@ -15,188 +15,230 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
-import { isAfter, isFuture } from 'date-fns';
-import * as yup from 'yup';
+import { isAfter, isFuture } from "date-fns";
+import * as yup from "yup";
import { AMOUNT_REGEX, PAYTO_REGEX } from "../utils/constants.js";
yup.setLocale({
mixed: {
- default: 'field_invalid',
+ default: "field_invalid",
},
number: {
- min: ({ min }: any) => ({ key: 'field_too_short', values: { min } }),
- max: ({ max }: any) => ({ key: 'field_too_big', values: { max } }),
+ min: ({ min }: any) => ({ key: "field_too_short", values: { min } }),
+ max: ({ max }: any) => ({ key: "field_too_big", values: { max } }),
},
});
function listOfPayToUrisAreValid(values?: (string | undefined)[]): boolean {
- return !!values && values.every(v => v && PAYTO_REGEX.test(v));
+ return !!values && values.every((v) => v && PAYTO_REGEX.test(v));
}
function currencyWithAmountIsValid(value?: string): boolean {
- return !!value && AMOUNT_REGEX.test(value)
+ return !!value && AMOUNT_REGEX.test(value);
}
function currencyGreaterThan0(value?: string) {
if (value) {
try {
- const [, amount] = value.split(':')
- const intAmount = parseInt(amount, 10)
- return intAmount > 0
+ const [, amount] = value.split(":");
+ const intAmount = parseInt(amount, 10);
+ return intAmount > 0;
} catch {
- return false
+ return false;
}
}
- return true
+ return true;
}
export const InstanceSchema = yup.object().shape({
- id: yup.string().required().meta({ type: 'url' }),
+ id: yup.string().required().meta({ type: "url" }),
name: yup.string().required(),
auth: yup.object().shape({
method: yup.string().matches(/^(external|token)$/),
token: yup.string().optional().nullable(),
}),
- payto_uris: yup.array().of(yup.string())
+ payto_uris: yup
+ .array()
+ .of(yup.string())
.min(1)
- .meta({ type: 'array' })
- .test('payto', '{path} is not valid', listOfPayToUrisAreValid),
- default_max_deposit_fee: yup.string()
+ .meta({ type: "array" })
+ .test("payto", "{path} is not valid", listOfPayToUrisAreValid),
+ default_max_deposit_fee: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid)
- .meta({ type: 'amount' }),
- default_max_wire_fee: yup.string()
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid)
+ .meta({ type: "amount" }),
+ default_max_wire_fee: yup
+ .string()
.required()
- .test('amount', '{path} is not valid', currencyWithAmountIsValid)
- .meta({ type: 'amount' }),
- default_wire_fee_amortization: yup.number()
- .required(),
- address: yup.object().shape({
- country: yup.string().optional(),
- address_lines: yup.array().of(yup.string()).max(7).optional(),
- building_number: yup.string().optional(),
- building_name: yup.string().optional(),
- street: yup.string().optional(),
- post_code: yup.string().optional(),
- town_location: yup.string().optional(),
- town: yup.string(),
- district: yup.string().optional(),
- country_subdivision: yup.string().optional(),
- }).meta({ type: 'group' }),
- jurisdiction: yup.object().shape({
- country: yup.string().optional(),
- address_lines: yup.array().of(yup.string()).max(7).optional(),
- building_number: yup.string().optional(),
- building_name: yup.string().optional(),
- street: yup.string().optional(),
- post_code: yup.string().optional(),
- town_location: yup.string().optional(),
- town: yup.string(),
- district: yup.string().optional(),
- country_subdivision: yup.string().optional(),
- }).meta({ type: 'group' }),
+ .test("amount", "{path} is not valid", currencyWithAmountIsValid)
+ .meta({ type: "amount" }),
+ default_wire_fee_amortization: yup.number().required(),
+ address: yup
+ .object()
+ .shape({
+ country: yup.string().optional(),
+ address_lines: yup.array().of(yup.string()).max(7).optional(),
+ building_number: yup.string().optional(),
+ building_name: yup.string().optional(),
+ street: yup.string().optional(),
+ post_code: yup.string().optional(),
+ town_location: yup.string().optional(),
+ town: yup.string(),
+ district: yup.string().optional(),
+ country_subdivision: yup.string().optional(),
+ })
+ .meta({ type: "group" }),
+ jurisdiction: yup
+ .object()
+ .shape({
+ country: yup.string().optional(),
+ address_lines: yup.array().of(yup.string()).max(7).optional(),
+ building_number: yup.string().optional(),
+ building_name: yup.string().optional(),
+ street: yup.string().optional(),
+ post_code: yup.string().optional(),
+ town_location: yup.string().optional(),
+ town: yup.string(),
+ district: yup.string().optional(),
+ country_subdivision: yup.string().optional(),
+ })
+ .meta({ type: "group" }),
// default_pay_delay: yup.object()
// .shape({ d_us: yup.number() })
// .required()
// .meta({ type: 'duration' }),
// .transform(numberToDuration),
- default_wire_transfer_delay: yup.object()
+ default_wire_transfer_delay: yup
+ .object()
.shape({ d_us: yup.number() })
.required()
- .meta({ type: 'duration' }),
+ .meta({ type: "duration" }),
// .transform(numberToDuration),
-})
+});
-export const InstanceUpdateSchema = InstanceSchema.clone().omit(['id']);
+export const InstanceUpdateSchema = InstanceSchema.clone().omit(["id"]);
export const InstanceCreateSchema = InstanceSchema.clone();
export const AuthorizeTipSchema = yup.object().shape({
justification: yup.string().required(),
- amount: yup.string()
+ amount: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid)
- .test('amount_positive', 'the amount is not valid', currencyGreaterThan0),
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid)
+ .test("amount_positive", "the amount is not valid", currencyGreaterThan0),
next_url: yup.string().required(),
-})
+});
const stringIsValidJSON = (value?: string) => {
- const p = value?.trim()
+ const p = value?.trim();
if (!p) return true;
try {
- JSON.parse(p)
- return true
+ JSON.parse(p);
+ return true;
} catch {
- return false
+ return false;
}
-}
+};
export const OrderCreateSchema = yup.object().shape({
- pricing: yup.object().required().shape({
- summary: yup.string().ensure().required(),
- order_price: yup.string()
- .ensure()
- .required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid)
- .test('amount_positive', 'the amount should be greater than 0', currencyGreaterThan0),
- }),
- extra: yup.string().test('extra', 'is not a JSON format', stringIsValidJSON),
- payments: yup.object().required().shape({
- refund_deadline: yup.date()
- .test('future', 'should be in the future', (d) => d ? isFuture(d) : true),
- pay_deadline: yup.date()
- .test('future', 'should be in the future', (d) => d ? isFuture(d) : true),
- auto_refund_deadline: yup.date()
- .test('future', 'should be in the future', (d) => d ? isFuture(d) : true),
- delivery_date: yup.date()
- .test('future', 'should be in the future', (d) => d ? isFuture(d) : true),
- }).test('payment', 'dates', (d) => {
- if (d.pay_deadline && d.refund_deadline && isAfter(d.refund_deadline, d.pay_deadline)) {
- return new yup.ValidationError('pay deadline should be greater than refund', 'asd', 'payments.pay_deadline')
- }
- return true
- })
-})
+ pricing: yup
+ .object()
+ .required()
+ .shape({
+ summary: yup.string().ensure().required(),
+ order_price: yup
+ .string()
+ .ensure()
+ .required()
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid)
+ .test(
+ "amount_positive",
+ "the amount should be greater than 0",
+ currencyGreaterThan0,
+ ),
+ }),
+ extra: yup.string().test("extra", "is not a JSON format", stringIsValidJSON),
+ payments: yup
+ .object()
+ .required()
+ .shape({
+ refund_deadline: yup
+ .date()
+ .test("future", "should be in the future", (d) =>
+ d ? isFuture(d) : true,
+ ),
+ pay_deadline: yup
+ .date()
+ .test("future", "should be in the future", (d) =>
+ d ? isFuture(d) : true,
+ ),
+ auto_refund_deadline: yup
+ .date()
+ .test("future", "should be in the future", (d) =>
+ d ? isFuture(d) : true,
+ ),
+ delivery_date: yup
+ .date()
+ .test("future", "should be in the future", (d) =>
+ d ? isFuture(d) : true,
+ ),
+ })
+ .test("payment", "dates", (d) => {
+ if (
+ d.pay_deadline &&
+ d.refund_deadline &&
+ isAfter(d.refund_deadline, d.pay_deadline)
+ ) {
+ return new yup.ValidationError(
+ "pay deadline should be greater than refund",
+ "asd",
+ "payments.pay_deadline",
+ );
+ }
+ return true;
+ }),
+});
export const ProductCreateSchema = yup.object().shape({
product_id: yup.string().ensure().required(),
description: yup.string().required(),
unit: yup.string().ensure().required(),
- price: yup.string()
+ price: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid),
- stock: yup.object({
-
- }).optional(),
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid),
+ stock: yup.object({}).optional(),
minimum_age: yup.number().optional().min(0),
-})
+});
export const ProductUpdateSchema = yup.object().shape({
description: yup.string().required(),
- price: yup.string()
+ price: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid),
- stock: yup.object({
-
- }).optional(),
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid),
+ stock: yup.object({}).optional(),
minimum_age: yup.number().optional().min(0),
-})
-
+});
export const TaxSchema = yup.object().shape({
name: yup.string().required().ensure(),
- tax: yup.string()
+ tax: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid),
-})
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid),
+});
export const NonInventoryProductSchema = yup.object().shape({
quantity: yup.number().required().positive(),
description: yup.string().required(),
unit: yup.string().ensure().required(),
- price: yup.string()
+ price: yup
+ .string()
.required()
- .test('amount', 'the amount is not valid', currencyWithAmountIsValid),
-})
+ .test("amount", "the amount is not valid", currencyWithAmountIsValid),
+});
diff --git a/packages/merchant-backoffice-ui/src/scss/DurationPicker.scss b/packages/merchant-backoffice-ui/src/scss/DurationPicker.scss
index a35575324..aa75b9916 100644
--- a/packages/merchant-backoffice-ui/src/scss/DurationPicker.scss
+++ b/packages/merchant-backoffice-ui/src/scss/DurationPicker.scss
@@ -1,4 +1,3 @@
-
.rdp-picker {
display: flex;
height: 175px;
diff --git a/packages/merchant-backoffice-ui/src/scss/_aside.scss b/packages/merchant-backoffice-ui/src/scss/_aside.scss
index 61eb49835..e0922093b 100644
--- a/packages/merchant-backoffice-ui/src/scss/_aside.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_aside.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -23,7 +23,8 @@
html {
&.has-aside-left {
&.has-aside-expanded {
- nav.navbar, body {
+ nav.navbar,
+ body {
padding-left: $aside-width;
}
}
@@ -71,11 +72,11 @@ aside.aside {
color: $aside-tools-color;
line-height: $navbar-height;
height: $navbar-height;
- padding-left: $default-padding * .5;
+ padding-left: $default-padding * 0.5;
flex: 1;
.icon {
- margin-right: $default-padding * .5;
+ margin-right: $default-padding * 0.5;
}
}
@@ -88,7 +89,7 @@ aside.aside {
.dropdown-icon {
position: absolute;
- top: $size-base * .5;
+ top: $size-base * 0.5;
right: 0;
}
}
@@ -98,11 +99,12 @@ aside.aside {
border-left: 0;
background-color: darken($base-color, 2.5%);
padding-left: 0;
- margin: 0 0 $default-padding * .5;
+ margin: 0 0 $default-padding * 0.5;
li {
a {
- padding: $default-padding * .5 0 $default-padding * .5 $default-padding * .5;
+ padding: $default-padding * 0.5 0 $default-padding * 0.5
+ $default-padding * 0.5;
font-size: $aside-submenu-font-size;
&.has-icon {
@@ -120,15 +122,14 @@ aside.aside {
}
.menu-label {
- padding: 0 $default-padding * .5;
- margin-top: $default-padding * .5;
- margin-bottom: $default-padding * .5;
+ padding: 0 $default-padding * 0.5;
+ margin-top: $default-padding * 0.5;
+ margin-bottom: $default-padding * 0.5;
}
-
}
@include touch {
- nav.navbar {
+ nav.navbar {
@include transition(margin-left);
}
aside.aside {
@@ -138,7 +139,8 @@ aside.aside {
body {
overflow-x: hidden;
}
- body, nav.navbar {
+ body,
+ nav.navbar {
width: 100vw;
}
aside.aside {
@@ -148,7 +150,7 @@ aside.aside {
.image {
img {
- max-width: $aside-mobile-width * .33;
+ max-width: $aside-mobile-width * 0.33;
}
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_card.scss b/packages/merchant-backoffice-ui/src/scss/_card.scss
index fd965989d..62db7f457 100644
--- a/packages/merchant-backoffice-ui/src/scss/_card.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_card.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -39,7 +39,7 @@
&.is-card-widget {
.card-content {
- padding: $default-padding * .5;
+ padding: $default-padding * 0.5;
}
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_custom-calendar.scss b/packages/merchant-backoffice-ui/src/scss/_custom-calendar.scss
index 7f093faa8..5fec21bf6 100644
--- a/packages/merchant-backoffice-ui/src/scss/_custom-calendar.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_custom-calendar.scss
@@ -16,31 +16,30 @@
:root {
--primary-color: #3298dc;
-
- --primary-text-color-dark: rgba(0,0,0,.87);
- --secondary-text-color-dark: rgba(0,0,0,.57);
- --disabled-text-color-dark: rgba(0,0,0,.13);
-
- --primary-text-color-light: rgba(255,255,255,.87);
- --secondary-text-color-light: rgba(255,255,255,.57);
- --disabled-text-color-light: rgba(255,255,255,.13);
-
- --font-stack: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-
+
+ --primary-text-color-dark: rgba(0, 0, 0, 0.87);
+ --secondary-text-color-dark: rgba(0, 0, 0, 0.57);
+ --disabled-text-color-dark: rgba(0, 0, 0, 0.13);
+
+ --primary-text-color-light: rgba(255, 255, 255, 0.87);
+ --secondary-text-color-light: rgba(255, 255, 255, 0.57);
+ --disabled-text-color-light: rgba(255, 255, 255, 0.13);
+
+ --font-stack: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+
--primary-card-color: #fff;
--primary-background-color: #f2f2f2;
-
+
--box-shadow-lvl-1: 0 1px 3px rgba(0, 0, 0, 0.12),
- 0 1px 2px rgba(0, 0, 0, 0.24);
+ 0 1px 2px rgba(0, 0, 0, 0.24);
--box-shadow-lvl-2: 0 3px 6px rgba(0, 0, 0, 0.16),
- 0 3px 6px rgba(0, 0, 0, 0.23);
+ 0 3px 6px rgba(0, 0, 0, 0.23);
--box-shadow-lvl-3: 0 10px 20px rgba(0, 0, 0, 0.19),
- 0 6px 6px rgba(0, 0, 0, 0.23);
+ 0 6px 6px rgba(0, 0, 0, 0.23);
--box-shadow-lvl-4: 0 14px 28px rgba(0, 0, 0, 0.25),
- 0 10px 10px rgba(0, 0, 0, 0.22);
+ 0 10px 10px rgba(0, 0, 0, 0.22);
}
-
.datePicker {
text-align: left;
background: var(--primary-card-color);
@@ -52,7 +51,7 @@
width: 90vw;
max-width: 448px;
transform-origin: top left;
- transition: transform .22s ease-in-out, opacity .22s ease-in-out;
+ transition: transform 0.22s ease-in-out, opacity 0.22s ease-in-out;
top: 50%;
left: 50%;
opacity: 0;
@@ -63,7 +62,7 @@
opacity: 1;
transform: scale(1) translate(-50%, -50%);
}
-
+
.datePicker--titles {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
@@ -71,7 +70,8 @@
height: 100px;
background: var(--primary-color);
- h2, h3 {
+ h2,
+ h3 {
cursor: pointer;
color: #fff;
line-height: 1;
@@ -81,7 +81,7 @@
}
h3 {
- color: rgba(255,255,255,.57);
+ color: rgba(255, 255, 255, 0.57);
font-size: 18px;
padding-bottom: 2px;
}
@@ -110,13 +110,13 @@
font-size: 26px;
user-select: none;
border-radius: 50%;
-
+
&:hover {
background: var(--disabled-text-color-dark);
}
}
}
-
+
.datePicker--scroll {
overflow-y: auto;
max-height: calc(90vh - 56px - 100px);
@@ -129,9 +129,11 @@
width: 100%;
display: grid;
text-align: center;
-
+
// there's probably a better way to do this, but wanted to try out CSS grid
- grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7);
+ grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(
+ 100% / 7
+ ) calc(100% / 7) calc(100% / 7) calc(100% / 7);
span {
color: var(--secondary-text-color-dark);
@@ -145,14 +147,16 @@
width: 100%;
display: grid;
text-align: center;
- grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7);
+ grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(
+ 100% / 7
+ ) calc(100% / 7) calc(100% / 7) calc(100% / 7);
span {
color: var(--primary-text-color-dark);
line-height: 42px;
font-size: 14px;
display: inline-grid;
- transition: color .22s;
+ transition: color 0.22s;
height: 42px;
position: relative;
cursor: pointer;
@@ -160,7 +164,7 @@
border-radius: 50%;
&::before {
- content: '';
+ content: "";
position: absolute;
z-index: -1;
height: 42px;
@@ -168,12 +172,12 @@
left: calc(50% - 21px);
background: var(--primary-color);
border-radius: 50%;
- transition: transform .22s, opacity .22s;
+ transition: transform 0.22s, opacity 0.22s;
transform: scale(0);
opacity: 0;
}
-
- &[disabled=true] {
+
+ &[disabled="true"] {
cursor: unset;
}
@@ -182,7 +186,7 @@
}
&.datePicker--selected {
- color: rgba(255,255,255,.87);
+ color: rgba(255, 255, 255, 0.87);
&:before {
transform: scale(1);
@@ -192,21 +196,21 @@
}
}
}
-
+
.datePicker--selectYear {
padding: 0 20px;
display: block;
width: 100%;
text-align: center;
max-height: 362px;
-
+
span {
display: block;
width: 100%;
font-size: 24px;
margin: 20px auto;
cursor: pointer;
-
+
&.selected {
font-size: 42px;
color: var(--primary-color);
@@ -232,9 +236,10 @@
appearance: none;
padding: 0 16px;
border-radius: 3px;
- transition: background-color .13s;
+ transition: background-color 0.13s;
- &:hover, &:focus {
+ &:hover,
+ &:focus {
outline: none;
background-color: var(--disabled-text-color-dark);
}
@@ -249,6 +254,6 @@
left: 0;
bottom: 0;
right: 0;
- background: rgba(0,0,0,.52);
- animation: fadeIn .22s forwards;
+ background: rgba(0, 0, 0, 0.52);
+ animation: fadeIn 0.22s forwards;
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_footer.scss b/packages/merchant-backoffice-ui/src/scss/_footer.scss
index 8a410de43..5855af742 100644
--- a/packages/merchant-backoffice-ui/src/scss/_footer.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_footer.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
diff --git a/packages/merchant-backoffice-ui/src/scss/_form.scss b/packages/merchant-backoffice-ui/src/scss/_form.scss
index 43b655fa5..bd28a17cf 100644
--- a/packages/merchant-backoffice-ui/src/scss/_form.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_form.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -22,11 +22,12 @@
.field {
&.has-check {
.field-body {
- margin-top: $default-padding * .125;
+ margin-top: $default-padding * 0.125;
}
}
.control {
- .mdi-24px.mdi-set, .mdi-24px.mdi:before {
+ .mdi-24px.mdi-set,
+ .mdi-24px.mdi:before {
font-size: inherit;
}
}
@@ -37,28 +38,34 @@
}
}
-.input, .textarea, select {
+.input,
+.textarea,
+select {
box-shadow: none;
- &:focus, &:active {
- box-shadow: none!important;
+ &:focus,
+ &:active {
+ box-shadow: none !important;
}
}
-.switch input[type=checkbox]+.check:before {
+.switch input[type="checkbox"] + .check:before {
box-shadow: none;
}
-.switch, .b-checkbox.checkbox {
- input[type=checkbox] {
- &:focus + .check, &:focus:checked + .check {
- box-shadow: none!important;
+.switch,
+.b-checkbox.checkbox {
+ input[type="checkbox"] {
+ &:focus + .check,
+ &:focus:checked + .check {
+ box-shadow: none !important;
}
}
}
-.b-checkbox.checkbox input[type=checkbox], .b-radio.radio input[type=radio] {
- &+.check {
+.b-checkbox.checkbox input[type="checkbox"],
+.b-radio.radio input[type="radio"] {
+ & + .check {
border: $checkbox-border;
}
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_hero-bar.scss b/packages/merchant-backoffice-ui/src/scss/_hero-bar.scss
index 06889b23e..0276468d7 100644
--- a/packages/merchant-backoffice-ui/src/scss/_hero-bar.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_hero-bar.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -32,17 +32,17 @@ section.hero.is-hero-bar {
}
> div > .level {
- margin-bottom: $default-padding * .5;
+ margin-bottom: $default-padding * 0.5;
}
.subtitle + p {
- margin-top: $default-padding * .5;
+ margin-top: $default-padding * 0.5;
}
}
.button {
&.is-hero-button {
- background-color: rgba($white, .5);
+ background-color: rgba($white, 0.5);
font-weight: 300;
@include transition(background-color);
diff --git a/packages/merchant-backoffice-ui/src/scss/_main-section.scss b/packages/merchant-backoffice-ui/src/scss/_main-section.scss
index 49bb65c17..5a8b20ba0 100644
--- a/packages/merchant-backoffice-ui/src/scss/_main-section.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_main-section.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
diff --git a/packages/merchant-backoffice-ui/src/scss/_mixins.scss b/packages/merchant-backoffice-ui/src/scss/_mixins.scss
index 7d5f6b144..f119ec68a 100644
--- a/packages/merchant-backoffice-ui/src/scss/_mixins.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_mixins.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -23,12 +23,12 @@
transition: $t 250ms ease-in-out 50ms;
}
-@mixin icon-with-update-mark ($icon-base-width) {
+@mixin icon-with-update-mark($icon-base-width) {
.icon {
width: $icon-base-width;
&.has-update-mark:after {
- right: calc($icon-base-width / 2) - .85;
+ right: calc($icon-base-width / 2) - 0.85;
}
}
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_modal.scss b/packages/merchant-backoffice-ui/src/scss/_modal.scss
index 5bdd9e5dc..b2bfd3e9e 100644
--- a/packages/merchant-backoffice-ui/src/scss/_modal.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_modal.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
diff --git a/packages/merchant-backoffice-ui/src/scss/_nav-bar.scss b/packages/merchant-backoffice-ui/src/scss/_nav-bar.scss
index 3928ebebb..406e0392f 100644
--- a/packages/merchant-backoffice-ui/src/scss/_nav-bar.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_nav-bar.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -25,7 +25,7 @@ nav.navbar {
.navbar-item {
&.has-user-avatar {
.is-user-avatar {
- margin-right: $default-padding * .5;
+ margin-right: $default-padding * 0.5;
display: inline-flex;
width: $navbar-avatar-size;
height: $navbar-avatar-size;
@@ -98,11 +98,11 @@ nav.navbar {
.navbar-item {
.icon:first-child {
- margin-right: $default-padding * .5;
+ margin-right: $default-padding * 0.5;
}
&.has-dropdown {
- >.navbar-link {
+ > .navbar-link {
background-color: $white-ter;
.icon:last-child {
display: none;
@@ -111,11 +111,11 @@ nav.navbar {
}
&.has-user-avatar {
- >.navbar-link {
+ > .navbar-link {
display: flex;
align-items: center;
- padding-top: $default-padding * .5;
- padding-bottom: $default-padding * .5;
+ padding-top: $default-padding * 0.5;
+ padding-bottom: $default-padding * 0.5;
}
}
}
@@ -131,7 +131,7 @@ nav.navbar {
&:not(.is-desktop-icon-only) {
.icon:first-child {
- margin-right: $default-padding * .5;
+ margin-right: $default-padding * 0.5;
}
}
&.is-desktop-icon-only {
diff --git a/packages/merchant-backoffice-ui/src/scss/_table.scss b/packages/merchant-backoffice-ui/src/scss/_table.scss
index 62f4c86fe..e4fbfc7b3 100644
--- a/packages/merchant-backoffice-ui/src/scss/_table.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_table.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -26,7 +26,8 @@ table.table {
}
}
- td, th {
+ td,
+ th {
&.checkbox-cell {
.b-checkbox.checkbox:not(.button) {
margin-right: 0;
@@ -83,7 +84,9 @@ table.table {
}
}
- .pagination-previous, .pagination-next, .pagination-link {
+ .pagination-previous,
+ .pagination-next,
+ .pagination-link {
border-color: $button-border-color;
color: $base-color;
@@ -108,24 +111,25 @@ table.table {
&.has-mobile-sort-spaced {
.b-table {
.field.table-mobile-sort {
- padding-top: $default-padding * .5;
+ padding-top: $default-padding * 0.5;
}
}
}
}
.b-table {
.field.table-mobile-sort {
- padding: 0 $default-padding * .5;
+ padding: 0 $default-padding * 0.5;
}
.table-wrapper.has-mobile-cards {
tr {
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1);
- margin-bottom: 3px!important;
+ margin-bottom: 3px !important;
}
td {
&.is-progress-col {
- span, progress {
+ span,
+ progress {
display: flex;
width: 45%;
align-items: center;
@@ -133,11 +137,13 @@ table.table {
}
}
- &.checkbox-cell, &.is-image-cell {
- border-bottom: 0!important;
+ &.checkbox-cell,
+ &.is-image-cell {
+ border-bottom: 0 !important;
}
- &.checkbox-cell, &.is-actions-cell {
+ &.checkbox-cell,
+ &.is-actions-cell {
&:before {
display: none;
}
@@ -163,7 +169,7 @@ table.table {
.image {
width: $table-avatar-size-mobile;
height: auto;
- margin: 0 auto $default-padding * .25;
+ margin: 0 auto $default-padding * 0.25;
}
}
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_tiles.scss b/packages/merchant-backoffice-ui/src/scss/_tiles.scss
index 3e64b3b5b..94dd6c21d 100644
--- a/packages/merchant-backoffice-ui/src/scss/_tiles.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_tiles.scss
@@ -14,12 +14,11 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
-
.is-tiles-wrapper {
margin-bottom: $default-padding;
}
diff --git a/packages/merchant-backoffice-ui/src/scss/_title-bar.scss b/packages/merchant-backoffice-ui/src/scss/_title-bar.scss
index a258954ca..bac3f6b42 100644
--- a/packages/merchant-backoffice-ui/src/scss/_title-bar.scss
+++ b/packages/merchant-backoffice-ui/src/scss/_title-bar.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
@@ -26,14 +26,14 @@ section.section.is-title-bar {
ul {
li {
display: inline-block;
- padding: 0 $default-padding * .5 0 0;
+ padding: 0 $default-padding * 0.5 0 0;
font-size: $default-padding;
color: $title-bar-color;
&:after {
display: inline-block;
- content: '/';
- padding-left: $default-padding * .5;
+ content: "/";
+ padding-left: $default-padding * 0.5;
}
&:last-child {
diff --git a/packages/merchant-backoffice-ui/src/scss/fonts/nunito.css b/packages/merchant-backoffice-ui/src/scss/fonts/nunito.css
index 213e66d54..a578506e8 100644
--- a/packages/merchant-backoffice-ui/src/scss/fonts/nunito.css
+++ b/packages/merchant-backoffice-ui/src/scss/fonts/nunito.css
@@ -15,8 +15,8 @@
*/
@font-face {
- font-family: 'Nunito';
+ font-family: "Nunito";
font-style: normal;
font-weight: 400;
- src: url(./XRXV3I6Li01BKofINeaE.ttf) format('truetype');
+ src: url(./XRXV3I6Li01BKofINeaE.ttf) format("truetype");
}
diff --git a/packages/merchant-backoffice-ui/src/scss/icons/materialdesignicons-4.9.95.min.css b/packages/merchant-backoffice-ui/src/scss/icons/materialdesignicons-4.9.95.min.css
index 24a89d639..2b8a2b244 100644
--- a/packages/merchant-backoffice-ui/src/scss/icons/materialdesignicons-4.9.95.min.css
+++ b/packages/merchant-backoffice-ui/src/scss/icons/materialdesignicons-4.9.95.min.css
@@ -1,3 +1,15109 @@
-@font-face{font-family:"Material Design Icons";src:url("./fonts/materialdesignicons-webfont-4.9.95.eot");src:url("./fonts/materialdesignicons-webfont-4.9.95.woff2") format("woff2"),url("./fonts/materialdesignicons-webfont-4.9.95.woff") format("woff"),url("./fonts/materialdesignicons-webfont-4.9.95.ttf") format("truetype");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing::before{content:"\F001C"}.mdi-abjad-arabic::before{content:"\F0353"}.mdi-abjad-hebrew::before{content:"\F0354"}.mdi-abugida-devanagari::before{content:"\F0355"}.mdi-abugida-thai::before{content:"\F0356"}.mdi-access-point::before{content:"\F002"}.mdi-access-point-network::before{content:"\F003"}.mdi-access-point-network-off::before{content:"\FBBD"}.mdi-account::before{content:"\F004"}.mdi-account-alert::before{content:"\F005"}.mdi-account-alert-outline::before{content:"\FB2C"}.mdi-account-arrow-left::before{content:"\FB2D"}.mdi-account-arrow-left-outline::before{content:"\FB2E"}.mdi-account-arrow-right::before{content:"\FB2F"}.mdi-account-arrow-right-outline::before{content:"\FB30"}.mdi-account-badge::before{content:"\FD83"}.mdi-account-badge-alert::before{content:"\FD84"}.mdi-account-badge-alert-outline::before{content:"\FD85"}.mdi-account-badge-horizontal::before{content:"\FDF0"}.mdi-account-badge-horizontal-outline::before{content:"\FDF1"}.mdi-account-badge-outline::before{content:"\FD86"}.mdi-account-box::before{content:"\F006"}.mdi-account-box-multiple::before{content:"\F933"}.mdi-account-box-multiple-outline::before{content:"\F002C"}.mdi-account-box-outline::before{content:"\F007"}.mdi-account-cancel::before{content:"\F030A"}.mdi-account-cancel-outline::before{content:"\F030B"}.mdi-account-card-details::before{content:"\F5D2"}.mdi-account-card-details-outline::before{content:"\FD87"}.mdi-account-cash::before{content:"\F00C2"}.mdi-account-cash-outline::before{content:"\F00C3"}.mdi-account-check::before{content:"\F008"}.mdi-account-check-outline::before{content:"\FBBE"}.mdi-account-child::before{content:"\FA88"}.mdi-account-child-circle::before{content:"\FA89"}.mdi-account-child-outline::before{content:"\F00F3"}.mdi-account-circle::before{content:"\F009"}.mdi-account-circle-outline::before{content:"\FB31"}.mdi-account-clock::before{content:"\FB32"}.mdi-account-clock-outline::before{content:"\FB33"}.mdi-account-cog::before{content:"\F039B"}.mdi-account-cog-outline::before{content:"\F039C"}.mdi-account-convert::before{content:"\F00A"}.mdi-account-convert-outline::before{content:"\F032C"}.mdi-account-details::before{content:"\F631"}.mdi-account-details-outline::before{content:"\F039D"}.mdi-account-edit::before{content:"\F6BB"}.mdi-account-edit-outline::before{content:"\F001D"}.mdi-account-group::before{content:"\F848"}.mdi-account-group-outline::before{content:"\FB34"}.mdi-account-heart::before{content:"\F898"}.mdi-account-heart-outline::before{content:"\FBBF"}.mdi-account-key::before{content:"\F00B"}.mdi-account-key-outline::before{content:"\FBC0"}.mdi-account-lock::before{content:"\F0189"}.mdi-account-lock-outline::before{content:"\F018A"}.mdi-account-minus::before{content:"\F00D"}.mdi-account-minus-outline::before{content:"\FAEB"}.mdi-account-multiple::before{content:"\F00E"}.mdi-account-multiple-check::before{content:"\F8C4"}.mdi-account-multiple-check-outline::before{content:"\F0229"}.mdi-account-multiple-minus::before{content:"\F5D3"}.mdi-account-multiple-minus-outline::before{content:"\FBC1"}.mdi-account-multiple-outline::before{content:"\F00F"}.mdi-account-multiple-plus::before{content:"\F010"}.mdi-account-multiple-plus-outline::before{content:"\F7FF"}.mdi-account-multiple-remove::before{content:"\F0235"}.mdi-account-multiple-remove-outline::before{content:"\F0236"}.mdi-account-network::before{content:"\F011"}.mdi-account-network-outline::before{content:"\FBC2"}.mdi-account-off::before{content:"\F012"}.mdi-account-off-outline::before{content:"\FBC3"}.mdi-account-outline::before{content:"\F013"}.mdi-account-plus::before{content:"\F014"}.mdi-account-plus-outline::before{content:"\F800"}.mdi-account-question::before{content:"\FB35"}.mdi-account-question-outline::before{content:"\FB36"}.mdi-account-remove::before{content:"\F015"}.mdi-account-remove-outline::before{content:"\FAEC"}.mdi-account-search::before{content:"\F016"}.mdi-account-search-outline::before{content:"\F934"}.mdi-account-settings::before{content:"\F630"}.mdi-account-settings-outline::before{content:"\F00F4"}.mdi-account-star::before{content:"\F017"}.mdi-account-star-outline::before{content:"\FBC4"}.mdi-account-supervisor::before{content:"\FA8A"}.mdi-account-supervisor-circle::before{content:"\FA8B"}.mdi-account-supervisor-outline::before{content:"\F0158"}.mdi-account-switch::before{content:"\F019"}.mdi-account-tie::before{content:"\FCBF"}.mdi-account-tie-outline::before{content:"\F00F5"}.mdi-account-tie-voice::before{content:"\F0333"}.mdi-account-tie-voice-off::before{content:"\F0335"}.mdi-account-tie-voice-off-outline::before{content:"\F0336"}.mdi-account-tie-voice-outline::before{content:"\F0334"}.mdi-accusoft::before{content:"\F849"}.mdi-adjust::before{content:"\F01A"}.mdi-adobe::before{content:"\F935"}.mdi-adobe-acrobat::before{content:"\FFBD"}.mdi-air-conditioner::before{content:"\F01B"}.mdi-air-filter::before{content:"\FD1F"}.mdi-air-horn::before{content:"\FD88"}.mdi-air-humidifier::before{content:"\F00C4"}.mdi-air-purifier::before{content:"\FD20"}.mdi-airbag::before{content:"\FBC5"}.mdi-airballoon::before{content:"\F01C"}.mdi-airballoon-outline::before{content:"\F002D"}.mdi-airplane::before{content:"\F01D"}.mdi-airplane-landing::before{content:"\F5D4"}.mdi-airplane-off::before{content:"\F01E"}.mdi-airplane-takeoff::before{content:"\F5D5"}.mdi-airplay::before{content:"\F01F"}.mdi-airport::before{content:"\F84A"}.mdi-alarm::before{content:"\F020"}.mdi-alarm-bell::before{content:"\F78D"}.mdi-alarm-check::before{content:"\F021"}.mdi-alarm-light::before{content:"\F78E"}.mdi-alarm-light-outline::before{content:"\FBC6"}.mdi-alarm-multiple::before{content:"\F022"}.mdi-alarm-note::before{content:"\FE8E"}.mdi-alarm-note-off::before{content:"\FE8F"}.mdi-alarm-off::before{content:"\F023"}.mdi-alarm-plus::before{content:"\F024"}.mdi-alarm-snooze::before{content:"\F68D"}.mdi-album::before{content:"\F025"}.mdi-alert::before{content:"\F026"}.mdi-alert-box::before{content:"\F027"}.mdi-alert-box-outline::before{content:"\FCC0"}.mdi-alert-circle::before{content:"\F028"}.mdi-alert-circle-check::before{content:"\F0218"}.mdi-alert-circle-check-outline::before{content:"\F0219"}.mdi-alert-circle-outline::before{content:"\F5D6"}.mdi-alert-decagram::before{content:"\F6BC"}.mdi-alert-decagram-outline::before{content:"\FCC1"}.mdi-alert-octagon::before{content:"\F029"}.mdi-alert-octagon-outline::before{content:"\FCC2"}.mdi-alert-octagram::before{content:"\F766"}.mdi-alert-octagram-outline::before{content:"\FCC3"}.mdi-alert-outline::before{content:"\F02A"}.mdi-alert-rhombus::before{content:"\F01F9"}.mdi-alert-rhombus-outline::before{content:"\F01FA"}.mdi-alien::before{content:"\F899"}.mdi-alien-outline::before{content:"\F00F6"}.mdi-align-horizontal-center::before{content:"\F01EE"}.mdi-align-horizontal-left::before{content:"\F01ED"}.mdi-align-horizontal-right::before{content:"\F01EF"}.mdi-align-vertical-bottom::before{content:"\F01F0"}.mdi-align-vertical-center::before{content:"\F01F1"}.mdi-align-vertical-top::before{content:"\F01F2"}.mdi-all-inclusive::before{content:"\F6BD"}.mdi-allergy::before{content:"\F0283"}.mdi-alpha::before{content:"\F02B"}.mdi-alpha-a::before{content:"\41"}.mdi-alpha-a-box::before{content:"\FAED"}.mdi-alpha-a-box-outline::before{content:"\FBC7"}.mdi-alpha-a-circle::before{content:"\FBC8"}.mdi-alpha-a-circle-outline::before{content:"\FBC9"}.mdi-alpha-b::before{content:"\42"}.mdi-alpha-b-box::before{content:"\FAEE"}.mdi-alpha-b-box-outline::before{content:"\FBCA"}.mdi-alpha-b-circle::before{content:"\FBCB"}.mdi-alpha-b-circle-outline::before{content:"\FBCC"}.mdi-alpha-c::before{content:"\43"}.mdi-alpha-c-box::before{content:"\FAEF"}.mdi-alpha-c-box-outline::before{content:"\FBCD"}.mdi-alpha-c-circle::before{content:"\FBCE"}.mdi-alpha-c-circle-outline::before{content:"\FBCF"}.mdi-alpha-d::before{content:"\44"}.mdi-alpha-d-box::before{content:"\FAF0"}.mdi-alpha-d-box-outline::before{content:"\FBD0"}.mdi-alpha-d-circle::before{content:"\FBD1"}.mdi-alpha-d-circle-outline::before{content:"\FBD2"}.mdi-alpha-e::before{content:"\45"}.mdi-alpha-e-box::before{content:"\FAF1"}.mdi-alpha-e-box-outline::before{content:"\FBD3"}.mdi-alpha-e-circle::before{content:"\FBD4"}.mdi-alpha-e-circle-outline::before{content:"\FBD5"}.mdi-alpha-f::before{content:"\46"}.mdi-alpha-f-box::before{content:"\FAF2"}.mdi-alpha-f-box-outline::before{content:"\FBD6"}.mdi-alpha-f-circle::before{content:"\FBD7"}.mdi-alpha-f-circle-outline::before{content:"\FBD8"}.mdi-alpha-g::before{content:"\47"}.mdi-alpha-g-box::before{content:"\FAF3"}.mdi-alpha-g-box-outline::before{content:"\FBD9"}.mdi-alpha-g-circle::before{content:"\FBDA"}.mdi-alpha-g-circle-outline::before{content:"\FBDB"}.mdi-alpha-h::before{content:"\48"}.mdi-alpha-h-box::before{content:"\FAF4"}.mdi-alpha-h-box-outline::before{content:"\FBDC"}.mdi-alpha-h-circle::before{content:"\FBDD"}.mdi-alpha-h-circle-outline::before{content:"\FBDE"}.mdi-alpha-i::before{content:"\49"}.mdi-alpha-i-box::before{content:"\FAF5"}.mdi-alpha-i-box-outline::before{content:"\FBDF"}.mdi-alpha-i-circle::before{content:"\FBE0"}.mdi-alpha-i-circle-outline::before{content:"\FBE1"}.mdi-alpha-j::before{content:"\4A"}.mdi-alpha-j-box::before{content:"\FAF6"}.mdi-alpha-j-box-outline::before{content:"\FBE2"}.mdi-alpha-j-circle::before{content:"\FBE3"}.mdi-alpha-j-circle-outline::before{content:"\FBE4"}.mdi-alpha-k::before{content:"\4B"}.mdi-alpha-k-box::before{content:"\FAF7"}.mdi-alpha-k-box-outline::before{content:"\FBE5"}.mdi-alpha-k-circle::before{content:"\FBE6"}.mdi-alpha-k-circle-outline::before{content:"\FBE7"}.mdi-alpha-l::before{content:"\4C"}.mdi-alpha-l-box::before{content:"\FAF8"}.mdi-alpha-l-box-outline::before{content:"\FBE8"}.mdi-alpha-l-circle::before{content:"\FBE9"}.mdi-alpha-l-circle-outline::before{content:"\FBEA"}.mdi-alpha-m::before{content:"\4D"}.mdi-alpha-m-box::before{content:"\FAF9"}.mdi-alpha-m-box-outline::before{content:"\FBEB"}.mdi-alpha-m-circle::before{content:"\FBEC"}.mdi-alpha-m-circle-outline::before{content:"\FBED"}.mdi-alpha-n::before{content:"\4E"}.mdi-alpha-n-box::before{content:"\FAFA"}.mdi-alpha-n-box-outline::before{content:"\FBEE"}.mdi-alpha-n-circle::before{content:"\FBEF"}.mdi-alpha-n-circle-outline::before{content:"\FBF0"}.mdi-alpha-o::before{content:"\4F"}.mdi-alpha-o-box::before{content:"\FAFB"}.mdi-alpha-o-box-outline::before{content:"\FBF1"}.mdi-alpha-o-circle::before{content:"\FBF2"}.mdi-alpha-o-circle-outline::before{content:"\FBF3"}.mdi-alpha-p::before{content:"\50"}.mdi-alpha-p-box::before{content:"\FAFC"}.mdi-alpha-p-box-outline::before{content:"\FBF4"}.mdi-alpha-p-circle::before{content:"\FBF5"}.mdi-alpha-p-circle-outline::before{content:"\FBF6"}.mdi-alpha-q::before{content:"\51"}.mdi-alpha-q-box::before{content:"\FAFD"}.mdi-alpha-q-box-outline::before{content:"\FBF7"}.mdi-alpha-q-circle::before{content:"\FBF8"}.mdi-alpha-q-circle-outline::before{content:"\FBF9"}.mdi-alpha-r::before{content:"\52"}.mdi-alpha-r-box::before{content:"\FAFE"}.mdi-alpha-r-box-outline::before{content:"\FBFA"}.mdi-alpha-r-circle::before{content:"\FBFB"}.mdi-alpha-r-circle-outline::before{content:"\FBFC"}.mdi-alpha-s::before{content:"\53"}.mdi-alpha-s-box::before{content:"\FAFF"}.mdi-alpha-s-box-outline::before{content:"\FBFD"}.mdi-alpha-s-circle::before{content:"\FBFE"}.mdi-alpha-s-circle-outline::before{content:"\FBFF"}.mdi-alpha-t::before{content:"\54"}.mdi-alpha-t-box::before{content:"\FB00"}.mdi-alpha-t-box-outline::before{content:"\FC00"}.mdi-alpha-t-circle::before{content:"\FC01"}.mdi-alpha-t-circle-outline::before{content:"\FC02"}.mdi-alpha-u::before{content:"\55"}.mdi-alpha-u-box::before{content:"\FB01"}.mdi-alpha-u-box-outline::before{content:"\FC03"}.mdi-alpha-u-circle::before{content:"\FC04"}.mdi-alpha-u-circle-outline::before{content:"\FC05"}.mdi-alpha-v::before{content:"\56"}.mdi-alpha-v-box::before{content:"\FB02"}.mdi-alpha-v-box-outline::before{content:"\FC06"}.mdi-alpha-v-circle::before{content:"\FC07"}.mdi-alpha-v-circle-outline::before{content:"\FC08"}.mdi-alpha-w::before{content:"\57"}.mdi-alpha-w-box::before{content:"\FB03"}.mdi-alpha-w-box-outline::before{content:"\FC09"}.mdi-alpha-w-circle::before{content:"\FC0A"}.mdi-alpha-w-circle-outline::before{content:"\FC0B"}.mdi-alpha-x::before{content:"\58"}.mdi-alpha-x-box::before{content:"\FB04"}.mdi-alpha-x-box-outline::before{content:"\FC0C"}.mdi-alpha-x-circle::before{content:"\FC0D"}.mdi-alpha-x-circle-outline::before{content:"\FC0E"}.mdi-alpha-y::before{content:"\59"}.mdi-alpha-y-box::before{content:"\FB05"}.mdi-alpha-y-box-outline::before{content:"\FC0F"}.mdi-alpha-y-circle::before{content:"\FC10"}.mdi-alpha-y-circle-outline::before{content:"\FC11"}.mdi-alpha-z::before{content:"\5A"}.mdi-alpha-z-box::before{content:"\FB06"}.mdi-alpha-z-box-outline::before{content:"\FC12"}.mdi-alpha-z-circle::before{content:"\FC13"}.mdi-alpha-z-circle-outline::before{content:"\FC14"}.mdi-alphabet-aurebesh::before{content:"\F0357"}.mdi-alphabet-cyrillic::before{content:"\F0358"}.mdi-alphabet-greek::before{content:"\F0359"}.mdi-alphabet-latin::before{content:"\F035A"}.mdi-alphabet-piqad::before{content:"\F035B"}.mdi-alphabet-tengwar::before{content:"\F0362"}.mdi-alphabetical::before{content:"\F02C"}.mdi-alphabetical-off::before{content:"\F002E"}.mdi-alphabetical-variant::before{content:"\F002F"}.mdi-alphabetical-variant-off::before{content:"\F0030"}.mdi-altimeter::before{content:"\F5D7"}.mdi-amazon::before{content:"\F02D"}.mdi-amazon-alexa::before{content:"\F8C5"}.mdi-amazon-drive::before{content:"\F02E"}.mdi-ambulance::before{content:"\F02F"}.mdi-ammunition::before{content:"\FCC4"}.mdi-ampersand::before{content:"\FA8C"}.mdi-amplifier::before{content:"\F030"}.mdi-amplifier-off::before{content:"\F01E0"}.mdi-anchor::before{content:"\F031"}.mdi-android::before{content:"\F032"}.mdi-android-auto::before{content:"\FA8D"}.mdi-android-debug-bridge::before{content:"\F033"}.mdi-android-head::before{content:"\F78F"}.mdi-android-messages::before{content:"\FD21"}.mdi-android-studio::before{content:"\F034"}.mdi-angle-acute::before{content:"\F936"}.mdi-angle-obtuse::before{content:"\F937"}.mdi-angle-right::before{content:"\F938"}.mdi-angular::before{content:"\F6B1"}.mdi-angularjs::before{content:"\F6BE"}.mdi-animation::before{content:"\F5D8"}.mdi-animation-outline::before{content:"\FA8E"}.mdi-animation-play::before{content:"\F939"}.mdi-animation-play-outline::before{content:"\FA8F"}.mdi-ansible::before{content:"\F00C5"}.mdi-antenna::before{content:"\F0144"}.mdi-anvil::before{content:"\F89A"}.mdi-apache-kafka::before{content:"\F0031"}.mdi-api::before{content:"\F00C6"}.mdi-api-off::before{content:"\F0282"}.mdi-apple::before{content:"\F035"}.mdi-apple-finder::before{content:"\F036"}.mdi-apple-icloud::before{content:"\F038"}.mdi-apple-ios::before{content:"\F037"}.mdi-apple-keyboard-caps::before{content:"\F632"}.mdi-apple-keyboard-command::before{content:"\F633"}.mdi-apple-keyboard-control::before{content:"\F634"}.mdi-apple-keyboard-option::before{content:"\F635"}.mdi-apple-keyboard-shift::before{content:"\F636"}.mdi-apple-safari::before{content:"\F039"}.mdi-application::before{content:"\F614"}.mdi-application-export::before{content:"\FD89"}.mdi-application-import::before{content:"\FD8A"}.mdi-approximately-equal::before{content:"\FFBE"}.mdi-approximately-equal-box::before{content:"\FFBF"}.mdi-apps::before{content:"\F03B"}.mdi-apps-box::before{content:"\FD22"}.mdi-arch::before{content:"\F8C6"}.mdi-archive::before{content:"\F03C"}.mdi-archive-arrow-down::before{content:"\F0284"}.mdi-archive-arrow-down-outline::before{content:"\F0285"}.mdi-archive-arrow-up::before{content:"\F0286"}.mdi-archive-arrow-up-outline::before{content:"\F0287"}.mdi-archive-outline::before{content:"\F0239"}.mdi-arm-flex::before{content:"\F008F"}.mdi-arm-flex-outline::before{content:"\F0090"}.mdi-arrange-bring-forward::before{content:"\F03D"}.mdi-arrange-bring-to-front::before{content:"\F03E"}.mdi-arrange-send-backward::before{content:"\F03F"}.mdi-arrange-send-to-back::before{content:"\F040"}.mdi-arrow-all::before{content:"\F041"}.mdi-arrow-bottom-left::before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline::before{content:"\F9B6"}.mdi-arrow-bottom-left-thick::before{content:"\F9B7"}.mdi-arrow-bottom-right::before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline::before{content:"\F9B8"}.mdi-arrow-bottom-right-thick::before{content:"\F9B9"}.mdi-arrow-collapse::before{content:"\F615"}.mdi-arrow-collapse-all::before{content:"\F044"}.mdi-arrow-collapse-down::before{content:"\F791"}.mdi-arrow-collapse-horizontal::before{content:"\F84B"}.mdi-arrow-collapse-left::before{content:"\F792"}.mdi-arrow-collapse-right::before{content:"\F793"}.mdi-arrow-collapse-up::before{content:"\F794"}.mdi-arrow-collapse-vertical::before{content:"\F84C"}.mdi-arrow-decision::before{content:"\F9BA"}.mdi-arrow-decision-auto::before{content:"\F9BB"}.mdi-arrow-decision-auto-outline::before{content:"\F9BC"}.mdi-arrow-decision-outline::before{content:"\F9BD"}.mdi-arrow-down::before{content:"\F045"}.mdi-arrow-down-bold::before{content:"\F72D"}.mdi-arrow-down-bold-box::before{content:"\F72E"}.mdi-arrow-down-bold-box-outline::before{content:"\F72F"}.mdi-arrow-down-bold-circle::before{content:"\F047"}.mdi-arrow-down-bold-circle-outline::before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline::before{content:"\F049"}.mdi-arrow-down-bold-outline::before{content:"\F9BE"}.mdi-arrow-down-box::before{content:"\F6BF"}.mdi-arrow-down-circle::before{content:"\FCB7"}.mdi-arrow-down-circle-outline::before{content:"\FCB8"}.mdi-arrow-down-drop-circle::before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline::before{content:"\F04B"}.mdi-arrow-down-thick::before{content:"\F046"}.mdi-arrow-expand::before{content:"\F616"}.mdi-arrow-expand-all::before{content:"\F04C"}.mdi-arrow-expand-down::before{content:"\F795"}.mdi-arrow-expand-horizontal::before{content:"\F84D"}.mdi-arrow-expand-left::before{content:"\F796"}.mdi-arrow-expand-right::before{content:"\F797"}.mdi-arrow-expand-up::before{content:"\F798"}.mdi-arrow-expand-vertical::before{content:"\F84E"}.mdi-arrow-horizontal-lock::before{content:"\F0186"}.mdi-arrow-left::before{content:"\F04D"}.mdi-arrow-left-bold::before{content:"\F730"}.mdi-arrow-left-bold-box::before{content:"\F731"}.mdi-arrow-left-bold-box-outline::before{content:"\F732"}.mdi-arrow-left-bold-circle::before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline::before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline::before{content:"\F051"}.mdi-arrow-left-bold-outline::before{content:"\F9BF"}.mdi-arrow-left-box::before{content:"\F6C0"}.mdi-arrow-left-circle::before{content:"\FCB9"}.mdi-arrow-left-circle-outline::before{content:"\FCBA"}.mdi-arrow-left-drop-circle::before{content:"\F052"}.mdi-arrow-left-drop-circle-outline::before{content:"\F053"}.mdi-arrow-left-right::before{content:"\FE90"}.mdi-arrow-left-right-bold::before{content:"\FE91"}.mdi-arrow-left-right-bold-outline::before{content:"\F9C0"}.mdi-arrow-left-thick::before{content:"\F04E"}.mdi-arrow-right::before{content:"\F054"}.mdi-arrow-right-bold::before{content:"\F733"}.mdi-arrow-right-bold-box::before{content:"\F734"}.mdi-arrow-right-bold-box-outline::before{content:"\F735"}.mdi-arrow-right-bold-circle::before{content:"\F056"}.mdi-arrow-right-bold-circle-outline::before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline::before{content:"\F058"}.mdi-arrow-right-bold-outline::before{content:"\F9C1"}.mdi-arrow-right-box::before{content:"\F6C1"}.mdi-arrow-right-circle::before{content:"\FCBB"}.mdi-arrow-right-circle-outline::before{content:"\FCBC"}.mdi-arrow-right-drop-circle::before{content:"\F059"}.mdi-arrow-right-drop-circle-outline::before{content:"\F05A"}.mdi-arrow-right-thick::before{content:"\F055"}.mdi-arrow-split-horizontal::before{content:"\F93A"}.mdi-arrow-split-vertical::before{content:"\F93B"}.mdi-arrow-top-left::before{content:"\F05B"}.mdi-arrow-top-left-bold-outline::before{content:"\F9C2"}.mdi-arrow-top-left-bottom-right::before{content:"\FE92"}.mdi-arrow-top-left-bottom-right-bold::before{content:"\FE93"}.mdi-arrow-top-left-thick::before{content:"\F9C3"}.mdi-arrow-top-right::before{content:"\F05C"}.mdi-arrow-top-right-bold-outline::before{content:"\F9C4"}.mdi-arrow-top-right-bottom-left::before{content:"\FE94"}.mdi-arrow-top-right-bottom-left-bold::before{content:"\FE95"}.mdi-arrow-top-right-thick::before{content:"\F9C5"}.mdi-arrow-up::before{content:"\F05D"}.mdi-arrow-up-bold::before{content:"\F736"}.mdi-arrow-up-bold-box::before{content:"\F737"}.mdi-arrow-up-bold-box-outline::before{content:"\F738"}.mdi-arrow-up-bold-circle::before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline::before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline::before{content:"\F061"}.mdi-arrow-up-bold-outline::before{content:"\F9C6"}.mdi-arrow-up-box::before{content:"\F6C2"}.mdi-arrow-up-circle::before{content:"\FCBD"}.mdi-arrow-up-circle-outline::before{content:"\FCBE"}.mdi-arrow-up-down::before{content:"\FE96"}.mdi-arrow-up-down-bold::before{content:"\FE97"}.mdi-arrow-up-down-bold-outline::before{content:"\F9C7"}.mdi-arrow-up-drop-circle::before{content:"\F062"}.mdi-arrow-up-drop-circle-outline::before{content:"\F063"}.mdi-arrow-up-thick::before{content:"\F05E"}.mdi-arrow-vertical-lock::before{content:"\F0187"}.mdi-artist::before{content:"\F802"}.mdi-artist-outline::before{content:"\FCC5"}.mdi-artstation::before{content:"\FB37"}.mdi-aspect-ratio::before{content:"\FA23"}.mdi-assistant::before{content:"\F064"}.mdi-asterisk::before{content:"\F6C3"}.mdi-at::before{content:"\F065"}.mdi-atlassian::before{content:"\F803"}.mdi-atm::before{content:"\FD23"}.mdi-atom::before{content:"\F767"}.mdi-atom-variant::before{content:"\FE98"}.mdi-attachment::before{content:"\F066"}.mdi-audio-video::before{content:"\F93C"}.mdi-audio-video-off::before{content:"\F01E1"}.mdi-audiobook::before{content:"\F067"}.mdi-augmented-reality::before{content:"\F84F"}.mdi-auto-download::before{content:"\F03A9"}.mdi-auto-fix::before{content:"\F068"}.mdi-auto-upload::before{content:"\F069"}.mdi-autorenew::before{content:"\F06A"}.mdi-av-timer::before{content:"\F06B"}.mdi-aws::before{content:"\FDF2"}.mdi-axe::before{content:"\F8C7"}.mdi-axis::before{content:"\FD24"}.mdi-axis-arrow::before{content:"\FD25"}.mdi-axis-arrow-lock::before{content:"\FD26"}.mdi-axis-lock::before{content:"\FD27"}.mdi-axis-x-arrow::before{content:"\FD28"}.mdi-axis-x-arrow-lock::before{content:"\FD29"}.mdi-axis-x-rotate-clockwise::before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise::before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock::before{content:"\FD2C"}.mdi-axis-y-arrow::before{content:"\FD2D"}.mdi-axis-y-arrow-lock::before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise::before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise::before{content:"\FD30"}.mdi-axis-z-arrow::before{content:"\FD31"}.mdi-axis-z-arrow-lock::before{content:"\FD32"}.mdi-axis-z-rotate-clockwise::before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise::before{content:"\FD34"}.mdi-azure::before{content:"\F804"}.mdi-azure-devops::before{content:"\F0091"}.mdi-babel::before{content:"\FA24"}.mdi-baby::before{content:"\F06C"}.mdi-baby-bottle::before{content:"\FF56"}.mdi-baby-bottle-outline::before{content:"\FF57"}.mdi-baby-carriage::before{content:"\F68E"}.mdi-baby-carriage-off::before{content:"\FFC0"}.mdi-baby-face::before{content:"\FE99"}.mdi-baby-face-outline::before{content:"\FE9A"}.mdi-backburger::before{content:"\F06D"}.mdi-backspace::before{content:"\F06E"}.mdi-backspace-outline::before{content:"\FB38"}.mdi-backspace-reverse::before{content:"\FE9B"}.mdi-backspace-reverse-outline::before{content:"\FE9C"}.mdi-backup-restore::before{content:"\F06F"}.mdi-bacteria::before{content:"\FEF2"}.mdi-bacteria-outline::before{content:"\FEF3"}.mdi-badminton::before{content:"\F850"}.mdi-bag-carry-on::before{content:"\FF58"}.mdi-bag-carry-on-check::before{content:"\FD41"}.mdi-bag-carry-on-off::before{content:"\FF59"}.mdi-bag-checked::before{content:"\FF5A"}.mdi-bag-personal::before{content:"\FDF3"}.mdi-bag-personal-off::before{content:"\FDF4"}.mdi-bag-personal-off-outline::before{content:"\FDF5"}.mdi-bag-personal-outline::before{content:"\FDF6"}.mdi-baguette::before{content:"\FF5B"}.mdi-balloon::before{content:"\FA25"}.mdi-ballot::before{content:"\F9C8"}.mdi-ballot-outline::before{content:"\F9C9"}.mdi-ballot-recount::before{content:"\FC15"}.mdi-ballot-recount-outline::before{content:"\FC16"}.mdi-bandage::before{content:"\FD8B"}.mdi-bandcamp::before{content:"\F674"}.mdi-bank::before{content:"\F070"}.mdi-bank-minus::before{content:"\FD8C"}.mdi-bank-outline::before{content:"\FE9D"}.mdi-bank-plus::before{content:"\FD8D"}.mdi-bank-remove::before{content:"\FD8E"}.mdi-bank-transfer::before{content:"\FA26"}.mdi-bank-transfer-in::before{content:"\FA27"}.mdi-bank-transfer-out::before{content:"\FA28"}.mdi-barcode::before{content:"\F071"}.mdi-barcode-off::before{content:"\F0261"}.mdi-barcode-scan::before{content:"\F072"}.mdi-barley::before{content:"\F073"}.mdi-barley-off::before{content:"\FB39"}.mdi-barn::before{content:"\FB3A"}.mdi-barrel::before{content:"\F074"}.mdi-baseball::before{content:"\F851"}.mdi-baseball-bat::before{content:"\F852"}.mdi-basecamp::before{content:"\F075"}.mdi-bash::before{content:"\F01AE"}.mdi-basket::before{content:"\F076"}.mdi-basket-fill::before{content:"\F077"}.mdi-basket-outline::before{content:"\F01AC"}.mdi-basket-unfill::before{content:"\F078"}.mdi-basketball::before{content:"\F805"}.mdi-basketball-hoop::before{content:"\FC17"}.mdi-basketball-hoop-outline::before{content:"\FC18"}.mdi-bat::before{content:"\FB3B"}.mdi-battery::before{content:"\F079"}.mdi-battery-10::before{content:"\F07A"}.mdi-battery-10-bluetooth::before{content:"\F93D"}.mdi-battery-20::before{content:"\F07B"}.mdi-battery-20-bluetooth::before{content:"\F93E"}.mdi-battery-30::before{content:"\F07C"}.mdi-battery-30-bluetooth::before{content:"\F93F"}.mdi-battery-40::before{content:"\F07D"}.mdi-battery-40-bluetooth::before{content:"\F940"}.mdi-battery-50::before{content:"\F07E"}.mdi-battery-50-bluetooth::before{content:"\F941"}.mdi-battery-60::before{content:"\F07F"}.mdi-battery-60-bluetooth::before{content:"\F942"}.mdi-battery-70::before{content:"\F080"}.mdi-battery-70-bluetooth::before{content:"\F943"}.mdi-battery-80::before{content:"\F081"}.mdi-battery-80-bluetooth::before{content:"\F944"}.mdi-battery-90::before{content:"\F082"}.mdi-battery-90-bluetooth::before{content:"\F945"}.mdi-battery-alert::before{content:"\F083"}.mdi-battery-alert-bluetooth::before{content:"\F946"}.mdi-battery-alert-variant::before{content:"\F00F7"}.mdi-battery-alert-variant-outline::before{content:"\F00F8"}.mdi-battery-bluetooth::before{content:"\F947"}.mdi-battery-bluetooth-variant::before{content:"\F948"}.mdi-battery-charging::before{content:"\F084"}.mdi-battery-charging-10::before{content:"\F89B"}.mdi-battery-charging-100::before{content:"\F085"}.mdi-battery-charging-20::before{content:"\F086"}.mdi-battery-charging-30::before{content:"\F087"}.mdi-battery-charging-40::before{content:"\F088"}.mdi-battery-charging-50::before{content:"\F89C"}.mdi-battery-charging-60::before{content:"\F089"}.mdi-battery-charging-70::before{content:"\F89D"}.mdi-battery-charging-80::before{content:"\F08A"}.mdi-battery-charging-90::before{content:"\F08B"}.mdi-battery-charging-high::before{content:"\F02D1"}.mdi-battery-charging-low::before{content:"\F02CF"}.mdi-battery-charging-medium::before{content:"\F02D0"}.mdi-battery-charging-outline::before{content:"\F89E"}.mdi-battery-charging-wireless::before{content:"\F806"}.mdi-battery-charging-wireless-10::before{content:"\F807"}.mdi-battery-charging-wireless-20::before{content:"\F808"}.mdi-battery-charging-wireless-30::before{content:"\F809"}.mdi-battery-charging-wireless-40::before{content:"\F80A"}.mdi-battery-charging-wireless-50::before{content:"\F80B"}.mdi-battery-charging-wireless-60::before{content:"\F80C"}.mdi-battery-charging-wireless-70::before{content:"\F80D"}.mdi-battery-charging-wireless-80::before{content:"\F80E"}.mdi-battery-charging-wireless-90::before{content:"\F80F"}.mdi-battery-charging-wireless-alert::before{content:"\F810"}.mdi-battery-charging-wireless-outline::before{content:"\F811"}.mdi-battery-heart::before{content:"\F023A"}.mdi-battery-heart-outline::before{content:"\F023B"}.mdi-battery-heart-variant::before{content:"\F023C"}.mdi-battery-high::before{content:"\F02CE"}.mdi-battery-low::before{content:"\F02CC"}.mdi-battery-medium::before{content:"\F02CD"}.mdi-battery-minus::before{content:"\F08C"}.mdi-battery-negative::before{content:"\F08D"}.mdi-battery-off::before{content:"\F0288"}.mdi-battery-off-outline::before{content:"\F0289"}.mdi-battery-outline::before{content:"\F08E"}.mdi-battery-plus::before{content:"\F08F"}.mdi-battery-positive::before{content:"\F090"}.mdi-battery-unknown::before{content:"\F091"}.mdi-battery-unknown-bluetooth::before{content:"\F949"}.mdi-battlenet::before{content:"\FB3C"}.mdi-beach::before{content:"\F092"}.mdi-beaker::before{content:"\FCC6"}.mdi-beaker-alert::before{content:"\F0254"}.mdi-beaker-alert-outline::before{content:"\F0255"}.mdi-beaker-check::before{content:"\F0256"}.mdi-beaker-check-outline::before{content:"\F0257"}.mdi-beaker-minus::before{content:"\F0258"}.mdi-beaker-minus-outline::before{content:"\F0259"}.mdi-beaker-outline::before{content:"\F68F"}.mdi-beaker-plus::before{content:"\F025A"}.mdi-beaker-plus-outline::before{content:"\F025B"}.mdi-beaker-question::before{content:"\F025C"}.mdi-beaker-question-outline::before{content:"\F025D"}.mdi-beaker-remove::before{content:"\F025E"}.mdi-beaker-remove-outline::before{content:"\F025F"}.mdi-beats::before{content:"\F097"}.mdi-bed-double::before{content:"\F0092"}.mdi-bed-double-outline::before{content:"\F0093"}.mdi-bed-empty::before{content:"\F89F"}.mdi-bed-king::before{content:"\F0094"}.mdi-bed-king-outline::before{content:"\F0095"}.mdi-bed-queen::before{content:"\F0096"}.mdi-bed-queen-outline::before{content:"\F0097"}.mdi-bed-single::before{content:"\F0098"}.mdi-bed-single-outline::before{content:"\F0099"}.mdi-bee::before{content:"\FFC1"}.mdi-bee-flower::before{content:"\FFC2"}.mdi-beehive-outline::before{content:"\F00F9"}.mdi-beer::before{content:"\F098"}.mdi-beer-outline::before{content:"\F0337"}.mdi-behance::before{content:"\F099"}.mdi-bell::before{content:"\F09A"}.mdi-bell-alert::before{content:"\FD35"}.mdi-bell-alert-outline::before{content:"\FE9E"}.mdi-bell-check::before{content:"\F0210"}.mdi-bell-check-outline::before{content:"\F0211"}.mdi-bell-circle::before{content:"\FD36"}.mdi-bell-circle-outline::before{content:"\FD37"}.mdi-bell-off::before{content:"\F09B"}.mdi-bell-off-outline::before{content:"\FA90"}.mdi-bell-outline::before{content:"\F09C"}.mdi-bell-plus::before{content:"\F09D"}.mdi-bell-plus-outline::before{content:"\FA91"}.mdi-bell-ring::before{content:"\F09E"}.mdi-bell-ring-outline::before{content:"\F09F"}.mdi-bell-sleep::before{content:"\F0A0"}.mdi-bell-sleep-outline::before{content:"\FA92"}.mdi-beta::before{content:"\F0A1"}.mdi-betamax::before{content:"\F9CA"}.mdi-biathlon::before{content:"\FDF7"}.mdi-bible::before{content:"\F0A2"}.mdi-bicycle::before{content:"\F00C7"}.mdi-bicycle-basket::before{content:"\F0260"}.mdi-bike::before{content:"\F0A3"}.mdi-bike-fast::before{content:"\F014A"}.mdi-billboard::before{content:"\F0032"}.mdi-billiards::before{content:"\FB3D"}.mdi-billiards-rack::before{content:"\FB3E"}.mdi-bing::before{content:"\F0A4"}.mdi-binoculars::before{content:"\F0A5"}.mdi-bio::before{content:"\F0A6"}.mdi-biohazard::before{content:"\F0A7"}.mdi-bitbucket::before{content:"\F0A8"}.mdi-bitcoin::before{content:"\F812"}.mdi-black-mesa::before{content:"\F0A9"}.mdi-blackberry::before{content:"\F0AA"}.mdi-blender::before{content:"\FCC7"}.mdi-blender-software::before{content:"\F0AB"}.mdi-blinds::before{content:"\F0AC"}.mdi-blinds-open::before{content:"\F0033"}.mdi-block-helper::before{content:"\F0AD"}.mdi-blogger::before{content:"\F0AE"}.mdi-blood-bag::before{content:"\FCC8"}.mdi-bluetooth::before{content:"\F0AF"}.mdi-bluetooth-audio::before{content:"\F0B0"}.mdi-bluetooth-connect::before{content:"\F0B1"}.mdi-bluetooth-off::before{content:"\F0B2"}.mdi-bluetooth-settings::before{content:"\F0B3"}.mdi-bluetooth-transfer::before{content:"\F0B4"}.mdi-blur::before{content:"\F0B5"}.mdi-blur-linear::before{content:"\F0B6"}.mdi-blur-off::before{content:"\F0B7"}.mdi-blur-radial::before{content:"\F0B8"}.mdi-bolnisi-cross::before{content:"\FCC9"}.mdi-bolt::before{content:"\FD8F"}.mdi-bomb::before{content:"\F690"}.mdi-bomb-off::before{content:"\F6C4"}.mdi-bone::before{content:"\F0B9"}.mdi-book::before{content:"\F0BA"}.mdi-book-information-variant::before{content:"\F009A"}.mdi-book-lock::before{content:"\F799"}.mdi-book-lock-open::before{content:"\F79A"}.mdi-book-minus::before{content:"\F5D9"}.mdi-book-minus-multiple::before{content:"\FA93"}.mdi-book-multiple::before{content:"\F0BB"}.mdi-book-open::before{content:"\F0BD"}.mdi-book-open-outline::before{content:"\FB3F"}.mdi-book-open-page-variant::before{content:"\F5DA"}.mdi-book-open-variant::before{content:"\F0BE"}.mdi-book-outline::before{content:"\FB40"}.mdi-book-play::before{content:"\FE9F"}.mdi-book-play-outline::before{content:"\FEA0"}.mdi-book-plus::before{content:"\F5DB"}.mdi-book-plus-multiple::before{content:"\FA94"}.mdi-book-remove::before{content:"\FA96"}.mdi-book-remove-multiple::before{content:"\FA95"}.mdi-book-search::before{content:"\FEA1"}.mdi-book-search-outline::before{content:"\FEA2"}.mdi-book-variant::before{content:"\F0BF"}.mdi-book-variant-multiple::before{content:"\F0BC"}.mdi-bookmark::before{content:"\F0C0"}.mdi-bookmark-check::before{content:"\F0C1"}.mdi-bookmark-check-outline::before{content:"\F03A6"}.mdi-bookmark-minus::before{content:"\F9CB"}.mdi-bookmark-minus-outline::before{content:"\F9CC"}.mdi-bookmark-multiple::before{content:"\FDF8"}.mdi-bookmark-multiple-outline::before{content:"\FDF9"}.mdi-bookmark-music::before{content:"\F0C2"}.mdi-bookmark-music-outline::before{content:"\F03A4"}.mdi-bookmark-off::before{content:"\F9CD"}.mdi-bookmark-off-outline::before{content:"\F9CE"}.mdi-bookmark-outline::before{content:"\F0C3"}.mdi-bookmark-plus::before{content:"\F0C5"}.mdi-bookmark-plus-outline::before{content:"\F0C4"}.mdi-bookmark-remove::before{content:"\F0C6"}.mdi-bookmark-remove-outline::before{content:"\F03A5"}.mdi-bookshelf::before{content:"\F028A"}.mdi-boom-gate::before{content:"\FEA3"}.mdi-boom-gate-alert::before{content:"\FEA4"}.mdi-boom-gate-alert-outline::before{content:"\FEA5"}.mdi-boom-gate-down::before{content:"\FEA6"}.mdi-boom-gate-down-outline::before{content:"\FEA7"}.mdi-boom-gate-outline::before{content:"\FEA8"}.mdi-boom-gate-up::before{content:"\FEA9"}.mdi-boom-gate-up-outline::before{content:"\FEAA"}.mdi-boombox::before{content:"\F5DC"}.mdi-boomerang::before{content:"\F00FA"}.mdi-bootstrap::before{content:"\F6C5"}.mdi-border-all::before{content:"\F0C7"}.mdi-border-all-variant::before{content:"\F8A0"}.mdi-border-bottom::before{content:"\F0C8"}.mdi-border-bottom-variant::before{content:"\F8A1"}.mdi-border-color::before{content:"\F0C9"}.mdi-border-horizontal::before{content:"\F0CA"}.mdi-border-inside::before{content:"\F0CB"}.mdi-border-left::before{content:"\F0CC"}.mdi-border-left-variant::before{content:"\F8A2"}.mdi-border-none::before{content:"\F0CD"}.mdi-border-none-variant::before{content:"\F8A3"}.mdi-border-outside::before{content:"\F0CE"}.mdi-border-right::before{content:"\F0CF"}.mdi-border-right-variant::before{content:"\F8A4"}.mdi-border-style::before{content:"\F0D0"}.mdi-border-top::before{content:"\F0D1"}.mdi-border-top-variant::before{content:"\F8A5"}.mdi-border-vertical::before{content:"\F0D2"}.mdi-bottle-soda::before{content:"\F009B"}.mdi-bottle-soda-classic::before{content:"\F009C"}.mdi-bottle-soda-classic-outline::before{content:"\F038E"}.mdi-bottle-soda-outline::before{content:"\F009D"}.mdi-bottle-tonic::before{content:"\F0159"}.mdi-bottle-tonic-outline::before{content:"\F015A"}.mdi-bottle-tonic-plus::before{content:"\F015B"}.mdi-bottle-tonic-plus-outline::before{content:"\F015C"}.mdi-bottle-tonic-skull::before{content:"\F015D"}.mdi-bottle-tonic-skull-outline::before{content:"\F015E"}.mdi-bottle-wine::before{content:"\F853"}.mdi-bottle-wine-outline::before{content:"\F033B"}.mdi-bow-tie::before{content:"\F677"}.mdi-bowl::before{content:"\F617"}.mdi-bowling::before{content:"\F0D3"}.mdi-box::before{content:"\F0D4"}.mdi-box-cutter::before{content:"\F0D5"}.mdi-box-shadow::before{content:"\F637"}.mdi-boxing-glove::before{content:"\FB41"}.mdi-braille::before{content:"\F9CF"}.mdi-brain::before{content:"\F9D0"}.mdi-bread-slice::before{content:"\FCCA"}.mdi-bread-slice-outline::before{content:"\FCCB"}.mdi-bridge::before{content:"\F618"}.mdi-briefcase::before{content:"\F0D6"}.mdi-briefcase-account::before{content:"\FCCC"}.mdi-briefcase-account-outline::before{content:"\FCCD"}.mdi-briefcase-check::before{content:"\F0D7"}.mdi-briefcase-check-outline::before{content:"\F0349"}.mdi-briefcase-clock::before{content:"\F00FB"}.mdi-briefcase-clock-outline::before{content:"\F00FC"}.mdi-briefcase-download::before{content:"\F0D8"}.mdi-briefcase-download-outline::before{content:"\FC19"}.mdi-briefcase-edit::before{content:"\FA97"}.mdi-briefcase-edit-outline::before{content:"\FC1A"}.mdi-briefcase-minus::before{content:"\FA29"}.mdi-briefcase-minus-outline::before{content:"\FC1B"}.mdi-briefcase-outline::before{content:"\F813"}.mdi-briefcase-plus::before{content:"\FA2A"}.mdi-briefcase-plus-outline::before{content:"\FC1C"}.mdi-briefcase-remove::before{content:"\FA2B"}.mdi-briefcase-remove-outline::before{content:"\FC1D"}.mdi-briefcase-search::before{content:"\FA2C"}.mdi-briefcase-search-outline::before{content:"\FC1E"}.mdi-briefcase-upload::before{content:"\F0D9"}.mdi-briefcase-upload-outline::before{content:"\FC1F"}.mdi-brightness-1::before{content:"\F0DA"}.mdi-brightness-2::before{content:"\F0DB"}.mdi-brightness-3::before{content:"\F0DC"}.mdi-brightness-4::before{content:"\F0DD"}.mdi-brightness-5::before{content:"\F0DE"}.mdi-brightness-6::before{content:"\F0DF"}.mdi-brightness-7::before{content:"\F0E0"}.mdi-brightness-auto::before{content:"\F0E1"}.mdi-brightness-percent::before{content:"\FCCE"}.mdi-broom::before{content:"\F0E2"}.mdi-brush::before{content:"\F0E3"}.mdi-buddhism::before{content:"\F94A"}.mdi-buffer::before{content:"\F619"}.mdi-bug::before{content:"\F0E4"}.mdi-bug-check::before{content:"\FA2D"}.mdi-bug-check-outline::before{content:"\FA2E"}.mdi-bug-outline::before{content:"\FA2F"}.mdi-bugle::before{content:"\FD90"}.mdi-bulldozer::before{content:"\FB07"}.mdi-bullet::before{content:"\FCCF"}.mdi-bulletin-board::before{content:"\F0E5"}.mdi-bullhorn::before{content:"\F0E6"}.mdi-bullhorn-outline::before{content:"\FB08"}.mdi-bullseye::before{content:"\F5DD"}.mdi-bullseye-arrow::before{content:"\F8C8"}.mdi-bulma::before{content:"\F0312"}.mdi-bunk-bed::before{content:"\F032D"}.mdi-bus::before{content:"\F0E7"}.mdi-bus-alert::before{content:"\FA98"}.mdi-bus-articulated-end::before{content:"\F79B"}.mdi-bus-articulated-front::before{content:"\F79C"}.mdi-bus-clock::before{content:"\F8C9"}.mdi-bus-double-decker::before{content:"\F79D"}.mdi-bus-marker::before{content:"\F023D"}.mdi-bus-multiple::before{content:"\FF5C"}.mdi-bus-school::before{content:"\F79E"}.mdi-bus-side::before{content:"\F79F"}.mdi-bus-stop::before{content:"\F0034"}.mdi-bus-stop-covered::before{content:"\F0035"}.mdi-bus-stop-uncovered::before{content:"\F0036"}.mdi-cached::before{content:"\F0E8"}.mdi-cactus::before{content:"\FD91"}.mdi-cake::before{content:"\F0E9"}.mdi-cake-layered::before{content:"\F0EA"}.mdi-cake-variant::before{content:"\F0EB"}.mdi-calculator::before{content:"\F0EC"}.mdi-calculator-variant::before{content:"\FA99"}.mdi-calendar::before{content:"\F0ED"}.mdi-calendar-account::before{content:"\FEF4"}.mdi-calendar-account-outline::before{content:"\FEF5"}.mdi-calendar-alert::before{content:"\FA30"}.mdi-calendar-arrow-left::before{content:"\F015F"}.mdi-calendar-arrow-right::before{content:"\F0160"}.mdi-calendar-blank::before{content:"\F0EE"}.mdi-calendar-blank-multiple::before{content:"\F009E"}.mdi-calendar-blank-outline::before{content:"\FB42"}.mdi-calendar-check::before{content:"\F0EF"}.mdi-calendar-check-outline::before{content:"\FC20"}.mdi-calendar-clock::before{content:"\F0F0"}.mdi-calendar-edit::before{content:"\F8A6"}.mdi-calendar-export::before{content:"\FB09"}.mdi-calendar-heart::before{content:"\F9D1"}.mdi-calendar-import::before{content:"\FB0A"}.mdi-calendar-minus::before{content:"\FD38"}.mdi-calendar-month::before{content:"\FDFA"}.mdi-calendar-month-outline::before{content:"\FDFB"}.mdi-calendar-multiple::before{content:"\F0F1"}.mdi-calendar-multiple-check::before{content:"\F0F2"}.mdi-calendar-multiselect::before{content:"\FA31"}.mdi-calendar-outline::before{content:"\FB43"}.mdi-calendar-plus::before{content:"\F0F3"}.mdi-calendar-question::before{content:"\F691"}.mdi-calendar-range::before{content:"\F678"}.mdi-calendar-range-outline::before{content:"\FB44"}.mdi-calendar-remove::before{content:"\F0F4"}.mdi-calendar-remove-outline::before{content:"\FC21"}.mdi-calendar-repeat::before{content:"\FEAB"}.mdi-calendar-repeat-outline::before{content:"\FEAC"}.mdi-calendar-search::before{content:"\F94B"}.mdi-calendar-star::before{content:"\F9D2"}.mdi-calendar-text::before{content:"\F0F5"}.mdi-calendar-text-outline::before{content:"\FC22"}.mdi-calendar-today::before{content:"\F0F6"}.mdi-calendar-week::before{content:"\FA32"}.mdi-calendar-week-begin::before{content:"\FA33"}.mdi-calendar-weekend::before{content:"\FEF6"}.mdi-calendar-weekend-outline::before{content:"\FEF7"}.mdi-call-made::before{content:"\F0F7"}.mdi-call-merge::before{content:"\F0F8"}.mdi-call-missed::before{content:"\F0F9"}.mdi-call-received::before{content:"\F0FA"}.mdi-call-split::before{content:"\F0FB"}.mdi-camcorder::before{content:"\F0FC"}.mdi-camcorder-box::before{content:"\F0FD"}.mdi-camcorder-box-off::before{content:"\F0FE"}.mdi-camcorder-off::before{content:"\F0FF"}.mdi-camera::before{content:"\F100"}.mdi-camera-account::before{content:"\F8CA"}.mdi-camera-burst::before{content:"\F692"}.mdi-camera-control::before{content:"\FB45"}.mdi-camera-enhance::before{content:"\F101"}.mdi-camera-enhance-outline::before{content:"\FB46"}.mdi-camera-front::before{content:"\F102"}.mdi-camera-front-variant::before{content:"\F103"}.mdi-camera-gopro::before{content:"\F7A0"}.mdi-camera-image::before{content:"\F8CB"}.mdi-camera-iris::before{content:"\F104"}.mdi-camera-metering-center::before{content:"\F7A1"}.mdi-camera-metering-matrix::before{content:"\F7A2"}.mdi-camera-metering-partial::before{content:"\F7A3"}.mdi-camera-metering-spot::before{content:"\F7A4"}.mdi-camera-off::before{content:"\F5DF"}.mdi-camera-outline::before{content:"\FD39"}.mdi-camera-party-mode::before{content:"\F105"}.mdi-camera-plus::before{content:"\FEF8"}.mdi-camera-plus-outline::before{content:"\FEF9"}.mdi-camera-rear::before{content:"\F106"}.mdi-camera-rear-variant::before{content:"\F107"}.mdi-camera-retake::before{content:"\FDFC"}.mdi-camera-retake-outline::before{content:"\FDFD"}.mdi-camera-switch::before{content:"\F108"}.mdi-camera-timer::before{content:"\F109"}.mdi-camera-wireless::before{content:"\FD92"}.mdi-camera-wireless-outline::before{content:"\FD93"}.mdi-campfire::before{content:"\FEFA"}.mdi-cancel::before{content:"\F739"}.mdi-candle::before{content:"\F5E2"}.mdi-candycane::before{content:"\F10A"}.mdi-cannabis::before{content:"\F7A5"}.mdi-caps-lock::before{content:"\FA9A"}.mdi-car::before{content:"\F10B"}.mdi-car-2-plus::before{content:"\F0037"}.mdi-car-3-plus::before{content:"\F0038"}.mdi-car-back::before{content:"\FDFE"}.mdi-car-battery::before{content:"\F10C"}.mdi-car-brake-abs::before{content:"\FC23"}.mdi-car-brake-alert::before{content:"\FC24"}.mdi-car-brake-hold::before{content:"\FD3A"}.mdi-car-brake-parking::before{content:"\FD3B"}.mdi-car-brake-retarder::before{content:"\F0039"}.mdi-car-child-seat::before{content:"\FFC3"}.mdi-car-clutch::before{content:"\F003A"}.mdi-car-connected::before{content:"\F10D"}.mdi-car-convertible::before{content:"\F7A6"}.mdi-car-coolant-level::before{content:"\F003B"}.mdi-car-cruise-control::before{content:"\FD3C"}.mdi-car-defrost-front::before{content:"\FD3D"}.mdi-car-defrost-rear::before{content:"\FD3E"}.mdi-car-door::before{content:"\FB47"}.mdi-car-door-lock::before{content:"\F00C8"}.mdi-car-electric::before{content:"\FB48"}.mdi-car-esp::before{content:"\FC25"}.mdi-car-estate::before{content:"\F7A7"}.mdi-car-hatchback::before{content:"\F7A8"}.mdi-car-info::before{content:"\F01E9"}.mdi-car-key::before{content:"\FB49"}.mdi-car-light-dimmed::before{content:"\FC26"}.mdi-car-light-fog::before{content:"\FC27"}.mdi-car-light-high::before{content:"\FC28"}.mdi-car-limousine::before{content:"\F8CC"}.mdi-car-multiple::before{content:"\FB4A"}.mdi-car-off::before{content:"\FDFF"}.mdi-car-parking-lights::before{content:"\FD3F"}.mdi-car-pickup::before{content:"\F7A9"}.mdi-car-seat::before{content:"\FFC4"}.mdi-car-seat-cooler::before{content:"\FFC5"}.mdi-car-seat-heater::before{content:"\FFC6"}.mdi-car-shift-pattern::before{content:"\FF5D"}.mdi-car-side::before{content:"\F7AA"}.mdi-car-sports::before{content:"\F7AB"}.mdi-car-tire-alert::before{content:"\FC29"}.mdi-car-traction-control::before{content:"\FD40"}.mdi-car-turbocharger::before{content:"\F003C"}.mdi-car-wash::before{content:"\F10E"}.mdi-car-windshield::before{content:"\F003D"}.mdi-car-windshield-outline::before{content:"\F003E"}.mdi-caravan::before{content:"\F7AC"}.mdi-card::before{content:"\FB4B"}.mdi-card-bulleted::before{content:"\FB4C"}.mdi-card-bulleted-off::before{content:"\FB4D"}.mdi-card-bulleted-off-outline::before{content:"\FB4E"}.mdi-card-bulleted-outline::before{content:"\FB4F"}.mdi-card-bulleted-settings::before{content:"\FB50"}.mdi-card-bulleted-settings-outline::before{content:"\FB51"}.mdi-card-outline::before{content:"\FB52"}.mdi-card-plus::before{content:"\F022A"}.mdi-card-plus-outline::before{content:"\F022B"}.mdi-card-search::before{content:"\F009F"}.mdi-card-search-outline::before{content:"\F00A0"}.mdi-card-text::before{content:"\FB53"}.mdi-card-text-outline::before{content:"\FB54"}.mdi-cards::before{content:"\F638"}.mdi-cards-club::before{content:"\F8CD"}.mdi-cards-diamond::before{content:"\F8CE"}.mdi-cards-diamond-outline::before{content:"\F003F"}.mdi-cards-heart::before{content:"\F8CF"}.mdi-cards-outline::before{content:"\F639"}.mdi-cards-playing-outline::before{content:"\F63A"}.mdi-cards-spade::before{content:"\F8D0"}.mdi-cards-variant::before{content:"\F6C6"}.mdi-carrot::before{content:"\F10F"}.mdi-cart::before{content:"\F110"}.mdi-cart-arrow-down::before{content:"\FD42"}.mdi-cart-arrow-right::before{content:"\FC2A"}.mdi-cart-arrow-up::before{content:"\FD43"}.mdi-cart-minus::before{content:"\FD44"}.mdi-cart-off::before{content:"\F66B"}.mdi-cart-outline::before{content:"\F111"}.mdi-cart-plus::before{content:"\F112"}.mdi-cart-remove::before{content:"\FD45"}.mdi-case-sensitive-alt::before{content:"\F113"}.mdi-cash::before{content:"\F114"}.mdi-cash-100::before{content:"\F115"}.mdi-cash-marker::before{content:"\FD94"}.mdi-cash-minus::before{content:"\F028B"}.mdi-cash-multiple::before{content:"\F116"}.mdi-cash-plus::before{content:"\F028C"}.mdi-cash-refund::before{content:"\FA9B"}.mdi-cash-register::before{content:"\FCD0"}.mdi-cash-remove::before{content:"\F028D"}.mdi-cash-usd::before{content:"\F01A1"}.mdi-cash-usd-outline::before{content:"\F117"}.mdi-cassette::before{content:"\F9D3"}.mdi-cast::before{content:"\F118"}.mdi-cast-audio::before{content:"\F0040"}.mdi-cast-connected::before{content:"\F119"}.mdi-cast-education::before{content:"\FE6D"}.mdi-cast-off::before{content:"\F789"}.mdi-castle::before{content:"\F11A"}.mdi-cat::before{content:"\F11B"}.mdi-cctv::before{content:"\F7AD"}.mdi-ceiling-light::before{content:"\F768"}.mdi-cellphone::before{content:"\F11C"}.mdi-cellphone-android::before{content:"\F11D"}.mdi-cellphone-arrow-down::before{content:"\F9D4"}.mdi-cellphone-basic::before{content:"\F11E"}.mdi-cellphone-dock::before{content:"\F11F"}.mdi-cellphone-erase::before{content:"\F94C"}.mdi-cellphone-information::before{content:"\FF5E"}.mdi-cellphone-iphone::before{content:"\F120"}.mdi-cellphone-key::before{content:"\F94D"}.mdi-cellphone-link::before{content:"\F121"}.mdi-cellphone-link-off::before{content:"\F122"}.mdi-cellphone-lock::before{content:"\F94E"}.mdi-cellphone-message::before{content:"\F8D2"}.mdi-cellphone-message-off::before{content:"\F00FD"}.mdi-cellphone-nfc::before{content:"\FEAD"}.mdi-cellphone-nfc-off::before{content:"\F0303"}.mdi-cellphone-off::before{content:"\F94F"}.mdi-cellphone-play::before{content:"\F0041"}.mdi-cellphone-screenshot::before{content:"\FA34"}.mdi-cellphone-settings::before{content:"\F123"}.mdi-cellphone-settings-variant::before{content:"\F950"}.mdi-cellphone-sound::before{content:"\F951"}.mdi-cellphone-text::before{content:"\F8D1"}.mdi-cellphone-wireless::before{content:"\F814"}.mdi-celtic-cross::before{content:"\FCD1"}.mdi-centos::before{content:"\F0145"}.mdi-certificate::before{content:"\F124"}.mdi-certificate-outline::before{content:"\F01B3"}.mdi-chair-rolling::before{content:"\FFBA"}.mdi-chair-school::before{content:"\F125"}.mdi-charity::before{content:"\FC2B"}.mdi-chart-arc::before{content:"\F126"}.mdi-chart-areaspline::before{content:"\F127"}.mdi-chart-areaspline-variant::before{content:"\FEAE"}.mdi-chart-bar::before{content:"\F128"}.mdi-chart-bar-stacked::before{content:"\F769"}.mdi-chart-bell-curve::before{content:"\FC2C"}.mdi-chart-bell-curve-cumulative::before{content:"\FFC7"}.mdi-chart-bubble::before{content:"\F5E3"}.mdi-chart-donut::before{content:"\F7AE"}.mdi-chart-donut-variant::before{content:"\F7AF"}.mdi-chart-gantt::before{content:"\F66C"}.mdi-chart-histogram::before{content:"\F129"}.mdi-chart-line::before{content:"\F12A"}.mdi-chart-line-stacked::before{content:"\F76A"}.mdi-chart-line-variant::before{content:"\F7B0"}.mdi-chart-multiline::before{content:"\F8D3"}.mdi-chart-multiple::before{content:"\F023E"}.mdi-chart-pie::before{content:"\F12B"}.mdi-chart-ppf::before{content:"\F03AB"}.mdi-chart-scatter-plot::before{content:"\FEAF"}.mdi-chart-scatter-plot-hexbin::before{content:"\F66D"}.mdi-chart-snakey::before{content:"\F020A"}.mdi-chart-snakey-variant::before{content:"\F020B"}.mdi-chart-timeline::before{content:"\F66E"}.mdi-chart-timeline-variant::before{content:"\FEB0"}.mdi-chart-tree::before{content:"\FEB1"}.mdi-chat::before{content:"\FB55"}.mdi-chat-alert::before{content:"\FB56"}.mdi-chat-alert-outline::before{content:"\F02F4"}.mdi-chat-outline::before{content:"\FEFB"}.mdi-chat-processing::before{content:"\FB57"}.mdi-chat-processing-outline::before{content:"\F02F5"}.mdi-chat-sleep::before{content:"\F02FC"}.mdi-chat-sleep-outline::before{content:"\F02FD"}.mdi-check::before{content:"\F12C"}.mdi-check-all::before{content:"\F12D"}.mdi-check-bold::before{content:"\FE6E"}.mdi-check-box-multiple-outline::before{content:"\FC2D"}.mdi-check-box-outline::before{content:"\FC2E"}.mdi-check-circle::before{content:"\F5E0"}.mdi-check-circle-outline::before{content:"\F5E1"}.mdi-check-decagram::before{content:"\F790"}.mdi-check-network::before{content:"\FC2F"}.mdi-check-network-outline::before{content:"\FC30"}.mdi-check-outline::before{content:"\F854"}.mdi-check-underline::before{content:"\FE70"}.mdi-check-underline-circle::before{content:"\FE71"}.mdi-check-underline-circle-outline::before{content:"\FE72"}.mdi-checkbook::before{content:"\FA9C"}.mdi-checkbox-blank::before{content:"\F12E"}.mdi-checkbox-blank-circle::before{content:"\F12F"}.mdi-checkbox-blank-circle-outline::before{content:"\F130"}.mdi-checkbox-blank-off::before{content:"\F0317"}.mdi-checkbox-blank-off-outline::before{content:"\F0318"}.mdi-checkbox-blank-outline::before{content:"\F131"}.mdi-checkbox-intermediate::before{content:"\F855"}.mdi-checkbox-marked::before{content:"\F132"}.mdi-checkbox-marked-circle::before{content:"\F133"}.mdi-checkbox-marked-circle-outline::before{content:"\F134"}.mdi-checkbox-marked-outline::before{content:"\F135"}.mdi-checkbox-multiple-blank::before{content:"\F136"}.mdi-checkbox-multiple-blank-circle::before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline::before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline::before{content:"\F137"}.mdi-checkbox-multiple-marked::before{content:"\F138"}.mdi-checkbox-multiple-marked-circle::before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline::before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline::before{content:"\F139"}.mdi-checkerboard::before{content:"\F13A"}.mdi-checkerboard-minus::before{content:"\F022D"}.mdi-checkerboard-plus::before{content:"\F022C"}.mdi-checkerboard-remove::before{content:"\F022E"}.mdi-cheese::before{content:"\F02E4"}.mdi-chef-hat::before{content:"\FB58"}.mdi-chemical-weapon::before{content:"\F13B"}.mdi-chess-bishop::before{content:"\F85B"}.mdi-chess-king::before{content:"\F856"}.mdi-chess-knight::before{content:"\F857"}.mdi-chess-pawn::before{content:"\F858"}.mdi-chess-queen::before{content:"\F859"}.mdi-chess-rook::before{content:"\F85A"}.mdi-chevron-double-down::before{content:"\F13C"}.mdi-chevron-double-left::before{content:"\F13D"}.mdi-chevron-double-right::before{content:"\F13E"}.mdi-chevron-double-up::before{content:"\F13F"}.mdi-chevron-down::before{content:"\F140"}.mdi-chevron-down-box::before{content:"\F9D5"}.mdi-chevron-down-box-outline::before{content:"\F9D6"}.mdi-chevron-down-circle::before{content:"\FB0B"}.mdi-chevron-down-circle-outline::before{content:"\FB0C"}.mdi-chevron-left::before{content:"\F141"}.mdi-chevron-left-box::before{content:"\F9D7"}.mdi-chevron-left-box-outline::before{content:"\F9D8"}.mdi-chevron-left-circle::before{content:"\FB0D"}.mdi-chevron-left-circle-outline::before{content:"\FB0E"}.mdi-chevron-right::before{content:"\F142"}.mdi-chevron-right-box::before{content:"\F9D9"}.mdi-chevron-right-box-outline::before{content:"\F9DA"}.mdi-chevron-right-circle::before{content:"\FB0F"}.mdi-chevron-right-circle-outline::before{content:"\FB10"}.mdi-chevron-triple-down::before{content:"\FD95"}.mdi-chevron-triple-left::before{content:"\FD96"}.mdi-chevron-triple-right::before{content:"\FD97"}.mdi-chevron-triple-up::before{content:"\FD98"}.mdi-chevron-up::before{content:"\F143"}.mdi-chevron-up-box::before{content:"\F9DB"}.mdi-chevron-up-box-outline::before{content:"\F9DC"}.mdi-chevron-up-circle::before{content:"\FB11"}.mdi-chevron-up-circle-outline::before{content:"\FB12"}.mdi-chili-hot::before{content:"\F7B1"}.mdi-chili-medium::before{content:"\F7B2"}.mdi-chili-mild::before{content:"\F7B3"}.mdi-chip::before{content:"\F61A"}.mdi-christianity::before{content:"\F952"}.mdi-christianity-outline::before{content:"\FCD2"}.mdi-church::before{content:"\F144"}.mdi-cigar::before{content:"\F01B4"}.mdi-circle::before{content:"\F764"}.mdi-circle-double::before{content:"\FEB2"}.mdi-circle-edit-outline::before{content:"\F8D4"}.mdi-circle-expand::before{content:"\FEB3"}.mdi-circle-medium::before{content:"\F9DD"}.mdi-circle-off-outline::before{content:"\F00FE"}.mdi-circle-outline::before{content:"\F765"}.mdi-circle-slice-1::before{content:"\FA9D"}.mdi-circle-slice-2::before{content:"\FA9E"}.mdi-circle-slice-3::before{content:"\FA9F"}.mdi-circle-slice-4::before{content:"\FAA0"}.mdi-circle-slice-5::before{content:"\FAA1"}.mdi-circle-slice-6::before{content:"\FAA2"}.mdi-circle-slice-7::before{content:"\FAA3"}.mdi-circle-slice-8::before{content:"\FAA4"}.mdi-circle-small::before{content:"\F9DE"}.mdi-circular-saw::before{content:"\FE73"}.mdi-cisco-webex::before{content:"\F145"}.mdi-city::before{content:"\F146"}.mdi-city-variant::before{content:"\FA35"}.mdi-city-variant-outline::before{content:"\FA36"}.mdi-clipboard::before{content:"\F147"}.mdi-clipboard-account::before{content:"\F148"}.mdi-clipboard-account-outline::before{content:"\FC31"}.mdi-clipboard-alert::before{content:"\F149"}.mdi-clipboard-alert-outline::before{content:"\FCD3"}.mdi-clipboard-arrow-down::before{content:"\F14A"}.mdi-clipboard-arrow-down-outline::before{content:"\FC32"}.mdi-clipboard-arrow-left::before{content:"\F14B"}.mdi-clipboard-arrow-left-outline::before{content:"\FCD4"}.mdi-clipboard-arrow-right::before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline::before{content:"\FCD6"}.mdi-clipboard-arrow-up::before{content:"\FC33"}.mdi-clipboard-arrow-up-outline::before{content:"\FC34"}.mdi-clipboard-check::before{content:"\F14C"}.mdi-clipboard-check-multiple::before{content:"\F028E"}.mdi-clipboard-check-multiple-outline::before{content:"\F028F"}.mdi-clipboard-check-outline::before{content:"\F8A7"}.mdi-clipboard-file::before{content:"\F0290"}.mdi-clipboard-file-outline::before{content:"\F0291"}.mdi-clipboard-flow::before{content:"\F6C7"}.mdi-clipboard-flow-outline::before{content:"\F0142"}.mdi-clipboard-list::before{content:"\F00FF"}.mdi-clipboard-list-outline::before{content:"\F0100"}.mdi-clipboard-multiple::before{content:"\F0292"}.mdi-clipboard-multiple-outline::before{content:"\F0293"}.mdi-clipboard-outline::before{content:"\F14D"}.mdi-clipboard-play::before{content:"\FC35"}.mdi-clipboard-play-multiple::before{content:"\F0294"}.mdi-clipboard-play-multiple-outline::before{content:"\F0295"}.mdi-clipboard-play-outline::before{content:"\FC36"}.mdi-clipboard-plus::before{content:"\F750"}.mdi-clipboard-plus-outline::before{content:"\F034A"}.mdi-clipboard-pulse::before{content:"\F85C"}.mdi-clipboard-pulse-outline::before{content:"\F85D"}.mdi-clipboard-text::before{content:"\F14E"}.mdi-clipboard-text-multiple::before{content:"\F0296"}.mdi-clipboard-text-multiple-outline::before{content:"\F0297"}.mdi-clipboard-text-outline::before{content:"\FA37"}.mdi-clipboard-text-play::before{content:"\FC37"}.mdi-clipboard-text-play-outline::before{content:"\FC38"}.mdi-clippy::before{content:"\F14F"}.mdi-clock::before{content:"\F953"}.mdi-clock-alert::before{content:"\F954"}.mdi-clock-alert-outline::before{content:"\F5CE"}.mdi-clock-check::before{content:"\FFC8"}.mdi-clock-check-outline::before{content:"\FFC9"}.mdi-clock-digital::before{content:"\FEB4"}.mdi-clock-end::before{content:"\F151"}.mdi-clock-fast::before{content:"\F152"}.mdi-clock-in::before{content:"\F153"}.mdi-clock-out::before{content:"\F154"}.mdi-clock-outline::before{content:"\F150"}.mdi-clock-start::before{content:"\F155"}.mdi-close::before{content:"\F156"}.mdi-close-box::before{content:"\F157"}.mdi-close-box-multiple::before{content:"\FC39"}.mdi-close-box-multiple-outline::before{content:"\FC3A"}.mdi-close-box-outline::before{content:"\F158"}.mdi-close-circle::before{content:"\F159"}.mdi-close-circle-outline::before{content:"\F15A"}.mdi-close-network::before{content:"\F15B"}.mdi-close-network-outline::before{content:"\FC3B"}.mdi-close-octagon::before{content:"\F15C"}.mdi-close-octagon-outline::before{content:"\F15D"}.mdi-close-outline::before{content:"\F6C8"}.mdi-closed-caption::before{content:"\F15E"}.mdi-closed-caption-outline::before{content:"\FD99"}.mdi-cloud::before{content:"\F15F"}.mdi-cloud-alert::before{content:"\F9DF"}.mdi-cloud-braces::before{content:"\F7B4"}.mdi-cloud-check::before{content:"\F160"}.mdi-cloud-check-outline::before{content:"\F02F7"}.mdi-cloud-circle::before{content:"\F161"}.mdi-cloud-download::before{content:"\F162"}.mdi-cloud-download-outline::before{content:"\FB59"}.mdi-cloud-lock::before{content:"\F021C"}.mdi-cloud-lock-outline::before{content:"\F021D"}.mdi-cloud-off-outline::before{content:"\F164"}.mdi-cloud-outline::before{content:"\F163"}.mdi-cloud-print::before{content:"\F165"}.mdi-cloud-print-outline::before{content:"\F166"}.mdi-cloud-question::before{content:"\FA38"}.mdi-cloud-search::before{content:"\F955"}.mdi-cloud-search-outline::before{content:"\F956"}.mdi-cloud-sync::before{content:"\F63F"}.mdi-cloud-sync-outline::before{content:"\F0301"}.mdi-cloud-tags::before{content:"\F7B5"}.mdi-cloud-upload::before{content:"\F167"}.mdi-cloud-upload-outline::before{content:"\FB5A"}.mdi-clover::before{content:"\F815"}.mdi-coach-lamp::before{content:"\F0042"}.mdi-coat-rack::before{content:"\F00C9"}.mdi-code-array::before{content:"\F168"}.mdi-code-braces::before{content:"\F169"}.mdi-code-braces-box::before{content:"\F0101"}.mdi-code-brackets::before{content:"\F16A"}.mdi-code-equal::before{content:"\F16B"}.mdi-code-greater-than::before{content:"\F16C"}.mdi-code-greater-than-or-equal::before{content:"\F16D"}.mdi-code-less-than::before{content:"\F16E"}.mdi-code-less-than-or-equal::before{content:"\F16F"}.mdi-code-not-equal::before{content:"\F170"}.mdi-code-not-equal-variant::before{content:"\F171"}.mdi-code-parentheses::before{content:"\F172"}.mdi-code-parentheses-box::before{content:"\F0102"}.mdi-code-string::before{content:"\F173"}.mdi-code-tags::before{content:"\F174"}.mdi-code-tags-check::before{content:"\F693"}.mdi-codepen::before{content:"\F175"}.mdi-coffee::before{content:"\F176"}.mdi-coffee-maker::before{content:"\F00CA"}.mdi-coffee-off::before{content:"\FFCA"}.mdi-coffee-off-outline::before{content:"\FFCB"}.mdi-coffee-outline::before{content:"\F6C9"}.mdi-coffee-to-go::before{content:"\F177"}.mdi-coffee-to-go-outline::before{content:"\F0339"}.mdi-coffin::before{content:"\FB5B"}.mdi-cog-clockwise::before{content:"\F0208"}.mdi-cog-counterclockwise::before{content:"\F0209"}.mdi-cogs::before{content:"\F8D5"}.mdi-coin::before{content:"\F0196"}.mdi-coin-outline::before{content:"\F178"}.mdi-coins::before{content:"\F694"}.mdi-collage::before{content:"\F640"}.mdi-collapse-all::before{content:"\FAA5"}.mdi-collapse-all-outline::before{content:"\FAA6"}.mdi-color-helper::before{content:"\F179"}.mdi-comma::before{content:"\FE74"}.mdi-comma-box::before{content:"\FE75"}.mdi-comma-box-outline::before{content:"\FE76"}.mdi-comma-circle::before{content:"\FE77"}.mdi-comma-circle-outline::before{content:"\FE78"}.mdi-comment::before{content:"\F17A"}.mdi-comment-account::before{content:"\F17B"}.mdi-comment-account-outline::before{content:"\F17C"}.mdi-comment-alert::before{content:"\F17D"}.mdi-comment-alert-outline::before{content:"\F17E"}.mdi-comment-arrow-left::before{content:"\F9E0"}.mdi-comment-arrow-left-outline::before{content:"\F9E1"}.mdi-comment-arrow-right::before{content:"\F9E2"}.mdi-comment-arrow-right-outline::before{content:"\F9E3"}.mdi-comment-check::before{content:"\F17F"}.mdi-comment-check-outline::before{content:"\F180"}.mdi-comment-edit::before{content:"\F01EA"}.mdi-comment-edit-outline::before{content:"\F02EF"}.mdi-comment-eye::before{content:"\FA39"}.mdi-comment-eye-outline::before{content:"\FA3A"}.mdi-comment-multiple::before{content:"\F85E"}.mdi-comment-multiple-outline::before{content:"\F181"}.mdi-comment-outline::before{content:"\F182"}.mdi-comment-plus::before{content:"\F9E4"}.mdi-comment-plus-outline::before{content:"\F183"}.mdi-comment-processing::before{content:"\F184"}.mdi-comment-processing-outline::before{content:"\F185"}.mdi-comment-question::before{content:"\F816"}.mdi-comment-question-outline::before{content:"\F186"}.mdi-comment-quote::before{content:"\F0043"}.mdi-comment-quote-outline::before{content:"\F0044"}.mdi-comment-remove::before{content:"\F5DE"}.mdi-comment-remove-outline::before{content:"\F187"}.mdi-comment-search::before{content:"\FA3B"}.mdi-comment-search-outline::before{content:"\FA3C"}.mdi-comment-text::before{content:"\F188"}.mdi-comment-text-multiple::before{content:"\F85F"}.mdi-comment-text-multiple-outline::before{content:"\F860"}.mdi-comment-text-outline::before{content:"\F189"}.mdi-compare::before{content:"\F18A"}.mdi-compass::before{content:"\F18B"}.mdi-compass-off::before{content:"\FB5C"}.mdi-compass-off-outline::before{content:"\FB5D"}.mdi-compass-outline::before{content:"\F18C"}.mdi-compass-rose::before{content:"\F03AD"}.mdi-concourse-ci::before{content:"\F00CB"}.mdi-console::before{content:"\F18D"}.mdi-console-line::before{content:"\F7B6"}.mdi-console-network::before{content:"\F8A8"}.mdi-console-network-outline::before{content:"\FC3C"}.mdi-consolidate::before{content:"\F0103"}.mdi-contact-mail::before{content:"\F18E"}.mdi-contact-mail-outline::before{content:"\FEB5"}.mdi-contact-phone::before{content:"\FEB6"}.mdi-contact-phone-outline::before{content:"\FEB7"}.mdi-contactless-payment::before{content:"\FD46"}.mdi-contacts::before{content:"\F6CA"}.mdi-contain::before{content:"\FA3D"}.mdi-contain-end::before{content:"\FA3E"}.mdi-contain-start::before{content:"\FA3F"}.mdi-content-copy::before{content:"\F18F"}.mdi-content-cut::before{content:"\F190"}.mdi-content-duplicate::before{content:"\F191"}.mdi-content-paste::before{content:"\F192"}.mdi-content-save::before{content:"\F193"}.mdi-content-save-alert::before{content:"\FF5F"}.mdi-content-save-alert-outline::before{content:"\FF60"}.mdi-content-save-all::before{content:"\F194"}.mdi-content-save-all-outline::before{content:"\FF61"}.mdi-content-save-edit::before{content:"\FCD7"}.mdi-content-save-edit-outline::before{content:"\FCD8"}.mdi-content-save-move::before{content:"\FE79"}.mdi-content-save-move-outline::before{content:"\FE7A"}.mdi-content-save-outline::before{content:"\F817"}.mdi-content-save-settings::before{content:"\F61B"}.mdi-content-save-settings-outline::before{content:"\FB13"}.mdi-contrast::before{content:"\F195"}.mdi-contrast-box::before{content:"\F196"}.mdi-contrast-circle::before{content:"\F197"}.mdi-controller-classic::before{content:"\FB5E"}.mdi-controller-classic-outline::before{content:"\FB5F"}.mdi-cookie::before{content:"\F198"}.mdi-coolant-temperature::before{content:"\F3C8"}.mdi-copyright::before{content:"\F5E6"}.mdi-cordova::before{content:"\F957"}.mdi-corn::before{content:"\F7B7"}.mdi-counter::before{content:"\F199"}.mdi-cow::before{content:"\F19A"}.mdi-cowboy::before{content:"\FEB8"}.mdi-cpu-32-bit::before{content:"\FEFC"}.mdi-cpu-64-bit::before{content:"\FEFD"}.mdi-crane::before{content:"\F861"}.mdi-creation::before{content:"\F1C9"}.mdi-creative-commons::before{content:"\FD47"}.mdi-credit-card::before{content:"\F0010"}.mdi-credit-card-clock::before{content:"\FEFE"}.mdi-credit-card-clock-outline::before{content:"\FFBC"}.mdi-credit-card-marker::before{content:"\F6A7"}.mdi-credit-card-marker-outline::before{content:"\FD9A"}.mdi-credit-card-minus::before{content:"\FFCC"}.mdi-credit-card-minus-outline::before{content:"\FFCD"}.mdi-credit-card-multiple::before{content:"\F0011"}.mdi-credit-card-multiple-outline::before{content:"\F19C"}.mdi-credit-card-off::before{content:"\F0012"}.mdi-credit-card-off-outline::before{content:"\F5E4"}.mdi-credit-card-outline::before{content:"\F19B"}.mdi-credit-card-plus::before{content:"\F0013"}.mdi-credit-card-plus-outline::before{content:"\F675"}.mdi-credit-card-refund::before{content:"\F0014"}.mdi-credit-card-refund-outline::before{content:"\FAA7"}.mdi-credit-card-remove::before{content:"\FFCE"}.mdi-credit-card-remove-outline::before{content:"\FFCF"}.mdi-credit-card-scan::before{content:"\F0015"}.mdi-credit-card-scan-outline::before{content:"\F19D"}.mdi-credit-card-settings::before{content:"\F0016"}.mdi-credit-card-settings-outline::before{content:"\F8D6"}.mdi-credit-card-wireless::before{content:"\F801"}.mdi-credit-card-wireless-outline::before{content:"\FD48"}.mdi-cricket::before{content:"\FD49"}.mdi-crop::before{content:"\F19E"}.mdi-crop-free::before{content:"\F19F"}.mdi-crop-landscape::before{content:"\F1A0"}.mdi-crop-portrait::before{content:"\F1A1"}.mdi-crop-rotate::before{content:"\F695"}.mdi-crop-square::before{content:"\F1A2"}.mdi-crosshairs::before{content:"\F1A3"}.mdi-crosshairs-gps::before{content:"\F1A4"}.mdi-crosshairs-off::before{content:"\FF62"}.mdi-crosshairs-question::before{content:"\F0161"}.mdi-crown::before{content:"\F1A5"}.mdi-crown-outline::before{content:"\F01FB"}.mdi-cryengine::before{content:"\F958"}.mdi-crystal-ball::before{content:"\FB14"}.mdi-cube::before{content:"\F1A6"}.mdi-cube-outline::before{content:"\F1A7"}.mdi-cube-scan::before{content:"\FB60"}.mdi-cube-send::before{content:"\F1A8"}.mdi-cube-unfolded::before{content:"\F1A9"}.mdi-cup::before{content:"\F1AA"}.mdi-cup-off::before{content:"\F5E5"}.mdi-cup-off-outline::before{content:"\F03A8"}.mdi-cup-outline::before{content:"\F033A"}.mdi-cup-water::before{content:"\F1AB"}.mdi-cupboard::before{content:"\FF63"}.mdi-cupboard-outline::before{content:"\FF64"}.mdi-cupcake::before{content:"\F959"}.mdi-curling::before{content:"\F862"}.mdi-currency-bdt::before{content:"\F863"}.mdi-currency-brl::before{content:"\FB61"}.mdi-currency-btc::before{content:"\F1AC"}.mdi-currency-cny::before{content:"\F7B9"}.mdi-currency-eth::before{content:"\F7BA"}.mdi-currency-eur::before{content:"\F1AD"}.mdi-currency-eur-off::before{content:"\F0340"}.mdi-currency-gbp::before{content:"\F1AE"}.mdi-currency-ils::before{content:"\FC3D"}.mdi-currency-inr::before{content:"\F1AF"}.mdi-currency-jpy::before{content:"\F7BB"}.mdi-currency-krw::before{content:"\F7BC"}.mdi-currency-kzt::before{content:"\F864"}.mdi-currency-ngn::before{content:"\F1B0"}.mdi-currency-php::before{content:"\F9E5"}.mdi-currency-rial::before{content:"\FEB9"}.mdi-currency-rub::before{content:"\F1B1"}.mdi-currency-sign::before{content:"\F7BD"}.mdi-currency-try::before{content:"\F1B2"}.mdi-currency-twd::before{content:"\F7BE"}.mdi-currency-usd::before{content:"\F1B3"}.mdi-currency-usd-off::before{content:"\F679"}.mdi-current-ac::before{content:"\F95A"}.mdi-current-dc::before{content:"\F95B"}.mdi-cursor-default::before{content:"\F1B4"}.mdi-cursor-default-click::before{content:"\FCD9"}.mdi-cursor-default-click-outline::before{content:"\FCDA"}.mdi-cursor-default-gesture::before{content:"\F0152"}.mdi-cursor-default-gesture-outline::before{content:"\F0153"}.mdi-cursor-default-outline::before{content:"\F1B5"}.mdi-cursor-move::before{content:"\F1B6"}.mdi-cursor-pointer::before{content:"\F1B7"}.mdi-cursor-text::before{content:"\F5E7"}.mdi-database::before{content:"\F1B8"}.mdi-database-check::before{content:"\FAA8"}.mdi-database-edit::before{content:"\FB62"}.mdi-database-export::before{content:"\F95D"}.mdi-database-import::before{content:"\F95C"}.mdi-database-lock::before{content:"\FAA9"}.mdi-database-marker::before{content:"\F0321"}.mdi-database-minus::before{content:"\F1B9"}.mdi-database-plus::before{content:"\F1BA"}.mdi-database-refresh::before{content:"\FCDB"}.mdi-database-remove::before{content:"\FCDC"}.mdi-database-search::before{content:"\F865"}.mdi-database-settings::before{content:"\FCDD"}.mdi-death-star::before{content:"\F8D7"}.mdi-death-star-variant::before{content:"\F8D8"}.mdi-deathly-hallows::before{content:"\FB63"}.mdi-debian::before{content:"\F8D9"}.mdi-debug-step-into::before{content:"\F1BB"}.mdi-debug-step-out::before{content:"\F1BC"}.mdi-debug-step-over::before{content:"\F1BD"}.mdi-decagram::before{content:"\F76B"}.mdi-decagram-outline::before{content:"\F76C"}.mdi-decimal::before{content:"\F00CC"}.mdi-decimal-comma::before{content:"\F00CD"}.mdi-decimal-comma-decrease::before{content:"\F00CE"}.mdi-decimal-comma-increase::before{content:"\F00CF"}.mdi-decimal-decrease::before{content:"\F1BE"}.mdi-decimal-increase::before{content:"\F1BF"}.mdi-delete::before{content:"\F1C0"}.mdi-delete-alert::before{content:"\F00D0"}.mdi-delete-alert-outline::before{content:"\F00D1"}.mdi-delete-circle::before{content:"\F682"}.mdi-delete-circle-outline::before{content:"\FB64"}.mdi-delete-empty::before{content:"\F6CB"}.mdi-delete-empty-outline::before{content:"\FEBA"}.mdi-delete-forever::before{content:"\F5E8"}.mdi-delete-forever-outline::before{content:"\FB65"}.mdi-delete-off::before{content:"\F00D2"}.mdi-delete-off-outline::before{content:"\F00D3"}.mdi-delete-outline::before{content:"\F9E6"}.mdi-delete-restore::before{content:"\F818"}.mdi-delete-sweep::before{content:"\F5E9"}.mdi-delete-sweep-outline::before{content:"\FC3E"}.mdi-delete-variant::before{content:"\F1C1"}.mdi-delta::before{content:"\F1C2"}.mdi-desk::before{content:"\F0264"}.mdi-desk-lamp::before{content:"\F95E"}.mdi-deskphone::before{content:"\F1C3"}.mdi-desktop-classic::before{content:"\F7BF"}.mdi-desktop-mac::before{content:"\F1C4"}.mdi-desktop-mac-dashboard::before{content:"\F9E7"}.mdi-desktop-tower::before{content:"\F1C5"}.mdi-desktop-tower-monitor::before{content:"\FAAA"}.mdi-details::before{content:"\F1C6"}.mdi-dev-to::before{content:"\FD4A"}.mdi-developer-board::before{content:"\F696"}.mdi-deviantart::before{content:"\F1C7"}.mdi-devices::before{content:"\FFD0"}.mdi-diabetes::before{content:"\F0151"}.mdi-dialpad::before{content:"\F61C"}.mdi-diameter::before{content:"\FC3F"}.mdi-diameter-outline::before{content:"\FC40"}.mdi-diameter-variant::before{content:"\FC41"}.mdi-diamond::before{content:"\FB66"}.mdi-diamond-outline::before{content:"\FB67"}.mdi-diamond-stone::before{content:"\F1C8"}.mdi-dice-1::before{content:"\F1CA"}.mdi-dice-1-outline::before{content:"\F0175"}.mdi-dice-2::before{content:"\F1CB"}.mdi-dice-2-outline::before{content:"\F0176"}.mdi-dice-3::before{content:"\F1CC"}.mdi-dice-3-outline::before{content:"\F0177"}.mdi-dice-4::before{content:"\F1CD"}.mdi-dice-4-outline::before{content:"\F0178"}.mdi-dice-5::before{content:"\F1CE"}.mdi-dice-5-outline::before{content:"\F0179"}.mdi-dice-6::before{content:"\F1CF"}.mdi-dice-6-outline::before{content:"\F017A"}.mdi-dice-d10::before{content:"\F017E"}.mdi-dice-d10-outline::before{content:"\F76E"}.mdi-dice-d12::before{content:"\F017F"}.mdi-dice-d12-outline::before{content:"\F866"}.mdi-dice-d20::before{content:"\F0180"}.mdi-dice-d20-outline::before{content:"\F5EA"}.mdi-dice-d4::before{content:"\F017B"}.mdi-dice-d4-outline::before{content:"\F5EB"}.mdi-dice-d6::before{content:"\F017C"}.mdi-dice-d6-outline::before{content:"\F5EC"}.mdi-dice-d8::before{content:"\F017D"}.mdi-dice-d8-outline::before{content:"\F5ED"}.mdi-dice-multiple::before{content:"\F76D"}.mdi-dice-multiple-outline::before{content:"\F0181"}.mdi-dictionary::before{content:"\F61D"}.mdi-digital-ocean::before{content:"\F0262"}.mdi-dip-switch::before{content:"\F7C0"}.mdi-directions::before{content:"\F1D0"}.mdi-directions-fork::before{content:"\F641"}.mdi-disc::before{content:"\F5EE"}.mdi-disc-alert::before{content:"\F1D1"}.mdi-disc-player::before{content:"\F95F"}.mdi-discord::before{content:"\F66F"}.mdi-dishwasher::before{content:"\FAAB"}.mdi-dishwasher-alert::before{content:"\F01E3"}.mdi-dishwasher-off::before{content:"\F01E4"}.mdi-disqus::before{content:"\F1D2"}.mdi-disqus-outline::before{content:"\F1D3"}.mdi-distribute-horizontal-center::before{content:"\F01F4"}.mdi-distribute-horizontal-left::before{content:"\F01F3"}.mdi-distribute-horizontal-right::before{content:"\F01F5"}.mdi-distribute-vertical-bottom::before{content:"\F01F6"}.mdi-distribute-vertical-center::before{content:"\F01F7"}.mdi-distribute-vertical-top::before{content:"\F01F8"}.mdi-diving-flippers::before{content:"\FD9B"}.mdi-diving-helmet::before{content:"\FD9C"}.mdi-diving-scuba::before{content:"\FD9D"}.mdi-diving-scuba-flag::before{content:"\FD9E"}.mdi-diving-scuba-tank::before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple::before{content:"\FDA0"}.mdi-diving-snorkel::before{content:"\FDA1"}.mdi-division::before{content:"\F1D4"}.mdi-division-box::before{content:"\F1D5"}.mdi-dlna::before{content:"\FA40"}.mdi-dna::before{content:"\F683"}.mdi-dns::before{content:"\F1D6"}.mdi-dns-outline::before{content:"\FB68"}.mdi-do-not-disturb::before{content:"\F697"}.mdi-do-not-disturb-off::before{content:"\F698"}.mdi-dock-bottom::before{content:"\F00D4"}.mdi-dock-left::before{content:"\F00D5"}.mdi-dock-right::before{content:"\F00D6"}.mdi-dock-window::before{content:"\F00D7"}.mdi-docker::before{content:"\F867"}.mdi-doctor::before{content:"\FA41"}.mdi-dog::before{content:"\FA42"}.mdi-dog-service::before{content:"\FAAC"}.mdi-dog-side::before{content:"\FA43"}.mdi-dolby::before{content:"\F6B2"}.mdi-dolly::before{content:"\FEBB"}.mdi-domain::before{content:"\F1D7"}.mdi-domain-off::before{content:"\FD4B"}.mdi-domain-plus::before{content:"\F00D8"}.mdi-domain-remove::before{content:"\F00D9"}.mdi-domino-mask::before{content:"\F0045"}.mdi-donkey::before{content:"\F7C1"}.mdi-door::before{content:"\F819"}.mdi-door-closed::before{content:"\F81A"}.mdi-door-closed-lock::before{content:"\F00DA"}.mdi-door-open::before{content:"\F81B"}.mdi-doorbell::before{content:"\F0311"}.mdi-doorbell-video::before{content:"\F868"}.mdi-dot-net::before{content:"\FAAD"}.mdi-dots-horizontal::before{content:"\F1D8"}.mdi-dots-horizontal-circle::before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline::before{content:"\FB69"}.mdi-dots-vertical::before{content:"\F1D9"}.mdi-dots-vertical-circle::before{content:"\F7C3"}.mdi-dots-vertical-circle-outline::before{content:"\FB6A"}.mdi-douban::before{content:"\F699"}.mdi-download::before{content:"\F1DA"}.mdi-download-lock::before{content:"\F034B"}.mdi-download-lock-outline::before{content:"\F034C"}.mdi-download-multiple::before{content:"\F9E8"}.mdi-download-network::before{content:"\F6F3"}.mdi-download-network-outline::before{content:"\FC42"}.mdi-download-off::before{content:"\F00DB"}.mdi-download-off-outline::before{content:"\F00DC"}.mdi-download-outline::before{content:"\FB6B"}.mdi-drag::before{content:"\F1DB"}.mdi-drag-horizontal::before{content:"\F1DC"}.mdi-drag-horizontal-variant::before{content:"\F031B"}.mdi-drag-variant::before{content:"\FB6C"}.mdi-drag-vertical::before{content:"\F1DD"}.mdi-drag-vertical-variant::before{content:"\F031C"}.mdi-drama-masks::before{content:"\FCDE"}.mdi-draw::before{content:"\FF66"}.mdi-drawing::before{content:"\F1DE"}.mdi-drawing-box::before{content:"\F1DF"}.mdi-dresser::before{content:"\FF67"}.mdi-dresser-outline::before{content:"\FF68"}.mdi-dribbble::before{content:"\F1E0"}.mdi-dribbble-box::before{content:"\F1E1"}.mdi-drone::before{content:"\F1E2"}.mdi-dropbox::before{content:"\F1E3"}.mdi-drupal::before{content:"\F1E4"}.mdi-duck::before{content:"\F1E5"}.mdi-dumbbell::before{content:"\F1E6"}.mdi-dump-truck::before{content:"\FC43"}.mdi-ear-hearing::before{content:"\F7C4"}.mdi-ear-hearing-off::before{content:"\FA44"}.mdi-earth::before{content:"\F1E7"}.mdi-earth-arrow-right::before{content:"\F033C"}.mdi-earth-box::before{content:"\F6CC"}.mdi-earth-box-off::before{content:"\F6CD"}.mdi-earth-off::before{content:"\F1E8"}.mdi-edge::before{content:"\F1E9"}.mdi-edge-legacy::before{content:"\F027B"}.mdi-egg::before{content:"\FAAE"}.mdi-egg-easter::before{content:"\FAAF"}.mdi-eight-track::before{content:"\F9E9"}.mdi-eject::before{content:"\F1EA"}.mdi-eject-outline::before{content:"\FB6D"}.mdi-electric-switch::before{content:"\FEBC"}.mdi-electric-switch-closed::before{content:"\F0104"}.mdi-electron-framework::before{content:"\F0046"}.mdi-elephant::before{content:"\F7C5"}.mdi-elevation-decline::before{content:"\F1EB"}.mdi-elevation-rise::before{content:"\F1EC"}.mdi-elevator::before{content:"\F1ED"}.mdi-elevator-down::before{content:"\F02ED"}.mdi-elevator-passenger::before{content:"\F03AC"}.mdi-elevator-up::before{content:"\F02EC"}.mdi-ellipse::before{content:"\FEBD"}.mdi-ellipse-outline::before{content:"\FEBE"}.mdi-email::before{content:"\F1EE"}.mdi-email-alert::before{content:"\F6CE"}.mdi-email-alert-outline::before{content:"\FD1E"}.mdi-email-box::before{content:"\FCDF"}.mdi-email-check::before{content:"\FAB0"}.mdi-email-check-outline::before{content:"\FAB1"}.mdi-email-edit::before{content:"\FF00"}.mdi-email-edit-outline::before{content:"\FF01"}.mdi-email-lock::before{content:"\F1F1"}.mdi-email-mark-as-unread::before{content:"\FB6E"}.mdi-email-minus::before{content:"\FF02"}.mdi-email-minus-outline::before{content:"\FF03"}.mdi-email-multiple::before{content:"\FF04"}.mdi-email-multiple-outline::before{content:"\FF05"}.mdi-email-newsletter::before{content:"\FFD1"}.mdi-email-open::before{content:"\F1EF"}.mdi-email-open-multiple::before{content:"\FF06"}.mdi-email-open-multiple-outline::before{content:"\FF07"}.mdi-email-open-outline::before{content:"\F5EF"}.mdi-email-outline::before{content:"\F1F0"}.mdi-email-plus::before{content:"\F9EA"}.mdi-email-plus-outline::before{content:"\F9EB"}.mdi-email-receive::before{content:"\F0105"}.mdi-email-receive-outline::before{content:"\F0106"}.mdi-email-search::before{content:"\F960"}.mdi-email-search-outline::before{content:"\F961"}.mdi-email-send::before{content:"\F0107"}.mdi-email-send-outline::before{content:"\F0108"}.mdi-email-sync::before{content:"\F02F2"}.mdi-email-sync-outline::before{content:"\F02F3"}.mdi-email-variant::before{content:"\F5F0"}.mdi-ember::before{content:"\FB15"}.mdi-emby::before{content:"\F6B3"}.mdi-emoticon::before{content:"\FC44"}.mdi-emoticon-angry::before{content:"\FC45"}.mdi-emoticon-angry-outline::before{content:"\FC46"}.mdi-emoticon-confused::before{content:"\F0109"}.mdi-emoticon-confused-outline::before{content:"\F010A"}.mdi-emoticon-cool::before{content:"\FC47"}.mdi-emoticon-cool-outline::before{content:"\F1F3"}.mdi-emoticon-cry::before{content:"\FC48"}.mdi-emoticon-cry-outline::before{content:"\FC49"}.mdi-emoticon-dead::before{content:"\FC4A"}.mdi-emoticon-dead-outline::before{content:"\F69A"}.mdi-emoticon-devil::before{content:"\FC4B"}.mdi-emoticon-devil-outline::before{content:"\F1F4"}.mdi-emoticon-excited::before{content:"\FC4C"}.mdi-emoticon-excited-outline::before{content:"\F69B"}.mdi-emoticon-frown::before{content:"\FF69"}.mdi-emoticon-frown-outline::before{content:"\FF6A"}.mdi-emoticon-happy::before{content:"\FC4D"}.mdi-emoticon-happy-outline::before{content:"\F1F5"}.mdi-emoticon-kiss::before{content:"\FC4E"}.mdi-emoticon-kiss-outline::before{content:"\FC4F"}.mdi-emoticon-lol::before{content:"\F023F"}.mdi-emoticon-lol-outline::before{content:"\F0240"}.mdi-emoticon-neutral::before{content:"\FC50"}.mdi-emoticon-neutral-outline::before{content:"\F1F6"}.mdi-emoticon-outline::before{content:"\F1F2"}.mdi-emoticon-poop::before{content:"\F1F7"}.mdi-emoticon-poop-outline::before{content:"\FC51"}.mdi-emoticon-sad::before{content:"\FC52"}.mdi-emoticon-sad-outline::before{content:"\F1F8"}.mdi-emoticon-tongue::before{content:"\F1F9"}.mdi-emoticon-tongue-outline::before{content:"\FC53"}.mdi-emoticon-wink::before{content:"\FC54"}.mdi-emoticon-wink-outline::before{content:"\FC55"}.mdi-engine::before{content:"\F1FA"}.mdi-engine-off::before{content:"\FA45"}.mdi-engine-off-outline::before{content:"\FA46"}.mdi-engine-outline::before{content:"\F1FB"}.mdi-epsilon::before{content:"\F010B"}.mdi-equal::before{content:"\F1FC"}.mdi-equal-box::before{content:"\F1FD"}.mdi-equalizer::before{content:"\FEBF"}.mdi-equalizer-outline::before{content:"\FEC0"}.mdi-eraser::before{content:"\F1FE"}.mdi-eraser-variant::before{content:"\F642"}.mdi-escalator::before{content:"\F1FF"}.mdi-escalator-down::before{content:"\F02EB"}.mdi-escalator-up::before{content:"\F02EA"}.mdi-eslint::before{content:"\FC56"}.mdi-et::before{content:"\FAB2"}.mdi-ethereum::before{content:"\F869"}.mdi-ethernet::before{content:"\F200"}.mdi-ethernet-cable::before{content:"\F201"}.mdi-ethernet-cable-off::before{content:"\F202"}.mdi-etsy::before{content:"\F203"}.mdi-ev-station::before{content:"\F5F1"}.mdi-eventbrite::before{content:"\F7C6"}.mdi-evernote::before{content:"\F204"}.mdi-excavator::before{content:"\F0047"}.mdi-exclamation::before{content:"\F205"}.mdi-exclamation-thick::before{content:"\F0263"}.mdi-exit-run::before{content:"\FA47"}.mdi-exit-to-app::before{content:"\F206"}.mdi-expand-all::before{content:"\FAB3"}.mdi-expand-all-outline::before{content:"\FAB4"}.mdi-expansion-card::before{content:"\F8AD"}.mdi-expansion-card-variant::before{content:"\FFD2"}.mdi-exponent::before{content:"\F962"}.mdi-exponent-box::before{content:"\F963"}.mdi-export::before{content:"\F207"}.mdi-export-variant::before{content:"\FB6F"}.mdi-eye::before{content:"\F208"}.mdi-eye-check::before{content:"\FCE0"}.mdi-eye-check-outline::before{content:"\FCE1"}.mdi-eye-circle::before{content:"\FB70"}.mdi-eye-circle-outline::before{content:"\FB71"}.mdi-eye-minus::before{content:"\F0048"}.mdi-eye-minus-outline::before{content:"\F0049"}.mdi-eye-off::before{content:"\F209"}.mdi-eye-off-outline::before{content:"\F6D0"}.mdi-eye-outline::before{content:"\F6CF"}.mdi-eye-plus::before{content:"\F86A"}.mdi-eye-plus-outline::before{content:"\F86B"}.mdi-eye-settings::before{content:"\F86C"}.mdi-eye-settings-outline::before{content:"\F86D"}.mdi-eyedropper::before{content:"\F20A"}.mdi-eyedropper-variant::before{content:"\F20B"}.mdi-face::before{content:"\F643"}.mdi-face-agent::before{content:"\FD4C"}.mdi-face-outline::before{content:"\FB72"}.mdi-face-profile::before{content:"\F644"}.mdi-face-profile-woman::before{content:"\F00A1"}.mdi-face-recognition::before{content:"\FC57"}.mdi-face-woman::before{content:"\F00A2"}.mdi-face-woman-outline::before{content:"\F00A3"}.mdi-facebook::before{content:"\F20C"}.mdi-facebook-box::before{content:"\F20D"}.mdi-facebook-messenger::before{content:"\F20E"}.mdi-facebook-workplace::before{content:"\FB16"}.mdi-factory::before{content:"\F20F"}.mdi-fan::before{content:"\F210"}.mdi-fan-off::before{content:"\F81C"}.mdi-fast-forward::before{content:"\F211"}.mdi-fast-forward-10::before{content:"\FD4D"}.mdi-fast-forward-30::before{content:"\FCE2"}.mdi-fast-forward-5::before{content:"\F0223"}.mdi-fast-forward-outline::before{content:"\F6D1"}.mdi-fax::before{content:"\F212"}.mdi-feather::before{content:"\F6D2"}.mdi-feature-search::before{content:"\FA48"}.mdi-feature-search-outline::before{content:"\FA49"}.mdi-fedora::before{content:"\F8DA"}.mdi-ferris-wheel::before{content:"\FEC1"}.mdi-ferry::before{content:"\F213"}.mdi-file::before{content:"\F214"}.mdi-file-account::before{content:"\F73A"}.mdi-file-account-outline::before{content:"\F004A"}.mdi-file-alert::before{content:"\FA4A"}.mdi-file-alert-outline::before{content:"\FA4B"}.mdi-file-cabinet::before{content:"\FAB5"}.mdi-file-cad::before{content:"\FF08"}.mdi-file-cad-box::before{content:"\FF09"}.mdi-file-cancel::before{content:"\FDA2"}.mdi-file-cancel-outline::before{content:"\FDA3"}.mdi-file-certificate::before{content:"\F01B1"}.mdi-file-certificate-outline::before{content:"\F01B2"}.mdi-file-chart::before{content:"\F215"}.mdi-file-chart-outline::before{content:"\F004B"}.mdi-file-check::before{content:"\F216"}.mdi-file-check-outline::before{content:"\FE7B"}.mdi-file-clock::before{content:"\F030C"}.mdi-file-clock-outline::before{content:"\F030D"}.mdi-file-cloud::before{content:"\F217"}.mdi-file-cloud-outline::before{content:"\F004C"}.mdi-file-code::before{content:"\F22E"}.mdi-file-code-outline::before{content:"\F004D"}.mdi-file-compare::before{content:"\F8A9"}.mdi-file-delimited::before{content:"\F218"}.mdi-file-delimited-outline::before{content:"\FEC2"}.mdi-file-document::before{content:"\F219"}.mdi-file-document-box::before{content:"\F21A"}.mdi-file-document-box-check::before{content:"\FEC3"}.mdi-file-document-box-check-outline::before{content:"\FEC4"}.mdi-file-document-box-minus::before{content:"\FEC5"}.mdi-file-document-box-minus-outline::before{content:"\FEC6"}.mdi-file-document-box-multiple::before{content:"\FAB6"}.mdi-file-document-box-multiple-outline::before{content:"\FAB7"}.mdi-file-document-box-outline::before{content:"\F9EC"}.mdi-file-document-box-plus::before{content:"\FEC7"}.mdi-file-document-box-plus-outline::before{content:"\FEC8"}.mdi-file-document-box-remove::before{content:"\FEC9"}.mdi-file-document-box-remove-outline::before{content:"\FECA"}.mdi-file-document-box-search::before{content:"\FECB"}.mdi-file-document-box-search-outline::before{content:"\FECC"}.mdi-file-document-edit::before{content:"\FDA4"}.mdi-file-document-edit-outline::before{content:"\FDA5"}.mdi-file-document-outline::before{content:"\F9ED"}.mdi-file-download::before{content:"\F964"}.mdi-file-download-outline::before{content:"\F965"}.mdi-file-edit::before{content:"\F0212"}.mdi-file-edit-outline::before{content:"\F0213"}.mdi-file-excel::before{content:"\F21B"}.mdi-file-excel-box::before{content:"\F21C"}.mdi-file-excel-box-outline::before{content:"\F004E"}.mdi-file-excel-outline::before{content:"\F004F"}.mdi-file-export::before{content:"\F21D"}.mdi-file-export-outline::before{content:"\F0050"}.mdi-file-eye::before{content:"\FDA6"}.mdi-file-eye-outline::before{content:"\FDA7"}.mdi-file-find::before{content:"\F21E"}.mdi-file-find-outline::before{content:"\FB73"}.mdi-file-hidden::before{content:"\F613"}.mdi-file-image::before{content:"\F21F"}.mdi-file-image-outline::before{content:"\FECD"}.mdi-file-import::before{content:"\F220"}.mdi-file-import-outline::before{content:"\F0051"}.mdi-file-key::before{content:"\F01AF"}.mdi-file-key-outline::before{content:"\F01B0"}.mdi-file-link::before{content:"\F01A2"}.mdi-file-link-outline::before{content:"\F01A3"}.mdi-file-lock::before{content:"\F221"}.mdi-file-lock-outline::before{content:"\F0052"}.mdi-file-move::before{content:"\FAB8"}.mdi-file-move-outline::before{content:"\F0053"}.mdi-file-multiple::before{content:"\F222"}.mdi-file-multiple-outline::before{content:"\F0054"}.mdi-file-music::before{content:"\F223"}.mdi-file-music-outline::before{content:"\FE7C"}.mdi-file-outline::before{content:"\F224"}.mdi-file-pdf::before{content:"\F225"}.mdi-file-pdf-box::before{content:"\F226"}.mdi-file-pdf-box-outline::before{content:"\FFD3"}.mdi-file-pdf-outline::before{content:"\FE7D"}.mdi-file-percent::before{content:"\F81D"}.mdi-file-percent-outline::before{content:"\F0055"}.mdi-file-phone::before{content:"\F01A4"}.mdi-file-phone-outline::before{content:"\F01A5"}.mdi-file-plus::before{content:"\F751"}.mdi-file-plus-outline::before{content:"\FF0A"}.mdi-file-powerpoint::before{content:"\F227"}.mdi-file-powerpoint-box::before{content:"\F228"}.mdi-file-powerpoint-box-outline::before{content:"\F0056"}.mdi-file-powerpoint-outline::before{content:"\F0057"}.mdi-file-presentation-box::before{content:"\F229"}.mdi-file-question::before{content:"\F86E"}.mdi-file-question-outline::before{content:"\F0058"}.mdi-file-remove::before{content:"\FB74"}.mdi-file-remove-outline::before{content:"\F0059"}.mdi-file-replace::before{content:"\FB17"}.mdi-file-replace-outline::before{content:"\FB18"}.mdi-file-restore::before{content:"\F670"}.mdi-file-restore-outline::before{content:"\F005A"}.mdi-file-search::before{content:"\FC58"}.mdi-file-search-outline::before{content:"\FC59"}.mdi-file-send::before{content:"\F22A"}.mdi-file-send-outline::before{content:"\F005B"}.mdi-file-settings::before{content:"\F00A4"}.mdi-file-settings-outline::before{content:"\F00A5"}.mdi-file-settings-variant::before{content:"\F00A6"}.mdi-file-settings-variant-outline::before{content:"\F00A7"}.mdi-file-star::before{content:"\F005C"}.mdi-file-star-outline::before{content:"\F005D"}.mdi-file-swap::before{content:"\FFD4"}.mdi-file-swap-outline::before{content:"\FFD5"}.mdi-file-sync::before{content:"\F0241"}.mdi-file-sync-outline::before{content:"\F0242"}.mdi-file-table::before{content:"\FC5A"}.mdi-file-table-box::before{content:"\F010C"}.mdi-file-table-box-multiple::before{content:"\F010D"}.mdi-file-table-box-multiple-outline::before{content:"\F010E"}.mdi-file-table-box-outline::before{content:"\F010F"}.mdi-file-table-outline::before{content:"\FC5B"}.mdi-file-tree::before{content:"\F645"}.mdi-file-undo::before{content:"\F8DB"}.mdi-file-undo-outline::before{content:"\F005E"}.mdi-file-upload::before{content:"\FA4C"}.mdi-file-upload-outline::before{content:"\FA4D"}.mdi-file-video::before{content:"\F22B"}.mdi-file-video-outline::before{content:"\FE10"}.mdi-file-word::before{content:"\F22C"}.mdi-file-word-box::before{content:"\F22D"}.mdi-file-word-box-outline::before{content:"\F005F"}.mdi-file-word-outline::before{content:"\F0060"}.mdi-film::before{content:"\F22F"}.mdi-filmstrip::before{content:"\F230"}.mdi-filmstrip-off::before{content:"\F231"}.mdi-filter::before{content:"\F232"}.mdi-filter-menu::before{content:"\F0110"}.mdi-filter-menu-outline::before{content:"\F0111"}.mdi-filter-minus::before{content:"\FF0B"}.mdi-filter-minus-outline::before{content:"\FF0C"}.mdi-filter-outline::before{content:"\F233"}.mdi-filter-plus::before{content:"\FF0D"}.mdi-filter-plus-outline::before{content:"\FF0E"}.mdi-filter-remove::before{content:"\F234"}.mdi-filter-remove-outline::before{content:"\F235"}.mdi-filter-variant::before{content:"\F236"}.mdi-filter-variant-minus::before{content:"\F013D"}.mdi-filter-variant-plus::before{content:"\F013E"}.mdi-filter-variant-remove::before{content:"\F0061"}.mdi-finance::before{content:"\F81E"}.mdi-find-replace::before{content:"\F6D3"}.mdi-fingerprint::before{content:"\F237"}.mdi-fingerprint-off::before{content:"\FECE"}.mdi-fire::before{content:"\F238"}.mdi-fire-extinguisher::before{content:"\FF0F"}.mdi-fire-hydrant::before{content:"\F0162"}.mdi-fire-hydrant-alert::before{content:"\F0163"}.mdi-fire-hydrant-off::before{content:"\F0164"}.mdi-fire-truck::before{content:"\F8AA"}.mdi-firebase::before{content:"\F966"}.mdi-firefox::before{content:"\F239"}.mdi-fireplace::before{content:"\FE11"}.mdi-fireplace-off::before{content:"\FE12"}.mdi-firework::before{content:"\FE13"}.mdi-fish::before{content:"\F23A"}.mdi-fishbowl::before{content:"\FF10"}.mdi-fishbowl-outline::before{content:"\FF11"}.mdi-fit-to-page::before{content:"\FF12"}.mdi-fit-to-page-outline::before{content:"\FF13"}.mdi-flag::before{content:"\F23B"}.mdi-flag-checkered::before{content:"\F23C"}.mdi-flag-minus::before{content:"\FB75"}.mdi-flag-minus-outline::before{content:"\F00DD"}.mdi-flag-outline::before{content:"\F23D"}.mdi-flag-plus::before{content:"\FB76"}.mdi-flag-plus-outline::before{content:"\F00DE"}.mdi-flag-remove::before{content:"\FB77"}.mdi-flag-remove-outline::before{content:"\F00DF"}.mdi-flag-triangle::before{content:"\F23F"}.mdi-flag-variant::before{content:"\F240"}.mdi-flag-variant-outline::before{content:"\F23E"}.mdi-flare::before{content:"\FD4E"}.mdi-flash::before{content:"\F241"}.mdi-flash-alert::before{content:"\FF14"}.mdi-flash-alert-outline::before{content:"\FF15"}.mdi-flash-auto::before{content:"\F242"}.mdi-flash-circle::before{content:"\F81F"}.mdi-flash-off::before{content:"\F243"}.mdi-flash-outline::before{content:"\F6D4"}.mdi-flash-red-eye::before{content:"\F67A"}.mdi-flashlight::before{content:"\F244"}.mdi-flashlight-off::before{content:"\F245"}.mdi-flask::before{content:"\F093"}.mdi-flask-empty::before{content:"\F094"}.mdi-flask-empty-minus::before{content:"\F0265"}.mdi-flask-empty-minus-outline::before{content:"\F0266"}.mdi-flask-empty-outline::before{content:"\F095"}.mdi-flask-empty-plus::before{content:"\F0267"}.mdi-flask-empty-plus-outline::before{content:"\F0268"}.mdi-flask-empty-remove::before{content:"\F0269"}.mdi-flask-empty-remove-outline::before{content:"\F026A"}.mdi-flask-minus::before{content:"\F026B"}.mdi-flask-minus-outline::before{content:"\F026C"}.mdi-flask-outline::before{content:"\F096"}.mdi-flask-plus::before{content:"\F026D"}.mdi-flask-plus-outline::before{content:"\F026E"}.mdi-flask-remove::before{content:"\F026F"}.mdi-flask-remove-outline::before{content:"\F0270"}.mdi-flask-round-bottom::before{content:"\F0276"}.mdi-flask-round-bottom-empty::before{content:"\F0277"}.mdi-flask-round-bottom-empty-outline::before{content:"\F0278"}.mdi-flask-round-bottom-outline::before{content:"\F0279"}.mdi-flattr::before{content:"\F246"}.mdi-fleur-de-lis::before{content:"\F032E"}.mdi-flickr::before{content:"\FCE3"}.mdi-flip-horizontal::before{content:"\F0112"}.mdi-flip-to-back::before{content:"\F247"}.mdi-flip-to-front::before{content:"\F248"}.mdi-flip-vertical::before{content:"\F0113"}.mdi-floor-lamp::before{content:"\F8DC"}.mdi-floor-lamp-dual::before{content:"\F0062"}.mdi-floor-lamp-variant::before{content:"\F0063"}.mdi-floor-plan::before{content:"\F820"}.mdi-floppy::before{content:"\F249"}.mdi-floppy-variant::before{content:"\F9EE"}.mdi-flower::before{content:"\F24A"}.mdi-flower-outline::before{content:"\F9EF"}.mdi-flower-poppy::before{content:"\FCE4"}.mdi-flower-tulip::before{content:"\F9F0"}.mdi-flower-tulip-outline::before{content:"\F9F1"}.mdi-focus-auto::before{content:"\FF6B"}.mdi-focus-field::before{content:"\FF6C"}.mdi-focus-field-horizontal::before{content:"\FF6D"}.mdi-focus-field-vertical::before{content:"\FF6E"}.mdi-folder::before{content:"\F24B"}.mdi-folder-account::before{content:"\F24C"}.mdi-folder-account-outline::before{content:"\FB78"}.mdi-folder-alert::before{content:"\FDA8"}.mdi-folder-alert-outline::before{content:"\FDA9"}.mdi-folder-clock::before{content:"\FAB9"}.mdi-folder-clock-outline::before{content:"\FABA"}.mdi-folder-download::before{content:"\F24D"}.mdi-folder-download-outline::before{content:"\F0114"}.mdi-folder-edit::before{content:"\F8DD"}.mdi-folder-edit-outline::before{content:"\FDAA"}.mdi-folder-google-drive::before{content:"\F24E"}.mdi-folder-heart::before{content:"\F0115"}.mdi-folder-heart-outline::before{content:"\F0116"}.mdi-folder-home::before{content:"\F00E0"}.mdi-folder-home-outline::before{content:"\F00E1"}.mdi-folder-image::before{content:"\F24F"}.mdi-folder-information::before{content:"\F00E2"}.mdi-folder-information-outline::before{content:"\F00E3"}.mdi-folder-key::before{content:"\F8AB"}.mdi-folder-key-network::before{content:"\F8AC"}.mdi-folder-key-network-outline::before{content:"\FC5C"}.mdi-folder-key-outline::before{content:"\F0117"}.mdi-folder-lock::before{content:"\F250"}.mdi-folder-lock-open::before{content:"\F251"}.mdi-folder-marker::before{content:"\F0298"}.mdi-folder-marker-outline::before{content:"\F0299"}.mdi-folder-move::before{content:"\F252"}.mdi-folder-move-outline::before{content:"\F0271"}.mdi-folder-multiple::before{content:"\F253"}.mdi-folder-multiple-image::before{content:"\F254"}.mdi-folder-multiple-outline::before{content:"\F255"}.mdi-folder-music::before{content:"\F0384"}.mdi-folder-music-outline::before{content:"\F0385"}.mdi-folder-network::before{content:"\F86F"}.mdi-folder-network-outline::before{content:"\FC5D"}.mdi-folder-open::before{content:"\F76F"}.mdi-folder-open-outline::before{content:"\FDAB"}.mdi-folder-outline::before{content:"\F256"}.mdi-folder-plus::before{content:"\F257"}.mdi-folder-plus-outline::before{content:"\FB79"}.mdi-folder-pound::before{content:"\FCE5"}.mdi-folder-pound-outline::before{content:"\FCE6"}.mdi-folder-remove::before{content:"\F258"}.mdi-folder-remove-outline::before{content:"\FB7A"}.mdi-folder-search::before{content:"\F967"}.mdi-folder-search-outline::before{content:"\F968"}.mdi-folder-settings::before{content:"\F00A8"}.mdi-folder-settings-outline::before{content:"\F00A9"}.mdi-folder-settings-variant::before{content:"\F00AA"}.mdi-folder-settings-variant-outline::before{content:"\F00AB"}.mdi-folder-star::before{content:"\F69C"}.mdi-folder-star-outline::before{content:"\FB7B"}.mdi-folder-swap::before{content:"\FFD6"}.mdi-folder-swap-outline::before{content:"\FFD7"}.mdi-folder-sync::before{content:"\FCE7"}.mdi-folder-sync-outline::before{content:"\FCE8"}.mdi-folder-table::before{content:"\F030E"}.mdi-folder-table-outline::before{content:"\F030F"}.mdi-folder-text::before{content:"\FC5E"}.mdi-folder-text-outline::before{content:"\FC5F"}.mdi-folder-upload::before{content:"\F259"}.mdi-folder-upload-outline::before{content:"\F0118"}.mdi-folder-zip::before{content:"\F6EA"}.mdi-folder-zip-outline::before{content:"\F7B8"}.mdi-font-awesome::before{content:"\F03A"}.mdi-food::before{content:"\F25A"}.mdi-food-apple::before{content:"\F25B"}.mdi-food-apple-outline::before{content:"\FC60"}.mdi-food-croissant::before{content:"\F7C7"}.mdi-food-fork-drink::before{content:"\F5F2"}.mdi-food-off::before{content:"\F5F3"}.mdi-food-variant::before{content:"\F25C"}.mdi-foot-print::before{content:"\FF6F"}.mdi-football::before{content:"\F25D"}.mdi-football-australian::before{content:"\F25E"}.mdi-football-helmet::before{content:"\F25F"}.mdi-forklift::before{content:"\F7C8"}.mdi-format-align-bottom::before{content:"\F752"}.mdi-format-align-center::before{content:"\F260"}.mdi-format-align-justify::before{content:"\F261"}.mdi-format-align-left::before{content:"\F262"}.mdi-format-align-middle::before{content:"\F753"}.mdi-format-align-right::before{content:"\F263"}.mdi-format-align-top::before{content:"\F754"}.mdi-format-annotation-minus::before{content:"\FABB"}.mdi-format-annotation-plus::before{content:"\F646"}.mdi-format-bold::before{content:"\F264"}.mdi-format-clear::before{content:"\F265"}.mdi-format-color-fill::before{content:"\F266"}.mdi-format-color-highlight::before{content:"\FE14"}.mdi-format-color-marker-cancel::before{content:"\F033E"}.mdi-format-color-text::before{content:"\F69D"}.mdi-format-columns::before{content:"\F8DE"}.mdi-format-float-center::before{content:"\F267"}.mdi-format-float-left::before{content:"\F268"}.mdi-format-float-none::before{content:"\F269"}.mdi-format-float-right::before{content:"\F26A"}.mdi-format-font::before{content:"\F6D5"}.mdi-format-font-size-decrease::before{content:"\F9F2"}.mdi-format-font-size-increase::before{content:"\F9F3"}.mdi-format-header-1::before{content:"\F26B"}.mdi-format-header-2::before{content:"\F26C"}.mdi-format-header-3::before{content:"\F26D"}.mdi-format-header-4::before{content:"\F26E"}.mdi-format-header-5::before{content:"\F26F"}.mdi-format-header-6::before{content:"\F270"}.mdi-format-header-decrease::before{content:"\F271"}.mdi-format-header-equal::before{content:"\F272"}.mdi-format-header-increase::before{content:"\F273"}.mdi-format-header-pound::before{content:"\F274"}.mdi-format-horizontal-align-center::before{content:"\F61E"}.mdi-format-horizontal-align-left::before{content:"\F61F"}.mdi-format-horizontal-align-right::before{content:"\F620"}.mdi-format-indent-decrease::before{content:"\F275"}.mdi-format-indent-increase::before{content:"\F276"}.mdi-format-italic::before{content:"\F277"}.mdi-format-letter-case::before{content:"\FB19"}.mdi-format-letter-case-lower::before{content:"\FB1A"}.mdi-format-letter-case-upper::before{content:"\FB1B"}.mdi-format-letter-ends-with::before{content:"\FFD8"}.mdi-format-letter-matches::before{content:"\FFD9"}.mdi-format-letter-starts-with::before{content:"\FFDA"}.mdi-format-line-spacing::before{content:"\F278"}.mdi-format-line-style::before{content:"\F5C8"}.mdi-format-line-weight::before{content:"\F5C9"}.mdi-format-list-bulleted::before{content:"\F279"}.mdi-format-list-bulleted-square::before{content:"\FDAC"}.mdi-format-list-bulleted-triangle::before{content:"\FECF"}.mdi-format-list-bulleted-type::before{content:"\F27A"}.mdi-format-list-checkbox::before{content:"\F969"}.mdi-format-list-checks::before{content:"\F755"}.mdi-format-list-numbered::before{content:"\F27B"}.mdi-format-list-numbered-rtl::before{content:"\FCE9"}.mdi-format-list-text::before{content:"\F029A"}.mdi-format-overline::before{content:"\FED0"}.mdi-format-page-break::before{content:"\F6D6"}.mdi-format-paint::before{content:"\F27C"}.mdi-format-paragraph::before{content:"\F27D"}.mdi-format-pilcrow::before{content:"\F6D7"}.mdi-format-quote-close::before{content:"\F27E"}.mdi-format-quote-close-outline::before{content:"\F01D3"}.mdi-format-quote-open::before{content:"\F756"}.mdi-format-quote-open-outline::before{content:"\F01D2"}.mdi-format-rotate-90::before{content:"\F6A9"}.mdi-format-section::before{content:"\F69E"}.mdi-format-size::before{content:"\F27F"}.mdi-format-strikethrough::before{content:"\F280"}.mdi-format-strikethrough-variant::before{content:"\F281"}.mdi-format-subscript::before{content:"\F282"}.mdi-format-superscript::before{content:"\F283"}.mdi-format-text::before{content:"\F284"}.mdi-format-text-rotation-angle-down::before{content:"\FFDB"}.mdi-format-text-rotation-angle-up::before{content:"\FFDC"}.mdi-format-text-rotation-down::before{content:"\FD4F"}.mdi-format-text-rotation-down-vertical::before{content:"\FFDD"}.mdi-format-text-rotation-none::before{content:"\FD50"}.mdi-format-text-rotation-up::before{content:"\FFDE"}.mdi-format-text-rotation-vertical::before{content:"\FFDF"}.mdi-format-text-variant::before{content:"\FE15"}.mdi-format-text-wrapping-clip::before{content:"\FCEA"}.mdi-format-text-wrapping-overflow::before{content:"\FCEB"}.mdi-format-text-wrapping-wrap::before{content:"\FCEC"}.mdi-format-textbox::before{content:"\FCED"}.mdi-format-textdirection-l-to-r::before{content:"\F285"}.mdi-format-textdirection-r-to-l::before{content:"\F286"}.mdi-format-title::before{content:"\F5F4"}.mdi-format-underline::before{content:"\F287"}.mdi-format-vertical-align-bottom::before{content:"\F621"}.mdi-format-vertical-align-center::before{content:"\F622"}.mdi-format-vertical-align-top::before{content:"\F623"}.mdi-format-wrap-inline::before{content:"\F288"}.mdi-format-wrap-square::before{content:"\F289"}.mdi-format-wrap-tight::before{content:"\F28A"}.mdi-format-wrap-top-bottom::before{content:"\F28B"}.mdi-forum::before{content:"\F28C"}.mdi-forum-outline::before{content:"\F821"}.mdi-forward::before{content:"\F28D"}.mdi-forwardburger::before{content:"\FD51"}.mdi-fountain::before{content:"\F96A"}.mdi-fountain-pen::before{content:"\FCEE"}.mdi-fountain-pen-tip::before{content:"\FCEF"}.mdi-foursquare::before{content:"\F28E"}.mdi-freebsd::before{content:"\F8DF"}.mdi-frequently-asked-questions::before{content:"\FED1"}.mdi-fridge::before{content:"\F290"}.mdi-fridge-alert::before{content:"\F01DC"}.mdi-fridge-alert-outline::before{content:"\F01DD"}.mdi-fridge-bottom::before{content:"\F292"}.mdi-fridge-off::before{content:"\F01DA"}.mdi-fridge-off-outline::before{content:"\F01DB"}.mdi-fridge-outline::before{content:"\F28F"}.mdi-fridge-top::before{content:"\F291"}.mdi-fruit-cherries::before{content:"\F0064"}.mdi-fruit-citrus::before{content:"\F0065"}.mdi-fruit-grapes::before{content:"\F0066"}.mdi-fruit-grapes-outline::before{content:"\F0067"}.mdi-fruit-pineapple::before{content:"\F0068"}.mdi-fruit-watermelon::before{content:"\F0069"}.mdi-fuel::before{content:"\F7C9"}.mdi-fullscreen::before{content:"\F293"}.mdi-fullscreen-exit::before{content:"\F294"}.mdi-function::before{content:"\F295"}.mdi-function-variant::before{content:"\F870"}.mdi-furigana-horizontal::before{content:"\F00AC"}.mdi-furigana-vertical::before{content:"\F00AD"}.mdi-fuse::before{content:"\FC61"}.mdi-fuse-blade::before{content:"\FC62"}.mdi-gamepad::before{content:"\F296"}.mdi-gamepad-circle::before{content:"\FE16"}.mdi-gamepad-circle-down::before{content:"\FE17"}.mdi-gamepad-circle-left::before{content:"\FE18"}.mdi-gamepad-circle-outline::before{content:"\FE19"}.mdi-gamepad-circle-right::before{content:"\FE1A"}.mdi-gamepad-circle-up::before{content:"\FE1B"}.mdi-gamepad-down::before{content:"\FE1C"}.mdi-gamepad-left::before{content:"\FE1D"}.mdi-gamepad-right::before{content:"\FE1E"}.mdi-gamepad-round::before{content:"\FE1F"}.mdi-gamepad-round-down::before{content:"\FE7E"}.mdi-gamepad-round-left::before{content:"\FE7F"}.mdi-gamepad-round-outline::before{content:"\FE80"}.mdi-gamepad-round-right::before{content:"\FE81"}.mdi-gamepad-round-up::before{content:"\FE82"}.mdi-gamepad-square::before{content:"\FED2"}.mdi-gamepad-square-outline::before{content:"\FED3"}.mdi-gamepad-up::before{content:"\FE83"}.mdi-gamepad-variant::before{content:"\F297"}.mdi-gamepad-variant-outline::before{content:"\FED4"}.mdi-gamma::before{content:"\F0119"}.mdi-gantry-crane::before{content:"\FDAD"}.mdi-garage::before{content:"\F6D8"}.mdi-garage-alert::before{content:"\F871"}.mdi-garage-alert-variant::before{content:"\F0300"}.mdi-garage-open::before{content:"\F6D9"}.mdi-garage-open-variant::before{content:"\F02FF"}.mdi-garage-variant::before{content:"\F02FE"}.mdi-gas-cylinder::before{content:"\F647"}.mdi-gas-station::before{content:"\F298"}.mdi-gas-station-outline::before{content:"\FED5"}.mdi-gate::before{content:"\F299"}.mdi-gate-and::before{content:"\F8E0"}.mdi-gate-arrow-right::before{content:"\F0194"}.mdi-gate-nand::before{content:"\F8E1"}.mdi-gate-nor::before{content:"\F8E2"}.mdi-gate-not::before{content:"\F8E3"}.mdi-gate-open::before{content:"\F0195"}.mdi-gate-or::before{content:"\F8E4"}.mdi-gate-xnor::before{content:"\F8E5"}.mdi-gate-xor::before{content:"\F8E6"}.mdi-gatsby::before{content:"\FE84"}.mdi-gauge::before{content:"\F29A"}.mdi-gauge-empty::before{content:"\F872"}.mdi-gauge-full::before{content:"\F873"}.mdi-gauge-low::before{content:"\F874"}.mdi-gavel::before{content:"\F29B"}.mdi-gender-female::before{content:"\F29C"}.mdi-gender-male::before{content:"\F29D"}.mdi-gender-male-female::before{content:"\F29E"}.mdi-gender-male-female-variant::before{content:"\F016A"}.mdi-gender-non-binary::before{content:"\F016B"}.mdi-gender-transgender::before{content:"\F29F"}.mdi-gentoo::before{content:"\F8E7"}.mdi-gesture::before{content:"\F7CA"}.mdi-gesture-double-tap::before{content:"\F73B"}.mdi-gesture-pinch::before{content:"\FABC"}.mdi-gesture-spread::before{content:"\FABD"}.mdi-gesture-swipe::before{content:"\FD52"}.mdi-gesture-swipe-down::before{content:"\F73C"}.mdi-gesture-swipe-horizontal::before{content:"\FABE"}.mdi-gesture-swipe-left::before{content:"\F73D"}.mdi-gesture-swipe-right::before{content:"\F73E"}.mdi-gesture-swipe-up::before{content:"\F73F"}.mdi-gesture-swipe-vertical::before{content:"\FABF"}.mdi-gesture-tap::before{content:"\F740"}.mdi-gesture-tap-box::before{content:"\F02D4"}.mdi-gesture-tap-button::before{content:"\F02D3"}.mdi-gesture-tap-hold::before{content:"\FD53"}.mdi-gesture-two-double-tap::before{content:"\F741"}.mdi-gesture-two-tap::before{content:"\F742"}.mdi-ghost::before{content:"\F2A0"}.mdi-ghost-off::before{content:"\F9F4"}.mdi-gif::before{content:"\FD54"}.mdi-gift::before{content:"\FE85"}.mdi-gift-outline::before{content:"\F2A1"}.mdi-git::before{content:"\F2A2"}.mdi-github-box::before{content:"\F2A3"}.mdi-github-circle::before{content:"\F2A4"}.mdi-github-face::before{content:"\F6DA"}.mdi-gitlab::before{content:"\FB7C"}.mdi-glass-cocktail::before{content:"\F356"}.mdi-glass-flute::before{content:"\F2A5"}.mdi-glass-mug::before{content:"\F2A6"}.mdi-glass-mug-variant::before{content:"\F0141"}.mdi-glass-pint-outline::before{content:"\F0338"}.mdi-glass-stange::before{content:"\F2A7"}.mdi-glass-tulip::before{content:"\F2A8"}.mdi-glass-wine::before{content:"\F875"}.mdi-glassdoor::before{content:"\F2A9"}.mdi-glasses::before{content:"\F2AA"}.mdi-globe-light::before{content:"\F0302"}.mdi-globe-model::before{content:"\F8E8"}.mdi-gmail::before{content:"\F2AB"}.mdi-gnome::before{content:"\F2AC"}.mdi-go-kart::before{content:"\FD55"}.mdi-go-kart-track::before{content:"\FD56"}.mdi-gog::before{content:"\FB7D"}.mdi-gold::before{content:"\F027A"}.mdi-golf::before{content:"\F822"}.mdi-golf-cart::before{content:"\F01CF"}.mdi-golf-tee::before{content:"\F00AE"}.mdi-gondola::before{content:"\F685"}.mdi-goodreads::before{content:"\FD57"}.mdi-google::before{content:"\F2AD"}.mdi-google-adwords::before{content:"\FC63"}.mdi-google-analytics::before{content:"\F7CB"}.mdi-google-assistant::before{content:"\F7CC"}.mdi-google-cardboard::before{content:"\F2AE"}.mdi-google-chrome::before{content:"\F2AF"}.mdi-google-circles::before{content:"\F2B0"}.mdi-google-circles-communities::before{content:"\F2B1"}.mdi-google-circles-extended::before{content:"\F2B2"}.mdi-google-circles-group::before{content:"\F2B3"}.mdi-google-classroom::before{content:"\F2C0"}.mdi-google-cloud::before{content:"\F0221"}.mdi-google-controller::before{content:"\F2B4"}.mdi-google-controller-off::before{content:"\F2B5"}.mdi-google-downasaur::before{content:"\F038D"}.mdi-google-drive::before{content:"\F2B6"}.mdi-google-earth::before{content:"\F2B7"}.mdi-google-fit::before{content:"\F96B"}.mdi-google-glass::before{content:"\F2B8"}.mdi-google-hangouts::before{content:"\F2C9"}.mdi-google-home::before{content:"\F823"}.mdi-google-keep::before{content:"\F6DB"}.mdi-google-lens::before{content:"\F9F5"}.mdi-google-maps::before{content:"\F5F5"}.mdi-google-my-business::before{content:"\F006A"}.mdi-google-nearby::before{content:"\F2B9"}.mdi-google-pages::before{content:"\F2BA"}.mdi-google-photos::before{content:"\F6DC"}.mdi-google-physical-web::before{content:"\F2BB"}.mdi-google-play::before{content:"\F2BC"}.mdi-google-plus::before{content:"\F2BD"}.mdi-google-plus-box::before{content:"\F2BE"}.mdi-google-podcast::before{content:"\FED6"}.mdi-google-spreadsheet::before{content:"\F9F6"}.mdi-google-street-view::before{content:"\FC64"}.mdi-google-translate::before{content:"\F2BF"}.mdi-gradient::before{content:"\F69F"}.mdi-grain::before{content:"\FD58"}.mdi-graph::before{content:"\F006B"}.mdi-graph-outline::before{content:"\F006C"}.mdi-graphql::before{content:"\F876"}.mdi-grave-stone::before{content:"\FB7E"}.mdi-grease-pencil::before{content:"\F648"}.mdi-greater-than::before{content:"\F96C"}.mdi-greater-than-or-equal::before{content:"\F96D"}.mdi-grid::before{content:"\F2C1"}.mdi-grid-large::before{content:"\F757"}.mdi-grid-off::before{content:"\F2C2"}.mdi-grill::before{content:"\FE86"}.mdi-grill-outline::before{content:"\F01B5"}.mdi-group::before{content:"\F2C3"}.mdi-guitar-acoustic::before{content:"\F770"}.mdi-guitar-electric::before{content:"\F2C4"}.mdi-guitar-pick::before{content:"\F2C5"}.mdi-guitar-pick-outline::before{content:"\F2C6"}.mdi-guy-fawkes-mask::before{content:"\F824"}.mdi-hackernews::before{content:"\F624"}.mdi-hail::before{content:"\FAC0"}.mdi-hair-dryer::before{content:"\F011A"}.mdi-hair-dryer-outline::before{content:"\F011B"}.mdi-halloween::before{content:"\FB7F"}.mdi-hamburger::before{content:"\F684"}.mdi-hammer::before{content:"\F8E9"}.mdi-hammer-screwdriver::before{content:"\F034D"}.mdi-hammer-wrench::before{content:"\F034E"}.mdi-hand::before{content:"\FA4E"}.mdi-hand-heart::before{content:"\F011C"}.mdi-hand-left::before{content:"\FE87"}.mdi-hand-okay::before{content:"\FA4F"}.mdi-hand-peace::before{content:"\FA50"}.mdi-hand-peace-variant::before{content:"\FA51"}.mdi-hand-pointing-down::before{content:"\FA52"}.mdi-hand-pointing-left::before{content:"\FA53"}.mdi-hand-pointing-right::before{content:"\F2C7"}.mdi-hand-pointing-up::before{content:"\FA54"}.mdi-hand-right::before{content:"\FE88"}.mdi-hand-saw::before{content:"\FE89"}.mdi-handball::before{content:"\FF70"}.mdi-handcuffs::before{content:"\F0169"}.mdi-handshake::before{content:"\F0243"}.mdi-hanger::before{content:"\F2C8"}.mdi-hard-hat::before{content:"\F96E"}.mdi-harddisk::before{content:"\F2CA"}.mdi-harddisk-plus::before{content:"\F006D"}.mdi-harddisk-remove::before{content:"\F006E"}.mdi-hat-fedora::before{content:"\FB80"}.mdi-hazard-lights::before{content:"\FC65"}.mdi-hdr::before{content:"\FD59"}.mdi-hdr-off::before{content:"\FD5A"}.mdi-head::before{content:"\F0389"}.mdi-head-alert::before{content:"\F0363"}.mdi-head-alert-outline::before{content:"\F0364"}.mdi-head-check::before{content:"\F0365"}.mdi-head-check-outline::before{content:"\F0366"}.mdi-head-cog::before{content:"\F0367"}.mdi-head-cog-outline::before{content:"\F0368"}.mdi-head-dots-horizontal::before{content:"\F0369"}.mdi-head-dots-horizontal-outline::before{content:"\F036A"}.mdi-head-flash::before{content:"\F036B"}.mdi-head-flash-outline::before{content:"\F036C"}.mdi-head-heart::before{content:"\F036D"}.mdi-head-heart-outline::before{content:"\F036E"}.mdi-head-lightbulb::before{content:"\F036F"}.mdi-head-lightbulb-outline::before{content:"\F0370"}.mdi-head-minus::before{content:"\F0371"}.mdi-head-minus-outline::before{content:"\F0372"}.mdi-head-outline::before{content:"\F038A"}.mdi-head-plus::before{content:"\F0373"}.mdi-head-plus-outline::before{content:"\F0374"}.mdi-head-question::before{content:"\F0375"}.mdi-head-question-outline::before{content:"\F0376"}.mdi-head-remove::before{content:"\F0377"}.mdi-head-remove-outline::before{content:"\F0378"}.mdi-head-snowflake::before{content:"\F0379"}.mdi-head-snowflake-outline::before{content:"\F037A"}.mdi-head-sync::before{content:"\F037B"}.mdi-head-sync-outline::before{content:"\F037C"}.mdi-headphones::before{content:"\F2CB"}.mdi-headphones-bluetooth::before{content:"\F96F"}.mdi-headphones-box::before{content:"\F2CC"}.mdi-headphones-off::before{content:"\F7CD"}.mdi-headphones-settings::before{content:"\F2CD"}.mdi-headset::before{content:"\F2CE"}.mdi-headset-dock::before{content:"\F2CF"}.mdi-headset-off::before{content:"\F2D0"}.mdi-heart::before{content:"\F2D1"}.mdi-heart-box::before{content:"\F2D2"}.mdi-heart-box-outline::before{content:"\F2D3"}.mdi-heart-broken::before{content:"\F2D4"}.mdi-heart-broken-outline::before{content:"\FCF0"}.mdi-heart-circle::before{content:"\F970"}.mdi-heart-circle-outline::before{content:"\F971"}.mdi-heart-flash::before{content:"\FF16"}.mdi-heart-half::before{content:"\F6DE"}.mdi-heart-half-full::before{content:"\F6DD"}.mdi-heart-half-outline::before{content:"\F6DF"}.mdi-heart-multiple::before{content:"\FA55"}.mdi-heart-multiple-outline::before{content:"\FA56"}.mdi-heart-off::before{content:"\F758"}.mdi-heart-outline::before{content:"\F2D5"}.mdi-heart-pulse::before{content:"\F5F6"}.mdi-helicopter::before{content:"\FAC1"}.mdi-help::before{content:"\F2D6"}.mdi-help-box::before{content:"\F78A"}.mdi-help-circle::before{content:"\F2D7"}.mdi-help-circle-outline::before{content:"\F625"}.mdi-help-network::before{content:"\F6F4"}.mdi-help-network-outline::before{content:"\FC66"}.mdi-help-rhombus::before{content:"\FB81"}.mdi-help-rhombus-outline::before{content:"\FB82"}.mdi-hexadecimal::before{content:"\F02D2"}.mdi-hexagon::before{content:"\F2D8"}.mdi-hexagon-multiple::before{content:"\F6E0"}.mdi-hexagon-multiple-outline::before{content:"\F011D"}.mdi-hexagon-outline::before{content:"\F2D9"}.mdi-hexagon-slice-1::before{content:"\FAC2"}.mdi-hexagon-slice-2::before{content:"\FAC3"}.mdi-hexagon-slice-3::before{content:"\FAC4"}.mdi-hexagon-slice-4::before{content:"\FAC5"}.mdi-hexagon-slice-5::before{content:"\FAC6"}.mdi-hexagon-slice-6::before{content:"\FAC7"}.mdi-hexagram::before{content:"\FAC8"}.mdi-hexagram-outline::before{content:"\FAC9"}.mdi-high-definition::before{content:"\F7CE"}.mdi-high-definition-box::before{content:"\F877"}.mdi-highway::before{content:"\F5F7"}.mdi-hiking::before{content:"\FD5B"}.mdi-hinduism::before{content:"\F972"}.mdi-history::before{content:"\F2DA"}.mdi-hockey-puck::before{content:"\F878"}.mdi-hockey-sticks::before{content:"\F879"}.mdi-hololens::before{content:"\F2DB"}.mdi-home::before{content:"\F2DC"}.mdi-home-account::before{content:"\F825"}.mdi-home-alert::before{content:"\F87A"}.mdi-home-analytics::before{content:"\FED7"}.mdi-home-assistant::before{content:"\F7CF"}.mdi-home-automation::before{content:"\F7D0"}.mdi-home-circle::before{content:"\F7D1"}.mdi-home-circle-outline::before{content:"\F006F"}.mdi-home-city::before{content:"\FCF1"}.mdi-home-city-outline::before{content:"\FCF2"}.mdi-home-currency-usd::before{content:"\F8AE"}.mdi-home-edit::before{content:"\F0184"}.mdi-home-edit-outline::before{content:"\F0185"}.mdi-home-export-outline::before{content:"\FFB8"}.mdi-home-flood::before{content:"\FF17"}.mdi-home-floor-0::before{content:"\FDAE"}.mdi-home-floor-1::before{content:"\FD5C"}.mdi-home-floor-2::before{content:"\FD5D"}.mdi-home-floor-3::before{content:"\FD5E"}.mdi-home-floor-a::before{content:"\FD5F"}.mdi-home-floor-b::before{content:"\FD60"}.mdi-home-floor-g::before{content:"\FD61"}.mdi-home-floor-l::before{content:"\FD62"}.mdi-home-floor-negative-1::before{content:"\FDAF"}.mdi-home-group::before{content:"\FDB0"}.mdi-home-heart::before{content:"\F826"}.mdi-home-import-outline::before{content:"\FFB9"}.mdi-home-lightbulb::before{content:"\F027C"}.mdi-home-lightbulb-outline::before{content:"\F027D"}.mdi-home-lock::before{content:"\F8EA"}.mdi-home-lock-open::before{content:"\F8EB"}.mdi-home-map-marker::before{content:"\F5F8"}.mdi-home-minus::before{content:"\F973"}.mdi-home-modern::before{content:"\F2DD"}.mdi-home-outline::before{content:"\F6A0"}.mdi-home-plus::before{content:"\F974"}.mdi-home-remove::before{content:"\F0272"}.mdi-home-roof::before{content:"\F0156"}.mdi-home-thermometer::before{content:"\FF71"}.mdi-home-thermometer-outline::before{content:"\FF72"}.mdi-home-variant::before{content:"\F2DE"}.mdi-home-variant-outline::before{content:"\FB83"}.mdi-hook::before{content:"\F6E1"}.mdi-hook-off::before{content:"\F6E2"}.mdi-hops::before{content:"\F2DF"}.mdi-horizontal-rotate-clockwise::before{content:"\F011E"}.mdi-horizontal-rotate-counterclockwise::before{content:"\F011F"}.mdi-horseshoe::before{content:"\FA57"}.mdi-hospital::before{content:"\F0017"}.mdi-hospital-box::before{content:"\F2E0"}.mdi-hospital-box-outline::before{content:"\F0018"}.mdi-hospital-building::before{content:"\F2E1"}.mdi-hospital-marker::before{content:"\F2E2"}.mdi-hot-tub::before{content:"\F827"}.mdi-hotel::before{content:"\F2E3"}.mdi-houzz::before{content:"\F2E4"}.mdi-houzz-box::before{content:"\F2E5"}.mdi-hubspot::before{content:"\FCF3"}.mdi-hulu::before{content:"\F828"}.mdi-human::before{content:"\F2E6"}.mdi-human-child::before{content:"\F2E7"}.mdi-human-female::before{content:"\F649"}.mdi-human-female-boy::before{content:"\FA58"}.mdi-human-female-female::before{content:"\FA59"}.mdi-human-female-girl::before{content:"\FA5A"}.mdi-human-greeting::before{content:"\F64A"}.mdi-human-handsdown::before{content:"\F64B"}.mdi-human-handsup::before{content:"\F64C"}.mdi-human-male::before{content:"\F64D"}.mdi-human-male-boy::before{content:"\FA5B"}.mdi-human-male-female::before{content:"\F2E8"}.mdi-human-male-girl::before{content:"\FA5C"}.mdi-human-male-height::before{content:"\FF18"}.mdi-human-male-height-variant::before{content:"\FF19"}.mdi-human-male-male::before{content:"\FA5D"}.mdi-human-pregnant::before{content:"\F5CF"}.mdi-humble-bundle::before{content:"\F743"}.mdi-hvac::before{content:"\F037D"}.mdi-hydraulic-oil-level::before{content:"\F034F"}.mdi-hydraulic-oil-temperature::before{content:"\F0350"}.mdi-hydro-power::before{content:"\F0310"}.mdi-ice-cream::before{content:"\F829"}.mdi-ice-pop::before{content:"\FF1A"}.mdi-id-card::before{content:"\FFE0"}.mdi-identifier::before{content:"\FF1B"}.mdi-ideogram-cjk::before{content:"\F035C"}.mdi-ideogram-cjk-variant::before{content:"\F035D"}.mdi-iframe::before{content:"\FC67"}.mdi-iframe-array::before{content:"\F0120"}.mdi-iframe-array-outline::before{content:"\F0121"}.mdi-iframe-braces::before{content:"\F0122"}.mdi-iframe-braces-outline::before{content:"\F0123"}.mdi-iframe-outline::before{content:"\FC68"}.mdi-iframe-parentheses::before{content:"\F0124"}.mdi-iframe-parentheses-outline::before{content:"\F0125"}.mdi-iframe-variable::before{content:"\F0126"}.mdi-iframe-variable-outline::before{content:"\F0127"}.mdi-image::before{content:"\F2E9"}.mdi-image-album::before{content:"\F2EA"}.mdi-image-area::before{content:"\F2EB"}.mdi-image-area-close::before{content:"\F2EC"}.mdi-image-auto-adjust::before{content:"\FFE1"}.mdi-image-broken::before{content:"\F2ED"}.mdi-image-broken-variant::before{content:"\F2EE"}.mdi-image-edit::before{content:"\F020E"}.mdi-image-edit-outline::before{content:"\F020F"}.mdi-image-filter::before{content:"\F2EF"}.mdi-image-filter-black-white::before{content:"\F2F0"}.mdi-image-filter-center-focus::before{content:"\F2F1"}.mdi-image-filter-center-focus-strong::before{content:"\FF1C"}.mdi-image-filter-center-focus-strong-outline::before{content:"\FF1D"}.mdi-image-filter-center-focus-weak::before{content:"\F2F2"}.mdi-image-filter-drama::before{content:"\F2F3"}.mdi-image-filter-frames::before{content:"\F2F4"}.mdi-image-filter-hdr::before{content:"\F2F5"}.mdi-image-filter-none::before{content:"\F2F6"}.mdi-image-filter-tilt-shift::before{content:"\F2F7"}.mdi-image-filter-vintage::before{content:"\F2F8"}.mdi-image-frame::before{content:"\FE8A"}.mdi-image-move::before{content:"\F9F7"}.mdi-image-multiple::before{content:"\F2F9"}.mdi-image-off::before{content:"\F82A"}.mdi-image-off-outline::before{content:"\F01FC"}.mdi-image-outline::before{content:"\F975"}.mdi-image-plus::before{content:"\F87B"}.mdi-image-search::before{content:"\F976"}.mdi-image-search-outline::before{content:"\F977"}.mdi-image-size-select-actual::before{content:"\FC69"}.mdi-image-size-select-large::before{content:"\FC6A"}.mdi-image-size-select-small::before{content:"\FC6B"}.mdi-import::before{content:"\F2FA"}.mdi-inbox::before{content:"\F686"}.mdi-inbox-arrow-down::before{content:"\F2FB"}.mdi-inbox-arrow-down-outline::before{content:"\F029B"}.mdi-inbox-arrow-up::before{content:"\F3D1"}.mdi-inbox-arrow-up-outline::before{content:"\F029C"}.mdi-inbox-full::before{content:"\F029D"}.mdi-inbox-full-outline::before{content:"\F029E"}.mdi-inbox-multiple::before{content:"\F8AF"}.mdi-inbox-multiple-outline::before{content:"\FB84"}.mdi-inbox-outline::before{content:"\F029F"}.mdi-incognito::before{content:"\F5F9"}.mdi-infinity::before{content:"\F6E3"}.mdi-information::before{content:"\F2FC"}.mdi-information-outline::before{content:"\F2FD"}.mdi-information-variant::before{content:"\F64E"}.mdi-instagram::before{content:"\F2FE"}.mdi-instapaper::before{content:"\F2FF"}.mdi-instrument-triangle::before{content:"\F0070"}.mdi-internet-explorer::before{content:"\F300"}.mdi-invert-colors::before{content:"\F301"}.mdi-invert-colors-off::before{content:"\FE8B"}.mdi-iobroker::before{content:"\F0313"}.mdi-ip::before{content:"\FA5E"}.mdi-ip-network::before{content:"\FA5F"}.mdi-ip-network-outline::before{content:"\FC6C"}.mdi-ipod::before{content:"\FC6D"}.mdi-islam::before{content:"\F978"}.mdi-island::before{content:"\F0071"}.mdi-itunes::before{content:"\F676"}.mdi-iv-bag::before{content:"\F00E4"}.mdi-jabber::before{content:"\FDB1"}.mdi-jeepney::before{content:"\F302"}.mdi-jellyfish::before{content:"\FF1E"}.mdi-jellyfish-outline::before{content:"\FF1F"}.mdi-jira::before{content:"\F303"}.mdi-jquery::before{content:"\F87C"}.mdi-jsfiddle::before{content:"\F304"}.mdi-json::before{content:"\F626"}.mdi-judaism::before{content:"\F979"}.mdi-jump-rope::before{content:"\F032A"}.mdi-kabaddi::before{content:"\FD63"}.mdi-karate::before{content:"\F82B"}.mdi-keg::before{content:"\F305"}.mdi-kettle::before{content:"\F5FA"}.mdi-kettle-alert::before{content:"\F0342"}.mdi-kettle-alert-outline::before{content:"\F0343"}.mdi-kettle-off::before{content:"\F0346"}.mdi-kettle-off-outline::before{content:"\F0347"}.mdi-kettle-outline::before{content:"\FF73"}.mdi-kettle-steam::before{content:"\F0344"}.mdi-kettle-steam-outline::before{content:"\F0345"}.mdi-kettlebell::before{content:"\F032B"}.mdi-key::before{content:"\F306"}.mdi-key-arrow-right::before{content:"\F033D"}.mdi-key-change::before{content:"\F307"}.mdi-key-link::before{content:"\F01CA"}.mdi-key-minus::before{content:"\F308"}.mdi-key-outline::before{content:"\FDB2"}.mdi-key-plus::before{content:"\F309"}.mdi-key-remove::before{content:"\F30A"}.mdi-key-star::before{content:"\F01C9"}.mdi-key-variant::before{content:"\F30B"}.mdi-key-wireless::before{content:"\FFE2"}.mdi-keyboard::before{content:"\F30C"}.mdi-keyboard-backspace::before{content:"\F30D"}.mdi-keyboard-caps::before{content:"\F30E"}.mdi-keyboard-close::before{content:"\F30F"}.mdi-keyboard-esc::before{content:"\F02E2"}.mdi-keyboard-f1::before{content:"\F02D6"}.mdi-keyboard-f10::before{content:"\F02DF"}.mdi-keyboard-f11::before{content:"\F02E0"}.mdi-keyboard-f12::before{content:"\F02E1"}.mdi-keyboard-f2::before{content:"\F02D7"}.mdi-keyboard-f3::before{content:"\F02D8"}.mdi-keyboard-f4::before{content:"\F02D9"}.mdi-keyboard-f5::before{content:"\F02DA"}.mdi-keyboard-f6::before{content:"\F02DB"}.mdi-keyboard-f7::before{content:"\F02DC"}.mdi-keyboard-f8::before{content:"\F02DD"}.mdi-keyboard-f9::before{content:"\F02DE"}.mdi-keyboard-off::before{content:"\F310"}.mdi-keyboard-off-outline::before{content:"\FE8C"}.mdi-keyboard-outline::before{content:"\F97A"}.mdi-keyboard-return::before{content:"\F311"}.mdi-keyboard-settings::before{content:"\F9F8"}.mdi-keyboard-settings-outline::before{content:"\F9F9"}.mdi-keyboard-space::before{content:"\F0072"}.mdi-keyboard-tab::before{content:"\F312"}.mdi-keyboard-variant::before{content:"\F313"}.mdi-khanda::before{content:"\F0128"}.mdi-kickstarter::before{content:"\F744"}.mdi-klingon::before{content:"\F0386"}.mdi-knife::before{content:"\F9FA"}.mdi-knife-military::before{content:"\F9FB"}.mdi-kodi::before{content:"\F314"}.mdi-kotlin::before{content:"\F0244"}.mdi-kubernetes::before{content:"\F0129"}.mdi-label::before{content:"\F315"}.mdi-label-multiple::before{content:"\F03A0"}.mdi-label-multiple-outline::before{content:"\F03A1"}.mdi-label-off::before{content:"\FACA"}.mdi-label-off-outline::before{content:"\FACB"}.mdi-label-outline::before{content:"\F316"}.mdi-label-percent::before{content:"\F0315"}.mdi-label-percent-outline::before{content:"\F0316"}.mdi-label-variant::before{content:"\FACC"}.mdi-label-variant-outline::before{content:"\FACD"}.mdi-ladybug::before{content:"\F82C"}.mdi-lambda::before{content:"\F627"}.mdi-lamp::before{content:"\F6B4"}.mdi-lan::before{content:"\F317"}.mdi-lan-check::before{content:"\F02D5"}.mdi-lan-connect::before{content:"\F318"}.mdi-lan-disconnect::before{content:"\F319"}.mdi-lan-pending::before{content:"\F31A"}.mdi-language-c::before{content:"\F671"}.mdi-language-cpp::before{content:"\F672"}.mdi-language-csharp::before{content:"\F31B"}.mdi-language-css3::before{content:"\F31C"}.mdi-language-fortran::before{content:"\F0245"}.mdi-language-go::before{content:"\F7D2"}.mdi-language-haskell::before{content:"\FC6E"}.mdi-language-html5::before{content:"\F31D"}.mdi-language-java::before{content:"\FB1C"}.mdi-language-javascript::before{content:"\F31E"}.mdi-language-lua::before{content:"\F8B0"}.mdi-language-php::before{content:"\F31F"}.mdi-language-python::before{content:"\F320"}.mdi-language-python-text::before{content:"\F321"}.mdi-language-r::before{content:"\F7D3"}.mdi-language-ruby-on-rails::before{content:"\FACE"}.mdi-language-swift::before{content:"\F6E4"}.mdi-language-typescript::before{content:"\F6E5"}.mdi-laptop::before{content:"\F322"}.mdi-laptop-chromebook::before{content:"\F323"}.mdi-laptop-mac::before{content:"\F324"}.mdi-laptop-off::before{content:"\F6E6"}.mdi-laptop-windows::before{content:"\F325"}.mdi-laravel::before{content:"\FACF"}.mdi-lasso::before{content:"\FF20"}.mdi-lastfm::before{content:"\F326"}.mdi-lastpass::before{content:"\F446"}.mdi-latitude::before{content:"\FF74"}.mdi-launch::before{content:"\F327"}.mdi-lava-lamp::before{content:"\F7D4"}.mdi-layers::before{content:"\F328"}.mdi-layers-minus::before{content:"\FE8D"}.mdi-layers-off::before{content:"\F329"}.mdi-layers-off-outline::before{content:"\F9FC"}.mdi-layers-outline::before{content:"\F9FD"}.mdi-layers-plus::before{content:"\FE30"}.mdi-layers-remove::before{content:"\FE31"}.mdi-layers-search::before{content:"\F0231"}.mdi-layers-search-outline::before{content:"\F0232"}.mdi-layers-triple::before{content:"\FF75"}.mdi-layers-triple-outline::before{content:"\FF76"}.mdi-lead-pencil::before{content:"\F64F"}.mdi-leaf::before{content:"\F32A"}.mdi-leaf-maple::before{content:"\FC6F"}.mdi-leaf-maple-off::before{content:"\F0305"}.mdi-leaf-off::before{content:"\F0304"}.mdi-leak::before{content:"\FDB3"}.mdi-leak-off::before{content:"\FDB4"}.mdi-led-off::before{content:"\F32B"}.mdi-led-on::before{content:"\F32C"}.mdi-led-outline::before{content:"\F32D"}.mdi-led-strip::before{content:"\F7D5"}.mdi-led-strip-variant::before{content:"\F0073"}.mdi-led-variant-off::before{content:"\F32E"}.mdi-led-variant-on::before{content:"\F32F"}.mdi-led-variant-outline::before{content:"\F330"}.mdi-leek::before{content:"\F01A8"}.mdi-less-than::before{content:"\F97B"}.mdi-less-than-or-equal::before{content:"\F97C"}.mdi-library::before{content:"\F331"}.mdi-library-books::before{content:"\F332"}.mdi-library-movie::before{content:"\FCF4"}.mdi-library-music::before{content:"\F333"}.mdi-library-music-outline::before{content:"\FF21"}.mdi-library-shelves::before{content:"\FB85"}.mdi-library-video::before{content:"\FCF5"}.mdi-license::before{content:"\FFE3"}.mdi-lifebuoy::before{content:"\F87D"}.mdi-light-switch::before{content:"\F97D"}.mdi-lightbulb::before{content:"\F335"}.mdi-lightbulb-cfl::before{content:"\F0233"}.mdi-lightbulb-cfl-off::before{content:"\F0234"}.mdi-lightbulb-cfl-spiral::before{content:"\F02A0"}.mdi-lightbulb-cfl-spiral-off::before{content:"\F02EE"}.mdi-lightbulb-group::before{content:"\F027E"}.mdi-lightbulb-group-off::before{content:"\F02F8"}.mdi-lightbulb-group-off-outline::before{content:"\F02F9"}.mdi-lightbulb-group-outline::before{content:"\F027F"}.mdi-lightbulb-multiple::before{content:"\F0280"}.mdi-lightbulb-multiple-off::before{content:"\F02FA"}.mdi-lightbulb-multiple-off-outline::before{content:"\F02FB"}.mdi-lightbulb-multiple-outline::before{content:"\F0281"}.mdi-lightbulb-off::before{content:"\FE32"}.mdi-lightbulb-off-outline::before{content:"\FE33"}.mdi-lightbulb-on::before{content:"\F6E7"}.mdi-lightbulb-on-outline::before{content:"\F6E8"}.mdi-lightbulb-outline::before{content:"\F336"}.mdi-lighthouse::before{content:"\F9FE"}.mdi-lighthouse-on::before{content:"\F9FF"}.mdi-link::before{content:"\F337"}.mdi-link-box::before{content:"\FCF6"}.mdi-link-box-outline::before{content:"\FCF7"}.mdi-link-box-variant::before{content:"\FCF8"}.mdi-link-box-variant-outline::before{content:"\FCF9"}.mdi-link-lock::before{content:"\F00E5"}.mdi-link-off::before{content:"\F338"}.mdi-link-plus::before{content:"\FC70"}.mdi-link-variant::before{content:"\F339"}.mdi-link-variant-minus::before{content:"\F012A"}.mdi-link-variant-off::before{content:"\F33A"}.mdi-link-variant-plus::before{content:"\F012B"}.mdi-link-variant-remove::before{content:"\F012C"}.mdi-linkedin::before{content:"\F33B"}.mdi-linkedin-box::before{content:"\F33C"}.mdi-linux::before{content:"\F33D"}.mdi-linux-mint::before{content:"\F8EC"}.mdi-litecoin::before{content:"\FA60"}.mdi-loading::before{content:"\F771"}.mdi-location-enter::before{content:"\FFE4"}.mdi-location-exit::before{content:"\FFE5"}.mdi-lock::before{content:"\F33E"}.mdi-lock-alert::before{content:"\F8ED"}.mdi-lock-clock::before{content:"\F97E"}.mdi-lock-open::before{content:"\F33F"}.mdi-lock-open-outline::before{content:"\F340"}.mdi-lock-open-variant::before{content:"\FFE6"}.mdi-lock-open-variant-outline::before{content:"\FFE7"}.mdi-lock-outline::before{content:"\F341"}.mdi-lock-pattern::before{content:"\F6E9"}.mdi-lock-plus::before{content:"\F5FB"}.mdi-lock-question::before{content:"\F8EE"}.mdi-lock-reset::before{content:"\F772"}.mdi-lock-smart::before{content:"\F8B1"}.mdi-locker::before{content:"\F7D6"}.mdi-locker-multiple::before{content:"\F7D7"}.mdi-login::before{content:"\F342"}.mdi-login-variant::before{content:"\F5FC"}.mdi-logout::before{content:"\F343"}.mdi-logout-variant::before{content:"\F5FD"}.mdi-longitude::before{content:"\FF77"}.mdi-looks::before{content:"\F344"}.mdi-loupe::before{content:"\F345"}.mdi-lumx::before{content:"\F346"}.mdi-lungs::before{content:"\F00AF"}.mdi-lyft::before{content:"\FB1D"}.mdi-magnet::before{content:"\F347"}.mdi-magnet-on::before{content:"\F348"}.mdi-magnify::before{content:"\F349"}.mdi-magnify-close::before{content:"\F97F"}.mdi-magnify-minus::before{content:"\F34A"}.mdi-magnify-minus-cursor::before{content:"\FA61"}.mdi-magnify-minus-outline::before{content:"\F6EB"}.mdi-magnify-plus::before{content:"\F34B"}.mdi-magnify-plus-cursor::before{content:"\FA62"}.mdi-magnify-plus-outline::before{content:"\F6EC"}.mdi-magnify-remove-cursor::before{content:"\F0237"}.mdi-magnify-remove-outline::before{content:"\F0238"}.mdi-magnify-scan::before{content:"\F02A1"}.mdi-mail::before{content:"\FED8"}.mdi-mail-ru::before{content:"\F34C"}.mdi-mailbox::before{content:"\F6ED"}.mdi-mailbox-open::before{content:"\FD64"}.mdi-mailbox-open-outline::before{content:"\FD65"}.mdi-mailbox-open-up::before{content:"\FD66"}.mdi-mailbox-open-up-outline::before{content:"\FD67"}.mdi-mailbox-outline::before{content:"\FD68"}.mdi-mailbox-up::before{content:"\FD69"}.mdi-mailbox-up-outline::before{content:"\FD6A"}.mdi-map::before{content:"\F34D"}.mdi-map-check::before{content:"\FED9"}.mdi-map-check-outline::before{content:"\FEDA"}.mdi-map-clock::before{content:"\FCFA"}.mdi-map-clock-outline::before{content:"\FCFB"}.mdi-map-legend::before{content:"\FA00"}.mdi-map-marker::before{content:"\F34E"}.mdi-map-marker-alert::before{content:"\FF22"}.mdi-map-marker-alert-outline::before{content:"\FF23"}.mdi-map-marker-check::before{content:"\FC71"}.mdi-map-marker-check-outline::before{content:"\F0326"}.mdi-map-marker-circle::before{content:"\F34F"}.mdi-map-marker-distance::before{content:"\F8EF"}.mdi-map-marker-down::before{content:"\F012D"}.mdi-map-marker-left::before{content:"\F0306"}.mdi-map-marker-left-outline::before{content:"\F0308"}.mdi-map-marker-minus::before{content:"\F650"}.mdi-map-marker-minus-outline::before{content:"\F0324"}.mdi-map-marker-multiple::before{content:"\F350"}.mdi-map-marker-multiple-outline::before{content:"\F02A2"}.mdi-map-marker-off::before{content:"\F351"}.mdi-map-marker-off-outline::before{content:"\F0328"}.mdi-map-marker-outline::before{content:"\F7D8"}.mdi-map-marker-path::before{content:"\FCFC"}.mdi-map-marker-plus::before{content:"\F651"}.mdi-map-marker-plus-outline::before{content:"\F0323"}.mdi-map-marker-question::before{content:"\FF24"}.mdi-map-marker-question-outline::before{content:"\FF25"}.mdi-map-marker-radius::before{content:"\F352"}.mdi-map-marker-radius-outline::before{content:"\F0327"}.mdi-map-marker-remove::before{content:"\FF26"}.mdi-map-marker-remove-outline::before{content:"\F0325"}.mdi-map-marker-remove-variant::before{content:"\FF27"}.mdi-map-marker-right::before{content:"\F0307"}.mdi-map-marker-right-outline::before{content:"\F0309"}.mdi-map-marker-up::before{content:"\F012E"}.mdi-map-minus::before{content:"\F980"}.mdi-map-outline::before{content:"\F981"}.mdi-map-plus::before{content:"\F982"}.mdi-map-search::before{content:"\F983"}.mdi-map-search-outline::before{content:"\F984"}.mdi-mapbox::before{content:"\FB86"}.mdi-margin::before{content:"\F353"}.mdi-markdown::before{content:"\F354"}.mdi-markdown-outline::before{content:"\FF78"}.mdi-marker::before{content:"\F652"}.mdi-marker-cancel::before{content:"\FDB5"}.mdi-marker-check::before{content:"\F355"}.mdi-mastodon::before{content:"\FAD0"}.mdi-mastodon-variant::before{content:"\FAD1"}.mdi-material-design::before{content:"\F985"}.mdi-material-ui::before{content:"\F357"}.mdi-math-compass::before{content:"\F358"}.mdi-math-cos::before{content:"\FC72"}.mdi-math-integral::before{content:"\FFE8"}.mdi-math-integral-box::before{content:"\FFE9"}.mdi-math-log::before{content:"\F00B0"}.mdi-math-norm::before{content:"\FFEA"}.mdi-math-norm-box::before{content:"\FFEB"}.mdi-math-sin::before{content:"\FC73"}.mdi-math-tan::before{content:"\FC74"}.mdi-matrix::before{content:"\F628"}.mdi-medal::before{content:"\F986"}.mdi-medal-outline::before{content:"\F0351"}.mdi-medical-bag::before{content:"\F6EE"}.mdi-meditation::before{content:"\F01A6"}.mdi-medium::before{content:"\F35A"}.mdi-meetup::before{content:"\FAD2"}.mdi-memory::before{content:"\F35B"}.mdi-menu::before{content:"\F35C"}.mdi-menu-down::before{content:"\F35D"}.mdi-menu-down-outline::before{content:"\F6B5"}.mdi-menu-left::before{content:"\F35E"}.mdi-menu-left-outline::before{content:"\FA01"}.mdi-menu-open::before{content:"\FB87"}.mdi-menu-right::before{content:"\F35F"}.mdi-menu-right-outline::before{content:"\FA02"}.mdi-menu-swap::before{content:"\FA63"}.mdi-menu-swap-outline::before{content:"\FA64"}.mdi-menu-up::before{content:"\F360"}.mdi-menu-up-outline::before{content:"\F6B6"}.mdi-merge::before{content:"\FF79"}.mdi-message::before{content:"\F361"}.mdi-message-alert::before{content:"\F362"}.mdi-message-alert-outline::before{content:"\FA03"}.mdi-message-arrow-left::before{content:"\F031D"}.mdi-message-arrow-left-outline::before{content:"\F031E"}.mdi-message-arrow-right::before{content:"\F031F"}.mdi-message-arrow-right-outline::before{content:"\F0320"}.mdi-message-bulleted::before{content:"\F6A1"}.mdi-message-bulleted-off::before{content:"\F6A2"}.mdi-message-draw::before{content:"\F363"}.mdi-message-image::before{content:"\F364"}.mdi-message-image-outline::before{content:"\F0197"}.mdi-message-lock::before{content:"\FFEC"}.mdi-message-lock-outline::before{content:"\F0198"}.mdi-message-minus::before{content:"\F0199"}.mdi-message-minus-outline::before{content:"\F019A"}.mdi-message-outline::before{content:"\F365"}.mdi-message-plus::before{content:"\F653"}.mdi-message-plus-outline::before{content:"\F00E6"}.mdi-message-processing::before{content:"\F366"}.mdi-message-processing-outline::before{content:"\F019B"}.mdi-message-reply::before{content:"\F367"}.mdi-message-reply-text::before{content:"\F368"}.mdi-message-settings::before{content:"\F6EF"}.mdi-message-settings-outline::before{content:"\F019C"}.mdi-message-settings-variant::before{content:"\F6F0"}.mdi-message-settings-variant-outline::before{content:"\F019D"}.mdi-message-text::before{content:"\F369"}.mdi-message-text-clock::before{content:"\F019E"}.mdi-message-text-clock-outline::before{content:"\F019F"}.mdi-message-text-lock::before{content:"\FFED"}.mdi-message-text-lock-outline::before{content:"\F01A0"}.mdi-message-text-outline::before{content:"\F36A"}.mdi-message-video::before{content:"\F36B"}.mdi-meteor::before{content:"\F629"}.mdi-metronome::before{content:"\F7D9"}.mdi-metronome-tick::before{content:"\F7DA"}.mdi-micro-sd::before{content:"\F7DB"}.mdi-microphone::before{content:"\F36C"}.mdi-microphone-minus::before{content:"\F8B2"}.mdi-microphone-off::before{content:"\F36D"}.mdi-microphone-outline::before{content:"\F36E"}.mdi-microphone-plus::before{content:"\F8B3"}.mdi-microphone-settings::before{content:"\F36F"}.mdi-microphone-variant::before{content:"\F370"}.mdi-microphone-variant-off::before{content:"\F371"}.mdi-microscope::before{content:"\F654"}.mdi-microsoft::before{content:"\F372"}.mdi-microsoft-dynamics::before{content:"\F987"}.mdi-microwave::before{content:"\FC75"}.mdi-middleware::before{content:"\FF7A"}.mdi-middleware-outline::before{content:"\FF7B"}.mdi-midi::before{content:"\F8F0"}.mdi-midi-port::before{content:"\F8F1"}.mdi-mine::before{content:"\FDB6"}.mdi-minecraft::before{content:"\F373"}.mdi-mini-sd::before{content:"\FA04"}.mdi-minidisc::before{content:"\FA05"}.mdi-minus::before{content:"\F374"}.mdi-minus-box::before{content:"\F375"}.mdi-minus-box-multiple::before{content:"\F016C"}.mdi-minus-box-multiple-outline::before{content:"\F016D"}.mdi-minus-box-outline::before{content:"\F6F1"}.mdi-minus-circle::before{content:"\F376"}.mdi-minus-circle-outline::before{content:"\F377"}.mdi-minus-network::before{content:"\F378"}.mdi-minus-network-outline::before{content:"\FC76"}.mdi-mirror::before{content:"\F0228"}.mdi-mixcloud::before{content:"\F62A"}.mdi-mixed-martial-arts::before{content:"\FD6B"}.mdi-mixed-reality::before{content:"\F87E"}.mdi-mixer::before{content:"\F7DC"}.mdi-molecule::before{content:"\FB88"}.mdi-monitor::before{content:"\F379"}.mdi-monitor-cellphone::before{content:"\F988"}.mdi-monitor-cellphone-star::before{content:"\F989"}.mdi-monitor-clean::before{content:"\F012F"}.mdi-monitor-dashboard::before{content:"\FA06"}.mdi-monitor-edit::before{content:"\F02F1"}.mdi-monitor-lock::before{content:"\FDB7"}.mdi-monitor-multiple::before{content:"\F37A"}.mdi-monitor-off::before{content:"\FD6C"}.mdi-monitor-screenshot::before{content:"\FE34"}.mdi-monitor-speaker::before{content:"\FF7C"}.mdi-monitor-speaker-off::before{content:"\FF7D"}.mdi-monitor-star::before{content:"\FDB8"}.mdi-moon-first-quarter::before{content:"\FF7E"}.mdi-moon-full::before{content:"\FF7F"}.mdi-moon-last-quarter::before{content:"\FF80"}.mdi-moon-new::before{content:"\FF81"}.mdi-moon-waning-crescent::before{content:"\FF82"}.mdi-moon-waning-gibbous::before{content:"\FF83"}.mdi-moon-waxing-crescent::before{content:"\FF84"}.mdi-moon-waxing-gibbous::before{content:"\FF85"}.mdi-moped::before{content:"\F00B1"}.mdi-more::before{content:"\F37B"}.mdi-mother-heart::before{content:"\F033F"}.mdi-mother-nurse::before{content:"\FCFD"}.mdi-motion-sensor::before{content:"\FD6D"}.mdi-motorbike::before{content:"\F37C"}.mdi-mouse::before{content:"\F37D"}.mdi-mouse-bluetooth::before{content:"\F98A"}.mdi-mouse-off::before{content:"\F37E"}.mdi-mouse-variant::before{content:"\F37F"}.mdi-mouse-variant-off::before{content:"\F380"}.mdi-move-resize::before{content:"\F655"}.mdi-move-resize-variant::before{content:"\F656"}.mdi-movie::before{content:"\F381"}.mdi-movie-edit::before{content:"\F014D"}.mdi-movie-edit-outline::before{content:"\F014E"}.mdi-movie-filter::before{content:"\F014F"}.mdi-movie-filter-outline::before{content:"\F0150"}.mdi-movie-open::before{content:"\FFEE"}.mdi-movie-open-outline::before{content:"\FFEF"}.mdi-movie-outline::before{content:"\FDB9"}.mdi-movie-roll::before{content:"\F7DD"}.mdi-movie-search::before{content:"\F01FD"}.mdi-movie-search-outline::before{content:"\F01FE"}.mdi-muffin::before{content:"\F98B"}.mdi-multiplication::before{content:"\F382"}.mdi-multiplication-box::before{content:"\F383"}.mdi-mushroom::before{content:"\F7DE"}.mdi-mushroom-outline::before{content:"\F7DF"}.mdi-music::before{content:"\F759"}.mdi-music-accidental-double-flat::before{content:"\FF86"}.mdi-music-accidental-double-sharp::before{content:"\FF87"}.mdi-music-accidental-flat::before{content:"\FF88"}.mdi-music-accidental-natural::before{content:"\FF89"}.mdi-music-accidental-sharp::before{content:"\FF8A"}.mdi-music-box::before{content:"\F384"}.mdi-music-box-outline::before{content:"\F385"}.mdi-music-circle::before{content:"\F386"}.mdi-music-circle-outline::before{content:"\FAD3"}.mdi-music-clef-alto::before{content:"\FF8B"}.mdi-music-clef-bass::before{content:"\FF8C"}.mdi-music-clef-treble::before{content:"\FF8D"}.mdi-music-note::before{content:"\F387"}.mdi-music-note-bluetooth::before{content:"\F5FE"}.mdi-music-note-bluetooth-off::before{content:"\F5FF"}.mdi-music-note-eighth::before{content:"\F388"}.mdi-music-note-eighth-dotted::before{content:"\FF8E"}.mdi-music-note-half::before{content:"\F389"}.mdi-music-note-half-dotted::before{content:"\FF8F"}.mdi-music-note-off::before{content:"\F38A"}.mdi-music-note-off-outline::before{content:"\FF90"}.mdi-music-note-outline::before{content:"\FF91"}.mdi-music-note-plus::before{content:"\FDBA"}.mdi-music-note-quarter::before{content:"\F38B"}.mdi-music-note-quarter-dotted::before{content:"\FF92"}.mdi-music-note-sixteenth::before{content:"\F38C"}.mdi-music-note-sixteenth-dotted::before{content:"\FF93"}.mdi-music-note-whole::before{content:"\F38D"}.mdi-music-note-whole-dotted::before{content:"\FF94"}.mdi-music-off::before{content:"\F75A"}.mdi-music-rest-eighth::before{content:"\FF95"}.mdi-music-rest-half::before{content:"\FF96"}.mdi-music-rest-quarter::before{content:"\FF97"}.mdi-music-rest-sixteenth::before{content:"\FF98"}.mdi-music-rest-whole::before{content:"\FF99"}.mdi-nail::before{content:"\FDBB"}.mdi-nas::before{content:"\F8F2"}.mdi-nativescript::before{content:"\F87F"}.mdi-nature::before{content:"\F38E"}.mdi-nature-people::before{content:"\F38F"}.mdi-navigation::before{content:"\F390"}.mdi-near-me::before{content:"\F5CD"}.mdi-necklace::before{content:"\FF28"}.mdi-needle::before{content:"\F391"}.mdi-netflix::before{content:"\F745"}.mdi-network::before{content:"\F6F2"}.mdi-network-off::before{content:"\FC77"}.mdi-network-off-outline::before{content:"\FC78"}.mdi-network-outline::before{content:"\FC79"}.mdi-network-router::before{content:"\F00B2"}.mdi-network-strength-1::before{content:"\F8F3"}.mdi-network-strength-1-alert::before{content:"\F8F4"}.mdi-network-strength-2::before{content:"\F8F5"}.mdi-network-strength-2-alert::before{content:"\F8F6"}.mdi-network-strength-3::before{content:"\F8F7"}.mdi-network-strength-3-alert::before{content:"\F8F8"}.mdi-network-strength-4::before{content:"\F8F9"}.mdi-network-strength-4-alert::before{content:"\F8FA"}.mdi-network-strength-off::before{content:"\F8FB"}.mdi-network-strength-off-outline::before{content:"\F8FC"}.mdi-network-strength-outline::before{content:"\F8FD"}.mdi-new-box::before{content:"\F394"}.mdi-newspaper::before{content:"\F395"}.mdi-newspaper-minus::before{content:"\FF29"}.mdi-newspaper-plus::before{content:"\FF2A"}.mdi-newspaper-variant::before{content:"\F0023"}.mdi-newspaper-variant-multiple::before{content:"\F0024"}.mdi-newspaper-variant-multiple-outline::before{content:"\F0025"}.mdi-newspaper-variant-outline::before{content:"\F0026"}.mdi-nfc::before{content:"\F396"}.mdi-nfc-off::before{content:"\FE35"}.mdi-nfc-search-variant::before{content:"\FE36"}.mdi-nfc-tap::before{content:"\F397"}.mdi-nfc-variant::before{content:"\F398"}.mdi-nfc-variant-off::before{content:"\FE37"}.mdi-ninja::before{content:"\F773"}.mdi-nintendo-switch::before{content:"\F7E0"}.mdi-nix::before{content:"\F0130"}.mdi-nodejs::before{content:"\F399"}.mdi-noodles::before{content:"\F01A9"}.mdi-not-equal::before{content:"\F98C"}.mdi-not-equal-variant::before{content:"\F98D"}.mdi-note::before{content:"\F39A"}.mdi-note-multiple::before{content:"\F6B7"}.mdi-note-multiple-outline::before{content:"\F6B8"}.mdi-note-outline::before{content:"\F39B"}.mdi-note-plus::before{content:"\F39C"}.mdi-note-plus-outline::before{content:"\F39D"}.mdi-note-text::before{content:"\F39E"}.mdi-note-text-outline::before{content:"\F0202"}.mdi-notebook::before{content:"\F82D"}.mdi-notebook-multiple::before{content:"\FE38"}.mdi-notebook-outline::before{content:"\FEDC"}.mdi-notification-clear-all::before{content:"\F39F"}.mdi-npm::before{content:"\F6F6"}.mdi-npm-variant::before{content:"\F98E"}.mdi-npm-variant-outline::before{content:"\F98F"}.mdi-nuke::before{content:"\F6A3"}.mdi-null::before{content:"\F7E1"}.mdi-numeric::before{content:"\F3A0"}.mdi-numeric-0::before{content:"\30"}.mdi-numeric-0-box::before{content:"\F3A1"}.mdi-numeric-0-box-multiple::before{content:"\FF2B"}.mdi-numeric-0-box-multiple-outline::before{content:"\F3A2"}.mdi-numeric-0-box-outline::before{content:"\F3A3"}.mdi-numeric-0-circle::before{content:"\FC7A"}.mdi-numeric-0-circle-outline::before{content:"\FC7B"}.mdi-numeric-1::before{content:"\31"}.mdi-numeric-1-box::before{content:"\F3A4"}.mdi-numeric-1-box-multiple::before{content:"\FF2C"}.mdi-numeric-1-box-multiple-outline::before{content:"\F3A5"}.mdi-numeric-1-box-outline::before{content:"\F3A6"}.mdi-numeric-1-circle::before{content:"\FC7C"}.mdi-numeric-1-circle-outline::before{content:"\FC7D"}.mdi-numeric-10::before{content:"\F000A"}.mdi-numeric-10-box::before{content:"\FF9A"}.mdi-numeric-10-box-multiple::before{content:"\F000B"}.mdi-numeric-10-box-multiple-outline::before{content:"\F000C"}.mdi-numeric-10-box-outline::before{content:"\FF9B"}.mdi-numeric-10-circle::before{content:"\F000D"}.mdi-numeric-10-circle-outline::before{content:"\F000E"}.mdi-numeric-2::before{content:"\32"}.mdi-numeric-2-box::before{content:"\F3A7"}.mdi-numeric-2-box-multiple::before{content:"\FF2D"}.mdi-numeric-2-box-multiple-outline::before{content:"\F3A8"}.mdi-numeric-2-box-outline::before{content:"\F3A9"}.mdi-numeric-2-circle::before{content:"\FC7E"}.mdi-numeric-2-circle-outline::before{content:"\FC7F"}.mdi-numeric-3::before{content:"\33"}.mdi-numeric-3-box::before{content:"\F3AA"}.mdi-numeric-3-box-multiple::before{content:"\FF2E"}.mdi-numeric-3-box-multiple-outline::before{content:"\F3AB"}.mdi-numeric-3-box-outline::before{content:"\F3AC"}.mdi-numeric-3-circle::before{content:"\FC80"}.mdi-numeric-3-circle-outline::before{content:"\FC81"}.mdi-numeric-4::before{content:"\34"}.mdi-numeric-4-box::before{content:"\F3AD"}.mdi-numeric-4-box-multiple::before{content:"\FF2F"}.mdi-numeric-4-box-multiple-outline::before{content:"\F3AE"}.mdi-numeric-4-box-outline::before{content:"\F3AF"}.mdi-numeric-4-circle::before{content:"\FC82"}.mdi-numeric-4-circle-outline::before{content:"\FC83"}.mdi-numeric-5::before{content:"\35"}.mdi-numeric-5-box::before{content:"\F3B0"}.mdi-numeric-5-box-multiple::before{content:"\FF30"}.mdi-numeric-5-box-multiple-outline::before{content:"\F3B1"}.mdi-numeric-5-box-outline::before{content:"\F3B2"}.mdi-numeric-5-circle::before{content:"\FC84"}.mdi-numeric-5-circle-outline::before{content:"\FC85"}.mdi-numeric-6::before{content:"\36"}.mdi-numeric-6-box::before{content:"\F3B3"}.mdi-numeric-6-box-multiple::before{content:"\FF31"}.mdi-numeric-6-box-multiple-outline::before{content:"\F3B4"}.mdi-numeric-6-box-outline::before{content:"\F3B5"}.mdi-numeric-6-circle::before{content:"\FC86"}.mdi-numeric-6-circle-outline::before{content:"\FC87"}.mdi-numeric-7::before{content:"\37"}.mdi-numeric-7-box::before{content:"\F3B6"}.mdi-numeric-7-box-multiple::before{content:"\FF32"}.mdi-numeric-7-box-multiple-outline::before{content:"\F3B7"}.mdi-numeric-7-box-outline::before{content:"\F3B8"}.mdi-numeric-7-circle::before{content:"\FC88"}.mdi-numeric-7-circle-outline::before{content:"\FC89"}.mdi-numeric-8::before{content:"\38"}.mdi-numeric-8-box::before{content:"\F3B9"}.mdi-numeric-8-box-multiple::before{content:"\FF33"}.mdi-numeric-8-box-multiple-outline::before{content:"\F3BA"}.mdi-numeric-8-box-outline::before{content:"\F3BB"}.mdi-numeric-8-circle::before{content:"\FC8A"}.mdi-numeric-8-circle-outline::before{content:"\FC8B"}.mdi-numeric-9::before{content:"\39"}.mdi-numeric-9-box::before{content:"\F3BC"}.mdi-numeric-9-box-multiple::before{content:"\FF34"}.mdi-numeric-9-box-multiple-outline::before{content:"\F3BD"}.mdi-numeric-9-box-outline::before{content:"\F3BE"}.mdi-numeric-9-circle::before{content:"\FC8C"}.mdi-numeric-9-circle-outline::before{content:"\FC8D"}.mdi-numeric-9-plus::before{content:"\F000F"}.mdi-numeric-9-plus-box::before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple::before{content:"\FF35"}.mdi-numeric-9-plus-box-multiple-outline::before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline::before{content:"\F3C1"}.mdi-numeric-9-plus-circle::before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline::before{content:"\FC8F"}.mdi-numeric-negative-1::before{content:"\F0074"}.mdi-nut::before{content:"\F6F7"}.mdi-nutrition::before{content:"\F3C2"}.mdi-nuxt::before{content:"\F0131"}.mdi-oar::before{content:"\F67B"}.mdi-ocarina::before{content:"\FDBC"}.mdi-oci::before{content:"\F0314"}.mdi-ocr::before{content:"\F0165"}.mdi-octagon::before{content:"\F3C3"}.mdi-octagon-outline::before{content:"\F3C4"}.mdi-octagram::before{content:"\F6F8"}.mdi-octagram-outline::before{content:"\F774"}.mdi-odnoklassniki::before{content:"\F3C5"}.mdi-offer::before{content:"\F0246"}.mdi-office::before{content:"\F3C6"}.mdi-office-building::before{content:"\F990"}.mdi-oil::before{content:"\F3C7"}.mdi-oil-lamp::before{content:"\FF36"}.mdi-oil-level::before{content:"\F0075"}.mdi-oil-temperature::before{content:"\F0019"}.mdi-omega::before{content:"\F3C9"}.mdi-one-up::before{content:"\FB89"}.mdi-onedrive::before{content:"\F3CA"}.mdi-onenote::before{content:"\F746"}.mdi-onepassword::before{content:"\F880"}.mdi-opacity::before{content:"\F5CC"}.mdi-open-in-app::before{content:"\F3CB"}.mdi-open-in-new::before{content:"\F3CC"}.mdi-open-source-initiative::before{content:"\FB8A"}.mdi-openid::before{content:"\F3CD"}.mdi-opera::before{content:"\F3CE"}.mdi-orbit::before{content:"\F018"}.mdi-origin::before{content:"\FB2B"}.mdi-ornament::before{content:"\F3CF"}.mdi-ornament-variant::before{content:"\F3D0"}.mdi-outdoor-lamp::before{content:"\F0076"}.mdi-outlook::before{content:"\FCFE"}.mdi-overscan::before{content:"\F0027"}.mdi-owl::before{content:"\F3D2"}.mdi-pac-man::before{content:"\FB8B"}.mdi-package::before{content:"\F3D3"}.mdi-package-down::before{content:"\F3D4"}.mdi-package-up::before{content:"\F3D5"}.mdi-package-variant::before{content:"\F3D6"}.mdi-package-variant-closed::before{content:"\F3D7"}.mdi-page-first::before{content:"\F600"}.mdi-page-last::before{content:"\F601"}.mdi-page-layout-body::before{content:"\F6F9"}.mdi-page-layout-footer::before{content:"\F6FA"}.mdi-page-layout-header::before{content:"\F6FB"}.mdi-page-layout-header-footer::before{content:"\FF9C"}.mdi-page-layout-sidebar-left::before{content:"\F6FC"}.mdi-page-layout-sidebar-right::before{content:"\F6FD"}.mdi-page-next::before{content:"\FB8C"}.mdi-page-next-outline::before{content:"\FB8D"}.mdi-page-previous::before{content:"\FB8E"}.mdi-page-previous-outline::before{content:"\FB8F"}.mdi-palette::before{content:"\F3D8"}.mdi-palette-advanced::before{content:"\F3D9"}.mdi-palette-outline::before{content:"\FE6C"}.mdi-palette-swatch::before{content:"\F8B4"}.mdi-palette-swatch-outline::before{content:"\F0387"}.mdi-palm-tree::before{content:"\F0077"}.mdi-pan::before{content:"\FB90"}.mdi-pan-bottom-left::before{content:"\FB91"}.mdi-pan-bottom-right::before{content:"\FB92"}.mdi-pan-down::before{content:"\FB93"}.mdi-pan-horizontal::before{content:"\FB94"}.mdi-pan-left::before{content:"\FB95"}.mdi-pan-right::before{content:"\FB96"}.mdi-pan-top-left::before{content:"\FB97"}.mdi-pan-top-right::before{content:"\FB98"}.mdi-pan-up::before{content:"\FB99"}.mdi-pan-vertical::before{content:"\FB9A"}.mdi-panda::before{content:"\F3DA"}.mdi-pandora::before{content:"\F3DB"}.mdi-panorama::before{content:"\F3DC"}.mdi-panorama-fisheye::before{content:"\F3DD"}.mdi-panorama-horizontal::before{content:"\F3DE"}.mdi-panorama-vertical::before{content:"\F3DF"}.mdi-panorama-wide-angle::before{content:"\F3E0"}.mdi-paper-cut-vertical::before{content:"\F3E1"}.mdi-paper-roll::before{content:"\F0182"}.mdi-paper-roll-outline::before{content:"\F0183"}.mdi-paperclip::before{content:"\F3E2"}.mdi-parachute::before{content:"\FC90"}.mdi-parachute-outline::before{content:"\FC91"}.mdi-parking::before{content:"\F3E3"}.mdi-party-popper::before{content:"\F0078"}.mdi-passport::before{content:"\F7E2"}.mdi-passport-biometric::before{content:"\FDBD"}.mdi-pasta::before{content:"\F018B"}.mdi-patio-heater::before{content:"\FF9D"}.mdi-patreon::before{content:"\F881"}.mdi-pause::before{content:"\F3E4"}.mdi-pause-circle::before{content:"\F3E5"}.mdi-pause-circle-outline::before{content:"\F3E6"}.mdi-pause-octagon::before{content:"\F3E7"}.mdi-pause-octagon-outline::before{content:"\F3E8"}.mdi-paw::before{content:"\F3E9"}.mdi-paw-off::before{content:"\F657"}.mdi-paypal::before{content:"\F882"}.mdi-pdf-box::before{content:"\FE39"}.mdi-peace::before{content:"\F883"}.mdi-peanut::before{content:"\F001E"}.mdi-peanut-off::before{content:"\F001F"}.mdi-peanut-off-outline::before{content:"\F0021"}.mdi-peanut-outline::before{content:"\F0020"}.mdi-pen::before{content:"\F3EA"}.mdi-pen-lock::before{content:"\FDBE"}.mdi-pen-minus::before{content:"\FDBF"}.mdi-pen-off::before{content:"\FDC0"}.mdi-pen-plus::before{content:"\FDC1"}.mdi-pen-remove::before{content:"\FDC2"}.mdi-pencil::before{content:"\F3EB"}.mdi-pencil-box::before{content:"\F3EC"}.mdi-pencil-box-multiple::before{content:"\F016F"}.mdi-pencil-box-multiple-outline::before{content:"\F0170"}.mdi-pencil-box-outline::before{content:"\F3ED"}.mdi-pencil-circle::before{content:"\F6FE"}.mdi-pencil-circle-outline::before{content:"\F775"}.mdi-pencil-lock::before{content:"\F3EE"}.mdi-pencil-lock-outline::before{content:"\FDC3"}.mdi-pencil-minus::before{content:"\FDC4"}.mdi-pencil-minus-outline::before{content:"\FDC5"}.mdi-pencil-off::before{content:"\F3EF"}.mdi-pencil-off-outline::before{content:"\FDC6"}.mdi-pencil-outline::before{content:"\FC92"}.mdi-pencil-plus::before{content:"\FDC7"}.mdi-pencil-plus-outline::before{content:"\FDC8"}.mdi-pencil-remove::before{content:"\FDC9"}.mdi-pencil-remove-outline::before{content:"\FDCA"}.mdi-pencil-ruler::before{content:"\F037E"}.mdi-penguin::before{content:"\FEDD"}.mdi-pentagon::before{content:"\F6FF"}.mdi-pentagon-outline::before{content:"\F700"}.mdi-percent::before{content:"\F3F0"}.mdi-percent-outline::before{content:"\F02A3"}.mdi-periodic-table::before{content:"\F8B5"}.mdi-periodic-table-co::before{content:"\F0329"}.mdi-periodic-table-co2::before{content:"\F7E3"}.mdi-periscope::before{content:"\F747"}.mdi-perspective-less::before{content:"\FCFF"}.mdi-perspective-more::before{content:"\FD00"}.mdi-pharmacy::before{content:"\F3F1"}.mdi-phone::before{content:"\F3F2"}.mdi-phone-alert::before{content:"\FF37"}.mdi-phone-alert-outline::before{content:"\F01B9"}.mdi-phone-bluetooth::before{content:"\F3F3"}.mdi-phone-bluetooth-outline::before{content:"\F01BA"}.mdi-phone-cancel::before{content:"\F00E7"}.mdi-phone-cancel-outline::before{content:"\F01BB"}.mdi-phone-check::before{content:"\F01D4"}.mdi-phone-check-outline::before{content:"\F01D5"}.mdi-phone-classic::before{content:"\F602"}.mdi-phone-classic-off::before{content:"\F02A4"}.mdi-phone-forward::before{content:"\F3F4"}.mdi-phone-forward-outline::before{content:"\F01BC"}.mdi-phone-hangup::before{content:"\F3F5"}.mdi-phone-hangup-outline::before{content:"\F01BD"}.mdi-phone-in-talk::before{content:"\F3F6"}.mdi-phone-in-talk-outline::before{content:"\F01AD"}.mdi-phone-incoming::before{content:"\F3F7"}.mdi-phone-incoming-outline::before{content:"\F01BE"}.mdi-phone-lock::before{content:"\F3F8"}.mdi-phone-lock-outline::before{content:"\F01BF"}.mdi-phone-log::before{content:"\F3F9"}.mdi-phone-log-outline::before{content:"\F01C0"}.mdi-phone-message::before{content:"\F01C1"}.mdi-phone-message-outline::before{content:"\F01C2"}.mdi-phone-minus::before{content:"\F658"}.mdi-phone-minus-outline::before{content:"\F01C3"}.mdi-phone-missed::before{content:"\F3FA"}.mdi-phone-missed-outline::before{content:"\F01D0"}.mdi-phone-off::before{content:"\FDCB"}.mdi-phone-off-outline::before{content:"\F01D1"}.mdi-phone-outgoing::before{content:"\F3FB"}.mdi-phone-outgoing-outline::before{content:"\F01C4"}.mdi-phone-outline::before{content:"\FDCC"}.mdi-phone-paused::before{content:"\F3FC"}.mdi-phone-paused-outline::before{content:"\F01C5"}.mdi-phone-plus::before{content:"\F659"}.mdi-phone-plus-outline::before{content:"\F01C6"}.mdi-phone-return::before{content:"\F82E"}.mdi-phone-return-outline::before{content:"\F01C7"}.mdi-phone-ring::before{content:"\F01D6"}.mdi-phone-ring-outline::before{content:"\F01D7"}.mdi-phone-rotate-landscape::before{content:"\F884"}.mdi-phone-rotate-portrait::before{content:"\F885"}.mdi-phone-settings::before{content:"\F3FD"}.mdi-phone-settings-outline::before{content:"\F01C8"}.mdi-phone-voip::before{content:"\F3FE"}.mdi-pi::before{content:"\F3FF"}.mdi-pi-box::before{content:"\F400"}.mdi-pi-hole::before{content:"\FDCD"}.mdi-piano::before{content:"\F67C"}.mdi-pickaxe::before{content:"\F8B6"}.mdi-picture-in-picture-bottom-right::before{content:"\FE3A"}.mdi-picture-in-picture-bottom-right-outline::before{content:"\FE3B"}.mdi-picture-in-picture-top-right::before{content:"\FE3C"}.mdi-picture-in-picture-top-right-outline::before{content:"\FE3D"}.mdi-pier::before{content:"\F886"}.mdi-pier-crane::before{content:"\F887"}.mdi-pig::before{content:"\F401"}.mdi-pig-variant::before{content:"\F0028"}.mdi-piggy-bank::before{content:"\F0029"}.mdi-pill::before{content:"\F402"}.mdi-pillar::before{content:"\F701"}.mdi-pin::before{content:"\F403"}.mdi-pin-off::before{content:"\F404"}.mdi-pin-off-outline::before{content:"\F92F"}.mdi-pin-outline::before{content:"\F930"}.mdi-pine-tree::before{content:"\F405"}.mdi-pine-tree-box::before{content:"\F406"}.mdi-pinterest::before{content:"\F407"}.mdi-pinterest-box::before{content:"\F408"}.mdi-pinwheel::before{content:"\FAD4"}.mdi-pinwheel-outline::before{content:"\FAD5"}.mdi-pipe::before{content:"\F7E4"}.mdi-pipe-disconnected::before{content:"\F7E5"}.mdi-pipe-leak::before{content:"\F888"}.mdi-pipe-wrench::before{content:"\F037F"}.mdi-pirate::before{content:"\FA07"}.mdi-pistol::before{content:"\F702"}.mdi-piston::before{content:"\F889"}.mdi-pizza::before{content:"\F409"}.mdi-play::before{content:"\F40A"}.mdi-play-box::before{content:"\F02A5"}.mdi-play-box-outline::before{content:"\F40B"}.mdi-play-circle::before{content:"\F40C"}.mdi-play-circle-outline::before{content:"\F40D"}.mdi-play-network::before{content:"\F88A"}.mdi-play-network-outline::before{content:"\FC93"}.mdi-play-outline::before{content:"\FF38"}.mdi-play-pause::before{content:"\F40E"}.mdi-play-protected-content::before{content:"\F40F"}.mdi-play-speed::before{content:"\F8FE"}.mdi-playlist-check::before{content:"\F5C7"}.mdi-playlist-edit::before{content:"\F8FF"}.mdi-playlist-minus::before{content:"\F410"}.mdi-playlist-music::before{content:"\FC94"}.mdi-playlist-music-outline::before{content:"\FC95"}.mdi-playlist-play::before{content:"\F411"}.mdi-playlist-plus::before{content:"\F412"}.mdi-playlist-remove::before{content:"\F413"}.mdi-playlist-star::before{content:"\FDCE"}.mdi-playstation::before{content:"\F414"}.mdi-plex::before{content:"\F6B9"}.mdi-plus::before{content:"\F415"}.mdi-plus-box::before{content:"\F416"}.mdi-plus-box-multiple::before{content:"\F334"}.mdi-plus-box-multiple-outline::before{content:"\F016E"}.mdi-plus-box-outline::before{content:"\F703"}.mdi-plus-circle::before{content:"\F417"}.mdi-plus-circle-multiple-outline::before{content:"\F418"}.mdi-plus-circle-outline::before{content:"\F419"}.mdi-plus-minus::before{content:"\F991"}.mdi-plus-minus-box::before{content:"\F992"}.mdi-plus-network::before{content:"\F41A"}.mdi-plus-network-outline::before{content:"\FC96"}.mdi-plus-one::before{content:"\F41B"}.mdi-plus-outline::before{content:"\F704"}.mdi-plus-thick::before{content:"\F0217"}.mdi-pocket::before{content:"\F41C"}.mdi-podcast::before{content:"\F993"}.mdi-podium::before{content:"\FD01"}.mdi-podium-bronze::before{content:"\FD02"}.mdi-podium-gold::before{content:"\FD03"}.mdi-podium-silver::before{content:"\FD04"}.mdi-point-of-sale::before{content:"\FD6E"}.mdi-pokeball::before{content:"\F41D"}.mdi-pokemon-go::before{content:"\FA08"}.mdi-poker-chip::before{content:"\F82F"}.mdi-polaroid::before{content:"\F41E"}.mdi-police-badge::before{content:"\F0192"}.mdi-police-badge-outline::before{content:"\F0193"}.mdi-poll::before{content:"\F41F"}.mdi-poll-box::before{content:"\F420"}.mdi-poll-box-outline::before{content:"\F02A6"}.mdi-polymer::before{content:"\F421"}.mdi-pool::before{content:"\F606"}.mdi-popcorn::before{content:"\F422"}.mdi-post::before{content:"\F002A"}.mdi-post-outline::before{content:"\F002B"}.mdi-postage-stamp::before{content:"\FC97"}.mdi-pot::before{content:"\F65A"}.mdi-pot-mix::before{content:"\F65B"}.mdi-pound::before{content:"\F423"}.mdi-pound-box::before{content:"\F424"}.mdi-pound-box-outline::before{content:"\F01AA"}.mdi-power::before{content:"\F425"}.mdi-power-cycle::before{content:"\F900"}.mdi-power-off::before{content:"\F901"}.mdi-power-on::before{content:"\F902"}.mdi-power-plug::before{content:"\F6A4"}.mdi-power-plug-off::before{content:"\F6A5"}.mdi-power-settings::before{content:"\F426"}.mdi-power-sleep::before{content:"\F903"}.mdi-power-socket::before{content:"\F427"}.mdi-power-socket-au::before{content:"\F904"}.mdi-power-socket-de::before{content:"\F0132"}.mdi-power-socket-eu::before{content:"\F7E6"}.mdi-power-socket-fr::before{content:"\F0133"}.mdi-power-socket-jp::before{content:"\F0134"}.mdi-power-socket-uk::before{content:"\F7E7"}.mdi-power-socket-us::before{content:"\F7E8"}.mdi-power-standby::before{content:"\F905"}.mdi-powershell::before{content:"\FA09"}.mdi-prescription::before{content:"\F705"}.mdi-presentation::before{content:"\F428"}.mdi-presentation-play::before{content:"\F429"}.mdi-printer::before{content:"\F42A"}.mdi-printer-3d::before{content:"\F42B"}.mdi-printer-3d-nozzle::before{content:"\FE3E"}.mdi-printer-3d-nozzle-alert::before{content:"\F01EB"}.mdi-printer-3d-nozzle-alert-outline::before{content:"\F01EC"}.mdi-printer-3d-nozzle-outline::before{content:"\FE3F"}.mdi-printer-alert::before{content:"\F42C"}.mdi-printer-check::before{content:"\F0171"}.mdi-printer-off::before{content:"\FE40"}.mdi-printer-pos::before{content:"\F0079"}.mdi-printer-settings::before{content:"\F706"}.mdi-printer-wireless::before{content:"\FA0A"}.mdi-priority-high::before{content:"\F603"}.mdi-priority-low::before{content:"\F604"}.mdi-professional-hexagon::before{content:"\F42D"}.mdi-progress-alert::before{content:"\FC98"}.mdi-progress-check::before{content:"\F994"}.mdi-progress-clock::before{content:"\F995"}.mdi-progress-close::before{content:"\F0135"}.mdi-progress-download::before{content:"\F996"}.mdi-progress-upload::before{content:"\F997"}.mdi-progress-wrench::before{content:"\FC99"}.mdi-projector::before{content:"\F42E"}.mdi-projector-screen::before{content:"\F42F"}.mdi-propane-tank::before{content:"\F0382"}.mdi-propane-tank-outline::before{content:"\F0383"}.mdi-protocol::before{content:"\FFF9"}.mdi-publish::before{content:"\F6A6"}.mdi-pulse::before{content:"\F430"}.mdi-pumpkin::before{content:"\FB9B"}.mdi-purse::before{content:"\FF39"}.mdi-purse-outline::before{content:"\FF3A"}.mdi-puzzle::before{content:"\F431"}.mdi-puzzle-outline::before{content:"\FA65"}.mdi-qi::before{content:"\F998"}.mdi-qqchat::before{content:"\F605"}.mdi-qrcode::before{content:"\F432"}.mdi-qrcode-edit::before{content:"\F8B7"}.mdi-qrcode-minus::before{content:"\F01B7"}.mdi-qrcode-plus::before{content:"\F01B6"}.mdi-qrcode-remove::before{content:"\F01B8"}.mdi-qrcode-scan::before{content:"\F433"}.mdi-quadcopter::before{content:"\F434"}.mdi-quality-high::before{content:"\F435"}.mdi-quality-low::before{content:"\FA0B"}.mdi-quality-medium::before{content:"\FA0C"}.mdi-quicktime::before{content:"\F436"}.mdi-quora::before{content:"\FD05"}.mdi-rabbit::before{content:"\F906"}.mdi-racing-helmet::before{content:"\FD6F"}.mdi-racquetball::before{content:"\FD70"}.mdi-radar::before{content:"\F437"}.mdi-radiator::before{content:"\F438"}.mdi-radiator-disabled::before{content:"\FAD6"}.mdi-radiator-off::before{content:"\FAD7"}.mdi-radio::before{content:"\F439"}.mdi-radio-am::before{content:"\FC9A"}.mdi-radio-fm::before{content:"\FC9B"}.mdi-radio-handheld::before{content:"\F43A"}.mdi-radio-off::before{content:"\F0247"}.mdi-radio-tower::before{content:"\F43B"}.mdi-radioactive::before{content:"\F43C"}.mdi-radioactive-off::before{content:"\FEDE"}.mdi-radiobox-blank::before{content:"\F43D"}.mdi-radiobox-marked::before{content:"\F43E"}.mdi-radius::before{content:"\FC9C"}.mdi-radius-outline::before{content:"\FC9D"}.mdi-railroad-light::before{content:"\FF3B"}.mdi-raspberry-pi::before{content:"\F43F"}.mdi-ray-end::before{content:"\F440"}.mdi-ray-end-arrow::before{content:"\F441"}.mdi-ray-start::before{content:"\F442"}.mdi-ray-start-arrow::before{content:"\F443"}.mdi-ray-start-end::before{content:"\F444"}.mdi-ray-vertex::before{content:"\F445"}.mdi-react::before{content:"\F707"}.mdi-read::before{content:"\F447"}.mdi-receipt::before{content:"\F449"}.mdi-record::before{content:"\F44A"}.mdi-record-circle::before{content:"\FEDF"}.mdi-record-circle-outline::before{content:"\FEE0"}.mdi-record-player::before{content:"\F999"}.mdi-record-rec::before{content:"\F44B"}.mdi-rectangle::before{content:"\FE41"}.mdi-rectangle-outline::before{content:"\FE42"}.mdi-recycle::before{content:"\F44C"}.mdi-reddit::before{content:"\F44D"}.mdi-redhat::before{content:"\F0146"}.mdi-redo::before{content:"\F44E"}.mdi-redo-variant::before{content:"\F44F"}.mdi-reflect-horizontal::before{content:"\FA0D"}.mdi-reflect-vertical::before{content:"\FA0E"}.mdi-refresh::before{content:"\F450"}.mdi-refresh-circle::before{content:"\F03A2"}.mdi-regex::before{content:"\F451"}.mdi-registered-trademark::before{content:"\FA66"}.mdi-relative-scale::before{content:"\F452"}.mdi-reload::before{content:"\F453"}.mdi-reload-alert::before{content:"\F0136"}.mdi-reminder::before{content:"\F88B"}.mdi-remote::before{content:"\F454"}.mdi-remote-desktop::before{content:"\F8B8"}.mdi-remote-off::before{content:"\FEE1"}.mdi-remote-tv::before{content:"\FEE2"}.mdi-remote-tv-off::before{content:"\FEE3"}.mdi-rename-box::before{content:"\F455"}.mdi-reorder-horizontal::before{content:"\F687"}.mdi-reorder-vertical::before{content:"\F688"}.mdi-repeat::before{content:"\F456"}.mdi-repeat-off::before{content:"\F457"}.mdi-repeat-once::before{content:"\F458"}.mdi-replay::before{content:"\F459"}.mdi-reply::before{content:"\F45A"}.mdi-reply-all::before{content:"\F45B"}.mdi-reply-all-outline::before{content:"\FF3C"}.mdi-reply-circle::before{content:"\F01D9"}.mdi-reply-outline::before{content:"\FF3D"}.mdi-reproduction::before{content:"\F45C"}.mdi-resistor::before{content:"\FB1F"}.mdi-resistor-nodes::before{content:"\FB20"}.mdi-resize::before{content:"\FA67"}.mdi-resize-bottom-right::before{content:"\F45D"}.mdi-responsive::before{content:"\F45E"}.mdi-restart::before{content:"\F708"}.mdi-restart-alert::before{content:"\F0137"}.mdi-restart-off::before{content:"\FD71"}.mdi-restore::before{content:"\F99A"}.mdi-restore-alert::before{content:"\F0138"}.mdi-rewind::before{content:"\F45F"}.mdi-rewind-10::before{content:"\FD06"}.mdi-rewind-30::before{content:"\FD72"}.mdi-rewind-5::before{content:"\F0224"}.mdi-rewind-outline::before{content:"\F709"}.mdi-rhombus::before{content:"\F70A"}.mdi-rhombus-medium::before{content:"\FA0F"}.mdi-rhombus-outline::before{content:"\F70B"}.mdi-rhombus-split::before{content:"\FA10"}.mdi-ribbon::before{content:"\F460"}.mdi-rice::before{content:"\F7E9"}.mdi-ring::before{content:"\F7EA"}.mdi-rivet::before{content:"\FE43"}.mdi-road::before{content:"\F461"}.mdi-road-variant::before{content:"\F462"}.mdi-robber::before{content:"\F007A"}.mdi-robot::before{content:"\F6A8"}.mdi-robot-industrial::before{content:"\FB21"}.mdi-robot-mower::before{content:"\F0222"}.mdi-robot-mower-outline::before{content:"\F021E"}.mdi-robot-vacuum::before{content:"\F70C"}.mdi-robot-vacuum-variant::before{content:"\F907"}.mdi-rocket::before{content:"\F463"}.mdi-rodent::before{content:"\F0352"}.mdi-roller-skate::before{content:"\FD07"}.mdi-rollerblade::before{content:"\FD08"}.mdi-rollupjs::before{content:"\FB9C"}.mdi-roman-numeral-1::before{content:"\F00B3"}.mdi-roman-numeral-10::before{content:"\F00BC"}.mdi-roman-numeral-2::before{content:"\F00B4"}.mdi-roman-numeral-3::before{content:"\F00B5"}.mdi-roman-numeral-4::before{content:"\F00B6"}.mdi-roman-numeral-5::before{content:"\F00B7"}.mdi-roman-numeral-6::before{content:"\F00B8"}.mdi-roman-numeral-7::before{content:"\F00B9"}.mdi-roman-numeral-8::before{content:"\F00BA"}.mdi-roman-numeral-9::before{content:"\F00BB"}.mdi-room-service::before{content:"\F88C"}.mdi-room-service-outline::before{content:"\FD73"}.mdi-rotate-3d::before{content:"\FEE4"}.mdi-rotate-3d-variant::before{content:"\F464"}.mdi-rotate-left::before{content:"\F465"}.mdi-rotate-left-variant::before{content:"\F466"}.mdi-rotate-orbit::before{content:"\FD74"}.mdi-rotate-right::before{content:"\F467"}.mdi-rotate-right-variant::before{content:"\F468"}.mdi-rounded-corner::before{content:"\F607"}.mdi-router::before{content:"\F020D"}.mdi-router-wireless::before{content:"\F469"}.mdi-router-wireless-settings::before{content:"\FA68"}.mdi-routes::before{content:"\F46A"}.mdi-routes-clock::before{content:"\F007B"}.mdi-rowing::before{content:"\F608"}.mdi-rss::before{content:"\F46B"}.mdi-rss-box::before{content:"\F46C"}.mdi-rss-off::before{content:"\FF3E"}.mdi-ruby::before{content:"\FD09"}.mdi-rugby::before{content:"\FD75"}.mdi-ruler::before{content:"\F46D"}.mdi-ruler-square::before{content:"\FC9E"}.mdi-ruler-square-compass::before{content:"\FEDB"}.mdi-run::before{content:"\F70D"}.mdi-run-fast::before{content:"\F46E"}.mdi-rv-truck::before{content:"\F01FF"}.mdi-sack::before{content:"\FD0A"}.mdi-sack-percent::before{content:"\FD0B"}.mdi-safe::before{content:"\FA69"}.mdi-safe-square::before{content:"\F02A7"}.mdi-safe-square-outline::before{content:"\F02A8"}.mdi-safety-goggles::before{content:"\FD0C"}.mdi-sailing::before{content:"\FEE5"}.mdi-sale::before{content:"\F46F"}.mdi-salesforce::before{content:"\F88D"}.mdi-sass::before{content:"\F7EB"}.mdi-satellite::before{content:"\F470"}.mdi-satellite-uplink::before{content:"\F908"}.mdi-satellite-variant::before{content:"\F471"}.mdi-sausage::before{content:"\F8B9"}.mdi-saw-blade::before{content:"\FE44"}.mdi-saxophone::before{content:"\F609"}.mdi-scale::before{content:"\F472"}.mdi-scale-balance::before{content:"\F5D1"}.mdi-scale-bathroom::before{content:"\F473"}.mdi-scale-off::before{content:"\F007C"}.mdi-scanner::before{content:"\F6AA"}.mdi-scanner-off::before{content:"\F909"}.mdi-scatter-plot::before{content:"\FEE6"}.mdi-scatter-plot-outline::before{content:"\FEE7"}.mdi-school::before{content:"\F474"}.mdi-school-outline::before{content:"\F01AB"}.mdi-scissors-cutting::before{content:"\FA6A"}.mdi-scooter::before{content:"\F0214"}.mdi-scoreboard::before{content:"\F02A9"}.mdi-scoreboard-outline::before{content:"\F02AA"}.mdi-screen-rotation::before{content:"\F475"}.mdi-screen-rotation-lock::before{content:"\F476"}.mdi-screw-flat-top::before{content:"\FDCF"}.mdi-screw-lag::before{content:"\FE54"}.mdi-screw-machine-flat-top::before{content:"\FE55"}.mdi-screw-machine-round-top::before{content:"\FE56"}.mdi-screw-round-top::before{content:"\FE57"}.mdi-screwdriver::before{content:"\F477"}.mdi-script::before{content:"\FB9D"}.mdi-script-outline::before{content:"\F478"}.mdi-script-text::before{content:"\FB9E"}.mdi-script-text-outline::before{content:"\FB9F"}.mdi-sd::before{content:"\F479"}.mdi-seal::before{content:"\F47A"}.mdi-seal-variant::before{content:"\FFFA"}.mdi-search-web::before{content:"\F70E"}.mdi-seat::before{content:"\FC9F"}.mdi-seat-flat::before{content:"\F47B"}.mdi-seat-flat-angled::before{content:"\F47C"}.mdi-seat-individual-suite::before{content:"\F47D"}.mdi-seat-legroom-extra::before{content:"\F47E"}.mdi-seat-legroom-normal::before{content:"\F47F"}.mdi-seat-legroom-reduced::before{content:"\F480"}.mdi-seat-outline::before{content:"\FCA0"}.mdi-seat-passenger::before{content:"\F0274"}.mdi-seat-recline-extra::before{content:"\F481"}.mdi-seat-recline-normal::before{content:"\F482"}.mdi-seatbelt::before{content:"\FCA1"}.mdi-security::before{content:"\F483"}.mdi-security-network::before{content:"\F484"}.mdi-seed::before{content:"\FE45"}.mdi-seed-outline::before{content:"\FE46"}.mdi-segment::before{content:"\FEE8"}.mdi-select::before{content:"\F485"}.mdi-select-all::before{content:"\F486"}.mdi-select-color::before{content:"\FD0D"}.mdi-select-compare::before{content:"\FAD8"}.mdi-select-drag::before{content:"\FA6B"}.mdi-select-group::before{content:"\FF9F"}.mdi-select-inverse::before{content:"\F487"}.mdi-select-marker::before{content:"\F02AB"}.mdi-select-multiple::before{content:"\F02AC"}.mdi-select-multiple-marker::before{content:"\F02AD"}.mdi-select-off::before{content:"\F488"}.mdi-select-place::before{content:"\FFFB"}.mdi-select-search::before{content:"\F022F"}.mdi-selection::before{content:"\F489"}.mdi-selection-drag::before{content:"\FA6C"}.mdi-selection-ellipse::before{content:"\FD0E"}.mdi-selection-ellipse-arrow-inside::before{content:"\FF3F"}.mdi-selection-marker::before{content:"\F02AE"}.mdi-selection-multiple-marker::before{content:"\F02AF"}.mdi-selection-mutliple::before{content:"\F02B0"}.mdi-selection-off::before{content:"\F776"}.mdi-selection-search::before{content:"\F0230"}.mdi-semantic-web::before{content:"\F0341"}.mdi-send::before{content:"\F48A"}.mdi-send-check::before{content:"\F018C"}.mdi-send-check-outline::before{content:"\F018D"}.mdi-send-circle::before{content:"\FE58"}.mdi-send-circle-outline::before{content:"\FE59"}.mdi-send-clock::before{content:"\F018E"}.mdi-send-clock-outline::before{content:"\F018F"}.mdi-send-lock::before{content:"\F7EC"}.mdi-send-lock-outline::before{content:"\F0191"}.mdi-send-outline::before{content:"\F0190"}.mdi-serial-port::before{content:"\F65C"}.mdi-server::before{content:"\F48B"}.mdi-server-minus::before{content:"\F48C"}.mdi-server-network::before{content:"\F48D"}.mdi-server-network-off::before{content:"\F48E"}.mdi-server-off::before{content:"\F48F"}.mdi-server-plus::before{content:"\F490"}.mdi-server-remove::before{content:"\F491"}.mdi-server-security::before{content:"\F492"}.mdi-set-all::before{content:"\F777"}.mdi-set-center::before{content:"\F778"}.mdi-set-center-right::before{content:"\F779"}.mdi-set-left::before{content:"\F77A"}.mdi-set-left-center::before{content:"\F77B"}.mdi-set-left-right::before{content:"\F77C"}.mdi-set-none::before{content:"\F77D"}.mdi-set-right::before{content:"\F77E"}.mdi-set-top-box::before{content:"\F99E"}.mdi-settings::before{content:"\F493"}.mdi-settings-box::before{content:"\F494"}.mdi-settings-helper::before{content:"\FA6D"}.mdi-settings-outline::before{content:"\F8BA"}.mdi-settings-transfer::before{content:"\F007D"}.mdi-settings-transfer-outline::before{content:"\F007E"}.mdi-shaker::before{content:"\F0139"}.mdi-shaker-outline::before{content:"\F013A"}.mdi-shape::before{content:"\F830"}.mdi-shape-circle-plus::before{content:"\F65D"}.mdi-shape-outline::before{content:"\F831"}.mdi-shape-oval-plus::before{content:"\F0225"}.mdi-shape-plus::before{content:"\F495"}.mdi-shape-polygon-plus::before{content:"\F65E"}.mdi-shape-rectangle-plus::before{content:"\F65F"}.mdi-shape-square-plus::before{content:"\F660"}.mdi-share::before{content:"\F496"}.mdi-share-all::before{content:"\F021F"}.mdi-share-all-outline::before{content:"\F0220"}.mdi-share-circle::before{content:"\F01D8"}.mdi-share-off::before{content:"\FF40"}.mdi-share-off-outline::before{content:"\FF41"}.mdi-share-outline::before{content:"\F931"}.mdi-share-variant::before{content:"\F497"}.mdi-sheep::before{content:"\FCA2"}.mdi-shield::before{content:"\F498"}.mdi-shield-account::before{content:"\F88E"}.mdi-shield-account-outline::before{content:"\FA11"}.mdi-shield-airplane::before{content:"\F6BA"}.mdi-shield-airplane-outline::before{content:"\FCA3"}.mdi-shield-alert::before{content:"\FEE9"}.mdi-shield-alert-outline::before{content:"\FEEA"}.mdi-shield-car::before{content:"\FFA0"}.mdi-shield-check::before{content:"\F565"}.mdi-shield-check-outline::before{content:"\FCA4"}.mdi-shield-cross::before{content:"\FCA5"}.mdi-shield-cross-outline::before{content:"\FCA6"}.mdi-shield-edit::before{content:"\F01CB"}.mdi-shield-edit-outline::before{content:"\F01CC"}.mdi-shield-half::before{content:"\F038B"}.mdi-shield-half-full::before{content:"\F77F"}.mdi-shield-home::before{content:"\F689"}.mdi-shield-home-outline::before{content:"\FCA7"}.mdi-shield-key::before{content:"\FBA0"}.mdi-shield-key-outline::before{content:"\FBA1"}.mdi-shield-link-variant::before{content:"\FD0F"}.mdi-shield-link-variant-outline::before{content:"\FD10"}.mdi-shield-lock::before{content:"\F99C"}.mdi-shield-lock-outline::before{content:"\FCA8"}.mdi-shield-off::before{content:"\F99D"}.mdi-shield-off-outline::before{content:"\F99B"}.mdi-shield-outline::before{content:"\F499"}.mdi-shield-plus::before{content:"\FAD9"}.mdi-shield-plus-outline::before{content:"\FADA"}.mdi-shield-refresh::before{content:"\F01CD"}.mdi-shield-refresh-outline::before{content:"\F01CE"}.mdi-shield-remove::before{content:"\FADB"}.mdi-shield-remove-outline::before{content:"\FADC"}.mdi-shield-search::before{content:"\FD76"}.mdi-shield-star::before{content:"\F0166"}.mdi-shield-star-outline::before{content:"\F0167"}.mdi-shield-sun::before{content:"\F007F"}.mdi-shield-sun-outline::before{content:"\F0080"}.mdi-ship-wheel::before{content:"\F832"}.mdi-shoe-formal::before{content:"\FB22"}.mdi-shoe-heel::before{content:"\FB23"}.mdi-shoe-print::before{content:"\FE5A"}.mdi-shopify::before{content:"\FADD"}.mdi-shopping::before{content:"\F49A"}.mdi-shopping-music::before{content:"\F49B"}.mdi-shopping-outline::before{content:"\F0200"}.mdi-shopping-search::before{content:"\FFA1"}.mdi-shovel::before{content:"\F70F"}.mdi-shovel-off::before{content:"\F710"}.mdi-shower::before{content:"\F99F"}.mdi-shower-head::before{content:"\F9A0"}.mdi-shredder::before{content:"\F49C"}.mdi-shuffle::before{content:"\F49D"}.mdi-shuffle-disabled::before{content:"\F49E"}.mdi-shuffle-variant::before{content:"\F49F"}.mdi-shuriken::before{content:"\F03AA"}.mdi-sigma::before{content:"\F4A0"}.mdi-sigma-lower::before{content:"\F62B"}.mdi-sign-caution::before{content:"\F4A1"}.mdi-sign-direction::before{content:"\F780"}.mdi-sign-direction-minus::before{content:"\F0022"}.mdi-sign-direction-plus::before{content:"\FFFD"}.mdi-sign-direction-remove::before{content:"\FFFE"}.mdi-sign-real-estate::before{content:"\F0143"}.mdi-sign-text::before{content:"\F781"}.mdi-signal::before{content:"\F4A2"}.mdi-signal-2g::before{content:"\F711"}.mdi-signal-3g::before{content:"\F712"}.mdi-signal-4g::before{content:"\F713"}.mdi-signal-5g::before{content:"\FA6E"}.mdi-signal-cellular-1::before{content:"\F8BB"}.mdi-signal-cellular-2::before{content:"\F8BC"}.mdi-signal-cellular-3::before{content:"\F8BD"}.mdi-signal-cellular-outline::before{content:"\F8BE"}.mdi-signal-distance-variant::before{content:"\FE47"}.mdi-signal-hspa::before{content:"\F714"}.mdi-signal-hspa-plus::before{content:"\F715"}.mdi-signal-off::before{content:"\F782"}.mdi-signal-variant::before{content:"\F60A"}.mdi-signature::before{content:"\FE5B"}.mdi-signature-freehand::before{content:"\FE5C"}.mdi-signature-image::before{content:"\FE5D"}.mdi-signature-text::before{content:"\FE5E"}.mdi-silo::before{content:"\FB24"}.mdi-silverware::before{content:"\F4A3"}.mdi-silverware-clean::before{content:"\FFFF"}.mdi-silverware-fork::before{content:"\F4A4"}.mdi-silverware-fork-knife::before{content:"\FA6F"}.mdi-silverware-spoon::before{content:"\F4A5"}.mdi-silverware-variant::before{content:"\F4A6"}.mdi-sim::before{content:"\F4A7"}.mdi-sim-alert::before{content:"\F4A8"}.mdi-sim-off::before{content:"\F4A9"}.mdi-simple-icons::before{content:"\F0348"}.mdi-sina-weibo::before{content:"\FADE"}.mdi-sitemap::before{content:"\F4AA"}.mdi-skate::before{content:"\FD11"}.mdi-skew-less::before{content:"\FD12"}.mdi-skew-more::before{content:"\FD13"}.mdi-ski::before{content:"\F032F"}.mdi-ski-cross-country::before{content:"\F0330"}.mdi-ski-water::before{content:"\F0331"}.mdi-skip-backward::before{content:"\F4AB"}.mdi-skip-backward-outline::before{content:"\FF42"}.mdi-skip-forward::before{content:"\F4AC"}.mdi-skip-forward-outline::before{content:"\FF43"}.mdi-skip-next::before{content:"\F4AD"}.mdi-skip-next-circle::before{content:"\F661"}.mdi-skip-next-circle-outline::before{content:"\F662"}.mdi-skip-next-outline::before{content:"\FF44"}.mdi-skip-previous::before{content:"\F4AE"}.mdi-skip-previous-circle::before{content:"\F663"}.mdi-skip-previous-circle-outline::before{content:"\F664"}.mdi-skip-previous-outline::before{content:"\FF45"}.mdi-skull::before{content:"\F68B"}.mdi-skull-crossbones::before{content:"\FBA2"}.mdi-skull-crossbones-outline::before{content:"\FBA3"}.mdi-skull-outline::before{content:"\FBA4"}.mdi-skype::before{content:"\F4AF"}.mdi-skype-business::before{content:"\F4B0"}.mdi-slack::before{content:"\F4B1"}.mdi-slackware::before{content:"\F90A"}.mdi-slash-forward::before{content:"\F0000"}.mdi-slash-forward-box::before{content:"\F0001"}.mdi-sleep::before{content:"\F4B2"}.mdi-sleep-off::before{content:"\F4B3"}.mdi-slope-downhill::before{content:"\FE5F"}.mdi-slope-uphill::before{content:"\FE60"}.mdi-slot-machine::before{content:"\F013F"}.mdi-slot-machine-outline::before{content:"\F0140"}.mdi-smart-card::before{content:"\F00E8"}.mdi-smart-card-outline::before{content:"\F00E9"}.mdi-smart-card-reader::before{content:"\F00EA"}.mdi-smart-card-reader-outline::before{content:"\F00EB"}.mdi-smog::before{content:"\FA70"}.mdi-smoke-detector::before{content:"\F392"}.mdi-smoking::before{content:"\F4B4"}.mdi-smoking-off::before{content:"\F4B5"}.mdi-snapchat::before{content:"\F4B6"}.mdi-snowboard::before{content:"\F0332"}.mdi-snowflake::before{content:"\F716"}.mdi-snowflake-alert::before{content:"\FF46"}.mdi-snowflake-melt::before{content:"\F02F6"}.mdi-snowflake-variant::before{content:"\FF47"}.mdi-snowman::before{content:"\F4B7"}.mdi-soccer::before{content:"\F4B8"}.mdi-soccer-field::before{content:"\F833"}.mdi-sofa::before{content:"\F4B9"}.mdi-solar-panel::before{content:"\FD77"}.mdi-solar-panel-large::before{content:"\FD78"}.mdi-solar-power::before{content:"\FA71"}.mdi-soldering-iron::before{content:"\F00BD"}.mdi-solid::before{content:"\F68C"}.mdi-sort::before{content:"\F4BA"}.mdi-sort-alphabetical::before{content:"\F4BB"}.mdi-sort-alphabetical-ascending::before{content:"\F0173"}.mdi-sort-alphabetical-descending::before{content:"\F0174"}.mdi-sort-ascending::before{content:"\F4BC"}.mdi-sort-descending::before{content:"\F4BD"}.mdi-sort-numeric::before{content:"\F4BE"}.mdi-sort-variant::before{content:"\F4BF"}.mdi-sort-variant-lock::before{content:"\FCA9"}.mdi-sort-variant-lock-open::before{content:"\FCAA"}.mdi-sort-variant-remove::before{content:"\F0172"}.mdi-soundcloud::before{content:"\F4C0"}.mdi-source-branch::before{content:"\F62C"}.mdi-source-commit::before{content:"\F717"}.mdi-source-commit-end::before{content:"\F718"}.mdi-source-commit-end-local::before{content:"\F719"}.mdi-source-commit-local::before{content:"\F71A"}.mdi-source-commit-next-local::before{content:"\F71B"}.mdi-source-commit-start::before{content:"\F71C"}.mdi-source-commit-start-next-local::before{content:"\F71D"}.mdi-source-fork::before{content:"\F4C1"}.mdi-source-merge::before{content:"\F62D"}.mdi-source-pull::before{content:"\F4C2"}.mdi-source-repository::before{content:"\FCAB"}.mdi-source-repository-multiple::before{content:"\FCAC"}.mdi-soy-sauce::before{content:"\F7ED"}.mdi-spa::before{content:"\FCAD"}.mdi-spa-outline::before{content:"\FCAE"}.mdi-space-invaders::before{content:"\FBA5"}.mdi-space-station::before{content:"\F03AE"}.mdi-spade::before{content:"\FE48"}.mdi-speaker::before{content:"\F4C3"}.mdi-speaker-bluetooth::before{content:"\F9A1"}.mdi-speaker-multiple::before{content:"\FD14"}.mdi-speaker-off::before{content:"\F4C4"}.mdi-speaker-wireless::before{content:"\F71E"}.mdi-speedometer::before{content:"\F4C5"}.mdi-speedometer-medium::before{content:"\FFA2"}.mdi-speedometer-slow::before{content:"\FFA3"}.mdi-spellcheck::before{content:"\F4C6"}.mdi-spider::before{content:"\F0215"}.mdi-spider-thread::before{content:"\F0216"}.mdi-spider-web::before{content:"\FBA6"}.mdi-spotify::before{content:"\F4C7"}.mdi-spotlight::before{content:"\F4C8"}.mdi-spotlight-beam::before{content:"\F4C9"}.mdi-spray::before{content:"\F665"}.mdi-spray-bottle::before{content:"\FADF"}.mdi-sprinkler::before{content:"\F0081"}.mdi-sprinkler-variant::before{content:"\F0082"}.mdi-sprout::before{content:"\FE49"}.mdi-sprout-outline::before{content:"\FE4A"}.mdi-square::before{content:"\F763"}.mdi-square-edit-outline::before{content:"\F90B"}.mdi-square-inc::before{content:"\F4CA"}.mdi-square-inc-cash::before{content:"\F4CB"}.mdi-square-medium::before{content:"\FA12"}.mdi-square-medium-outline::before{content:"\FA13"}.mdi-square-off::before{content:"\F0319"}.mdi-square-off-outline::before{content:"\F031A"}.mdi-square-outline::before{content:"\F762"}.mdi-square-root::before{content:"\F783"}.mdi-square-root-box::before{content:"\F9A2"}.mdi-square-small::before{content:"\FA14"}.mdi-squeegee::before{content:"\FAE0"}.mdi-ssh::before{content:"\F8BF"}.mdi-stack-exchange::before{content:"\F60B"}.mdi-stack-overflow::before{content:"\F4CC"}.mdi-stackpath::before{content:"\F359"}.mdi-stadium::before{content:"\F001A"}.mdi-stadium-variant::before{content:"\F71F"}.mdi-stairs::before{content:"\F4CD"}.mdi-stairs-down::before{content:"\F02E9"}.mdi-stairs-up::before{content:"\F02E8"}.mdi-stamper::before{content:"\FD15"}.mdi-standard-definition::before{content:"\F7EE"}.mdi-star::before{content:"\F4CE"}.mdi-star-box::before{content:"\FA72"}.mdi-star-box-multiple::before{content:"\F02B1"}.mdi-star-box-multiple-outline::before{content:"\F02B2"}.mdi-star-box-outline::before{content:"\FA73"}.mdi-star-circle::before{content:"\F4CF"}.mdi-star-circle-outline::before{content:"\F9A3"}.mdi-star-face::before{content:"\F9A4"}.mdi-star-four-points::before{content:"\FAE1"}.mdi-star-four-points-outline::before{content:"\FAE2"}.mdi-star-half::before{content:"\F4D0"}.mdi-star-off::before{content:"\F4D1"}.mdi-star-outline::before{content:"\F4D2"}.mdi-star-three-points::before{content:"\FAE3"}.mdi-star-three-points-outline::before{content:"\FAE4"}.mdi-state-machine::before{content:"\F021A"}.mdi-steam::before{content:"\F4D3"}.mdi-steam-box::before{content:"\F90C"}.mdi-steering::before{content:"\F4D4"}.mdi-steering-off::before{content:"\F90D"}.mdi-step-backward::before{content:"\F4D5"}.mdi-step-backward-2::before{content:"\F4D6"}.mdi-step-forward::before{content:"\F4D7"}.mdi-step-forward-2::before{content:"\F4D8"}.mdi-stethoscope::before{content:"\F4D9"}.mdi-sticker::before{content:"\F038F"}.mdi-sticker-alert::before{content:"\F0390"}.mdi-sticker-alert-outline::before{content:"\F0391"}.mdi-sticker-check::before{content:"\F0392"}.mdi-sticker-check-outline::before{content:"\F0393"}.mdi-sticker-circle-outline::before{content:"\F5D0"}.mdi-sticker-emoji::before{content:"\F784"}.mdi-sticker-minus::before{content:"\F0394"}.mdi-sticker-minus-outline::before{content:"\F0395"}.mdi-sticker-outline::before{content:"\F0396"}.mdi-sticker-plus::before{content:"\F0397"}.mdi-sticker-plus-outline::before{content:"\F0398"}.mdi-sticker-remove::before{content:"\F0399"}.mdi-sticker-remove-outline::before{content:"\F039A"}.mdi-stocking::before{content:"\F4DA"}.mdi-stomach::before{content:"\F00BE"}.mdi-stop::before{content:"\F4DB"}.mdi-stop-circle::before{content:"\F666"}.mdi-stop-circle-outline::before{content:"\F667"}.mdi-store::before{content:"\F4DC"}.mdi-store-24-hour::before{content:"\F4DD"}.mdi-store-outline::before{content:"\F038C"}.mdi-storefront::before{content:"\F00EC"}.mdi-stove::before{content:"\F4DE"}.mdi-strategy::before{content:"\F0201"}.mdi-strava::before{content:"\FB25"}.mdi-stretch-to-page::before{content:"\FF48"}.mdi-stretch-to-page-outline::before{content:"\FF49"}.mdi-string-lights::before{content:"\F02E5"}.mdi-string-lights-off::before{content:"\F02E6"}.mdi-subdirectory-arrow-left::before{content:"\F60C"}.mdi-subdirectory-arrow-right::before{content:"\F60D"}.mdi-subtitles::before{content:"\FA15"}.mdi-subtitles-outline::before{content:"\FA16"}.mdi-subway::before{content:"\F6AB"}.mdi-subway-alert-variant::before{content:"\FD79"}.mdi-subway-variant::before{content:"\F4DF"}.mdi-summit::before{content:"\F785"}.mdi-sunglasses::before{content:"\F4E0"}.mdi-surround-sound::before{content:"\F5C5"}.mdi-surround-sound-2-0::before{content:"\F7EF"}.mdi-surround-sound-3-1::before{content:"\F7F0"}.mdi-surround-sound-5-1::before{content:"\F7F1"}.mdi-surround-sound-7-1::before{content:"\F7F2"}.mdi-svg::before{content:"\F720"}.mdi-swap-horizontal::before{content:"\F4E1"}.mdi-swap-horizontal-bold::before{content:"\FBA9"}.mdi-swap-horizontal-circle::before{content:"\F0002"}.mdi-swap-horizontal-circle-outline::before{content:"\F0003"}.mdi-swap-horizontal-variant::before{content:"\F8C0"}.mdi-swap-vertical::before{content:"\F4E2"}.mdi-swap-vertical-bold::before{content:"\FBAA"}.mdi-swap-vertical-circle::before{content:"\F0004"}.mdi-swap-vertical-circle-outline::before{content:"\F0005"}.mdi-swap-vertical-variant::before{content:"\F8C1"}.mdi-swim::before{content:"\F4E3"}.mdi-switch::before{content:"\F4E4"}.mdi-sword::before{content:"\F4E5"}.mdi-sword-cross::before{content:"\F786"}.mdi-syllabary-hangul::before{content:"\F035E"}.mdi-syllabary-hiragana::before{content:"\F035F"}.mdi-syllabary-katakana::before{content:"\F0360"}.mdi-syllabary-katakana-half-width::before{content:"\F0361"}.mdi-symfony::before{content:"\FAE5"}.mdi-sync::before{content:"\F4E6"}.mdi-sync-alert::before{content:"\F4E7"}.mdi-sync-circle::before{content:"\F03A3"}.mdi-sync-off::before{content:"\F4E8"}.mdi-tab::before{content:"\F4E9"}.mdi-tab-minus::before{content:"\FB26"}.mdi-tab-plus::before{content:"\F75B"}.mdi-tab-remove::before{content:"\FB27"}.mdi-tab-unselected::before{content:"\F4EA"}.mdi-table::before{content:"\F4EB"}.mdi-table-border::before{content:"\FA17"}.mdi-table-chair::before{content:"\F0083"}.mdi-table-column::before{content:"\F834"}.mdi-table-column-plus-after::before{content:"\F4EC"}.mdi-table-column-plus-before::before{content:"\F4ED"}.mdi-table-column-remove::before{content:"\F4EE"}.mdi-table-column-width::before{content:"\F4EF"}.mdi-table-edit::before{content:"\F4F0"}.mdi-table-eye::before{content:"\F00BF"}.mdi-table-headers-eye::before{content:"\F0248"}.mdi-table-headers-eye-off::before{content:"\F0249"}.mdi-table-large::before{content:"\F4F1"}.mdi-table-large-plus::before{content:"\FFA4"}.mdi-table-large-remove::before{content:"\FFA5"}.mdi-table-merge-cells::before{content:"\F9A5"}.mdi-table-of-contents::before{content:"\F835"}.mdi-table-plus::before{content:"\FA74"}.mdi-table-remove::before{content:"\FA75"}.mdi-table-row::before{content:"\F836"}.mdi-table-row-height::before{content:"\F4F2"}.mdi-table-row-plus-after::before{content:"\F4F3"}.mdi-table-row-plus-before::before{content:"\F4F4"}.mdi-table-row-remove::before{content:"\F4F5"}.mdi-table-search::before{content:"\F90E"}.mdi-table-settings::before{content:"\F837"}.mdi-table-tennis::before{content:"\FE4B"}.mdi-tablet::before{content:"\F4F6"}.mdi-tablet-android::before{content:"\F4F7"}.mdi-tablet-cellphone::before{content:"\F9A6"}.mdi-tablet-dashboard::before{content:"\FEEB"}.mdi-tablet-ipad::before{content:"\F4F8"}.mdi-taco::before{content:"\F761"}.mdi-tag::before{content:"\F4F9"}.mdi-tag-faces::before{content:"\F4FA"}.mdi-tag-heart::before{content:"\F68A"}.mdi-tag-heart-outline::before{content:"\FBAB"}.mdi-tag-minus::before{content:"\F90F"}.mdi-tag-minus-outline::before{content:"\F024A"}.mdi-tag-multiple::before{content:"\F4FB"}.mdi-tag-multiple-outline::before{content:"\F0322"}.mdi-tag-off::before{content:"\F024B"}.mdi-tag-off-outline::before{content:"\F024C"}.mdi-tag-outline::before{content:"\F4FC"}.mdi-tag-plus::before{content:"\F721"}.mdi-tag-plus-outline::before{content:"\F024D"}.mdi-tag-remove::before{content:"\F722"}.mdi-tag-remove-outline::before{content:"\F024E"}.mdi-tag-text::before{content:"\F024F"}.mdi-tag-text-outline::before{content:"\F4FD"}.mdi-tank::before{content:"\FD16"}.mdi-tanker-truck::before{content:"\F0006"}.mdi-tape-measure::before{content:"\FB28"}.mdi-target::before{content:"\F4FE"}.mdi-target-account::before{content:"\FBAC"}.mdi-target-variant::before{content:"\FA76"}.mdi-taxi::before{content:"\F4FF"}.mdi-tea::before{content:"\FD7A"}.mdi-tea-outline::before{content:"\FD7B"}.mdi-teach::before{content:"\F88F"}.mdi-teamviewer::before{content:"\F500"}.mdi-telegram::before{content:"\F501"}.mdi-telescope::before{content:"\FB29"}.mdi-television::before{content:"\F502"}.mdi-television-ambient-light::before{content:"\F0381"}.mdi-television-box::before{content:"\F838"}.mdi-television-classic::before{content:"\F7F3"}.mdi-television-classic-off::before{content:"\F839"}.mdi-television-clean::before{content:"\F013B"}.mdi-television-guide::before{content:"\F503"}.mdi-television-off::before{content:"\F83A"}.mdi-television-pause::before{content:"\FFA6"}.mdi-television-play::before{content:"\FEEC"}.mdi-television-stop::before{content:"\FFA7"}.mdi-temperature-celsius::before{content:"\F504"}.mdi-temperature-fahrenheit::before{content:"\F505"}.mdi-temperature-kelvin::before{content:"\F506"}.mdi-tennis::before{content:"\FD7C"}.mdi-tennis-ball::before{content:"\F507"}.mdi-tent::before{content:"\F508"}.mdi-terraform::before{content:"\F0084"}.mdi-terrain::before{content:"\F509"}.mdi-test-tube::before{content:"\F668"}.mdi-test-tube-empty::before{content:"\F910"}.mdi-test-tube-off::before{content:"\F911"}.mdi-text::before{content:"\F9A7"}.mdi-text-recognition::before{content:"\F0168"}.mdi-text-shadow::before{content:"\F669"}.mdi-text-short::before{content:"\F9A8"}.mdi-text-subject::before{content:"\F9A9"}.mdi-text-to-speech::before{content:"\F50A"}.mdi-text-to-speech-off::before{content:"\F50B"}.mdi-textarea::before{content:"\F00C0"}.mdi-textbox::before{content:"\F60E"}.mdi-textbox-lock::before{content:"\F0388"}.mdi-textbox-password::before{content:"\F7F4"}.mdi-texture::before{content:"\F50C"}.mdi-texture-box::before{content:"\F0007"}.mdi-theater::before{content:"\F50D"}.mdi-theme-light-dark::before{content:"\F50E"}.mdi-thermometer::before{content:"\F50F"}.mdi-thermometer-alert::before{content:"\FE61"}.mdi-thermometer-chevron-down::before{content:"\FE62"}.mdi-thermometer-chevron-up::before{content:"\FE63"}.mdi-thermometer-high::before{content:"\F00ED"}.mdi-thermometer-lines::before{content:"\F510"}.mdi-thermometer-low::before{content:"\F00EE"}.mdi-thermometer-minus::before{content:"\FE64"}.mdi-thermometer-plus::before{content:"\FE65"}.mdi-thermostat::before{content:"\F393"}.mdi-thermostat-box::before{content:"\F890"}.mdi-thought-bubble::before{content:"\F7F5"}.mdi-thought-bubble-outline::before{content:"\F7F6"}.mdi-thumb-down::before{content:"\F511"}.mdi-thumb-down-outline::before{content:"\F512"}.mdi-thumb-up::before{content:"\F513"}.mdi-thumb-up-outline::before{content:"\F514"}.mdi-thumbs-up-down::before{content:"\F515"}.mdi-ticket::before{content:"\F516"}.mdi-ticket-account::before{content:"\F517"}.mdi-ticket-confirmation::before{content:"\F518"}.mdi-ticket-outline::before{content:"\F912"}.mdi-ticket-percent::before{content:"\F723"}.mdi-tie::before{content:"\F519"}.mdi-tilde::before{content:"\F724"}.mdi-timelapse::before{content:"\F51A"}.mdi-timeline::before{content:"\FBAD"}.mdi-timeline-alert::before{content:"\FFB2"}.mdi-timeline-alert-outline::before{content:"\FFB5"}.mdi-timeline-clock::before{content:"\F0226"}.mdi-timeline-clock-outline::before{content:"\F0227"}.mdi-timeline-help::before{content:"\FFB6"}.mdi-timeline-help-outline::before{content:"\FFB7"}.mdi-timeline-outline::before{content:"\FBAE"}.mdi-timeline-plus::before{content:"\FFB3"}.mdi-timeline-plus-outline::before{content:"\FFB4"}.mdi-timeline-text::before{content:"\FBAF"}.mdi-timeline-text-outline::before{content:"\FBB0"}.mdi-timer::before{content:"\F51B"}.mdi-timer-10::before{content:"\F51C"}.mdi-timer-3::before{content:"\F51D"}.mdi-timer-off::before{content:"\F51E"}.mdi-timer-sand::before{content:"\F51F"}.mdi-timer-sand-empty::before{content:"\F6AC"}.mdi-timer-sand-full::before{content:"\F78B"}.mdi-timetable::before{content:"\F520"}.mdi-toaster::before{content:"\F0085"}.mdi-toaster-off::before{content:"\F01E2"}.mdi-toaster-oven::before{content:"\FCAF"}.mdi-toggle-switch::before{content:"\F521"}.mdi-toggle-switch-off::before{content:"\F522"}.mdi-toggle-switch-off-outline::before{content:"\FA18"}.mdi-toggle-switch-outline::before{content:"\FA19"}.mdi-toilet::before{content:"\F9AA"}.mdi-toolbox::before{content:"\F9AB"}.mdi-toolbox-outline::before{content:"\F9AC"}.mdi-tools::before{content:"\F0086"}.mdi-tooltip::before{content:"\F523"}.mdi-tooltip-account::before{content:"\F00C"}.mdi-tooltip-edit::before{content:"\F524"}.mdi-tooltip-edit-outline::before{content:"\F02F0"}.mdi-tooltip-image::before{content:"\F525"}.mdi-tooltip-image-outline::before{content:"\FBB1"}.mdi-tooltip-outline::before{content:"\F526"}.mdi-tooltip-plus::before{content:"\FBB2"}.mdi-tooltip-plus-outline::before{content:"\F527"}.mdi-tooltip-text::before{content:"\F528"}.mdi-tooltip-text-outline::before{content:"\FBB3"}.mdi-tooth::before{content:"\F8C2"}.mdi-tooth-outline::before{content:"\F529"}.mdi-toothbrush::before{content:"\F0154"}.mdi-toothbrush-electric::before{content:"\F0157"}.mdi-toothbrush-paste::before{content:"\F0155"}.mdi-tor::before{content:"\F52A"}.mdi-tortoise::before{content:"\FD17"}.mdi-toslink::before{content:"\F02E3"}.mdi-tournament::before{content:"\F9AD"}.mdi-tower-beach::before{content:"\F680"}.mdi-tower-fire::before{content:"\F681"}.mdi-towing::before{content:"\F83B"}.mdi-toy-brick::before{content:"\F02B3"}.mdi-toy-brick-marker::before{content:"\F02B4"}.mdi-toy-brick-marker-outline::before{content:"\F02B5"}.mdi-toy-brick-minus::before{content:"\F02B6"}.mdi-toy-brick-minus-outline::before{content:"\F02B7"}.mdi-toy-brick-outline::before{content:"\F02B8"}.mdi-toy-brick-plus::before{content:"\F02B9"}.mdi-toy-brick-plus-outline::before{content:"\F02BA"}.mdi-toy-brick-remove::before{content:"\F02BB"}.mdi-toy-brick-remove-outline::before{content:"\F02BC"}.mdi-toy-brick-search::before{content:"\F02BD"}.mdi-toy-brick-search-outline::before{content:"\F02BE"}.mdi-track-light::before{content:"\F913"}.mdi-trackpad::before{content:"\F7F7"}.mdi-trackpad-lock::before{content:"\F932"}.mdi-tractor::before{content:"\F891"}.mdi-trademark::before{content:"\FA77"}.mdi-traffic-cone::before{content:"\F03A7"}.mdi-traffic-light::before{content:"\F52B"}.mdi-train::before{content:"\F52C"}.mdi-train-car::before{content:"\FBB4"}.mdi-train-variant::before{content:"\F8C3"}.mdi-tram::before{content:"\F52D"}.mdi-tram-side::before{content:"\F0008"}.mdi-transcribe::before{content:"\F52E"}.mdi-transcribe-close::before{content:"\F52F"}.mdi-transfer::before{content:"\F0087"}.mdi-transfer-down::before{content:"\FD7D"}.mdi-transfer-left::before{content:"\FD7E"}.mdi-transfer-right::before{content:"\F530"}.mdi-transfer-up::before{content:"\FD7F"}.mdi-transit-connection::before{content:"\FD18"}.mdi-transit-connection-variant::before{content:"\FD19"}.mdi-transit-detour::before{content:"\FFA8"}.mdi-transit-transfer::before{content:"\F6AD"}.mdi-transition::before{content:"\F914"}.mdi-transition-masked::before{content:"\F915"}.mdi-translate::before{content:"\F5CA"}.mdi-translate-off::before{content:"\FE66"}.mdi-transmission-tower::before{content:"\FD1A"}.mdi-trash-can::before{content:"\FA78"}.mdi-trash-can-outline::before{content:"\FA79"}.mdi-tray::before{content:"\F02BF"}.mdi-tray-alert::before{content:"\F02C0"}.mdi-tray-full::before{content:"\F02C1"}.mdi-tray-minus::before{content:"\F02C2"}.mdi-tray-plus::before{content:"\F02C3"}.mdi-tray-remove::before{content:"\F02C4"}.mdi-treasure-chest::before{content:"\F725"}.mdi-tree::before{content:"\F531"}.mdi-tree-outline::before{content:"\FE4C"}.mdi-trello::before{content:"\F532"}.mdi-trending-down::before{content:"\F533"}.mdi-trending-neutral::before{content:"\F534"}.mdi-trending-up::before{content:"\F535"}.mdi-triangle::before{content:"\F536"}.mdi-triangle-outline::before{content:"\F537"}.mdi-triforce::before{content:"\FBB5"}.mdi-trophy::before{content:"\F538"}.mdi-trophy-award::before{content:"\F539"}.mdi-trophy-broken::before{content:"\FD80"}.mdi-trophy-outline::before{content:"\F53A"}.mdi-trophy-variant::before{content:"\F53B"}.mdi-trophy-variant-outline::before{content:"\F53C"}.mdi-truck::before{content:"\F53D"}.mdi-truck-check::before{content:"\FCB0"}.mdi-truck-check-outline::before{content:"\F02C5"}.mdi-truck-delivery::before{content:"\F53E"}.mdi-truck-delivery-outline::before{content:"\F02C6"}.mdi-truck-fast::before{content:"\F787"}.mdi-truck-fast-outline::before{content:"\F02C7"}.mdi-truck-outline::before{content:"\F02C8"}.mdi-truck-trailer::before{content:"\F726"}.mdi-trumpet::before{content:"\F00C1"}.mdi-tshirt-crew::before{content:"\FA7A"}.mdi-tshirt-crew-outline::before{content:"\F53F"}.mdi-tshirt-v::before{content:"\FA7B"}.mdi-tshirt-v-outline::before{content:"\F540"}.mdi-tumble-dryer::before{content:"\F916"}.mdi-tumble-dryer-alert::before{content:"\F01E5"}.mdi-tumble-dryer-off::before{content:"\F01E6"}.mdi-tumblr::before{content:"\F541"}.mdi-tumblr-box::before{content:"\F917"}.mdi-tumblr-reblog::before{content:"\F542"}.mdi-tune::before{content:"\F62E"}.mdi-tune-vertical::before{content:"\F66A"}.mdi-turnstile::before{content:"\FCB1"}.mdi-turnstile-outline::before{content:"\FCB2"}.mdi-turtle::before{content:"\FCB3"}.mdi-twitch::before{content:"\F543"}.mdi-twitter::before{content:"\F544"}.mdi-twitter-box::before{content:"\F545"}.mdi-twitter-circle::before{content:"\F546"}.mdi-twitter-retweet::before{content:"\F547"}.mdi-two-factor-authentication::before{content:"\F9AE"}.mdi-typewriter::before{content:"\FF4A"}.mdi-uber::before{content:"\F748"}.mdi-ubisoft::before{content:"\FBB6"}.mdi-ubuntu::before{content:"\F548"}.mdi-ufo::before{content:"\F00EF"}.mdi-ufo-outline::before{content:"\F00F0"}.mdi-ultra-high-definition::before{content:"\F7F8"}.mdi-umbraco::before{content:"\F549"}.mdi-umbrella::before{content:"\F54A"}.mdi-umbrella-closed::before{content:"\F9AF"}.mdi-umbrella-outline::before{content:"\F54B"}.mdi-undo::before{content:"\F54C"}.mdi-undo-variant::before{content:"\F54D"}.mdi-unfold-less-horizontal::before{content:"\F54E"}.mdi-unfold-less-vertical::before{content:"\F75F"}.mdi-unfold-more-horizontal::before{content:"\F54F"}.mdi-unfold-more-vertical::before{content:"\F760"}.mdi-ungroup::before{content:"\F550"}.mdi-unicode::before{content:"\FEED"}.mdi-unity::before{content:"\F6AE"}.mdi-unreal::before{content:"\F9B0"}.mdi-untappd::before{content:"\F551"}.mdi-update::before{content:"\F6AF"}.mdi-upload::before{content:"\F552"}.mdi-upload-lock::before{content:"\F039E"}.mdi-upload-lock-outline::before{content:"\F039F"}.mdi-upload-multiple::before{content:"\F83C"}.mdi-upload-network::before{content:"\F6F5"}.mdi-upload-network-outline::before{content:"\FCB4"}.mdi-upload-off::before{content:"\F00F1"}.mdi-upload-off-outline::before{content:"\F00F2"}.mdi-upload-outline::before{content:"\FE67"}.mdi-usb::before{content:"\F553"}.mdi-usb-flash-drive::before{content:"\F02C9"}.mdi-usb-flash-drive-outline::before{content:"\F02CA"}.mdi-usb-port::before{content:"\F021B"}.mdi-valve::before{content:"\F0088"}.mdi-valve-closed::before{content:"\F0089"}.mdi-valve-open::before{content:"\F008A"}.mdi-van-passenger::before{content:"\F7F9"}.mdi-van-utility::before{content:"\F7FA"}.mdi-vanish::before{content:"\F7FB"}.mdi-vanity-light::before{content:"\F020C"}.mdi-variable::before{content:"\FAE6"}.mdi-variable-box::before{content:"\F013C"}.mdi-vector-arrange-above::before{content:"\F554"}.mdi-vector-arrange-below::before{content:"\F555"}.mdi-vector-bezier::before{content:"\FAE7"}.mdi-vector-circle::before{content:"\F556"}.mdi-vector-circle-variant::before{content:"\F557"}.mdi-vector-combine::before{content:"\F558"}.mdi-vector-curve::before{content:"\F559"}.mdi-vector-difference::before{content:"\F55A"}.mdi-vector-difference-ab::before{content:"\F55B"}.mdi-vector-difference-ba::before{content:"\F55C"}.mdi-vector-ellipse::before{content:"\F892"}.mdi-vector-intersection::before{content:"\F55D"}.mdi-vector-line::before{content:"\F55E"}.mdi-vector-link::before{content:"\F0009"}.mdi-vector-point::before{content:"\F55F"}.mdi-vector-polygon::before{content:"\F560"}.mdi-vector-polyline::before{content:"\F561"}.mdi-vector-polyline-edit::before{content:"\F0250"}.mdi-vector-polyline-minus::before{content:"\F0251"}.mdi-vector-polyline-plus::before{content:"\F0252"}.mdi-vector-polyline-remove::before{content:"\F0253"}.mdi-vector-radius::before{content:"\F749"}.mdi-vector-rectangle::before{content:"\F5C6"}.mdi-vector-selection::before{content:"\F562"}.mdi-vector-square::before{content:"\F001"}.mdi-vector-triangle::before{content:"\F563"}.mdi-vector-union::before{content:"\F564"}.mdi-venmo::before{content:"\F578"}.mdi-vhs::before{content:"\FA1A"}.mdi-vibrate::before{content:"\F566"}.mdi-vibrate-off::before{content:"\FCB5"}.mdi-video::before{content:"\F567"}.mdi-video-3d::before{content:"\F7FC"}.mdi-video-3d-variant::before{content:"\FEEE"}.mdi-video-4k-box::before{content:"\F83D"}.mdi-video-account::before{content:"\F918"}.mdi-video-check::before{content:"\F008B"}.mdi-video-check-outline::before{content:"\F008C"}.mdi-video-image::before{content:"\F919"}.mdi-video-input-antenna::before{content:"\F83E"}.mdi-video-input-component::before{content:"\F83F"}.mdi-video-input-hdmi::before{content:"\F840"}.mdi-video-input-scart::before{content:"\FFA9"}.mdi-video-input-svideo::before{content:"\F841"}.mdi-video-minus::before{content:"\F9B1"}.mdi-video-off::before{content:"\F568"}.mdi-video-off-outline::before{content:"\FBB7"}.mdi-video-outline::before{content:"\FBB8"}.mdi-video-plus::before{content:"\F9B2"}.mdi-video-stabilization::before{content:"\F91A"}.mdi-video-switch::before{content:"\F569"}.mdi-video-vintage::before{content:"\FA1B"}.mdi-video-wireless::before{content:"\FEEF"}.mdi-video-wireless-outline::before{content:"\FEF0"}.mdi-view-agenda::before{content:"\F56A"}.mdi-view-agenda-outline::before{content:"\F0203"}.mdi-view-array::before{content:"\F56B"}.mdi-view-carousel::before{content:"\F56C"}.mdi-view-column::before{content:"\F56D"}.mdi-view-comfy::before{content:"\FE4D"}.mdi-view-compact::before{content:"\FE4E"}.mdi-view-compact-outline::before{content:"\FE4F"}.mdi-view-dashboard::before{content:"\F56E"}.mdi-view-dashboard-outline::before{content:"\FA1C"}.mdi-view-dashboard-variant::before{content:"\F842"}.mdi-view-day::before{content:"\F56F"}.mdi-view-grid::before{content:"\F570"}.mdi-view-grid-outline::before{content:"\F0204"}.mdi-view-grid-plus::before{content:"\FFAA"}.mdi-view-grid-plus-outline::before{content:"\F0205"}.mdi-view-headline::before{content:"\F571"}.mdi-view-list::before{content:"\F572"}.mdi-view-module::before{content:"\F573"}.mdi-view-parallel::before{content:"\F727"}.mdi-view-quilt::before{content:"\F574"}.mdi-view-sequential::before{content:"\F728"}.mdi-view-split-horizontal::before{content:"\FBA7"}.mdi-view-split-vertical::before{content:"\FBA8"}.mdi-view-stream::before{content:"\F575"}.mdi-view-week::before{content:"\F576"}.mdi-vimeo::before{content:"\F577"}.mdi-violin::before{content:"\F60F"}.mdi-virtual-reality::before{content:"\F893"}.mdi-visual-studio::before{content:"\F610"}.mdi-visual-studio-code::before{content:"\FA1D"}.mdi-vk::before{content:"\F579"}.mdi-vk-box::before{content:"\F57A"}.mdi-vk-circle::before{content:"\F57B"}.mdi-vlc::before{content:"\F57C"}.mdi-voice::before{content:"\F5CB"}.mdi-voice-off::before{content:"\FEF1"}.mdi-voicemail::before{content:"\F57D"}.mdi-volleyball::before{content:"\F9B3"}.mdi-volume-high::before{content:"\F57E"}.mdi-volume-low::before{content:"\F57F"}.mdi-volume-medium::before{content:"\F580"}.mdi-volume-minus::before{content:"\F75D"}.mdi-volume-mute::before{content:"\F75E"}.mdi-volume-off::before{content:"\F581"}.mdi-volume-plus::before{content:"\F75C"}.mdi-volume-source::before{content:"\F014B"}.mdi-volume-variant-off::before{content:"\FE68"}.mdi-volume-vibrate::before{content:"\F014C"}.mdi-vote::before{content:"\FA1E"}.mdi-vote-outline::before{content:"\FA1F"}.mdi-vpn::before{content:"\F582"}.mdi-vuejs::before{content:"\F843"}.mdi-vuetify::before{content:"\FE50"}.mdi-walk::before{content:"\F583"}.mdi-wall::before{content:"\F7FD"}.mdi-wall-sconce::before{content:"\F91B"}.mdi-wall-sconce-flat::before{content:"\F91C"}.mdi-wall-sconce-variant::before{content:"\F91D"}.mdi-wallet::before{content:"\F584"}.mdi-wallet-giftcard::before{content:"\F585"}.mdi-wallet-membership::before{content:"\F586"}.mdi-wallet-outline::before{content:"\FBB9"}.mdi-wallet-plus::before{content:"\FFAB"}.mdi-wallet-plus-outline::before{content:"\FFAC"}.mdi-wallet-travel::before{content:"\F587"}.mdi-wallpaper::before{content:"\FE69"}.mdi-wan::before{content:"\F588"}.mdi-wardrobe::before{content:"\FFAD"}.mdi-wardrobe-outline::before{content:"\FFAE"}.mdi-warehouse::before{content:"\FFBB"}.mdi-washing-machine::before{content:"\F729"}.mdi-washing-machine-alert::before{content:"\F01E7"}.mdi-washing-machine-off::before{content:"\F01E8"}.mdi-watch::before{content:"\F589"}.mdi-watch-export::before{content:"\F58A"}.mdi-watch-export-variant::before{content:"\F894"}.mdi-watch-import::before{content:"\F58B"}.mdi-watch-import-variant::before{content:"\F895"}.mdi-watch-variant::before{content:"\F896"}.mdi-watch-vibrate::before{content:"\F6B0"}.mdi-watch-vibrate-off::before{content:"\FCB6"}.mdi-water::before{content:"\F58C"}.mdi-water-boiler::before{content:"\FFAF"}.mdi-water-boiler-alert::before{content:"\F01DE"}.mdi-water-boiler-off::before{content:"\F01DF"}.mdi-water-off::before{content:"\F58D"}.mdi-water-outline::before{content:"\FE6A"}.mdi-water-percent::before{content:"\F58E"}.mdi-water-polo::before{content:"\F02CB"}.mdi-water-pump::before{content:"\F58F"}.mdi-water-pump-off::before{content:"\FFB0"}.mdi-water-well::before{content:"\F008D"}.mdi-water-well-outline::before{content:"\F008E"}.mdi-watermark::before{content:"\F612"}.mdi-wave::before{content:"\FF4B"}.mdi-waves::before{content:"\F78C"}.mdi-waze::before{content:"\FBBA"}.mdi-weather-cloudy::before{content:"\F590"}.mdi-weather-cloudy-alert::before{content:"\FF4C"}.mdi-weather-cloudy-arrow-right::before{content:"\FE51"}.mdi-weather-fog::before{content:"\F591"}.mdi-weather-hail::before{content:"\F592"}.mdi-weather-hazy::before{content:"\FF4D"}.mdi-weather-hurricane::before{content:"\F897"}.mdi-weather-lightning::before{content:"\F593"}.mdi-weather-lightning-rainy::before{content:"\F67D"}.mdi-weather-night::before{content:"\F594"}.mdi-weather-night-partly-cloudy::before{content:"\FF4E"}.mdi-weather-partly-cloudy::before{content:"\F595"}.mdi-weather-partly-lightning::before{content:"\FF4F"}.mdi-weather-partly-rainy::before{content:"\FF50"}.mdi-weather-partly-snowy::before{content:"\FF51"}.mdi-weather-partly-snowy-rainy::before{content:"\FF52"}.mdi-weather-pouring::before{content:"\F596"}.mdi-weather-rainy::before{content:"\F597"}.mdi-weather-snowy::before{content:"\F598"}.mdi-weather-snowy-heavy::before{content:"\FF53"}.mdi-weather-snowy-rainy::before{content:"\F67E"}.mdi-weather-sunny::before{content:"\F599"}.mdi-weather-sunny-alert::before{content:"\FF54"}.mdi-weather-sunset::before{content:"\F59A"}.mdi-weather-sunset-down::before{content:"\F59B"}.mdi-weather-sunset-up::before{content:"\F59C"}.mdi-weather-tornado::before{content:"\FF55"}.mdi-weather-windy::before{content:"\F59D"}.mdi-weather-windy-variant::before{content:"\F59E"}.mdi-web::before{content:"\F59F"}.mdi-web-box::before{content:"\FFB1"}.mdi-web-clock::before{content:"\F0275"}.mdi-webcam::before{content:"\F5A0"}.mdi-webhook::before{content:"\F62F"}.mdi-webpack::before{content:"\F72A"}.mdi-webrtc::before{content:"\F0273"}.mdi-wechat::before{content:"\F611"}.mdi-weight::before{content:"\F5A1"}.mdi-weight-gram::before{content:"\FD1B"}.mdi-weight-kilogram::before{content:"\F5A2"}.mdi-weight-lifter::before{content:"\F0188"}.mdi-weight-pound::before{content:"\F9B4"}.mdi-whatsapp::before{content:"\F5A3"}.mdi-wheelchair-accessibility::before{content:"\F5A4"}.mdi-whistle::before{content:"\F9B5"}.mdi-whistle-outline::before{content:"\F02E7"}.mdi-white-balance-auto::before{content:"\F5A5"}.mdi-white-balance-incandescent::before{content:"\F5A6"}.mdi-white-balance-iridescent::before{content:"\F5A7"}.mdi-white-balance-sunny::before{content:"\F5A8"}.mdi-widgets::before{content:"\F72B"}.mdi-widgets-outline::before{content:"\F0380"}.mdi-wifi::before{content:"\F5A9"}.mdi-wifi-off::before{content:"\F5AA"}.mdi-wifi-star::before{content:"\FE6B"}.mdi-wifi-strength-1::before{content:"\F91E"}.mdi-wifi-strength-1-alert::before{content:"\F91F"}.mdi-wifi-strength-1-lock::before{content:"\F920"}.mdi-wifi-strength-2::before{content:"\F921"}.mdi-wifi-strength-2-alert::before{content:"\F922"}.mdi-wifi-strength-2-lock::before{content:"\F923"}.mdi-wifi-strength-3::before{content:"\F924"}.mdi-wifi-strength-3-alert::before{content:"\F925"}.mdi-wifi-strength-3-lock::before{content:"\F926"}.mdi-wifi-strength-4::before{content:"\F927"}.mdi-wifi-strength-4-alert::before{content:"\F928"}.mdi-wifi-strength-4-lock::before{content:"\F929"}.mdi-wifi-strength-alert-outline::before{content:"\F92A"}.mdi-wifi-strength-lock-outline::before{content:"\F92B"}.mdi-wifi-strength-off::before{content:"\F92C"}.mdi-wifi-strength-off-outline::before{content:"\F92D"}.mdi-wifi-strength-outline::before{content:"\F92E"}.mdi-wii::before{content:"\F5AB"}.mdi-wiiu::before{content:"\F72C"}.mdi-wikipedia::before{content:"\F5AC"}.mdi-wind-turbine::before{content:"\FD81"}.mdi-window-close::before{content:"\F5AD"}.mdi-window-closed::before{content:"\F5AE"}.mdi-window-closed-variant::before{content:"\F0206"}.mdi-window-maximize::before{content:"\F5AF"}.mdi-window-minimize::before{content:"\F5B0"}.mdi-window-open::before{content:"\F5B1"}.mdi-window-open-variant::before{content:"\F0207"}.mdi-window-restore::before{content:"\F5B2"}.mdi-window-shutter::before{content:"\F0147"}.mdi-window-shutter-alert::before{content:"\F0148"}.mdi-window-shutter-open::before{content:"\F0149"}.mdi-windows::before{content:"\F5B3"}.mdi-windows-classic::before{content:"\FA20"}.mdi-wiper::before{content:"\FAE8"}.mdi-wiper-wash::before{content:"\FD82"}.mdi-wordpress::before{content:"\F5B4"}.mdi-worker::before{content:"\F5B5"}.mdi-wrap::before{content:"\F5B6"}.mdi-wrap-disabled::before{content:"\FBBB"}.mdi-wrench::before{content:"\F5B7"}.mdi-wrench-outline::before{content:"\FBBC"}.mdi-wunderlist::before{content:"\F5B8"}.mdi-xamarin::before{content:"\F844"}.mdi-xamarin-outline::before{content:"\F845"}.mdi-xaml::before{content:"\F673"}.mdi-xbox::before{content:"\F5B9"}.mdi-xbox-controller::before{content:"\F5BA"}.mdi-xbox-controller-battery-alert::before{content:"\F74A"}.mdi-xbox-controller-battery-charging::before{content:"\FA21"}.mdi-xbox-controller-battery-empty::before{content:"\F74B"}.mdi-xbox-controller-battery-full::before{content:"\F74C"}.mdi-xbox-controller-battery-low::before{content:"\F74D"}.mdi-xbox-controller-battery-medium::before{content:"\F74E"}.mdi-xbox-controller-battery-unknown::before{content:"\F74F"}.mdi-xbox-controller-menu::before{content:"\FE52"}.mdi-xbox-controller-off::before{content:"\F5BB"}.mdi-xbox-controller-view::before{content:"\FE53"}.mdi-xda::before{content:"\F5BC"}.mdi-xing::before{content:"\F5BD"}.mdi-xing-box::before{content:"\F5BE"}.mdi-xing-circle::before{content:"\F5BF"}.mdi-xml::before{content:"\F5C0"}.mdi-xmpp::before{content:"\F7FE"}.mdi-yahoo::before{content:"\FB2A"}.mdi-yammer::before{content:"\F788"}.mdi-yeast::before{content:"\F5C1"}.mdi-yelp::before{content:"\F5C2"}.mdi-yin-yang::before{content:"\F67F"}.mdi-yoga::before{content:"\F01A7"}.mdi-youtube::before{content:"\F5C3"}.mdi-youtube-creator-studio::before{content:"\F846"}.mdi-youtube-gaming::before{content:"\F847"}.mdi-youtube-subscription::before{content:"\FD1C"}.mdi-youtube-tv::before{content:"\F448"}.mdi-z-wave::before{content:"\FAE9"}.mdi-zend::before{content:"\FAEA"}.mdi-zigbee::before{content:"\FD1D"}.mdi-zip-box::before{content:"\F5C4"}.mdi-zip-box-outline::before{content:"\F001B"}.mdi-zip-disk::before{content:"\FA22"}.mdi-zodiac-aquarius::before{content:"\FA7C"}.mdi-zodiac-aries::before{content:"\FA7D"}.mdi-zodiac-cancer::before{content:"\FA7E"}.mdi-zodiac-capricorn::before{content:"\FA7F"}.mdi-zodiac-gemini::before{content:"\FA80"}.mdi-zodiac-leo::before{content:"\FA81"}.mdi-zodiac-libra::before{content:"\FA82"}.mdi-zodiac-pisces::before{content:"\FA83"}.mdi-zodiac-sagittarius::before{content:"\FA84"}.mdi-zodiac-scorpio::before{content:"\FA85"}.mdi-zodiac-taurus::before{content:"\FA86"}.mdi-zodiac-virgo::before{content:"\FA87"}.mdi-blank::before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+@font-face {
+ font-family: "Material Design Icons";
+ src: url("./fonts/materialdesignicons-webfont-4.9.95.eot");
+ src: url("./fonts/materialdesignicons-webfont-4.9.95.woff2") format("woff2"),
+ url("./fonts/materialdesignicons-webfont-4.9.95.woff") format("woff"),
+ url("./fonts/materialdesignicons-webfont-4.9.95.ttf") format("truetype");
+ font-weight: normal;
+ font-style: normal;
+}
+.mdi:before,
+.mdi-set {
+ display: inline-block;
+ font: normal normal normal 24px/1 "Material Design Icons";
+ font-size: inherit;
+ text-rendering: auto;
+ line-height: inherit;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.mdi-ab-testing::before {
+ content: "\F001C";
+}
+.mdi-abjad-arabic::before {
+ content: "\F0353";
+}
+.mdi-abjad-hebrew::before {
+ content: "\F0354";
+}
+.mdi-abugida-devanagari::before {
+ content: "\F0355";
+}
+.mdi-abugida-thai::before {
+ content: "\F0356";
+}
+.mdi-access-point::before {
+ content: "\F002";
+}
+.mdi-access-point-network::before {
+ content: "\F003";
+}
+.mdi-access-point-network-off::before {
+ content: "\FBBD";
+}
+.mdi-account::before {
+ content: "\F004";
+}
+.mdi-account-alert::before {
+ content: "\F005";
+}
+.mdi-account-alert-outline::before {
+ content: "\FB2C";
+}
+.mdi-account-arrow-left::before {
+ content: "\FB2D";
+}
+.mdi-account-arrow-left-outline::before {
+ content: "\FB2E";
+}
+.mdi-account-arrow-right::before {
+ content: "\FB2F";
+}
+.mdi-account-arrow-right-outline::before {
+ content: "\FB30";
+}
+.mdi-account-badge::before {
+ content: "\FD83";
+}
+.mdi-account-badge-alert::before {
+ content: "\FD84";
+}
+.mdi-account-badge-alert-outline::before {
+ content: "\FD85";
+}
+.mdi-account-badge-horizontal::before {
+ content: "\FDF0";
+}
+.mdi-account-badge-horizontal-outline::before {
+ content: "\FDF1";
+}
+.mdi-account-badge-outline::before {
+ content: "\FD86";
+}
+.mdi-account-box::before {
+ content: "\F006";
+}
+.mdi-account-box-multiple::before {
+ content: "\F933";
+}
+.mdi-account-box-multiple-outline::before {
+ content: "\F002C";
+}
+.mdi-account-box-outline::before {
+ content: "\F007";
+}
+.mdi-account-cancel::before {
+ content: "\F030A";
+}
+.mdi-account-cancel-outline::before {
+ content: "\F030B";
+}
+.mdi-account-card-details::before {
+ content: "\F5D2";
+}
+.mdi-account-card-details-outline::before {
+ content: "\FD87";
+}
+.mdi-account-cash::before {
+ content: "\F00C2";
+}
+.mdi-account-cash-outline::before {
+ content: "\F00C3";
+}
+.mdi-account-check::before {
+ content: "\F008";
+}
+.mdi-account-check-outline::before {
+ content: "\FBBE";
+}
+.mdi-account-child::before {
+ content: "\FA88";
+}
+.mdi-account-child-circle::before {
+ content: "\FA89";
+}
+.mdi-account-child-outline::before {
+ content: "\F00F3";
+}
+.mdi-account-circle::before {
+ content: "\F009";
+}
+.mdi-account-circle-outline::before {
+ content: "\FB31";
+}
+.mdi-account-clock::before {
+ content: "\FB32";
+}
+.mdi-account-clock-outline::before {
+ content: "\FB33";
+}
+.mdi-account-cog::before {
+ content: "\F039B";
+}
+.mdi-account-cog-outline::before {
+ content: "\F039C";
+}
+.mdi-account-convert::before {
+ content: "\F00A";
+}
+.mdi-account-convert-outline::before {
+ content: "\F032C";
+}
+.mdi-account-details::before {
+ content: "\F631";
+}
+.mdi-account-details-outline::before {
+ content: "\F039D";
+}
+.mdi-account-edit::before {
+ content: "\F6BB";
+}
+.mdi-account-edit-outline::before {
+ content: "\F001D";
+}
+.mdi-account-group::before {
+ content: "\F848";
+}
+.mdi-account-group-outline::before {
+ content: "\FB34";
+}
+.mdi-account-heart::before {
+ content: "\F898";
+}
+.mdi-account-heart-outline::before {
+ content: "\FBBF";
+}
+.mdi-account-key::before {
+ content: "\F00B";
+}
+.mdi-account-key-outline::before {
+ content: "\FBC0";
+}
+.mdi-account-lock::before {
+ content: "\F0189";
+}
+.mdi-account-lock-outline::before {
+ content: "\F018A";
+}
+.mdi-account-minus::before {
+ content: "\F00D";
+}
+.mdi-account-minus-outline::before {
+ content: "\FAEB";
+}
+.mdi-account-multiple::before {
+ content: "\F00E";
+}
+.mdi-account-multiple-check::before {
+ content: "\F8C4";
+}
+.mdi-account-multiple-check-outline::before {
+ content: "\F0229";
+}
+.mdi-account-multiple-minus::before {
+ content: "\F5D3";
+}
+.mdi-account-multiple-minus-outline::before {
+ content: "\FBC1";
+}
+.mdi-account-multiple-outline::before {
+ content: "\F00F";
+}
+.mdi-account-multiple-plus::before {
+ content: "\F010";
+}
+.mdi-account-multiple-plus-outline::before {
+ content: "\F7FF";
+}
+.mdi-account-multiple-remove::before {
+ content: "\F0235";
+}
+.mdi-account-multiple-remove-outline::before {
+ content: "\F0236";
+}
+.mdi-account-network::before {
+ content: "\F011";
+}
+.mdi-account-network-outline::before {
+ content: "\FBC2";
+}
+.mdi-account-off::before {
+ content: "\F012";
+}
+.mdi-account-off-outline::before {
+ content: "\FBC3";
+}
+.mdi-account-outline::before {
+ content: "\F013";
+}
+.mdi-account-plus::before {
+ content: "\F014";
+}
+.mdi-account-plus-outline::before {
+ content: "\F800";
+}
+.mdi-account-question::before {
+ content: "\FB35";
+}
+.mdi-account-question-outline::before {
+ content: "\FB36";
+}
+.mdi-account-remove::before {
+ content: "\F015";
+}
+.mdi-account-remove-outline::before {
+ content: "\FAEC";
+}
+.mdi-account-search::before {
+ content: "\F016";
+}
+.mdi-account-search-outline::before {
+ content: "\F934";
+}
+.mdi-account-settings::before {
+ content: "\F630";
+}
+.mdi-account-settings-outline::before {
+ content: "\F00F4";
+}
+.mdi-account-star::before {
+ content: "\F017";
+}
+.mdi-account-star-outline::before {
+ content: "\FBC4";
+}
+.mdi-account-supervisor::before {
+ content: "\FA8A";
+}
+.mdi-account-supervisor-circle::before {
+ content: "\FA8B";
+}
+.mdi-account-supervisor-outline::before {
+ content: "\F0158";
+}
+.mdi-account-switch::before {
+ content: "\F019";
+}
+.mdi-account-tie::before {
+ content: "\FCBF";
+}
+.mdi-account-tie-outline::before {
+ content: "\F00F5";
+}
+.mdi-account-tie-voice::before {
+ content: "\F0333";
+}
+.mdi-account-tie-voice-off::before {
+ content: "\F0335";
+}
+.mdi-account-tie-voice-off-outline::before {
+ content: "\F0336";
+}
+.mdi-account-tie-voice-outline::before {
+ content: "\F0334";
+}
+.mdi-accusoft::before {
+ content: "\F849";
+}
+.mdi-adjust::before {
+ content: "\F01A";
+}
+.mdi-adobe::before {
+ content: "\F935";
+}
+.mdi-adobe-acrobat::before {
+ content: "\FFBD";
+}
+.mdi-air-conditioner::before {
+ content: "\F01B";
+}
+.mdi-air-filter::before {
+ content: "\FD1F";
+}
+.mdi-air-horn::before {
+ content: "\FD88";
+}
+.mdi-air-humidifier::before {
+ content: "\F00C4";
+}
+.mdi-air-purifier::before {
+ content: "\FD20";
+}
+.mdi-airbag::before {
+ content: "\FBC5";
+}
+.mdi-airballoon::before {
+ content: "\F01C";
+}
+.mdi-airballoon-outline::before {
+ content: "\F002D";
+}
+.mdi-airplane::before {
+ content: "\F01D";
+}
+.mdi-airplane-landing::before {
+ content: "\F5D4";
+}
+.mdi-airplane-off::before {
+ content: "\F01E";
+}
+.mdi-airplane-takeoff::before {
+ content: "\F5D5";
+}
+.mdi-airplay::before {
+ content: "\F01F";
+}
+.mdi-airport::before {
+ content: "\F84A";
+}
+.mdi-alarm::before {
+ content: "\F020";
+}
+.mdi-alarm-bell::before {
+ content: "\F78D";
+}
+.mdi-alarm-check::before {
+ content: "\F021";
+}
+.mdi-alarm-light::before {
+ content: "\F78E";
+}
+.mdi-alarm-light-outline::before {
+ content: "\FBC6";
+}
+.mdi-alarm-multiple::before {
+ content: "\F022";
+}
+.mdi-alarm-note::before {
+ content: "\FE8E";
+}
+.mdi-alarm-note-off::before {
+ content: "\FE8F";
+}
+.mdi-alarm-off::before {
+ content: "\F023";
+}
+.mdi-alarm-plus::before {
+ content: "\F024";
+}
+.mdi-alarm-snooze::before {
+ content: "\F68D";
+}
+.mdi-album::before {
+ content: "\F025";
+}
+.mdi-alert::before {
+ content: "\F026";
+}
+.mdi-alert-box::before {
+ content: "\F027";
+}
+.mdi-alert-box-outline::before {
+ content: "\FCC0";
+}
+.mdi-alert-circle::before {
+ content: "\F028";
+}
+.mdi-alert-circle-check::before {
+ content: "\F0218";
+}
+.mdi-alert-circle-check-outline::before {
+ content: "\F0219";
+}
+.mdi-alert-circle-outline::before {
+ content: "\F5D6";
+}
+.mdi-alert-decagram::before {
+ content: "\F6BC";
+}
+.mdi-alert-decagram-outline::before {
+ content: "\FCC1";
+}
+.mdi-alert-octagon::before {
+ content: "\F029";
+}
+.mdi-alert-octagon-outline::before {
+ content: "\FCC2";
+}
+.mdi-alert-octagram::before {
+ content: "\F766";
+}
+.mdi-alert-octagram-outline::before {
+ content: "\FCC3";
+}
+.mdi-alert-outline::before {
+ content: "\F02A";
+}
+.mdi-alert-rhombus::before {
+ content: "\F01F9";
+}
+.mdi-alert-rhombus-outline::before {
+ content: "\F01FA";
+}
+.mdi-alien::before {
+ content: "\F899";
+}
+.mdi-alien-outline::before {
+ content: "\F00F6";
+}
+.mdi-align-horizontal-center::before {
+ content: "\F01EE";
+}
+.mdi-align-horizontal-left::before {
+ content: "\F01ED";
+}
+.mdi-align-horizontal-right::before {
+ content: "\F01EF";
+}
+.mdi-align-vertical-bottom::before {
+ content: "\F01F0";
+}
+.mdi-align-vertical-center::before {
+ content: "\F01F1";
+}
+.mdi-align-vertical-top::before {
+ content: "\F01F2";
+}
+.mdi-all-inclusive::before {
+ content: "\F6BD";
+}
+.mdi-allergy::before {
+ content: "\F0283";
+}
+.mdi-alpha::before {
+ content: "\F02B";
+}
+.mdi-alpha-a::before {
+ content: "\41";
+}
+.mdi-alpha-a-box::before {
+ content: "\FAED";
+}
+.mdi-alpha-a-box-outline::before {
+ content: "\FBC7";
+}
+.mdi-alpha-a-circle::before {
+ content: "\FBC8";
+}
+.mdi-alpha-a-circle-outline::before {
+ content: "\FBC9";
+}
+.mdi-alpha-b::before {
+ content: "\42";
+}
+.mdi-alpha-b-box::before {
+ content: "\FAEE";
+}
+.mdi-alpha-b-box-outline::before {
+ content: "\FBCA";
+}
+.mdi-alpha-b-circle::before {
+ content: "\FBCB";
+}
+.mdi-alpha-b-circle-outline::before {
+ content: "\FBCC";
+}
+.mdi-alpha-c::before {
+ content: "\43";
+}
+.mdi-alpha-c-box::before {
+ content: "\FAEF";
+}
+.mdi-alpha-c-box-outline::before {
+ content: "\FBCD";
+}
+.mdi-alpha-c-circle::before {
+ content: "\FBCE";
+}
+.mdi-alpha-c-circle-outline::before {
+ content: "\FBCF";
+}
+.mdi-alpha-d::before {
+ content: "\44";
+}
+.mdi-alpha-d-box::before {
+ content: "\FAF0";
+}
+.mdi-alpha-d-box-outline::before {
+ content: "\FBD0";
+}
+.mdi-alpha-d-circle::before {
+ content: "\FBD1";
+}
+.mdi-alpha-d-circle-outline::before {
+ content: "\FBD2";
+}
+.mdi-alpha-e::before {
+ content: "\45";
+}
+.mdi-alpha-e-box::before {
+ content: "\FAF1";
+}
+.mdi-alpha-e-box-outline::before {
+ content: "\FBD3";
+}
+.mdi-alpha-e-circle::before {
+ content: "\FBD4";
+}
+.mdi-alpha-e-circle-outline::before {
+ content: "\FBD5";
+}
+.mdi-alpha-f::before {
+ content: "\46";
+}
+.mdi-alpha-f-box::before {
+ content: "\FAF2";
+}
+.mdi-alpha-f-box-outline::before {
+ content: "\FBD6";
+}
+.mdi-alpha-f-circle::before {
+ content: "\FBD7";
+}
+.mdi-alpha-f-circle-outline::before {
+ content: "\FBD8";
+}
+.mdi-alpha-g::before {
+ content: "\47";
+}
+.mdi-alpha-g-box::before {
+ content: "\FAF3";
+}
+.mdi-alpha-g-box-outline::before {
+ content: "\FBD9";
+}
+.mdi-alpha-g-circle::before {
+ content: "\FBDA";
+}
+.mdi-alpha-g-circle-outline::before {
+ content: "\FBDB";
+}
+.mdi-alpha-h::before {
+ content: "\48";
+}
+.mdi-alpha-h-box::before {
+ content: "\FAF4";
+}
+.mdi-alpha-h-box-outline::before {
+ content: "\FBDC";
+}
+.mdi-alpha-h-circle::before {
+ content: "\FBDD";
+}
+.mdi-alpha-h-circle-outline::before {
+ content: "\FBDE";
+}
+.mdi-alpha-i::before {
+ content: "\49";
+}
+.mdi-alpha-i-box::before {
+ content: "\FAF5";
+}
+.mdi-alpha-i-box-outline::before {
+ content: "\FBDF";
+}
+.mdi-alpha-i-circle::before {
+ content: "\FBE0";
+}
+.mdi-alpha-i-circle-outline::before {
+ content: "\FBE1";
+}
+.mdi-alpha-j::before {
+ content: "\4A";
+}
+.mdi-alpha-j-box::before {
+ content: "\FAF6";
+}
+.mdi-alpha-j-box-outline::before {
+ content: "\FBE2";
+}
+.mdi-alpha-j-circle::before {
+ content: "\FBE3";
+}
+.mdi-alpha-j-circle-outline::before {
+ content: "\FBE4";
+}
+.mdi-alpha-k::before {
+ content: "\4B";
+}
+.mdi-alpha-k-box::before {
+ content: "\FAF7";
+}
+.mdi-alpha-k-box-outline::before {
+ content: "\FBE5";
+}
+.mdi-alpha-k-circle::before {
+ content: "\FBE6";
+}
+.mdi-alpha-k-circle-outline::before {
+ content: "\FBE7";
+}
+.mdi-alpha-l::before {
+ content: "\4C";
+}
+.mdi-alpha-l-box::before {
+ content: "\FAF8";
+}
+.mdi-alpha-l-box-outline::before {
+ content: "\FBE8";
+}
+.mdi-alpha-l-circle::before {
+ content: "\FBE9";
+}
+.mdi-alpha-l-circle-outline::before {
+ content: "\FBEA";
+}
+.mdi-alpha-m::before {
+ content: "\4D";
+}
+.mdi-alpha-m-box::before {
+ content: "\FAF9";
+}
+.mdi-alpha-m-box-outline::before {
+ content: "\FBEB";
+}
+.mdi-alpha-m-circle::before {
+ content: "\FBEC";
+}
+.mdi-alpha-m-circle-outline::before {
+ content: "\FBED";
+}
+.mdi-alpha-n::before {
+ content: "\4E";
+}
+.mdi-alpha-n-box::before {
+ content: "\FAFA";
+}
+.mdi-alpha-n-box-outline::before {
+ content: "\FBEE";
+}
+.mdi-alpha-n-circle::before {
+ content: "\FBEF";
+}
+.mdi-alpha-n-circle-outline::before {
+ content: "\FBF0";
+}
+.mdi-alpha-o::before {
+ content: "\4F";
+}
+.mdi-alpha-o-box::before {
+ content: "\FAFB";
+}
+.mdi-alpha-o-box-outline::before {
+ content: "\FBF1";
+}
+.mdi-alpha-o-circle::before {
+ content: "\FBF2";
+}
+.mdi-alpha-o-circle-outline::before {
+ content: "\FBF3";
+}
+.mdi-alpha-p::before {
+ content: "\50";
+}
+.mdi-alpha-p-box::before {
+ content: "\FAFC";
+}
+.mdi-alpha-p-box-outline::before {
+ content: "\FBF4";
+}
+.mdi-alpha-p-circle::before {
+ content: "\FBF5";
+}
+.mdi-alpha-p-circle-outline::before {
+ content: "\FBF6";
+}
+.mdi-alpha-q::before {
+ content: "\51";
+}
+.mdi-alpha-q-box::before {
+ content: "\FAFD";
+}
+.mdi-alpha-q-box-outline::before {
+ content: "\FBF7";
+}
+.mdi-alpha-q-circle::before {
+ content: "\FBF8";
+}
+.mdi-alpha-q-circle-outline::before {
+ content: "\FBF9";
+}
+.mdi-alpha-r::before {
+ content: "\52";
+}
+.mdi-alpha-r-box::before {
+ content: "\FAFE";
+}
+.mdi-alpha-r-box-outline::before {
+ content: "\FBFA";
+}
+.mdi-alpha-r-circle::before {
+ content: "\FBFB";
+}
+.mdi-alpha-r-circle-outline::before {
+ content: "\FBFC";
+}
+.mdi-alpha-s::before {
+ content: "\53";
+}
+.mdi-alpha-s-box::before {
+ content: "\FAFF";
+}
+.mdi-alpha-s-box-outline::before {
+ content: "\FBFD";
+}
+.mdi-alpha-s-circle::before {
+ content: "\FBFE";
+}
+.mdi-alpha-s-circle-outline::before {
+ content: "\FBFF";
+}
+.mdi-alpha-t::before {
+ content: "\54";
+}
+.mdi-alpha-t-box::before {
+ content: "\FB00";
+}
+.mdi-alpha-t-box-outline::before {
+ content: "\FC00";
+}
+.mdi-alpha-t-circle::before {
+ content: "\FC01";
+}
+.mdi-alpha-t-circle-outline::before {
+ content: "\FC02";
+}
+.mdi-alpha-u::before {
+ content: "\55";
+}
+.mdi-alpha-u-box::before {
+ content: "\FB01";
+}
+.mdi-alpha-u-box-outline::before {
+ content: "\FC03";
+}
+.mdi-alpha-u-circle::before {
+ content: "\FC04";
+}
+.mdi-alpha-u-circle-outline::before {
+ content: "\FC05";
+}
+.mdi-alpha-v::before {
+ content: "\56";
+}
+.mdi-alpha-v-box::before {
+ content: "\FB02";
+}
+.mdi-alpha-v-box-outline::before {
+ content: "\FC06";
+}
+.mdi-alpha-v-circle::before {
+ content: "\FC07";
+}
+.mdi-alpha-v-circle-outline::before {
+ content: "\FC08";
+}
+.mdi-alpha-w::before {
+ content: "\57";
+}
+.mdi-alpha-w-box::before {
+ content: "\FB03";
+}
+.mdi-alpha-w-box-outline::before {
+ content: "\FC09";
+}
+.mdi-alpha-w-circle::before {
+ content: "\FC0A";
+}
+.mdi-alpha-w-circle-outline::before {
+ content: "\FC0B";
+}
+.mdi-alpha-x::before {
+ content: "\58";
+}
+.mdi-alpha-x-box::before {
+ content: "\FB04";
+}
+.mdi-alpha-x-box-outline::before {
+ content: "\FC0C";
+}
+.mdi-alpha-x-circle::before {
+ content: "\FC0D";
+}
+.mdi-alpha-x-circle-outline::before {
+ content: "\FC0E";
+}
+.mdi-alpha-y::before {
+ content: "\59";
+}
+.mdi-alpha-y-box::before {
+ content: "\FB05";
+}
+.mdi-alpha-y-box-outline::before {
+ content: "\FC0F";
+}
+.mdi-alpha-y-circle::before {
+ content: "\FC10";
+}
+.mdi-alpha-y-circle-outline::before {
+ content: "\FC11";
+}
+.mdi-alpha-z::before {
+ content: "\5A";
+}
+.mdi-alpha-z-box::before {
+ content: "\FB06";
+}
+.mdi-alpha-z-box-outline::before {
+ content: "\FC12";
+}
+.mdi-alpha-z-circle::before {
+ content: "\FC13";
+}
+.mdi-alpha-z-circle-outline::before {
+ content: "\FC14";
+}
+.mdi-alphabet-aurebesh::before {
+ content: "\F0357";
+}
+.mdi-alphabet-cyrillic::before {
+ content: "\F0358";
+}
+.mdi-alphabet-greek::before {
+ content: "\F0359";
+}
+.mdi-alphabet-latin::before {
+ content: "\F035A";
+}
+.mdi-alphabet-piqad::before {
+ content: "\F035B";
+}
+.mdi-alphabet-tengwar::before {
+ content: "\F0362";
+}
+.mdi-alphabetical::before {
+ content: "\F02C";
+}
+.mdi-alphabetical-off::before {
+ content: "\F002E";
+}
+.mdi-alphabetical-variant::before {
+ content: "\F002F";
+}
+.mdi-alphabetical-variant-off::before {
+ content: "\F0030";
+}
+.mdi-altimeter::before {
+ content: "\F5D7";
+}
+.mdi-amazon::before {
+ content: "\F02D";
+}
+.mdi-amazon-alexa::before {
+ content: "\F8C5";
+}
+.mdi-amazon-drive::before {
+ content: "\F02E";
+}
+.mdi-ambulance::before {
+ content: "\F02F";
+}
+.mdi-ammunition::before {
+ content: "\FCC4";
+}
+.mdi-ampersand::before {
+ content: "\FA8C";
+}
+.mdi-amplifier::before {
+ content: "\F030";
+}
+.mdi-amplifier-off::before {
+ content: "\F01E0";
+}
+.mdi-anchor::before {
+ content: "\F031";
+}
+.mdi-android::before {
+ content: "\F032";
+}
+.mdi-android-auto::before {
+ content: "\FA8D";
+}
+.mdi-android-debug-bridge::before {
+ content: "\F033";
+}
+.mdi-android-head::before {
+ content: "\F78F";
+}
+.mdi-android-messages::before {
+ content: "\FD21";
+}
+.mdi-android-studio::before {
+ content: "\F034";
+}
+.mdi-angle-acute::before {
+ content: "\F936";
+}
+.mdi-angle-obtuse::before {
+ content: "\F937";
+}
+.mdi-angle-right::before {
+ content: "\F938";
+}
+.mdi-angular::before {
+ content: "\F6B1";
+}
+.mdi-angularjs::before {
+ content: "\F6BE";
+}
+.mdi-animation::before {
+ content: "\F5D8";
+}
+.mdi-animation-outline::before {
+ content: "\FA8E";
+}
+.mdi-animation-play::before {
+ content: "\F939";
+}
+.mdi-animation-play-outline::before {
+ content: "\FA8F";
+}
+.mdi-ansible::before {
+ content: "\F00C5";
+}
+.mdi-antenna::before {
+ content: "\F0144";
+}
+.mdi-anvil::before {
+ content: "\F89A";
+}
+.mdi-apache-kafka::before {
+ content: "\F0031";
+}
+.mdi-api::before {
+ content: "\F00C6";
+}
+.mdi-api-off::before {
+ content: "\F0282";
+}
+.mdi-apple::before {
+ content: "\F035";
+}
+.mdi-apple-finder::before {
+ content: "\F036";
+}
+.mdi-apple-icloud::before {
+ content: "\F038";
+}
+.mdi-apple-ios::before {
+ content: "\F037";
+}
+.mdi-apple-keyboard-caps::before {
+ content: "\F632";
+}
+.mdi-apple-keyboard-command::before {
+ content: "\F633";
+}
+.mdi-apple-keyboard-control::before {
+ content: "\F634";
+}
+.mdi-apple-keyboard-option::before {
+ content: "\F635";
+}
+.mdi-apple-keyboard-shift::before {
+ content: "\F636";
+}
+.mdi-apple-safari::before {
+ content: "\F039";
+}
+.mdi-application::before {
+ content: "\F614";
+}
+.mdi-application-export::before {
+ content: "\FD89";
+}
+.mdi-application-import::before {
+ content: "\FD8A";
+}
+.mdi-approximately-equal::before {
+ content: "\FFBE";
+}
+.mdi-approximately-equal-box::before {
+ content: "\FFBF";
+}
+.mdi-apps::before {
+ content: "\F03B";
+}
+.mdi-apps-box::before {
+ content: "\FD22";
+}
+.mdi-arch::before {
+ content: "\F8C6";
+}
+.mdi-archive::before {
+ content: "\F03C";
+}
+.mdi-archive-arrow-down::before {
+ content: "\F0284";
+}
+.mdi-archive-arrow-down-outline::before {
+ content: "\F0285";
+}
+.mdi-archive-arrow-up::before {
+ content: "\F0286";
+}
+.mdi-archive-arrow-up-outline::before {
+ content: "\F0287";
+}
+.mdi-archive-outline::before {
+ content: "\F0239";
+}
+.mdi-arm-flex::before {
+ content: "\F008F";
+}
+.mdi-arm-flex-outline::before {
+ content: "\F0090";
+}
+.mdi-arrange-bring-forward::before {
+ content: "\F03D";
+}
+.mdi-arrange-bring-to-front::before {
+ content: "\F03E";
+}
+.mdi-arrange-send-backward::before {
+ content: "\F03F";
+}
+.mdi-arrange-send-to-back::before {
+ content: "\F040";
+}
+.mdi-arrow-all::before {
+ content: "\F041";
+}
+.mdi-arrow-bottom-left::before {
+ content: "\F042";
+}
+.mdi-arrow-bottom-left-bold-outline::before {
+ content: "\F9B6";
+}
+.mdi-arrow-bottom-left-thick::before {
+ content: "\F9B7";
+}
+.mdi-arrow-bottom-right::before {
+ content: "\F043";
+}
+.mdi-arrow-bottom-right-bold-outline::before {
+ content: "\F9B8";
+}
+.mdi-arrow-bottom-right-thick::before {
+ content: "\F9B9";
+}
+.mdi-arrow-collapse::before {
+ content: "\F615";
+}
+.mdi-arrow-collapse-all::before {
+ content: "\F044";
+}
+.mdi-arrow-collapse-down::before {
+ content: "\F791";
+}
+.mdi-arrow-collapse-horizontal::before {
+ content: "\F84B";
+}
+.mdi-arrow-collapse-left::before {
+ content: "\F792";
+}
+.mdi-arrow-collapse-right::before {
+ content: "\F793";
+}
+.mdi-arrow-collapse-up::before {
+ content: "\F794";
+}
+.mdi-arrow-collapse-vertical::before {
+ content: "\F84C";
+}
+.mdi-arrow-decision::before {
+ content: "\F9BA";
+}
+.mdi-arrow-decision-auto::before {
+ content: "\F9BB";
+}
+.mdi-arrow-decision-auto-outline::before {
+ content: "\F9BC";
+}
+.mdi-arrow-decision-outline::before {
+ content: "\F9BD";
+}
+.mdi-arrow-down::before {
+ content: "\F045";
+}
+.mdi-arrow-down-bold::before {
+ content: "\F72D";
+}
+.mdi-arrow-down-bold-box::before {
+ content: "\F72E";
+}
+.mdi-arrow-down-bold-box-outline::before {
+ content: "\F72F";
+}
+.mdi-arrow-down-bold-circle::before {
+ content: "\F047";
+}
+.mdi-arrow-down-bold-circle-outline::before {
+ content: "\F048";
+}
+.mdi-arrow-down-bold-hexagon-outline::before {
+ content: "\F049";
+}
+.mdi-arrow-down-bold-outline::before {
+ content: "\F9BE";
+}
+.mdi-arrow-down-box::before {
+ content: "\F6BF";
+}
+.mdi-arrow-down-circle::before {
+ content: "\FCB7";
+}
+.mdi-arrow-down-circle-outline::before {
+ content: "\FCB8";
+}
+.mdi-arrow-down-drop-circle::before {
+ content: "\F04A";
+}
+.mdi-arrow-down-drop-circle-outline::before {
+ content: "\F04B";
+}
+.mdi-arrow-down-thick::before {
+ content: "\F046";
+}
+.mdi-arrow-expand::before {
+ content: "\F616";
+}
+.mdi-arrow-expand-all::before {
+ content: "\F04C";
+}
+.mdi-arrow-expand-down::before {
+ content: "\F795";
+}
+.mdi-arrow-expand-horizontal::before {
+ content: "\F84D";
+}
+.mdi-arrow-expand-left::before {
+ content: "\F796";
+}
+.mdi-arrow-expand-right::before {
+ content: "\F797";
+}
+.mdi-arrow-expand-up::before {
+ content: "\F798";
+}
+.mdi-arrow-expand-vertical::before {
+ content: "\F84E";
+}
+.mdi-arrow-horizontal-lock::before {
+ content: "\F0186";
+}
+.mdi-arrow-left::before {
+ content: "\F04D";
+}
+.mdi-arrow-left-bold::before {
+ content: "\F730";
+}
+.mdi-arrow-left-bold-box::before {
+ content: "\F731";
+}
+.mdi-arrow-left-bold-box-outline::before {
+ content: "\F732";
+}
+.mdi-arrow-left-bold-circle::before {
+ content: "\F04F";
+}
+.mdi-arrow-left-bold-circle-outline::before {
+ content: "\F050";
+}
+.mdi-arrow-left-bold-hexagon-outline::before {
+ content: "\F051";
+}
+.mdi-arrow-left-bold-outline::before {
+ content: "\F9BF";
+}
+.mdi-arrow-left-box::before {
+ content: "\F6C0";
+}
+.mdi-arrow-left-circle::before {
+ content: "\FCB9";
+}
+.mdi-arrow-left-circle-outline::before {
+ content: "\FCBA";
+}
+.mdi-arrow-left-drop-circle::before {
+ content: "\F052";
+}
+.mdi-arrow-left-drop-circle-outline::before {
+ content: "\F053";
+}
+.mdi-arrow-left-right::before {
+ content: "\FE90";
+}
+.mdi-arrow-left-right-bold::before {
+ content: "\FE91";
+}
+.mdi-arrow-left-right-bold-outline::before {
+ content: "\F9C0";
+}
+.mdi-arrow-left-thick::before {
+ content: "\F04E";
+}
+.mdi-arrow-right::before {
+ content: "\F054";
+}
+.mdi-arrow-right-bold::before {
+ content: "\F733";
+}
+.mdi-arrow-right-bold-box::before {
+ content: "\F734";
+}
+.mdi-arrow-right-bold-box-outline::before {
+ content: "\F735";
+}
+.mdi-arrow-right-bold-circle::before {
+ content: "\F056";
+}
+.mdi-arrow-right-bold-circle-outline::before {
+ content: "\F057";
+}
+.mdi-arrow-right-bold-hexagon-outline::before {
+ content: "\F058";
+}
+.mdi-arrow-right-bold-outline::before {
+ content: "\F9C1";
+}
+.mdi-arrow-right-box::before {
+ content: "\F6C1";
+}
+.mdi-arrow-right-circle::before {
+ content: "\FCBB";
+}
+.mdi-arrow-right-circle-outline::before {
+ content: "\FCBC";
+}
+.mdi-arrow-right-drop-circle::before {
+ content: "\F059";
+}
+.mdi-arrow-right-drop-circle-outline::before {
+ content: "\F05A";
+}
+.mdi-arrow-right-thick::before {
+ content: "\F055";
+}
+.mdi-arrow-split-horizontal::before {
+ content: "\F93A";
+}
+.mdi-arrow-split-vertical::before {
+ content: "\F93B";
+}
+.mdi-arrow-top-left::before {
+ content: "\F05B";
+}
+.mdi-arrow-top-left-bold-outline::before {
+ content: "\F9C2";
+}
+.mdi-arrow-top-left-bottom-right::before {
+ content: "\FE92";
+}
+.mdi-arrow-top-left-bottom-right-bold::before {
+ content: "\FE93";
+}
+.mdi-arrow-top-left-thick::before {
+ content: "\F9C3";
+}
+.mdi-arrow-top-right::before {
+ content: "\F05C";
+}
+.mdi-arrow-top-right-bold-outline::before {
+ content: "\F9C4";
+}
+.mdi-arrow-top-right-bottom-left::before {
+ content: "\FE94";
+}
+.mdi-arrow-top-right-bottom-left-bold::before {
+ content: "\FE95";
+}
+.mdi-arrow-top-right-thick::before {
+ content: "\F9C5";
+}
+.mdi-arrow-up::before {
+ content: "\F05D";
+}
+.mdi-arrow-up-bold::before {
+ content: "\F736";
+}
+.mdi-arrow-up-bold-box::before {
+ content: "\F737";
+}
+.mdi-arrow-up-bold-box-outline::before {
+ content: "\F738";
+}
+.mdi-arrow-up-bold-circle::before {
+ content: "\F05F";
+}
+.mdi-arrow-up-bold-circle-outline::before {
+ content: "\F060";
+}
+.mdi-arrow-up-bold-hexagon-outline::before {
+ content: "\F061";
+}
+.mdi-arrow-up-bold-outline::before {
+ content: "\F9C6";
+}
+.mdi-arrow-up-box::before {
+ content: "\F6C2";
+}
+.mdi-arrow-up-circle::before {
+ content: "\FCBD";
+}
+.mdi-arrow-up-circle-outline::before {
+ content: "\FCBE";
+}
+.mdi-arrow-up-down::before {
+ content: "\FE96";
+}
+.mdi-arrow-up-down-bold::before {
+ content: "\FE97";
+}
+.mdi-arrow-up-down-bold-outline::before {
+ content: "\F9C7";
+}
+.mdi-arrow-up-drop-circle::before {
+ content: "\F062";
+}
+.mdi-arrow-up-drop-circle-outline::before {
+ content: "\F063";
+}
+.mdi-arrow-up-thick::before {
+ content: "\F05E";
+}
+.mdi-arrow-vertical-lock::before {
+ content: "\F0187";
+}
+.mdi-artist::before {
+ content: "\F802";
+}
+.mdi-artist-outline::before {
+ content: "\FCC5";
+}
+.mdi-artstation::before {
+ content: "\FB37";
+}
+.mdi-aspect-ratio::before {
+ content: "\FA23";
+}
+.mdi-assistant::before {
+ content: "\F064";
+}
+.mdi-asterisk::before {
+ content: "\F6C3";
+}
+.mdi-at::before {
+ content: "\F065";
+}
+.mdi-atlassian::before {
+ content: "\F803";
+}
+.mdi-atm::before {
+ content: "\FD23";
+}
+.mdi-atom::before {
+ content: "\F767";
+}
+.mdi-atom-variant::before {
+ content: "\FE98";
+}
+.mdi-attachment::before {
+ content: "\F066";
+}
+.mdi-audio-video::before {
+ content: "\F93C";
+}
+.mdi-audio-video-off::before {
+ content: "\F01E1";
+}
+.mdi-audiobook::before {
+ content: "\F067";
+}
+.mdi-augmented-reality::before {
+ content: "\F84F";
+}
+.mdi-auto-download::before {
+ content: "\F03A9";
+}
+.mdi-auto-fix::before {
+ content: "\F068";
+}
+.mdi-auto-upload::before {
+ content: "\F069";
+}
+.mdi-autorenew::before {
+ content: "\F06A";
+}
+.mdi-av-timer::before {
+ content: "\F06B";
+}
+.mdi-aws::before {
+ content: "\FDF2";
+}
+.mdi-axe::before {
+ content: "\F8C7";
+}
+.mdi-axis::before {
+ content: "\FD24";
+}
+.mdi-axis-arrow::before {
+ content: "\FD25";
+}
+.mdi-axis-arrow-lock::before {
+ content: "\FD26";
+}
+.mdi-axis-lock::before {
+ content: "\FD27";
+}
+.mdi-axis-x-arrow::before {
+ content: "\FD28";
+}
+.mdi-axis-x-arrow-lock::before {
+ content: "\FD29";
+}
+.mdi-axis-x-rotate-clockwise::before {
+ content: "\FD2A";
+}
+.mdi-axis-x-rotate-counterclockwise::before {
+ content: "\FD2B";
+}
+.mdi-axis-x-y-arrow-lock::before {
+ content: "\FD2C";
+}
+.mdi-axis-y-arrow::before {
+ content: "\FD2D";
+}
+.mdi-axis-y-arrow-lock::before {
+ content: "\FD2E";
+}
+.mdi-axis-y-rotate-clockwise::before {
+ content: "\FD2F";
+}
+.mdi-axis-y-rotate-counterclockwise::before {
+ content: "\FD30";
+}
+.mdi-axis-z-arrow::before {
+ content: "\FD31";
+}
+.mdi-axis-z-arrow-lock::before {
+ content: "\FD32";
+}
+.mdi-axis-z-rotate-clockwise::before {
+ content: "\FD33";
+}
+.mdi-axis-z-rotate-counterclockwise::before {
+ content: "\FD34";
+}
+.mdi-azure::before {
+ content: "\F804";
+}
+.mdi-azure-devops::before {
+ content: "\F0091";
+}
+.mdi-babel::before {
+ content: "\FA24";
+}
+.mdi-baby::before {
+ content: "\F06C";
+}
+.mdi-baby-bottle::before {
+ content: "\FF56";
+}
+.mdi-baby-bottle-outline::before {
+ content: "\FF57";
+}
+.mdi-baby-carriage::before {
+ content: "\F68E";
+}
+.mdi-baby-carriage-off::before {
+ content: "\FFC0";
+}
+.mdi-baby-face::before {
+ content: "\FE99";
+}
+.mdi-baby-face-outline::before {
+ content: "\FE9A";
+}
+.mdi-backburger::before {
+ content: "\F06D";
+}
+.mdi-backspace::before {
+ content: "\F06E";
+}
+.mdi-backspace-outline::before {
+ content: "\FB38";
+}
+.mdi-backspace-reverse::before {
+ content: "\FE9B";
+}
+.mdi-backspace-reverse-outline::before {
+ content: "\FE9C";
+}
+.mdi-backup-restore::before {
+ content: "\F06F";
+}
+.mdi-bacteria::before {
+ content: "\FEF2";
+}
+.mdi-bacteria-outline::before {
+ content: "\FEF3";
+}
+.mdi-badminton::before {
+ content: "\F850";
+}
+.mdi-bag-carry-on::before {
+ content: "\FF58";
+}
+.mdi-bag-carry-on-check::before {
+ content: "\FD41";
+}
+.mdi-bag-carry-on-off::before {
+ content: "\FF59";
+}
+.mdi-bag-checked::before {
+ content: "\FF5A";
+}
+.mdi-bag-personal::before {
+ content: "\FDF3";
+}
+.mdi-bag-personal-off::before {
+ content: "\FDF4";
+}
+.mdi-bag-personal-off-outline::before {
+ content: "\FDF5";
+}
+.mdi-bag-personal-outline::before {
+ content: "\FDF6";
+}
+.mdi-baguette::before {
+ content: "\FF5B";
+}
+.mdi-balloon::before {
+ content: "\FA25";
+}
+.mdi-ballot::before {
+ content: "\F9C8";
+}
+.mdi-ballot-outline::before {
+ content: "\F9C9";
+}
+.mdi-ballot-recount::before {
+ content: "\FC15";
+}
+.mdi-ballot-recount-outline::before {
+ content: "\FC16";
+}
+.mdi-bandage::before {
+ content: "\FD8B";
+}
+.mdi-bandcamp::before {
+ content: "\F674";
+}
+.mdi-bank::before {
+ content: "\F070";
+}
+.mdi-bank-minus::before {
+ content: "\FD8C";
+}
+.mdi-bank-outline::before {
+ content: "\FE9D";
+}
+.mdi-bank-plus::before {
+ content: "\FD8D";
+}
+.mdi-bank-remove::before {
+ content: "\FD8E";
+}
+.mdi-bank-transfer::before {
+ content: "\FA26";
+}
+.mdi-bank-transfer-in::before {
+ content: "\FA27";
+}
+.mdi-bank-transfer-out::before {
+ content: "\FA28";
+}
+.mdi-barcode::before {
+ content: "\F071";
+}
+.mdi-barcode-off::before {
+ content: "\F0261";
+}
+.mdi-barcode-scan::before {
+ content: "\F072";
+}
+.mdi-barley::before {
+ content: "\F073";
+}
+.mdi-barley-off::before {
+ content: "\FB39";
+}
+.mdi-barn::before {
+ content: "\FB3A";
+}
+.mdi-barrel::before {
+ content: "\F074";
+}
+.mdi-baseball::before {
+ content: "\F851";
+}
+.mdi-baseball-bat::before {
+ content: "\F852";
+}
+.mdi-basecamp::before {
+ content: "\F075";
+}
+.mdi-bash::before {
+ content: "\F01AE";
+}
+.mdi-basket::before {
+ content: "\F076";
+}
+.mdi-basket-fill::before {
+ content: "\F077";
+}
+.mdi-basket-outline::before {
+ content: "\F01AC";
+}
+.mdi-basket-unfill::before {
+ content: "\F078";
+}
+.mdi-basketball::before {
+ content: "\F805";
+}
+.mdi-basketball-hoop::before {
+ content: "\FC17";
+}
+.mdi-basketball-hoop-outline::before {
+ content: "\FC18";
+}
+.mdi-bat::before {
+ content: "\FB3B";
+}
+.mdi-battery::before {
+ content: "\F079";
+}
+.mdi-battery-10::before {
+ content: "\F07A";
+}
+.mdi-battery-10-bluetooth::before {
+ content: "\F93D";
+}
+.mdi-battery-20::before {
+ content: "\F07B";
+}
+.mdi-battery-20-bluetooth::before {
+ content: "\F93E";
+}
+.mdi-battery-30::before {
+ content: "\F07C";
+}
+.mdi-battery-30-bluetooth::before {
+ content: "\F93F";
+}
+.mdi-battery-40::before {
+ content: "\F07D";
+}
+.mdi-battery-40-bluetooth::before {
+ content: "\F940";
+}
+.mdi-battery-50::before {
+ content: "\F07E";
+}
+.mdi-battery-50-bluetooth::before {
+ content: "\F941";
+}
+.mdi-battery-60::before {
+ content: "\F07F";
+}
+.mdi-battery-60-bluetooth::before {
+ content: "\F942";
+}
+.mdi-battery-70::before {
+ content: "\F080";
+}
+.mdi-battery-70-bluetooth::before {
+ content: "\F943";
+}
+.mdi-battery-80::before {
+ content: "\F081";
+}
+.mdi-battery-80-bluetooth::before {
+ content: "\F944";
+}
+.mdi-battery-90::before {
+ content: "\F082";
+}
+.mdi-battery-90-bluetooth::before {
+ content: "\F945";
+}
+.mdi-battery-alert::before {
+ content: "\F083";
+}
+.mdi-battery-alert-bluetooth::before {
+ content: "\F946";
+}
+.mdi-battery-alert-variant::before {
+ content: "\F00F7";
+}
+.mdi-battery-alert-variant-outline::before {
+ content: "\F00F8";
+}
+.mdi-battery-bluetooth::before {
+ content: "\F947";
+}
+.mdi-battery-bluetooth-variant::before {
+ content: "\F948";
+}
+.mdi-battery-charging::before {
+ content: "\F084";
+}
+.mdi-battery-charging-10::before {
+ content: "\F89B";
+}
+.mdi-battery-charging-100::before {
+ content: "\F085";
+}
+.mdi-battery-charging-20::before {
+ content: "\F086";
+}
+.mdi-battery-charging-30::before {
+ content: "\F087";
+}
+.mdi-battery-charging-40::before {
+ content: "\F088";
+}
+.mdi-battery-charging-50::before {
+ content: "\F89C";
+}
+.mdi-battery-charging-60::before {
+ content: "\F089";
+}
+.mdi-battery-charging-70::before {
+ content: "\F89D";
+}
+.mdi-battery-charging-80::before {
+ content: "\F08A";
+}
+.mdi-battery-charging-90::before {
+ content: "\F08B";
+}
+.mdi-battery-charging-high::before {
+ content: "\F02D1";
+}
+.mdi-battery-charging-low::before {
+ content: "\F02CF";
+}
+.mdi-battery-charging-medium::before {
+ content: "\F02D0";
+}
+.mdi-battery-charging-outline::before {
+ content: "\F89E";
+}
+.mdi-battery-charging-wireless::before {
+ content: "\F806";
+}
+.mdi-battery-charging-wireless-10::before {
+ content: "\F807";
+}
+.mdi-battery-charging-wireless-20::before {
+ content: "\F808";
+}
+.mdi-battery-charging-wireless-30::before {
+ content: "\F809";
+}
+.mdi-battery-charging-wireless-40::before {
+ content: "\F80A";
+}
+.mdi-battery-charging-wireless-50::before {
+ content: "\F80B";
+}
+.mdi-battery-charging-wireless-60::before {
+ content: "\F80C";
+}
+.mdi-battery-charging-wireless-70::before {
+ content: "\F80D";
+}
+.mdi-battery-charging-wireless-80::before {
+ content: "\F80E";
+}
+.mdi-battery-charging-wireless-90::before {
+ content: "\F80F";
+}
+.mdi-battery-charging-wireless-alert::before {
+ content: "\F810";
+}
+.mdi-battery-charging-wireless-outline::before {
+ content: "\F811";
+}
+.mdi-battery-heart::before {
+ content: "\F023A";
+}
+.mdi-battery-heart-outline::before {
+ content: "\F023B";
+}
+.mdi-battery-heart-variant::before {
+ content: "\F023C";
+}
+.mdi-battery-high::before {
+ content: "\F02CE";
+}
+.mdi-battery-low::before {
+ content: "\F02CC";
+}
+.mdi-battery-medium::before {
+ content: "\F02CD";
+}
+.mdi-battery-minus::before {
+ content: "\F08C";
+}
+.mdi-battery-negative::before {
+ content: "\F08D";
+}
+.mdi-battery-off::before {
+ content: "\F0288";
+}
+.mdi-battery-off-outline::before {
+ content: "\F0289";
+}
+.mdi-battery-outline::before {
+ content: "\F08E";
+}
+.mdi-battery-plus::before {
+ content: "\F08F";
+}
+.mdi-battery-positive::before {
+ content: "\F090";
+}
+.mdi-battery-unknown::before {
+ content: "\F091";
+}
+.mdi-battery-unknown-bluetooth::before {
+ content: "\F949";
+}
+.mdi-battlenet::before {
+ content: "\FB3C";
+}
+.mdi-beach::before {
+ content: "\F092";
+}
+.mdi-beaker::before {
+ content: "\FCC6";
+}
+.mdi-beaker-alert::before {
+ content: "\F0254";
+}
+.mdi-beaker-alert-outline::before {
+ content: "\F0255";
+}
+.mdi-beaker-check::before {
+ content: "\F0256";
+}
+.mdi-beaker-check-outline::before {
+ content: "\F0257";
+}
+.mdi-beaker-minus::before {
+ content: "\F0258";
+}
+.mdi-beaker-minus-outline::before {
+ content: "\F0259";
+}
+.mdi-beaker-outline::before {
+ content: "\F68F";
+}
+.mdi-beaker-plus::before {
+ content: "\F025A";
+}
+.mdi-beaker-plus-outline::before {
+ content: "\F025B";
+}
+.mdi-beaker-question::before {
+ content: "\F025C";
+}
+.mdi-beaker-question-outline::before {
+ content: "\F025D";
+}
+.mdi-beaker-remove::before {
+ content: "\F025E";
+}
+.mdi-beaker-remove-outline::before {
+ content: "\F025F";
+}
+.mdi-beats::before {
+ content: "\F097";
+}
+.mdi-bed-double::before {
+ content: "\F0092";
+}
+.mdi-bed-double-outline::before {
+ content: "\F0093";
+}
+.mdi-bed-empty::before {
+ content: "\F89F";
+}
+.mdi-bed-king::before {
+ content: "\F0094";
+}
+.mdi-bed-king-outline::before {
+ content: "\F0095";
+}
+.mdi-bed-queen::before {
+ content: "\F0096";
+}
+.mdi-bed-queen-outline::before {
+ content: "\F0097";
+}
+.mdi-bed-single::before {
+ content: "\F0098";
+}
+.mdi-bed-single-outline::before {
+ content: "\F0099";
+}
+.mdi-bee::before {
+ content: "\FFC1";
+}
+.mdi-bee-flower::before {
+ content: "\FFC2";
+}
+.mdi-beehive-outline::before {
+ content: "\F00F9";
+}
+.mdi-beer::before {
+ content: "\F098";
+}
+.mdi-beer-outline::before {
+ content: "\F0337";
+}
+.mdi-behance::before {
+ content: "\F099";
+}
+.mdi-bell::before {
+ content: "\F09A";
+}
+.mdi-bell-alert::before {
+ content: "\FD35";
+}
+.mdi-bell-alert-outline::before {
+ content: "\FE9E";
+}
+.mdi-bell-check::before {
+ content: "\F0210";
+}
+.mdi-bell-check-outline::before {
+ content: "\F0211";
+}
+.mdi-bell-circle::before {
+ content: "\FD36";
+}
+.mdi-bell-circle-outline::before {
+ content: "\FD37";
+}
+.mdi-bell-off::before {
+ content: "\F09B";
+}
+.mdi-bell-off-outline::before {
+ content: "\FA90";
+}
+.mdi-bell-outline::before {
+ content: "\F09C";
+}
+.mdi-bell-plus::before {
+ content: "\F09D";
+}
+.mdi-bell-plus-outline::before {
+ content: "\FA91";
+}
+.mdi-bell-ring::before {
+ content: "\F09E";
+}
+.mdi-bell-ring-outline::before {
+ content: "\F09F";
+}
+.mdi-bell-sleep::before {
+ content: "\F0A0";
+}
+.mdi-bell-sleep-outline::before {
+ content: "\FA92";
+}
+.mdi-beta::before {
+ content: "\F0A1";
+}
+.mdi-betamax::before {
+ content: "\F9CA";
+}
+.mdi-biathlon::before {
+ content: "\FDF7";
+}
+.mdi-bible::before {
+ content: "\F0A2";
+}
+.mdi-bicycle::before {
+ content: "\F00C7";
+}
+.mdi-bicycle-basket::before {
+ content: "\F0260";
+}
+.mdi-bike::before {
+ content: "\F0A3";
+}
+.mdi-bike-fast::before {
+ content: "\F014A";
+}
+.mdi-billboard::before {
+ content: "\F0032";
+}
+.mdi-billiards::before {
+ content: "\FB3D";
+}
+.mdi-billiards-rack::before {
+ content: "\FB3E";
+}
+.mdi-bing::before {
+ content: "\F0A4";
+}
+.mdi-binoculars::before {
+ content: "\F0A5";
+}
+.mdi-bio::before {
+ content: "\F0A6";
+}
+.mdi-biohazard::before {
+ content: "\F0A7";
+}
+.mdi-bitbucket::before {
+ content: "\F0A8";
+}
+.mdi-bitcoin::before {
+ content: "\F812";
+}
+.mdi-black-mesa::before {
+ content: "\F0A9";
+}
+.mdi-blackberry::before {
+ content: "\F0AA";
+}
+.mdi-blender::before {
+ content: "\FCC7";
+}
+.mdi-blender-software::before {
+ content: "\F0AB";
+}
+.mdi-blinds::before {
+ content: "\F0AC";
+}
+.mdi-blinds-open::before {
+ content: "\F0033";
+}
+.mdi-block-helper::before {
+ content: "\F0AD";
+}
+.mdi-blogger::before {
+ content: "\F0AE";
+}
+.mdi-blood-bag::before {
+ content: "\FCC8";
+}
+.mdi-bluetooth::before {
+ content: "\F0AF";
+}
+.mdi-bluetooth-audio::before {
+ content: "\F0B0";
+}
+.mdi-bluetooth-connect::before {
+ content: "\F0B1";
+}
+.mdi-bluetooth-off::before {
+ content: "\F0B2";
+}
+.mdi-bluetooth-settings::before {
+ content: "\F0B3";
+}
+.mdi-bluetooth-transfer::before {
+ content: "\F0B4";
+}
+.mdi-blur::before {
+ content: "\F0B5";
+}
+.mdi-blur-linear::before {
+ content: "\F0B6";
+}
+.mdi-blur-off::before {
+ content: "\F0B7";
+}
+.mdi-blur-radial::before {
+ content: "\F0B8";
+}
+.mdi-bolnisi-cross::before {
+ content: "\FCC9";
+}
+.mdi-bolt::before {
+ content: "\FD8F";
+}
+.mdi-bomb::before {
+ content: "\F690";
+}
+.mdi-bomb-off::before {
+ content: "\F6C4";
+}
+.mdi-bone::before {
+ content: "\F0B9";
+}
+.mdi-book::before {
+ content: "\F0BA";
+}
+.mdi-book-information-variant::before {
+ content: "\F009A";
+}
+.mdi-book-lock::before {
+ content: "\F799";
+}
+.mdi-book-lock-open::before {
+ content: "\F79A";
+}
+.mdi-book-minus::before {
+ content: "\F5D9";
+}
+.mdi-book-minus-multiple::before {
+ content: "\FA93";
+}
+.mdi-book-multiple::before {
+ content: "\F0BB";
+}
+.mdi-book-open::before {
+ content: "\F0BD";
+}
+.mdi-book-open-outline::before {
+ content: "\FB3F";
+}
+.mdi-book-open-page-variant::before {
+ content: "\F5DA";
+}
+.mdi-book-open-variant::before {
+ content: "\F0BE";
+}
+.mdi-book-outline::before {
+ content: "\FB40";
+}
+.mdi-book-play::before {
+ content: "\FE9F";
+}
+.mdi-book-play-outline::before {
+ content: "\FEA0";
+}
+.mdi-book-plus::before {
+ content: "\F5DB";
+}
+.mdi-book-plus-multiple::before {
+ content: "\FA94";
+}
+.mdi-book-remove::before {
+ content: "\FA96";
+}
+.mdi-book-remove-multiple::before {
+ content: "\FA95";
+}
+.mdi-book-search::before {
+ content: "\FEA1";
+}
+.mdi-book-search-outline::before {
+ content: "\FEA2";
+}
+.mdi-book-variant::before {
+ content: "\F0BF";
+}
+.mdi-book-variant-multiple::before {
+ content: "\F0BC";
+}
+.mdi-bookmark::before {
+ content: "\F0C0";
+}
+.mdi-bookmark-check::before {
+ content: "\F0C1";
+}
+.mdi-bookmark-check-outline::before {
+ content: "\F03A6";
+}
+.mdi-bookmark-minus::before {
+ content: "\F9CB";
+}
+.mdi-bookmark-minus-outline::before {
+ content: "\F9CC";
+}
+.mdi-bookmark-multiple::before {
+ content: "\FDF8";
+}
+.mdi-bookmark-multiple-outline::before {
+ content: "\FDF9";
+}
+.mdi-bookmark-music::before {
+ content: "\F0C2";
+}
+.mdi-bookmark-music-outline::before {
+ content: "\F03A4";
+}
+.mdi-bookmark-off::before {
+ content: "\F9CD";
+}
+.mdi-bookmark-off-outline::before {
+ content: "\F9CE";
+}
+.mdi-bookmark-outline::before {
+ content: "\F0C3";
+}
+.mdi-bookmark-plus::before {
+ content: "\F0C5";
+}
+.mdi-bookmark-plus-outline::before {
+ content: "\F0C4";
+}
+.mdi-bookmark-remove::before {
+ content: "\F0C6";
+}
+.mdi-bookmark-remove-outline::before {
+ content: "\F03A5";
+}
+.mdi-bookshelf::before {
+ content: "\F028A";
+}
+.mdi-boom-gate::before {
+ content: "\FEA3";
+}
+.mdi-boom-gate-alert::before {
+ content: "\FEA4";
+}
+.mdi-boom-gate-alert-outline::before {
+ content: "\FEA5";
+}
+.mdi-boom-gate-down::before {
+ content: "\FEA6";
+}
+.mdi-boom-gate-down-outline::before {
+ content: "\FEA7";
+}
+.mdi-boom-gate-outline::before {
+ content: "\FEA8";
+}
+.mdi-boom-gate-up::before {
+ content: "\FEA9";
+}
+.mdi-boom-gate-up-outline::before {
+ content: "\FEAA";
+}
+.mdi-boombox::before {
+ content: "\F5DC";
+}
+.mdi-boomerang::before {
+ content: "\F00FA";
+}
+.mdi-bootstrap::before {
+ content: "\F6C5";
+}
+.mdi-border-all::before {
+ content: "\F0C7";
+}
+.mdi-border-all-variant::before {
+ content: "\F8A0";
+}
+.mdi-border-bottom::before {
+ content: "\F0C8";
+}
+.mdi-border-bottom-variant::before {
+ content: "\F8A1";
+}
+.mdi-border-color::before {
+ content: "\F0C9";
+}
+.mdi-border-horizontal::before {
+ content: "\F0CA";
+}
+.mdi-border-inside::before {
+ content: "\F0CB";
+}
+.mdi-border-left::before {
+ content: "\F0CC";
+}
+.mdi-border-left-variant::before {
+ content: "\F8A2";
+}
+.mdi-border-none::before {
+ content: "\F0CD";
+}
+.mdi-border-none-variant::before {
+ content: "\F8A3";
+}
+.mdi-border-outside::before {
+ content: "\F0CE";
+}
+.mdi-border-right::before {
+ content: "\F0CF";
+}
+.mdi-border-right-variant::before {
+ content: "\F8A4";
+}
+.mdi-border-style::before {
+ content: "\F0D0";
+}
+.mdi-border-top::before {
+ content: "\F0D1";
+}
+.mdi-border-top-variant::before {
+ content: "\F8A5";
+}
+.mdi-border-vertical::before {
+ content: "\F0D2";
+}
+.mdi-bottle-soda::before {
+ content: "\F009B";
+}
+.mdi-bottle-soda-classic::before {
+ content: "\F009C";
+}
+.mdi-bottle-soda-classic-outline::before {
+ content: "\F038E";
+}
+.mdi-bottle-soda-outline::before {
+ content: "\F009D";
+}
+.mdi-bottle-tonic::before {
+ content: "\F0159";
+}
+.mdi-bottle-tonic-outline::before {
+ content: "\F015A";
+}
+.mdi-bottle-tonic-plus::before {
+ content: "\F015B";
+}
+.mdi-bottle-tonic-plus-outline::before {
+ content: "\F015C";
+}
+.mdi-bottle-tonic-skull::before {
+ content: "\F015D";
+}
+.mdi-bottle-tonic-skull-outline::before {
+ content: "\F015E";
+}
+.mdi-bottle-wine::before {
+ content: "\F853";
+}
+.mdi-bottle-wine-outline::before {
+ content: "\F033B";
+}
+.mdi-bow-tie::before {
+ content: "\F677";
+}
+.mdi-bowl::before {
+ content: "\F617";
+}
+.mdi-bowling::before {
+ content: "\F0D3";
+}
+.mdi-box::before {
+ content: "\F0D4";
+}
+.mdi-box-cutter::before {
+ content: "\F0D5";
+}
+.mdi-box-shadow::before {
+ content: "\F637";
+}
+.mdi-boxing-glove::before {
+ content: "\FB41";
+}
+.mdi-braille::before {
+ content: "\F9CF";
+}
+.mdi-brain::before {
+ content: "\F9D0";
+}
+.mdi-bread-slice::before {
+ content: "\FCCA";
+}
+.mdi-bread-slice-outline::before {
+ content: "\FCCB";
+}
+.mdi-bridge::before {
+ content: "\F618";
+}
+.mdi-briefcase::before {
+ content: "\F0D6";
+}
+.mdi-briefcase-account::before {
+ content: "\FCCC";
+}
+.mdi-briefcase-account-outline::before {
+ content: "\FCCD";
+}
+.mdi-briefcase-check::before {
+ content: "\F0D7";
+}
+.mdi-briefcase-check-outline::before {
+ content: "\F0349";
+}
+.mdi-briefcase-clock::before {
+ content: "\F00FB";
+}
+.mdi-briefcase-clock-outline::before {
+ content: "\F00FC";
+}
+.mdi-briefcase-download::before {
+ content: "\F0D8";
+}
+.mdi-briefcase-download-outline::before {
+ content: "\FC19";
+}
+.mdi-briefcase-edit::before {
+ content: "\FA97";
+}
+.mdi-briefcase-edit-outline::before {
+ content: "\FC1A";
+}
+.mdi-briefcase-minus::before {
+ content: "\FA29";
+}
+.mdi-briefcase-minus-outline::before {
+ content: "\FC1B";
+}
+.mdi-briefcase-outline::before {
+ content: "\F813";
+}
+.mdi-briefcase-plus::before {
+ content: "\FA2A";
+}
+.mdi-briefcase-plus-outline::before {
+ content: "\FC1C";
+}
+.mdi-briefcase-remove::before {
+ content: "\FA2B";
+}
+.mdi-briefcase-remove-outline::before {
+ content: "\FC1D";
+}
+.mdi-briefcase-search::before {
+ content: "\FA2C";
+}
+.mdi-briefcase-search-outline::before {
+ content: "\FC1E";
+}
+.mdi-briefcase-upload::before {
+ content: "\F0D9";
+}
+.mdi-briefcase-upload-outline::before {
+ content: "\FC1F";
+}
+.mdi-brightness-1::before {
+ content: "\F0DA";
+}
+.mdi-brightness-2::before {
+ content: "\F0DB";
+}
+.mdi-brightness-3::before {
+ content: "\F0DC";
+}
+.mdi-brightness-4::before {
+ content: "\F0DD";
+}
+.mdi-brightness-5::before {
+ content: "\F0DE";
+}
+.mdi-brightness-6::before {
+ content: "\F0DF";
+}
+.mdi-brightness-7::before {
+ content: "\F0E0";
+}
+.mdi-brightness-auto::before {
+ content: "\F0E1";
+}
+.mdi-brightness-percent::before {
+ content: "\FCCE";
+}
+.mdi-broom::before {
+ content: "\F0E2";
+}
+.mdi-brush::before {
+ content: "\F0E3";
+}
+.mdi-buddhism::before {
+ content: "\F94A";
+}
+.mdi-buffer::before {
+ content: "\F619";
+}
+.mdi-bug::before {
+ content: "\F0E4";
+}
+.mdi-bug-check::before {
+ content: "\FA2D";
+}
+.mdi-bug-check-outline::before {
+ content: "\FA2E";
+}
+.mdi-bug-outline::before {
+ content: "\FA2F";
+}
+.mdi-bugle::before {
+ content: "\FD90";
+}
+.mdi-bulldozer::before {
+ content: "\FB07";
+}
+.mdi-bullet::before {
+ content: "\FCCF";
+}
+.mdi-bulletin-board::before {
+ content: "\F0E5";
+}
+.mdi-bullhorn::before {
+ content: "\F0E6";
+}
+.mdi-bullhorn-outline::before {
+ content: "\FB08";
+}
+.mdi-bullseye::before {
+ content: "\F5DD";
+}
+.mdi-bullseye-arrow::before {
+ content: "\F8C8";
+}
+.mdi-bulma::before {
+ content: "\F0312";
+}
+.mdi-bunk-bed::before {
+ content: "\F032D";
+}
+.mdi-bus::before {
+ content: "\F0E7";
+}
+.mdi-bus-alert::before {
+ content: "\FA98";
+}
+.mdi-bus-articulated-end::before {
+ content: "\F79B";
+}
+.mdi-bus-articulated-front::before {
+ content: "\F79C";
+}
+.mdi-bus-clock::before {
+ content: "\F8C9";
+}
+.mdi-bus-double-decker::before {
+ content: "\F79D";
+}
+.mdi-bus-marker::before {
+ content: "\F023D";
+}
+.mdi-bus-multiple::before {
+ content: "\FF5C";
+}
+.mdi-bus-school::before {
+ content: "\F79E";
+}
+.mdi-bus-side::before {
+ content: "\F79F";
+}
+.mdi-bus-stop::before {
+ content: "\F0034";
+}
+.mdi-bus-stop-covered::before {
+ content: "\F0035";
+}
+.mdi-bus-stop-uncovered::before {
+ content: "\F0036";
+}
+.mdi-cached::before {
+ content: "\F0E8";
+}
+.mdi-cactus::before {
+ content: "\FD91";
+}
+.mdi-cake::before {
+ content: "\F0E9";
+}
+.mdi-cake-layered::before {
+ content: "\F0EA";
+}
+.mdi-cake-variant::before {
+ content: "\F0EB";
+}
+.mdi-calculator::before {
+ content: "\F0EC";
+}
+.mdi-calculator-variant::before {
+ content: "\FA99";
+}
+.mdi-calendar::before {
+ content: "\F0ED";
+}
+.mdi-calendar-account::before {
+ content: "\FEF4";
+}
+.mdi-calendar-account-outline::before {
+ content: "\FEF5";
+}
+.mdi-calendar-alert::before {
+ content: "\FA30";
+}
+.mdi-calendar-arrow-left::before {
+ content: "\F015F";
+}
+.mdi-calendar-arrow-right::before {
+ content: "\F0160";
+}
+.mdi-calendar-blank::before {
+ content: "\F0EE";
+}
+.mdi-calendar-blank-multiple::before {
+ content: "\F009E";
+}
+.mdi-calendar-blank-outline::before {
+ content: "\FB42";
+}
+.mdi-calendar-check::before {
+ content: "\F0EF";
+}
+.mdi-calendar-check-outline::before {
+ content: "\FC20";
+}
+.mdi-calendar-clock::before {
+ content: "\F0F0";
+}
+.mdi-calendar-edit::before {
+ content: "\F8A6";
+}
+.mdi-calendar-export::before {
+ content: "\FB09";
+}
+.mdi-calendar-heart::before {
+ content: "\F9D1";
+}
+.mdi-calendar-import::before {
+ content: "\FB0A";
+}
+.mdi-calendar-minus::before {
+ content: "\FD38";
+}
+.mdi-calendar-month::before {
+ content: "\FDFA";
+}
+.mdi-calendar-month-outline::before {
+ content: "\FDFB";
+}
+.mdi-calendar-multiple::before {
+ content: "\F0F1";
+}
+.mdi-calendar-multiple-check::before {
+ content: "\F0F2";
+}
+.mdi-calendar-multiselect::before {
+ content: "\FA31";
+}
+.mdi-calendar-outline::before {
+ content: "\FB43";
+}
+.mdi-calendar-plus::before {
+ content: "\F0F3";
+}
+.mdi-calendar-question::before {
+ content: "\F691";
+}
+.mdi-calendar-range::before {
+ content: "\F678";
+}
+.mdi-calendar-range-outline::before {
+ content: "\FB44";
+}
+.mdi-calendar-remove::before {
+ content: "\F0F4";
+}
+.mdi-calendar-remove-outline::before {
+ content: "\FC21";
+}
+.mdi-calendar-repeat::before {
+ content: "\FEAB";
+}
+.mdi-calendar-repeat-outline::before {
+ content: "\FEAC";
+}
+.mdi-calendar-search::before {
+ content: "\F94B";
+}
+.mdi-calendar-star::before {
+ content: "\F9D2";
+}
+.mdi-calendar-text::before {
+ content: "\F0F5";
+}
+.mdi-calendar-text-outline::before {
+ content: "\FC22";
+}
+.mdi-calendar-today::before {
+ content: "\F0F6";
+}
+.mdi-calendar-week::before {
+ content: "\FA32";
+}
+.mdi-calendar-week-begin::before {
+ content: "\FA33";
+}
+.mdi-calendar-weekend::before {
+ content: "\FEF6";
+}
+.mdi-calendar-weekend-outline::before {
+ content: "\FEF7";
+}
+.mdi-call-made::before {
+ content: "\F0F7";
+}
+.mdi-call-merge::before {
+ content: "\F0F8";
+}
+.mdi-call-missed::before {
+ content: "\F0F9";
+}
+.mdi-call-received::before {
+ content: "\F0FA";
+}
+.mdi-call-split::before {
+ content: "\F0FB";
+}
+.mdi-camcorder::before {
+ content: "\F0FC";
+}
+.mdi-camcorder-box::before {
+ content: "\F0FD";
+}
+.mdi-camcorder-box-off::before {
+ content: "\F0FE";
+}
+.mdi-camcorder-off::before {
+ content: "\F0FF";
+}
+.mdi-camera::before {
+ content: "\F100";
+}
+.mdi-camera-account::before {
+ content: "\F8CA";
+}
+.mdi-camera-burst::before {
+ content: "\F692";
+}
+.mdi-camera-control::before {
+ content: "\FB45";
+}
+.mdi-camera-enhance::before {
+ content: "\F101";
+}
+.mdi-camera-enhance-outline::before {
+ content: "\FB46";
+}
+.mdi-camera-front::before {
+ content: "\F102";
+}
+.mdi-camera-front-variant::before {
+ content: "\F103";
+}
+.mdi-camera-gopro::before {
+ content: "\F7A0";
+}
+.mdi-camera-image::before {
+ content: "\F8CB";
+}
+.mdi-camera-iris::before {
+ content: "\F104";
+}
+.mdi-camera-metering-center::before {
+ content: "\F7A1";
+}
+.mdi-camera-metering-matrix::before {
+ content: "\F7A2";
+}
+.mdi-camera-metering-partial::before {
+ content: "\F7A3";
+}
+.mdi-camera-metering-spot::before {
+ content: "\F7A4";
+}
+.mdi-camera-off::before {
+ content: "\F5DF";
+}
+.mdi-camera-outline::before {
+ content: "\FD39";
+}
+.mdi-camera-party-mode::before {
+ content: "\F105";
+}
+.mdi-camera-plus::before {
+ content: "\FEF8";
+}
+.mdi-camera-plus-outline::before {
+ content: "\FEF9";
+}
+.mdi-camera-rear::before {
+ content: "\F106";
+}
+.mdi-camera-rear-variant::before {
+ content: "\F107";
+}
+.mdi-camera-retake::before {
+ content: "\FDFC";
+}
+.mdi-camera-retake-outline::before {
+ content: "\FDFD";
+}
+.mdi-camera-switch::before {
+ content: "\F108";
+}
+.mdi-camera-timer::before {
+ content: "\F109";
+}
+.mdi-camera-wireless::before {
+ content: "\FD92";
+}
+.mdi-camera-wireless-outline::before {
+ content: "\FD93";
+}
+.mdi-campfire::before {
+ content: "\FEFA";
+}
+.mdi-cancel::before {
+ content: "\F739";
+}
+.mdi-candle::before {
+ content: "\F5E2";
+}
+.mdi-candycane::before {
+ content: "\F10A";
+}
+.mdi-cannabis::before {
+ content: "\F7A5";
+}
+.mdi-caps-lock::before {
+ content: "\FA9A";
+}
+.mdi-car::before {
+ content: "\F10B";
+}
+.mdi-car-2-plus::before {
+ content: "\F0037";
+}
+.mdi-car-3-plus::before {
+ content: "\F0038";
+}
+.mdi-car-back::before {
+ content: "\FDFE";
+}
+.mdi-car-battery::before {
+ content: "\F10C";
+}
+.mdi-car-brake-abs::before {
+ content: "\FC23";
+}
+.mdi-car-brake-alert::before {
+ content: "\FC24";
+}
+.mdi-car-brake-hold::before {
+ content: "\FD3A";
+}
+.mdi-car-brake-parking::before {
+ content: "\FD3B";
+}
+.mdi-car-brake-retarder::before {
+ content: "\F0039";
+}
+.mdi-car-child-seat::before {
+ content: "\FFC3";
+}
+.mdi-car-clutch::before {
+ content: "\F003A";
+}
+.mdi-car-connected::before {
+ content: "\F10D";
+}
+.mdi-car-convertible::before {
+ content: "\F7A6";
+}
+.mdi-car-coolant-level::before {
+ content: "\F003B";
+}
+.mdi-car-cruise-control::before {
+ content: "\FD3C";
+}
+.mdi-car-defrost-front::before {
+ content: "\FD3D";
+}
+.mdi-car-defrost-rear::before {
+ content: "\FD3E";
+}
+.mdi-car-door::before {
+ content: "\FB47";
+}
+.mdi-car-door-lock::before {
+ content: "\F00C8";
+}
+.mdi-car-electric::before {
+ content: "\FB48";
+}
+.mdi-car-esp::before {
+ content: "\FC25";
+}
+.mdi-car-estate::before {
+ content: "\F7A7";
+}
+.mdi-car-hatchback::before {
+ content: "\F7A8";
+}
+.mdi-car-info::before {
+ content: "\F01E9";
+}
+.mdi-car-key::before {
+ content: "\FB49";
+}
+.mdi-car-light-dimmed::before {
+ content: "\FC26";
+}
+.mdi-car-light-fog::before {
+ content: "\FC27";
+}
+.mdi-car-light-high::before {
+ content: "\FC28";
+}
+.mdi-car-limousine::before {
+ content: "\F8CC";
+}
+.mdi-car-multiple::before {
+ content: "\FB4A";
+}
+.mdi-car-off::before {
+ content: "\FDFF";
+}
+.mdi-car-parking-lights::before {
+ content: "\FD3F";
+}
+.mdi-car-pickup::before {
+ content: "\F7A9";
+}
+.mdi-car-seat::before {
+ content: "\FFC4";
+}
+.mdi-car-seat-cooler::before {
+ content: "\FFC5";
+}
+.mdi-car-seat-heater::before {
+ content: "\FFC6";
+}
+.mdi-car-shift-pattern::before {
+ content: "\FF5D";
+}
+.mdi-car-side::before {
+ content: "\F7AA";
+}
+.mdi-car-sports::before {
+ content: "\F7AB";
+}
+.mdi-car-tire-alert::before {
+ content: "\FC29";
+}
+.mdi-car-traction-control::before {
+ content: "\FD40";
+}
+.mdi-car-turbocharger::before {
+ content: "\F003C";
+}
+.mdi-car-wash::before {
+ content: "\F10E";
+}
+.mdi-car-windshield::before {
+ content: "\F003D";
+}
+.mdi-car-windshield-outline::before {
+ content: "\F003E";
+}
+.mdi-caravan::before {
+ content: "\F7AC";
+}
+.mdi-card::before {
+ content: "\FB4B";
+}
+.mdi-card-bulleted::before {
+ content: "\FB4C";
+}
+.mdi-card-bulleted-off::before {
+ content: "\FB4D";
+}
+.mdi-card-bulleted-off-outline::before {
+ content: "\FB4E";
+}
+.mdi-card-bulleted-outline::before {
+ content: "\FB4F";
+}
+.mdi-card-bulleted-settings::before {
+ content: "\FB50";
+}
+.mdi-card-bulleted-settings-outline::before {
+ content: "\FB51";
+}
+.mdi-card-outline::before {
+ content: "\FB52";
+}
+.mdi-card-plus::before {
+ content: "\F022A";
+}
+.mdi-card-plus-outline::before {
+ content: "\F022B";
+}
+.mdi-card-search::before {
+ content: "\F009F";
+}
+.mdi-card-search-outline::before {
+ content: "\F00A0";
+}
+.mdi-card-text::before {
+ content: "\FB53";
+}
+.mdi-card-text-outline::before {
+ content: "\FB54";
+}
+.mdi-cards::before {
+ content: "\F638";
+}
+.mdi-cards-club::before {
+ content: "\F8CD";
+}
+.mdi-cards-diamond::before {
+ content: "\F8CE";
+}
+.mdi-cards-diamond-outline::before {
+ content: "\F003F";
+}
+.mdi-cards-heart::before {
+ content: "\F8CF";
+}
+.mdi-cards-outline::before {
+ content: "\F639";
+}
+.mdi-cards-playing-outline::before {
+ content: "\F63A";
+}
+.mdi-cards-spade::before {
+ content: "\F8D0";
+}
+.mdi-cards-variant::before {
+ content: "\F6C6";
+}
+.mdi-carrot::before {
+ content: "\F10F";
+}
+.mdi-cart::before {
+ content: "\F110";
+}
+.mdi-cart-arrow-down::before {
+ content: "\FD42";
+}
+.mdi-cart-arrow-right::before {
+ content: "\FC2A";
+}
+.mdi-cart-arrow-up::before {
+ content: "\FD43";
+}
+.mdi-cart-minus::before {
+ content: "\FD44";
+}
+.mdi-cart-off::before {
+ content: "\F66B";
+}
+.mdi-cart-outline::before {
+ content: "\F111";
+}
+.mdi-cart-plus::before {
+ content: "\F112";
+}
+.mdi-cart-remove::before {
+ content: "\FD45";
+}
+.mdi-case-sensitive-alt::before {
+ content: "\F113";
+}
+.mdi-cash::before {
+ content: "\F114";
+}
+.mdi-cash-100::before {
+ content: "\F115";
+}
+.mdi-cash-marker::before {
+ content: "\FD94";
+}
+.mdi-cash-minus::before {
+ content: "\F028B";
+}
+.mdi-cash-multiple::before {
+ content: "\F116";
+}
+.mdi-cash-plus::before {
+ content: "\F028C";
+}
+.mdi-cash-refund::before {
+ content: "\FA9B";
+}
+.mdi-cash-register::before {
+ content: "\FCD0";
+}
+.mdi-cash-remove::before {
+ content: "\F028D";
+}
+.mdi-cash-usd::before {
+ content: "\F01A1";
+}
+.mdi-cash-usd-outline::before {
+ content: "\F117";
+}
+.mdi-cassette::before {
+ content: "\F9D3";
+}
+.mdi-cast::before {
+ content: "\F118";
+}
+.mdi-cast-audio::before {
+ content: "\F0040";
+}
+.mdi-cast-connected::before {
+ content: "\F119";
+}
+.mdi-cast-education::before {
+ content: "\FE6D";
+}
+.mdi-cast-off::before {
+ content: "\F789";
+}
+.mdi-castle::before {
+ content: "\F11A";
+}
+.mdi-cat::before {
+ content: "\F11B";
+}
+.mdi-cctv::before {
+ content: "\F7AD";
+}
+.mdi-ceiling-light::before {
+ content: "\F768";
+}
+.mdi-cellphone::before {
+ content: "\F11C";
+}
+.mdi-cellphone-android::before {
+ content: "\F11D";
+}
+.mdi-cellphone-arrow-down::before {
+ content: "\F9D4";
+}
+.mdi-cellphone-basic::before {
+ content: "\F11E";
+}
+.mdi-cellphone-dock::before {
+ content: "\F11F";
+}
+.mdi-cellphone-erase::before {
+ content: "\F94C";
+}
+.mdi-cellphone-information::before {
+ content: "\FF5E";
+}
+.mdi-cellphone-iphone::before {
+ content: "\F120";
+}
+.mdi-cellphone-key::before {
+ content: "\F94D";
+}
+.mdi-cellphone-link::before {
+ content: "\F121";
+}
+.mdi-cellphone-link-off::before {
+ content: "\F122";
+}
+.mdi-cellphone-lock::before {
+ content: "\F94E";
+}
+.mdi-cellphone-message::before {
+ content: "\F8D2";
+}
+.mdi-cellphone-message-off::before {
+ content: "\F00FD";
+}
+.mdi-cellphone-nfc::before {
+ content: "\FEAD";
+}
+.mdi-cellphone-nfc-off::before {
+ content: "\F0303";
+}
+.mdi-cellphone-off::before {
+ content: "\F94F";
+}
+.mdi-cellphone-play::before {
+ content: "\F0041";
+}
+.mdi-cellphone-screenshot::before {
+ content: "\FA34";
+}
+.mdi-cellphone-settings::before {
+ content: "\F123";
+}
+.mdi-cellphone-settings-variant::before {
+ content: "\F950";
+}
+.mdi-cellphone-sound::before {
+ content: "\F951";
+}
+.mdi-cellphone-text::before {
+ content: "\F8D1";
+}
+.mdi-cellphone-wireless::before {
+ content: "\F814";
+}
+.mdi-celtic-cross::before {
+ content: "\FCD1";
+}
+.mdi-centos::before {
+ content: "\F0145";
+}
+.mdi-certificate::before {
+ content: "\F124";
+}
+.mdi-certificate-outline::before {
+ content: "\F01B3";
+}
+.mdi-chair-rolling::before {
+ content: "\FFBA";
+}
+.mdi-chair-school::before {
+ content: "\F125";
+}
+.mdi-charity::before {
+ content: "\FC2B";
+}
+.mdi-chart-arc::before {
+ content: "\F126";
+}
+.mdi-chart-areaspline::before {
+ content: "\F127";
+}
+.mdi-chart-areaspline-variant::before {
+ content: "\FEAE";
+}
+.mdi-chart-bar::before {
+ content: "\F128";
+}
+.mdi-chart-bar-stacked::before {
+ content: "\F769";
+}
+.mdi-chart-bell-curve::before {
+ content: "\FC2C";
+}
+.mdi-chart-bell-curve-cumulative::before {
+ content: "\FFC7";
+}
+.mdi-chart-bubble::before {
+ content: "\F5E3";
+}
+.mdi-chart-donut::before {
+ content: "\F7AE";
+}
+.mdi-chart-donut-variant::before {
+ content: "\F7AF";
+}
+.mdi-chart-gantt::before {
+ content: "\F66C";
+}
+.mdi-chart-histogram::before {
+ content: "\F129";
+}
+.mdi-chart-line::before {
+ content: "\F12A";
+}
+.mdi-chart-line-stacked::before {
+ content: "\F76A";
+}
+.mdi-chart-line-variant::before {
+ content: "\F7B0";
+}
+.mdi-chart-multiline::before {
+ content: "\F8D3";
+}
+.mdi-chart-multiple::before {
+ content: "\F023E";
+}
+.mdi-chart-pie::before {
+ content: "\F12B";
+}
+.mdi-chart-ppf::before {
+ content: "\F03AB";
+}
+.mdi-chart-scatter-plot::before {
+ content: "\FEAF";
+}
+.mdi-chart-scatter-plot-hexbin::before {
+ content: "\F66D";
+}
+.mdi-chart-snakey::before {
+ content: "\F020A";
+}
+.mdi-chart-snakey-variant::before {
+ content: "\F020B";
+}
+.mdi-chart-timeline::before {
+ content: "\F66E";
+}
+.mdi-chart-timeline-variant::before {
+ content: "\FEB0";
+}
+.mdi-chart-tree::before {
+ content: "\FEB1";
+}
+.mdi-chat::before {
+ content: "\FB55";
+}
+.mdi-chat-alert::before {
+ content: "\FB56";
+}
+.mdi-chat-alert-outline::before {
+ content: "\F02F4";
+}
+.mdi-chat-outline::before {
+ content: "\FEFB";
+}
+.mdi-chat-processing::before {
+ content: "\FB57";
+}
+.mdi-chat-processing-outline::before {
+ content: "\F02F5";
+}
+.mdi-chat-sleep::before {
+ content: "\F02FC";
+}
+.mdi-chat-sleep-outline::before {
+ content: "\F02FD";
+}
+.mdi-check::before {
+ content: "\F12C";
+}
+.mdi-check-all::before {
+ content: "\F12D";
+}
+.mdi-check-bold::before {
+ content: "\FE6E";
+}
+.mdi-check-box-multiple-outline::before {
+ content: "\FC2D";
+}
+.mdi-check-box-outline::before {
+ content: "\FC2E";
+}
+.mdi-check-circle::before {
+ content: "\F5E0";
+}
+.mdi-check-circle-outline::before {
+ content: "\F5E1";
+}
+.mdi-check-decagram::before {
+ content: "\F790";
+}
+.mdi-check-network::before {
+ content: "\FC2F";
+}
+.mdi-check-network-outline::before {
+ content: "\FC30";
+}
+.mdi-check-outline::before {
+ content: "\F854";
+}
+.mdi-check-underline::before {
+ content: "\FE70";
+}
+.mdi-check-underline-circle::before {
+ content: "\FE71";
+}
+.mdi-check-underline-circle-outline::before {
+ content: "\FE72";
+}
+.mdi-checkbook::before {
+ content: "\FA9C";
+}
+.mdi-checkbox-blank::before {
+ content: "\F12E";
+}
+.mdi-checkbox-blank-circle::before {
+ content: "\F12F";
+}
+.mdi-checkbox-blank-circle-outline::before {
+ content: "\F130";
+}
+.mdi-checkbox-blank-off::before {
+ content: "\F0317";
+}
+.mdi-checkbox-blank-off-outline::before {
+ content: "\F0318";
+}
+.mdi-checkbox-blank-outline::before {
+ content: "\F131";
+}
+.mdi-checkbox-intermediate::before {
+ content: "\F855";
+}
+.mdi-checkbox-marked::before {
+ content: "\F132";
+}
+.mdi-checkbox-marked-circle::before {
+ content: "\F133";
+}
+.mdi-checkbox-marked-circle-outline::before {
+ content: "\F134";
+}
+.mdi-checkbox-marked-outline::before {
+ content: "\F135";
+}
+.mdi-checkbox-multiple-blank::before {
+ content: "\F136";
+}
+.mdi-checkbox-multiple-blank-circle::before {
+ content: "\F63B";
+}
+.mdi-checkbox-multiple-blank-circle-outline::before {
+ content: "\F63C";
+}
+.mdi-checkbox-multiple-blank-outline::before {
+ content: "\F137";
+}
+.mdi-checkbox-multiple-marked::before {
+ content: "\F138";
+}
+.mdi-checkbox-multiple-marked-circle::before {
+ content: "\F63D";
+}
+.mdi-checkbox-multiple-marked-circle-outline::before {
+ content: "\F63E";
+}
+.mdi-checkbox-multiple-marked-outline::before {
+ content: "\F139";
+}
+.mdi-checkerboard::before {
+ content: "\F13A";
+}
+.mdi-checkerboard-minus::before {
+ content: "\F022D";
+}
+.mdi-checkerboard-plus::before {
+ content: "\F022C";
+}
+.mdi-checkerboard-remove::before {
+ content: "\F022E";
+}
+.mdi-cheese::before {
+ content: "\F02E4";
+}
+.mdi-chef-hat::before {
+ content: "\FB58";
+}
+.mdi-chemical-weapon::before {
+ content: "\F13B";
+}
+.mdi-chess-bishop::before {
+ content: "\F85B";
+}
+.mdi-chess-king::before {
+ content: "\F856";
+}
+.mdi-chess-knight::before {
+ content: "\F857";
+}
+.mdi-chess-pawn::before {
+ content: "\F858";
+}
+.mdi-chess-queen::before {
+ content: "\F859";
+}
+.mdi-chess-rook::before {
+ content: "\F85A";
+}
+.mdi-chevron-double-down::before {
+ content: "\F13C";
+}
+.mdi-chevron-double-left::before {
+ content: "\F13D";
+}
+.mdi-chevron-double-right::before {
+ content: "\F13E";
+}
+.mdi-chevron-double-up::before {
+ content: "\F13F";
+}
+.mdi-chevron-down::before {
+ content: "\F140";
+}
+.mdi-chevron-down-box::before {
+ content: "\F9D5";
+}
+.mdi-chevron-down-box-outline::before {
+ content: "\F9D6";
+}
+.mdi-chevron-down-circle::before {
+ content: "\FB0B";
+}
+.mdi-chevron-down-circle-outline::before {
+ content: "\FB0C";
+}
+.mdi-chevron-left::before {
+ content: "\F141";
+}
+.mdi-chevron-left-box::before {
+ content: "\F9D7";
+}
+.mdi-chevron-left-box-outline::before {
+ content: "\F9D8";
+}
+.mdi-chevron-left-circle::before {
+ content: "\FB0D";
+}
+.mdi-chevron-left-circle-outline::before {
+ content: "\FB0E";
+}
+.mdi-chevron-right::before {
+ content: "\F142";
+}
+.mdi-chevron-right-box::before {
+ content: "\F9D9";
+}
+.mdi-chevron-right-box-outline::before {
+ content: "\F9DA";
+}
+.mdi-chevron-right-circle::before {
+ content: "\FB0F";
+}
+.mdi-chevron-right-circle-outline::before {
+ content: "\FB10";
+}
+.mdi-chevron-triple-down::before {
+ content: "\FD95";
+}
+.mdi-chevron-triple-left::before {
+ content: "\FD96";
+}
+.mdi-chevron-triple-right::before {
+ content: "\FD97";
+}
+.mdi-chevron-triple-up::before {
+ content: "\FD98";
+}
+.mdi-chevron-up::before {
+ content: "\F143";
+}
+.mdi-chevron-up-box::before {
+ content: "\F9DB";
+}
+.mdi-chevron-up-box-outline::before {
+ content: "\F9DC";
+}
+.mdi-chevron-up-circle::before {
+ content: "\FB11";
+}
+.mdi-chevron-up-circle-outline::before {
+ content: "\FB12";
+}
+.mdi-chili-hot::before {
+ content: "\F7B1";
+}
+.mdi-chili-medium::before {
+ content: "\F7B2";
+}
+.mdi-chili-mild::before {
+ content: "\F7B3";
+}
+.mdi-chip::before {
+ content: "\F61A";
+}
+.mdi-christianity::before {
+ content: "\F952";
+}
+.mdi-christianity-outline::before {
+ content: "\FCD2";
+}
+.mdi-church::before {
+ content: "\F144";
+}
+.mdi-cigar::before {
+ content: "\F01B4";
+}
+.mdi-circle::before {
+ content: "\F764";
+}
+.mdi-circle-double::before {
+ content: "\FEB2";
+}
+.mdi-circle-edit-outline::before {
+ content: "\F8D4";
+}
+.mdi-circle-expand::before {
+ content: "\FEB3";
+}
+.mdi-circle-medium::before {
+ content: "\F9DD";
+}
+.mdi-circle-off-outline::before {
+ content: "\F00FE";
+}
+.mdi-circle-outline::before {
+ content: "\F765";
+}
+.mdi-circle-slice-1::before {
+ content: "\FA9D";
+}
+.mdi-circle-slice-2::before {
+ content: "\FA9E";
+}
+.mdi-circle-slice-3::before {
+ content: "\FA9F";
+}
+.mdi-circle-slice-4::before {
+ content: "\FAA0";
+}
+.mdi-circle-slice-5::before {
+ content: "\FAA1";
+}
+.mdi-circle-slice-6::before {
+ content: "\FAA2";
+}
+.mdi-circle-slice-7::before {
+ content: "\FAA3";
+}
+.mdi-circle-slice-8::before {
+ content: "\FAA4";
+}
+.mdi-circle-small::before {
+ content: "\F9DE";
+}
+.mdi-circular-saw::before {
+ content: "\FE73";
+}
+.mdi-cisco-webex::before {
+ content: "\F145";
+}
+.mdi-city::before {
+ content: "\F146";
+}
+.mdi-city-variant::before {
+ content: "\FA35";
+}
+.mdi-city-variant-outline::before {
+ content: "\FA36";
+}
+.mdi-clipboard::before {
+ content: "\F147";
+}
+.mdi-clipboard-account::before {
+ content: "\F148";
+}
+.mdi-clipboard-account-outline::before {
+ content: "\FC31";
+}
+.mdi-clipboard-alert::before {
+ content: "\F149";
+}
+.mdi-clipboard-alert-outline::before {
+ content: "\FCD3";
+}
+.mdi-clipboard-arrow-down::before {
+ content: "\F14A";
+}
+.mdi-clipboard-arrow-down-outline::before {
+ content: "\FC32";
+}
+.mdi-clipboard-arrow-left::before {
+ content: "\F14B";
+}
+.mdi-clipboard-arrow-left-outline::before {
+ content: "\FCD4";
+}
+.mdi-clipboard-arrow-right::before {
+ content: "\FCD5";
+}
+.mdi-clipboard-arrow-right-outline::before {
+ content: "\FCD6";
+}
+.mdi-clipboard-arrow-up::before {
+ content: "\FC33";
+}
+.mdi-clipboard-arrow-up-outline::before {
+ content: "\FC34";
+}
+.mdi-clipboard-check::before {
+ content: "\F14C";
+}
+.mdi-clipboard-check-multiple::before {
+ content: "\F028E";
+}
+.mdi-clipboard-check-multiple-outline::before {
+ content: "\F028F";
+}
+.mdi-clipboard-check-outline::before {
+ content: "\F8A7";
+}
+.mdi-clipboard-file::before {
+ content: "\F0290";
+}
+.mdi-clipboard-file-outline::before {
+ content: "\F0291";
+}
+.mdi-clipboard-flow::before {
+ content: "\F6C7";
+}
+.mdi-clipboard-flow-outline::before {
+ content: "\F0142";
+}
+.mdi-clipboard-list::before {
+ content: "\F00FF";
+}
+.mdi-clipboard-list-outline::before {
+ content: "\F0100";
+}
+.mdi-clipboard-multiple::before {
+ content: "\F0292";
+}
+.mdi-clipboard-multiple-outline::before {
+ content: "\F0293";
+}
+.mdi-clipboard-outline::before {
+ content: "\F14D";
+}
+.mdi-clipboard-play::before {
+ content: "\FC35";
+}
+.mdi-clipboard-play-multiple::before {
+ content: "\F0294";
+}
+.mdi-clipboard-play-multiple-outline::before {
+ content: "\F0295";
+}
+.mdi-clipboard-play-outline::before {
+ content: "\FC36";
+}
+.mdi-clipboard-plus::before {
+ content: "\F750";
+}
+.mdi-clipboard-plus-outline::before {
+ content: "\F034A";
+}
+.mdi-clipboard-pulse::before {
+ content: "\F85C";
+}
+.mdi-clipboard-pulse-outline::before {
+ content: "\F85D";
+}
+.mdi-clipboard-text::before {
+ content: "\F14E";
+}
+.mdi-clipboard-text-multiple::before {
+ content: "\F0296";
+}
+.mdi-clipboard-text-multiple-outline::before {
+ content: "\F0297";
+}
+.mdi-clipboard-text-outline::before {
+ content: "\FA37";
+}
+.mdi-clipboard-text-play::before {
+ content: "\FC37";
+}
+.mdi-clipboard-text-play-outline::before {
+ content: "\FC38";
+}
+.mdi-clippy::before {
+ content: "\F14F";
+}
+.mdi-clock::before {
+ content: "\F953";
+}
+.mdi-clock-alert::before {
+ content: "\F954";
+}
+.mdi-clock-alert-outline::before {
+ content: "\F5CE";
+}
+.mdi-clock-check::before {
+ content: "\FFC8";
+}
+.mdi-clock-check-outline::before {
+ content: "\FFC9";
+}
+.mdi-clock-digital::before {
+ content: "\FEB4";
+}
+.mdi-clock-end::before {
+ content: "\F151";
+}
+.mdi-clock-fast::before {
+ content: "\F152";
+}
+.mdi-clock-in::before {
+ content: "\F153";
+}
+.mdi-clock-out::before {
+ content: "\F154";
+}
+.mdi-clock-outline::before {
+ content: "\F150";
+}
+.mdi-clock-start::before {
+ content: "\F155";
+}
+.mdi-close::before {
+ content: "\F156";
+}
+.mdi-close-box::before {
+ content: "\F157";
+}
+.mdi-close-box-multiple::before {
+ content: "\FC39";
+}
+.mdi-close-box-multiple-outline::before {
+ content: "\FC3A";
+}
+.mdi-close-box-outline::before {
+ content: "\F158";
+}
+.mdi-close-circle::before {
+ content: "\F159";
+}
+.mdi-close-circle-outline::before {
+ content: "\F15A";
+}
+.mdi-close-network::before {
+ content: "\F15B";
+}
+.mdi-close-network-outline::before {
+ content: "\FC3B";
+}
+.mdi-close-octagon::before {
+ content: "\F15C";
+}
+.mdi-close-octagon-outline::before {
+ content: "\F15D";
+}
+.mdi-close-outline::before {
+ content: "\F6C8";
+}
+.mdi-closed-caption::before {
+ content: "\F15E";
+}
+.mdi-closed-caption-outline::before {
+ content: "\FD99";
+}
+.mdi-cloud::before {
+ content: "\F15F";
+}
+.mdi-cloud-alert::before {
+ content: "\F9DF";
+}
+.mdi-cloud-braces::before {
+ content: "\F7B4";
+}
+.mdi-cloud-check::before {
+ content: "\F160";
+}
+.mdi-cloud-check-outline::before {
+ content: "\F02F7";
+}
+.mdi-cloud-circle::before {
+ content: "\F161";
+}
+.mdi-cloud-download::before {
+ content: "\F162";
+}
+.mdi-cloud-download-outline::before {
+ content: "\FB59";
+}
+.mdi-cloud-lock::before {
+ content: "\F021C";
+}
+.mdi-cloud-lock-outline::before {
+ content: "\F021D";
+}
+.mdi-cloud-off-outline::before {
+ content: "\F164";
+}
+.mdi-cloud-outline::before {
+ content: "\F163";
+}
+.mdi-cloud-print::before {
+ content: "\F165";
+}
+.mdi-cloud-print-outline::before {
+ content: "\F166";
+}
+.mdi-cloud-question::before {
+ content: "\FA38";
+}
+.mdi-cloud-search::before {
+ content: "\F955";
+}
+.mdi-cloud-search-outline::before {
+ content: "\F956";
+}
+.mdi-cloud-sync::before {
+ content: "\F63F";
+}
+.mdi-cloud-sync-outline::before {
+ content: "\F0301";
+}
+.mdi-cloud-tags::before {
+ content: "\F7B5";
+}
+.mdi-cloud-upload::before {
+ content: "\F167";
+}
+.mdi-cloud-upload-outline::before {
+ content: "\FB5A";
+}
+.mdi-clover::before {
+ content: "\F815";
+}
+.mdi-coach-lamp::before {
+ content: "\F0042";
+}
+.mdi-coat-rack::before {
+ content: "\F00C9";
+}
+.mdi-code-array::before {
+ content: "\F168";
+}
+.mdi-code-braces::before {
+ content: "\F169";
+}
+.mdi-code-braces-box::before {
+ content: "\F0101";
+}
+.mdi-code-brackets::before {
+ content: "\F16A";
+}
+.mdi-code-equal::before {
+ content: "\F16B";
+}
+.mdi-code-greater-than::before {
+ content: "\F16C";
+}
+.mdi-code-greater-than-or-equal::before {
+ content: "\F16D";
+}
+.mdi-code-less-than::before {
+ content: "\F16E";
+}
+.mdi-code-less-than-or-equal::before {
+ content: "\F16F";
+}
+.mdi-code-not-equal::before {
+ content: "\F170";
+}
+.mdi-code-not-equal-variant::before {
+ content: "\F171";
+}
+.mdi-code-parentheses::before {
+ content: "\F172";
+}
+.mdi-code-parentheses-box::before {
+ content: "\F0102";
+}
+.mdi-code-string::before {
+ content: "\F173";
+}
+.mdi-code-tags::before {
+ content: "\F174";
+}
+.mdi-code-tags-check::before {
+ content: "\F693";
+}
+.mdi-codepen::before {
+ content: "\F175";
+}
+.mdi-coffee::before {
+ content: "\F176";
+}
+.mdi-coffee-maker::before {
+ content: "\F00CA";
+}
+.mdi-coffee-off::before {
+ content: "\FFCA";
+}
+.mdi-coffee-off-outline::before {
+ content: "\FFCB";
+}
+.mdi-coffee-outline::before {
+ content: "\F6C9";
+}
+.mdi-coffee-to-go::before {
+ content: "\F177";
+}
+.mdi-coffee-to-go-outline::before {
+ content: "\F0339";
+}
+.mdi-coffin::before {
+ content: "\FB5B";
+}
+.mdi-cog-clockwise::before {
+ content: "\F0208";
+}
+.mdi-cog-counterclockwise::before {
+ content: "\F0209";
+}
+.mdi-cogs::before {
+ content: "\F8D5";
+}
+.mdi-coin::before {
+ content: "\F0196";
+}
+.mdi-coin-outline::before {
+ content: "\F178";
+}
+.mdi-coins::before {
+ content: "\F694";
+}
+.mdi-collage::before {
+ content: "\F640";
+}
+.mdi-collapse-all::before {
+ content: "\FAA5";
+}
+.mdi-collapse-all-outline::before {
+ content: "\FAA6";
+}
+.mdi-color-helper::before {
+ content: "\F179";
+}
+.mdi-comma::before {
+ content: "\FE74";
+}
+.mdi-comma-box::before {
+ content: "\FE75";
+}
+.mdi-comma-box-outline::before {
+ content: "\FE76";
+}
+.mdi-comma-circle::before {
+ content: "\FE77";
+}
+.mdi-comma-circle-outline::before {
+ content: "\FE78";
+}
+.mdi-comment::before {
+ content: "\F17A";
+}
+.mdi-comment-account::before {
+ content: "\F17B";
+}
+.mdi-comment-account-outline::before {
+ content: "\F17C";
+}
+.mdi-comment-alert::before {
+ content: "\F17D";
+}
+.mdi-comment-alert-outline::before {
+ content: "\F17E";
+}
+.mdi-comment-arrow-left::before {
+ content: "\F9E0";
+}
+.mdi-comment-arrow-left-outline::before {
+ content: "\F9E1";
+}
+.mdi-comment-arrow-right::before {
+ content: "\F9E2";
+}
+.mdi-comment-arrow-right-outline::before {
+ content: "\F9E3";
+}
+.mdi-comment-check::before {
+ content: "\F17F";
+}
+.mdi-comment-check-outline::before {
+ content: "\F180";
+}
+.mdi-comment-edit::before {
+ content: "\F01EA";
+}
+.mdi-comment-edit-outline::before {
+ content: "\F02EF";
+}
+.mdi-comment-eye::before {
+ content: "\FA39";
+}
+.mdi-comment-eye-outline::before {
+ content: "\FA3A";
+}
+.mdi-comment-multiple::before {
+ content: "\F85E";
+}
+.mdi-comment-multiple-outline::before {
+ content: "\F181";
+}
+.mdi-comment-outline::before {
+ content: "\F182";
+}
+.mdi-comment-plus::before {
+ content: "\F9E4";
+}
+.mdi-comment-plus-outline::before {
+ content: "\F183";
+}
+.mdi-comment-processing::before {
+ content: "\F184";
+}
+.mdi-comment-processing-outline::before {
+ content: "\F185";
+}
+.mdi-comment-question::before {
+ content: "\F816";
+}
+.mdi-comment-question-outline::before {
+ content: "\F186";
+}
+.mdi-comment-quote::before {
+ content: "\F0043";
+}
+.mdi-comment-quote-outline::before {
+ content: "\F0044";
+}
+.mdi-comment-remove::before {
+ content: "\F5DE";
+}
+.mdi-comment-remove-outline::before {
+ content: "\F187";
+}
+.mdi-comment-search::before {
+ content: "\FA3B";
+}
+.mdi-comment-search-outline::before {
+ content: "\FA3C";
+}
+.mdi-comment-text::before {
+ content: "\F188";
+}
+.mdi-comment-text-multiple::before {
+ content: "\F85F";
+}
+.mdi-comment-text-multiple-outline::before {
+ content: "\F860";
+}
+.mdi-comment-text-outline::before {
+ content: "\F189";
+}
+.mdi-compare::before {
+ content: "\F18A";
+}
+.mdi-compass::before {
+ content: "\F18B";
+}
+.mdi-compass-off::before {
+ content: "\FB5C";
+}
+.mdi-compass-off-outline::before {
+ content: "\FB5D";
+}
+.mdi-compass-outline::before {
+ content: "\F18C";
+}
+.mdi-compass-rose::before {
+ content: "\F03AD";
+}
+.mdi-concourse-ci::before {
+ content: "\F00CB";
+}
+.mdi-console::before {
+ content: "\F18D";
+}
+.mdi-console-line::before {
+ content: "\F7B6";
+}
+.mdi-console-network::before {
+ content: "\F8A8";
+}
+.mdi-console-network-outline::before {
+ content: "\FC3C";
+}
+.mdi-consolidate::before {
+ content: "\F0103";
+}
+.mdi-contact-mail::before {
+ content: "\F18E";
+}
+.mdi-contact-mail-outline::before {
+ content: "\FEB5";
+}
+.mdi-contact-phone::before {
+ content: "\FEB6";
+}
+.mdi-contact-phone-outline::before {
+ content: "\FEB7";
+}
+.mdi-contactless-payment::before {
+ content: "\FD46";
+}
+.mdi-contacts::before {
+ content: "\F6CA";
+}
+.mdi-contain::before {
+ content: "\FA3D";
+}
+.mdi-contain-end::before {
+ content: "\FA3E";
+}
+.mdi-contain-start::before {
+ content: "\FA3F";
+}
+.mdi-content-copy::before {
+ content: "\F18F";
+}
+.mdi-content-cut::before {
+ content: "\F190";
+}
+.mdi-content-duplicate::before {
+ content: "\F191";
+}
+.mdi-content-paste::before {
+ content: "\F192";
+}
+.mdi-content-save::before {
+ content: "\F193";
+}
+.mdi-content-save-alert::before {
+ content: "\FF5F";
+}
+.mdi-content-save-alert-outline::before {
+ content: "\FF60";
+}
+.mdi-content-save-all::before {
+ content: "\F194";
+}
+.mdi-content-save-all-outline::before {
+ content: "\FF61";
+}
+.mdi-content-save-edit::before {
+ content: "\FCD7";
+}
+.mdi-content-save-edit-outline::before {
+ content: "\FCD8";
+}
+.mdi-content-save-move::before {
+ content: "\FE79";
+}
+.mdi-content-save-move-outline::before {
+ content: "\FE7A";
+}
+.mdi-content-save-outline::before {
+ content: "\F817";
+}
+.mdi-content-save-settings::before {
+ content: "\F61B";
+}
+.mdi-content-save-settings-outline::before {
+ content: "\FB13";
+}
+.mdi-contrast::before {
+ content: "\F195";
+}
+.mdi-contrast-box::before {
+ content: "\F196";
+}
+.mdi-contrast-circle::before {
+ content: "\F197";
+}
+.mdi-controller-classic::before {
+ content: "\FB5E";
+}
+.mdi-controller-classic-outline::before {
+ content: "\FB5F";
+}
+.mdi-cookie::before {
+ content: "\F198";
+}
+.mdi-coolant-temperature::before {
+ content: "\F3C8";
+}
+.mdi-copyright::before {
+ content: "\F5E6";
+}
+.mdi-cordova::before {
+ content: "\F957";
+}
+.mdi-corn::before {
+ content: "\F7B7";
+}
+.mdi-counter::before {
+ content: "\F199";
+}
+.mdi-cow::before {
+ content: "\F19A";
+}
+.mdi-cowboy::before {
+ content: "\FEB8";
+}
+.mdi-cpu-32-bit::before {
+ content: "\FEFC";
+}
+.mdi-cpu-64-bit::before {
+ content: "\FEFD";
+}
+.mdi-crane::before {
+ content: "\F861";
+}
+.mdi-creation::before {
+ content: "\F1C9";
+}
+.mdi-creative-commons::before {
+ content: "\FD47";
+}
+.mdi-credit-card::before {
+ content: "\F0010";
+}
+.mdi-credit-card-clock::before {
+ content: "\FEFE";
+}
+.mdi-credit-card-clock-outline::before {
+ content: "\FFBC";
+}
+.mdi-credit-card-marker::before {
+ content: "\F6A7";
+}
+.mdi-credit-card-marker-outline::before {
+ content: "\FD9A";
+}
+.mdi-credit-card-minus::before {
+ content: "\FFCC";
+}
+.mdi-credit-card-minus-outline::before {
+ content: "\FFCD";
+}
+.mdi-credit-card-multiple::before {
+ content: "\F0011";
+}
+.mdi-credit-card-multiple-outline::before {
+ content: "\F19C";
+}
+.mdi-credit-card-off::before {
+ content: "\F0012";
+}
+.mdi-credit-card-off-outline::before {
+ content: "\F5E4";
+}
+.mdi-credit-card-outline::before {
+ content: "\F19B";
+}
+.mdi-credit-card-plus::before {
+ content: "\F0013";
+}
+.mdi-credit-card-plus-outline::before {
+ content: "\F675";
+}
+.mdi-credit-card-refund::before {
+ content: "\F0014";
+}
+.mdi-credit-card-refund-outline::before {
+ content: "\FAA7";
+}
+.mdi-credit-card-remove::before {
+ content: "\FFCE";
+}
+.mdi-credit-card-remove-outline::before {
+ content: "\FFCF";
+}
+.mdi-credit-card-scan::before {
+ content: "\F0015";
+}
+.mdi-credit-card-scan-outline::before {
+ content: "\F19D";
+}
+.mdi-credit-card-settings::before {
+ content: "\F0016";
+}
+.mdi-credit-card-settings-outline::before {
+ content: "\F8D6";
+}
+.mdi-credit-card-wireless::before {
+ content: "\F801";
+}
+.mdi-credit-card-wireless-outline::before {
+ content: "\FD48";
+}
+.mdi-cricket::before {
+ content: "\FD49";
+}
+.mdi-crop::before {
+ content: "\F19E";
+}
+.mdi-crop-free::before {
+ content: "\F19F";
+}
+.mdi-crop-landscape::before {
+ content: "\F1A0";
+}
+.mdi-crop-portrait::before {
+ content: "\F1A1";
+}
+.mdi-crop-rotate::before {
+ content: "\F695";
+}
+.mdi-crop-square::before {
+ content: "\F1A2";
+}
+.mdi-crosshairs::before {
+ content: "\F1A3";
+}
+.mdi-crosshairs-gps::before {
+ content: "\F1A4";
+}
+.mdi-crosshairs-off::before {
+ content: "\FF62";
+}
+.mdi-crosshairs-question::before {
+ content: "\F0161";
+}
+.mdi-crown::before {
+ content: "\F1A5";
+}
+.mdi-crown-outline::before {
+ content: "\F01FB";
+}
+.mdi-cryengine::before {
+ content: "\F958";
+}
+.mdi-crystal-ball::before {
+ content: "\FB14";
+}
+.mdi-cube::before {
+ content: "\F1A6";
+}
+.mdi-cube-outline::before {
+ content: "\F1A7";
+}
+.mdi-cube-scan::before {
+ content: "\FB60";
+}
+.mdi-cube-send::before {
+ content: "\F1A8";
+}
+.mdi-cube-unfolded::before {
+ content: "\F1A9";
+}
+.mdi-cup::before {
+ content: "\F1AA";
+}
+.mdi-cup-off::before {
+ content: "\F5E5";
+}
+.mdi-cup-off-outline::before {
+ content: "\F03A8";
+}
+.mdi-cup-outline::before {
+ content: "\F033A";
+}
+.mdi-cup-water::before {
+ content: "\F1AB";
+}
+.mdi-cupboard::before {
+ content: "\FF63";
+}
+.mdi-cupboard-outline::before {
+ content: "\FF64";
+}
+.mdi-cupcake::before {
+ content: "\F959";
+}
+.mdi-curling::before {
+ content: "\F862";
+}
+.mdi-currency-bdt::before {
+ content: "\F863";
+}
+.mdi-currency-brl::before {
+ content: "\FB61";
+}
+.mdi-currency-btc::before {
+ content: "\F1AC";
+}
+.mdi-currency-cny::before {
+ content: "\F7B9";
+}
+.mdi-currency-eth::before {
+ content: "\F7BA";
+}
+.mdi-currency-eur::before {
+ content: "\F1AD";
+}
+.mdi-currency-eur-off::before {
+ content: "\F0340";
+}
+.mdi-currency-gbp::before {
+ content: "\F1AE";
+}
+.mdi-currency-ils::before {
+ content: "\FC3D";
+}
+.mdi-currency-inr::before {
+ content: "\F1AF";
+}
+.mdi-currency-jpy::before {
+ content: "\F7BB";
+}
+.mdi-currency-krw::before {
+ content: "\F7BC";
+}
+.mdi-currency-kzt::before {
+ content: "\F864";
+}
+.mdi-currency-ngn::before {
+ content: "\F1B0";
+}
+.mdi-currency-php::before {
+ content: "\F9E5";
+}
+.mdi-currency-rial::before {
+ content: "\FEB9";
+}
+.mdi-currency-rub::before {
+ content: "\F1B1";
+}
+.mdi-currency-sign::before {
+ content: "\F7BD";
+}
+.mdi-currency-try::before {
+ content: "\F1B2";
+}
+.mdi-currency-twd::before {
+ content: "\F7BE";
+}
+.mdi-currency-usd::before {
+ content: "\F1B3";
+}
+.mdi-currency-usd-off::before {
+ content: "\F679";
+}
+.mdi-current-ac::before {
+ content: "\F95A";
+}
+.mdi-current-dc::before {
+ content: "\F95B";
+}
+.mdi-cursor-default::before {
+ content: "\F1B4";
+}
+.mdi-cursor-default-click::before {
+ content: "\FCD9";
+}
+.mdi-cursor-default-click-outline::before {
+ content: "\FCDA";
+}
+.mdi-cursor-default-gesture::before {
+ content: "\F0152";
+}
+.mdi-cursor-default-gesture-outline::before {
+ content: "\F0153";
+}
+.mdi-cursor-default-outline::before {
+ content: "\F1B5";
+}
+.mdi-cursor-move::before {
+ content: "\F1B6";
+}
+.mdi-cursor-pointer::before {
+ content: "\F1B7";
+}
+.mdi-cursor-text::before {
+ content: "\F5E7";
+}
+.mdi-database::before {
+ content: "\F1B8";
+}
+.mdi-database-check::before {
+ content: "\FAA8";
+}
+.mdi-database-edit::before {
+ content: "\FB62";
+}
+.mdi-database-export::before {
+ content: "\F95D";
+}
+.mdi-database-import::before {
+ content: "\F95C";
+}
+.mdi-database-lock::before {
+ content: "\FAA9";
+}
+.mdi-database-marker::before {
+ content: "\F0321";
+}
+.mdi-database-minus::before {
+ content: "\F1B9";
+}
+.mdi-database-plus::before {
+ content: "\F1BA";
+}
+.mdi-database-refresh::before {
+ content: "\FCDB";
+}
+.mdi-database-remove::before {
+ content: "\FCDC";
+}
+.mdi-database-search::before {
+ content: "\F865";
+}
+.mdi-database-settings::before {
+ content: "\FCDD";
+}
+.mdi-death-star::before {
+ content: "\F8D7";
+}
+.mdi-death-star-variant::before {
+ content: "\F8D8";
+}
+.mdi-deathly-hallows::before {
+ content: "\FB63";
+}
+.mdi-debian::before {
+ content: "\F8D9";
+}
+.mdi-debug-step-into::before {
+ content: "\F1BB";
+}
+.mdi-debug-step-out::before {
+ content: "\F1BC";
+}
+.mdi-debug-step-over::before {
+ content: "\F1BD";
+}
+.mdi-decagram::before {
+ content: "\F76B";
+}
+.mdi-decagram-outline::before {
+ content: "\F76C";
+}
+.mdi-decimal::before {
+ content: "\F00CC";
+}
+.mdi-decimal-comma::before {
+ content: "\F00CD";
+}
+.mdi-decimal-comma-decrease::before {
+ content: "\F00CE";
+}
+.mdi-decimal-comma-increase::before {
+ content: "\F00CF";
+}
+.mdi-decimal-decrease::before {
+ content: "\F1BE";
+}
+.mdi-decimal-increase::before {
+ content: "\F1BF";
+}
+.mdi-delete::before {
+ content: "\F1C0";
+}
+.mdi-delete-alert::before {
+ content: "\F00D0";
+}
+.mdi-delete-alert-outline::before {
+ content: "\F00D1";
+}
+.mdi-delete-circle::before {
+ content: "\F682";
+}
+.mdi-delete-circle-outline::before {
+ content: "\FB64";
+}
+.mdi-delete-empty::before {
+ content: "\F6CB";
+}
+.mdi-delete-empty-outline::before {
+ content: "\FEBA";
+}
+.mdi-delete-forever::before {
+ content: "\F5E8";
+}
+.mdi-delete-forever-outline::before {
+ content: "\FB65";
+}
+.mdi-delete-off::before {
+ content: "\F00D2";
+}
+.mdi-delete-off-outline::before {
+ content: "\F00D3";
+}
+.mdi-delete-outline::before {
+ content: "\F9E6";
+}
+.mdi-delete-restore::before {
+ content: "\F818";
+}
+.mdi-delete-sweep::before {
+ content: "\F5E9";
+}
+.mdi-delete-sweep-outline::before {
+ content: "\FC3E";
+}
+.mdi-delete-variant::before {
+ content: "\F1C1";
+}
+.mdi-delta::before {
+ content: "\F1C2";
+}
+.mdi-desk::before {
+ content: "\F0264";
+}
+.mdi-desk-lamp::before {
+ content: "\F95E";
+}
+.mdi-deskphone::before {
+ content: "\F1C3";
+}
+.mdi-desktop-classic::before {
+ content: "\F7BF";
+}
+.mdi-desktop-mac::before {
+ content: "\F1C4";
+}
+.mdi-desktop-mac-dashboard::before {
+ content: "\F9E7";
+}
+.mdi-desktop-tower::before {
+ content: "\F1C5";
+}
+.mdi-desktop-tower-monitor::before {
+ content: "\FAAA";
+}
+.mdi-details::before {
+ content: "\F1C6";
+}
+.mdi-dev-to::before {
+ content: "\FD4A";
+}
+.mdi-developer-board::before {
+ content: "\F696";
+}
+.mdi-deviantart::before {
+ content: "\F1C7";
+}
+.mdi-devices::before {
+ content: "\FFD0";
+}
+.mdi-diabetes::before {
+ content: "\F0151";
+}
+.mdi-dialpad::before {
+ content: "\F61C";
+}
+.mdi-diameter::before {
+ content: "\FC3F";
+}
+.mdi-diameter-outline::before {
+ content: "\FC40";
+}
+.mdi-diameter-variant::before {
+ content: "\FC41";
+}
+.mdi-diamond::before {
+ content: "\FB66";
+}
+.mdi-diamond-outline::before {
+ content: "\FB67";
+}
+.mdi-diamond-stone::before {
+ content: "\F1C8";
+}
+.mdi-dice-1::before {
+ content: "\F1CA";
+}
+.mdi-dice-1-outline::before {
+ content: "\F0175";
+}
+.mdi-dice-2::before {
+ content: "\F1CB";
+}
+.mdi-dice-2-outline::before {
+ content: "\F0176";
+}
+.mdi-dice-3::before {
+ content: "\F1CC";
+}
+.mdi-dice-3-outline::before {
+ content: "\F0177";
+}
+.mdi-dice-4::before {
+ content: "\F1CD";
+}
+.mdi-dice-4-outline::before {
+ content: "\F0178";
+}
+.mdi-dice-5::before {
+ content: "\F1CE";
+}
+.mdi-dice-5-outline::before {
+ content: "\F0179";
+}
+.mdi-dice-6::before {
+ content: "\F1CF";
+}
+.mdi-dice-6-outline::before {
+ content: "\F017A";
+}
+.mdi-dice-d10::before {
+ content: "\F017E";
+}
+.mdi-dice-d10-outline::before {
+ content: "\F76E";
+}
+.mdi-dice-d12::before {
+ content: "\F017F";
+}
+.mdi-dice-d12-outline::before {
+ content: "\F866";
+}
+.mdi-dice-d20::before {
+ content: "\F0180";
+}
+.mdi-dice-d20-outline::before {
+ content: "\F5EA";
+}
+.mdi-dice-d4::before {
+ content: "\F017B";
+}
+.mdi-dice-d4-outline::before {
+ content: "\F5EB";
+}
+.mdi-dice-d6::before {
+ content: "\F017C";
+}
+.mdi-dice-d6-outline::before {
+ content: "\F5EC";
+}
+.mdi-dice-d8::before {
+ content: "\F017D";
+}
+.mdi-dice-d8-outline::before {
+ content: "\F5ED";
+}
+.mdi-dice-multiple::before {
+ content: "\F76D";
+}
+.mdi-dice-multiple-outline::before {
+ content: "\F0181";
+}
+.mdi-dictionary::before {
+ content: "\F61D";
+}
+.mdi-digital-ocean::before {
+ content: "\F0262";
+}
+.mdi-dip-switch::before {
+ content: "\F7C0";
+}
+.mdi-directions::before {
+ content: "\F1D0";
+}
+.mdi-directions-fork::before {
+ content: "\F641";
+}
+.mdi-disc::before {
+ content: "\F5EE";
+}
+.mdi-disc-alert::before {
+ content: "\F1D1";
+}
+.mdi-disc-player::before {
+ content: "\F95F";
+}
+.mdi-discord::before {
+ content: "\F66F";
+}
+.mdi-dishwasher::before {
+ content: "\FAAB";
+}
+.mdi-dishwasher-alert::before {
+ content: "\F01E3";
+}
+.mdi-dishwasher-off::before {
+ content: "\F01E4";
+}
+.mdi-disqus::before {
+ content: "\F1D2";
+}
+.mdi-disqus-outline::before {
+ content: "\F1D3";
+}
+.mdi-distribute-horizontal-center::before {
+ content: "\F01F4";
+}
+.mdi-distribute-horizontal-left::before {
+ content: "\F01F3";
+}
+.mdi-distribute-horizontal-right::before {
+ content: "\F01F5";
+}
+.mdi-distribute-vertical-bottom::before {
+ content: "\F01F6";
+}
+.mdi-distribute-vertical-center::before {
+ content: "\F01F7";
+}
+.mdi-distribute-vertical-top::before {
+ content: "\F01F8";
+}
+.mdi-diving-flippers::before {
+ content: "\FD9B";
+}
+.mdi-diving-helmet::before {
+ content: "\FD9C";
+}
+.mdi-diving-scuba::before {
+ content: "\FD9D";
+}
+.mdi-diving-scuba-flag::before {
+ content: "\FD9E";
+}
+.mdi-diving-scuba-tank::before {
+ content: "\FD9F";
+}
+.mdi-diving-scuba-tank-multiple::before {
+ content: "\FDA0";
+}
+.mdi-diving-snorkel::before {
+ content: "\FDA1";
+}
+.mdi-division::before {
+ content: "\F1D4";
+}
+.mdi-division-box::before {
+ content: "\F1D5";
+}
+.mdi-dlna::before {
+ content: "\FA40";
+}
+.mdi-dna::before {
+ content: "\F683";
+}
+.mdi-dns::before {
+ content: "\F1D6";
+}
+.mdi-dns-outline::before {
+ content: "\FB68";
+}
+.mdi-do-not-disturb::before {
+ content: "\F697";
+}
+.mdi-do-not-disturb-off::before {
+ content: "\F698";
+}
+.mdi-dock-bottom::before {
+ content: "\F00D4";
+}
+.mdi-dock-left::before {
+ content: "\F00D5";
+}
+.mdi-dock-right::before {
+ content: "\F00D6";
+}
+.mdi-dock-window::before {
+ content: "\F00D7";
+}
+.mdi-docker::before {
+ content: "\F867";
+}
+.mdi-doctor::before {
+ content: "\FA41";
+}
+.mdi-dog::before {
+ content: "\FA42";
+}
+.mdi-dog-service::before {
+ content: "\FAAC";
+}
+.mdi-dog-side::before {
+ content: "\FA43";
+}
+.mdi-dolby::before {
+ content: "\F6B2";
+}
+.mdi-dolly::before {
+ content: "\FEBB";
+}
+.mdi-domain::before {
+ content: "\F1D7";
+}
+.mdi-domain-off::before {
+ content: "\FD4B";
+}
+.mdi-domain-plus::before {
+ content: "\F00D8";
+}
+.mdi-domain-remove::before {
+ content: "\F00D9";
+}
+.mdi-domino-mask::before {
+ content: "\F0045";
+}
+.mdi-donkey::before {
+ content: "\F7C1";
+}
+.mdi-door::before {
+ content: "\F819";
+}
+.mdi-door-closed::before {
+ content: "\F81A";
+}
+.mdi-door-closed-lock::before {
+ content: "\F00DA";
+}
+.mdi-door-open::before {
+ content: "\F81B";
+}
+.mdi-doorbell::before {
+ content: "\F0311";
+}
+.mdi-doorbell-video::before {
+ content: "\F868";
+}
+.mdi-dot-net::before {
+ content: "\FAAD";
+}
+.mdi-dots-horizontal::before {
+ content: "\F1D8";
+}
+.mdi-dots-horizontal-circle::before {
+ content: "\F7C2";
+}
+.mdi-dots-horizontal-circle-outline::before {
+ content: "\FB69";
+}
+.mdi-dots-vertical::before {
+ content: "\F1D9";
+}
+.mdi-dots-vertical-circle::before {
+ content: "\F7C3";
+}
+.mdi-dots-vertical-circle-outline::before {
+ content: "\FB6A";
+}
+.mdi-douban::before {
+ content: "\F699";
+}
+.mdi-download::before {
+ content: "\F1DA";
+}
+.mdi-download-lock::before {
+ content: "\F034B";
+}
+.mdi-download-lock-outline::before {
+ content: "\F034C";
+}
+.mdi-download-multiple::before {
+ content: "\F9E8";
+}
+.mdi-download-network::before {
+ content: "\F6F3";
+}
+.mdi-download-network-outline::before {
+ content: "\FC42";
+}
+.mdi-download-off::before {
+ content: "\F00DB";
+}
+.mdi-download-off-outline::before {
+ content: "\F00DC";
+}
+.mdi-download-outline::before {
+ content: "\FB6B";
+}
+.mdi-drag::before {
+ content: "\F1DB";
+}
+.mdi-drag-horizontal::before {
+ content: "\F1DC";
+}
+.mdi-drag-horizontal-variant::before {
+ content: "\F031B";
+}
+.mdi-drag-variant::before {
+ content: "\FB6C";
+}
+.mdi-drag-vertical::before {
+ content: "\F1DD";
+}
+.mdi-drag-vertical-variant::before {
+ content: "\F031C";
+}
+.mdi-drama-masks::before {
+ content: "\FCDE";
+}
+.mdi-draw::before {
+ content: "\FF66";
+}
+.mdi-drawing::before {
+ content: "\F1DE";
+}
+.mdi-drawing-box::before {
+ content: "\F1DF";
+}
+.mdi-dresser::before {
+ content: "\FF67";
+}
+.mdi-dresser-outline::before {
+ content: "\FF68";
+}
+.mdi-dribbble::before {
+ content: "\F1E0";
+}
+.mdi-dribbble-box::before {
+ content: "\F1E1";
+}
+.mdi-drone::before {
+ content: "\F1E2";
+}
+.mdi-dropbox::before {
+ content: "\F1E3";
+}
+.mdi-drupal::before {
+ content: "\F1E4";
+}
+.mdi-duck::before {
+ content: "\F1E5";
+}
+.mdi-dumbbell::before {
+ content: "\F1E6";
+}
+.mdi-dump-truck::before {
+ content: "\FC43";
+}
+.mdi-ear-hearing::before {
+ content: "\F7C4";
+}
+.mdi-ear-hearing-off::before {
+ content: "\FA44";
+}
+.mdi-earth::before {
+ content: "\F1E7";
+}
+.mdi-earth-arrow-right::before {
+ content: "\F033C";
+}
+.mdi-earth-box::before {
+ content: "\F6CC";
+}
+.mdi-earth-box-off::before {
+ content: "\F6CD";
+}
+.mdi-earth-off::before {
+ content: "\F1E8";
+}
+.mdi-edge::before {
+ content: "\F1E9";
+}
+.mdi-edge-legacy::before {
+ content: "\F027B";
+}
+.mdi-egg::before {
+ content: "\FAAE";
+}
+.mdi-egg-easter::before {
+ content: "\FAAF";
+}
+.mdi-eight-track::before {
+ content: "\F9E9";
+}
+.mdi-eject::before {
+ content: "\F1EA";
+}
+.mdi-eject-outline::before {
+ content: "\FB6D";
+}
+.mdi-electric-switch::before {
+ content: "\FEBC";
+}
+.mdi-electric-switch-closed::before {
+ content: "\F0104";
+}
+.mdi-electron-framework::before {
+ content: "\F0046";
+}
+.mdi-elephant::before {
+ content: "\F7C5";
+}
+.mdi-elevation-decline::before {
+ content: "\F1EB";
+}
+.mdi-elevation-rise::before {
+ content: "\F1EC";
+}
+.mdi-elevator::before {
+ content: "\F1ED";
+}
+.mdi-elevator-down::before {
+ content: "\F02ED";
+}
+.mdi-elevator-passenger::before {
+ content: "\F03AC";
+}
+.mdi-elevator-up::before {
+ content: "\F02EC";
+}
+.mdi-ellipse::before {
+ content: "\FEBD";
+}
+.mdi-ellipse-outline::before {
+ content: "\FEBE";
+}
+.mdi-email::before {
+ content: "\F1EE";
+}
+.mdi-email-alert::before {
+ content: "\F6CE";
+}
+.mdi-email-alert-outline::before {
+ content: "\FD1E";
+}
+.mdi-email-box::before {
+ content: "\FCDF";
+}
+.mdi-email-check::before {
+ content: "\FAB0";
+}
+.mdi-email-check-outline::before {
+ content: "\FAB1";
+}
+.mdi-email-edit::before {
+ content: "\FF00";
+}
+.mdi-email-edit-outline::before {
+ content: "\FF01";
+}
+.mdi-email-lock::before {
+ content: "\F1F1";
+}
+.mdi-email-mark-as-unread::before {
+ content: "\FB6E";
+}
+.mdi-email-minus::before {
+ content: "\FF02";
+}
+.mdi-email-minus-outline::before {
+ content: "\FF03";
+}
+.mdi-email-multiple::before {
+ content: "\FF04";
+}
+.mdi-email-multiple-outline::before {
+ content: "\FF05";
+}
+.mdi-email-newsletter::before {
+ content: "\FFD1";
+}
+.mdi-email-open::before {
+ content: "\F1EF";
+}
+.mdi-email-open-multiple::before {
+ content: "\FF06";
+}
+.mdi-email-open-multiple-outline::before {
+ content: "\FF07";
+}
+.mdi-email-open-outline::before {
+ content: "\F5EF";
+}
+.mdi-email-outline::before {
+ content: "\F1F0";
+}
+.mdi-email-plus::before {
+ content: "\F9EA";
+}
+.mdi-email-plus-outline::before {
+ content: "\F9EB";
+}
+.mdi-email-receive::before {
+ content: "\F0105";
+}
+.mdi-email-receive-outline::before {
+ content: "\F0106";
+}
+.mdi-email-search::before {
+ content: "\F960";
+}
+.mdi-email-search-outline::before {
+ content: "\F961";
+}
+.mdi-email-send::before {
+ content: "\F0107";
+}
+.mdi-email-send-outline::before {
+ content: "\F0108";
+}
+.mdi-email-sync::before {
+ content: "\F02F2";
+}
+.mdi-email-sync-outline::before {
+ content: "\F02F3";
+}
+.mdi-email-variant::before {
+ content: "\F5F0";
+}
+.mdi-ember::before {
+ content: "\FB15";
+}
+.mdi-emby::before {
+ content: "\F6B3";
+}
+.mdi-emoticon::before {
+ content: "\FC44";
+}
+.mdi-emoticon-angry::before {
+ content: "\FC45";
+}
+.mdi-emoticon-angry-outline::before {
+ content: "\FC46";
+}
+.mdi-emoticon-confused::before {
+ content: "\F0109";
+}
+.mdi-emoticon-confused-outline::before {
+ content: "\F010A";
+}
+.mdi-emoticon-cool::before {
+ content: "\FC47";
+}
+.mdi-emoticon-cool-outline::before {
+ content: "\F1F3";
+}
+.mdi-emoticon-cry::before {
+ content: "\FC48";
+}
+.mdi-emoticon-cry-outline::before {
+ content: "\FC49";
+}
+.mdi-emoticon-dead::before {
+ content: "\FC4A";
+}
+.mdi-emoticon-dead-outline::before {
+ content: "\F69A";
+}
+.mdi-emoticon-devil::before {
+ content: "\FC4B";
+}
+.mdi-emoticon-devil-outline::before {
+ content: "\F1F4";
+}
+.mdi-emoticon-excited::before {
+ content: "\FC4C";
+}
+.mdi-emoticon-excited-outline::before {
+ content: "\F69B";
+}
+.mdi-emoticon-frown::before {
+ content: "\FF69";
+}
+.mdi-emoticon-frown-outline::before {
+ content: "\FF6A";
+}
+.mdi-emoticon-happy::before {
+ content: "\FC4D";
+}
+.mdi-emoticon-happy-outline::before {
+ content: "\F1F5";
+}
+.mdi-emoticon-kiss::before {
+ content: "\FC4E";
+}
+.mdi-emoticon-kiss-outline::before {
+ content: "\FC4F";
+}
+.mdi-emoticon-lol::before {
+ content: "\F023F";
+}
+.mdi-emoticon-lol-outline::before {
+ content: "\F0240";
+}
+.mdi-emoticon-neutral::before {
+ content: "\FC50";
+}
+.mdi-emoticon-neutral-outline::before {
+ content: "\F1F6";
+}
+.mdi-emoticon-outline::before {
+ content: "\F1F2";
+}
+.mdi-emoticon-poop::before {
+ content: "\F1F7";
+}
+.mdi-emoticon-poop-outline::before {
+ content: "\FC51";
+}
+.mdi-emoticon-sad::before {
+ content: "\FC52";
+}
+.mdi-emoticon-sad-outline::before {
+ content: "\F1F8";
+}
+.mdi-emoticon-tongue::before {
+ content: "\F1F9";
+}
+.mdi-emoticon-tongue-outline::before {
+ content: "\FC53";
+}
+.mdi-emoticon-wink::before {
+ content: "\FC54";
+}
+.mdi-emoticon-wink-outline::before {
+ content: "\FC55";
+}
+.mdi-engine::before {
+ content: "\F1FA";
+}
+.mdi-engine-off::before {
+ content: "\FA45";
+}
+.mdi-engine-off-outline::before {
+ content: "\FA46";
+}
+.mdi-engine-outline::before {
+ content: "\F1FB";
+}
+.mdi-epsilon::before {
+ content: "\F010B";
+}
+.mdi-equal::before {
+ content: "\F1FC";
+}
+.mdi-equal-box::before {
+ content: "\F1FD";
+}
+.mdi-equalizer::before {
+ content: "\FEBF";
+}
+.mdi-equalizer-outline::before {
+ content: "\FEC0";
+}
+.mdi-eraser::before {
+ content: "\F1FE";
+}
+.mdi-eraser-variant::before {
+ content: "\F642";
+}
+.mdi-escalator::before {
+ content: "\F1FF";
+}
+.mdi-escalator-down::before {
+ content: "\F02EB";
+}
+.mdi-escalator-up::before {
+ content: "\F02EA";
+}
+.mdi-eslint::before {
+ content: "\FC56";
+}
+.mdi-et::before {
+ content: "\FAB2";
+}
+.mdi-ethereum::before {
+ content: "\F869";
+}
+.mdi-ethernet::before {
+ content: "\F200";
+}
+.mdi-ethernet-cable::before {
+ content: "\F201";
+}
+.mdi-ethernet-cable-off::before {
+ content: "\F202";
+}
+.mdi-etsy::before {
+ content: "\F203";
+}
+.mdi-ev-station::before {
+ content: "\F5F1";
+}
+.mdi-eventbrite::before {
+ content: "\F7C6";
+}
+.mdi-evernote::before {
+ content: "\F204";
+}
+.mdi-excavator::before {
+ content: "\F0047";
+}
+.mdi-exclamation::before {
+ content: "\F205";
+}
+.mdi-exclamation-thick::before {
+ content: "\F0263";
+}
+.mdi-exit-run::before {
+ content: "\FA47";
+}
+.mdi-exit-to-app::before {
+ content: "\F206";
+}
+.mdi-expand-all::before {
+ content: "\FAB3";
+}
+.mdi-expand-all-outline::before {
+ content: "\FAB4";
+}
+.mdi-expansion-card::before {
+ content: "\F8AD";
+}
+.mdi-expansion-card-variant::before {
+ content: "\FFD2";
+}
+.mdi-exponent::before {
+ content: "\F962";
+}
+.mdi-exponent-box::before {
+ content: "\F963";
+}
+.mdi-export::before {
+ content: "\F207";
+}
+.mdi-export-variant::before {
+ content: "\FB6F";
+}
+.mdi-eye::before {
+ content: "\F208";
+}
+.mdi-eye-check::before {
+ content: "\FCE0";
+}
+.mdi-eye-check-outline::before {
+ content: "\FCE1";
+}
+.mdi-eye-circle::before {
+ content: "\FB70";
+}
+.mdi-eye-circle-outline::before {
+ content: "\FB71";
+}
+.mdi-eye-minus::before {
+ content: "\F0048";
+}
+.mdi-eye-minus-outline::before {
+ content: "\F0049";
+}
+.mdi-eye-off::before {
+ content: "\F209";
+}
+.mdi-eye-off-outline::before {
+ content: "\F6D0";
+}
+.mdi-eye-outline::before {
+ content: "\F6CF";
+}
+.mdi-eye-plus::before {
+ content: "\F86A";
+}
+.mdi-eye-plus-outline::before {
+ content: "\F86B";
+}
+.mdi-eye-settings::before {
+ content: "\F86C";
+}
+.mdi-eye-settings-outline::before {
+ content: "\F86D";
+}
+.mdi-eyedropper::before {
+ content: "\F20A";
+}
+.mdi-eyedropper-variant::before {
+ content: "\F20B";
+}
+.mdi-face::before {
+ content: "\F643";
+}
+.mdi-face-agent::before {
+ content: "\FD4C";
+}
+.mdi-face-outline::before {
+ content: "\FB72";
+}
+.mdi-face-profile::before {
+ content: "\F644";
+}
+.mdi-face-profile-woman::before {
+ content: "\F00A1";
+}
+.mdi-face-recognition::before {
+ content: "\FC57";
+}
+.mdi-face-woman::before {
+ content: "\F00A2";
+}
+.mdi-face-woman-outline::before {
+ content: "\F00A3";
+}
+.mdi-facebook::before {
+ content: "\F20C";
+}
+.mdi-facebook-box::before {
+ content: "\F20D";
+}
+.mdi-facebook-messenger::before {
+ content: "\F20E";
+}
+.mdi-facebook-workplace::before {
+ content: "\FB16";
+}
+.mdi-factory::before {
+ content: "\F20F";
+}
+.mdi-fan::before {
+ content: "\F210";
+}
+.mdi-fan-off::before {
+ content: "\F81C";
+}
+.mdi-fast-forward::before {
+ content: "\F211";
+}
+.mdi-fast-forward-10::before {
+ content: "\FD4D";
+}
+.mdi-fast-forward-30::before {
+ content: "\FCE2";
+}
+.mdi-fast-forward-5::before {
+ content: "\F0223";
+}
+.mdi-fast-forward-outline::before {
+ content: "\F6D1";
+}
+.mdi-fax::before {
+ content: "\F212";
+}
+.mdi-feather::before {
+ content: "\F6D2";
+}
+.mdi-feature-search::before {
+ content: "\FA48";
+}
+.mdi-feature-search-outline::before {
+ content: "\FA49";
+}
+.mdi-fedora::before {
+ content: "\F8DA";
+}
+.mdi-ferris-wheel::before {
+ content: "\FEC1";
+}
+.mdi-ferry::before {
+ content: "\F213";
+}
+.mdi-file::before {
+ content: "\F214";
+}
+.mdi-file-account::before {
+ content: "\F73A";
+}
+.mdi-file-account-outline::before {
+ content: "\F004A";
+}
+.mdi-file-alert::before {
+ content: "\FA4A";
+}
+.mdi-file-alert-outline::before {
+ content: "\FA4B";
+}
+.mdi-file-cabinet::before {
+ content: "\FAB5";
+}
+.mdi-file-cad::before {
+ content: "\FF08";
+}
+.mdi-file-cad-box::before {
+ content: "\FF09";
+}
+.mdi-file-cancel::before {
+ content: "\FDA2";
+}
+.mdi-file-cancel-outline::before {
+ content: "\FDA3";
+}
+.mdi-file-certificate::before {
+ content: "\F01B1";
+}
+.mdi-file-certificate-outline::before {
+ content: "\F01B2";
+}
+.mdi-file-chart::before {
+ content: "\F215";
+}
+.mdi-file-chart-outline::before {
+ content: "\F004B";
+}
+.mdi-file-check::before {
+ content: "\F216";
+}
+.mdi-file-check-outline::before {
+ content: "\FE7B";
+}
+.mdi-file-clock::before {
+ content: "\F030C";
+}
+.mdi-file-clock-outline::before {
+ content: "\F030D";
+}
+.mdi-file-cloud::before {
+ content: "\F217";
+}
+.mdi-file-cloud-outline::before {
+ content: "\F004C";
+}
+.mdi-file-code::before {
+ content: "\F22E";
+}
+.mdi-file-code-outline::before {
+ content: "\F004D";
+}
+.mdi-file-compare::before {
+ content: "\F8A9";
+}
+.mdi-file-delimited::before {
+ content: "\F218";
+}
+.mdi-file-delimited-outline::before {
+ content: "\FEC2";
+}
+.mdi-file-document::before {
+ content: "\F219";
+}
+.mdi-file-document-box::before {
+ content: "\F21A";
+}
+.mdi-file-document-box-check::before {
+ content: "\FEC3";
+}
+.mdi-file-document-box-check-outline::before {
+ content: "\FEC4";
+}
+.mdi-file-document-box-minus::before {
+ content: "\FEC5";
+}
+.mdi-file-document-box-minus-outline::before {
+ content: "\FEC6";
+}
+.mdi-file-document-box-multiple::before {
+ content: "\FAB6";
+}
+.mdi-file-document-box-multiple-outline::before {
+ content: "\FAB7";
+}
+.mdi-file-document-box-outline::before {
+ content: "\F9EC";
+}
+.mdi-file-document-box-plus::before {
+ content: "\FEC7";
+}
+.mdi-file-document-box-plus-outline::before {
+ content: "\FEC8";
+}
+.mdi-file-document-box-remove::before {
+ content: "\FEC9";
+}
+.mdi-file-document-box-remove-outline::before {
+ content: "\FECA";
+}
+.mdi-file-document-box-search::before {
+ content: "\FECB";
+}
+.mdi-file-document-box-search-outline::before {
+ content: "\FECC";
+}
+.mdi-file-document-edit::before {
+ content: "\FDA4";
+}
+.mdi-file-document-edit-outline::before {
+ content: "\FDA5";
+}
+.mdi-file-document-outline::before {
+ content: "\F9ED";
+}
+.mdi-file-download::before {
+ content: "\F964";
+}
+.mdi-file-download-outline::before {
+ content: "\F965";
+}
+.mdi-file-edit::before {
+ content: "\F0212";
+}
+.mdi-file-edit-outline::before {
+ content: "\F0213";
+}
+.mdi-file-excel::before {
+ content: "\F21B";
+}
+.mdi-file-excel-box::before {
+ content: "\F21C";
+}
+.mdi-file-excel-box-outline::before {
+ content: "\F004E";
+}
+.mdi-file-excel-outline::before {
+ content: "\F004F";
+}
+.mdi-file-export::before {
+ content: "\F21D";
+}
+.mdi-file-export-outline::before {
+ content: "\F0050";
+}
+.mdi-file-eye::before {
+ content: "\FDA6";
+}
+.mdi-file-eye-outline::before {
+ content: "\FDA7";
+}
+.mdi-file-find::before {
+ content: "\F21E";
+}
+.mdi-file-find-outline::before {
+ content: "\FB73";
+}
+.mdi-file-hidden::before {
+ content: "\F613";
+}
+.mdi-file-image::before {
+ content: "\F21F";
+}
+.mdi-file-image-outline::before {
+ content: "\FECD";
+}
+.mdi-file-import::before {
+ content: "\F220";
+}
+.mdi-file-import-outline::before {
+ content: "\F0051";
+}
+.mdi-file-key::before {
+ content: "\F01AF";
+}
+.mdi-file-key-outline::before {
+ content: "\F01B0";
+}
+.mdi-file-link::before {
+ content: "\F01A2";
+}
+.mdi-file-link-outline::before {
+ content: "\F01A3";
+}
+.mdi-file-lock::before {
+ content: "\F221";
+}
+.mdi-file-lock-outline::before {
+ content: "\F0052";
+}
+.mdi-file-move::before {
+ content: "\FAB8";
+}
+.mdi-file-move-outline::before {
+ content: "\F0053";
+}
+.mdi-file-multiple::before {
+ content: "\F222";
+}
+.mdi-file-multiple-outline::before {
+ content: "\F0054";
+}
+.mdi-file-music::before {
+ content: "\F223";
+}
+.mdi-file-music-outline::before {
+ content: "\FE7C";
+}
+.mdi-file-outline::before {
+ content: "\F224";
+}
+.mdi-file-pdf::before {
+ content: "\F225";
+}
+.mdi-file-pdf-box::before {
+ content: "\F226";
+}
+.mdi-file-pdf-box-outline::before {
+ content: "\FFD3";
+}
+.mdi-file-pdf-outline::before {
+ content: "\FE7D";
+}
+.mdi-file-percent::before {
+ content: "\F81D";
+}
+.mdi-file-percent-outline::before {
+ content: "\F0055";
+}
+.mdi-file-phone::before {
+ content: "\F01A4";
+}
+.mdi-file-phone-outline::before {
+ content: "\F01A5";
+}
+.mdi-file-plus::before {
+ content: "\F751";
+}
+.mdi-file-plus-outline::before {
+ content: "\FF0A";
+}
+.mdi-file-powerpoint::before {
+ content: "\F227";
+}
+.mdi-file-powerpoint-box::before {
+ content: "\F228";
+}
+.mdi-file-powerpoint-box-outline::before {
+ content: "\F0056";
+}
+.mdi-file-powerpoint-outline::before {
+ content: "\F0057";
+}
+.mdi-file-presentation-box::before {
+ content: "\F229";
+}
+.mdi-file-question::before {
+ content: "\F86E";
+}
+.mdi-file-question-outline::before {
+ content: "\F0058";
+}
+.mdi-file-remove::before {
+ content: "\FB74";
+}
+.mdi-file-remove-outline::before {
+ content: "\F0059";
+}
+.mdi-file-replace::before {
+ content: "\FB17";
+}
+.mdi-file-replace-outline::before {
+ content: "\FB18";
+}
+.mdi-file-restore::before {
+ content: "\F670";
+}
+.mdi-file-restore-outline::before {
+ content: "\F005A";
+}
+.mdi-file-search::before {
+ content: "\FC58";
+}
+.mdi-file-search-outline::before {
+ content: "\FC59";
+}
+.mdi-file-send::before {
+ content: "\F22A";
+}
+.mdi-file-send-outline::before {
+ content: "\F005B";
+}
+.mdi-file-settings::before {
+ content: "\F00A4";
+}
+.mdi-file-settings-outline::before {
+ content: "\F00A5";
+}
+.mdi-file-settings-variant::before {
+ content: "\F00A6";
+}
+.mdi-file-settings-variant-outline::before {
+ content: "\F00A7";
+}
+.mdi-file-star::before {
+ content: "\F005C";
+}
+.mdi-file-star-outline::before {
+ content: "\F005D";
+}
+.mdi-file-swap::before {
+ content: "\FFD4";
+}
+.mdi-file-swap-outline::before {
+ content: "\FFD5";
+}
+.mdi-file-sync::before {
+ content: "\F0241";
+}
+.mdi-file-sync-outline::before {
+ content: "\F0242";
+}
+.mdi-file-table::before {
+ content: "\FC5A";
+}
+.mdi-file-table-box::before {
+ content: "\F010C";
+}
+.mdi-file-table-box-multiple::before {
+ content: "\F010D";
+}
+.mdi-file-table-box-multiple-outline::before {
+ content: "\F010E";
+}
+.mdi-file-table-box-outline::before {
+ content: "\F010F";
+}
+.mdi-file-table-outline::before {
+ content: "\FC5B";
+}
+.mdi-file-tree::before {
+ content: "\F645";
+}
+.mdi-file-undo::before {
+ content: "\F8DB";
+}
+.mdi-file-undo-outline::before {
+ content: "\F005E";
+}
+.mdi-file-upload::before {
+ content: "\FA4C";
+}
+.mdi-file-upload-outline::before {
+ content: "\FA4D";
+}
+.mdi-file-video::before {
+ content: "\F22B";
+}
+.mdi-file-video-outline::before {
+ content: "\FE10";
+}
+.mdi-file-word::before {
+ content: "\F22C";
+}
+.mdi-file-word-box::before {
+ content: "\F22D";
+}
+.mdi-file-word-box-outline::before {
+ content: "\F005F";
+}
+.mdi-file-word-outline::before {
+ content: "\F0060";
+}
+.mdi-film::before {
+ content: "\F22F";
+}
+.mdi-filmstrip::before {
+ content: "\F230";
+}
+.mdi-filmstrip-off::before {
+ content: "\F231";
+}
+.mdi-filter::before {
+ content: "\F232";
+}
+.mdi-filter-menu::before {
+ content: "\F0110";
+}
+.mdi-filter-menu-outline::before {
+ content: "\F0111";
+}
+.mdi-filter-minus::before {
+ content: "\FF0B";
+}
+.mdi-filter-minus-outline::before {
+ content: "\FF0C";
+}
+.mdi-filter-outline::before {
+ content: "\F233";
+}
+.mdi-filter-plus::before {
+ content: "\FF0D";
+}
+.mdi-filter-plus-outline::before {
+ content: "\FF0E";
+}
+.mdi-filter-remove::before {
+ content: "\F234";
+}
+.mdi-filter-remove-outline::before {
+ content: "\F235";
+}
+.mdi-filter-variant::before {
+ content: "\F236";
+}
+.mdi-filter-variant-minus::before {
+ content: "\F013D";
+}
+.mdi-filter-variant-plus::before {
+ content: "\F013E";
+}
+.mdi-filter-variant-remove::before {
+ content: "\F0061";
+}
+.mdi-finance::before {
+ content: "\F81E";
+}
+.mdi-find-replace::before {
+ content: "\F6D3";
+}
+.mdi-fingerprint::before {
+ content: "\F237";
+}
+.mdi-fingerprint-off::before {
+ content: "\FECE";
+}
+.mdi-fire::before {
+ content: "\F238";
+}
+.mdi-fire-extinguisher::before {
+ content: "\FF0F";
+}
+.mdi-fire-hydrant::before {
+ content: "\F0162";
+}
+.mdi-fire-hydrant-alert::before {
+ content: "\F0163";
+}
+.mdi-fire-hydrant-off::before {
+ content: "\F0164";
+}
+.mdi-fire-truck::before {
+ content: "\F8AA";
+}
+.mdi-firebase::before {
+ content: "\F966";
+}
+.mdi-firefox::before {
+ content: "\F239";
+}
+.mdi-fireplace::before {
+ content: "\FE11";
+}
+.mdi-fireplace-off::before {
+ content: "\FE12";
+}
+.mdi-firework::before {
+ content: "\FE13";
+}
+.mdi-fish::before {
+ content: "\F23A";
+}
+.mdi-fishbowl::before {
+ content: "\FF10";
+}
+.mdi-fishbowl-outline::before {
+ content: "\FF11";
+}
+.mdi-fit-to-page::before {
+ content: "\FF12";
+}
+.mdi-fit-to-page-outline::before {
+ content: "\FF13";
+}
+.mdi-flag::before {
+ content: "\F23B";
+}
+.mdi-flag-checkered::before {
+ content: "\F23C";
+}
+.mdi-flag-minus::before {
+ content: "\FB75";
+}
+.mdi-flag-minus-outline::before {
+ content: "\F00DD";
+}
+.mdi-flag-outline::before {
+ content: "\F23D";
+}
+.mdi-flag-plus::before {
+ content: "\FB76";
+}
+.mdi-flag-plus-outline::before {
+ content: "\F00DE";
+}
+.mdi-flag-remove::before {
+ content: "\FB77";
+}
+.mdi-flag-remove-outline::before {
+ content: "\F00DF";
+}
+.mdi-flag-triangle::before {
+ content: "\F23F";
+}
+.mdi-flag-variant::before {
+ content: "\F240";
+}
+.mdi-flag-variant-outline::before {
+ content: "\F23E";
+}
+.mdi-flare::before {
+ content: "\FD4E";
+}
+.mdi-flash::before {
+ content: "\F241";
+}
+.mdi-flash-alert::before {
+ content: "\FF14";
+}
+.mdi-flash-alert-outline::before {
+ content: "\FF15";
+}
+.mdi-flash-auto::before {
+ content: "\F242";
+}
+.mdi-flash-circle::before {
+ content: "\F81F";
+}
+.mdi-flash-off::before {
+ content: "\F243";
+}
+.mdi-flash-outline::before {
+ content: "\F6D4";
+}
+.mdi-flash-red-eye::before {
+ content: "\F67A";
+}
+.mdi-flashlight::before {
+ content: "\F244";
+}
+.mdi-flashlight-off::before {
+ content: "\F245";
+}
+.mdi-flask::before {
+ content: "\F093";
+}
+.mdi-flask-empty::before {
+ content: "\F094";
+}
+.mdi-flask-empty-minus::before {
+ content: "\F0265";
+}
+.mdi-flask-empty-minus-outline::before {
+ content: "\F0266";
+}
+.mdi-flask-empty-outline::before {
+ content: "\F095";
+}
+.mdi-flask-empty-plus::before {
+ content: "\F0267";
+}
+.mdi-flask-empty-plus-outline::before {
+ content: "\F0268";
+}
+.mdi-flask-empty-remove::before {
+ content: "\F0269";
+}
+.mdi-flask-empty-remove-outline::before {
+ content: "\F026A";
+}
+.mdi-flask-minus::before {
+ content: "\F026B";
+}
+.mdi-flask-minus-outline::before {
+ content: "\F026C";
+}
+.mdi-flask-outline::before {
+ content: "\F096";
+}
+.mdi-flask-plus::before {
+ content: "\F026D";
+}
+.mdi-flask-plus-outline::before {
+ content: "\F026E";
+}
+.mdi-flask-remove::before {
+ content: "\F026F";
+}
+.mdi-flask-remove-outline::before {
+ content: "\F0270";
+}
+.mdi-flask-round-bottom::before {
+ content: "\F0276";
+}
+.mdi-flask-round-bottom-empty::before {
+ content: "\F0277";
+}
+.mdi-flask-round-bottom-empty-outline::before {
+ content: "\F0278";
+}
+.mdi-flask-round-bottom-outline::before {
+ content: "\F0279";
+}
+.mdi-flattr::before {
+ content: "\F246";
+}
+.mdi-fleur-de-lis::before {
+ content: "\F032E";
+}
+.mdi-flickr::before {
+ content: "\FCE3";
+}
+.mdi-flip-horizontal::before {
+ content: "\F0112";
+}
+.mdi-flip-to-back::before {
+ content: "\F247";
+}
+.mdi-flip-to-front::before {
+ content: "\F248";
+}
+.mdi-flip-vertical::before {
+ content: "\F0113";
+}
+.mdi-floor-lamp::before {
+ content: "\F8DC";
+}
+.mdi-floor-lamp-dual::before {
+ content: "\F0062";
+}
+.mdi-floor-lamp-variant::before {
+ content: "\F0063";
+}
+.mdi-floor-plan::before {
+ content: "\F820";
+}
+.mdi-floppy::before {
+ content: "\F249";
+}
+.mdi-floppy-variant::before {
+ content: "\F9EE";
+}
+.mdi-flower::before {
+ content: "\F24A";
+}
+.mdi-flower-outline::before {
+ content: "\F9EF";
+}
+.mdi-flower-poppy::before {
+ content: "\FCE4";
+}
+.mdi-flower-tulip::before {
+ content: "\F9F0";
+}
+.mdi-flower-tulip-outline::before {
+ content: "\F9F1";
+}
+.mdi-focus-auto::before {
+ content: "\FF6B";
+}
+.mdi-focus-field::before {
+ content: "\FF6C";
+}
+.mdi-focus-field-horizontal::before {
+ content: "\FF6D";
+}
+.mdi-focus-field-vertical::before {
+ content: "\FF6E";
+}
+.mdi-folder::before {
+ content: "\F24B";
+}
+.mdi-folder-account::before {
+ content: "\F24C";
+}
+.mdi-folder-account-outline::before {
+ content: "\FB78";
+}
+.mdi-folder-alert::before {
+ content: "\FDA8";
+}
+.mdi-folder-alert-outline::before {
+ content: "\FDA9";
+}
+.mdi-folder-clock::before {
+ content: "\FAB9";
+}
+.mdi-folder-clock-outline::before {
+ content: "\FABA";
+}
+.mdi-folder-download::before {
+ content: "\F24D";
+}
+.mdi-folder-download-outline::before {
+ content: "\F0114";
+}
+.mdi-folder-edit::before {
+ content: "\F8DD";
+}
+.mdi-folder-edit-outline::before {
+ content: "\FDAA";
+}
+.mdi-folder-google-drive::before {
+ content: "\F24E";
+}
+.mdi-folder-heart::before {
+ content: "\F0115";
+}
+.mdi-folder-heart-outline::before {
+ content: "\F0116";
+}
+.mdi-folder-home::before {
+ content: "\F00E0";
+}
+.mdi-folder-home-outline::before {
+ content: "\F00E1";
+}
+.mdi-folder-image::before {
+ content: "\F24F";
+}
+.mdi-folder-information::before {
+ content: "\F00E2";
+}
+.mdi-folder-information-outline::before {
+ content: "\F00E3";
+}
+.mdi-folder-key::before {
+ content: "\F8AB";
+}
+.mdi-folder-key-network::before {
+ content: "\F8AC";
+}
+.mdi-folder-key-network-outline::before {
+ content: "\FC5C";
+}
+.mdi-folder-key-outline::before {
+ content: "\F0117";
+}
+.mdi-folder-lock::before {
+ content: "\F250";
+}
+.mdi-folder-lock-open::before {
+ content: "\F251";
+}
+.mdi-folder-marker::before {
+ content: "\F0298";
+}
+.mdi-folder-marker-outline::before {
+ content: "\F0299";
+}
+.mdi-folder-move::before {
+ content: "\F252";
+}
+.mdi-folder-move-outline::before {
+ content: "\F0271";
+}
+.mdi-folder-multiple::before {
+ content: "\F253";
+}
+.mdi-folder-multiple-image::before {
+ content: "\F254";
+}
+.mdi-folder-multiple-outline::before {
+ content: "\F255";
+}
+.mdi-folder-music::before {
+ content: "\F0384";
+}
+.mdi-folder-music-outline::before {
+ content: "\F0385";
+}
+.mdi-folder-network::before {
+ content: "\F86F";
+}
+.mdi-folder-network-outline::before {
+ content: "\FC5D";
+}
+.mdi-folder-open::before {
+ content: "\F76F";
+}
+.mdi-folder-open-outline::before {
+ content: "\FDAB";
+}
+.mdi-folder-outline::before {
+ content: "\F256";
+}
+.mdi-folder-plus::before {
+ content: "\F257";
+}
+.mdi-folder-plus-outline::before {
+ content: "\FB79";
+}
+.mdi-folder-pound::before {
+ content: "\FCE5";
+}
+.mdi-folder-pound-outline::before {
+ content: "\FCE6";
+}
+.mdi-folder-remove::before {
+ content: "\F258";
+}
+.mdi-folder-remove-outline::before {
+ content: "\FB7A";
+}
+.mdi-folder-search::before {
+ content: "\F967";
+}
+.mdi-folder-search-outline::before {
+ content: "\F968";
+}
+.mdi-folder-settings::before {
+ content: "\F00A8";
+}
+.mdi-folder-settings-outline::before {
+ content: "\F00A9";
+}
+.mdi-folder-settings-variant::before {
+ content: "\F00AA";
+}
+.mdi-folder-settings-variant-outline::before {
+ content: "\F00AB";
+}
+.mdi-folder-star::before {
+ content: "\F69C";
+}
+.mdi-folder-star-outline::before {
+ content: "\FB7B";
+}
+.mdi-folder-swap::before {
+ content: "\FFD6";
+}
+.mdi-folder-swap-outline::before {
+ content: "\FFD7";
+}
+.mdi-folder-sync::before {
+ content: "\FCE7";
+}
+.mdi-folder-sync-outline::before {
+ content: "\FCE8";
+}
+.mdi-folder-table::before {
+ content: "\F030E";
+}
+.mdi-folder-table-outline::before {
+ content: "\F030F";
+}
+.mdi-folder-text::before {
+ content: "\FC5E";
+}
+.mdi-folder-text-outline::before {
+ content: "\FC5F";
+}
+.mdi-folder-upload::before {
+ content: "\F259";
+}
+.mdi-folder-upload-outline::before {
+ content: "\F0118";
+}
+.mdi-folder-zip::before {
+ content: "\F6EA";
+}
+.mdi-folder-zip-outline::before {
+ content: "\F7B8";
+}
+.mdi-font-awesome::before {
+ content: "\F03A";
+}
+.mdi-food::before {
+ content: "\F25A";
+}
+.mdi-food-apple::before {
+ content: "\F25B";
+}
+.mdi-food-apple-outline::before {
+ content: "\FC60";
+}
+.mdi-food-croissant::before {
+ content: "\F7C7";
+}
+.mdi-food-fork-drink::before {
+ content: "\F5F2";
+}
+.mdi-food-off::before {
+ content: "\F5F3";
+}
+.mdi-food-variant::before {
+ content: "\F25C";
+}
+.mdi-foot-print::before {
+ content: "\FF6F";
+}
+.mdi-football::before {
+ content: "\F25D";
+}
+.mdi-football-australian::before {
+ content: "\F25E";
+}
+.mdi-football-helmet::before {
+ content: "\F25F";
+}
+.mdi-forklift::before {
+ content: "\F7C8";
+}
+.mdi-format-align-bottom::before {
+ content: "\F752";
+}
+.mdi-format-align-center::before {
+ content: "\F260";
+}
+.mdi-format-align-justify::before {
+ content: "\F261";
+}
+.mdi-format-align-left::before {
+ content: "\F262";
+}
+.mdi-format-align-middle::before {
+ content: "\F753";
+}
+.mdi-format-align-right::before {
+ content: "\F263";
+}
+.mdi-format-align-top::before {
+ content: "\F754";
+}
+.mdi-format-annotation-minus::before {
+ content: "\FABB";
+}
+.mdi-format-annotation-plus::before {
+ content: "\F646";
+}
+.mdi-format-bold::before {
+ content: "\F264";
+}
+.mdi-format-clear::before {
+ content: "\F265";
+}
+.mdi-format-color-fill::before {
+ content: "\F266";
+}
+.mdi-format-color-highlight::before {
+ content: "\FE14";
+}
+.mdi-format-color-marker-cancel::before {
+ content: "\F033E";
+}
+.mdi-format-color-text::before {
+ content: "\F69D";
+}
+.mdi-format-columns::before {
+ content: "\F8DE";
+}
+.mdi-format-float-center::before {
+ content: "\F267";
+}
+.mdi-format-float-left::before {
+ content: "\F268";
+}
+.mdi-format-float-none::before {
+ content: "\F269";
+}
+.mdi-format-float-right::before {
+ content: "\F26A";
+}
+.mdi-format-font::before {
+ content: "\F6D5";
+}
+.mdi-format-font-size-decrease::before {
+ content: "\F9F2";
+}
+.mdi-format-font-size-increase::before {
+ content: "\F9F3";
+}
+.mdi-format-header-1::before {
+ content: "\F26B";
+}
+.mdi-format-header-2::before {
+ content: "\F26C";
+}
+.mdi-format-header-3::before {
+ content: "\F26D";
+}
+.mdi-format-header-4::before {
+ content: "\F26E";
+}
+.mdi-format-header-5::before {
+ content: "\F26F";
+}
+.mdi-format-header-6::before {
+ content: "\F270";
+}
+.mdi-format-header-decrease::before {
+ content: "\F271";
+}
+.mdi-format-header-equal::before {
+ content: "\F272";
+}
+.mdi-format-header-increase::before {
+ content: "\F273";
+}
+.mdi-format-header-pound::before {
+ content: "\F274";
+}
+.mdi-format-horizontal-align-center::before {
+ content: "\F61E";
+}
+.mdi-format-horizontal-align-left::before {
+ content: "\F61F";
+}
+.mdi-format-horizontal-align-right::before {
+ content: "\F620";
+}
+.mdi-format-indent-decrease::before {
+ content: "\F275";
+}
+.mdi-format-indent-increase::before {
+ content: "\F276";
+}
+.mdi-format-italic::before {
+ content: "\F277";
+}
+.mdi-format-letter-case::before {
+ content: "\FB19";
+}
+.mdi-format-letter-case-lower::before {
+ content: "\FB1A";
+}
+.mdi-format-letter-case-upper::before {
+ content: "\FB1B";
+}
+.mdi-format-letter-ends-with::before {
+ content: "\FFD8";
+}
+.mdi-format-letter-matches::before {
+ content: "\FFD9";
+}
+.mdi-format-letter-starts-with::before {
+ content: "\FFDA";
+}
+.mdi-format-line-spacing::before {
+ content: "\F278";
+}
+.mdi-format-line-style::before {
+ content: "\F5C8";
+}
+.mdi-format-line-weight::before {
+ content: "\F5C9";
+}
+.mdi-format-list-bulleted::before {
+ content: "\F279";
+}
+.mdi-format-list-bulleted-square::before {
+ content: "\FDAC";
+}
+.mdi-format-list-bulleted-triangle::before {
+ content: "\FECF";
+}
+.mdi-format-list-bulleted-type::before {
+ content: "\F27A";
+}
+.mdi-format-list-checkbox::before {
+ content: "\F969";
+}
+.mdi-format-list-checks::before {
+ content: "\F755";
+}
+.mdi-format-list-numbered::before {
+ content: "\F27B";
+}
+.mdi-format-list-numbered-rtl::before {
+ content: "\FCE9";
+}
+.mdi-format-list-text::before {
+ content: "\F029A";
+}
+.mdi-format-overline::before {
+ content: "\FED0";
+}
+.mdi-format-page-break::before {
+ content: "\F6D6";
+}
+.mdi-format-paint::before {
+ content: "\F27C";
+}
+.mdi-format-paragraph::before {
+ content: "\F27D";
+}
+.mdi-format-pilcrow::before {
+ content: "\F6D7";
+}
+.mdi-format-quote-close::before {
+ content: "\F27E";
+}
+.mdi-format-quote-close-outline::before {
+ content: "\F01D3";
+}
+.mdi-format-quote-open::before {
+ content: "\F756";
+}
+.mdi-format-quote-open-outline::before {
+ content: "\F01D2";
+}
+.mdi-format-rotate-90::before {
+ content: "\F6A9";
+}
+.mdi-format-section::before {
+ content: "\F69E";
+}
+.mdi-format-size::before {
+ content: "\F27F";
+}
+.mdi-format-strikethrough::before {
+ content: "\F280";
+}
+.mdi-format-strikethrough-variant::before {
+ content: "\F281";
+}
+.mdi-format-subscript::before {
+ content: "\F282";
+}
+.mdi-format-superscript::before {
+ content: "\F283";
+}
+.mdi-format-text::before {
+ content: "\F284";
+}
+.mdi-format-text-rotation-angle-down::before {
+ content: "\FFDB";
+}
+.mdi-format-text-rotation-angle-up::before {
+ content: "\FFDC";
+}
+.mdi-format-text-rotation-down::before {
+ content: "\FD4F";
+}
+.mdi-format-text-rotation-down-vertical::before {
+ content: "\FFDD";
+}
+.mdi-format-text-rotation-none::before {
+ content: "\FD50";
+}
+.mdi-format-text-rotation-up::before {
+ content: "\FFDE";
+}
+.mdi-format-text-rotation-vertical::before {
+ content: "\FFDF";
+}
+.mdi-format-text-variant::before {
+ content: "\FE15";
+}
+.mdi-format-text-wrapping-clip::before {
+ content: "\FCEA";
+}
+.mdi-format-text-wrapping-overflow::before {
+ content: "\FCEB";
+}
+.mdi-format-text-wrapping-wrap::before {
+ content: "\FCEC";
+}
+.mdi-format-textbox::before {
+ content: "\FCED";
+}
+.mdi-format-textdirection-l-to-r::before {
+ content: "\F285";
+}
+.mdi-format-textdirection-r-to-l::before {
+ content: "\F286";
+}
+.mdi-format-title::before {
+ content: "\F5F4";
+}
+.mdi-format-underline::before {
+ content: "\F287";
+}
+.mdi-format-vertical-align-bottom::before {
+ content: "\F621";
+}
+.mdi-format-vertical-align-center::before {
+ content: "\F622";
+}
+.mdi-format-vertical-align-top::before {
+ content: "\F623";
+}
+.mdi-format-wrap-inline::before {
+ content: "\F288";
+}
+.mdi-format-wrap-square::before {
+ content: "\F289";
+}
+.mdi-format-wrap-tight::before {
+ content: "\F28A";
+}
+.mdi-format-wrap-top-bottom::before {
+ content: "\F28B";
+}
+.mdi-forum::before {
+ content: "\F28C";
+}
+.mdi-forum-outline::before {
+ content: "\F821";
+}
+.mdi-forward::before {
+ content: "\F28D";
+}
+.mdi-forwardburger::before {
+ content: "\FD51";
+}
+.mdi-fountain::before {
+ content: "\F96A";
+}
+.mdi-fountain-pen::before {
+ content: "\FCEE";
+}
+.mdi-fountain-pen-tip::before {
+ content: "\FCEF";
+}
+.mdi-foursquare::before {
+ content: "\F28E";
+}
+.mdi-freebsd::before {
+ content: "\F8DF";
+}
+.mdi-frequently-asked-questions::before {
+ content: "\FED1";
+}
+.mdi-fridge::before {
+ content: "\F290";
+}
+.mdi-fridge-alert::before {
+ content: "\F01DC";
+}
+.mdi-fridge-alert-outline::before {
+ content: "\F01DD";
+}
+.mdi-fridge-bottom::before {
+ content: "\F292";
+}
+.mdi-fridge-off::before {
+ content: "\F01DA";
+}
+.mdi-fridge-off-outline::before {
+ content: "\F01DB";
+}
+.mdi-fridge-outline::before {
+ content: "\F28F";
+}
+.mdi-fridge-top::before {
+ content: "\F291";
+}
+.mdi-fruit-cherries::before {
+ content: "\F0064";
+}
+.mdi-fruit-citrus::before {
+ content: "\F0065";
+}
+.mdi-fruit-grapes::before {
+ content: "\F0066";
+}
+.mdi-fruit-grapes-outline::before {
+ content: "\F0067";
+}
+.mdi-fruit-pineapple::before {
+ content: "\F0068";
+}
+.mdi-fruit-watermelon::before {
+ content: "\F0069";
+}
+.mdi-fuel::before {
+ content: "\F7C9";
+}
+.mdi-fullscreen::before {
+ content: "\F293";
+}
+.mdi-fullscreen-exit::before {
+ content: "\F294";
+}
+.mdi-function::before {
+ content: "\F295";
+}
+.mdi-function-variant::before {
+ content: "\F870";
+}
+.mdi-furigana-horizontal::before {
+ content: "\F00AC";
+}
+.mdi-furigana-vertical::before {
+ content: "\F00AD";
+}
+.mdi-fuse::before {
+ content: "\FC61";
+}
+.mdi-fuse-blade::before {
+ content: "\FC62";
+}
+.mdi-gamepad::before {
+ content: "\F296";
+}
+.mdi-gamepad-circle::before {
+ content: "\FE16";
+}
+.mdi-gamepad-circle-down::before {
+ content: "\FE17";
+}
+.mdi-gamepad-circle-left::before {
+ content: "\FE18";
+}
+.mdi-gamepad-circle-outline::before {
+ content: "\FE19";
+}
+.mdi-gamepad-circle-right::before {
+ content: "\FE1A";
+}
+.mdi-gamepad-circle-up::before {
+ content: "\FE1B";
+}
+.mdi-gamepad-down::before {
+ content: "\FE1C";
+}
+.mdi-gamepad-left::before {
+ content: "\FE1D";
+}
+.mdi-gamepad-right::before {
+ content: "\FE1E";
+}
+.mdi-gamepad-round::before {
+ content: "\FE1F";
+}
+.mdi-gamepad-round-down::before {
+ content: "\FE7E";
+}
+.mdi-gamepad-round-left::before {
+ content: "\FE7F";
+}
+.mdi-gamepad-round-outline::before {
+ content: "\FE80";
+}
+.mdi-gamepad-round-right::before {
+ content: "\FE81";
+}
+.mdi-gamepad-round-up::before {
+ content: "\FE82";
+}
+.mdi-gamepad-square::before {
+ content: "\FED2";
+}
+.mdi-gamepad-square-outline::before {
+ content: "\FED3";
+}
+.mdi-gamepad-up::before {
+ content: "\FE83";
+}
+.mdi-gamepad-variant::before {
+ content: "\F297";
+}
+.mdi-gamepad-variant-outline::before {
+ content: "\FED4";
+}
+.mdi-gamma::before {
+ content: "\F0119";
+}
+.mdi-gantry-crane::before {
+ content: "\FDAD";
+}
+.mdi-garage::before {
+ content: "\F6D8";
+}
+.mdi-garage-alert::before {
+ content: "\F871";
+}
+.mdi-garage-alert-variant::before {
+ content: "\F0300";
+}
+.mdi-garage-open::before {
+ content: "\F6D9";
+}
+.mdi-garage-open-variant::before {
+ content: "\F02FF";
+}
+.mdi-garage-variant::before {
+ content: "\F02FE";
+}
+.mdi-gas-cylinder::before {
+ content: "\F647";
+}
+.mdi-gas-station::before {
+ content: "\F298";
+}
+.mdi-gas-station-outline::before {
+ content: "\FED5";
+}
+.mdi-gate::before {
+ content: "\F299";
+}
+.mdi-gate-and::before {
+ content: "\F8E0";
+}
+.mdi-gate-arrow-right::before {
+ content: "\F0194";
+}
+.mdi-gate-nand::before {
+ content: "\F8E1";
+}
+.mdi-gate-nor::before {
+ content: "\F8E2";
+}
+.mdi-gate-not::before {
+ content: "\F8E3";
+}
+.mdi-gate-open::before {
+ content: "\F0195";
+}
+.mdi-gate-or::before {
+ content: "\F8E4";
+}
+.mdi-gate-xnor::before {
+ content: "\F8E5";
+}
+.mdi-gate-xor::before {
+ content: "\F8E6";
+}
+.mdi-gatsby::before {
+ content: "\FE84";
+}
+.mdi-gauge::before {
+ content: "\F29A";
+}
+.mdi-gauge-empty::before {
+ content: "\F872";
+}
+.mdi-gauge-full::before {
+ content: "\F873";
+}
+.mdi-gauge-low::before {
+ content: "\F874";
+}
+.mdi-gavel::before {
+ content: "\F29B";
+}
+.mdi-gender-female::before {
+ content: "\F29C";
+}
+.mdi-gender-male::before {
+ content: "\F29D";
+}
+.mdi-gender-male-female::before {
+ content: "\F29E";
+}
+.mdi-gender-male-female-variant::before {
+ content: "\F016A";
+}
+.mdi-gender-non-binary::before {
+ content: "\F016B";
+}
+.mdi-gender-transgender::before {
+ content: "\F29F";
+}
+.mdi-gentoo::before {
+ content: "\F8E7";
+}
+.mdi-gesture::before {
+ content: "\F7CA";
+}
+.mdi-gesture-double-tap::before {
+ content: "\F73B";
+}
+.mdi-gesture-pinch::before {
+ content: "\FABC";
+}
+.mdi-gesture-spread::before {
+ content: "\FABD";
+}
+.mdi-gesture-swipe::before {
+ content: "\FD52";
+}
+.mdi-gesture-swipe-down::before {
+ content: "\F73C";
+}
+.mdi-gesture-swipe-horizontal::before {
+ content: "\FABE";
+}
+.mdi-gesture-swipe-left::before {
+ content: "\F73D";
+}
+.mdi-gesture-swipe-right::before {
+ content: "\F73E";
+}
+.mdi-gesture-swipe-up::before {
+ content: "\F73F";
+}
+.mdi-gesture-swipe-vertical::before {
+ content: "\FABF";
+}
+.mdi-gesture-tap::before {
+ content: "\F740";
+}
+.mdi-gesture-tap-box::before {
+ content: "\F02D4";
+}
+.mdi-gesture-tap-button::before {
+ content: "\F02D3";
+}
+.mdi-gesture-tap-hold::before {
+ content: "\FD53";
+}
+.mdi-gesture-two-double-tap::before {
+ content: "\F741";
+}
+.mdi-gesture-two-tap::before {
+ content: "\F742";
+}
+.mdi-ghost::before {
+ content: "\F2A0";
+}
+.mdi-ghost-off::before {
+ content: "\F9F4";
+}
+.mdi-gif::before {
+ content: "\FD54";
+}
+.mdi-gift::before {
+ content: "\FE85";
+}
+.mdi-gift-outline::before {
+ content: "\F2A1";
+}
+.mdi-git::before {
+ content: "\F2A2";
+}
+.mdi-github-box::before {
+ content: "\F2A3";
+}
+.mdi-github-circle::before {
+ content: "\F2A4";
+}
+.mdi-github-face::before {
+ content: "\F6DA";
+}
+.mdi-gitlab::before {
+ content: "\FB7C";
+}
+.mdi-glass-cocktail::before {
+ content: "\F356";
+}
+.mdi-glass-flute::before {
+ content: "\F2A5";
+}
+.mdi-glass-mug::before {
+ content: "\F2A6";
+}
+.mdi-glass-mug-variant::before {
+ content: "\F0141";
+}
+.mdi-glass-pint-outline::before {
+ content: "\F0338";
+}
+.mdi-glass-stange::before {
+ content: "\F2A7";
+}
+.mdi-glass-tulip::before {
+ content: "\F2A8";
+}
+.mdi-glass-wine::before {
+ content: "\F875";
+}
+.mdi-glassdoor::before {
+ content: "\F2A9";
+}
+.mdi-glasses::before {
+ content: "\F2AA";
+}
+.mdi-globe-light::before {
+ content: "\F0302";
+}
+.mdi-globe-model::before {
+ content: "\F8E8";
+}
+.mdi-gmail::before {
+ content: "\F2AB";
+}
+.mdi-gnome::before {
+ content: "\F2AC";
+}
+.mdi-go-kart::before {
+ content: "\FD55";
+}
+.mdi-go-kart-track::before {
+ content: "\FD56";
+}
+.mdi-gog::before {
+ content: "\FB7D";
+}
+.mdi-gold::before {
+ content: "\F027A";
+}
+.mdi-golf::before {
+ content: "\F822";
+}
+.mdi-golf-cart::before {
+ content: "\F01CF";
+}
+.mdi-golf-tee::before {
+ content: "\F00AE";
+}
+.mdi-gondola::before {
+ content: "\F685";
+}
+.mdi-goodreads::before {
+ content: "\FD57";
+}
+.mdi-google::before {
+ content: "\F2AD";
+}
+.mdi-google-adwords::before {
+ content: "\FC63";
+}
+.mdi-google-analytics::before {
+ content: "\F7CB";
+}
+.mdi-google-assistant::before {
+ content: "\F7CC";
+}
+.mdi-google-cardboard::before {
+ content: "\F2AE";
+}
+.mdi-google-chrome::before {
+ content: "\F2AF";
+}
+.mdi-google-circles::before {
+ content: "\F2B0";
+}
+.mdi-google-circles-communities::before {
+ content: "\F2B1";
+}
+.mdi-google-circles-extended::before {
+ content: "\F2B2";
+}
+.mdi-google-circles-group::before {
+ content: "\F2B3";
+}
+.mdi-google-classroom::before {
+ content: "\F2C0";
+}
+.mdi-google-cloud::before {
+ content: "\F0221";
+}
+.mdi-google-controller::before {
+ content: "\F2B4";
+}
+.mdi-google-controller-off::before {
+ content: "\F2B5";
+}
+.mdi-google-downasaur::before {
+ content: "\F038D";
+}
+.mdi-google-drive::before {
+ content: "\F2B6";
+}
+.mdi-google-earth::before {
+ content: "\F2B7";
+}
+.mdi-google-fit::before {
+ content: "\F96B";
+}
+.mdi-google-glass::before {
+ content: "\F2B8";
+}
+.mdi-google-hangouts::before {
+ content: "\F2C9";
+}
+.mdi-google-home::before {
+ content: "\F823";
+}
+.mdi-google-keep::before {
+ content: "\F6DB";
+}
+.mdi-google-lens::before {
+ content: "\F9F5";
+}
+.mdi-google-maps::before {
+ content: "\F5F5";
+}
+.mdi-google-my-business::before {
+ content: "\F006A";
+}
+.mdi-google-nearby::before {
+ content: "\F2B9";
+}
+.mdi-google-pages::before {
+ content: "\F2BA";
+}
+.mdi-google-photos::before {
+ content: "\F6DC";
+}
+.mdi-google-physical-web::before {
+ content: "\F2BB";
+}
+.mdi-google-play::before {
+ content: "\F2BC";
+}
+.mdi-google-plus::before {
+ content: "\F2BD";
+}
+.mdi-google-plus-box::before {
+ content: "\F2BE";
+}
+.mdi-google-podcast::before {
+ content: "\FED6";
+}
+.mdi-google-spreadsheet::before {
+ content: "\F9F6";
+}
+.mdi-google-street-view::before {
+ content: "\FC64";
+}
+.mdi-google-translate::before {
+ content: "\F2BF";
+}
+.mdi-gradient::before {
+ content: "\F69F";
+}
+.mdi-grain::before {
+ content: "\FD58";
+}
+.mdi-graph::before {
+ content: "\F006B";
+}
+.mdi-graph-outline::before {
+ content: "\F006C";
+}
+.mdi-graphql::before {
+ content: "\F876";
+}
+.mdi-grave-stone::before {
+ content: "\FB7E";
+}
+.mdi-grease-pencil::before {
+ content: "\F648";
+}
+.mdi-greater-than::before {
+ content: "\F96C";
+}
+.mdi-greater-than-or-equal::before {
+ content: "\F96D";
+}
+.mdi-grid::before {
+ content: "\F2C1";
+}
+.mdi-grid-large::before {
+ content: "\F757";
+}
+.mdi-grid-off::before {
+ content: "\F2C2";
+}
+.mdi-grill::before {
+ content: "\FE86";
+}
+.mdi-grill-outline::before {
+ content: "\F01B5";
+}
+.mdi-group::before {
+ content: "\F2C3";
+}
+.mdi-guitar-acoustic::before {
+ content: "\F770";
+}
+.mdi-guitar-electric::before {
+ content: "\F2C4";
+}
+.mdi-guitar-pick::before {
+ content: "\F2C5";
+}
+.mdi-guitar-pick-outline::before {
+ content: "\F2C6";
+}
+.mdi-guy-fawkes-mask::before {
+ content: "\F824";
+}
+.mdi-hackernews::before {
+ content: "\F624";
+}
+.mdi-hail::before {
+ content: "\FAC0";
+}
+.mdi-hair-dryer::before {
+ content: "\F011A";
+}
+.mdi-hair-dryer-outline::before {
+ content: "\F011B";
+}
+.mdi-halloween::before {
+ content: "\FB7F";
+}
+.mdi-hamburger::before {
+ content: "\F684";
+}
+.mdi-hammer::before {
+ content: "\F8E9";
+}
+.mdi-hammer-screwdriver::before {
+ content: "\F034D";
+}
+.mdi-hammer-wrench::before {
+ content: "\F034E";
+}
+.mdi-hand::before {
+ content: "\FA4E";
+}
+.mdi-hand-heart::before {
+ content: "\F011C";
+}
+.mdi-hand-left::before {
+ content: "\FE87";
+}
+.mdi-hand-okay::before {
+ content: "\FA4F";
+}
+.mdi-hand-peace::before {
+ content: "\FA50";
+}
+.mdi-hand-peace-variant::before {
+ content: "\FA51";
+}
+.mdi-hand-pointing-down::before {
+ content: "\FA52";
+}
+.mdi-hand-pointing-left::before {
+ content: "\FA53";
+}
+.mdi-hand-pointing-right::before {
+ content: "\F2C7";
+}
+.mdi-hand-pointing-up::before {
+ content: "\FA54";
+}
+.mdi-hand-right::before {
+ content: "\FE88";
+}
+.mdi-hand-saw::before {
+ content: "\FE89";
+}
+.mdi-handball::before {
+ content: "\FF70";
+}
+.mdi-handcuffs::before {
+ content: "\F0169";
+}
+.mdi-handshake::before {
+ content: "\F0243";
+}
+.mdi-hanger::before {
+ content: "\F2C8";
+}
+.mdi-hard-hat::before {
+ content: "\F96E";
+}
+.mdi-harddisk::before {
+ content: "\F2CA";
+}
+.mdi-harddisk-plus::before {
+ content: "\F006D";
+}
+.mdi-harddisk-remove::before {
+ content: "\F006E";
+}
+.mdi-hat-fedora::before {
+ content: "\FB80";
+}
+.mdi-hazard-lights::before {
+ content: "\FC65";
+}
+.mdi-hdr::before {
+ content: "\FD59";
+}
+.mdi-hdr-off::before {
+ content: "\FD5A";
+}
+.mdi-head::before {
+ content: "\F0389";
+}
+.mdi-head-alert::before {
+ content: "\F0363";
+}
+.mdi-head-alert-outline::before {
+ content: "\F0364";
+}
+.mdi-head-check::before {
+ content: "\F0365";
+}
+.mdi-head-check-outline::before {
+ content: "\F0366";
+}
+.mdi-head-cog::before {
+ content: "\F0367";
+}
+.mdi-head-cog-outline::before {
+ content: "\F0368";
+}
+.mdi-head-dots-horizontal::before {
+ content: "\F0369";
+}
+.mdi-head-dots-horizontal-outline::before {
+ content: "\F036A";
+}
+.mdi-head-flash::before {
+ content: "\F036B";
+}
+.mdi-head-flash-outline::before {
+ content: "\F036C";
+}
+.mdi-head-heart::before {
+ content: "\F036D";
+}
+.mdi-head-heart-outline::before {
+ content: "\F036E";
+}
+.mdi-head-lightbulb::before {
+ content: "\F036F";
+}
+.mdi-head-lightbulb-outline::before {
+ content: "\F0370";
+}
+.mdi-head-minus::before {
+ content: "\F0371";
+}
+.mdi-head-minus-outline::before {
+ content: "\F0372";
+}
+.mdi-head-outline::before {
+ content: "\F038A";
+}
+.mdi-head-plus::before {
+ content: "\F0373";
+}
+.mdi-head-plus-outline::before {
+ content: "\F0374";
+}
+.mdi-head-question::before {
+ content: "\F0375";
+}
+.mdi-head-question-outline::before {
+ content: "\F0376";
+}
+.mdi-head-remove::before {
+ content: "\F0377";
+}
+.mdi-head-remove-outline::before {
+ content: "\F0378";
+}
+.mdi-head-snowflake::before {
+ content: "\F0379";
+}
+.mdi-head-snowflake-outline::before {
+ content: "\F037A";
+}
+.mdi-head-sync::before {
+ content: "\F037B";
+}
+.mdi-head-sync-outline::before {
+ content: "\F037C";
+}
+.mdi-headphones::before {
+ content: "\F2CB";
+}
+.mdi-headphones-bluetooth::before {
+ content: "\F96F";
+}
+.mdi-headphones-box::before {
+ content: "\F2CC";
+}
+.mdi-headphones-off::before {
+ content: "\F7CD";
+}
+.mdi-headphones-settings::before {
+ content: "\F2CD";
+}
+.mdi-headset::before {
+ content: "\F2CE";
+}
+.mdi-headset-dock::before {
+ content: "\F2CF";
+}
+.mdi-headset-off::before {
+ content: "\F2D0";
+}
+.mdi-heart::before {
+ content: "\F2D1";
+}
+.mdi-heart-box::before {
+ content: "\F2D2";
+}
+.mdi-heart-box-outline::before {
+ content: "\F2D3";
+}
+.mdi-heart-broken::before {
+ content: "\F2D4";
+}
+.mdi-heart-broken-outline::before {
+ content: "\FCF0";
+}
+.mdi-heart-circle::before {
+ content: "\F970";
+}
+.mdi-heart-circle-outline::before {
+ content: "\F971";
+}
+.mdi-heart-flash::before {
+ content: "\FF16";
+}
+.mdi-heart-half::before {
+ content: "\F6DE";
+}
+.mdi-heart-half-full::before {
+ content: "\F6DD";
+}
+.mdi-heart-half-outline::before {
+ content: "\F6DF";
+}
+.mdi-heart-multiple::before {
+ content: "\FA55";
+}
+.mdi-heart-multiple-outline::before {
+ content: "\FA56";
+}
+.mdi-heart-off::before {
+ content: "\F758";
+}
+.mdi-heart-outline::before {
+ content: "\F2D5";
+}
+.mdi-heart-pulse::before {
+ content: "\F5F6";
+}
+.mdi-helicopter::before {
+ content: "\FAC1";
+}
+.mdi-help::before {
+ content: "\F2D6";
+}
+.mdi-help-box::before {
+ content: "\F78A";
+}
+.mdi-help-circle::before {
+ content: "\F2D7";
+}
+.mdi-help-circle-outline::before {
+ content: "\F625";
+}
+.mdi-help-network::before {
+ content: "\F6F4";
+}
+.mdi-help-network-outline::before {
+ content: "\FC66";
+}
+.mdi-help-rhombus::before {
+ content: "\FB81";
+}
+.mdi-help-rhombus-outline::before {
+ content: "\FB82";
+}
+.mdi-hexadecimal::before {
+ content: "\F02D2";
+}
+.mdi-hexagon::before {
+ content: "\F2D8";
+}
+.mdi-hexagon-multiple::before {
+ content: "\F6E0";
+}
+.mdi-hexagon-multiple-outline::before {
+ content: "\F011D";
+}
+.mdi-hexagon-outline::before {
+ content: "\F2D9";
+}
+.mdi-hexagon-slice-1::before {
+ content: "\FAC2";
+}
+.mdi-hexagon-slice-2::before {
+ content: "\FAC3";
+}
+.mdi-hexagon-slice-3::before {
+ content: "\FAC4";
+}
+.mdi-hexagon-slice-4::before {
+ content: "\FAC5";
+}
+.mdi-hexagon-slice-5::before {
+ content: "\FAC6";
+}
+.mdi-hexagon-slice-6::before {
+ content: "\FAC7";
+}
+.mdi-hexagram::before {
+ content: "\FAC8";
+}
+.mdi-hexagram-outline::before {
+ content: "\FAC9";
+}
+.mdi-high-definition::before {
+ content: "\F7CE";
+}
+.mdi-high-definition-box::before {
+ content: "\F877";
+}
+.mdi-highway::before {
+ content: "\F5F7";
+}
+.mdi-hiking::before {
+ content: "\FD5B";
+}
+.mdi-hinduism::before {
+ content: "\F972";
+}
+.mdi-history::before {
+ content: "\F2DA";
+}
+.mdi-hockey-puck::before {
+ content: "\F878";
+}
+.mdi-hockey-sticks::before {
+ content: "\F879";
+}
+.mdi-hololens::before {
+ content: "\F2DB";
+}
+.mdi-home::before {
+ content: "\F2DC";
+}
+.mdi-home-account::before {
+ content: "\F825";
+}
+.mdi-home-alert::before {
+ content: "\F87A";
+}
+.mdi-home-analytics::before {
+ content: "\FED7";
+}
+.mdi-home-assistant::before {
+ content: "\F7CF";
+}
+.mdi-home-automation::before {
+ content: "\F7D0";
+}
+.mdi-home-circle::before {
+ content: "\F7D1";
+}
+.mdi-home-circle-outline::before {
+ content: "\F006F";
+}
+.mdi-home-city::before {
+ content: "\FCF1";
+}
+.mdi-home-city-outline::before {
+ content: "\FCF2";
+}
+.mdi-home-currency-usd::before {
+ content: "\F8AE";
+}
+.mdi-home-edit::before {
+ content: "\F0184";
+}
+.mdi-home-edit-outline::before {
+ content: "\F0185";
+}
+.mdi-home-export-outline::before {
+ content: "\FFB8";
+}
+.mdi-home-flood::before {
+ content: "\FF17";
+}
+.mdi-home-floor-0::before {
+ content: "\FDAE";
+}
+.mdi-home-floor-1::before {
+ content: "\FD5C";
+}
+.mdi-home-floor-2::before {
+ content: "\FD5D";
+}
+.mdi-home-floor-3::before {
+ content: "\FD5E";
+}
+.mdi-home-floor-a::before {
+ content: "\FD5F";
+}
+.mdi-home-floor-b::before {
+ content: "\FD60";
+}
+.mdi-home-floor-g::before {
+ content: "\FD61";
+}
+.mdi-home-floor-l::before {
+ content: "\FD62";
+}
+.mdi-home-floor-negative-1::before {
+ content: "\FDAF";
+}
+.mdi-home-group::before {
+ content: "\FDB0";
+}
+.mdi-home-heart::before {
+ content: "\F826";
+}
+.mdi-home-import-outline::before {
+ content: "\FFB9";
+}
+.mdi-home-lightbulb::before {
+ content: "\F027C";
+}
+.mdi-home-lightbulb-outline::before {
+ content: "\F027D";
+}
+.mdi-home-lock::before {
+ content: "\F8EA";
+}
+.mdi-home-lock-open::before {
+ content: "\F8EB";
+}
+.mdi-home-map-marker::before {
+ content: "\F5F8";
+}
+.mdi-home-minus::before {
+ content: "\F973";
+}
+.mdi-home-modern::before {
+ content: "\F2DD";
+}
+.mdi-home-outline::before {
+ content: "\F6A0";
+}
+.mdi-home-plus::before {
+ content: "\F974";
+}
+.mdi-home-remove::before {
+ content: "\F0272";
+}
+.mdi-home-roof::before {
+ content: "\F0156";
+}
+.mdi-home-thermometer::before {
+ content: "\FF71";
+}
+.mdi-home-thermometer-outline::before {
+ content: "\FF72";
+}
+.mdi-home-variant::before {
+ content: "\F2DE";
+}
+.mdi-home-variant-outline::before {
+ content: "\FB83";
+}
+.mdi-hook::before {
+ content: "\F6E1";
+}
+.mdi-hook-off::before {
+ content: "\F6E2";
+}
+.mdi-hops::before {
+ content: "\F2DF";
+}
+.mdi-horizontal-rotate-clockwise::before {
+ content: "\F011E";
+}
+.mdi-horizontal-rotate-counterclockwise::before {
+ content: "\F011F";
+}
+.mdi-horseshoe::before {
+ content: "\FA57";
+}
+.mdi-hospital::before {
+ content: "\F0017";
+}
+.mdi-hospital-box::before {
+ content: "\F2E0";
+}
+.mdi-hospital-box-outline::before {
+ content: "\F0018";
+}
+.mdi-hospital-building::before {
+ content: "\F2E1";
+}
+.mdi-hospital-marker::before {
+ content: "\F2E2";
+}
+.mdi-hot-tub::before {
+ content: "\F827";
+}
+.mdi-hotel::before {
+ content: "\F2E3";
+}
+.mdi-houzz::before {
+ content: "\F2E4";
+}
+.mdi-houzz-box::before {
+ content: "\F2E5";
+}
+.mdi-hubspot::before {
+ content: "\FCF3";
+}
+.mdi-hulu::before {
+ content: "\F828";
+}
+.mdi-human::before {
+ content: "\F2E6";
+}
+.mdi-human-child::before {
+ content: "\F2E7";
+}
+.mdi-human-female::before {
+ content: "\F649";
+}
+.mdi-human-female-boy::before {
+ content: "\FA58";
+}
+.mdi-human-female-female::before {
+ content: "\FA59";
+}
+.mdi-human-female-girl::before {
+ content: "\FA5A";
+}
+.mdi-human-greeting::before {
+ content: "\F64A";
+}
+.mdi-human-handsdown::before {
+ content: "\F64B";
+}
+.mdi-human-handsup::before {
+ content: "\F64C";
+}
+.mdi-human-male::before {
+ content: "\F64D";
+}
+.mdi-human-male-boy::before {
+ content: "\FA5B";
+}
+.mdi-human-male-female::before {
+ content: "\F2E8";
+}
+.mdi-human-male-girl::before {
+ content: "\FA5C";
+}
+.mdi-human-male-height::before {
+ content: "\FF18";
+}
+.mdi-human-male-height-variant::before {
+ content: "\FF19";
+}
+.mdi-human-male-male::before {
+ content: "\FA5D";
+}
+.mdi-human-pregnant::before {
+ content: "\F5CF";
+}
+.mdi-humble-bundle::before {
+ content: "\F743";
+}
+.mdi-hvac::before {
+ content: "\F037D";
+}
+.mdi-hydraulic-oil-level::before {
+ content: "\F034F";
+}
+.mdi-hydraulic-oil-temperature::before {
+ content: "\F0350";
+}
+.mdi-hydro-power::before {
+ content: "\F0310";
+}
+.mdi-ice-cream::before {
+ content: "\F829";
+}
+.mdi-ice-pop::before {
+ content: "\FF1A";
+}
+.mdi-id-card::before {
+ content: "\FFE0";
+}
+.mdi-identifier::before {
+ content: "\FF1B";
+}
+.mdi-ideogram-cjk::before {
+ content: "\F035C";
+}
+.mdi-ideogram-cjk-variant::before {
+ content: "\F035D";
+}
+.mdi-iframe::before {
+ content: "\FC67";
+}
+.mdi-iframe-array::before {
+ content: "\F0120";
+}
+.mdi-iframe-array-outline::before {
+ content: "\F0121";
+}
+.mdi-iframe-braces::before {
+ content: "\F0122";
+}
+.mdi-iframe-braces-outline::before {
+ content: "\F0123";
+}
+.mdi-iframe-outline::before {
+ content: "\FC68";
+}
+.mdi-iframe-parentheses::before {
+ content: "\F0124";
+}
+.mdi-iframe-parentheses-outline::before {
+ content: "\F0125";
+}
+.mdi-iframe-variable::before {
+ content: "\F0126";
+}
+.mdi-iframe-variable-outline::before {
+ content: "\F0127";
+}
+.mdi-image::before {
+ content: "\F2E9";
+}
+.mdi-image-album::before {
+ content: "\F2EA";
+}
+.mdi-image-area::before {
+ content: "\F2EB";
+}
+.mdi-image-area-close::before {
+ content: "\F2EC";
+}
+.mdi-image-auto-adjust::before {
+ content: "\FFE1";
+}
+.mdi-image-broken::before {
+ content: "\F2ED";
+}
+.mdi-image-broken-variant::before {
+ content: "\F2EE";
+}
+.mdi-image-edit::before {
+ content: "\F020E";
+}
+.mdi-image-edit-outline::before {
+ content: "\F020F";
+}
+.mdi-image-filter::before {
+ content: "\F2EF";
+}
+.mdi-image-filter-black-white::before {
+ content: "\F2F0";
+}
+.mdi-image-filter-center-focus::before {
+ content: "\F2F1";
+}
+.mdi-image-filter-center-focus-strong::before {
+ content: "\FF1C";
+}
+.mdi-image-filter-center-focus-strong-outline::before {
+ content: "\FF1D";
+}
+.mdi-image-filter-center-focus-weak::before {
+ content: "\F2F2";
+}
+.mdi-image-filter-drama::before {
+ content: "\F2F3";
+}
+.mdi-image-filter-frames::before {
+ content: "\F2F4";
+}
+.mdi-image-filter-hdr::before {
+ content: "\F2F5";
+}
+.mdi-image-filter-none::before {
+ content: "\F2F6";
+}
+.mdi-image-filter-tilt-shift::before {
+ content: "\F2F7";
+}
+.mdi-image-filter-vintage::before {
+ content: "\F2F8";
+}
+.mdi-image-frame::before {
+ content: "\FE8A";
+}
+.mdi-image-move::before {
+ content: "\F9F7";
+}
+.mdi-image-multiple::before {
+ content: "\F2F9";
+}
+.mdi-image-off::before {
+ content: "\F82A";
+}
+.mdi-image-off-outline::before {
+ content: "\F01FC";
+}
+.mdi-image-outline::before {
+ content: "\F975";
+}
+.mdi-image-plus::before {
+ content: "\F87B";
+}
+.mdi-image-search::before {
+ content: "\F976";
+}
+.mdi-image-search-outline::before {
+ content: "\F977";
+}
+.mdi-image-size-select-actual::before {
+ content: "\FC69";
+}
+.mdi-image-size-select-large::before {
+ content: "\FC6A";
+}
+.mdi-image-size-select-small::before {
+ content: "\FC6B";
+}
+.mdi-import::before {
+ content: "\F2FA";
+}
+.mdi-inbox::before {
+ content: "\F686";
+}
+.mdi-inbox-arrow-down::before {
+ content: "\F2FB";
+}
+.mdi-inbox-arrow-down-outline::before {
+ content: "\F029B";
+}
+.mdi-inbox-arrow-up::before {
+ content: "\F3D1";
+}
+.mdi-inbox-arrow-up-outline::before {
+ content: "\F029C";
+}
+.mdi-inbox-full::before {
+ content: "\F029D";
+}
+.mdi-inbox-full-outline::before {
+ content: "\F029E";
+}
+.mdi-inbox-multiple::before {
+ content: "\F8AF";
+}
+.mdi-inbox-multiple-outline::before {
+ content: "\FB84";
+}
+.mdi-inbox-outline::before {
+ content: "\F029F";
+}
+.mdi-incognito::before {
+ content: "\F5F9";
+}
+.mdi-infinity::before {
+ content: "\F6E3";
+}
+.mdi-information::before {
+ content: "\F2FC";
+}
+.mdi-information-outline::before {
+ content: "\F2FD";
+}
+.mdi-information-variant::before {
+ content: "\F64E";
+}
+.mdi-instagram::before {
+ content: "\F2FE";
+}
+.mdi-instapaper::before {
+ content: "\F2FF";
+}
+.mdi-instrument-triangle::before {
+ content: "\F0070";
+}
+.mdi-internet-explorer::before {
+ content: "\F300";
+}
+.mdi-invert-colors::before {
+ content: "\F301";
+}
+.mdi-invert-colors-off::before {
+ content: "\FE8B";
+}
+.mdi-iobroker::before {
+ content: "\F0313";
+}
+.mdi-ip::before {
+ content: "\FA5E";
+}
+.mdi-ip-network::before {
+ content: "\FA5F";
+}
+.mdi-ip-network-outline::before {
+ content: "\FC6C";
+}
+.mdi-ipod::before {
+ content: "\FC6D";
+}
+.mdi-islam::before {
+ content: "\F978";
+}
+.mdi-island::before {
+ content: "\F0071";
+}
+.mdi-itunes::before {
+ content: "\F676";
+}
+.mdi-iv-bag::before {
+ content: "\F00E4";
+}
+.mdi-jabber::before {
+ content: "\FDB1";
+}
+.mdi-jeepney::before {
+ content: "\F302";
+}
+.mdi-jellyfish::before {
+ content: "\FF1E";
+}
+.mdi-jellyfish-outline::before {
+ content: "\FF1F";
+}
+.mdi-jira::before {
+ content: "\F303";
+}
+.mdi-jquery::before {
+ content: "\F87C";
+}
+.mdi-jsfiddle::before {
+ content: "\F304";
+}
+.mdi-json::before {
+ content: "\F626";
+}
+.mdi-judaism::before {
+ content: "\F979";
+}
+.mdi-jump-rope::before {
+ content: "\F032A";
+}
+.mdi-kabaddi::before {
+ content: "\FD63";
+}
+.mdi-karate::before {
+ content: "\F82B";
+}
+.mdi-keg::before {
+ content: "\F305";
+}
+.mdi-kettle::before {
+ content: "\F5FA";
+}
+.mdi-kettle-alert::before {
+ content: "\F0342";
+}
+.mdi-kettle-alert-outline::before {
+ content: "\F0343";
+}
+.mdi-kettle-off::before {
+ content: "\F0346";
+}
+.mdi-kettle-off-outline::before {
+ content: "\F0347";
+}
+.mdi-kettle-outline::before {
+ content: "\FF73";
+}
+.mdi-kettle-steam::before {
+ content: "\F0344";
+}
+.mdi-kettle-steam-outline::before {
+ content: "\F0345";
+}
+.mdi-kettlebell::before {
+ content: "\F032B";
+}
+.mdi-key::before {
+ content: "\F306";
+}
+.mdi-key-arrow-right::before {
+ content: "\F033D";
+}
+.mdi-key-change::before {
+ content: "\F307";
+}
+.mdi-key-link::before {
+ content: "\F01CA";
+}
+.mdi-key-minus::before {
+ content: "\F308";
+}
+.mdi-key-outline::before {
+ content: "\FDB2";
+}
+.mdi-key-plus::before {
+ content: "\F309";
+}
+.mdi-key-remove::before {
+ content: "\F30A";
+}
+.mdi-key-star::before {
+ content: "\F01C9";
+}
+.mdi-key-variant::before {
+ content: "\F30B";
+}
+.mdi-key-wireless::before {
+ content: "\FFE2";
+}
+.mdi-keyboard::before {
+ content: "\F30C";
+}
+.mdi-keyboard-backspace::before {
+ content: "\F30D";
+}
+.mdi-keyboard-caps::before {
+ content: "\F30E";
+}
+.mdi-keyboard-close::before {
+ content: "\F30F";
+}
+.mdi-keyboard-esc::before {
+ content: "\F02E2";
+}
+.mdi-keyboard-f1::before {
+ content: "\F02D6";
+}
+.mdi-keyboard-f10::before {
+ content: "\F02DF";
+}
+.mdi-keyboard-f11::before {
+ content: "\F02E0";
+}
+.mdi-keyboard-f12::before {
+ content: "\F02E1";
+}
+.mdi-keyboard-f2::before {
+ content: "\F02D7";
+}
+.mdi-keyboard-f3::before {
+ content: "\F02D8";
+}
+.mdi-keyboard-f4::before {
+ content: "\F02D9";
+}
+.mdi-keyboard-f5::before {
+ content: "\F02DA";
+}
+.mdi-keyboard-f6::before {
+ content: "\F02DB";
+}
+.mdi-keyboard-f7::before {
+ content: "\F02DC";
+}
+.mdi-keyboard-f8::before {
+ content: "\F02DD";
+}
+.mdi-keyboard-f9::before {
+ content: "\F02DE";
+}
+.mdi-keyboard-off::before {
+ content: "\F310";
+}
+.mdi-keyboard-off-outline::before {
+ content: "\FE8C";
+}
+.mdi-keyboard-outline::before {
+ content: "\F97A";
+}
+.mdi-keyboard-return::before {
+ content: "\F311";
+}
+.mdi-keyboard-settings::before {
+ content: "\F9F8";
+}
+.mdi-keyboard-settings-outline::before {
+ content: "\F9F9";
+}
+.mdi-keyboard-space::before {
+ content: "\F0072";
+}
+.mdi-keyboard-tab::before {
+ content: "\F312";
+}
+.mdi-keyboard-variant::before {
+ content: "\F313";
+}
+.mdi-khanda::before {
+ content: "\F0128";
+}
+.mdi-kickstarter::before {
+ content: "\F744";
+}
+.mdi-klingon::before {
+ content: "\F0386";
+}
+.mdi-knife::before {
+ content: "\F9FA";
+}
+.mdi-knife-military::before {
+ content: "\F9FB";
+}
+.mdi-kodi::before {
+ content: "\F314";
+}
+.mdi-kotlin::before {
+ content: "\F0244";
+}
+.mdi-kubernetes::before {
+ content: "\F0129";
+}
+.mdi-label::before {
+ content: "\F315";
+}
+.mdi-label-multiple::before {
+ content: "\F03A0";
+}
+.mdi-label-multiple-outline::before {
+ content: "\F03A1";
+}
+.mdi-label-off::before {
+ content: "\FACA";
+}
+.mdi-label-off-outline::before {
+ content: "\FACB";
+}
+.mdi-label-outline::before {
+ content: "\F316";
+}
+.mdi-label-percent::before {
+ content: "\F0315";
+}
+.mdi-label-percent-outline::before {
+ content: "\F0316";
+}
+.mdi-label-variant::before {
+ content: "\FACC";
+}
+.mdi-label-variant-outline::before {
+ content: "\FACD";
+}
+.mdi-ladybug::before {
+ content: "\F82C";
+}
+.mdi-lambda::before {
+ content: "\F627";
+}
+.mdi-lamp::before {
+ content: "\F6B4";
+}
+.mdi-lan::before {
+ content: "\F317";
+}
+.mdi-lan-check::before {
+ content: "\F02D5";
+}
+.mdi-lan-connect::before {
+ content: "\F318";
+}
+.mdi-lan-disconnect::before {
+ content: "\F319";
+}
+.mdi-lan-pending::before {
+ content: "\F31A";
+}
+.mdi-language-c::before {
+ content: "\F671";
+}
+.mdi-language-cpp::before {
+ content: "\F672";
+}
+.mdi-language-csharp::before {
+ content: "\F31B";
+}
+.mdi-language-css3::before {
+ content: "\F31C";
+}
+.mdi-language-fortran::before {
+ content: "\F0245";
+}
+.mdi-language-go::before {
+ content: "\F7D2";
+}
+.mdi-language-haskell::before {
+ content: "\FC6E";
+}
+.mdi-language-html5::before {
+ content: "\F31D";
+}
+.mdi-language-java::before {
+ content: "\FB1C";
+}
+.mdi-language-javascript::before {
+ content: "\F31E";
+}
+.mdi-language-lua::before {
+ content: "\F8B0";
+}
+.mdi-language-php::before {
+ content: "\F31F";
+}
+.mdi-language-python::before {
+ content: "\F320";
+}
+.mdi-language-python-text::before {
+ content: "\F321";
+}
+.mdi-language-r::before {
+ content: "\F7D3";
+}
+.mdi-language-ruby-on-rails::before {
+ content: "\FACE";
+}
+.mdi-language-swift::before {
+ content: "\F6E4";
+}
+.mdi-language-typescript::before {
+ content: "\F6E5";
+}
+.mdi-laptop::before {
+ content: "\F322";
+}
+.mdi-laptop-chromebook::before {
+ content: "\F323";
+}
+.mdi-laptop-mac::before {
+ content: "\F324";
+}
+.mdi-laptop-off::before {
+ content: "\F6E6";
+}
+.mdi-laptop-windows::before {
+ content: "\F325";
+}
+.mdi-laravel::before {
+ content: "\FACF";
+}
+.mdi-lasso::before {
+ content: "\FF20";
+}
+.mdi-lastfm::before {
+ content: "\F326";
+}
+.mdi-lastpass::before {
+ content: "\F446";
+}
+.mdi-latitude::before {
+ content: "\FF74";
+}
+.mdi-launch::before {
+ content: "\F327";
+}
+.mdi-lava-lamp::before {
+ content: "\F7D4";
+}
+.mdi-layers::before {
+ content: "\F328";
+}
+.mdi-layers-minus::before {
+ content: "\FE8D";
+}
+.mdi-layers-off::before {
+ content: "\F329";
+}
+.mdi-layers-off-outline::before {
+ content: "\F9FC";
+}
+.mdi-layers-outline::before {
+ content: "\F9FD";
+}
+.mdi-layers-plus::before {
+ content: "\FE30";
+}
+.mdi-layers-remove::before {
+ content: "\FE31";
+}
+.mdi-layers-search::before {
+ content: "\F0231";
+}
+.mdi-layers-search-outline::before {
+ content: "\F0232";
+}
+.mdi-layers-triple::before {
+ content: "\FF75";
+}
+.mdi-layers-triple-outline::before {
+ content: "\FF76";
+}
+.mdi-lead-pencil::before {
+ content: "\F64F";
+}
+.mdi-leaf::before {
+ content: "\F32A";
+}
+.mdi-leaf-maple::before {
+ content: "\FC6F";
+}
+.mdi-leaf-maple-off::before {
+ content: "\F0305";
+}
+.mdi-leaf-off::before {
+ content: "\F0304";
+}
+.mdi-leak::before {
+ content: "\FDB3";
+}
+.mdi-leak-off::before {
+ content: "\FDB4";
+}
+.mdi-led-off::before {
+ content: "\F32B";
+}
+.mdi-led-on::before {
+ content: "\F32C";
+}
+.mdi-led-outline::before {
+ content: "\F32D";
+}
+.mdi-led-strip::before {
+ content: "\F7D5";
+}
+.mdi-led-strip-variant::before {
+ content: "\F0073";
+}
+.mdi-led-variant-off::before {
+ content: "\F32E";
+}
+.mdi-led-variant-on::before {
+ content: "\F32F";
+}
+.mdi-led-variant-outline::before {
+ content: "\F330";
+}
+.mdi-leek::before {
+ content: "\F01A8";
+}
+.mdi-less-than::before {
+ content: "\F97B";
+}
+.mdi-less-than-or-equal::before {
+ content: "\F97C";
+}
+.mdi-library::before {
+ content: "\F331";
+}
+.mdi-library-books::before {
+ content: "\F332";
+}
+.mdi-library-movie::before {
+ content: "\FCF4";
+}
+.mdi-library-music::before {
+ content: "\F333";
+}
+.mdi-library-music-outline::before {
+ content: "\FF21";
+}
+.mdi-library-shelves::before {
+ content: "\FB85";
+}
+.mdi-library-video::before {
+ content: "\FCF5";
+}
+.mdi-license::before {
+ content: "\FFE3";
+}
+.mdi-lifebuoy::before {
+ content: "\F87D";
+}
+.mdi-light-switch::before {
+ content: "\F97D";
+}
+.mdi-lightbulb::before {
+ content: "\F335";
+}
+.mdi-lightbulb-cfl::before {
+ content: "\F0233";
+}
+.mdi-lightbulb-cfl-off::before {
+ content: "\F0234";
+}
+.mdi-lightbulb-cfl-spiral::before {
+ content: "\F02A0";
+}
+.mdi-lightbulb-cfl-spiral-off::before {
+ content: "\F02EE";
+}
+.mdi-lightbulb-group::before {
+ content: "\F027E";
+}
+.mdi-lightbulb-group-off::before {
+ content: "\F02F8";
+}
+.mdi-lightbulb-group-off-outline::before {
+ content: "\F02F9";
+}
+.mdi-lightbulb-group-outline::before {
+ content: "\F027F";
+}
+.mdi-lightbulb-multiple::before {
+ content: "\F0280";
+}
+.mdi-lightbulb-multiple-off::before {
+ content: "\F02FA";
+}
+.mdi-lightbulb-multiple-off-outline::before {
+ content: "\F02FB";
+}
+.mdi-lightbulb-multiple-outline::before {
+ content: "\F0281";
+}
+.mdi-lightbulb-off::before {
+ content: "\FE32";
+}
+.mdi-lightbulb-off-outline::before {
+ content: "\FE33";
+}
+.mdi-lightbulb-on::before {
+ content: "\F6E7";
+}
+.mdi-lightbulb-on-outline::before {
+ content: "\F6E8";
+}
+.mdi-lightbulb-outline::before {
+ content: "\F336";
+}
+.mdi-lighthouse::before {
+ content: "\F9FE";
+}
+.mdi-lighthouse-on::before {
+ content: "\F9FF";
+}
+.mdi-link::before {
+ content: "\F337";
+}
+.mdi-link-box::before {
+ content: "\FCF6";
+}
+.mdi-link-box-outline::before {
+ content: "\FCF7";
+}
+.mdi-link-box-variant::before {
+ content: "\FCF8";
+}
+.mdi-link-box-variant-outline::before {
+ content: "\FCF9";
+}
+.mdi-link-lock::before {
+ content: "\F00E5";
+}
+.mdi-link-off::before {
+ content: "\F338";
+}
+.mdi-link-plus::before {
+ content: "\FC70";
+}
+.mdi-link-variant::before {
+ content: "\F339";
+}
+.mdi-link-variant-minus::before {
+ content: "\F012A";
+}
+.mdi-link-variant-off::before {
+ content: "\F33A";
+}
+.mdi-link-variant-plus::before {
+ content: "\F012B";
+}
+.mdi-link-variant-remove::before {
+ content: "\F012C";
+}
+.mdi-linkedin::before {
+ content: "\F33B";
+}
+.mdi-linkedin-box::before {
+ content: "\F33C";
+}
+.mdi-linux::before {
+ content: "\F33D";
+}
+.mdi-linux-mint::before {
+ content: "\F8EC";
+}
+.mdi-litecoin::before {
+ content: "\FA60";
+}
+.mdi-loading::before {
+ content: "\F771";
+}
+.mdi-location-enter::before {
+ content: "\FFE4";
+}
+.mdi-location-exit::before {
+ content: "\FFE5";
+}
+.mdi-lock::before {
+ content: "\F33E";
+}
+.mdi-lock-alert::before {
+ content: "\F8ED";
+}
+.mdi-lock-clock::before {
+ content: "\F97E";
+}
+.mdi-lock-open::before {
+ content: "\F33F";
+}
+.mdi-lock-open-outline::before {
+ content: "\F340";
+}
+.mdi-lock-open-variant::before {
+ content: "\FFE6";
+}
+.mdi-lock-open-variant-outline::before {
+ content: "\FFE7";
+}
+.mdi-lock-outline::before {
+ content: "\F341";
+}
+.mdi-lock-pattern::before {
+ content: "\F6E9";
+}
+.mdi-lock-plus::before {
+ content: "\F5FB";
+}
+.mdi-lock-question::before {
+ content: "\F8EE";
+}
+.mdi-lock-reset::before {
+ content: "\F772";
+}
+.mdi-lock-smart::before {
+ content: "\F8B1";
+}
+.mdi-locker::before {
+ content: "\F7D6";
+}
+.mdi-locker-multiple::before {
+ content: "\F7D7";
+}
+.mdi-login::before {
+ content: "\F342";
+}
+.mdi-login-variant::before {
+ content: "\F5FC";
+}
+.mdi-logout::before {
+ content: "\F343";
+}
+.mdi-logout-variant::before {
+ content: "\F5FD";
+}
+.mdi-longitude::before {
+ content: "\FF77";
+}
+.mdi-looks::before {
+ content: "\F344";
+}
+.mdi-loupe::before {
+ content: "\F345";
+}
+.mdi-lumx::before {
+ content: "\F346";
+}
+.mdi-lungs::before {
+ content: "\F00AF";
+}
+.mdi-lyft::before {
+ content: "\FB1D";
+}
+.mdi-magnet::before {
+ content: "\F347";
+}
+.mdi-magnet-on::before {
+ content: "\F348";
+}
+.mdi-magnify::before {
+ content: "\F349";
+}
+.mdi-magnify-close::before {
+ content: "\F97F";
+}
+.mdi-magnify-minus::before {
+ content: "\F34A";
+}
+.mdi-magnify-minus-cursor::before {
+ content: "\FA61";
+}
+.mdi-magnify-minus-outline::before {
+ content: "\F6EB";
+}
+.mdi-magnify-plus::before {
+ content: "\F34B";
+}
+.mdi-magnify-plus-cursor::before {
+ content: "\FA62";
+}
+.mdi-magnify-plus-outline::before {
+ content: "\F6EC";
+}
+.mdi-magnify-remove-cursor::before {
+ content: "\F0237";
+}
+.mdi-magnify-remove-outline::before {
+ content: "\F0238";
+}
+.mdi-magnify-scan::before {
+ content: "\F02A1";
+}
+.mdi-mail::before {
+ content: "\FED8";
+}
+.mdi-mail-ru::before {
+ content: "\F34C";
+}
+.mdi-mailbox::before {
+ content: "\F6ED";
+}
+.mdi-mailbox-open::before {
+ content: "\FD64";
+}
+.mdi-mailbox-open-outline::before {
+ content: "\FD65";
+}
+.mdi-mailbox-open-up::before {
+ content: "\FD66";
+}
+.mdi-mailbox-open-up-outline::before {
+ content: "\FD67";
+}
+.mdi-mailbox-outline::before {
+ content: "\FD68";
+}
+.mdi-mailbox-up::before {
+ content: "\FD69";
+}
+.mdi-mailbox-up-outline::before {
+ content: "\FD6A";
+}
+.mdi-map::before {
+ content: "\F34D";
+}
+.mdi-map-check::before {
+ content: "\FED9";
+}
+.mdi-map-check-outline::before {
+ content: "\FEDA";
+}
+.mdi-map-clock::before {
+ content: "\FCFA";
+}
+.mdi-map-clock-outline::before {
+ content: "\FCFB";
+}
+.mdi-map-legend::before {
+ content: "\FA00";
+}
+.mdi-map-marker::before {
+ content: "\F34E";
+}
+.mdi-map-marker-alert::before {
+ content: "\FF22";
+}
+.mdi-map-marker-alert-outline::before {
+ content: "\FF23";
+}
+.mdi-map-marker-check::before {
+ content: "\FC71";
+}
+.mdi-map-marker-check-outline::before {
+ content: "\F0326";
+}
+.mdi-map-marker-circle::before {
+ content: "\F34F";
+}
+.mdi-map-marker-distance::before {
+ content: "\F8EF";
+}
+.mdi-map-marker-down::before {
+ content: "\F012D";
+}
+.mdi-map-marker-left::before {
+ content: "\F0306";
+}
+.mdi-map-marker-left-outline::before {
+ content: "\F0308";
+}
+.mdi-map-marker-minus::before {
+ content: "\F650";
+}
+.mdi-map-marker-minus-outline::before {
+ content: "\F0324";
+}
+.mdi-map-marker-multiple::before {
+ content: "\F350";
+}
+.mdi-map-marker-multiple-outline::before {
+ content: "\F02A2";
+}
+.mdi-map-marker-off::before {
+ content: "\F351";
+}
+.mdi-map-marker-off-outline::before {
+ content: "\F0328";
+}
+.mdi-map-marker-outline::before {
+ content: "\F7D8";
+}
+.mdi-map-marker-path::before {
+ content: "\FCFC";
+}
+.mdi-map-marker-plus::before {
+ content: "\F651";
+}
+.mdi-map-marker-plus-outline::before {
+ content: "\F0323";
+}
+.mdi-map-marker-question::before {
+ content: "\FF24";
+}
+.mdi-map-marker-question-outline::before {
+ content: "\FF25";
+}
+.mdi-map-marker-radius::before {
+ content: "\F352";
+}
+.mdi-map-marker-radius-outline::before {
+ content: "\F0327";
+}
+.mdi-map-marker-remove::before {
+ content: "\FF26";
+}
+.mdi-map-marker-remove-outline::before {
+ content: "\F0325";
+}
+.mdi-map-marker-remove-variant::before {
+ content: "\FF27";
+}
+.mdi-map-marker-right::before {
+ content: "\F0307";
+}
+.mdi-map-marker-right-outline::before {
+ content: "\F0309";
+}
+.mdi-map-marker-up::before {
+ content: "\F012E";
+}
+.mdi-map-minus::before {
+ content: "\F980";
+}
+.mdi-map-outline::before {
+ content: "\F981";
+}
+.mdi-map-plus::before {
+ content: "\F982";
+}
+.mdi-map-search::before {
+ content: "\F983";
+}
+.mdi-map-search-outline::before {
+ content: "\F984";
+}
+.mdi-mapbox::before {
+ content: "\FB86";
+}
+.mdi-margin::before {
+ content: "\F353";
+}
+.mdi-markdown::before {
+ content: "\F354";
+}
+.mdi-markdown-outline::before {
+ content: "\FF78";
+}
+.mdi-marker::before {
+ content: "\F652";
+}
+.mdi-marker-cancel::before {
+ content: "\FDB5";
+}
+.mdi-marker-check::before {
+ content: "\F355";
+}
+.mdi-mastodon::before {
+ content: "\FAD0";
+}
+.mdi-mastodon-variant::before {
+ content: "\FAD1";
+}
+.mdi-material-design::before {
+ content: "\F985";
+}
+.mdi-material-ui::before {
+ content: "\F357";
+}
+.mdi-math-compass::before {
+ content: "\F358";
+}
+.mdi-math-cos::before {
+ content: "\FC72";
+}
+.mdi-math-integral::before {
+ content: "\FFE8";
+}
+.mdi-math-integral-box::before {
+ content: "\FFE9";
+}
+.mdi-math-log::before {
+ content: "\F00B0";
+}
+.mdi-math-norm::before {
+ content: "\FFEA";
+}
+.mdi-math-norm-box::before {
+ content: "\FFEB";
+}
+.mdi-math-sin::before {
+ content: "\FC73";
+}
+.mdi-math-tan::before {
+ content: "\FC74";
+}
+.mdi-matrix::before {
+ content: "\F628";
+}
+.mdi-medal::before {
+ content: "\F986";
+}
+.mdi-medal-outline::before {
+ content: "\F0351";
+}
+.mdi-medical-bag::before {
+ content: "\F6EE";
+}
+.mdi-meditation::before {
+ content: "\F01A6";
+}
+.mdi-medium::before {
+ content: "\F35A";
+}
+.mdi-meetup::before {
+ content: "\FAD2";
+}
+.mdi-memory::before {
+ content: "\F35B";
+}
+.mdi-menu::before {
+ content: "\F35C";
+}
+.mdi-menu-down::before {
+ content: "\F35D";
+}
+.mdi-menu-down-outline::before {
+ content: "\F6B5";
+}
+.mdi-menu-left::before {
+ content: "\F35E";
+}
+.mdi-menu-left-outline::before {
+ content: "\FA01";
+}
+.mdi-menu-open::before {
+ content: "\FB87";
+}
+.mdi-menu-right::before {
+ content: "\F35F";
+}
+.mdi-menu-right-outline::before {
+ content: "\FA02";
+}
+.mdi-menu-swap::before {
+ content: "\FA63";
+}
+.mdi-menu-swap-outline::before {
+ content: "\FA64";
+}
+.mdi-menu-up::before {
+ content: "\F360";
+}
+.mdi-menu-up-outline::before {
+ content: "\F6B6";
+}
+.mdi-merge::before {
+ content: "\FF79";
+}
+.mdi-message::before {
+ content: "\F361";
+}
+.mdi-message-alert::before {
+ content: "\F362";
+}
+.mdi-message-alert-outline::before {
+ content: "\FA03";
+}
+.mdi-message-arrow-left::before {
+ content: "\F031D";
+}
+.mdi-message-arrow-left-outline::before {
+ content: "\F031E";
+}
+.mdi-message-arrow-right::before {
+ content: "\F031F";
+}
+.mdi-message-arrow-right-outline::before {
+ content: "\F0320";
+}
+.mdi-message-bulleted::before {
+ content: "\F6A1";
+}
+.mdi-message-bulleted-off::before {
+ content: "\F6A2";
+}
+.mdi-message-draw::before {
+ content: "\F363";
+}
+.mdi-message-image::before {
+ content: "\F364";
+}
+.mdi-message-image-outline::before {
+ content: "\F0197";
+}
+.mdi-message-lock::before {
+ content: "\FFEC";
+}
+.mdi-message-lock-outline::before {
+ content: "\F0198";
+}
+.mdi-message-minus::before {
+ content: "\F0199";
+}
+.mdi-message-minus-outline::before {
+ content: "\F019A";
+}
+.mdi-message-outline::before {
+ content: "\F365";
+}
+.mdi-message-plus::before {
+ content: "\F653";
+}
+.mdi-message-plus-outline::before {
+ content: "\F00E6";
+}
+.mdi-message-processing::before {
+ content: "\F366";
+}
+.mdi-message-processing-outline::before {
+ content: "\F019B";
+}
+.mdi-message-reply::before {
+ content: "\F367";
+}
+.mdi-message-reply-text::before {
+ content: "\F368";
+}
+.mdi-message-settings::before {
+ content: "\F6EF";
+}
+.mdi-message-settings-outline::before {
+ content: "\F019C";
+}
+.mdi-message-settings-variant::before {
+ content: "\F6F0";
+}
+.mdi-message-settings-variant-outline::before {
+ content: "\F019D";
+}
+.mdi-message-text::before {
+ content: "\F369";
+}
+.mdi-message-text-clock::before {
+ content: "\F019E";
+}
+.mdi-message-text-clock-outline::before {
+ content: "\F019F";
+}
+.mdi-message-text-lock::before {
+ content: "\FFED";
+}
+.mdi-message-text-lock-outline::before {
+ content: "\F01A0";
+}
+.mdi-message-text-outline::before {
+ content: "\F36A";
+}
+.mdi-message-video::before {
+ content: "\F36B";
+}
+.mdi-meteor::before {
+ content: "\F629";
+}
+.mdi-metronome::before {
+ content: "\F7D9";
+}
+.mdi-metronome-tick::before {
+ content: "\F7DA";
+}
+.mdi-micro-sd::before {
+ content: "\F7DB";
+}
+.mdi-microphone::before {
+ content: "\F36C";
+}
+.mdi-microphone-minus::before {
+ content: "\F8B2";
+}
+.mdi-microphone-off::before {
+ content: "\F36D";
+}
+.mdi-microphone-outline::before {
+ content: "\F36E";
+}
+.mdi-microphone-plus::before {
+ content: "\F8B3";
+}
+.mdi-microphone-settings::before {
+ content: "\F36F";
+}
+.mdi-microphone-variant::before {
+ content: "\F370";
+}
+.mdi-microphone-variant-off::before {
+ content: "\F371";
+}
+.mdi-microscope::before {
+ content: "\F654";
+}
+.mdi-microsoft::before {
+ content: "\F372";
+}
+.mdi-microsoft-dynamics::before {
+ content: "\F987";
+}
+.mdi-microwave::before {
+ content: "\FC75";
+}
+.mdi-middleware::before {
+ content: "\FF7A";
+}
+.mdi-middleware-outline::before {
+ content: "\FF7B";
+}
+.mdi-midi::before {
+ content: "\F8F0";
+}
+.mdi-midi-port::before {
+ content: "\F8F1";
+}
+.mdi-mine::before {
+ content: "\FDB6";
+}
+.mdi-minecraft::before {
+ content: "\F373";
+}
+.mdi-mini-sd::before {
+ content: "\FA04";
+}
+.mdi-minidisc::before {
+ content: "\FA05";
+}
+.mdi-minus::before {
+ content: "\F374";
+}
+.mdi-minus-box::before {
+ content: "\F375";
+}
+.mdi-minus-box-multiple::before {
+ content: "\F016C";
+}
+.mdi-minus-box-multiple-outline::before {
+ content: "\F016D";
+}
+.mdi-minus-box-outline::before {
+ content: "\F6F1";
+}
+.mdi-minus-circle::before {
+ content: "\F376";
+}
+.mdi-minus-circle-outline::before {
+ content: "\F377";
+}
+.mdi-minus-network::before {
+ content: "\F378";
+}
+.mdi-minus-network-outline::before {
+ content: "\FC76";
+}
+.mdi-mirror::before {
+ content: "\F0228";
+}
+.mdi-mixcloud::before {
+ content: "\F62A";
+}
+.mdi-mixed-martial-arts::before {
+ content: "\FD6B";
+}
+.mdi-mixed-reality::before {
+ content: "\F87E";
+}
+.mdi-mixer::before {
+ content: "\F7DC";
+}
+.mdi-molecule::before {
+ content: "\FB88";
+}
+.mdi-monitor::before {
+ content: "\F379";
+}
+.mdi-monitor-cellphone::before {
+ content: "\F988";
+}
+.mdi-monitor-cellphone-star::before {
+ content: "\F989";
+}
+.mdi-monitor-clean::before {
+ content: "\F012F";
+}
+.mdi-monitor-dashboard::before {
+ content: "\FA06";
+}
+.mdi-monitor-edit::before {
+ content: "\F02F1";
+}
+.mdi-monitor-lock::before {
+ content: "\FDB7";
+}
+.mdi-monitor-multiple::before {
+ content: "\F37A";
+}
+.mdi-monitor-off::before {
+ content: "\FD6C";
+}
+.mdi-monitor-screenshot::before {
+ content: "\FE34";
+}
+.mdi-monitor-speaker::before {
+ content: "\FF7C";
+}
+.mdi-monitor-speaker-off::before {
+ content: "\FF7D";
+}
+.mdi-monitor-star::before {
+ content: "\FDB8";
+}
+.mdi-moon-first-quarter::before {
+ content: "\FF7E";
+}
+.mdi-moon-full::before {
+ content: "\FF7F";
+}
+.mdi-moon-last-quarter::before {
+ content: "\FF80";
+}
+.mdi-moon-new::before {
+ content: "\FF81";
+}
+.mdi-moon-waning-crescent::before {
+ content: "\FF82";
+}
+.mdi-moon-waning-gibbous::before {
+ content: "\FF83";
+}
+.mdi-moon-waxing-crescent::before {
+ content: "\FF84";
+}
+.mdi-moon-waxing-gibbous::before {
+ content: "\FF85";
+}
+.mdi-moped::before {
+ content: "\F00B1";
+}
+.mdi-more::before {
+ content: "\F37B";
+}
+.mdi-mother-heart::before {
+ content: "\F033F";
+}
+.mdi-mother-nurse::before {
+ content: "\FCFD";
+}
+.mdi-motion-sensor::before {
+ content: "\FD6D";
+}
+.mdi-motorbike::before {
+ content: "\F37C";
+}
+.mdi-mouse::before {
+ content: "\F37D";
+}
+.mdi-mouse-bluetooth::before {
+ content: "\F98A";
+}
+.mdi-mouse-off::before {
+ content: "\F37E";
+}
+.mdi-mouse-variant::before {
+ content: "\F37F";
+}
+.mdi-mouse-variant-off::before {
+ content: "\F380";
+}
+.mdi-move-resize::before {
+ content: "\F655";
+}
+.mdi-move-resize-variant::before {
+ content: "\F656";
+}
+.mdi-movie::before {
+ content: "\F381";
+}
+.mdi-movie-edit::before {
+ content: "\F014D";
+}
+.mdi-movie-edit-outline::before {
+ content: "\F014E";
+}
+.mdi-movie-filter::before {
+ content: "\F014F";
+}
+.mdi-movie-filter-outline::before {
+ content: "\F0150";
+}
+.mdi-movie-open::before {
+ content: "\FFEE";
+}
+.mdi-movie-open-outline::before {
+ content: "\FFEF";
+}
+.mdi-movie-outline::before {
+ content: "\FDB9";
+}
+.mdi-movie-roll::before {
+ content: "\F7DD";
+}
+.mdi-movie-search::before {
+ content: "\F01FD";
+}
+.mdi-movie-search-outline::before {
+ content: "\F01FE";
+}
+.mdi-muffin::before {
+ content: "\F98B";
+}
+.mdi-multiplication::before {
+ content: "\F382";
+}
+.mdi-multiplication-box::before {
+ content: "\F383";
+}
+.mdi-mushroom::before {
+ content: "\F7DE";
+}
+.mdi-mushroom-outline::before {
+ content: "\F7DF";
+}
+.mdi-music::before {
+ content: "\F759";
+}
+.mdi-music-accidental-double-flat::before {
+ content: "\FF86";
+}
+.mdi-music-accidental-double-sharp::before {
+ content: "\FF87";
+}
+.mdi-music-accidental-flat::before {
+ content: "\FF88";
+}
+.mdi-music-accidental-natural::before {
+ content: "\FF89";
+}
+.mdi-music-accidental-sharp::before {
+ content: "\FF8A";
+}
+.mdi-music-box::before {
+ content: "\F384";
+}
+.mdi-music-box-outline::before {
+ content: "\F385";
+}
+.mdi-music-circle::before {
+ content: "\F386";
+}
+.mdi-music-circle-outline::before {
+ content: "\FAD3";
+}
+.mdi-music-clef-alto::before {
+ content: "\FF8B";
+}
+.mdi-music-clef-bass::before {
+ content: "\FF8C";
+}
+.mdi-music-clef-treble::before {
+ content: "\FF8D";
+}
+.mdi-music-note::before {
+ content: "\F387";
+}
+.mdi-music-note-bluetooth::before {
+ content: "\F5FE";
+}
+.mdi-music-note-bluetooth-off::before {
+ content: "\F5FF";
+}
+.mdi-music-note-eighth::before {
+ content: "\F388";
+}
+.mdi-music-note-eighth-dotted::before {
+ content: "\FF8E";
+}
+.mdi-music-note-half::before {
+ content: "\F389";
+}
+.mdi-music-note-half-dotted::before {
+ content: "\FF8F";
+}
+.mdi-music-note-off::before {
+ content: "\F38A";
+}
+.mdi-music-note-off-outline::before {
+ content: "\FF90";
+}
+.mdi-music-note-outline::before {
+ content: "\FF91";
+}
+.mdi-music-note-plus::before {
+ content: "\FDBA";
+}
+.mdi-music-note-quarter::before {
+ content: "\F38B";
+}
+.mdi-music-note-quarter-dotted::before {
+ content: "\FF92";
+}
+.mdi-music-note-sixteenth::before {
+ content: "\F38C";
+}
+.mdi-music-note-sixteenth-dotted::before {
+ content: "\FF93";
+}
+.mdi-music-note-whole::before {
+ content: "\F38D";
+}
+.mdi-music-note-whole-dotted::before {
+ content: "\FF94";
+}
+.mdi-music-off::before {
+ content: "\F75A";
+}
+.mdi-music-rest-eighth::before {
+ content: "\FF95";
+}
+.mdi-music-rest-half::before {
+ content: "\FF96";
+}
+.mdi-music-rest-quarter::before {
+ content: "\FF97";
+}
+.mdi-music-rest-sixteenth::before {
+ content: "\FF98";
+}
+.mdi-music-rest-whole::before {
+ content: "\FF99";
+}
+.mdi-nail::before {
+ content: "\FDBB";
+}
+.mdi-nas::before {
+ content: "\F8F2";
+}
+.mdi-nativescript::before {
+ content: "\F87F";
+}
+.mdi-nature::before {
+ content: "\F38E";
+}
+.mdi-nature-people::before {
+ content: "\F38F";
+}
+.mdi-navigation::before {
+ content: "\F390";
+}
+.mdi-near-me::before {
+ content: "\F5CD";
+}
+.mdi-necklace::before {
+ content: "\FF28";
+}
+.mdi-needle::before {
+ content: "\F391";
+}
+.mdi-netflix::before {
+ content: "\F745";
+}
+.mdi-network::before {
+ content: "\F6F2";
+}
+.mdi-network-off::before {
+ content: "\FC77";
+}
+.mdi-network-off-outline::before {
+ content: "\FC78";
+}
+.mdi-network-outline::before {
+ content: "\FC79";
+}
+.mdi-network-router::before {
+ content: "\F00B2";
+}
+.mdi-network-strength-1::before {
+ content: "\F8F3";
+}
+.mdi-network-strength-1-alert::before {
+ content: "\F8F4";
+}
+.mdi-network-strength-2::before {
+ content: "\F8F5";
+}
+.mdi-network-strength-2-alert::before {
+ content: "\F8F6";
+}
+.mdi-network-strength-3::before {
+ content: "\F8F7";
+}
+.mdi-network-strength-3-alert::before {
+ content: "\F8F8";
+}
+.mdi-network-strength-4::before {
+ content: "\F8F9";
+}
+.mdi-network-strength-4-alert::before {
+ content: "\F8FA";
+}
+.mdi-network-strength-off::before {
+ content: "\F8FB";
+}
+.mdi-network-strength-off-outline::before {
+ content: "\F8FC";
+}
+.mdi-network-strength-outline::before {
+ content: "\F8FD";
+}
+.mdi-new-box::before {
+ content: "\F394";
+}
+.mdi-newspaper::before {
+ content: "\F395";
+}
+.mdi-newspaper-minus::before {
+ content: "\FF29";
+}
+.mdi-newspaper-plus::before {
+ content: "\FF2A";
+}
+.mdi-newspaper-variant::before {
+ content: "\F0023";
+}
+.mdi-newspaper-variant-multiple::before {
+ content: "\F0024";
+}
+.mdi-newspaper-variant-multiple-outline::before {
+ content: "\F0025";
+}
+.mdi-newspaper-variant-outline::before {
+ content: "\F0026";
+}
+.mdi-nfc::before {
+ content: "\F396";
+}
+.mdi-nfc-off::before {
+ content: "\FE35";
+}
+.mdi-nfc-search-variant::before {
+ content: "\FE36";
+}
+.mdi-nfc-tap::before {
+ content: "\F397";
+}
+.mdi-nfc-variant::before {
+ content: "\F398";
+}
+.mdi-nfc-variant-off::before {
+ content: "\FE37";
+}
+.mdi-ninja::before {
+ content: "\F773";
+}
+.mdi-nintendo-switch::before {
+ content: "\F7E0";
+}
+.mdi-nix::before {
+ content: "\F0130";
+}
+.mdi-nodejs::before {
+ content: "\F399";
+}
+.mdi-noodles::before {
+ content: "\F01A9";
+}
+.mdi-not-equal::before {
+ content: "\F98C";
+}
+.mdi-not-equal-variant::before {
+ content: "\F98D";
+}
+.mdi-note::before {
+ content: "\F39A";
+}
+.mdi-note-multiple::before {
+ content: "\F6B7";
+}
+.mdi-note-multiple-outline::before {
+ content: "\F6B8";
+}
+.mdi-note-outline::before {
+ content: "\F39B";
+}
+.mdi-note-plus::before {
+ content: "\F39C";
+}
+.mdi-note-plus-outline::before {
+ content: "\F39D";
+}
+.mdi-note-text::before {
+ content: "\F39E";
+}
+.mdi-note-text-outline::before {
+ content: "\F0202";
+}
+.mdi-notebook::before {
+ content: "\F82D";
+}
+.mdi-notebook-multiple::before {
+ content: "\FE38";
+}
+.mdi-notebook-outline::before {
+ content: "\FEDC";
+}
+.mdi-notification-clear-all::before {
+ content: "\F39F";
+}
+.mdi-npm::before {
+ content: "\F6F6";
+}
+.mdi-npm-variant::before {
+ content: "\F98E";
+}
+.mdi-npm-variant-outline::before {
+ content: "\F98F";
+}
+.mdi-nuke::before {
+ content: "\F6A3";
+}
+.mdi-null::before {
+ content: "\F7E1";
+}
+.mdi-numeric::before {
+ content: "\F3A0";
+}
+.mdi-numeric-0::before {
+ content: "\30";
+}
+.mdi-numeric-0-box::before {
+ content: "\F3A1";
+}
+.mdi-numeric-0-box-multiple::before {
+ content: "\FF2B";
+}
+.mdi-numeric-0-box-multiple-outline::before {
+ content: "\F3A2";
+}
+.mdi-numeric-0-box-outline::before {
+ content: "\F3A3";
+}
+.mdi-numeric-0-circle::before {
+ content: "\FC7A";
+}
+.mdi-numeric-0-circle-outline::before {
+ content: "\FC7B";
+}
+.mdi-numeric-1::before {
+ content: "\31";
+}
+.mdi-numeric-1-box::before {
+ content: "\F3A4";
+}
+.mdi-numeric-1-box-multiple::before {
+ content: "\FF2C";
+}
+.mdi-numeric-1-box-multiple-outline::before {
+ content: "\F3A5";
+}
+.mdi-numeric-1-box-outline::before {
+ content: "\F3A6";
+}
+.mdi-numeric-1-circle::before {
+ content: "\FC7C";
+}
+.mdi-numeric-1-circle-outline::before {
+ content: "\FC7D";
+}
+.mdi-numeric-10::before {
+ content: "\F000A";
+}
+.mdi-numeric-10-box::before {
+ content: "\FF9A";
+}
+.mdi-numeric-10-box-multiple::before {
+ content: "\F000B";
+}
+.mdi-numeric-10-box-multiple-outline::before {
+ content: "\F000C";
+}
+.mdi-numeric-10-box-outline::before {
+ content: "\FF9B";
+}
+.mdi-numeric-10-circle::before {
+ content: "\F000D";
+}
+.mdi-numeric-10-circle-outline::before {
+ content: "\F000E";
+}
+.mdi-numeric-2::before {
+ content: "\32";
+}
+.mdi-numeric-2-box::before {
+ content: "\F3A7";
+}
+.mdi-numeric-2-box-multiple::before {
+ content: "\FF2D";
+}
+.mdi-numeric-2-box-multiple-outline::before {
+ content: "\F3A8";
+}
+.mdi-numeric-2-box-outline::before {
+ content: "\F3A9";
+}
+.mdi-numeric-2-circle::before {
+ content: "\FC7E";
+}
+.mdi-numeric-2-circle-outline::before {
+ content: "\FC7F";
+}
+.mdi-numeric-3::before {
+ content: "\33";
+}
+.mdi-numeric-3-box::before {
+ content: "\F3AA";
+}
+.mdi-numeric-3-box-multiple::before {
+ content: "\FF2E";
+}
+.mdi-numeric-3-box-multiple-outline::before {
+ content: "\F3AB";
+}
+.mdi-numeric-3-box-outline::before {
+ content: "\F3AC";
+}
+.mdi-numeric-3-circle::before {
+ content: "\FC80";
+}
+.mdi-numeric-3-circle-outline::before {
+ content: "\FC81";
+}
+.mdi-numeric-4::before {
+ content: "\34";
+}
+.mdi-numeric-4-box::before {
+ content: "\F3AD";
+}
+.mdi-numeric-4-box-multiple::before {
+ content: "\FF2F";
+}
+.mdi-numeric-4-box-multiple-outline::before {
+ content: "\F3AE";
+}
+.mdi-numeric-4-box-outline::before {
+ content: "\F3AF";
+}
+.mdi-numeric-4-circle::before {
+ content: "\FC82";
+}
+.mdi-numeric-4-circle-outline::before {
+ content: "\FC83";
+}
+.mdi-numeric-5::before {
+ content: "\35";
+}
+.mdi-numeric-5-box::before {
+ content: "\F3B0";
+}
+.mdi-numeric-5-box-multiple::before {
+ content: "\FF30";
+}
+.mdi-numeric-5-box-multiple-outline::before {
+ content: "\F3B1";
+}
+.mdi-numeric-5-box-outline::before {
+ content: "\F3B2";
+}
+.mdi-numeric-5-circle::before {
+ content: "\FC84";
+}
+.mdi-numeric-5-circle-outline::before {
+ content: "\FC85";
+}
+.mdi-numeric-6::before {
+ content: "\36";
+}
+.mdi-numeric-6-box::before {
+ content: "\F3B3";
+}
+.mdi-numeric-6-box-multiple::before {
+ content: "\FF31";
+}
+.mdi-numeric-6-box-multiple-outline::before {
+ content: "\F3B4";
+}
+.mdi-numeric-6-box-outline::before {
+ content: "\F3B5";
+}
+.mdi-numeric-6-circle::before {
+ content: "\FC86";
+}
+.mdi-numeric-6-circle-outline::before {
+ content: "\FC87";
+}
+.mdi-numeric-7::before {
+ content: "\37";
+}
+.mdi-numeric-7-box::before {
+ content: "\F3B6";
+}
+.mdi-numeric-7-box-multiple::before {
+ content: "\FF32";
+}
+.mdi-numeric-7-box-multiple-outline::before {
+ content: "\F3B7";
+}
+.mdi-numeric-7-box-outline::before {
+ content: "\F3B8";
+}
+.mdi-numeric-7-circle::before {
+ content: "\FC88";
+}
+.mdi-numeric-7-circle-outline::before {
+ content: "\FC89";
+}
+.mdi-numeric-8::before {
+ content: "\38";
+}
+.mdi-numeric-8-box::before {
+ content: "\F3B9";
+}
+.mdi-numeric-8-box-multiple::before {
+ content: "\FF33";
+}
+.mdi-numeric-8-box-multiple-outline::before {
+ content: "\F3BA";
+}
+.mdi-numeric-8-box-outline::before {
+ content: "\F3BB";
+}
+.mdi-numeric-8-circle::before {
+ content: "\FC8A";
+}
+.mdi-numeric-8-circle-outline::before {
+ content: "\FC8B";
+}
+.mdi-numeric-9::before {
+ content: "\39";
+}
+.mdi-numeric-9-box::before {
+ content: "\F3BC";
+}
+.mdi-numeric-9-box-multiple::before {
+ content: "\FF34";
+}
+.mdi-numeric-9-box-multiple-outline::before {
+ content: "\F3BD";
+}
+.mdi-numeric-9-box-outline::before {
+ content: "\F3BE";
+}
+.mdi-numeric-9-circle::before {
+ content: "\FC8C";
+}
+.mdi-numeric-9-circle-outline::before {
+ content: "\FC8D";
+}
+.mdi-numeric-9-plus::before {
+ content: "\F000F";
+}
+.mdi-numeric-9-plus-box::before {
+ content: "\F3BF";
+}
+.mdi-numeric-9-plus-box-multiple::before {
+ content: "\FF35";
+}
+.mdi-numeric-9-plus-box-multiple-outline::before {
+ content: "\F3C0";
+}
+.mdi-numeric-9-plus-box-outline::before {
+ content: "\F3C1";
+}
+.mdi-numeric-9-plus-circle::before {
+ content: "\FC8E";
+}
+.mdi-numeric-9-plus-circle-outline::before {
+ content: "\FC8F";
+}
+.mdi-numeric-negative-1::before {
+ content: "\F0074";
+}
+.mdi-nut::before {
+ content: "\F6F7";
+}
+.mdi-nutrition::before {
+ content: "\F3C2";
+}
+.mdi-nuxt::before {
+ content: "\F0131";
+}
+.mdi-oar::before {
+ content: "\F67B";
+}
+.mdi-ocarina::before {
+ content: "\FDBC";
+}
+.mdi-oci::before {
+ content: "\F0314";
+}
+.mdi-ocr::before {
+ content: "\F0165";
+}
+.mdi-octagon::before {
+ content: "\F3C3";
+}
+.mdi-octagon-outline::before {
+ content: "\F3C4";
+}
+.mdi-octagram::before {
+ content: "\F6F8";
+}
+.mdi-octagram-outline::before {
+ content: "\F774";
+}
+.mdi-odnoklassniki::before {
+ content: "\F3C5";
+}
+.mdi-offer::before {
+ content: "\F0246";
+}
+.mdi-office::before {
+ content: "\F3C6";
+}
+.mdi-office-building::before {
+ content: "\F990";
+}
+.mdi-oil::before {
+ content: "\F3C7";
+}
+.mdi-oil-lamp::before {
+ content: "\FF36";
+}
+.mdi-oil-level::before {
+ content: "\F0075";
+}
+.mdi-oil-temperature::before {
+ content: "\F0019";
+}
+.mdi-omega::before {
+ content: "\F3C9";
+}
+.mdi-one-up::before {
+ content: "\FB89";
+}
+.mdi-onedrive::before {
+ content: "\F3CA";
+}
+.mdi-onenote::before {
+ content: "\F746";
+}
+.mdi-onepassword::before {
+ content: "\F880";
+}
+.mdi-opacity::before {
+ content: "\F5CC";
+}
+.mdi-open-in-app::before {
+ content: "\F3CB";
+}
+.mdi-open-in-new::before {
+ content: "\F3CC";
+}
+.mdi-open-source-initiative::before {
+ content: "\FB8A";
+}
+.mdi-openid::before {
+ content: "\F3CD";
+}
+.mdi-opera::before {
+ content: "\F3CE";
+}
+.mdi-orbit::before {
+ content: "\F018";
+}
+.mdi-origin::before {
+ content: "\FB2B";
+}
+.mdi-ornament::before {
+ content: "\F3CF";
+}
+.mdi-ornament-variant::before {
+ content: "\F3D0";
+}
+.mdi-outdoor-lamp::before {
+ content: "\F0076";
+}
+.mdi-outlook::before {
+ content: "\FCFE";
+}
+.mdi-overscan::before {
+ content: "\F0027";
+}
+.mdi-owl::before {
+ content: "\F3D2";
+}
+.mdi-pac-man::before {
+ content: "\FB8B";
+}
+.mdi-package::before {
+ content: "\F3D3";
+}
+.mdi-package-down::before {
+ content: "\F3D4";
+}
+.mdi-package-up::before {
+ content: "\F3D5";
+}
+.mdi-package-variant::before {
+ content: "\F3D6";
+}
+.mdi-package-variant-closed::before {
+ content: "\F3D7";
+}
+.mdi-page-first::before {
+ content: "\F600";
+}
+.mdi-page-last::before {
+ content: "\F601";
+}
+.mdi-page-layout-body::before {
+ content: "\F6F9";
+}
+.mdi-page-layout-footer::before {
+ content: "\F6FA";
+}
+.mdi-page-layout-header::before {
+ content: "\F6FB";
+}
+.mdi-page-layout-header-footer::before {
+ content: "\FF9C";
+}
+.mdi-page-layout-sidebar-left::before {
+ content: "\F6FC";
+}
+.mdi-page-layout-sidebar-right::before {
+ content: "\F6FD";
+}
+.mdi-page-next::before {
+ content: "\FB8C";
+}
+.mdi-page-next-outline::before {
+ content: "\FB8D";
+}
+.mdi-page-previous::before {
+ content: "\FB8E";
+}
+.mdi-page-previous-outline::before {
+ content: "\FB8F";
+}
+.mdi-palette::before {
+ content: "\F3D8";
+}
+.mdi-palette-advanced::before {
+ content: "\F3D9";
+}
+.mdi-palette-outline::before {
+ content: "\FE6C";
+}
+.mdi-palette-swatch::before {
+ content: "\F8B4";
+}
+.mdi-palette-swatch-outline::before {
+ content: "\F0387";
+}
+.mdi-palm-tree::before {
+ content: "\F0077";
+}
+.mdi-pan::before {
+ content: "\FB90";
+}
+.mdi-pan-bottom-left::before {
+ content: "\FB91";
+}
+.mdi-pan-bottom-right::before {
+ content: "\FB92";
+}
+.mdi-pan-down::before {
+ content: "\FB93";
+}
+.mdi-pan-horizontal::before {
+ content: "\FB94";
+}
+.mdi-pan-left::before {
+ content: "\FB95";
+}
+.mdi-pan-right::before {
+ content: "\FB96";
+}
+.mdi-pan-top-left::before {
+ content: "\FB97";
+}
+.mdi-pan-top-right::before {
+ content: "\FB98";
+}
+.mdi-pan-up::before {
+ content: "\FB99";
+}
+.mdi-pan-vertical::before {
+ content: "\FB9A";
+}
+.mdi-panda::before {
+ content: "\F3DA";
+}
+.mdi-pandora::before {
+ content: "\F3DB";
+}
+.mdi-panorama::before {
+ content: "\F3DC";
+}
+.mdi-panorama-fisheye::before {
+ content: "\F3DD";
+}
+.mdi-panorama-horizontal::before {
+ content: "\F3DE";
+}
+.mdi-panorama-vertical::before {
+ content: "\F3DF";
+}
+.mdi-panorama-wide-angle::before {
+ content: "\F3E0";
+}
+.mdi-paper-cut-vertical::before {
+ content: "\F3E1";
+}
+.mdi-paper-roll::before {
+ content: "\F0182";
+}
+.mdi-paper-roll-outline::before {
+ content: "\F0183";
+}
+.mdi-paperclip::before {
+ content: "\F3E2";
+}
+.mdi-parachute::before {
+ content: "\FC90";
+}
+.mdi-parachute-outline::before {
+ content: "\FC91";
+}
+.mdi-parking::before {
+ content: "\F3E3";
+}
+.mdi-party-popper::before {
+ content: "\F0078";
+}
+.mdi-passport::before {
+ content: "\F7E2";
+}
+.mdi-passport-biometric::before {
+ content: "\FDBD";
+}
+.mdi-pasta::before {
+ content: "\F018B";
+}
+.mdi-patio-heater::before {
+ content: "\FF9D";
+}
+.mdi-patreon::before {
+ content: "\F881";
+}
+.mdi-pause::before {
+ content: "\F3E4";
+}
+.mdi-pause-circle::before {
+ content: "\F3E5";
+}
+.mdi-pause-circle-outline::before {
+ content: "\F3E6";
+}
+.mdi-pause-octagon::before {
+ content: "\F3E7";
+}
+.mdi-pause-octagon-outline::before {
+ content: "\F3E8";
+}
+.mdi-paw::before {
+ content: "\F3E9";
+}
+.mdi-paw-off::before {
+ content: "\F657";
+}
+.mdi-paypal::before {
+ content: "\F882";
+}
+.mdi-pdf-box::before {
+ content: "\FE39";
+}
+.mdi-peace::before {
+ content: "\F883";
+}
+.mdi-peanut::before {
+ content: "\F001E";
+}
+.mdi-peanut-off::before {
+ content: "\F001F";
+}
+.mdi-peanut-off-outline::before {
+ content: "\F0021";
+}
+.mdi-peanut-outline::before {
+ content: "\F0020";
+}
+.mdi-pen::before {
+ content: "\F3EA";
+}
+.mdi-pen-lock::before {
+ content: "\FDBE";
+}
+.mdi-pen-minus::before {
+ content: "\FDBF";
+}
+.mdi-pen-off::before {
+ content: "\FDC0";
+}
+.mdi-pen-plus::before {
+ content: "\FDC1";
+}
+.mdi-pen-remove::before {
+ content: "\FDC2";
+}
+.mdi-pencil::before {
+ content: "\F3EB";
+}
+.mdi-pencil-box::before {
+ content: "\F3EC";
+}
+.mdi-pencil-box-multiple::before {
+ content: "\F016F";
+}
+.mdi-pencil-box-multiple-outline::before {
+ content: "\F0170";
+}
+.mdi-pencil-box-outline::before {
+ content: "\F3ED";
+}
+.mdi-pencil-circle::before {
+ content: "\F6FE";
+}
+.mdi-pencil-circle-outline::before {
+ content: "\F775";
+}
+.mdi-pencil-lock::before {
+ content: "\F3EE";
+}
+.mdi-pencil-lock-outline::before {
+ content: "\FDC3";
+}
+.mdi-pencil-minus::before {
+ content: "\FDC4";
+}
+.mdi-pencil-minus-outline::before {
+ content: "\FDC5";
+}
+.mdi-pencil-off::before {
+ content: "\F3EF";
+}
+.mdi-pencil-off-outline::before {
+ content: "\FDC6";
+}
+.mdi-pencil-outline::before {
+ content: "\FC92";
+}
+.mdi-pencil-plus::before {
+ content: "\FDC7";
+}
+.mdi-pencil-plus-outline::before {
+ content: "\FDC8";
+}
+.mdi-pencil-remove::before {
+ content: "\FDC9";
+}
+.mdi-pencil-remove-outline::before {
+ content: "\FDCA";
+}
+.mdi-pencil-ruler::before {
+ content: "\F037E";
+}
+.mdi-penguin::before {
+ content: "\FEDD";
+}
+.mdi-pentagon::before {
+ content: "\F6FF";
+}
+.mdi-pentagon-outline::before {
+ content: "\F700";
+}
+.mdi-percent::before {
+ content: "\F3F0";
+}
+.mdi-percent-outline::before {
+ content: "\F02A3";
+}
+.mdi-periodic-table::before {
+ content: "\F8B5";
+}
+.mdi-periodic-table-co::before {
+ content: "\F0329";
+}
+.mdi-periodic-table-co2::before {
+ content: "\F7E3";
+}
+.mdi-periscope::before {
+ content: "\F747";
+}
+.mdi-perspective-less::before {
+ content: "\FCFF";
+}
+.mdi-perspective-more::before {
+ content: "\FD00";
+}
+.mdi-pharmacy::before {
+ content: "\F3F1";
+}
+.mdi-phone::before {
+ content: "\F3F2";
+}
+.mdi-phone-alert::before {
+ content: "\FF37";
+}
+.mdi-phone-alert-outline::before {
+ content: "\F01B9";
+}
+.mdi-phone-bluetooth::before {
+ content: "\F3F3";
+}
+.mdi-phone-bluetooth-outline::before {
+ content: "\F01BA";
+}
+.mdi-phone-cancel::before {
+ content: "\F00E7";
+}
+.mdi-phone-cancel-outline::before {
+ content: "\F01BB";
+}
+.mdi-phone-check::before {
+ content: "\F01D4";
+}
+.mdi-phone-check-outline::before {
+ content: "\F01D5";
+}
+.mdi-phone-classic::before {
+ content: "\F602";
+}
+.mdi-phone-classic-off::before {
+ content: "\F02A4";
+}
+.mdi-phone-forward::before {
+ content: "\F3F4";
+}
+.mdi-phone-forward-outline::before {
+ content: "\F01BC";
+}
+.mdi-phone-hangup::before {
+ content: "\F3F5";
+}
+.mdi-phone-hangup-outline::before {
+ content: "\F01BD";
+}
+.mdi-phone-in-talk::before {
+ content: "\F3F6";
+}
+.mdi-phone-in-talk-outline::before {
+ content: "\F01AD";
+}
+.mdi-phone-incoming::before {
+ content: "\F3F7";
+}
+.mdi-phone-incoming-outline::before {
+ content: "\F01BE";
+}
+.mdi-phone-lock::before {
+ content: "\F3F8";
+}
+.mdi-phone-lock-outline::before {
+ content: "\F01BF";
+}
+.mdi-phone-log::before {
+ content: "\F3F9";
+}
+.mdi-phone-log-outline::before {
+ content: "\F01C0";
+}
+.mdi-phone-message::before {
+ content: "\F01C1";
+}
+.mdi-phone-message-outline::before {
+ content: "\F01C2";
+}
+.mdi-phone-minus::before {
+ content: "\F658";
+}
+.mdi-phone-minus-outline::before {
+ content: "\F01C3";
+}
+.mdi-phone-missed::before {
+ content: "\F3FA";
+}
+.mdi-phone-missed-outline::before {
+ content: "\F01D0";
+}
+.mdi-phone-off::before {
+ content: "\FDCB";
+}
+.mdi-phone-off-outline::before {
+ content: "\F01D1";
+}
+.mdi-phone-outgoing::before {
+ content: "\F3FB";
+}
+.mdi-phone-outgoing-outline::before {
+ content: "\F01C4";
+}
+.mdi-phone-outline::before {
+ content: "\FDCC";
+}
+.mdi-phone-paused::before {
+ content: "\F3FC";
+}
+.mdi-phone-paused-outline::before {
+ content: "\F01C5";
+}
+.mdi-phone-plus::before {
+ content: "\F659";
+}
+.mdi-phone-plus-outline::before {
+ content: "\F01C6";
+}
+.mdi-phone-return::before {
+ content: "\F82E";
+}
+.mdi-phone-return-outline::before {
+ content: "\F01C7";
+}
+.mdi-phone-ring::before {
+ content: "\F01D6";
+}
+.mdi-phone-ring-outline::before {
+ content: "\F01D7";
+}
+.mdi-phone-rotate-landscape::before {
+ content: "\F884";
+}
+.mdi-phone-rotate-portrait::before {
+ content: "\F885";
+}
+.mdi-phone-settings::before {
+ content: "\F3FD";
+}
+.mdi-phone-settings-outline::before {
+ content: "\F01C8";
+}
+.mdi-phone-voip::before {
+ content: "\F3FE";
+}
+.mdi-pi::before {
+ content: "\F3FF";
+}
+.mdi-pi-box::before {
+ content: "\F400";
+}
+.mdi-pi-hole::before {
+ content: "\FDCD";
+}
+.mdi-piano::before {
+ content: "\F67C";
+}
+.mdi-pickaxe::before {
+ content: "\F8B6";
+}
+.mdi-picture-in-picture-bottom-right::before {
+ content: "\FE3A";
+}
+.mdi-picture-in-picture-bottom-right-outline::before {
+ content: "\FE3B";
+}
+.mdi-picture-in-picture-top-right::before {
+ content: "\FE3C";
+}
+.mdi-picture-in-picture-top-right-outline::before {
+ content: "\FE3D";
+}
+.mdi-pier::before {
+ content: "\F886";
+}
+.mdi-pier-crane::before {
+ content: "\F887";
+}
+.mdi-pig::before {
+ content: "\F401";
+}
+.mdi-pig-variant::before {
+ content: "\F0028";
+}
+.mdi-piggy-bank::before {
+ content: "\F0029";
+}
+.mdi-pill::before {
+ content: "\F402";
+}
+.mdi-pillar::before {
+ content: "\F701";
+}
+.mdi-pin::before {
+ content: "\F403";
+}
+.mdi-pin-off::before {
+ content: "\F404";
+}
+.mdi-pin-off-outline::before {
+ content: "\F92F";
+}
+.mdi-pin-outline::before {
+ content: "\F930";
+}
+.mdi-pine-tree::before {
+ content: "\F405";
+}
+.mdi-pine-tree-box::before {
+ content: "\F406";
+}
+.mdi-pinterest::before {
+ content: "\F407";
+}
+.mdi-pinterest-box::before {
+ content: "\F408";
+}
+.mdi-pinwheel::before {
+ content: "\FAD4";
+}
+.mdi-pinwheel-outline::before {
+ content: "\FAD5";
+}
+.mdi-pipe::before {
+ content: "\F7E4";
+}
+.mdi-pipe-disconnected::before {
+ content: "\F7E5";
+}
+.mdi-pipe-leak::before {
+ content: "\F888";
+}
+.mdi-pipe-wrench::before {
+ content: "\F037F";
+}
+.mdi-pirate::before {
+ content: "\FA07";
+}
+.mdi-pistol::before {
+ content: "\F702";
+}
+.mdi-piston::before {
+ content: "\F889";
+}
+.mdi-pizza::before {
+ content: "\F409";
+}
+.mdi-play::before {
+ content: "\F40A";
+}
+.mdi-play-box::before {
+ content: "\F02A5";
+}
+.mdi-play-box-outline::before {
+ content: "\F40B";
+}
+.mdi-play-circle::before {
+ content: "\F40C";
+}
+.mdi-play-circle-outline::before {
+ content: "\F40D";
+}
+.mdi-play-network::before {
+ content: "\F88A";
+}
+.mdi-play-network-outline::before {
+ content: "\FC93";
+}
+.mdi-play-outline::before {
+ content: "\FF38";
+}
+.mdi-play-pause::before {
+ content: "\F40E";
+}
+.mdi-play-protected-content::before {
+ content: "\F40F";
+}
+.mdi-play-speed::before {
+ content: "\F8FE";
+}
+.mdi-playlist-check::before {
+ content: "\F5C7";
+}
+.mdi-playlist-edit::before {
+ content: "\F8FF";
+}
+.mdi-playlist-minus::before {
+ content: "\F410";
+}
+.mdi-playlist-music::before {
+ content: "\FC94";
+}
+.mdi-playlist-music-outline::before {
+ content: "\FC95";
+}
+.mdi-playlist-play::before {
+ content: "\F411";
+}
+.mdi-playlist-plus::before {
+ content: "\F412";
+}
+.mdi-playlist-remove::before {
+ content: "\F413";
+}
+.mdi-playlist-star::before {
+ content: "\FDCE";
+}
+.mdi-playstation::before {
+ content: "\F414";
+}
+.mdi-plex::before {
+ content: "\F6B9";
+}
+.mdi-plus::before {
+ content: "\F415";
+}
+.mdi-plus-box::before {
+ content: "\F416";
+}
+.mdi-plus-box-multiple::before {
+ content: "\F334";
+}
+.mdi-plus-box-multiple-outline::before {
+ content: "\F016E";
+}
+.mdi-plus-box-outline::before {
+ content: "\F703";
+}
+.mdi-plus-circle::before {
+ content: "\F417";
+}
+.mdi-plus-circle-multiple-outline::before {
+ content: "\F418";
+}
+.mdi-plus-circle-outline::before {
+ content: "\F419";
+}
+.mdi-plus-minus::before {
+ content: "\F991";
+}
+.mdi-plus-minus-box::before {
+ content: "\F992";
+}
+.mdi-plus-network::before {
+ content: "\F41A";
+}
+.mdi-plus-network-outline::before {
+ content: "\FC96";
+}
+.mdi-plus-one::before {
+ content: "\F41B";
+}
+.mdi-plus-outline::before {
+ content: "\F704";
+}
+.mdi-plus-thick::before {
+ content: "\F0217";
+}
+.mdi-pocket::before {
+ content: "\F41C";
+}
+.mdi-podcast::before {
+ content: "\F993";
+}
+.mdi-podium::before {
+ content: "\FD01";
+}
+.mdi-podium-bronze::before {
+ content: "\FD02";
+}
+.mdi-podium-gold::before {
+ content: "\FD03";
+}
+.mdi-podium-silver::before {
+ content: "\FD04";
+}
+.mdi-point-of-sale::before {
+ content: "\FD6E";
+}
+.mdi-pokeball::before {
+ content: "\F41D";
+}
+.mdi-pokemon-go::before {
+ content: "\FA08";
+}
+.mdi-poker-chip::before {
+ content: "\F82F";
+}
+.mdi-polaroid::before {
+ content: "\F41E";
+}
+.mdi-police-badge::before {
+ content: "\F0192";
+}
+.mdi-police-badge-outline::before {
+ content: "\F0193";
+}
+.mdi-poll::before {
+ content: "\F41F";
+}
+.mdi-poll-box::before {
+ content: "\F420";
+}
+.mdi-poll-box-outline::before {
+ content: "\F02A6";
+}
+.mdi-polymer::before {
+ content: "\F421";
+}
+.mdi-pool::before {
+ content: "\F606";
+}
+.mdi-popcorn::before {
+ content: "\F422";
+}
+.mdi-post::before {
+ content: "\F002A";
+}
+.mdi-post-outline::before {
+ content: "\F002B";
+}
+.mdi-postage-stamp::before {
+ content: "\FC97";
+}
+.mdi-pot::before {
+ content: "\F65A";
+}
+.mdi-pot-mix::before {
+ content: "\F65B";
+}
+.mdi-pound::before {
+ content: "\F423";
+}
+.mdi-pound-box::before {
+ content: "\F424";
+}
+.mdi-pound-box-outline::before {
+ content: "\F01AA";
+}
+.mdi-power::before {
+ content: "\F425";
+}
+.mdi-power-cycle::before {
+ content: "\F900";
+}
+.mdi-power-off::before {
+ content: "\F901";
+}
+.mdi-power-on::before {
+ content: "\F902";
+}
+.mdi-power-plug::before {
+ content: "\F6A4";
+}
+.mdi-power-plug-off::before {
+ content: "\F6A5";
+}
+.mdi-power-settings::before {
+ content: "\F426";
+}
+.mdi-power-sleep::before {
+ content: "\F903";
+}
+.mdi-power-socket::before {
+ content: "\F427";
+}
+.mdi-power-socket-au::before {
+ content: "\F904";
+}
+.mdi-power-socket-de::before {
+ content: "\F0132";
+}
+.mdi-power-socket-eu::before {
+ content: "\F7E6";
+}
+.mdi-power-socket-fr::before {
+ content: "\F0133";
+}
+.mdi-power-socket-jp::before {
+ content: "\F0134";
+}
+.mdi-power-socket-uk::before {
+ content: "\F7E7";
+}
+.mdi-power-socket-us::before {
+ content: "\F7E8";
+}
+.mdi-power-standby::before {
+ content: "\F905";
+}
+.mdi-powershell::before {
+ content: "\FA09";
+}
+.mdi-prescription::before {
+ content: "\F705";
+}
+.mdi-presentation::before {
+ content: "\F428";
+}
+.mdi-presentation-play::before {
+ content: "\F429";
+}
+.mdi-printer::before {
+ content: "\F42A";
+}
+.mdi-printer-3d::before {
+ content: "\F42B";
+}
+.mdi-printer-3d-nozzle::before {
+ content: "\FE3E";
+}
+.mdi-printer-3d-nozzle-alert::before {
+ content: "\F01EB";
+}
+.mdi-printer-3d-nozzle-alert-outline::before {
+ content: "\F01EC";
+}
+.mdi-printer-3d-nozzle-outline::before {
+ content: "\FE3F";
+}
+.mdi-printer-alert::before {
+ content: "\F42C";
+}
+.mdi-printer-check::before {
+ content: "\F0171";
+}
+.mdi-printer-off::before {
+ content: "\FE40";
+}
+.mdi-printer-pos::before {
+ content: "\F0079";
+}
+.mdi-printer-settings::before {
+ content: "\F706";
+}
+.mdi-printer-wireless::before {
+ content: "\FA0A";
+}
+.mdi-priority-high::before {
+ content: "\F603";
+}
+.mdi-priority-low::before {
+ content: "\F604";
+}
+.mdi-professional-hexagon::before {
+ content: "\F42D";
+}
+.mdi-progress-alert::before {
+ content: "\FC98";
+}
+.mdi-progress-check::before {
+ content: "\F994";
+}
+.mdi-progress-clock::before {
+ content: "\F995";
+}
+.mdi-progress-close::before {
+ content: "\F0135";
+}
+.mdi-progress-download::before {
+ content: "\F996";
+}
+.mdi-progress-upload::before {
+ content: "\F997";
+}
+.mdi-progress-wrench::before {
+ content: "\FC99";
+}
+.mdi-projector::before {
+ content: "\F42E";
+}
+.mdi-projector-screen::before {
+ content: "\F42F";
+}
+.mdi-propane-tank::before {
+ content: "\F0382";
+}
+.mdi-propane-tank-outline::before {
+ content: "\F0383";
+}
+.mdi-protocol::before {
+ content: "\FFF9";
+}
+.mdi-publish::before {
+ content: "\F6A6";
+}
+.mdi-pulse::before {
+ content: "\F430";
+}
+.mdi-pumpkin::before {
+ content: "\FB9B";
+}
+.mdi-purse::before {
+ content: "\FF39";
+}
+.mdi-purse-outline::before {
+ content: "\FF3A";
+}
+.mdi-puzzle::before {
+ content: "\F431";
+}
+.mdi-puzzle-outline::before {
+ content: "\FA65";
+}
+.mdi-qi::before {
+ content: "\F998";
+}
+.mdi-qqchat::before {
+ content: "\F605";
+}
+.mdi-qrcode::before {
+ content: "\F432";
+}
+.mdi-qrcode-edit::before {
+ content: "\F8B7";
+}
+.mdi-qrcode-minus::before {
+ content: "\F01B7";
+}
+.mdi-qrcode-plus::before {
+ content: "\F01B6";
+}
+.mdi-qrcode-remove::before {
+ content: "\F01B8";
+}
+.mdi-qrcode-scan::before {
+ content: "\F433";
+}
+.mdi-quadcopter::before {
+ content: "\F434";
+}
+.mdi-quality-high::before {
+ content: "\F435";
+}
+.mdi-quality-low::before {
+ content: "\FA0B";
+}
+.mdi-quality-medium::before {
+ content: "\FA0C";
+}
+.mdi-quicktime::before {
+ content: "\F436";
+}
+.mdi-quora::before {
+ content: "\FD05";
+}
+.mdi-rabbit::before {
+ content: "\F906";
+}
+.mdi-racing-helmet::before {
+ content: "\FD6F";
+}
+.mdi-racquetball::before {
+ content: "\FD70";
+}
+.mdi-radar::before {
+ content: "\F437";
+}
+.mdi-radiator::before {
+ content: "\F438";
+}
+.mdi-radiator-disabled::before {
+ content: "\FAD6";
+}
+.mdi-radiator-off::before {
+ content: "\FAD7";
+}
+.mdi-radio::before {
+ content: "\F439";
+}
+.mdi-radio-am::before {
+ content: "\FC9A";
+}
+.mdi-radio-fm::before {
+ content: "\FC9B";
+}
+.mdi-radio-handheld::before {
+ content: "\F43A";
+}
+.mdi-radio-off::before {
+ content: "\F0247";
+}
+.mdi-radio-tower::before {
+ content: "\F43B";
+}
+.mdi-radioactive::before {
+ content: "\F43C";
+}
+.mdi-radioactive-off::before {
+ content: "\FEDE";
+}
+.mdi-radiobox-blank::before {
+ content: "\F43D";
+}
+.mdi-radiobox-marked::before {
+ content: "\F43E";
+}
+.mdi-radius::before {
+ content: "\FC9C";
+}
+.mdi-radius-outline::before {
+ content: "\FC9D";
+}
+.mdi-railroad-light::before {
+ content: "\FF3B";
+}
+.mdi-raspberry-pi::before {
+ content: "\F43F";
+}
+.mdi-ray-end::before {
+ content: "\F440";
+}
+.mdi-ray-end-arrow::before {
+ content: "\F441";
+}
+.mdi-ray-start::before {
+ content: "\F442";
+}
+.mdi-ray-start-arrow::before {
+ content: "\F443";
+}
+.mdi-ray-start-end::before {
+ content: "\F444";
+}
+.mdi-ray-vertex::before {
+ content: "\F445";
+}
+.mdi-react::before {
+ content: "\F707";
+}
+.mdi-read::before {
+ content: "\F447";
+}
+.mdi-receipt::before {
+ content: "\F449";
+}
+.mdi-record::before {
+ content: "\F44A";
+}
+.mdi-record-circle::before {
+ content: "\FEDF";
+}
+.mdi-record-circle-outline::before {
+ content: "\FEE0";
+}
+.mdi-record-player::before {
+ content: "\F999";
+}
+.mdi-record-rec::before {
+ content: "\F44B";
+}
+.mdi-rectangle::before {
+ content: "\FE41";
+}
+.mdi-rectangle-outline::before {
+ content: "\FE42";
+}
+.mdi-recycle::before {
+ content: "\F44C";
+}
+.mdi-reddit::before {
+ content: "\F44D";
+}
+.mdi-redhat::before {
+ content: "\F0146";
+}
+.mdi-redo::before {
+ content: "\F44E";
+}
+.mdi-redo-variant::before {
+ content: "\F44F";
+}
+.mdi-reflect-horizontal::before {
+ content: "\FA0D";
+}
+.mdi-reflect-vertical::before {
+ content: "\FA0E";
+}
+.mdi-refresh::before {
+ content: "\F450";
+}
+.mdi-refresh-circle::before {
+ content: "\F03A2";
+}
+.mdi-regex::before {
+ content: "\F451";
+}
+.mdi-registered-trademark::before {
+ content: "\FA66";
+}
+.mdi-relative-scale::before {
+ content: "\F452";
+}
+.mdi-reload::before {
+ content: "\F453";
+}
+.mdi-reload-alert::before {
+ content: "\F0136";
+}
+.mdi-reminder::before {
+ content: "\F88B";
+}
+.mdi-remote::before {
+ content: "\F454";
+}
+.mdi-remote-desktop::before {
+ content: "\F8B8";
+}
+.mdi-remote-off::before {
+ content: "\FEE1";
+}
+.mdi-remote-tv::before {
+ content: "\FEE2";
+}
+.mdi-remote-tv-off::before {
+ content: "\FEE3";
+}
+.mdi-rename-box::before {
+ content: "\F455";
+}
+.mdi-reorder-horizontal::before {
+ content: "\F687";
+}
+.mdi-reorder-vertical::before {
+ content: "\F688";
+}
+.mdi-repeat::before {
+ content: "\F456";
+}
+.mdi-repeat-off::before {
+ content: "\F457";
+}
+.mdi-repeat-once::before {
+ content: "\F458";
+}
+.mdi-replay::before {
+ content: "\F459";
+}
+.mdi-reply::before {
+ content: "\F45A";
+}
+.mdi-reply-all::before {
+ content: "\F45B";
+}
+.mdi-reply-all-outline::before {
+ content: "\FF3C";
+}
+.mdi-reply-circle::before {
+ content: "\F01D9";
+}
+.mdi-reply-outline::before {
+ content: "\FF3D";
+}
+.mdi-reproduction::before {
+ content: "\F45C";
+}
+.mdi-resistor::before {
+ content: "\FB1F";
+}
+.mdi-resistor-nodes::before {
+ content: "\FB20";
+}
+.mdi-resize::before {
+ content: "\FA67";
+}
+.mdi-resize-bottom-right::before {
+ content: "\F45D";
+}
+.mdi-responsive::before {
+ content: "\F45E";
+}
+.mdi-restart::before {
+ content: "\F708";
+}
+.mdi-restart-alert::before {
+ content: "\F0137";
+}
+.mdi-restart-off::before {
+ content: "\FD71";
+}
+.mdi-restore::before {
+ content: "\F99A";
+}
+.mdi-restore-alert::before {
+ content: "\F0138";
+}
+.mdi-rewind::before {
+ content: "\F45F";
+}
+.mdi-rewind-10::before {
+ content: "\FD06";
+}
+.mdi-rewind-30::before {
+ content: "\FD72";
+}
+.mdi-rewind-5::before {
+ content: "\F0224";
+}
+.mdi-rewind-outline::before {
+ content: "\F709";
+}
+.mdi-rhombus::before {
+ content: "\F70A";
+}
+.mdi-rhombus-medium::before {
+ content: "\FA0F";
+}
+.mdi-rhombus-outline::before {
+ content: "\F70B";
+}
+.mdi-rhombus-split::before {
+ content: "\FA10";
+}
+.mdi-ribbon::before {
+ content: "\F460";
+}
+.mdi-rice::before {
+ content: "\F7E9";
+}
+.mdi-ring::before {
+ content: "\F7EA";
+}
+.mdi-rivet::before {
+ content: "\FE43";
+}
+.mdi-road::before {
+ content: "\F461";
+}
+.mdi-road-variant::before {
+ content: "\F462";
+}
+.mdi-robber::before {
+ content: "\F007A";
+}
+.mdi-robot::before {
+ content: "\F6A8";
+}
+.mdi-robot-industrial::before {
+ content: "\FB21";
+}
+.mdi-robot-mower::before {
+ content: "\F0222";
+}
+.mdi-robot-mower-outline::before {
+ content: "\F021E";
+}
+.mdi-robot-vacuum::before {
+ content: "\F70C";
+}
+.mdi-robot-vacuum-variant::before {
+ content: "\F907";
+}
+.mdi-rocket::before {
+ content: "\F463";
+}
+.mdi-rodent::before {
+ content: "\F0352";
+}
+.mdi-roller-skate::before {
+ content: "\FD07";
+}
+.mdi-rollerblade::before {
+ content: "\FD08";
+}
+.mdi-rollupjs::before {
+ content: "\FB9C";
+}
+.mdi-roman-numeral-1::before {
+ content: "\F00B3";
+}
+.mdi-roman-numeral-10::before {
+ content: "\F00BC";
+}
+.mdi-roman-numeral-2::before {
+ content: "\F00B4";
+}
+.mdi-roman-numeral-3::before {
+ content: "\F00B5";
+}
+.mdi-roman-numeral-4::before {
+ content: "\F00B6";
+}
+.mdi-roman-numeral-5::before {
+ content: "\F00B7";
+}
+.mdi-roman-numeral-6::before {
+ content: "\F00B8";
+}
+.mdi-roman-numeral-7::before {
+ content: "\F00B9";
+}
+.mdi-roman-numeral-8::before {
+ content: "\F00BA";
+}
+.mdi-roman-numeral-9::before {
+ content: "\F00BB";
+}
+.mdi-room-service::before {
+ content: "\F88C";
+}
+.mdi-room-service-outline::before {
+ content: "\FD73";
+}
+.mdi-rotate-3d::before {
+ content: "\FEE4";
+}
+.mdi-rotate-3d-variant::before {
+ content: "\F464";
+}
+.mdi-rotate-left::before {
+ content: "\F465";
+}
+.mdi-rotate-left-variant::before {
+ content: "\F466";
+}
+.mdi-rotate-orbit::before {
+ content: "\FD74";
+}
+.mdi-rotate-right::before {
+ content: "\F467";
+}
+.mdi-rotate-right-variant::before {
+ content: "\F468";
+}
+.mdi-rounded-corner::before {
+ content: "\F607";
+}
+.mdi-router::before {
+ content: "\F020D";
+}
+.mdi-router-wireless::before {
+ content: "\F469";
+}
+.mdi-router-wireless-settings::before {
+ content: "\FA68";
+}
+.mdi-routes::before {
+ content: "\F46A";
+}
+.mdi-routes-clock::before {
+ content: "\F007B";
+}
+.mdi-rowing::before {
+ content: "\F608";
+}
+.mdi-rss::before {
+ content: "\F46B";
+}
+.mdi-rss-box::before {
+ content: "\F46C";
+}
+.mdi-rss-off::before {
+ content: "\FF3E";
+}
+.mdi-ruby::before {
+ content: "\FD09";
+}
+.mdi-rugby::before {
+ content: "\FD75";
+}
+.mdi-ruler::before {
+ content: "\F46D";
+}
+.mdi-ruler-square::before {
+ content: "\FC9E";
+}
+.mdi-ruler-square-compass::before {
+ content: "\FEDB";
+}
+.mdi-run::before {
+ content: "\F70D";
+}
+.mdi-run-fast::before {
+ content: "\F46E";
+}
+.mdi-rv-truck::before {
+ content: "\F01FF";
+}
+.mdi-sack::before {
+ content: "\FD0A";
+}
+.mdi-sack-percent::before {
+ content: "\FD0B";
+}
+.mdi-safe::before {
+ content: "\FA69";
+}
+.mdi-safe-square::before {
+ content: "\F02A7";
+}
+.mdi-safe-square-outline::before {
+ content: "\F02A8";
+}
+.mdi-safety-goggles::before {
+ content: "\FD0C";
+}
+.mdi-sailing::before {
+ content: "\FEE5";
+}
+.mdi-sale::before {
+ content: "\F46F";
+}
+.mdi-salesforce::before {
+ content: "\F88D";
+}
+.mdi-sass::before {
+ content: "\F7EB";
+}
+.mdi-satellite::before {
+ content: "\F470";
+}
+.mdi-satellite-uplink::before {
+ content: "\F908";
+}
+.mdi-satellite-variant::before {
+ content: "\F471";
+}
+.mdi-sausage::before {
+ content: "\F8B9";
+}
+.mdi-saw-blade::before {
+ content: "\FE44";
+}
+.mdi-saxophone::before {
+ content: "\F609";
+}
+.mdi-scale::before {
+ content: "\F472";
+}
+.mdi-scale-balance::before {
+ content: "\F5D1";
+}
+.mdi-scale-bathroom::before {
+ content: "\F473";
+}
+.mdi-scale-off::before {
+ content: "\F007C";
+}
+.mdi-scanner::before {
+ content: "\F6AA";
+}
+.mdi-scanner-off::before {
+ content: "\F909";
+}
+.mdi-scatter-plot::before {
+ content: "\FEE6";
+}
+.mdi-scatter-plot-outline::before {
+ content: "\FEE7";
+}
+.mdi-school::before {
+ content: "\F474";
+}
+.mdi-school-outline::before {
+ content: "\F01AB";
+}
+.mdi-scissors-cutting::before {
+ content: "\FA6A";
+}
+.mdi-scooter::before {
+ content: "\F0214";
+}
+.mdi-scoreboard::before {
+ content: "\F02A9";
+}
+.mdi-scoreboard-outline::before {
+ content: "\F02AA";
+}
+.mdi-screen-rotation::before {
+ content: "\F475";
+}
+.mdi-screen-rotation-lock::before {
+ content: "\F476";
+}
+.mdi-screw-flat-top::before {
+ content: "\FDCF";
+}
+.mdi-screw-lag::before {
+ content: "\FE54";
+}
+.mdi-screw-machine-flat-top::before {
+ content: "\FE55";
+}
+.mdi-screw-machine-round-top::before {
+ content: "\FE56";
+}
+.mdi-screw-round-top::before {
+ content: "\FE57";
+}
+.mdi-screwdriver::before {
+ content: "\F477";
+}
+.mdi-script::before {
+ content: "\FB9D";
+}
+.mdi-script-outline::before {
+ content: "\F478";
+}
+.mdi-script-text::before {
+ content: "\FB9E";
+}
+.mdi-script-text-outline::before {
+ content: "\FB9F";
+}
+.mdi-sd::before {
+ content: "\F479";
+}
+.mdi-seal::before {
+ content: "\F47A";
+}
+.mdi-seal-variant::before {
+ content: "\FFFA";
+}
+.mdi-search-web::before {
+ content: "\F70E";
+}
+.mdi-seat::before {
+ content: "\FC9F";
+}
+.mdi-seat-flat::before {
+ content: "\F47B";
+}
+.mdi-seat-flat-angled::before {
+ content: "\F47C";
+}
+.mdi-seat-individual-suite::before {
+ content: "\F47D";
+}
+.mdi-seat-legroom-extra::before {
+ content: "\F47E";
+}
+.mdi-seat-legroom-normal::before {
+ content: "\F47F";
+}
+.mdi-seat-legroom-reduced::before {
+ content: "\F480";
+}
+.mdi-seat-outline::before {
+ content: "\FCA0";
+}
+.mdi-seat-passenger::before {
+ content: "\F0274";
+}
+.mdi-seat-recline-extra::before {
+ content: "\F481";
+}
+.mdi-seat-recline-normal::before {
+ content: "\F482";
+}
+.mdi-seatbelt::before {
+ content: "\FCA1";
+}
+.mdi-security::before {
+ content: "\F483";
+}
+.mdi-security-network::before {
+ content: "\F484";
+}
+.mdi-seed::before {
+ content: "\FE45";
+}
+.mdi-seed-outline::before {
+ content: "\FE46";
+}
+.mdi-segment::before {
+ content: "\FEE8";
+}
+.mdi-select::before {
+ content: "\F485";
+}
+.mdi-select-all::before {
+ content: "\F486";
+}
+.mdi-select-color::before {
+ content: "\FD0D";
+}
+.mdi-select-compare::before {
+ content: "\FAD8";
+}
+.mdi-select-drag::before {
+ content: "\FA6B";
+}
+.mdi-select-group::before {
+ content: "\FF9F";
+}
+.mdi-select-inverse::before {
+ content: "\F487";
+}
+.mdi-select-marker::before {
+ content: "\F02AB";
+}
+.mdi-select-multiple::before {
+ content: "\F02AC";
+}
+.mdi-select-multiple-marker::before {
+ content: "\F02AD";
+}
+.mdi-select-off::before {
+ content: "\F488";
+}
+.mdi-select-place::before {
+ content: "\FFFB";
+}
+.mdi-select-search::before {
+ content: "\F022F";
+}
+.mdi-selection::before {
+ content: "\F489";
+}
+.mdi-selection-drag::before {
+ content: "\FA6C";
+}
+.mdi-selection-ellipse::before {
+ content: "\FD0E";
+}
+.mdi-selection-ellipse-arrow-inside::before {
+ content: "\FF3F";
+}
+.mdi-selection-marker::before {
+ content: "\F02AE";
+}
+.mdi-selection-multiple-marker::before {
+ content: "\F02AF";
+}
+.mdi-selection-mutliple::before {
+ content: "\F02B0";
+}
+.mdi-selection-off::before {
+ content: "\F776";
+}
+.mdi-selection-search::before {
+ content: "\F0230";
+}
+.mdi-semantic-web::before {
+ content: "\F0341";
+}
+.mdi-send::before {
+ content: "\F48A";
+}
+.mdi-send-check::before {
+ content: "\F018C";
+}
+.mdi-send-check-outline::before {
+ content: "\F018D";
+}
+.mdi-send-circle::before {
+ content: "\FE58";
+}
+.mdi-send-circle-outline::before {
+ content: "\FE59";
+}
+.mdi-send-clock::before {
+ content: "\F018E";
+}
+.mdi-send-clock-outline::before {
+ content: "\F018F";
+}
+.mdi-send-lock::before {
+ content: "\F7EC";
+}
+.mdi-send-lock-outline::before {
+ content: "\F0191";
+}
+.mdi-send-outline::before {
+ content: "\F0190";
+}
+.mdi-serial-port::before {
+ content: "\F65C";
+}
+.mdi-server::before {
+ content: "\F48B";
+}
+.mdi-server-minus::before {
+ content: "\F48C";
+}
+.mdi-server-network::before {
+ content: "\F48D";
+}
+.mdi-server-network-off::before {
+ content: "\F48E";
+}
+.mdi-server-off::before {
+ content: "\F48F";
+}
+.mdi-server-plus::before {
+ content: "\F490";
+}
+.mdi-server-remove::before {
+ content: "\F491";
+}
+.mdi-server-security::before {
+ content: "\F492";
+}
+.mdi-set-all::before {
+ content: "\F777";
+}
+.mdi-set-center::before {
+ content: "\F778";
+}
+.mdi-set-center-right::before {
+ content: "\F779";
+}
+.mdi-set-left::before {
+ content: "\F77A";
+}
+.mdi-set-left-center::before {
+ content: "\F77B";
+}
+.mdi-set-left-right::before {
+ content: "\F77C";
+}
+.mdi-set-none::before {
+ content: "\F77D";
+}
+.mdi-set-right::before {
+ content: "\F77E";
+}
+.mdi-set-top-box::before {
+ content: "\F99E";
+}
+.mdi-settings::before {
+ content: "\F493";
+}
+.mdi-settings-box::before {
+ content: "\F494";
+}
+.mdi-settings-helper::before {
+ content: "\FA6D";
+}
+.mdi-settings-outline::before {
+ content: "\F8BA";
+}
+.mdi-settings-transfer::before {
+ content: "\F007D";
+}
+.mdi-settings-transfer-outline::before {
+ content: "\F007E";
+}
+.mdi-shaker::before {
+ content: "\F0139";
+}
+.mdi-shaker-outline::before {
+ content: "\F013A";
+}
+.mdi-shape::before {
+ content: "\F830";
+}
+.mdi-shape-circle-plus::before {
+ content: "\F65D";
+}
+.mdi-shape-outline::before {
+ content: "\F831";
+}
+.mdi-shape-oval-plus::before {
+ content: "\F0225";
+}
+.mdi-shape-plus::before {
+ content: "\F495";
+}
+.mdi-shape-polygon-plus::before {
+ content: "\F65E";
+}
+.mdi-shape-rectangle-plus::before {
+ content: "\F65F";
+}
+.mdi-shape-square-plus::before {
+ content: "\F660";
+}
+.mdi-share::before {
+ content: "\F496";
+}
+.mdi-share-all::before {
+ content: "\F021F";
+}
+.mdi-share-all-outline::before {
+ content: "\F0220";
+}
+.mdi-share-circle::before {
+ content: "\F01D8";
+}
+.mdi-share-off::before {
+ content: "\FF40";
+}
+.mdi-share-off-outline::before {
+ content: "\FF41";
+}
+.mdi-share-outline::before {
+ content: "\F931";
+}
+.mdi-share-variant::before {
+ content: "\F497";
+}
+.mdi-sheep::before {
+ content: "\FCA2";
+}
+.mdi-shield::before {
+ content: "\F498";
+}
+.mdi-shield-account::before {
+ content: "\F88E";
+}
+.mdi-shield-account-outline::before {
+ content: "\FA11";
+}
+.mdi-shield-airplane::before {
+ content: "\F6BA";
+}
+.mdi-shield-airplane-outline::before {
+ content: "\FCA3";
+}
+.mdi-shield-alert::before {
+ content: "\FEE9";
+}
+.mdi-shield-alert-outline::before {
+ content: "\FEEA";
+}
+.mdi-shield-car::before {
+ content: "\FFA0";
+}
+.mdi-shield-check::before {
+ content: "\F565";
+}
+.mdi-shield-check-outline::before {
+ content: "\FCA4";
+}
+.mdi-shield-cross::before {
+ content: "\FCA5";
+}
+.mdi-shield-cross-outline::before {
+ content: "\FCA6";
+}
+.mdi-shield-edit::before {
+ content: "\F01CB";
+}
+.mdi-shield-edit-outline::before {
+ content: "\F01CC";
+}
+.mdi-shield-half::before {
+ content: "\F038B";
+}
+.mdi-shield-half-full::before {
+ content: "\F77F";
+}
+.mdi-shield-home::before {
+ content: "\F689";
+}
+.mdi-shield-home-outline::before {
+ content: "\FCA7";
+}
+.mdi-shield-key::before {
+ content: "\FBA0";
+}
+.mdi-shield-key-outline::before {
+ content: "\FBA1";
+}
+.mdi-shield-link-variant::before {
+ content: "\FD0F";
+}
+.mdi-shield-link-variant-outline::before {
+ content: "\FD10";
+}
+.mdi-shield-lock::before {
+ content: "\F99C";
+}
+.mdi-shield-lock-outline::before {
+ content: "\FCA8";
+}
+.mdi-shield-off::before {
+ content: "\F99D";
+}
+.mdi-shield-off-outline::before {
+ content: "\F99B";
+}
+.mdi-shield-outline::before {
+ content: "\F499";
+}
+.mdi-shield-plus::before {
+ content: "\FAD9";
+}
+.mdi-shield-plus-outline::before {
+ content: "\FADA";
+}
+.mdi-shield-refresh::before {
+ content: "\F01CD";
+}
+.mdi-shield-refresh-outline::before {
+ content: "\F01CE";
+}
+.mdi-shield-remove::before {
+ content: "\FADB";
+}
+.mdi-shield-remove-outline::before {
+ content: "\FADC";
+}
+.mdi-shield-search::before {
+ content: "\FD76";
+}
+.mdi-shield-star::before {
+ content: "\F0166";
+}
+.mdi-shield-star-outline::before {
+ content: "\F0167";
+}
+.mdi-shield-sun::before {
+ content: "\F007F";
+}
+.mdi-shield-sun-outline::before {
+ content: "\F0080";
+}
+.mdi-ship-wheel::before {
+ content: "\F832";
+}
+.mdi-shoe-formal::before {
+ content: "\FB22";
+}
+.mdi-shoe-heel::before {
+ content: "\FB23";
+}
+.mdi-shoe-print::before {
+ content: "\FE5A";
+}
+.mdi-shopify::before {
+ content: "\FADD";
+}
+.mdi-shopping::before {
+ content: "\F49A";
+}
+.mdi-shopping-music::before {
+ content: "\F49B";
+}
+.mdi-shopping-outline::before {
+ content: "\F0200";
+}
+.mdi-shopping-search::before {
+ content: "\FFA1";
+}
+.mdi-shovel::before {
+ content: "\F70F";
+}
+.mdi-shovel-off::before {
+ content: "\F710";
+}
+.mdi-shower::before {
+ content: "\F99F";
+}
+.mdi-shower-head::before {
+ content: "\F9A0";
+}
+.mdi-shredder::before {
+ content: "\F49C";
+}
+.mdi-shuffle::before {
+ content: "\F49D";
+}
+.mdi-shuffle-disabled::before {
+ content: "\F49E";
+}
+.mdi-shuffle-variant::before {
+ content: "\F49F";
+}
+.mdi-shuriken::before {
+ content: "\F03AA";
+}
+.mdi-sigma::before {
+ content: "\F4A0";
+}
+.mdi-sigma-lower::before {
+ content: "\F62B";
+}
+.mdi-sign-caution::before {
+ content: "\F4A1";
+}
+.mdi-sign-direction::before {
+ content: "\F780";
+}
+.mdi-sign-direction-minus::before {
+ content: "\F0022";
+}
+.mdi-sign-direction-plus::before {
+ content: "\FFFD";
+}
+.mdi-sign-direction-remove::before {
+ content: "\FFFE";
+}
+.mdi-sign-real-estate::before {
+ content: "\F0143";
+}
+.mdi-sign-text::before {
+ content: "\F781";
+}
+.mdi-signal::before {
+ content: "\F4A2";
+}
+.mdi-signal-2g::before {
+ content: "\F711";
+}
+.mdi-signal-3g::before {
+ content: "\F712";
+}
+.mdi-signal-4g::before {
+ content: "\F713";
+}
+.mdi-signal-5g::before {
+ content: "\FA6E";
+}
+.mdi-signal-cellular-1::before {
+ content: "\F8BB";
+}
+.mdi-signal-cellular-2::before {
+ content: "\F8BC";
+}
+.mdi-signal-cellular-3::before {
+ content: "\F8BD";
+}
+.mdi-signal-cellular-outline::before {
+ content: "\F8BE";
+}
+.mdi-signal-distance-variant::before {
+ content: "\FE47";
+}
+.mdi-signal-hspa::before {
+ content: "\F714";
+}
+.mdi-signal-hspa-plus::before {
+ content: "\F715";
+}
+.mdi-signal-off::before {
+ content: "\F782";
+}
+.mdi-signal-variant::before {
+ content: "\F60A";
+}
+.mdi-signature::before {
+ content: "\FE5B";
+}
+.mdi-signature-freehand::before {
+ content: "\FE5C";
+}
+.mdi-signature-image::before {
+ content: "\FE5D";
+}
+.mdi-signature-text::before {
+ content: "\FE5E";
+}
+.mdi-silo::before {
+ content: "\FB24";
+}
+.mdi-silverware::before {
+ content: "\F4A3";
+}
+.mdi-silverware-clean::before {
+ content: "\FFFF";
+}
+.mdi-silverware-fork::before {
+ content: "\F4A4";
+}
+.mdi-silverware-fork-knife::before {
+ content: "\FA6F";
+}
+.mdi-silverware-spoon::before {
+ content: "\F4A5";
+}
+.mdi-silverware-variant::before {
+ content: "\F4A6";
+}
+.mdi-sim::before {
+ content: "\F4A7";
+}
+.mdi-sim-alert::before {
+ content: "\F4A8";
+}
+.mdi-sim-off::before {
+ content: "\F4A9";
+}
+.mdi-simple-icons::before {
+ content: "\F0348";
+}
+.mdi-sina-weibo::before {
+ content: "\FADE";
+}
+.mdi-sitemap::before {
+ content: "\F4AA";
+}
+.mdi-skate::before {
+ content: "\FD11";
+}
+.mdi-skew-less::before {
+ content: "\FD12";
+}
+.mdi-skew-more::before {
+ content: "\FD13";
+}
+.mdi-ski::before {
+ content: "\F032F";
+}
+.mdi-ski-cross-country::before {
+ content: "\F0330";
+}
+.mdi-ski-water::before {
+ content: "\F0331";
+}
+.mdi-skip-backward::before {
+ content: "\F4AB";
+}
+.mdi-skip-backward-outline::before {
+ content: "\FF42";
+}
+.mdi-skip-forward::before {
+ content: "\F4AC";
+}
+.mdi-skip-forward-outline::before {
+ content: "\FF43";
+}
+.mdi-skip-next::before {
+ content: "\F4AD";
+}
+.mdi-skip-next-circle::before {
+ content: "\F661";
+}
+.mdi-skip-next-circle-outline::before {
+ content: "\F662";
+}
+.mdi-skip-next-outline::before {
+ content: "\FF44";
+}
+.mdi-skip-previous::before {
+ content: "\F4AE";
+}
+.mdi-skip-previous-circle::before {
+ content: "\F663";
+}
+.mdi-skip-previous-circle-outline::before {
+ content: "\F664";
+}
+.mdi-skip-previous-outline::before {
+ content: "\FF45";
+}
+.mdi-skull::before {
+ content: "\F68B";
+}
+.mdi-skull-crossbones::before {
+ content: "\FBA2";
+}
+.mdi-skull-crossbones-outline::before {
+ content: "\FBA3";
+}
+.mdi-skull-outline::before {
+ content: "\FBA4";
+}
+.mdi-skype::before {
+ content: "\F4AF";
+}
+.mdi-skype-business::before {
+ content: "\F4B0";
+}
+.mdi-slack::before {
+ content: "\F4B1";
+}
+.mdi-slackware::before {
+ content: "\F90A";
+}
+.mdi-slash-forward::before {
+ content: "\F0000";
+}
+.mdi-slash-forward-box::before {
+ content: "\F0001";
+}
+.mdi-sleep::before {
+ content: "\F4B2";
+}
+.mdi-sleep-off::before {
+ content: "\F4B3";
+}
+.mdi-slope-downhill::before {
+ content: "\FE5F";
+}
+.mdi-slope-uphill::before {
+ content: "\FE60";
+}
+.mdi-slot-machine::before {
+ content: "\F013F";
+}
+.mdi-slot-machine-outline::before {
+ content: "\F0140";
+}
+.mdi-smart-card::before {
+ content: "\F00E8";
+}
+.mdi-smart-card-outline::before {
+ content: "\F00E9";
+}
+.mdi-smart-card-reader::before {
+ content: "\F00EA";
+}
+.mdi-smart-card-reader-outline::before {
+ content: "\F00EB";
+}
+.mdi-smog::before {
+ content: "\FA70";
+}
+.mdi-smoke-detector::before {
+ content: "\F392";
+}
+.mdi-smoking::before {
+ content: "\F4B4";
+}
+.mdi-smoking-off::before {
+ content: "\F4B5";
+}
+.mdi-snapchat::before {
+ content: "\F4B6";
+}
+.mdi-snowboard::before {
+ content: "\F0332";
+}
+.mdi-snowflake::before {
+ content: "\F716";
+}
+.mdi-snowflake-alert::before {
+ content: "\FF46";
+}
+.mdi-snowflake-melt::before {
+ content: "\F02F6";
+}
+.mdi-snowflake-variant::before {
+ content: "\FF47";
+}
+.mdi-snowman::before {
+ content: "\F4B7";
+}
+.mdi-soccer::before {
+ content: "\F4B8";
+}
+.mdi-soccer-field::before {
+ content: "\F833";
+}
+.mdi-sofa::before {
+ content: "\F4B9";
+}
+.mdi-solar-panel::before {
+ content: "\FD77";
+}
+.mdi-solar-panel-large::before {
+ content: "\FD78";
+}
+.mdi-solar-power::before {
+ content: "\FA71";
+}
+.mdi-soldering-iron::before {
+ content: "\F00BD";
+}
+.mdi-solid::before {
+ content: "\F68C";
+}
+.mdi-sort::before {
+ content: "\F4BA";
+}
+.mdi-sort-alphabetical::before {
+ content: "\F4BB";
+}
+.mdi-sort-alphabetical-ascending::before {
+ content: "\F0173";
+}
+.mdi-sort-alphabetical-descending::before {
+ content: "\F0174";
+}
+.mdi-sort-ascending::before {
+ content: "\F4BC";
+}
+.mdi-sort-descending::before {
+ content: "\F4BD";
+}
+.mdi-sort-numeric::before {
+ content: "\F4BE";
+}
+.mdi-sort-variant::before {
+ content: "\F4BF";
+}
+.mdi-sort-variant-lock::before {
+ content: "\FCA9";
+}
+.mdi-sort-variant-lock-open::before {
+ content: "\FCAA";
+}
+.mdi-sort-variant-remove::before {
+ content: "\F0172";
+}
+.mdi-soundcloud::before {
+ content: "\F4C0";
+}
+.mdi-source-branch::before {
+ content: "\F62C";
+}
+.mdi-source-commit::before {
+ content: "\F717";
+}
+.mdi-source-commit-end::before {
+ content: "\F718";
+}
+.mdi-source-commit-end-local::before {
+ content: "\F719";
+}
+.mdi-source-commit-local::before {
+ content: "\F71A";
+}
+.mdi-source-commit-next-local::before {
+ content: "\F71B";
+}
+.mdi-source-commit-start::before {
+ content: "\F71C";
+}
+.mdi-source-commit-start-next-local::before {
+ content: "\F71D";
+}
+.mdi-source-fork::before {
+ content: "\F4C1";
+}
+.mdi-source-merge::before {
+ content: "\F62D";
+}
+.mdi-source-pull::before {
+ content: "\F4C2";
+}
+.mdi-source-repository::before {
+ content: "\FCAB";
+}
+.mdi-source-repository-multiple::before {
+ content: "\FCAC";
+}
+.mdi-soy-sauce::before {
+ content: "\F7ED";
+}
+.mdi-spa::before {
+ content: "\FCAD";
+}
+.mdi-spa-outline::before {
+ content: "\FCAE";
+}
+.mdi-space-invaders::before {
+ content: "\FBA5";
+}
+.mdi-space-station::before {
+ content: "\F03AE";
+}
+.mdi-spade::before {
+ content: "\FE48";
+}
+.mdi-speaker::before {
+ content: "\F4C3";
+}
+.mdi-speaker-bluetooth::before {
+ content: "\F9A1";
+}
+.mdi-speaker-multiple::before {
+ content: "\FD14";
+}
+.mdi-speaker-off::before {
+ content: "\F4C4";
+}
+.mdi-speaker-wireless::before {
+ content: "\F71E";
+}
+.mdi-speedometer::before {
+ content: "\F4C5";
+}
+.mdi-speedometer-medium::before {
+ content: "\FFA2";
+}
+.mdi-speedometer-slow::before {
+ content: "\FFA3";
+}
+.mdi-spellcheck::before {
+ content: "\F4C6";
+}
+.mdi-spider::before {
+ content: "\F0215";
+}
+.mdi-spider-thread::before {
+ content: "\F0216";
+}
+.mdi-spider-web::before {
+ content: "\FBA6";
+}
+.mdi-spotify::before {
+ content: "\F4C7";
+}
+.mdi-spotlight::before {
+ content: "\F4C8";
+}
+.mdi-spotlight-beam::before {
+ content: "\F4C9";
+}
+.mdi-spray::before {
+ content: "\F665";
+}
+.mdi-spray-bottle::before {
+ content: "\FADF";
+}
+.mdi-sprinkler::before {
+ content: "\F0081";
+}
+.mdi-sprinkler-variant::before {
+ content: "\F0082";
+}
+.mdi-sprout::before {
+ content: "\FE49";
+}
+.mdi-sprout-outline::before {
+ content: "\FE4A";
+}
+.mdi-square::before {
+ content: "\F763";
+}
+.mdi-square-edit-outline::before {
+ content: "\F90B";
+}
+.mdi-square-inc::before {
+ content: "\F4CA";
+}
+.mdi-square-inc-cash::before {
+ content: "\F4CB";
+}
+.mdi-square-medium::before {
+ content: "\FA12";
+}
+.mdi-square-medium-outline::before {
+ content: "\FA13";
+}
+.mdi-square-off::before {
+ content: "\F0319";
+}
+.mdi-square-off-outline::before {
+ content: "\F031A";
+}
+.mdi-square-outline::before {
+ content: "\F762";
+}
+.mdi-square-root::before {
+ content: "\F783";
+}
+.mdi-square-root-box::before {
+ content: "\F9A2";
+}
+.mdi-square-small::before {
+ content: "\FA14";
+}
+.mdi-squeegee::before {
+ content: "\FAE0";
+}
+.mdi-ssh::before {
+ content: "\F8BF";
+}
+.mdi-stack-exchange::before {
+ content: "\F60B";
+}
+.mdi-stack-overflow::before {
+ content: "\F4CC";
+}
+.mdi-stackpath::before {
+ content: "\F359";
+}
+.mdi-stadium::before {
+ content: "\F001A";
+}
+.mdi-stadium-variant::before {
+ content: "\F71F";
+}
+.mdi-stairs::before {
+ content: "\F4CD";
+}
+.mdi-stairs-down::before {
+ content: "\F02E9";
+}
+.mdi-stairs-up::before {
+ content: "\F02E8";
+}
+.mdi-stamper::before {
+ content: "\FD15";
+}
+.mdi-standard-definition::before {
+ content: "\F7EE";
+}
+.mdi-star::before {
+ content: "\F4CE";
+}
+.mdi-star-box::before {
+ content: "\FA72";
+}
+.mdi-star-box-multiple::before {
+ content: "\F02B1";
+}
+.mdi-star-box-multiple-outline::before {
+ content: "\F02B2";
+}
+.mdi-star-box-outline::before {
+ content: "\FA73";
+}
+.mdi-star-circle::before {
+ content: "\F4CF";
+}
+.mdi-star-circle-outline::before {
+ content: "\F9A3";
+}
+.mdi-star-face::before {
+ content: "\F9A4";
+}
+.mdi-star-four-points::before {
+ content: "\FAE1";
+}
+.mdi-star-four-points-outline::before {
+ content: "\FAE2";
+}
+.mdi-star-half::before {
+ content: "\F4D0";
+}
+.mdi-star-off::before {
+ content: "\F4D1";
+}
+.mdi-star-outline::before {
+ content: "\F4D2";
+}
+.mdi-star-three-points::before {
+ content: "\FAE3";
+}
+.mdi-star-three-points-outline::before {
+ content: "\FAE4";
+}
+.mdi-state-machine::before {
+ content: "\F021A";
+}
+.mdi-steam::before {
+ content: "\F4D3";
+}
+.mdi-steam-box::before {
+ content: "\F90C";
+}
+.mdi-steering::before {
+ content: "\F4D4";
+}
+.mdi-steering-off::before {
+ content: "\F90D";
+}
+.mdi-step-backward::before {
+ content: "\F4D5";
+}
+.mdi-step-backward-2::before {
+ content: "\F4D6";
+}
+.mdi-step-forward::before {
+ content: "\F4D7";
+}
+.mdi-step-forward-2::before {
+ content: "\F4D8";
+}
+.mdi-stethoscope::before {
+ content: "\F4D9";
+}
+.mdi-sticker::before {
+ content: "\F038F";
+}
+.mdi-sticker-alert::before {
+ content: "\F0390";
+}
+.mdi-sticker-alert-outline::before {
+ content: "\F0391";
+}
+.mdi-sticker-check::before {
+ content: "\F0392";
+}
+.mdi-sticker-check-outline::before {
+ content: "\F0393";
+}
+.mdi-sticker-circle-outline::before {
+ content: "\F5D0";
+}
+.mdi-sticker-emoji::before {
+ content: "\F784";
+}
+.mdi-sticker-minus::before {
+ content: "\F0394";
+}
+.mdi-sticker-minus-outline::before {
+ content: "\F0395";
+}
+.mdi-sticker-outline::before {
+ content: "\F0396";
+}
+.mdi-sticker-plus::before {
+ content: "\F0397";
+}
+.mdi-sticker-plus-outline::before {
+ content: "\F0398";
+}
+.mdi-sticker-remove::before {
+ content: "\F0399";
+}
+.mdi-sticker-remove-outline::before {
+ content: "\F039A";
+}
+.mdi-stocking::before {
+ content: "\F4DA";
+}
+.mdi-stomach::before {
+ content: "\F00BE";
+}
+.mdi-stop::before {
+ content: "\F4DB";
+}
+.mdi-stop-circle::before {
+ content: "\F666";
+}
+.mdi-stop-circle-outline::before {
+ content: "\F667";
+}
+.mdi-store::before {
+ content: "\F4DC";
+}
+.mdi-store-24-hour::before {
+ content: "\F4DD";
+}
+.mdi-store-outline::before {
+ content: "\F038C";
+}
+.mdi-storefront::before {
+ content: "\F00EC";
+}
+.mdi-stove::before {
+ content: "\F4DE";
+}
+.mdi-strategy::before {
+ content: "\F0201";
+}
+.mdi-strava::before {
+ content: "\FB25";
+}
+.mdi-stretch-to-page::before {
+ content: "\FF48";
+}
+.mdi-stretch-to-page-outline::before {
+ content: "\FF49";
+}
+.mdi-string-lights::before {
+ content: "\F02E5";
+}
+.mdi-string-lights-off::before {
+ content: "\F02E6";
+}
+.mdi-subdirectory-arrow-left::before {
+ content: "\F60C";
+}
+.mdi-subdirectory-arrow-right::before {
+ content: "\F60D";
+}
+.mdi-subtitles::before {
+ content: "\FA15";
+}
+.mdi-subtitles-outline::before {
+ content: "\FA16";
+}
+.mdi-subway::before {
+ content: "\F6AB";
+}
+.mdi-subway-alert-variant::before {
+ content: "\FD79";
+}
+.mdi-subway-variant::before {
+ content: "\F4DF";
+}
+.mdi-summit::before {
+ content: "\F785";
+}
+.mdi-sunglasses::before {
+ content: "\F4E0";
+}
+.mdi-surround-sound::before {
+ content: "\F5C5";
+}
+.mdi-surround-sound-2-0::before {
+ content: "\F7EF";
+}
+.mdi-surround-sound-3-1::before {
+ content: "\F7F0";
+}
+.mdi-surround-sound-5-1::before {
+ content: "\F7F1";
+}
+.mdi-surround-sound-7-1::before {
+ content: "\F7F2";
+}
+.mdi-svg::before {
+ content: "\F720";
+}
+.mdi-swap-horizontal::before {
+ content: "\F4E1";
+}
+.mdi-swap-horizontal-bold::before {
+ content: "\FBA9";
+}
+.mdi-swap-horizontal-circle::before {
+ content: "\F0002";
+}
+.mdi-swap-horizontal-circle-outline::before {
+ content: "\F0003";
+}
+.mdi-swap-horizontal-variant::before {
+ content: "\F8C0";
+}
+.mdi-swap-vertical::before {
+ content: "\F4E2";
+}
+.mdi-swap-vertical-bold::before {
+ content: "\FBAA";
+}
+.mdi-swap-vertical-circle::before {
+ content: "\F0004";
+}
+.mdi-swap-vertical-circle-outline::before {
+ content: "\F0005";
+}
+.mdi-swap-vertical-variant::before {
+ content: "\F8C1";
+}
+.mdi-swim::before {
+ content: "\F4E3";
+}
+.mdi-switch::before {
+ content: "\F4E4";
+}
+.mdi-sword::before {
+ content: "\F4E5";
+}
+.mdi-sword-cross::before {
+ content: "\F786";
+}
+.mdi-syllabary-hangul::before {
+ content: "\F035E";
+}
+.mdi-syllabary-hiragana::before {
+ content: "\F035F";
+}
+.mdi-syllabary-katakana::before {
+ content: "\F0360";
+}
+.mdi-syllabary-katakana-half-width::before {
+ content: "\F0361";
+}
+.mdi-symfony::before {
+ content: "\FAE5";
+}
+.mdi-sync::before {
+ content: "\F4E6";
+}
+.mdi-sync-alert::before {
+ content: "\F4E7";
+}
+.mdi-sync-circle::before {
+ content: "\F03A3";
+}
+.mdi-sync-off::before {
+ content: "\F4E8";
+}
+.mdi-tab::before {
+ content: "\F4E9";
+}
+.mdi-tab-minus::before {
+ content: "\FB26";
+}
+.mdi-tab-plus::before {
+ content: "\F75B";
+}
+.mdi-tab-remove::before {
+ content: "\FB27";
+}
+.mdi-tab-unselected::before {
+ content: "\F4EA";
+}
+.mdi-table::before {
+ content: "\F4EB";
+}
+.mdi-table-border::before {
+ content: "\FA17";
+}
+.mdi-table-chair::before {
+ content: "\F0083";
+}
+.mdi-table-column::before {
+ content: "\F834";
+}
+.mdi-table-column-plus-after::before {
+ content: "\F4EC";
+}
+.mdi-table-column-plus-before::before {
+ content: "\F4ED";
+}
+.mdi-table-column-remove::before {
+ content: "\F4EE";
+}
+.mdi-table-column-width::before {
+ content: "\F4EF";
+}
+.mdi-table-edit::before {
+ content: "\F4F0";
+}
+.mdi-table-eye::before {
+ content: "\F00BF";
+}
+.mdi-table-headers-eye::before {
+ content: "\F0248";
+}
+.mdi-table-headers-eye-off::before {
+ content: "\F0249";
+}
+.mdi-table-large::before {
+ content: "\F4F1";
+}
+.mdi-table-large-plus::before {
+ content: "\FFA4";
+}
+.mdi-table-large-remove::before {
+ content: "\FFA5";
+}
+.mdi-table-merge-cells::before {
+ content: "\F9A5";
+}
+.mdi-table-of-contents::before {
+ content: "\F835";
+}
+.mdi-table-plus::before {
+ content: "\FA74";
+}
+.mdi-table-remove::before {
+ content: "\FA75";
+}
+.mdi-table-row::before {
+ content: "\F836";
+}
+.mdi-table-row-height::before {
+ content: "\F4F2";
+}
+.mdi-table-row-plus-after::before {
+ content: "\F4F3";
+}
+.mdi-table-row-plus-before::before {
+ content: "\F4F4";
+}
+.mdi-table-row-remove::before {
+ content: "\F4F5";
+}
+.mdi-table-search::before {
+ content: "\F90E";
+}
+.mdi-table-settings::before {
+ content: "\F837";
+}
+.mdi-table-tennis::before {
+ content: "\FE4B";
+}
+.mdi-tablet::before {
+ content: "\F4F6";
+}
+.mdi-tablet-android::before {
+ content: "\F4F7";
+}
+.mdi-tablet-cellphone::before {
+ content: "\F9A6";
+}
+.mdi-tablet-dashboard::before {
+ content: "\FEEB";
+}
+.mdi-tablet-ipad::before {
+ content: "\F4F8";
+}
+.mdi-taco::before {
+ content: "\F761";
+}
+.mdi-tag::before {
+ content: "\F4F9";
+}
+.mdi-tag-faces::before {
+ content: "\F4FA";
+}
+.mdi-tag-heart::before {
+ content: "\F68A";
+}
+.mdi-tag-heart-outline::before {
+ content: "\FBAB";
+}
+.mdi-tag-minus::before {
+ content: "\F90F";
+}
+.mdi-tag-minus-outline::before {
+ content: "\F024A";
+}
+.mdi-tag-multiple::before {
+ content: "\F4FB";
+}
+.mdi-tag-multiple-outline::before {
+ content: "\F0322";
+}
+.mdi-tag-off::before {
+ content: "\F024B";
+}
+.mdi-tag-off-outline::before {
+ content: "\F024C";
+}
+.mdi-tag-outline::before {
+ content: "\F4FC";
+}
+.mdi-tag-plus::before {
+ content: "\F721";
+}
+.mdi-tag-plus-outline::before {
+ content: "\F024D";
+}
+.mdi-tag-remove::before {
+ content: "\F722";
+}
+.mdi-tag-remove-outline::before {
+ content: "\F024E";
+}
+.mdi-tag-text::before {
+ content: "\F024F";
+}
+.mdi-tag-text-outline::before {
+ content: "\F4FD";
+}
+.mdi-tank::before {
+ content: "\FD16";
+}
+.mdi-tanker-truck::before {
+ content: "\F0006";
+}
+.mdi-tape-measure::before {
+ content: "\FB28";
+}
+.mdi-target::before {
+ content: "\F4FE";
+}
+.mdi-target-account::before {
+ content: "\FBAC";
+}
+.mdi-target-variant::before {
+ content: "\FA76";
+}
+.mdi-taxi::before {
+ content: "\F4FF";
+}
+.mdi-tea::before {
+ content: "\FD7A";
+}
+.mdi-tea-outline::before {
+ content: "\FD7B";
+}
+.mdi-teach::before {
+ content: "\F88F";
+}
+.mdi-teamviewer::before {
+ content: "\F500";
+}
+.mdi-telegram::before {
+ content: "\F501";
+}
+.mdi-telescope::before {
+ content: "\FB29";
+}
+.mdi-television::before {
+ content: "\F502";
+}
+.mdi-television-ambient-light::before {
+ content: "\F0381";
+}
+.mdi-television-box::before {
+ content: "\F838";
+}
+.mdi-television-classic::before {
+ content: "\F7F3";
+}
+.mdi-television-classic-off::before {
+ content: "\F839";
+}
+.mdi-television-clean::before {
+ content: "\F013B";
+}
+.mdi-television-guide::before {
+ content: "\F503";
+}
+.mdi-television-off::before {
+ content: "\F83A";
+}
+.mdi-television-pause::before {
+ content: "\FFA6";
+}
+.mdi-television-play::before {
+ content: "\FEEC";
+}
+.mdi-television-stop::before {
+ content: "\FFA7";
+}
+.mdi-temperature-celsius::before {
+ content: "\F504";
+}
+.mdi-temperature-fahrenheit::before {
+ content: "\F505";
+}
+.mdi-temperature-kelvin::before {
+ content: "\F506";
+}
+.mdi-tennis::before {
+ content: "\FD7C";
+}
+.mdi-tennis-ball::before {
+ content: "\F507";
+}
+.mdi-tent::before {
+ content: "\F508";
+}
+.mdi-terraform::before {
+ content: "\F0084";
+}
+.mdi-terrain::before {
+ content: "\F509";
+}
+.mdi-test-tube::before {
+ content: "\F668";
+}
+.mdi-test-tube-empty::before {
+ content: "\F910";
+}
+.mdi-test-tube-off::before {
+ content: "\F911";
+}
+.mdi-text::before {
+ content: "\F9A7";
+}
+.mdi-text-recognition::before {
+ content: "\F0168";
+}
+.mdi-text-shadow::before {
+ content: "\F669";
+}
+.mdi-text-short::before {
+ content: "\F9A8";
+}
+.mdi-text-subject::before {
+ content: "\F9A9";
+}
+.mdi-text-to-speech::before {
+ content: "\F50A";
+}
+.mdi-text-to-speech-off::before {
+ content: "\F50B";
+}
+.mdi-textarea::before {
+ content: "\F00C0";
+}
+.mdi-textbox::before {
+ content: "\F60E";
+}
+.mdi-textbox-lock::before {
+ content: "\F0388";
+}
+.mdi-textbox-password::before {
+ content: "\F7F4";
+}
+.mdi-texture::before {
+ content: "\F50C";
+}
+.mdi-texture-box::before {
+ content: "\F0007";
+}
+.mdi-theater::before {
+ content: "\F50D";
+}
+.mdi-theme-light-dark::before {
+ content: "\F50E";
+}
+.mdi-thermometer::before {
+ content: "\F50F";
+}
+.mdi-thermometer-alert::before {
+ content: "\FE61";
+}
+.mdi-thermometer-chevron-down::before {
+ content: "\FE62";
+}
+.mdi-thermometer-chevron-up::before {
+ content: "\FE63";
+}
+.mdi-thermometer-high::before {
+ content: "\F00ED";
+}
+.mdi-thermometer-lines::before {
+ content: "\F510";
+}
+.mdi-thermometer-low::before {
+ content: "\F00EE";
+}
+.mdi-thermometer-minus::before {
+ content: "\FE64";
+}
+.mdi-thermometer-plus::before {
+ content: "\FE65";
+}
+.mdi-thermostat::before {
+ content: "\F393";
+}
+.mdi-thermostat-box::before {
+ content: "\F890";
+}
+.mdi-thought-bubble::before {
+ content: "\F7F5";
+}
+.mdi-thought-bubble-outline::before {
+ content: "\F7F6";
+}
+.mdi-thumb-down::before {
+ content: "\F511";
+}
+.mdi-thumb-down-outline::before {
+ content: "\F512";
+}
+.mdi-thumb-up::before {
+ content: "\F513";
+}
+.mdi-thumb-up-outline::before {
+ content: "\F514";
+}
+.mdi-thumbs-up-down::before {
+ content: "\F515";
+}
+.mdi-ticket::before {
+ content: "\F516";
+}
+.mdi-ticket-account::before {
+ content: "\F517";
+}
+.mdi-ticket-confirmation::before {
+ content: "\F518";
+}
+.mdi-ticket-outline::before {
+ content: "\F912";
+}
+.mdi-ticket-percent::before {
+ content: "\F723";
+}
+.mdi-tie::before {
+ content: "\F519";
+}
+.mdi-tilde::before {
+ content: "\F724";
+}
+.mdi-timelapse::before {
+ content: "\F51A";
+}
+.mdi-timeline::before {
+ content: "\FBAD";
+}
+.mdi-timeline-alert::before {
+ content: "\FFB2";
+}
+.mdi-timeline-alert-outline::before {
+ content: "\FFB5";
+}
+.mdi-timeline-clock::before {
+ content: "\F0226";
+}
+.mdi-timeline-clock-outline::before {
+ content: "\F0227";
+}
+.mdi-timeline-help::before {
+ content: "\FFB6";
+}
+.mdi-timeline-help-outline::before {
+ content: "\FFB7";
+}
+.mdi-timeline-outline::before {
+ content: "\FBAE";
+}
+.mdi-timeline-plus::before {
+ content: "\FFB3";
+}
+.mdi-timeline-plus-outline::before {
+ content: "\FFB4";
+}
+.mdi-timeline-text::before {
+ content: "\FBAF";
+}
+.mdi-timeline-text-outline::before {
+ content: "\FBB0";
+}
+.mdi-timer::before {
+ content: "\F51B";
+}
+.mdi-timer-10::before {
+ content: "\F51C";
+}
+.mdi-timer-3::before {
+ content: "\F51D";
+}
+.mdi-timer-off::before {
+ content: "\F51E";
+}
+.mdi-timer-sand::before {
+ content: "\F51F";
+}
+.mdi-timer-sand-empty::before {
+ content: "\F6AC";
+}
+.mdi-timer-sand-full::before {
+ content: "\F78B";
+}
+.mdi-timetable::before {
+ content: "\F520";
+}
+.mdi-toaster::before {
+ content: "\F0085";
+}
+.mdi-toaster-off::before {
+ content: "\F01E2";
+}
+.mdi-toaster-oven::before {
+ content: "\FCAF";
+}
+.mdi-toggle-switch::before {
+ content: "\F521";
+}
+.mdi-toggle-switch-off::before {
+ content: "\F522";
+}
+.mdi-toggle-switch-off-outline::before {
+ content: "\FA18";
+}
+.mdi-toggle-switch-outline::before {
+ content: "\FA19";
+}
+.mdi-toilet::before {
+ content: "\F9AA";
+}
+.mdi-toolbox::before {
+ content: "\F9AB";
+}
+.mdi-toolbox-outline::before {
+ content: "\F9AC";
+}
+.mdi-tools::before {
+ content: "\F0086";
+}
+.mdi-tooltip::before {
+ content: "\F523";
+}
+.mdi-tooltip-account::before {
+ content: "\F00C";
+}
+.mdi-tooltip-edit::before {
+ content: "\F524";
+}
+.mdi-tooltip-edit-outline::before {
+ content: "\F02F0";
+}
+.mdi-tooltip-image::before {
+ content: "\F525";
+}
+.mdi-tooltip-image-outline::before {
+ content: "\FBB1";
+}
+.mdi-tooltip-outline::before {
+ content: "\F526";
+}
+.mdi-tooltip-plus::before {
+ content: "\FBB2";
+}
+.mdi-tooltip-plus-outline::before {
+ content: "\F527";
+}
+.mdi-tooltip-text::before {
+ content: "\F528";
+}
+.mdi-tooltip-text-outline::before {
+ content: "\FBB3";
+}
+.mdi-tooth::before {
+ content: "\F8C2";
+}
+.mdi-tooth-outline::before {
+ content: "\F529";
+}
+.mdi-toothbrush::before {
+ content: "\F0154";
+}
+.mdi-toothbrush-electric::before {
+ content: "\F0157";
+}
+.mdi-toothbrush-paste::before {
+ content: "\F0155";
+}
+.mdi-tor::before {
+ content: "\F52A";
+}
+.mdi-tortoise::before {
+ content: "\FD17";
+}
+.mdi-toslink::before {
+ content: "\F02E3";
+}
+.mdi-tournament::before {
+ content: "\F9AD";
+}
+.mdi-tower-beach::before {
+ content: "\F680";
+}
+.mdi-tower-fire::before {
+ content: "\F681";
+}
+.mdi-towing::before {
+ content: "\F83B";
+}
+.mdi-toy-brick::before {
+ content: "\F02B3";
+}
+.mdi-toy-brick-marker::before {
+ content: "\F02B4";
+}
+.mdi-toy-brick-marker-outline::before {
+ content: "\F02B5";
+}
+.mdi-toy-brick-minus::before {
+ content: "\F02B6";
+}
+.mdi-toy-brick-minus-outline::before {
+ content: "\F02B7";
+}
+.mdi-toy-brick-outline::before {
+ content: "\F02B8";
+}
+.mdi-toy-brick-plus::before {
+ content: "\F02B9";
+}
+.mdi-toy-brick-plus-outline::before {
+ content: "\F02BA";
+}
+.mdi-toy-brick-remove::before {
+ content: "\F02BB";
+}
+.mdi-toy-brick-remove-outline::before {
+ content: "\F02BC";
+}
+.mdi-toy-brick-search::before {
+ content: "\F02BD";
+}
+.mdi-toy-brick-search-outline::before {
+ content: "\F02BE";
+}
+.mdi-track-light::before {
+ content: "\F913";
+}
+.mdi-trackpad::before {
+ content: "\F7F7";
+}
+.mdi-trackpad-lock::before {
+ content: "\F932";
+}
+.mdi-tractor::before {
+ content: "\F891";
+}
+.mdi-trademark::before {
+ content: "\FA77";
+}
+.mdi-traffic-cone::before {
+ content: "\F03A7";
+}
+.mdi-traffic-light::before {
+ content: "\F52B";
+}
+.mdi-train::before {
+ content: "\F52C";
+}
+.mdi-train-car::before {
+ content: "\FBB4";
+}
+.mdi-train-variant::before {
+ content: "\F8C3";
+}
+.mdi-tram::before {
+ content: "\F52D";
+}
+.mdi-tram-side::before {
+ content: "\F0008";
+}
+.mdi-transcribe::before {
+ content: "\F52E";
+}
+.mdi-transcribe-close::before {
+ content: "\F52F";
+}
+.mdi-transfer::before {
+ content: "\F0087";
+}
+.mdi-transfer-down::before {
+ content: "\FD7D";
+}
+.mdi-transfer-left::before {
+ content: "\FD7E";
+}
+.mdi-transfer-right::before {
+ content: "\F530";
+}
+.mdi-transfer-up::before {
+ content: "\FD7F";
+}
+.mdi-transit-connection::before {
+ content: "\FD18";
+}
+.mdi-transit-connection-variant::before {
+ content: "\FD19";
+}
+.mdi-transit-detour::before {
+ content: "\FFA8";
+}
+.mdi-transit-transfer::before {
+ content: "\F6AD";
+}
+.mdi-transition::before {
+ content: "\F914";
+}
+.mdi-transition-masked::before {
+ content: "\F915";
+}
+.mdi-translate::before {
+ content: "\F5CA";
+}
+.mdi-translate-off::before {
+ content: "\FE66";
+}
+.mdi-transmission-tower::before {
+ content: "\FD1A";
+}
+.mdi-trash-can::before {
+ content: "\FA78";
+}
+.mdi-trash-can-outline::before {
+ content: "\FA79";
+}
+.mdi-tray::before {
+ content: "\F02BF";
+}
+.mdi-tray-alert::before {
+ content: "\F02C0";
+}
+.mdi-tray-full::before {
+ content: "\F02C1";
+}
+.mdi-tray-minus::before {
+ content: "\F02C2";
+}
+.mdi-tray-plus::before {
+ content: "\F02C3";
+}
+.mdi-tray-remove::before {
+ content: "\F02C4";
+}
+.mdi-treasure-chest::before {
+ content: "\F725";
+}
+.mdi-tree::before {
+ content: "\F531";
+}
+.mdi-tree-outline::before {
+ content: "\FE4C";
+}
+.mdi-trello::before {
+ content: "\F532";
+}
+.mdi-trending-down::before {
+ content: "\F533";
+}
+.mdi-trending-neutral::before {
+ content: "\F534";
+}
+.mdi-trending-up::before {
+ content: "\F535";
+}
+.mdi-triangle::before {
+ content: "\F536";
+}
+.mdi-triangle-outline::before {
+ content: "\F537";
+}
+.mdi-triforce::before {
+ content: "\FBB5";
+}
+.mdi-trophy::before {
+ content: "\F538";
+}
+.mdi-trophy-award::before {
+ content: "\F539";
+}
+.mdi-trophy-broken::before {
+ content: "\FD80";
+}
+.mdi-trophy-outline::before {
+ content: "\F53A";
+}
+.mdi-trophy-variant::before {
+ content: "\F53B";
+}
+.mdi-trophy-variant-outline::before {
+ content: "\F53C";
+}
+.mdi-truck::before {
+ content: "\F53D";
+}
+.mdi-truck-check::before {
+ content: "\FCB0";
+}
+.mdi-truck-check-outline::before {
+ content: "\F02C5";
+}
+.mdi-truck-delivery::before {
+ content: "\F53E";
+}
+.mdi-truck-delivery-outline::before {
+ content: "\F02C6";
+}
+.mdi-truck-fast::before {
+ content: "\F787";
+}
+.mdi-truck-fast-outline::before {
+ content: "\F02C7";
+}
+.mdi-truck-outline::before {
+ content: "\F02C8";
+}
+.mdi-truck-trailer::before {
+ content: "\F726";
+}
+.mdi-trumpet::before {
+ content: "\F00C1";
+}
+.mdi-tshirt-crew::before {
+ content: "\FA7A";
+}
+.mdi-tshirt-crew-outline::before {
+ content: "\F53F";
+}
+.mdi-tshirt-v::before {
+ content: "\FA7B";
+}
+.mdi-tshirt-v-outline::before {
+ content: "\F540";
+}
+.mdi-tumble-dryer::before {
+ content: "\F916";
+}
+.mdi-tumble-dryer-alert::before {
+ content: "\F01E5";
+}
+.mdi-tumble-dryer-off::before {
+ content: "\F01E6";
+}
+.mdi-tumblr::before {
+ content: "\F541";
+}
+.mdi-tumblr-box::before {
+ content: "\F917";
+}
+.mdi-tumblr-reblog::before {
+ content: "\F542";
+}
+.mdi-tune::before {
+ content: "\F62E";
+}
+.mdi-tune-vertical::before {
+ content: "\F66A";
+}
+.mdi-turnstile::before {
+ content: "\FCB1";
+}
+.mdi-turnstile-outline::before {
+ content: "\FCB2";
+}
+.mdi-turtle::before {
+ content: "\FCB3";
+}
+.mdi-twitch::before {
+ content: "\F543";
+}
+.mdi-twitter::before {
+ content: "\F544";
+}
+.mdi-twitter-box::before {
+ content: "\F545";
+}
+.mdi-twitter-circle::before {
+ content: "\F546";
+}
+.mdi-twitter-retweet::before {
+ content: "\F547";
+}
+.mdi-two-factor-authentication::before {
+ content: "\F9AE";
+}
+.mdi-typewriter::before {
+ content: "\FF4A";
+}
+.mdi-uber::before {
+ content: "\F748";
+}
+.mdi-ubisoft::before {
+ content: "\FBB6";
+}
+.mdi-ubuntu::before {
+ content: "\F548";
+}
+.mdi-ufo::before {
+ content: "\F00EF";
+}
+.mdi-ufo-outline::before {
+ content: "\F00F0";
+}
+.mdi-ultra-high-definition::before {
+ content: "\F7F8";
+}
+.mdi-umbraco::before {
+ content: "\F549";
+}
+.mdi-umbrella::before {
+ content: "\F54A";
+}
+.mdi-umbrella-closed::before {
+ content: "\F9AF";
+}
+.mdi-umbrella-outline::before {
+ content: "\F54B";
+}
+.mdi-undo::before {
+ content: "\F54C";
+}
+.mdi-undo-variant::before {
+ content: "\F54D";
+}
+.mdi-unfold-less-horizontal::before {
+ content: "\F54E";
+}
+.mdi-unfold-less-vertical::before {
+ content: "\F75F";
+}
+.mdi-unfold-more-horizontal::before {
+ content: "\F54F";
+}
+.mdi-unfold-more-vertical::before {
+ content: "\F760";
+}
+.mdi-ungroup::before {
+ content: "\F550";
+}
+.mdi-unicode::before {
+ content: "\FEED";
+}
+.mdi-unity::before {
+ content: "\F6AE";
+}
+.mdi-unreal::before {
+ content: "\F9B0";
+}
+.mdi-untappd::before {
+ content: "\F551";
+}
+.mdi-update::before {
+ content: "\F6AF";
+}
+.mdi-upload::before {
+ content: "\F552";
+}
+.mdi-upload-lock::before {
+ content: "\F039E";
+}
+.mdi-upload-lock-outline::before {
+ content: "\F039F";
+}
+.mdi-upload-multiple::before {
+ content: "\F83C";
+}
+.mdi-upload-network::before {
+ content: "\F6F5";
+}
+.mdi-upload-network-outline::before {
+ content: "\FCB4";
+}
+.mdi-upload-off::before {
+ content: "\F00F1";
+}
+.mdi-upload-off-outline::before {
+ content: "\F00F2";
+}
+.mdi-upload-outline::before {
+ content: "\FE67";
+}
+.mdi-usb::before {
+ content: "\F553";
+}
+.mdi-usb-flash-drive::before {
+ content: "\F02C9";
+}
+.mdi-usb-flash-drive-outline::before {
+ content: "\F02CA";
+}
+.mdi-usb-port::before {
+ content: "\F021B";
+}
+.mdi-valve::before {
+ content: "\F0088";
+}
+.mdi-valve-closed::before {
+ content: "\F0089";
+}
+.mdi-valve-open::before {
+ content: "\F008A";
+}
+.mdi-van-passenger::before {
+ content: "\F7F9";
+}
+.mdi-van-utility::before {
+ content: "\F7FA";
+}
+.mdi-vanish::before {
+ content: "\F7FB";
+}
+.mdi-vanity-light::before {
+ content: "\F020C";
+}
+.mdi-variable::before {
+ content: "\FAE6";
+}
+.mdi-variable-box::before {
+ content: "\F013C";
+}
+.mdi-vector-arrange-above::before {
+ content: "\F554";
+}
+.mdi-vector-arrange-below::before {
+ content: "\F555";
+}
+.mdi-vector-bezier::before {
+ content: "\FAE7";
+}
+.mdi-vector-circle::before {
+ content: "\F556";
+}
+.mdi-vector-circle-variant::before {
+ content: "\F557";
+}
+.mdi-vector-combine::before {
+ content: "\F558";
+}
+.mdi-vector-curve::before {
+ content: "\F559";
+}
+.mdi-vector-difference::before {
+ content: "\F55A";
+}
+.mdi-vector-difference-ab::before {
+ content: "\F55B";
+}
+.mdi-vector-difference-ba::before {
+ content: "\F55C";
+}
+.mdi-vector-ellipse::before {
+ content: "\F892";
+}
+.mdi-vector-intersection::before {
+ content: "\F55D";
+}
+.mdi-vector-line::before {
+ content: "\F55E";
+}
+.mdi-vector-link::before {
+ content: "\F0009";
+}
+.mdi-vector-point::before {
+ content: "\F55F";
+}
+.mdi-vector-polygon::before {
+ content: "\F560";
+}
+.mdi-vector-polyline::before {
+ content: "\F561";
+}
+.mdi-vector-polyline-edit::before {
+ content: "\F0250";
+}
+.mdi-vector-polyline-minus::before {
+ content: "\F0251";
+}
+.mdi-vector-polyline-plus::before {
+ content: "\F0252";
+}
+.mdi-vector-polyline-remove::before {
+ content: "\F0253";
+}
+.mdi-vector-radius::before {
+ content: "\F749";
+}
+.mdi-vector-rectangle::before {
+ content: "\F5C6";
+}
+.mdi-vector-selection::before {
+ content: "\F562";
+}
+.mdi-vector-square::before {
+ content: "\F001";
+}
+.mdi-vector-triangle::before {
+ content: "\F563";
+}
+.mdi-vector-union::before {
+ content: "\F564";
+}
+.mdi-venmo::before {
+ content: "\F578";
+}
+.mdi-vhs::before {
+ content: "\FA1A";
+}
+.mdi-vibrate::before {
+ content: "\F566";
+}
+.mdi-vibrate-off::before {
+ content: "\FCB5";
+}
+.mdi-video::before {
+ content: "\F567";
+}
+.mdi-video-3d::before {
+ content: "\F7FC";
+}
+.mdi-video-3d-variant::before {
+ content: "\FEEE";
+}
+.mdi-video-4k-box::before {
+ content: "\F83D";
+}
+.mdi-video-account::before {
+ content: "\F918";
+}
+.mdi-video-check::before {
+ content: "\F008B";
+}
+.mdi-video-check-outline::before {
+ content: "\F008C";
+}
+.mdi-video-image::before {
+ content: "\F919";
+}
+.mdi-video-input-antenna::before {
+ content: "\F83E";
+}
+.mdi-video-input-component::before {
+ content: "\F83F";
+}
+.mdi-video-input-hdmi::before {
+ content: "\F840";
+}
+.mdi-video-input-scart::before {
+ content: "\FFA9";
+}
+.mdi-video-input-svideo::before {
+ content: "\F841";
+}
+.mdi-video-minus::before {
+ content: "\F9B1";
+}
+.mdi-video-off::before {
+ content: "\F568";
+}
+.mdi-video-off-outline::before {
+ content: "\FBB7";
+}
+.mdi-video-outline::before {
+ content: "\FBB8";
+}
+.mdi-video-plus::before {
+ content: "\F9B2";
+}
+.mdi-video-stabilization::before {
+ content: "\F91A";
+}
+.mdi-video-switch::before {
+ content: "\F569";
+}
+.mdi-video-vintage::before {
+ content: "\FA1B";
+}
+.mdi-video-wireless::before {
+ content: "\FEEF";
+}
+.mdi-video-wireless-outline::before {
+ content: "\FEF0";
+}
+.mdi-view-agenda::before {
+ content: "\F56A";
+}
+.mdi-view-agenda-outline::before {
+ content: "\F0203";
+}
+.mdi-view-array::before {
+ content: "\F56B";
+}
+.mdi-view-carousel::before {
+ content: "\F56C";
+}
+.mdi-view-column::before {
+ content: "\F56D";
+}
+.mdi-view-comfy::before {
+ content: "\FE4D";
+}
+.mdi-view-compact::before {
+ content: "\FE4E";
+}
+.mdi-view-compact-outline::before {
+ content: "\FE4F";
+}
+.mdi-view-dashboard::before {
+ content: "\F56E";
+}
+.mdi-view-dashboard-outline::before {
+ content: "\FA1C";
+}
+.mdi-view-dashboard-variant::before {
+ content: "\F842";
+}
+.mdi-view-day::before {
+ content: "\F56F";
+}
+.mdi-view-grid::before {
+ content: "\F570";
+}
+.mdi-view-grid-outline::before {
+ content: "\F0204";
+}
+.mdi-view-grid-plus::before {
+ content: "\FFAA";
+}
+.mdi-view-grid-plus-outline::before {
+ content: "\F0205";
+}
+.mdi-view-headline::before {
+ content: "\F571";
+}
+.mdi-view-list::before {
+ content: "\F572";
+}
+.mdi-view-module::before {
+ content: "\F573";
+}
+.mdi-view-parallel::before {
+ content: "\F727";
+}
+.mdi-view-quilt::before {
+ content: "\F574";
+}
+.mdi-view-sequential::before {
+ content: "\F728";
+}
+.mdi-view-split-horizontal::before {
+ content: "\FBA7";
+}
+.mdi-view-split-vertical::before {
+ content: "\FBA8";
+}
+.mdi-view-stream::before {
+ content: "\F575";
+}
+.mdi-view-week::before {
+ content: "\F576";
+}
+.mdi-vimeo::before {
+ content: "\F577";
+}
+.mdi-violin::before {
+ content: "\F60F";
+}
+.mdi-virtual-reality::before {
+ content: "\F893";
+}
+.mdi-visual-studio::before {
+ content: "\F610";
+}
+.mdi-visual-studio-code::before {
+ content: "\FA1D";
+}
+.mdi-vk::before {
+ content: "\F579";
+}
+.mdi-vk-box::before {
+ content: "\F57A";
+}
+.mdi-vk-circle::before {
+ content: "\F57B";
+}
+.mdi-vlc::before {
+ content: "\F57C";
+}
+.mdi-voice::before {
+ content: "\F5CB";
+}
+.mdi-voice-off::before {
+ content: "\FEF1";
+}
+.mdi-voicemail::before {
+ content: "\F57D";
+}
+.mdi-volleyball::before {
+ content: "\F9B3";
+}
+.mdi-volume-high::before {
+ content: "\F57E";
+}
+.mdi-volume-low::before {
+ content: "\F57F";
+}
+.mdi-volume-medium::before {
+ content: "\F580";
+}
+.mdi-volume-minus::before {
+ content: "\F75D";
+}
+.mdi-volume-mute::before {
+ content: "\F75E";
+}
+.mdi-volume-off::before {
+ content: "\F581";
+}
+.mdi-volume-plus::before {
+ content: "\F75C";
+}
+.mdi-volume-source::before {
+ content: "\F014B";
+}
+.mdi-volume-variant-off::before {
+ content: "\FE68";
+}
+.mdi-volume-vibrate::before {
+ content: "\F014C";
+}
+.mdi-vote::before {
+ content: "\FA1E";
+}
+.mdi-vote-outline::before {
+ content: "\FA1F";
+}
+.mdi-vpn::before {
+ content: "\F582";
+}
+.mdi-vuejs::before {
+ content: "\F843";
+}
+.mdi-vuetify::before {
+ content: "\FE50";
+}
+.mdi-walk::before {
+ content: "\F583";
+}
+.mdi-wall::before {
+ content: "\F7FD";
+}
+.mdi-wall-sconce::before {
+ content: "\F91B";
+}
+.mdi-wall-sconce-flat::before {
+ content: "\F91C";
+}
+.mdi-wall-sconce-variant::before {
+ content: "\F91D";
+}
+.mdi-wallet::before {
+ content: "\F584";
+}
+.mdi-wallet-giftcard::before {
+ content: "\F585";
+}
+.mdi-wallet-membership::before {
+ content: "\F586";
+}
+.mdi-wallet-outline::before {
+ content: "\FBB9";
+}
+.mdi-wallet-plus::before {
+ content: "\FFAB";
+}
+.mdi-wallet-plus-outline::before {
+ content: "\FFAC";
+}
+.mdi-wallet-travel::before {
+ content: "\F587";
+}
+.mdi-wallpaper::before {
+ content: "\FE69";
+}
+.mdi-wan::before {
+ content: "\F588";
+}
+.mdi-wardrobe::before {
+ content: "\FFAD";
+}
+.mdi-wardrobe-outline::before {
+ content: "\FFAE";
+}
+.mdi-warehouse::before {
+ content: "\FFBB";
+}
+.mdi-washing-machine::before {
+ content: "\F729";
+}
+.mdi-washing-machine-alert::before {
+ content: "\F01E7";
+}
+.mdi-washing-machine-off::before {
+ content: "\F01E8";
+}
+.mdi-watch::before {
+ content: "\F589";
+}
+.mdi-watch-export::before {
+ content: "\F58A";
+}
+.mdi-watch-export-variant::before {
+ content: "\F894";
+}
+.mdi-watch-import::before {
+ content: "\F58B";
+}
+.mdi-watch-import-variant::before {
+ content: "\F895";
+}
+.mdi-watch-variant::before {
+ content: "\F896";
+}
+.mdi-watch-vibrate::before {
+ content: "\F6B0";
+}
+.mdi-watch-vibrate-off::before {
+ content: "\FCB6";
+}
+.mdi-water::before {
+ content: "\F58C";
+}
+.mdi-water-boiler::before {
+ content: "\FFAF";
+}
+.mdi-water-boiler-alert::before {
+ content: "\F01DE";
+}
+.mdi-water-boiler-off::before {
+ content: "\F01DF";
+}
+.mdi-water-off::before {
+ content: "\F58D";
+}
+.mdi-water-outline::before {
+ content: "\FE6A";
+}
+.mdi-water-percent::before {
+ content: "\F58E";
+}
+.mdi-water-polo::before {
+ content: "\F02CB";
+}
+.mdi-water-pump::before {
+ content: "\F58F";
+}
+.mdi-water-pump-off::before {
+ content: "\FFB0";
+}
+.mdi-water-well::before {
+ content: "\F008D";
+}
+.mdi-water-well-outline::before {
+ content: "\F008E";
+}
+.mdi-watermark::before {
+ content: "\F612";
+}
+.mdi-wave::before {
+ content: "\FF4B";
+}
+.mdi-waves::before {
+ content: "\F78C";
+}
+.mdi-waze::before {
+ content: "\FBBA";
+}
+.mdi-weather-cloudy::before {
+ content: "\F590";
+}
+.mdi-weather-cloudy-alert::before {
+ content: "\FF4C";
+}
+.mdi-weather-cloudy-arrow-right::before {
+ content: "\FE51";
+}
+.mdi-weather-fog::before {
+ content: "\F591";
+}
+.mdi-weather-hail::before {
+ content: "\F592";
+}
+.mdi-weather-hazy::before {
+ content: "\FF4D";
+}
+.mdi-weather-hurricane::before {
+ content: "\F897";
+}
+.mdi-weather-lightning::before {
+ content: "\F593";
+}
+.mdi-weather-lightning-rainy::before {
+ content: "\F67D";
+}
+.mdi-weather-night::before {
+ content: "\F594";
+}
+.mdi-weather-night-partly-cloudy::before {
+ content: "\FF4E";
+}
+.mdi-weather-partly-cloudy::before {
+ content: "\F595";
+}
+.mdi-weather-partly-lightning::before {
+ content: "\FF4F";
+}
+.mdi-weather-partly-rainy::before {
+ content: "\FF50";
+}
+.mdi-weather-partly-snowy::before {
+ content: "\FF51";
+}
+.mdi-weather-partly-snowy-rainy::before {
+ content: "\FF52";
+}
+.mdi-weather-pouring::before {
+ content: "\F596";
+}
+.mdi-weather-rainy::before {
+ content: "\F597";
+}
+.mdi-weather-snowy::before {
+ content: "\F598";
+}
+.mdi-weather-snowy-heavy::before {
+ content: "\FF53";
+}
+.mdi-weather-snowy-rainy::before {
+ content: "\F67E";
+}
+.mdi-weather-sunny::before {
+ content: "\F599";
+}
+.mdi-weather-sunny-alert::before {
+ content: "\FF54";
+}
+.mdi-weather-sunset::before {
+ content: "\F59A";
+}
+.mdi-weather-sunset-down::before {
+ content: "\F59B";
+}
+.mdi-weather-sunset-up::before {
+ content: "\F59C";
+}
+.mdi-weather-tornado::before {
+ content: "\FF55";
+}
+.mdi-weather-windy::before {
+ content: "\F59D";
+}
+.mdi-weather-windy-variant::before {
+ content: "\F59E";
+}
+.mdi-web::before {
+ content: "\F59F";
+}
+.mdi-web-box::before {
+ content: "\FFB1";
+}
+.mdi-web-clock::before {
+ content: "\F0275";
+}
+.mdi-webcam::before {
+ content: "\F5A0";
+}
+.mdi-webhook::before {
+ content: "\F62F";
+}
+.mdi-webpack::before {
+ content: "\F72A";
+}
+.mdi-webrtc::before {
+ content: "\F0273";
+}
+.mdi-wechat::before {
+ content: "\F611";
+}
+.mdi-weight::before {
+ content: "\F5A1";
+}
+.mdi-weight-gram::before {
+ content: "\FD1B";
+}
+.mdi-weight-kilogram::before {
+ content: "\F5A2";
+}
+.mdi-weight-lifter::before {
+ content: "\F0188";
+}
+.mdi-weight-pound::before {
+ content: "\F9B4";
+}
+.mdi-whatsapp::before {
+ content: "\F5A3";
+}
+.mdi-wheelchair-accessibility::before {
+ content: "\F5A4";
+}
+.mdi-whistle::before {
+ content: "\F9B5";
+}
+.mdi-whistle-outline::before {
+ content: "\F02E7";
+}
+.mdi-white-balance-auto::before {
+ content: "\F5A5";
+}
+.mdi-white-balance-incandescent::before {
+ content: "\F5A6";
+}
+.mdi-white-balance-iridescent::before {
+ content: "\F5A7";
+}
+.mdi-white-balance-sunny::before {
+ content: "\F5A8";
+}
+.mdi-widgets::before {
+ content: "\F72B";
+}
+.mdi-widgets-outline::before {
+ content: "\F0380";
+}
+.mdi-wifi::before {
+ content: "\F5A9";
+}
+.mdi-wifi-off::before {
+ content: "\F5AA";
+}
+.mdi-wifi-star::before {
+ content: "\FE6B";
+}
+.mdi-wifi-strength-1::before {
+ content: "\F91E";
+}
+.mdi-wifi-strength-1-alert::before {
+ content: "\F91F";
+}
+.mdi-wifi-strength-1-lock::before {
+ content: "\F920";
+}
+.mdi-wifi-strength-2::before {
+ content: "\F921";
+}
+.mdi-wifi-strength-2-alert::before {
+ content: "\F922";
+}
+.mdi-wifi-strength-2-lock::before {
+ content: "\F923";
+}
+.mdi-wifi-strength-3::before {
+ content: "\F924";
+}
+.mdi-wifi-strength-3-alert::before {
+ content: "\F925";
+}
+.mdi-wifi-strength-3-lock::before {
+ content: "\F926";
+}
+.mdi-wifi-strength-4::before {
+ content: "\F927";
+}
+.mdi-wifi-strength-4-alert::before {
+ content: "\F928";
+}
+.mdi-wifi-strength-4-lock::before {
+ content: "\F929";
+}
+.mdi-wifi-strength-alert-outline::before {
+ content: "\F92A";
+}
+.mdi-wifi-strength-lock-outline::before {
+ content: "\F92B";
+}
+.mdi-wifi-strength-off::before {
+ content: "\F92C";
+}
+.mdi-wifi-strength-off-outline::before {
+ content: "\F92D";
+}
+.mdi-wifi-strength-outline::before {
+ content: "\F92E";
+}
+.mdi-wii::before {
+ content: "\F5AB";
+}
+.mdi-wiiu::before {
+ content: "\F72C";
+}
+.mdi-wikipedia::before {
+ content: "\F5AC";
+}
+.mdi-wind-turbine::before {
+ content: "\FD81";
+}
+.mdi-window-close::before {
+ content: "\F5AD";
+}
+.mdi-window-closed::before {
+ content: "\F5AE";
+}
+.mdi-window-closed-variant::before {
+ content: "\F0206";
+}
+.mdi-window-maximize::before {
+ content: "\F5AF";
+}
+.mdi-window-minimize::before {
+ content: "\F5B0";
+}
+.mdi-window-open::before {
+ content: "\F5B1";
+}
+.mdi-window-open-variant::before {
+ content: "\F0207";
+}
+.mdi-window-restore::before {
+ content: "\F5B2";
+}
+.mdi-window-shutter::before {
+ content: "\F0147";
+}
+.mdi-window-shutter-alert::before {
+ content: "\F0148";
+}
+.mdi-window-shutter-open::before {
+ content: "\F0149";
+}
+.mdi-windows::before {
+ content: "\F5B3";
+}
+.mdi-windows-classic::before {
+ content: "\FA20";
+}
+.mdi-wiper::before {
+ content: "\FAE8";
+}
+.mdi-wiper-wash::before {
+ content: "\FD82";
+}
+.mdi-wordpress::before {
+ content: "\F5B4";
+}
+.mdi-worker::before {
+ content: "\F5B5";
+}
+.mdi-wrap::before {
+ content: "\F5B6";
+}
+.mdi-wrap-disabled::before {
+ content: "\FBBB";
+}
+.mdi-wrench::before {
+ content: "\F5B7";
+}
+.mdi-wrench-outline::before {
+ content: "\FBBC";
+}
+.mdi-wunderlist::before {
+ content: "\F5B8";
+}
+.mdi-xamarin::before {
+ content: "\F844";
+}
+.mdi-xamarin-outline::before {
+ content: "\F845";
+}
+.mdi-xaml::before {
+ content: "\F673";
+}
+.mdi-xbox::before {
+ content: "\F5B9";
+}
+.mdi-xbox-controller::before {
+ content: "\F5BA";
+}
+.mdi-xbox-controller-battery-alert::before {
+ content: "\F74A";
+}
+.mdi-xbox-controller-battery-charging::before {
+ content: "\FA21";
+}
+.mdi-xbox-controller-battery-empty::before {
+ content: "\F74B";
+}
+.mdi-xbox-controller-battery-full::before {
+ content: "\F74C";
+}
+.mdi-xbox-controller-battery-low::before {
+ content: "\F74D";
+}
+.mdi-xbox-controller-battery-medium::before {
+ content: "\F74E";
+}
+.mdi-xbox-controller-battery-unknown::before {
+ content: "\F74F";
+}
+.mdi-xbox-controller-menu::before {
+ content: "\FE52";
+}
+.mdi-xbox-controller-off::before {
+ content: "\F5BB";
+}
+.mdi-xbox-controller-view::before {
+ content: "\FE53";
+}
+.mdi-xda::before {
+ content: "\F5BC";
+}
+.mdi-xing::before {
+ content: "\F5BD";
+}
+.mdi-xing-box::before {
+ content: "\F5BE";
+}
+.mdi-xing-circle::before {
+ content: "\F5BF";
+}
+.mdi-xml::before {
+ content: "\F5C0";
+}
+.mdi-xmpp::before {
+ content: "\F7FE";
+}
+.mdi-yahoo::before {
+ content: "\FB2A";
+}
+.mdi-yammer::before {
+ content: "\F788";
+}
+.mdi-yeast::before {
+ content: "\F5C1";
+}
+.mdi-yelp::before {
+ content: "\F5C2";
+}
+.mdi-yin-yang::before {
+ content: "\F67F";
+}
+.mdi-yoga::before {
+ content: "\F01A7";
+}
+.mdi-youtube::before {
+ content: "\F5C3";
+}
+.mdi-youtube-creator-studio::before {
+ content: "\F846";
+}
+.mdi-youtube-gaming::before {
+ content: "\F847";
+}
+.mdi-youtube-subscription::before {
+ content: "\FD1C";
+}
+.mdi-youtube-tv::before {
+ content: "\F448";
+}
+.mdi-z-wave::before {
+ content: "\FAE9";
+}
+.mdi-zend::before {
+ content: "\FAEA";
+}
+.mdi-zigbee::before {
+ content: "\FD1D";
+}
+.mdi-zip-box::before {
+ content: "\F5C4";
+}
+.mdi-zip-box-outline::before {
+ content: "\F001B";
+}
+.mdi-zip-disk::before {
+ content: "\FA22";
+}
+.mdi-zodiac-aquarius::before {
+ content: "\FA7C";
+}
+.mdi-zodiac-aries::before {
+ content: "\FA7D";
+}
+.mdi-zodiac-cancer::before {
+ content: "\FA7E";
+}
+.mdi-zodiac-capricorn::before {
+ content: "\FA7F";
+}
+.mdi-zodiac-gemini::before {
+ content: "\FA80";
+}
+.mdi-zodiac-leo::before {
+ content: "\FA81";
+}
+.mdi-zodiac-libra::before {
+ content: "\FA82";
+}
+.mdi-zodiac-pisces::before {
+ content: "\FA83";
+}
+.mdi-zodiac-sagittarius::before {
+ content: "\FA84";
+}
+.mdi-zodiac-scorpio::before {
+ content: "\FA85";
+}
+.mdi-zodiac-taurus::before {
+ content: "\FA86";
+}
+.mdi-zodiac-virgo::before {
+ content: "\FA87";
+}
+.mdi-blank::before {
+ content: "\F68C";
+ visibility: hidden;
+}
+.mdi-18px.mdi-set,
+.mdi-18px.mdi:before {
+ font-size: 18px;
+}
+.mdi-24px.mdi-set,
+.mdi-24px.mdi:before {
+ font-size: 24px;
+}
+.mdi-36px.mdi-set,
+.mdi-36px.mdi:before {
+ font-size: 36px;
+}
+.mdi-48px.mdi-set,
+.mdi-48px.mdi:before {
+ font-size: 48px;
+}
+.mdi-dark:before {
+ color: rgba(0, 0, 0, 0.54);
+}
+.mdi-dark.mdi-inactive:before {
+ color: rgba(0, 0, 0, 0.26);
+}
+.mdi-light:before {
+ color: #fff;
+}
+.mdi-light.mdi-inactive:before {
+ color: rgba(255, 255, 255, 0.3);
+}
+.mdi-rotate-45:before {
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.mdi-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.mdi-rotate-135:before {
+ -webkit-transform: rotate(135deg);
+ -ms-transform: rotate(135deg);
+ transform: rotate(135deg);
+}
+.mdi-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.mdi-rotate-225:before {
+ -webkit-transform: rotate(225deg);
+ -ms-transform: rotate(225deg);
+ transform: rotate(225deg);
+}
+.mdi-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.mdi-rotate-315:before {
+ -webkit-transform: rotate(315deg);
+ -ms-transform: rotate(315deg);
+ transform: rotate(315deg);
+}
+.mdi-flip-h:before {
+ -webkit-transform: scaleX(-1);
+ transform: scaleX(-1);
+ filter: FlipH;
+ -ms-filter: "FlipH";
+}
+.mdi-flip-v:before {
+ -webkit-transform: scaleY(-1);
+ transform: scaleY(-1);
+ filter: FlipV;
+ -ms-filter: "FlipV";
+}
+.mdi-spin:before {
+ -webkit-animation: mdi-spin 2s infinite linear;
+ animation: mdi-spin 2s infinite linear;
+}
+@-webkit-keyframes mdi-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes mdi-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
/*# sourceMappingURL=materialdesignicons.css.map */
diff --git a/packages/merchant-backoffice-ui/src/scss/libs/_all.scss b/packages/merchant-backoffice-ui/src/scss/libs/_all.scss
index aaaff6853..cba6f26eb 100644
--- a/packages/merchant-backoffice-ui/src/scss/libs/_all.scss
+++ b/packages/merchant-backoffice-ui/src/scss/libs/_all.scss
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
diff --git a/packages/merchant-backoffice-ui/src/sw.js b/packages/merchant-backoffice-ui/src/sw.js
index 617ae647c..0b1799e23 100644
--- a/packages/merchant-backoffice-ui/src/sw.js
+++ b/packages/merchant-backoffice-ui/src/sw.js
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
+/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
diff --git a/packages/merchant-backoffice-ui/src/utils/amount.ts b/packages/merchant-backoffice-ui/src/utils/amount.ts
index 23ced34bd..bdc37952f 100644
--- a/packages/merchant-backoffice-ui/src/utils/amount.ts
+++ b/packages/merchant-backoffice-ui/src/utils/amount.ts
@@ -13,7 +13,11 @@
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { amountFractionalBase, AmountJson, Amounts } from "@gnu-taler/taler-util";
+import {
+ amountFractionalBase,
+ AmountJson,
+ Amounts,
+} from "@gnu-taler/taler-util";
import { MerchantBackend } from "../declaration.js";
/**
@@ -23,10 +27,10 @@ import { MerchantBackend } from "../declaration.js";
* @returns
*/
const sumPrices = (one: string, two: string) => {
- const [currency, valueOne] = one.split(':')
- const [, valueTwo] = two.split(':')
- return `${currency}:${parseInt(valueOne, 10) + parseInt(valueTwo, 10)}`
-}
+ const [currency, valueOne] = one.split(":");
+ const [, valueTwo] = two.split(":");
+ return `${currency}:${parseInt(valueOne, 10) + parseInt(valueTwo, 10)}`;
+};
/**
* merge refund with the same description and a difference less than one minute
@@ -34,37 +38,43 @@ const sumPrices = (one: string, two: string) => {
* @param cur new refund to add to the list
* @returns list with the new refund, may be merged with the last
*/
-export function mergeRefunds(prev: MerchantBackend.Orders.RefundDetails[], cur: MerchantBackend.Orders.RefundDetails) {
+export function mergeRefunds(
+ prev: MerchantBackend.Orders.RefundDetails[],
+ cur: MerchantBackend.Orders.RefundDetails,
+) {
let tail;
- if (prev.length === 0 || //empty list
- cur.timestamp.t_s === 'never' || //current does not have timestamp
- (tail = prev[prev.length - 1]).timestamp.t_s === 'never' || // last does not have timestamp
+ if (
+ prev.length === 0 || //empty list
+ cur.timestamp.t_s === "never" || //current does not have timestamp
+ (tail = prev[prev.length - 1]).timestamp.t_s === "never" || // last does not have timestamp
cur.reason !== tail.reason || //different reason
cur.pending !== tail.pending || //different pending state
- Math.abs(cur.timestamp.t_s - tail.timestamp.t_s) > 1000 * 60) {//more than 1 minute difference
+ Math.abs(cur.timestamp.t_s - tail.timestamp.t_s) > 1000 * 60
+ ) {
+ //more than 1 minute difference
- prev.push(cur)
- return prev
+ prev.push(cur);
+ return prev;
}
prev[prev.length - 1] = {
...tail,
- amount: sumPrices(tail.amount, cur.amount)
- }
+ amount: sumPrices(tail.amount, cur.amount),
+ };
- return prev
+ return prev;
}
export const rate = (one: string, two: string) => {
- const a = Amounts.parseOrThrow(one)
- const b = Amounts.parseOrThrow(two)
- const af = toFloat(a)
- const bf = toFloat(b)
- if (bf === 0) return 0
- return af / bf
-}
+ const a = Amounts.parseOrThrow(one);
+ const b = Amounts.parseOrThrow(two);
+ const af = toFloat(a);
+ const bf = toFloat(b);
+ if (bf === 0) return 0;
+ return af / bf;
+};
function toFloat(amount: AmountJson) {
- return amount.value + (amount.fraction / amountFractionalBase);
+ return amount.value + amount.fraction / amountFractionalBase;
}
diff --git a/packages/merchant-backoffice-ui/src/utils/constants.ts b/packages/merchant-backoffice-ui/src/utils/constants.ts
index 90f133c6a..fea9cb7e2 100644
--- a/packages/merchant-backoffice-ui/src/utils/constants.ts
+++ b/packages/merchant-backoffice-ui/src/utils/constants.ts
@@ -15,26 +15,30 @@
*/
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
//https://tools.ietf.org/html/rfc8905
-export const PAYTO_REGEX = /^payto:\/\/[a-zA-Z][a-zA-Z0-9-.]+(\/[a-zA-Z0-9\-\.\~\(\)@_%:!$&'*+,;=]*)*\??((amount|receiver-name|sender-name|instruction|message)=[a-zA-Z0-9\-\.\~\(\)@_%:!$'*+,;=]*&?)*$/
-export const PAYTO_WIRE_METHOD_LOOKUP = /payto:\/\/([a-zA-Z][a-zA-Z0-9-.]+)\/.*/
+export const PAYTO_REGEX =
+ /^payto:\/\/[a-zA-Z][a-zA-Z0-9-.]+(\/[a-zA-Z0-9\-\.\~\(\)@_%:!$&'*+,;=]*)*\??((amount|receiver-name|sender-name|instruction|message)=[a-zA-Z0-9\-\.\~\(\)@_%:!$'*+,;=]*&?)*$/;
+export const PAYTO_WIRE_METHOD_LOOKUP =
+ /payto:\/\/([a-zA-Z][a-zA-Z0-9-.]+)\/.*/;
-export const AMOUNT_REGEX = /^[a-zA-Z][a-zA-Z]*:[0-9][0-9,]*\.?[0-9,]*$/
+export const AMOUNT_REGEX = /^[a-zA-Z][a-zA-Z]*:[0-9][0-9,]*\.?[0-9,]*$/;
-export const INSTANCE_ID_LOOKUP = /\/instances\/([^/]*)\/?$/
+export const INSTANCE_ID_LOOKUP = /\/instances\/([^/]*)\/?$/;
-export const AMOUNT_ZERO_REGEX = /^[a-zA-Z][a-zA-Z]*:0$/
+export const AMOUNT_ZERO_REGEX = /^[a-zA-Z][a-zA-Z]*:0$/;
-export const CROCKFORD_BASE32_REGEX = /^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]+[*~$=U]*$/
+export const CROCKFORD_BASE32_REGEX =
+ /^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]+[*~$=U]*$/;
-export const URL_REGEX = /^((https?:)(\/\/\/?)([\w]*(?::[\w]*)?@)?([\d\w\.-]+)(?::(\d+))?)\/$/
+export const URL_REGEX =
+ /^((https?:)(\/\/\/?)([\w]*(?::[\w]*)?@)?([\d\w\.-]+)(?::(\d+))?)\/$/;
// how much rows we add every time user hit load more
-export const PAGE_SIZE = 20
+export const PAGE_SIZE = 20;
// how bigger can be the result set
// after this threshold, load more with move the cursor
export const MAX_RESULT_SIZE = PAGE_SIZE * 2 - 1;
@@ -44,7 +48,7 @@ export const DEFAULT_REQUEST_TIMEOUT = 10;
export const MAX_IMAGE_SIZE = 1024 * 1024;
-export const INSTANCE_ID_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9_.@-]+$/
+export const INSTANCE_ID_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9_.@-]+$/;
export const COUNTRY_TABLE = {
AE: "U.A.E.",
@@ -189,6 +193,5 @@ export const COUNTRY_TABLE = {
VN: "Viet Nam",
YE: "Yemen",
ZA: "South Africa",
- ZW: "Zimbabwe"
-}
-
+ ZW: "Zimbabwe",
+};
diff --git a/packages/merchant-backoffice-ui/src/utils/switchableAxios.ts b/packages/merchant-backoffice-ui/src/utils/switchableAxios.ts
index 1010dd7fb..20ce7043e 100644
--- a/packages/merchant-backoffice-ui/src/utils/switchableAxios.ts
+++ b/packages/merchant-backoffice-ui/src/utils/switchableAxios.ts
@@ -23,44 +23,51 @@ import axios, { AxiosPromise, AxiosRequestConfig } from "axios";
export let removeAxiosCancelToken = false;
-export let axiosHandler = function doAxiosRequest(config: AxiosRequestConfig): AxiosPromise<any> {
- return axios(config)
-}
+export let axiosHandler = function doAxiosRequest(
+ config: AxiosRequestConfig,
+): AxiosPromise<any> {
+ return axios(config);
+};
/**
* Set this backend library to testing mode.
* Instead of calling the axios library the @handler will be called
- *
- * @param handler callback that will mock axios
+ *
+ * @param handler callback that will mock axios
*/
-export function setAxiosRequestAsTestingEnvironment(handler: AxiosHandler): void {
+export function setAxiosRequestAsTestingEnvironment(
+ handler: AxiosHandler,
+): void {
removeAxiosCancelToken = true;
axiosHandler = function defaultTestingHandler(config) {
- const currentHanlder = listOfHandlersToUseOnce.shift()
+ const currentHanlder = listOfHandlersToUseOnce.shift();
if (!currentHanlder) {
- return handler(config)
+ return handler(config);
}
- return currentHanlder(config)
- }
+ return currentHanlder(config);
+ };
}
type AxiosHandler = (config: AxiosRequestConfig) => AxiosPromise<any>;
-type AxiosArguments = { args: AxiosRequestConfig | undefined }
+type AxiosArguments = { args: AxiosRequestConfig | undefined };
-
-const listOfHandlersToUseOnce = new Array<AxiosHandler>()
+const listOfHandlersToUseOnce = new Array<AxiosHandler>();
/**
- *
+ *
* @param handler mock function
* @returns savedArgs
*/
-export function mockAxiosOnce(handler: AxiosHandler): { args: AxiosRequestConfig | undefined } {
- const savedArgs: AxiosArguments = { args: undefined }
- listOfHandlersToUseOnce.push((config: AxiosRequestConfig): AxiosPromise<any> => {
- savedArgs.args = config;
- return handler(config)
- })
+export function mockAxiosOnce(handler: AxiosHandler): {
+ args: AxiosRequestConfig | undefined;
+} {
+ const savedArgs: AxiosArguments = { args: undefined };
+ listOfHandlersToUseOnce.push(
+ (config: AxiosRequestConfig): AxiosPromise<any> => {
+ savedArgs.args = config;
+ return handler(config);
+ },
+ );
return savedArgs;
}
diff --git a/packages/merchant-backoffice-ui/src/utils/table.ts b/packages/merchant-backoffice-ui/src/utils/table.ts
index a79edfdcc..71358e25f 100644
--- a/packages/merchant-backoffice-ui/src/utils/table.ts
+++ b/packages/merchant-backoffice-ui/src/utils/table.ts
@@ -17,37 +17,41 @@
import { WithId } from "../declaration.js";
/**
-*
-* @author Sebastian Javier Marchano (sebasjm)
-*/
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
export interface Actions<T extends WithId> {
element: T;
- type: 'DELETE' | 'UPDATE';
+ type: "DELETE" | "UPDATE";
}
function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
return value !== null && value !== undefined;
}
-export function buildActions<T extends WithId>(instances: T[], selected: string[], action: 'DELETE'): Actions<T>[] {
- return selected.map(id => instances.find(i => i.id === id))
+export function buildActions<T extends WithId>(
+ instances: T[],
+ selected: string[],
+ action: "DELETE",
+): Actions<T>[] {
+ return selected
+ .map((id) => instances.find((i) => i.id === id))
.filter(notEmpty)
- .map(id => ({ element: id, type: action }))
+ .map((id) => ({ element: id, type: action }));
}
/**
* For any object or array, return the same object if is not empty.
- * not empty:
+ * not empty:
* - for arrays: at least one element not undefined
* - for objects: at least one property not undefined
- * @param obj
- * @returns
+ * @param obj
+ * @returns
*/
-export function undefinedIfEmpty<T extends Record<string, unknown>|Array<unknown>>(obj: T): T | undefined {
- if (obj === undefined) return undefined
- return Object.values(obj).some((v) => v !== undefined)
- ? obj
- : undefined;
+export function undefinedIfEmpty<
+ T extends Record<string, unknown> | Array<unknown>,
+>(obj: T): T | undefined {
+ if (obj === undefined) return undefined;
+ return Object.values(obj).some((v) => v !== undefined) ? obj : undefined;
}
-