diff options
author | Sebastian <sebasjm@gmail.com> | 2022-12-19 12:23:39 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2022-12-19 12:23:39 -0300 |
commit | 72b429321553841ac1ff48cf974bfc65da01bb06 (patch) | |
tree | 7db9a4462f02de6cb86de695a1e64772b00ead5f | |
parent | 770ab6f01dc81a16f384f314982bd761540f8e65 (diff) |
pretty
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't exist.</p> - <Link href="/"> - <h4>Back to Home</h4> - </Link> - </div> - ); + return ( + <div> + <h1>Error 404</h1> + <p>That page doesn'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; } - |