@deephaven/js-plugin-ui
Version:
1,177 lines • 3.57 MB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value2) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value2 }) : obj[key] = value2;
var __publicField = (obj, key, value2) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value2);
var __privateAdd = (obj, member, value2) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value2);
var _type, _type2, _type3, _type4;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const plugin = require("@deephaven/plugin");
const icons = require("@deephaven/icons");
const React = require("react");
const components = require("@deephaven/components");
const Log = require("@deephaven/log");
const jsapiBootstrap = require("@deephaven/jsapi-bootstrap");
const irisGrid = require("@deephaven/iris-grid");
const jsapiComponents = require("@deephaven/jsapi-components");
const ReactDOM = require("react-dom");
const dashboard = require("@deephaven/dashboard");
const dashboardCorePlugins = require("@deephaven/dashboard-core-plugins");
const reactRedux = require("react-redux");
const console$1 = require("@deephaven/console");
function _interopNamespaceDefault(e2) {
const n2 = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
if (e2) {
for (const k2 in e2) {
if (k2 !== "default") {
const d2 = Object.getOwnPropertyDescriptor(e2, k2);
Object.defineProperty(n2, k2, d2.get ? d2 : {
enumerable: true,
get: () => e2[k2]
});
}
}
}
n2.default = e2;
return Object.freeze(n2);
}
const icons__namespace = /* @__PURE__ */ _interopNamespaceDefault(icons);
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function getDefaultExportFromCjs(x2) {
return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
}
function getAugmentedNamespace(n2) {
if (n2.__esModule) return n2;
var f2 = n2.default;
if (typeof f2 == "function") {
var a = function a2() {
if (this instanceof a2) {
return Reflect.construct(f2, arguments, this.constructor);
}
return f2.apply(this, arguments);
};
a.prototype = f2.prototype;
} else a = {};
Object.defineProperty(a, "__esModule", { value: true });
Object.keys(n2).forEach(function(k2) {
var d2 = Object.getOwnPropertyDescriptor(n2, k2);
Object.defineProperty(a, k2, d2.get ? d2 : {
enumerable: true,
get: function() {
return n2[k2];
}
});
});
return a;
}
var jsxRuntime = { exports: {} };
var reactJsxRuntime_production_min = {};
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var f$1 = React, k$1 = Symbol.for("react.element"), l$1 = Symbol.for("react.fragment"), m$2 = Object.prototype.hasOwnProperty, n$1 = f$1.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p$3 = { key: true, ref: true, __self: true, __source: true };
function q$1(c2, a, g2) {
var b2, d2 = {}, e2 = null, h2 = null;
void 0 !== g2 && (e2 = "" + g2);
void 0 !== a.key && (e2 = "" + a.key);
void 0 !== a.ref && (h2 = a.ref);
for (b2 in a) m$2.call(a, b2) && !p$3.hasOwnProperty(b2) && (d2[b2] = a[b2]);
if (c2 && c2.defaultProps) for (b2 in a = c2.defaultProps, a) void 0 === d2[b2] && (d2[b2] = a[b2]);
return { $$typeof: k$1, type: c2, key: e2, ref: h2, props: d2, _owner: n$1.current };
}
reactJsxRuntime_production_min.Fragment = l$1;
reactJsxRuntime_production_min.jsx = q$1;
reactJsxRuntime_production_min.jsxs = q$1;
{
jsxRuntime.exports = reactJsxRuntime_production_min;
}
var jsxRuntimeExports = jsxRuntime.exports;
var EMPTY_ARRAY = Object.freeze([]);
var EMPTY_MAP = /* @__PURE__ */ new Map();
var EMPTY_FUNCTION$5 = () => void 0;
function ensureArray(value2) {
return Array.isArray(value2) ? value2 : [value2];
}
function removeNullAndUndefined() {
for (var _len = arguments.length, maybeDefined = new Array(_len), _key = 0; _key < _len; _key++) {
maybeDefined[_key] = arguments[_key];
}
return maybeDefined.filter((m2) => m2 != null);
}
function _defineProperty$h(e2, r2, t2) {
return (r2 = _toPropertyKey$h(r2)) in e2 ? Object.defineProperty(e2, r2, { value: t2, enumerable: true, configurable: true, writable: true }) : e2[r2] = t2, e2;
}
function _toPropertyKey$h(t2) {
var i = _toPrimitive$h(t2, "string");
return "symbol" == typeof i ? i : i + "";
}
function _toPrimitive$h(t2, r2) {
if ("object" != typeof t2 || !t2) return t2;
var e2 = t2[Symbol.toPrimitive];
if (void 0 !== e2) {
var i = e2.call(t2, r2);
if ("object" != typeof i) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r2 ? String : Number)(t2);
}
class CanceledPromiseError extends Error {
constructor() {
super(...arguments);
_defineProperty$h(this, "isCanceled", true);
}
}
function bindAllMethods(instance) {
var traversePrototypeChain = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var methodNames = getAllMethodNames(instance, traversePrototypeChain);
methodNames.forEach((methodName) => {
instance[methodName] = instance[methodName].bind(instance);
});
}
function getAllMethodNames(instance, traversePrototypeChain) {
var methodNames = /* @__PURE__ */ new Set();
var current = instance;
var level = 0;
while (current != null && current !== Object.prototype && (level <= 1 || traversePrototypeChain)) {
for (var name of Object.getOwnPropertyNames(current)) {
var _Object$getOwnPropert;
if (name !== "constructor" && // Ensure this is a method and not a getter
typeof ((_Object$getOwnPropert = Object.getOwnPropertyDescriptor(current, name)) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.value) === "function") {
methodNames.add(name);
}
}
current = Object.getPrototypeOf(current);
level += 1;
}
return [...methodNames.keys()];
}
class ColorUtils {
/**
* THIS HAS POOR PERFORMANCE DUE TO DOM MANIPULATION
* Attempt to get the rgb or rgba string for a color string. If the color string
* can't be resolved to a valid color, null is returned.
* @param colorString The color string to resolve
*/
static asRgbOrRgbaString(colorString) {
if (
// Since dom manipulation is expensive, we want to avoid it if possible.
/^rgb/.test(colorString) || /^rgba/.test(colorString) || /^color\(srgb/.test(colorString)
) {
return colorString;
}
var divEl = document.createElement("div");
divEl.style.display = "none";
divEl.style.backgroundColor = colorString;
var color2 = window.getComputedStyle(document.body.appendChild(divEl)).getPropertyValue("background-color");
divEl.remove();
return color2 || null;
}
/**
* THIS HAS POOR PERFORMANCE DUE TO DOM MANIPULATION
* DO NOT USE HEAVILY
* Checks if a background color is dark (i.e. should use a light foreground).
*
* @param background the background color
*/
static isDark(background) {
var d2 = document.createElement("div");
d2.style.display = "none";
d2.style.backgroundColor = background;
var computedColor = getComputedStyle(document.body.appendChild(d2)).backgroundColor;
var colorTokens = computedColor.match(/\d+/g);
var color2 = [];
if (colorTokens) {
color2 = colorTokens.map((a) => parseInt(a, 10));
} else {
throw new Error("Invalid color received. Got ".concat(computedColor));
}
document.body.removeChild(d2);
var brightness = ColorUtils.getBrightness(color2);
return brightness < 125;
}
// Note: leaving this as arbitrary length number[] in case of RGBA().
static getBrightness(color2) {
return Math.round((color2[0] * 299 + color2[1] * 587 + color2[2] * 114) / 1e3);
}
/**
* THIS HAS POOR PERFORMANCE DUE TO DOM MANIPULATION
* Normalize a css color to 8 character hex value (or 6 character hex if
* isAlphaOptional is true and alpha is 'ff'). If the color can't be resolved,
* return the original string.
* @param colorString The color string to normalize
* @param isAlphaOptional If true, the alpha value will be dropped if it is 'ff'.
* Defaults to false.
*/
static normalizeCssColor(colorString) {
var isAlphaOptional = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var maybeRgbOrRgba = ColorUtils.asRgbOrRgbaString(colorString);
if (maybeRgbOrRgba == null) {
return colorString;
}
var rgba = ColorUtils.parseRgba(maybeRgbOrRgba);
if (rgba === null) {
return colorString;
}
var hex8 = ColorUtils.rgbaToHex8(rgba);
if (isAlphaOptional === true) {
return hex8.replace(/^(#[a-f0-9]{6})ff$/, "$1");
}
return hex8;
}
/**
* Parse a given `rgb` or `rgba` css expression into its constituent r, g, b, a
* values. If the expression cannot be parsed, it will return null.
* Note that this parser is more permissive than the CSS spec and shouldn't be
* relied on as a full validation mechanism. For the most part, it assumes that
* the input is already a valid rgb or rgba expression.
*
* e.g. `rgb(255, 255, 255)` -> `{ r: 255, g: 255, b: 255, a: 1 }`
* e.g. `rgba(255, 255, 255, 0.5)` -> `{ r: 255, g: 255, b: 255, a: 0.5 }`
* e.g. `color(srgb 1 1 0 / 0.25)` -> `{ r: 255, g: 255, b: 0, a: 0.25 }`
* @param rgbOrRgbaString The rgb or rgba string to parse
*/
static parseRgba(rgbOrRgbaString) {
var _rgbOrRgbaString$matc;
var [r2, g2, b2, a] = (_rgbOrRgbaString$matc = rgbOrRgbaString.match(
// loose with the regex to allow for different formats between browsers
// take the first 4 digits that look like numbers, including decimals
// We've already checked it's a valid color with CSS.supports
/(?:\b\d+\.\d*|\b\d+|\.\d+)/g
)) !== null && _rgbOrRgbaString$matc !== void 0 ? _rgbOrRgbaString$matc : [];
if (r2 == null || g2 == null || b2 == null) {
return null;
}
if (rgbOrRgbaString.startsWith("color(srgb")) {
return {
r: Math.round(Number(r2) * 255),
g: Math.round(Number(g2) * 255),
b: Math.round(Number(b2) * 255),
a: Number(a !== null && a !== void 0 ? a : 1)
};
}
return {
r: Number(r2),
g: Number(g2),
b: Number(b2),
a: Math.min(Number(a !== null && a !== void 0 ? a : 1), 1)
};
}
/**
* Convert an rgba object to an 8 character hex color string.
* @param r The red value
* @param g The green value
* @param b The blue value
* @param a The alpha value (defaults to 1)
* @returns The a character hex string with # prefix
*/
static rgbaToHex8(_ref) {
var {
r: r2,
g: g2,
b: b2,
a = 1
} = _ref;
a = Math.round(a * 255);
var [rh, gh, bh, ah] = [r2, g2, b2, a].map((v2) => v2.toString(16).padStart(2, "0"));
return "#".concat(rh).concat(gh).concat(bh).concat(ah);
}
}
function _defineProperty$g(e2, r2, t2) {
return (r2 = _toPropertyKey$g(r2)) in e2 ? Object.defineProperty(e2, r2, { value: t2, enumerable: true, configurable: true, writable: true }) : e2[r2] = t2, e2;
}
function _toPropertyKey$g(t2) {
var i = _toPrimitive$g(t2, "string");
return "symbol" == typeof i ? i : i + "";
}
function _toPrimitive$g(t2, r2) {
if ("object" != typeof t2 || !t2) return t2;
var e2 = t2[Symbol.toPrimitive];
if (void 0 !== e2) {
var i = e2.call(t2, r2);
if ("object" != typeof i) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r2 ? String : Number)(t2);
}
class TimeoutError extends Error {
constructor() {
super(...arguments);
_defineProperty$g(this, "isTimeout", true);
}
}
function assertNotNull(value2) {
var message = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "Value is null or undefined";
if (value2 == null) throw new Error(message);
}
function getOrThrow(map2, key) {
var _map$get;
var defaultValue = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : void 0;
var value2 = (_map$get = map2.get(key)) !== null && _map$get !== void 0 ? _map$get : defaultValue;
if (value2 !== void 0) {
return value2;
}
throw new Error("Missing value for key ".concat(key));
}
class PromiseUtils {
/**
* Creates a promise that can be canceled by calling the `cancel` function
* Pass an optional `cleanupFunc` to perform actions on the resolved item after promise is cancelled.
* @param promise The item to resolve
* @param cleanup Function to cleanup the resolved item after cancelation. Called after both this promise is cancelled and the wrapped item was resolved (order does not matter).
*/
static makeCancelable(promise2, cleanup) {
var hasCanceled = false;
var resolved;
var rejectFn;
var wrappedPromise = new Promise((resolve, reject) => {
rejectFn = reject;
Promise.resolve(promise2).then((val) => {
if (hasCanceled) {
if (cleanup) {
cleanup(val);
}
} else {
resolved = val;
resolve(val);
}
}).catch((error) => reject(error));
});
wrappedPromise.cancel = () => {
hasCanceled = true;
rejectFn(new CanceledPromiseError());
if (resolved != null && cleanup) {
cleanup(resolved);
}
};
return wrappedPromise;
}
static isCanceled(error) {
return error instanceof CanceledPromiseError;
}
static isTimedOut(error) {
return error instanceof TimeoutError;
}
/**
* Wrap a callback call in a Promise + setTimeout.
* @param timeoutMs
* @param callback
*/
static withTimeout(timeoutMs, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
resolve(callback());
} catch (err) {
reject(err);
}
}, timeoutMs);
});
}
}
class TextUtils {
/**
* Joins a list of strings with a comma, keeping the oxford comma and adding "and" as appropriate.
* Eg.
* One
* One and Two
* One, Two, and Three
* @param items The items to join in a list
* @param conjunction Conjunction to use between the last two items
*/
static join(items) {
var conjunction = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "and";
if (items == null || items.length === 0) {
return "";
}
if (items.length === 1) {
return items[0];
}
if (items.length === 2) {
return "".concat(items[0], " ").concat(conjunction, " ").concat(items[1]);
}
var itemText = items.slice(0, items.length - 1).join(", ");
var lastItem = items[items.length - 1];
return "".concat(itemText, ", ").concat(conjunction, " ").concat(lastItem);
}
/**
* Converts text to lower case, handling null if necessary and returning an empty string
* @param text The text to convert to lower case
* @param isNullAllowed True if a null string should return an empty string from this function. If false an error is thrown if null is passed in.
*/
static toLower(text2) {
var isNullAllowed = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
if (text2 == null) {
if (isNullAllowed) {
return "";
}
throw new Error("Null string passed in to TextUtils.toLower");
}
return text2.toLowerCase();
}
/**
*
* @param a The string to sort
* @param b Second string to sort
* @param isAscending Whether to sort ascending or descending
*/
static sort(a, b2) {
var isAscending = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
if (a < b2) {
return isAscending ? -1 : 1;
}
if (a > b2) {
return isAscending ? 1 : -1;
}
return 0;
}
/**
* Pluralize a string based on a value
* @param value The value to use for pluralization
* @param singular The singular form of the string
* @param pluralized The pluralized form of the string. If not provided, will append 's' to the singular form.
* @returns The pluralized string
*/
static pluralize(value2, singular, pluralized) {
if (value2 === 1) {
return singular;
}
return pluralized !== null && pluralized !== void 0 ? pluralized : "".concat(singular, "s");
}
}
const UI_COMPONENTS_NAMESPACE = "deephaven.ui.components";
const UI_ELEMENTS_NAMESPACE = "deephaven.ui.elements";
const uiComponentName = (name) => `${UI_COMPONENTS_NAMESPACE}.${name}`;
const uiElementName = (name) => `${UI_ELEMENTS_NAMESPACE}.${name}`;
const ELEMENT_NAME = {
/** Elements */
uiTable: uiElementName("UITable"),
uri: uiElementName("UriElement"),
/** Layout Components */
column: uiComponentName("Column"),
dashboard: uiComponentName("Dashboard"),
panel: uiComponentName("Panel"),
row: uiComponentName("Row"),
stack: uiComponentName("Stack"),
/** Other Components */
accordion: uiComponentName("Accordion"),
actionButton: uiComponentName("ActionButton"),
actionGroup: uiComponentName("ActionGroup"),
actionMenu: uiComponentName("ActionMenu"),
avatar: uiComponentName("Avatar"),
badge: uiComponentName("Badge"),
breadcrumbs: uiComponentName("Breadcrumbs"),
button: uiComponentName("Button"),
buttonGroup: uiComponentName("ButtonGroup"),
calendar: uiComponentName("Calendar"),
colorPicker: uiComponentName("ColorPicker"),
colorEditor: uiComponentName("ColorEditor"),
checkbox: uiComponentName("Checkbox"),
checkboxGroup: uiComponentName("CheckboxGroup"),
comboBox: uiComponentName("ComboBox"),
content: uiComponentName("Content"),
contextualHelp: uiComponentName("ContextualHelp"),
contextualHelpTrigger: uiComponentName("ContextualHelpTrigger"),
dateField: uiComponentName("DateField"),
datePicker: uiComponentName("DatePicker"),
dateRangePicker: uiComponentName("DateRangePicker"),
dialog: uiComponentName("Dialog"),
dialogTrigger: uiComponentName("DialogTrigger"),
disclosure: uiComponentName("Disclosure"),
disclosureTitle: uiComponentName("DisclosureTitle"),
disclosurePanel: uiComponentName("DisclosurePanel"),
divider: uiComponentName("Divider"),
flex: uiComponentName("Flex"),
form: uiComponentName("Form"),
footer: uiComponentName("Footer"),
fragment: uiComponentName("Fragment"),
grid: uiComponentName("Grid"),
heading: uiComponentName("Heading"),
illustratedMessage: uiComponentName("IllustratedMessage"),
image: uiComponentName("Image"),
inlineAlert: uiComponentName("InlineAlert"),
item: uiComponentName("Item"),
labeledValue: uiComponentName("LabeledValue"),
listActionGroup: uiComponentName("ListActionGroup"),
listActionMenu: uiComponentName("ListActionMenu"),
link: uiComponentName("Link"),
listView: uiComponentName("ListView"),
logicButton: uiComponentName("LogicButton"),
markdown: uiComponentName("Markdown"),
menu: uiComponentName("Menu"),
menuTrigger: uiComponentName("MenuTrigger"),
meter: uiComponentName("Meter"),
numberField: uiComponentName("NumberField"),
picker: uiComponentName("Picker"),
progressBar: uiComponentName("ProgressBar"),
progressCircle: uiComponentName("ProgressCircle"),
radio: uiComponentName("Radio"),
radioGroup: uiComponentName("RadioGroup"),
rangeCalendar: uiComponentName("RangeCalendar"),
rangeSlider: uiComponentName("RangeSlider"),
searchField: uiComponentName("SearchField"),
section: uiComponentName("Section"),
slider: uiComponentName("Slider"),
submenuTrigger: uiComponentName("SubmenuTrigger"),
switch: uiComponentName("Switch"),
tabList: uiComponentName("TabList"),
tabPanels: uiComponentName("TabPanels"),
tabs: uiComponentName("Tabs"),
tab: uiComponentName("Tab"),
tagGroup: uiComponentName("TagGroup"),
text: uiComponentName("Text"),
textArea: uiComponentName("TextArea"),
textField: uiComponentName("TextField"),
timeField: uiComponentName("TimeField"),
toggleButton: uiComponentName("ToggleButton"),
view: uiComponentName("View")
};
const ELEMENT_PREFIX = {
icon: "deephaven.ui.icons.",
html: "deephaven.ui.html."
};
const log$d = Log.module("@deephaven/js-plugin-ui/ObjectView");
function ObjectView(props) {
const { object, __dhId } = props;
log$d.debug("Object is", object);
const { type } = object;
const fetch = React.useCallback(async () => {
const reexportedObject = await object.reexport();
return reexportedObject.fetch();
}, [object]);
const plugins2 = plugin.usePlugins();
const plugin$1 = React.useMemo(
() => type == null ? null : [...plugins2.values()].filter(plugin.isWidgetPlugin).find((p2) => [p2.supportedTypes].flat().includes(type)),
[plugins2, type]
);
if (plugin$1 != null) {
const Component = plugin$1.component;
return /* @__PURE__ */ jsxRuntimeExports.jsx(Component, { ...props, fetch, __dhId });
}
log$d.warn("Unknown object type", object.type);
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
"Unknown object type: ",
object.type
] });
}
ObjectView.displayName = "ObjectView";
const _UriExportedObject = class _UriExportedObject {
constructor(uri) {
this.uri = uri;
}
// eslint-disable-next-line class-methods-use-this
get type() {
return _UriExportedObject.TYPE;
}
};
__publicField(_UriExportedObject, "TYPE", "deephaven.ui.URI");
let UriExportedObject = _UriExportedObject;
/*!
* Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
function _defineProperty$f(e2, r2, t2) {
return (r2 = _toPropertyKey$f(r2)) in e2 ? Object.defineProperty(e2, r2, {
value: t2,
enumerable: true,
configurable: true,
writable: true
}) : e2[r2] = t2, e2;
}
function ownKeys$4(e2, r2) {
var t2 = Object.keys(e2);
if (Object.getOwnPropertySymbols) {
var o2 = Object.getOwnPropertySymbols(e2);
r2 && (o2 = o2.filter(function(r3) {
return Object.getOwnPropertyDescriptor(e2, r3).enumerable;
})), t2.push.apply(t2, o2);
}
return t2;
}
function _objectSpread2$1(e2) {
for (var r2 = 1; r2 < arguments.length; r2++) {
var t2 = null != arguments[r2] ? arguments[r2] : {};
r2 % 2 ? ownKeys$4(Object(t2), true).forEach(function(r3) {
_defineProperty$f(e2, r3, t2[r3]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e2, Object.getOwnPropertyDescriptors(t2)) : ownKeys$4(Object(t2)).forEach(function(r3) {
Object.defineProperty(e2, r3, Object.getOwnPropertyDescriptor(t2, r3));
});
}
return e2;
}
function _toPrimitive$f(t2, r2) {
if ("object" != typeof t2 || !t2) return t2;
var e2 = t2[Symbol.toPrimitive];
if (void 0 !== e2) {
var i = e2.call(t2, r2);
if ("object" != typeof i) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r2 ? String : Number)(t2);
}
function _toPropertyKey$f(t2) {
var i = _toPrimitive$f(t2, "string");
return "symbol" == typeof i ? i : i + "";
}
const noop$2 = () => {
};
let _WINDOW = {};
let _DOCUMENT = {};
let _MUTATION_OBSERVER = null;
let _PERFORMANCE = {
mark: noop$2,
measure: noop$2
};
try {
if (typeof window !== "undefined") _WINDOW = window;
if (typeof document !== "undefined") _DOCUMENT = document;
if (typeof MutationObserver !== "undefined") _MUTATION_OBSERVER = MutationObserver;
if (typeof performance !== "undefined") _PERFORMANCE = performance;
} catch (e2) {
}
const {
userAgent = ""
} = _WINDOW.navigator || {};
const WINDOW = _WINDOW;
const DOCUMENT = _DOCUMENT;
const MUTATION_OBSERVER = _MUTATION_OBSERVER;
const PERFORMANCE = _PERFORMANCE;
!!WINDOW.document;
const IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === "function" && typeof DOCUMENT.createElement === "function";
const IS_IE = ~userAgent.indexOf("MSIE") || ~userAgent.indexOf("Trident/");
var p$2 = /fa(s|r|l|t|d|dr|dl|dt|b|k|kd|ss|sr|sl|st|sds|sdr|sdl|sdt)?[\-\ ]/, g$1 = /Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp Duotone|Sharp|Kit)?.*/i;
var S = {
classic: {
fa: "solid",
fas: "solid",
"fa-solid": "solid",
far: "regular",
"fa-regular": "regular",
fal: "light",
"fa-light": "light",
fat: "thin",
"fa-thin": "thin",
fab: "brands",
"fa-brands": "brands"
},
duotone: {
fa: "solid",
fad: "solid",
"fa-solid": "solid",
"fa-duotone": "solid",
fadr: "regular",
"fa-regular": "regular",
fadl: "light",
"fa-light": "light",
fadt: "thin",
"fa-thin": "thin"
},
sharp: {
fa: "solid",
fass: "solid",
"fa-solid": "solid",
fasr: "regular",
"fa-regular": "regular",
fasl: "light",
"fa-light": "light",
fast: "thin",
"fa-thin": "thin"
},
"sharp-duotone": {
fa: "solid",
fasds: "solid",
"fa-solid": "solid",
fasdr: "regular",
"fa-regular": "regular",
fasdl: "light",
"fa-light": "light",
fasdt: "thin",
"fa-thin": "thin"
}
}, A = {
GROUP: "duotone-group",
PRIMARY: "primary",
SECONDARY: "secondary"
}, P = ["fa-classic", "fa-duotone", "fa-sharp", "fa-sharp-duotone"];
var s$1 = "classic", t$1 = "duotone", r = "sharp", o = "sharp-duotone", L = [s$1, t$1, r, o];
var G = {
classic: {
900: "fas",
400: "far",
normal: "far",
300: "fal",
100: "fat"
},
duotone: {
900: "fad",
400: "fadr",
300: "fadl",
100: "fadt"
},
sharp: {
900: "fass",
400: "fasr",
300: "fasl",
100: "fast"
},
"sharp-duotone": {
900: "fasds",
400: "fasdr",
300: "fasdl",
100: "fasdt"
}
};
var lt = {
"Font Awesome 6 Free": {
900: "fas",
400: "far"
},
"Font Awesome 6 Pro": {
900: "fas",
400: "far",
normal: "far",
300: "fal",
100: "fat"
},
"Font Awesome 6 Brands": {
400: "fab",
normal: "fab"
},
"Font Awesome 6 Duotone": {
900: "fad",
400: "fadr",
normal: "fadr",
300: "fadl",
100: "fadt"
},
"Font Awesome 6 Sharp": {
900: "fass",
400: "fasr",
normal: "fasr",
300: "fasl",
100: "fast"
},
"Font Awesome 6 Sharp Duotone": {
900: "fasds",
400: "fasdr",
normal: "fasdr",
300: "fasdl",
100: "fasdt"
}
};
var pt = /* @__PURE__ */ new Map([["classic", {
defaultShortPrefixId: "fas",
defaultStyleId: "solid",
styleIds: ["solid", "regular", "light", "thin", "brands"],
futureStyleIds: [],
defaultFontWeight: 900
}], ["sharp", {
defaultShortPrefixId: "fass",
defaultStyleId: "solid",
styleIds: ["solid", "regular", "light", "thin"],
futureStyleIds: [],
defaultFontWeight: 900
}], ["duotone", {
defaultShortPrefixId: "fad",
defaultStyleId: "solid",
styleIds: ["solid", "regular", "light", "thin"],
futureStyleIds: [],
defaultFontWeight: 900
}], ["sharp-duotone", {
defaultShortPrefixId: "fasds",
defaultStyleId: "solid",
styleIds: ["solid", "regular", "light", "thin"],
futureStyleIds: [],
defaultFontWeight: 900
}]]), xt = {
classic: {
solid: "fas",
regular: "far",
light: "fal",
thin: "fat",
brands: "fab"
},
duotone: {
solid: "fad",
regular: "fadr",
light: "fadl",
thin: "fadt"
},
sharp: {
solid: "fass",
regular: "fasr",
light: "fasl",
thin: "fast"
},
"sharp-duotone": {
solid: "fasds",
regular: "fasdr",
light: "fasdl",
thin: "fasdt"
}
};
var Ft = ["fak", "fa-kit", "fakd", "fa-kit-duotone"], St = {
kit: {
fak: "kit",
"fa-kit": "kit"
},
"kit-duotone": {
fakd: "kit-duotone",
"fa-kit-duotone": "kit-duotone"
}
}, At = ["kit"];
var Ct = {
kit: {
"fa-kit": "fak"
}
};
var Lt = ["fak", "fakd"], Wt = {
kit: {
fak: "fa-kit"
}
};
var Et = {
kit: {
kit: "fak"
},
"kit-duotone": {
"kit-duotone": "fakd"
}
};
var t$1$1 = {
GROUP: "duotone-group",
SWAP_OPACITY: "swap-opacity",
PRIMARY: "primary",
SECONDARY: "secondary"
}, r$1 = ["fa-classic", "fa-duotone", "fa-sharp", "fa-sharp-duotone"];
var bt$1 = ["fak", "fa-kit", "fakd", "fa-kit-duotone"];
var Yt = {
"Font Awesome Kit": {
400: "fak",
normal: "fak"
},
"Font Awesome Kit Duotone": {
400: "fakd",
normal: "fakd"
}
};
var ua = {
classic: {
"fa-brands": "fab",
"fa-duotone": "fad",
"fa-light": "fal",
"fa-regular": "far",
"fa-solid": "fas",
"fa-thin": "fat"
},
duotone: {
"fa-regular": "fadr",
"fa-light": "fadl",
"fa-thin": "fadt"
},
sharp: {
"fa-solid": "fass",
"fa-regular": "fasr",
"fa-light": "fasl",
"fa-thin": "fast"
},
"sharp-duotone": {
"fa-solid": "fasds",
"fa-regular": "fasdr",
"fa-light": "fasdl",
"fa-thin": "fasdt"
}
}, I$1 = {
classic: ["fas", "far", "fal", "fat", "fad"],
duotone: ["fadr", "fadl", "fadt"],
sharp: ["fass", "fasr", "fasl", "fast"],
"sharp-duotone": ["fasds", "fasdr", "fasdl", "fasdt"]
}, ga = {
classic: {
fab: "fa-brands",
fad: "fa-duotone",
fal: "fa-light",
far: "fa-regular",
fas: "fa-solid",
fat: "fa-thin"
},
duotone: {
fadr: "fa-regular",
fadl: "fa-light",
fadt: "fa-thin"
},
sharp: {
fass: "fa-solid",
fasr: "fa-regular",
fasl: "fa-light",
fast: "fa-thin"
},
"sharp-duotone": {
fasds: "fa-solid",
fasdr: "fa-regular",
fasdl: "fa-light",
fasdt: "fa-thin"
}
}, x = ["fa-solid", "fa-regular", "fa-light", "fa-thin", "fa-duotone", "fa-brands"], Ia = ["fa", "fas", "far", "fal", "fat", "fad", "fadr", "fadl", "fadt", "fab", "fass", "fasr", "fasl", "fast", "fasds", "fasdr", "fasdl", "fasdt", ...r$1, ...x], m$1 = ["solid", "regular", "light", "thin", "duotone", "brands"], c$1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], F$1 = c$1.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]), ma = [...Object.keys(I$1), ...m$1, "2xs", "xs", "sm", "lg", "xl", "2xl", "beat", "border", "fade", "beat-fade", "bounce", "flip-both", "flip-horizontal", "flip-vertical", "flip", "fw", "inverse", "layers-counter", "layers-text", "layers", "li", "pull-left", "pull-right", "pulse", "rotate-180", "rotate-270", "rotate-90", "rotate-by", "shake", "spin-pulse", "spin-reverse", "spin", "stack-1x", "stack-2x", "stack", "ul", t$1$1.GROUP, t$1$1.SWAP_OPACITY, t$1$1.PRIMARY, t$1$1.SECONDARY].concat(c$1.map((a) => "".concat(a, "x"))).concat(F$1.map((a) => "w-".concat(a)));
var wa = {
"Font Awesome 5 Free": {
900: "fas",
400: "far"
},
"Font Awesome 5 Pro": {
900: "fas",
400: "far",
normal: "far",
300: "fal"
},
"Font Awesome 5 Brands": {
400: "fab",
normal: "fab"
},
"Font Awesome 5 Duotone": {
900: "fad"
}
};
const NAMESPACE_IDENTIFIER = "___FONT_AWESOME___";
const UNITS_IN_GRID = 16;
const DEFAULT_CSS_PREFIX = "fa";
const DEFAULT_REPLACEMENT_CLASS = "svg-inline--fa";
const DATA_FA_I2SVG = "data-fa-i2svg";
const DATA_FA_PSEUDO_ELEMENT = "data-fa-pseudo-element";
const DATA_FA_PSEUDO_ELEMENT_PENDING = "data-fa-pseudo-element-pending";
const DATA_PREFIX = "data-prefix";
const DATA_ICON = "data-icon";
const HTML_CLASS_I2SVG_BASE_CLASS = "fontawesome-i2svg";
const MUTATION_APPROACH_ASYNC = "async";
const TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ["HTML", "HEAD", "STYLE", "SCRIPT"];
const PRODUCTION$1 = (() => {
try {
return true;
} catch (e$$1) {
return false;
}
})();
function familyProxy(obj) {
return new Proxy(obj, {
get(target, prop) {
return prop in target ? target[prop] : target[s$1];
}
});
}
const _PREFIX_TO_STYLE = _objectSpread2$1({}, S);
_PREFIX_TO_STYLE[s$1] = _objectSpread2$1(_objectSpread2$1(_objectSpread2$1(_objectSpread2$1({}, {
"fa-duotone": "duotone"
}), S[s$1]), St["kit"]), St["kit-duotone"]);
const PREFIX_TO_STYLE = familyProxy(_PREFIX_TO_STYLE);
const _STYLE_TO_PREFIX = _objectSpread2$1({}, xt);
_STYLE_TO_PREFIX[s$1] = _objectSpread2$1(_objectSpread2$1(_objectSpread2$1(_objectSpread2$1({}, {
duotone: "fad"
}), _STYLE_TO_PREFIX[s$1]), Et["kit"]), Et["kit-duotone"]);
const STYLE_TO_PREFIX = familyProxy(_STYLE_TO_PREFIX);
const _PREFIX_TO_LONG_STYLE = _objectSpread2$1({}, ga);
_PREFIX_TO_LONG_STYLE[s$1] = _objectSpread2$1(_objectSpread2$1({}, _PREFIX_TO_LONG_STYLE[s$1]), Wt["kit"]);
const PREFIX_TO_LONG_STYLE = familyProxy(_PREFIX_TO_LONG_STYLE);
const _LONG_STYLE_TO_PREFIX = _objectSpread2$1({}, ua);
_LONG_STYLE_TO_PREFIX[s$1] = _objectSpread2$1(_objectSpread2$1({}, _LONG_STYLE_TO_PREFIX[s$1]), Ct["kit"]);
familyProxy(_LONG_STYLE_TO_PREFIX);
const ICON_SELECTION_SYNTAX_PATTERN = p$2;
const LAYERS_TEXT_CLASSNAME = "fa-layers-text";
const FONT_FAMILY_PATTERN = g$1;
const _FONT_WEIGHT_TO_PREFIX = _objectSpread2$1({}, G);
familyProxy(_FONT_WEIGHT_TO_PREFIX);
const ATTRIBUTES_WATCHED_FOR_MUTATION = ["class", "data-prefix", "data-icon", "data-fa-transform", "data-fa-mask"];
const DUOTONE_CLASSES = A;
const RESERVED_CLASSES = [...At, ...ma];
const initial = WINDOW.FontAwesomeConfig || {};
function getAttrConfig(attr) {
var element2 = DOCUMENT.querySelector("script[" + attr + "]");
if (element2) {
return element2.getAttribute(attr);
}
}
function coerce(val) {
if (val === "") return true;
if (val === "false") return false;
if (val === "true") return true;
return val;
}
if (DOCUMENT && typeof DOCUMENT.querySelector === "function") {
const attrs = [["data-family-prefix", "familyPrefix"], ["data-css-prefix", "cssPrefix"], ["data-family-default", "familyDefault"], ["data-style-default", "styleDefault"], ["data-replacement-class", "replacementClass"], ["data-auto-replace-svg", "autoReplaceSvg"], ["data-auto-add-css", "autoAddCss"], ["data-auto-a11y", "autoA11y"], ["data-search-pseudo-elements", "searchPseudoElements"], ["data-observe-mutations", "observeMutations"], ["data-mutate-approach", "mutateApproach"], ["data-keep-original-source", "keepOriginalSource"], ["data-measure-performance", "measurePerformance"], ["data-show-missing-icons", "showMissingIcons"]];
attrs.forEach((_ref) => {
let [attr, key] = _ref;
const val = coerce(getAttrConfig(attr));
if (val !== void 0 && val !== null) {
initial[key] = val;
}
});
}
const _default = {
styleDefault: "solid",
familyDefault: s$1,
cssPrefix: DEFAULT_CSS_PREFIX,
replacementClass: DEFAULT_REPLACEMENT_CLASS,
autoReplaceSvg: true,
autoAddCss: true,
autoA11y: true,
searchPseudoElements: false,
observeMutations: true,
mutateApproach: "async",
keepOriginalSource: true,
measurePerformance: false,
showMissingIcons: true
};
if (initial.familyPrefix) {
initial.cssPrefix = initial.familyPrefix;
}
const _config = _objectSpread2$1(_objectSpread2$1({}, _default), initial);
if (!_config.autoReplaceSvg) _config.observeMutations = false;
const config$2 = {};
Object.keys(_default).forEach((key) => {
Object.defineProperty(config$2, key, {
enumerable: true,
set: function(val) {
_config[key] = val;
_onChangeCb.forEach((cb) => cb(config$2));
},
get: function() {
return _config[key];
}
});
});
Object.defineProperty(config$2, "familyPrefix", {
enumerable: true,
set: function(val) {
_config.cssPrefix = val;
_onChangeCb.forEach((cb) => cb(config$2));
},
get: function() {
return _config.cssPrefix;
}
});
WINDOW.FontAwesomeConfig = config$2;
const _onChangeCb = [];
function onChange(cb) {
_onChangeCb.push(cb);
return () => {
_onChangeCb.splice(_onChangeCb.indexOf(cb), 1);
};
}
const d$2$1 = UNITS_IN_GRID;
const meaninglessTransform = {
size: 16,
x: 0,
y: 0,
rotate: 0,
flipX: false,
flipY: false
};
function insertCss(css2) {
if (!css2 || !IS_DOM) {
return;
}
const style2 = DOCUMENT.createElement("style");
style2.setAttribute("type", "text/css");
style2.innerHTML = css2;
const headChildren = DOCUMENT.head.childNodes;
let beforeChild = null;
for (let i = headChildren.length - 1; i > -1; i--) {
const child = headChildren[i];
const tagName = (child.tagName || "").toUpperCase();
if (["STYLE", "LINK"].indexOf(tagName) > -1) {
beforeChild = child;
}
}
DOCUMENT.head.insertBefore(style2, beforeChild);
return css2;
}
const idPool = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function nextUniqueId() {
let size = 12;
let id = "";
while (size-- > 0) {
id += idPool[Math.random() * 62 | 0];
}
return id;
}
function toArray$2(obj) {
const array = [];
for (let i = (obj || []).length >>> 0; i--; ) {
array[i] = obj[i];
}
return array;
}
function classArray(node2) {
if (node2.classList) {
return toArray$2(node2.classList);
} else {
return (node2.getAttribute("class") || "").split(" ").filter((i) => i);
}
}
function htmlEscape(str2) {
return "".concat(str2).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">");
}
function joinAttributes(attributes) {
return Object.keys(attributes || {}).reduce((acc, attributeName) => {
return acc + "".concat(attributeName, '="').concat(htmlEscape(attributes[attributeName]), '" ');
}, "").trim();
}
function joinStyles(styles2) {
return Object.keys(styles2 || {}).reduce((acc, styleName) => {
return acc + "".concat(styleName, ": ").concat(styles2[styleName].trim(), ";");
}, "");
}
function transformIsMeaningful(transform2) {
return transform2.size !== meaninglessTransform.size || transform2.x !== meaninglessTransform.x || transform2.y !== meaninglessTransform.y || transform2.rotate !== meaninglessTransform.rotate || transform2.flipX || transform2.flipY;
}
function transformForSvg(_ref) {
let {
transform: transform2,
containerWidth,
iconWidth
} = _ref;
const outer = {
transform: "translate(".concat(containerWidth / 2, " 256)")
};
const innerTranslate = "translate(".concat(transform2.x * 32, ", ").concat(transform2.y * 32, ") ");
const innerScale = "scale(".concat(transform2.size / 16 * (transform2.flipX ? -1 : 1), ", ").concat(transform2.size / 16 * (transform2.flipY ? -1 : 1), ") ");
const innerRotate = "rotate(".concat(transform2.rotate, " 0 0)");
const inner = {
transform: "".concat(innerTranslate, " ").concat(innerScale, " ").concat(innerRotate)
};
const path2 = {
transform: "translate(".concat(iconWidth / 2 * -1, " -256)")
};
return {
outer,
inner,
path: path2
};
}
function transformForCss(_ref2) {
let {
transform: transform2,
width = UNITS_IN_GRID,
height = UNITS_IN_GRID,
startCentered = false
} = _ref2;
let val = "";
if (startCentered && IS_IE) {
val += "translate(".concat(transform2.x / d$2$1 - width / 2, "em, ").concat(transform2.y / d$2$1 - height / 2, "em) ");
} else if (startCentered) {
val += "translate(calc(-50% + ".concat(transform2.x / d$2$1, "em), calc(-50% + ").concat(transform2.y / d$2$1, "em)) ");
} else {
val += "translate(".concat(transform2.x / d$2$1, "em, ").concat(transform2.y / d$2$1, "em) ");
}
val += "scale(".concat(transform2.size / d$2$1 * (transform2.flipX ? -1 : 1), ", ").concat(transform2.size / d$2$1 * (transform2.flipY ? -1 : 1), ") ");
val += "rotate(".concat(transform2.rotate, "deg) ");
return val;
}
var baseStyles = ':root, :host {\n --fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free";\n --fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free";\n --fa-font-light: normal 300 1em/1 "Font Awesome 6 Pro";\n --fa-font-thin: normal 100 1em/1 "Font Awesome 6 Pro";\n --fa-font-duotone: normal 900 1em/1 "Font Awesome 6 Duotone";\n --fa-font-duotone-regular: normal 400 1em/1 "Font Awesome 6 Duotone";\n --fa-font-duotone-light: normal 300 1em/1 "Font Awesome 6 Duotone";\n --fa-font-duotone-thin: normal 100 1em/1 "Font Awesome 6 Duotone";\n --fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands";\n --fa-font-sharp-solid: normal 900 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-regular: normal 400 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-light: normal 300 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-thin: normal 100 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-duotone-solid: normal 900 1em/1 "Font Awesome 6 Sharp Duotone";\n --fa-font-sharp-duotone-regular: normal 400 1em/1 "Font Awesome 6 Sharp Duotone";\n --fa-font-sharp-duotone-light: normal 300 1em/1 "Font Awesome 6 Sharp Duotone";\n --fa-font-sharp-duotone-thin: normal 100 1em/1 "Font Awesome 6 Sharp Duotone";\n}\n\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\n overflow: visible;\n box-sizing: content-box;\n}\n\n.svg-inline--fa {\n display: var(--fa-display, inline-block);\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-2xs {\n vertical-align: 0.1em;\n}\n.svg-inline--fa.fa-xs {\n vertical-align: 0em;\n}\n.svg-inline--fa.fa-sm {\n vertical-align: -0.0714285705em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.2em;\n}\n.svg-inline--fa.fa-xl {\n vertical-align: -0.25em;\n}\n.svg-inline--fa.fa-2xl {\n vertical-align: -0.3125em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: var(--fa-pull-margin, 0.3em);\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: var(--fa-pull-margin, 0.3em);\n width: auto;\n}\n.svg-inline--fa.fa-li {\n width: var(--fa-li-width, 2em);\n top: 0.25em;\n}\n.svg-inline--fa.fa-fw {\n width: var(--fa-fw-width, 1.25em);\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-align: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n transform-origin: center center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: var(--fa-counter-background-color, #ff253a);\n border-radius: var(--fa-counter-border-radius, 1em);\n box-sizing: border-box;\n color: var(--fa-inverse, #fff);\n line-height: var(--fa-counter-line-height, 1);\n max-width: var(--fa-counter-max-width, 5em);\n min-width: var(--fa-counter-min-width, 1.5em);\n overflow: hidden;\n padding: var(--fa-counter-padding, 0.25em 0.5em);\n right: var(--fa-right, 0);\n text-overflow: ellipsis;\n top: var(--fa-top, 0);\n transform: scale(var(--fa-counter-scale, 0.25));\n transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: var(--fa-bottom, 0);\n right: var(--fa-right, 0);\n top: auto;\n transform: scale(var(--fa-layers-scale, 0.25));\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: var(--fa-bottom, 0);\n left: var(--fa-left, 0);\n right: auto;\n top: auto;\n transform: scale(var(--fa-layers-scale, 0.25));\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n top: var(--fa-top, 0);\n right: var(--fa-right, 0);\n transform: scale(var(--fa-layers-scale, 0.25));\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: var(--fa-left, 0);\n right: auto;\n top: var(--fa-top, 0);\n transform: scale(var(--fa-layers-scale, 0.25));\n transform-origin: top left;\n}\n\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: 0.625em;\n line-height: 0.1em;\n vertical-align: 0.225em;\n}\n\n.fa-xs {\n font-size: 0.75em;\n line-height: 0.0833333337em;\n vertical-align: 0.125em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n line-height: 0.0714285718em;\n vertical-align: 0.0535714295em;\n}\n\n.fa-lg {\n font-size: 1.25em;\n line-height: 0.05em;\n vertical-align: -0.075em;\n}\n\n.fa-xl {\n font-size: 1.5em;\n line-height: 0.0416666682em;\n vertical-align: -0.125em;\n}\n\n.fa-2xl {\n font-size: 2em;\n line-height: 0.03125em;\n vertical-align: -0.1875em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: var(--fa-li-margin, 2.5em);\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.08em);\n padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\n}\n\n.fa-pull-left {\n float: left;\n margin-right: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right {\n float: right;\n margin-left: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n.fa-bounce,\n.fa-fade,\n.fa-beat-fade,\n.fa-flip,\n.fa-pulse,\n.fa-shake,\n.fa-spin,\n.fa-spin-pulse {\n animation-delay: -1ms;\n animation-duration: 1ms;\n animation-iteration-count: 1;\n transition-delay: 0s;\n transition-duration: 0s;\n }\n}\n@keyframes fa-beat {\n 0%, 90% {\n transform: scale(1);\n }\n 45% {\n transform: scale(var(--fa-beat-scale, 1.25));\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n }\n 10% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n }\n 30% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n }\n 50% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n }\n 57% {\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n }\n 64% {\n transform: scale(1, 1) translateY(0);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 50% {\n opacity: var(--fa-fade-opacity, 0.4);\n }\n}\n@keyframes fa-beat-fade {\n 0%, 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n tra