{"version":3,"file":"reflag-browser-sdk.mjs","sources":["../../../node_modules/fast-equals/dist/esm/index.mjs","../src/config.ts","../src/utils/responseError.ts","../src/bulkQueue.ts","../src/context.ts","../src/logger.ts","../src/sse.ts","../src/utils/retry.ts","../../../node_modules/js-cookie/dist/js.cookie.mjs","../src/feedback/promptStorage.ts","../src/feedback/prompts.ts","../../../node_modules/preact/dist/preact.module.js","../src/ui/constants.ts","../../../node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/ui/packages/floating-ui-preact-dom/arrow.ts","../src/ui/packages/floating-ui-preact-dom/utils/deepEqual.ts","../src/ui/packages/floating-ui-preact-dom/utils/getDPR.ts","../src/ui/packages/floating-ui-preact-dom/utils/roundByDPR.ts","../src/ui/packages/floating-ui-preact-dom/utils/useLatestRef.ts","../src/ui/packages/floating-ui-preact-dom/useFloating.ts","../src/ui/utils.ts","../src/ui/Dialog.tsx","../src/ui/icons/Close.tsx","../src/feedback/ui/config/defaultTranslations.tsx","../src/ui/icons/Check.tsx","../src/ui/icons/CheckCircle.tsx","../src/feedback/ui/Button.tsx","../src/ui/icons/Logo.tsx","../src/feedback/ui/Plug.tsx","../src/ui/icons/Dissatisfied.tsx","../src/ui/icons/Neutral.tsx","../src/ui/icons/Satisfied.tsx","../src/ui/icons/VeryDissatisfied.tsx","../src/ui/icons/VerySatisfied.tsx","../src/feedback/ui/StarRating.tsx","../src/feedback/ui/FeedbackForm.tsx","../src/feedback/ui/hooks/useTimer.ts","../src/feedback/ui/RadialProgress.tsx","../src/feedback/ui/FeedbackDialog.tsx","../src/feedback/ui/index.ts","../src/feedback/feedback.ts","../src/rateLimiter.ts","../src/security-error.ts","../src/storage.ts","../src/utils/abortController.ts","../src/utils/eventTarget.ts","../src/flag/flagStateVersion.ts","../src/flag/flagCache.ts","../src/flag/flags.ts","../src/hooksManager.ts","../src/httpClient.ts","../src/toolbar/Switch.tsx","../src/toolbar/Flags.tsx","../src/toolbar/Toolbar.tsx","../src/toolbar/index.ts","../src/client.ts"],"sourcesContent":["var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n    return function isEqual(a, b, state) {\n        return comparatorA(a, b, state) && comparatorB(a, b, state);\n    };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n    return function isCircular(a, b, state) {\n        if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n            return areItemsEqual(a, b, state);\n        }\n        var cache = state.cache;\n        var cachedA = cache.get(a);\n        var cachedB = cache.get(b);\n        if (cachedA && cachedB) {\n            return cachedA === b && cachedB === a;\n        }\n        cache.set(a, b);\n        cache.set(b, a);\n        var result = areItemsEqual(a, b, state);\n        cache.delete(a);\n        cache.delete(b);\n        return result;\n    };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n    return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n    (function (object, property) {\n        return hasOwnProperty.call(object, property);\n    });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n    return a === b || (!a && !b && a !== a && b !== b);\n}\n\nvar PREACT_VNODE = '__v';\nvar PREACT_OWNER = '__o';\nvar REACT_OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n    var index = a.length;\n    if (b.length !== index) {\n        return false;\n    }\n    while (index-- > 0) {\n        if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n    return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the errors passed are equal in value.\n */\nfunction areErrorsEqual(a, b) {\n    return (a.name === b.name &&\n        a.message === b.message &&\n        a.cause === b.cause &&\n        a.stack === b.stack);\n}\n/**\n * Whether the functions passed are equal in value.\n */\nfunction areFunctionsEqual(a, b) {\n    return a === b;\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n    var size = a.size;\n    if (size !== b.size) {\n        return false;\n    }\n    if (!size) {\n        return true;\n    }\n    var matchedIndices = new Array(size);\n    var aIterable = a.entries();\n    var aResult;\n    var bResult;\n    var index = 0;\n    while ((aResult = aIterable.next())) {\n        if (aResult.done) {\n            break;\n        }\n        var bIterable = b.entries();\n        var hasMatch = false;\n        var matchIndex = 0;\n        while ((bResult = bIterable.next())) {\n            if (bResult.done) {\n                break;\n            }\n            if (matchedIndices[matchIndex]) {\n                matchIndex++;\n                continue;\n            }\n            var aEntry = aResult.value;\n            var bEntry = bResult.value;\n            if (state.equals(aEntry[0], bEntry[0], index, matchIndex, a, b, state) &&\n                state.equals(aEntry[1], bEntry[1], aEntry[0], bEntry[0], a, b, state)) {\n                hasMatch = matchedIndices[matchIndex] = true;\n                break;\n            }\n            matchIndex++;\n        }\n        if (!hasMatch) {\n            return false;\n        }\n        index++;\n    }\n    return true;\n}\n/**\n * Whether the numbers are equal in value.\n */\nvar areNumbersEqual = sameValueZeroEqual;\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n    var properties = keys(a);\n    var index = properties.length;\n    if (keys(b).length !== index) {\n        return false;\n    }\n    // Decrementing `while` showed faster results than either incrementing or\n    // decrementing `for` loop and than an incrementing `while` loop. Declarative\n    // methods like `some` / `every` were not used to avoid incurring the garbage\n    // cost of anonymous callbacks.\n    while (index-- > 0) {\n        if (!isPropertyEqual(a, b, state, properties[index])) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n    var properties = getStrictProperties(a);\n    var index = properties.length;\n    if (getStrictProperties(b).length !== index) {\n        return false;\n    }\n    var property;\n    var descriptorA;\n    var descriptorB;\n    // Decrementing `while` showed faster results than either incrementing or\n    // decrementing `for` loop and than an incrementing `while` loop. Declarative\n    // methods like `some` / `every` were not used to avoid incurring the garbage\n    // cost of anonymous callbacks.\n    while (index-- > 0) {\n        property = properties[index];\n        if (!isPropertyEqual(a, b, state, property)) {\n            return false;\n        }\n        descriptorA = getOwnPropertyDescriptor(a, property);\n        descriptorB = getOwnPropertyDescriptor(b, property);\n        if ((descriptorA || descriptorB) &&\n            (!descriptorA ||\n                !descriptorB ||\n                descriptorA.configurable !== descriptorB.configurable ||\n                descriptorA.enumerable !== descriptorB.enumerable ||\n                descriptorA.writable !== descriptorB.writable)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n    return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n    return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n    var size = a.size;\n    if (size !== b.size) {\n        return false;\n    }\n    if (!size) {\n        return true;\n    }\n    var matchedIndices = new Array(size);\n    var aIterable = a.values();\n    var aResult;\n    var bResult;\n    while ((aResult = aIterable.next())) {\n        if (aResult.done) {\n            break;\n        }\n        var bIterable = b.values();\n        var hasMatch = false;\n        var matchIndex = 0;\n        while ((bResult = bIterable.next())) {\n            if (bResult.done) {\n                break;\n            }\n            if (!matchedIndices[matchIndex] &&\n                state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state)) {\n                hasMatch = matchedIndices[matchIndex] = true;\n                break;\n            }\n            matchIndex++;\n        }\n        if (!hasMatch) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n    var index = a.length;\n    if (b.length !== index) {\n        return false;\n    }\n    while (index-- > 0) {\n        if (a[index] !== b[index]) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Whether the URL instances are equal in value.\n */\nfunction areUrlsEqual(a, b) {\n    return (a.hostname === b.hostname &&\n        a.pathname === b.pathname &&\n        a.protocol === b.protocol &&\n        a.port === b.port &&\n        a.hash === b.hash &&\n        a.username === b.username &&\n        a.password === b.password);\n}\nfunction isPropertyEqual(a, b, state, property) {\n    if ((property === REACT_OWNER ||\n        property === PREACT_OWNER ||\n        property === PREACT_VNODE) &&\n        (a.$$typeof || b.$$typeof)) {\n        return true;\n    }\n    return (hasOwn(b, property) &&\n        state.equals(a[property], b[property], property, property, a, b, state));\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar ERROR_TAG = '[object Error]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar URL_TAG = '[object URL]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n    ? ArrayBuffer.isView\n    : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n    var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areErrorsEqual = _a.areErrorsEqual, areFunctionsEqual = _a.areFunctionsEqual, areMapsEqual = _a.areMapsEqual, areNumbersEqual = _a.areNumbersEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual, areUrlsEqual = _a.areUrlsEqual;\n    /**\n     * compare the value of the two objects and return true if they are equivalent in values\n     */\n    return function comparator(a, b, state) {\n        // If the items are strictly equal, no need to do a value comparison.\n        if (a === b) {\n            return true;\n        }\n        // If either of the items are nullish and fail the strictly equal check\n        // above, then they must be unequal.\n        if (a == null || b == null) {\n            return false;\n        }\n        var type = typeof a;\n        if (type !== typeof b) {\n            return false;\n        }\n        if (type !== 'object') {\n            if (type === 'number') {\n                return areNumbersEqual(a, b, state);\n            }\n            if (type === 'function') {\n                return areFunctionsEqual(a, b, state);\n            }\n            // If a primitive value that is not strictly equal, it must be unequal.\n            return false;\n        }\n        var constructor = a.constructor;\n        // Checks are listed in order of commonality of use-case:\n        //   1. Common complex object types (plain object, array)\n        //   2. Common data values (date, regexp)\n        //   3. Less-common complex object types (map, set)\n        //   4. Less-common data values (promise, primitive wrappers)\n        // Inherently this is both subjective and assumptive, however\n        // when reviewing comparable libraries in the wild this order\n        // appears to be generally consistent.\n        // Constructors should match, otherwise there is potential for false positives\n        // between class and subclass or custom object and POJO.\n        if (constructor !== b.constructor) {\n            return false;\n        }\n        // `isPlainObject` only checks against the object's own realm. Cross-realm\n        // comparisons are rare, and will be handled in the ultimate fallback, so\n        // we can avoid capturing the string tag.\n        if (constructor === Object) {\n            return areObjectsEqual(a, b, state);\n        }\n        // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n        // the string tag or doing an `instanceof` check.\n        if (isArray(a)) {\n            return areArraysEqual(a, b, state);\n        }\n        // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n        // capturing the string tag or comparing against all possible constructors.\n        if (isTypedArray != null && isTypedArray(a)) {\n            return areTypedArraysEqual(a, b, state);\n        }\n        // Try to fast-path equality checks for other complex object types in the\n        // same realm to avoid capturing the string tag. Strict equality is used\n        // instead of `instanceof` because it is more performant for the common\n        // use-case. If someone is subclassing a native class, it will be handled\n        // with the string tag comparison.\n        if (constructor === Date) {\n            return areDatesEqual(a, b, state);\n        }\n        if (constructor === RegExp) {\n            return areRegExpsEqual(a, b, state);\n        }\n        if (constructor === Map) {\n            return areMapsEqual(a, b, state);\n        }\n        if (constructor === Set) {\n            return areSetsEqual(a, b, state);\n        }\n        // Since this is a custom object, capture the string tag to determing its type.\n        // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n        var tag = getTag(a);\n        if (tag === DATE_TAG) {\n            return areDatesEqual(a, b, state);\n        }\n        // For RegExp, the properties are not enumerable, and therefore will give false positives if\n        // tested like a standard object.\n        if (tag === REG_EXP_TAG) {\n            return areRegExpsEqual(a, b, state);\n        }\n        if (tag === MAP_TAG) {\n            return areMapsEqual(a, b, state);\n        }\n        if (tag === SET_TAG) {\n            return areSetsEqual(a, b, state);\n        }\n        if (tag === OBJECT_TAG) {\n            // The exception for value comparison is custom `Promise`-like class instances. These should\n            // be treated the same as standard `Promise` objects, which means strict equality, and if\n            // it reaches this point then that strict equality comparison has already failed.\n            return (typeof a.then !== 'function' &&\n                typeof b.then !== 'function' &&\n                areObjectsEqual(a, b, state));\n        }\n        // If a URL tag, it should be tested explicitly. Like RegExp, the properties are not\n        // enumerable, and therefore will give false positives if tested like a standard object.\n        if (tag === URL_TAG) {\n            return areUrlsEqual(a, b, state);\n        }\n        // If an error tag, it should be tested explicitly. Like RegExp, the properties are not\n        // enumerable, and therefore will give false positives if tested like a standard object.\n        if (tag === ERROR_TAG) {\n            return areErrorsEqual(a, b, state);\n        }\n        // If an arguments tag, it should be treated as a standard object.\n        if (tag === ARGUMENTS_TAG) {\n            return areObjectsEqual(a, b, state);\n        }\n        // As the penultimate fallback, check if the values passed are primitive wrappers. This\n        // is very rare in modern JS, which is why it is deprioritized compared to all other object\n        // types.\n        if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n            return arePrimitiveWrappersEqual(a, b, state);\n        }\n        // If not matching any tags that require a specific type of comparison, then we hard-code false because\n        // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n        //   - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n        //     comparison that can be made.\n        //   - For types that can be introspected, but rarely have requirements to be compared\n        //     (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n        //     use-cases (may be included in a future release, if requested enough).\n        //   - For types that can be introspected but do not have an objective definition of what\n        //     equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n        // In all cases, these decisions should be reevaluated based on changes to the language and\n        // common development practices.\n        return false;\n    };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n    var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n    var config = {\n        areArraysEqual: strict\n            ? areObjectsEqualStrict\n            : areArraysEqual,\n        areDatesEqual: areDatesEqual,\n        areErrorsEqual: areErrorsEqual,\n        areFunctionsEqual: areFunctionsEqual,\n        areMapsEqual: strict\n            ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n            : areMapsEqual,\n        areNumbersEqual: areNumbersEqual,\n        areObjectsEqual: strict\n            ? areObjectsEqualStrict\n            : areObjectsEqual,\n        arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n        areRegExpsEqual: areRegExpsEqual,\n        areSetsEqual: strict\n            ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n            : areSetsEqual,\n        areTypedArraysEqual: strict\n            ? areObjectsEqualStrict\n            : areTypedArraysEqual,\n        areUrlsEqual: areUrlsEqual,\n    };\n    if (createCustomConfig) {\n        config = assign({}, config, createCustomConfig(config));\n    }\n    if (circular) {\n        var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n        var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n        var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n        var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n        config = assign({}, config, {\n            areArraysEqual: areArraysEqual$1,\n            areMapsEqual: areMapsEqual$1,\n            areObjectsEqual: areObjectsEqual$1,\n            areSetsEqual: areSetsEqual$1,\n        });\n    }\n    return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n    return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n        return compare(a, b, state);\n    };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n    var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n    if (createState) {\n        return function isEqual(a, b) {\n            var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n            return comparator(a, b, {\n                cache: cache,\n                equals: equals,\n                meta: meta,\n                strict: strict,\n            });\n        };\n    }\n    if (circular) {\n        return function isEqual(a, b) {\n            return comparator(a, b, {\n                cache: new WeakMap(),\n                equals: equals,\n                meta: undefined,\n                strict: strict,\n            });\n        };\n    }\n    var state = {\n        cache: undefined,\n        equals: equals,\n        meta: undefined,\n        strict: strict,\n    };\n    return function isEqual(a, b) {\n        return comparator(a, b, state);\n    };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n    circular: true,\n    strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n    createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n    strict: true,\n    createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n    circular: true,\n    createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n    circular: true,\n    createInternalComparator: function () { return sameValueZeroEqual; },\n    strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n    if (options === void 0) { options = {}; }\n    var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n    var config = createEqualityComparatorConfig(options);\n    var comparator = createEqualityComparator(config);\n    var equals = createCustomInternalComparator\n        ? createCustomInternalComparator(comparator)\n        : createInternalEqualityComparator(comparator);\n    return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","import { version } from \"../package.json\";\n\nexport const API_BASE_URL = \"https://front.reflag.com\";\nexport const APP_BASE_URL = \"https://app.reflag.com\";\n\nexport const SDK_VERSION_HEADER_NAME = \"reflag-sdk-version\";\n\nexport const SDK_VERSION = `browser-sdk/${version}`;\nexport const FLAG_EVENTS_PER_MIN = 1;\nexport const FLAGS_EXPIRE_MS = 30 * 24 * 60 * 60 * 1000; // expire entirely after 30 days\nexport const BULK_QUEUE_MAX_SIZE = 100;\nexport const BULK_QUEUE_FLUSH_DELAY_MS = 2000;\n\nexport const IS_SERVER =\n  typeof window === \"undefined\" || typeof document === \"undefined\";\n","export type ResponseErrorDetails = {\n  responseBody?: string;\n  apiErrorCode?: string;\n  apiErrorMessage?: string;\n};\n\nexport type ParsedResponseError = {\n  errorDetails: ResponseErrorDetails;\n  errorSummary?: string;\n};\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\ntype ResponseLogger = {\n  [key in LogLevel]: (message: string, ...args: any[]) => void;\n};\n\nconst MAX_RESPONSE_BODY_PREVIEW_CHARS = 500;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null;\n}\n\nfunction extractApiError(value: unknown): { code?: string; message?: string } {\n  if (!isObject(value)) {\n    return {};\n  }\n\n  const topLevelCode = typeof value.code === \"string\" ? value.code : undefined;\n  const topLevelMessage =\n    typeof value.message === \"string\" ? value.message : undefined;\n\n  const error = value.error;\n  if (!isObject(error)) {\n    return {\n      code: topLevelCode,\n      message: topLevelMessage,\n    };\n  }\n\n  return {\n    code: typeof error.code === \"string\" ? error.code : topLevelCode,\n    message:\n      typeof error.message === \"string\" ? error.message : topLevelMessage,\n  };\n}\n\nexport async function parseResponseErrorDetails(\n  res: Response,\n): Promise<ResponseErrorDetails> {\n  try {\n    const body = await res.text();\n    if (!body) {\n      return {};\n    }\n\n    let apiErrorCode: string | undefined;\n    let apiErrorMessage: string | undefined;\n    try {\n      const parsed: unknown = JSON.parse(body);\n      const parsedError = extractApiError(parsed);\n      apiErrorCode = parsedError.code;\n      apiErrorMessage = parsedError.message;\n    } catch {\n      // ignore JSON parse failures\n    }\n\n    return {\n      responseBody: body.slice(0, MAX_RESPONSE_BODY_PREVIEW_CHARS),\n      apiErrorCode,\n      apiErrorMessage,\n    };\n  } catch {\n    return {};\n  }\n}\n\nexport function formatResponseErrorSummary(details: ResponseErrorDetails) {\n  if (details.apiErrorCode && details.apiErrorMessage) {\n    return `${details.apiErrorCode}: ${details.apiErrorMessage}`;\n  }\n\n  return details.apiErrorMessage ?? details.apiErrorCode;\n}\n\nexport async function parseResponseError(\n  res: Response,\n): Promise<ParsedResponseError> {\n  const errorDetails = await parseResponseErrorDetails(res);\n  const errorSummary = formatResponseErrorSummary(errorDetails);\n  return { errorDetails, errorSummary };\n}\n\nexport async function logResponseError(args: {\n  logger: ResponseLogger;\n  level?: LogLevel;\n  res: Response;\n  message: string;\n  extra?: Record<string, unknown>;\n}) {\n  const { logger, level = \"error\", res, message, extra } = args;\n  const { errorDetails, errorSummary } = await parseResponseError(res);\n\n  logger[level](errorSummary ? `${message}: ${errorSummary}` : message, {\n    status: res.status,\n    statusText: res.statusText,\n    ...errorDetails,\n    ...extra,\n  });\n\n  return { errorDetails, errorSummary };\n}\n","import { BULK_QUEUE_FLUSH_DELAY_MS, BULK_QUEUE_MAX_SIZE } from \"./config\";\nimport type { CheckEvent } from \"./flag/flags\";\nimport { Logger } from \"./logger\";\nimport { logResponseError } from \"./utils/responseError\";\n\nconst DROP_ERROR_THROTTLE_MS = 15 * 60 * 1000;\n\ntype PayloadContext = {\n  active?: boolean;\n};\n\nexport type BulkEvent =\n  | {\n      type: \"company\";\n      companyId: string;\n      userId?: string;\n      attributes?: Record<string, any>;\n      context?: PayloadContext;\n    }\n  | {\n      type: \"user\";\n      userId: string;\n      attributes?: Record<string, any>;\n      context?: PayloadContext;\n    }\n  | {\n      type: \"event\";\n      event: string;\n      companyId?: string;\n      userId: string;\n      attributes?: Record<string, any>;\n      context?: PayloadContext;\n    }\n  | {\n      type: \"feature-flag-event\";\n      action: \"check-is-enabled\" | \"check-config\";\n      key: string;\n      targetingVersion?: number;\n      evalResult?: boolean | { key: string; payload: any };\n      evalContext?: Record<string, any>;\n      evalRuleResults?: boolean[];\n      evalMissingFields?: string[];\n      evalErrors?: CheckEvent[\"evaluationErrors\"];\n    }\n  | {\n      type: \"prompt-event\";\n      action: \"received\" | \"shown\" | \"dismissed\";\n      featureId: string;\n      promptId: string;\n      userId: string;\n      promptedQuestion: string;\n    };\n\nexport type BulkQueueOptions = {\n  flushDelayMs?: number;\n  maxSize?: number;\n  logger?: Logger;\n};\n\nexport class BulkQueue {\n  private readonly flushDelayMs: number;\n  private readonly maxSize: number;\n  private readonly logger?: Logger;\n  private readonly sendBulk: (events: BulkEvent[]) => Promise<Response>;\n\n  private queue: BulkEvent[] = [];\n  private timer: ReturnType<typeof setTimeout> | null = null;\n  private inFlightBatch: BulkEvent[] | null = null;\n  private inFlightPromise: Promise<void> | null = null;\n  private lastDropErrorAt: number | null = null;\n  private totalDroppedEvents = 0;\n  private droppedSinceLastError = 0;\n\n  constructor(\n    sendBulk: (events: BulkEvent[]) => Promise<Response>,\n    opts: BulkQueueOptions = {},\n  ) {\n    this.sendBulk = sendBulk;\n    this.flushDelayMs = opts.flushDelayMs ?? BULK_QUEUE_FLUSH_DELAY_MS;\n    this.maxSize = opts.maxSize ?? BULK_QUEUE_MAX_SIZE;\n    this.logger = opts.logger;\n  }\n\n  async enqueue(event: BulkEvent) {\n    this.queue.push(event);\n    this.trimPendingQueueToCapacity();\n\n    const maxPending = Math.max(0, this.maxSize - this.getInFlightBatchSize());\n    if (this.queue.length > 0 && this.queue.length >= maxPending) {\n      void this.flush();\n      return;\n    }\n\n    this.schedule(this.flushDelayMs);\n  }\n\n  async flush(): Promise<void> {\n    if (this.inFlightPromise) {\n      await this.inFlightPromise;\n      if (this.queue.length === 0) {\n        return;\n      }\n      return this.flush();\n    }\n\n    if (this.queue.length === 0) {\n      return;\n    }\n\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = null;\n    }\n\n    const batch = this.queue.splice(0, this.maxSize);\n    this.inFlightBatch = batch;\n\n    const sendPromise = this.sendBatch(batch);\n    this.inFlightPromise = sendPromise;\n    try {\n      await sendPromise;\n    } finally {\n      if (this.inFlightPromise === sendPromise) {\n        this.inFlightPromise = null;\n      }\n      this.inFlightBatch = null;\n    }\n\n    if (this.queue.length > 0 && !this.timer) {\n      this.schedule(this.flushDelayMs);\n    }\n  }\n\n  async size() {\n    return this.queue.length + this.getInFlightBatchSize();\n  }\n\n  private schedule(delayMs: number) {\n    if (this.timer || this.inFlightPromise || this.queue.length === 0) {\n      return;\n    }\n\n    if (delayMs <= 0) {\n      void this.flush();\n      return;\n    }\n\n    this.timer = setTimeout(() => {\n      this.timer = null;\n      void this.flush();\n    }, delayMs);\n  }\n\n  private async sendBatch(batch: BulkEvent[]) {\n    let res: Response;\n    try {\n      res = await this.sendBulk(batch);\n    } catch (error) {\n      this.logger?.debug(\"bulk request failed; dropping batch\", {\n        error,\n        batchSize: batch.length,\n      });\n      return;\n    }\n\n    if (!res.ok) {\n      if (this.logger) {\n        await logResponseError({\n          logger: this.logger,\n          res,\n          message: \"bulk request failed; dropping batch\",\n        });\n      }\n      return;\n    }\n  }\n\n  private getInFlightBatchSize() {\n    return this.inFlightBatch?.length ?? 0;\n  }\n\n  private trimPendingQueueToCapacity() {\n    const maxPending = Math.max(0, this.maxSize - this.getInFlightBatchSize());\n    if (this.queue.length <= maxPending) {\n      return;\n    }\n\n    const removed = this.queue.length - maxPending;\n    this.queue = maxPending === 0 ? [] : this.queue.slice(-maxPending);\n    this.totalDroppedEvents += removed;\n    this.droppedSinceLastError += removed;\n\n    const now = Date.now();\n    if (\n      !this.lastDropErrorAt ||\n      now - this.lastDropErrorAt >= DROP_ERROR_THROTTLE_MS\n    ) {\n      this.logger?.debug(\"bulk queue dropped events due to max size\", {\n        droppedEvents: this.droppedSinceLastError,\n        totalDroppedEvents: this.totalDroppedEvents,\n        queueSize: this.queue.length + this.getInFlightBatchSize(),\n        maxSize: this.maxSize,\n      });\n      this.lastDropErrorAt = now;\n      this.droppedSinceLastError = 0;\n    }\n  }\n}\n","/** A JSON-compatible context value that is not `undefined`. */\nexport type DefinedContextValue =\n  | string\n  | number\n  | boolean\n  | null\n  | DefinedContextValue[]\n  | { [key: string]: ContextValue };\n\n/** A context value. Object properties set to `undefined` are omitted. */\nexport type ContextValue = DefinedContextValue | undefined;\n\n/**\n * Serialize context with recursively sorted object keys. Array order is preserved.\n */\nfunction canonicalJSONStringify(value: unknown): string {\n  let serialized: string | undefined;\n  try {\n    serialized = JSON.stringify(value, (_key, nestedValue: unknown) => {\n      if (typeof nestedValue === \"bigint\") return String(nestedValue);\n      if (\n        nestedValue === null ||\n        typeof nestedValue !== \"object\" ||\n        Array.isArray(nestedValue)\n      ) {\n        return nestedValue;\n      }\n\n      return Object.fromEntries(\n        Object.entries(nestedValue).sort(([left], [right]) =>\n          left < right ? -1 : left > right ? 1 : 0,\n        ),\n      );\n    });\n  } catch {\n    throw new Error(\"value must be JSON serializable\");\n  }\n  if (serialized === undefined) {\n    throw new Error(\"value must be JSON serializable\");\n  }\n  return serialized;\n}\n\nfunction isPlainObjectWithoutToJSON(value: object): boolean {\n  const prototype = Object.getPrototypeOf(value);\n  return (\n    (prototype === Object.prototype || prototype === null) &&\n    typeof (value as { toJSON?: unknown }).toJSON !== \"function\"\n  );\n}\n\nfunction pruneUndefinedObjectValues(\n  value: object,\n  ancestors: WeakSet<object>,\n): Record<string, unknown> {\n  if (ancestors.has(value)) {\n    throw new Error(\"value must be JSON serializable\");\n  }\n  ancestors.add(value);\n\n  const entries = Object.entries(value).flatMap(([key, nestedValue]) => {\n    if (nestedValue === undefined) return [];\n    if (\n      nestedValue !== null &&\n      typeof nestedValue === \"object\" &&\n      !Array.isArray(nestedValue) &&\n      isPlainObjectWithoutToJSON(nestedValue)\n    ) {\n      const originalKeys = Object.keys(nestedValue);\n      const pruned = pruneUndefinedObjectValues(nestedValue, ancestors);\n      if (originalKeys.length > 0 && Object.keys(pruned).length === 0)\n        return [];\n      return [[key, pruned] as const];\n    }\n    return [[key, nestedValue] as const];\n  });\n\n  ancestors.delete(value);\n  return Object.fromEntries(entries);\n}\n\nexport function canonicalContextJSONStringify(\n  context: ReflagContext | undefined,\n): string | undefined {\n  if (!context) return undefined;\n  const pruned = Object.fromEntries(\n    Object.entries(pruneUndefinedObjectValues(context, new WeakSet())).filter(\n      ([, section]) =>\n        !section ||\n        typeof section !== \"object\" ||\n        Array.isArray(section) ||\n        Object.keys(section).length > 0,\n    ),\n  );\n  return Object.keys(pruned).length\n    ? canonicalJSONStringify(pruned)\n    : undefined;\n}\n\n/**\n * Context is a set of key-value pairs.\n * This is used to determine if feature targeting matches and to track events.\n * Id should always be present so that it can be referenced to an existing company.\n */\nexport interface CompanyContext {\n  /**\n   * Company id\n   */\n  id: string | number | undefined;\n\n  /**\n   * Company name\n   */\n  name?: string | undefined;\n\n  /**\n   * Other company attributes\n   */\n  [key: string]: ContextValue;\n}\n\n/**\n * Context is a set of key-value pairs.\n * This is used to determine if feature targeting matches and to track events.\n * Id should always be present so that it can be referenced to an existing user.\n */\nexport interface UserContext {\n  /**\n   * User id\n   */\n  id: string | number | undefined;\n\n  /**\n   * User name\n   */\n  name?: string | undefined;\n\n  /**\n   * User email\n   */\n  email?: string | undefined;\n\n  /**\n   * Other user attributes\n   */\n  [key: string]: ContextValue;\n}\n\n/**\n * Context is a set of key-value pairs.\n * This is used to determine if feature targeting matches and to track events.\n */\nexport interface ReflagContext {\n  /**\n   * Company related context. If you provide `id` Reflag will enrich the evaluation context with\n   * company attributes on Reflag servers.\n   */\n  company?: CompanyContext;\n\n  /**\n   * User related context. If you provide `id` Reflag will enrich the evaluation context with\n   * user attributes on Reflag servers.\n   */\n  user?: UserContext;\n\n  /**\n   * Context which is not related to a user or a company.\n   */\n  other?: Record<string, ContextValue>;\n}\n\n/**\n * @deprecated Use `ReflagContext` instead, this interface will be removed in the next major version\n * @internal\n */\nexport interface ReflagDeprecatedContext extends ReflagContext {\n  /**\n   * Context which is not related to a user or a company.\n   * @deprecated Use `other` instead, this property will be removed in the next major version\n   */\n  otherContext?: Record<string, ContextValue>;\n}\n","export interface Logger {\n  debug(message: string, ...args: any[]): void;\n  info(message: string, ...args: any[]): void;\n  warn(message: string, ...args: any[]): void;\n  error(message: string, ...args: any[]): void;\n}\n\nexport const quietConsoleLogger = {\n  debug(_: string) {\n    // do nothing\n  },\n  info(_: string) {\n    // do nothing\n  },\n  warn(message: string, ...args: any[]) {\n    console.warn(message, ...args);\n  },\n  error(message: string, ...args: any[]) {\n    console.error(message, ...args);\n  },\n};\n\nexport function loggerWithPrefix(logger: Logger, prefix: string): Logger {\n  return {\n    debug(message: string, ...args: any[]) {\n      logger.debug(`${prefix} ${message}`, ...args);\n    },\n    info(message: string, ...args: any[]) {\n      logger.info(`${prefix} ${message}`, ...args);\n    },\n    warn(message: string, ...args: any[]) {\n      logger.warn(`${prefix} ${message}`, ...args);\n    },\n    error(message: string, ...args: any[]) {\n      logger.error(`${prefix} ${message}`, ...args);\n    },\n  };\n}\n","import { SDK_VERSION_HEADER_NAME } from \"./config\";\nimport { canonicalContextJSONStringify, ReflagContext } from \"./context\";\nimport { Logger, loggerWithPrefix } from \"./logger\";\n\nexport type EventSourceLike = {\n  addEventListener: (type: string, cb: (event: any) => void) => void;\n  close: () => void;\n};\n\nexport type EventSourceFactory = (url: string) => EventSourceLike;\n\nexport type PubSubMessage = {\n  name?: string;\n  event?: string;\n  channel?: string;\n  data?: any;\n  [key: string]: any;\n};\n\nexport class AblySSEChannel {\n  private isOpen = false;\n  private eventSource: EventSourceLike | null = null;\n  private retryInterval: ReturnType<typeof setInterval> | null = null;\n  private logger: Logger;\n\n  constructor(\n    private channels: string[],\n    private sseBaseUrl: string,\n    private messageHandler: (message: PubSubMessage) => void,\n    logger: Logger,\n    private eventSourceFactory?: EventSourceFactory,\n    private publishableKey?: string,\n    private sdkVersion?: string,\n    private path = \"sse\",\n    private context?: ReflagContext,\n    private credentials?: RequestCredentials,\n  ) {\n    this.logger = loggerWithPrefix(logger, \"[SSE]\");\n\n    if (!this.sseBaseUrl.endsWith(\"/\")) {\n      this.sseBaseUrl += \"/\";\n    }\n  }\n\n  private onMessage(e: MessageEvent) {\n    let payload: PubSubMessage | undefined;\n\n    try {\n      if (e.data) {\n        const message = JSON.parse(e.data);\n        if (message && typeof message === \"object\") {\n          const parsed = { ...message } as PubSubMessage;\n          if (typeof parsed.data === \"string\") {\n            try {\n              parsed.data = JSON.parse(parsed.data);\n            } catch {\n              // keep string payload as-is\n            }\n          }\n          payload = parsed;\n        }\n      }\n    } catch (error: any) {\n      this.logger.warn(\"received unparsable message\", error, e);\n      return;\n    }\n\n    if (payload) {\n      this.logger.debug(\"received message\", payload);\n\n      try {\n        this.messageHandler(payload);\n      } catch (error: any) {\n        this.logger.warn(\"failed to handle message\", error, payload);\n      }\n\n      return;\n    }\n\n    this.logger.warn(\"received invalid message\", e);\n  }\n\n  private onOpen(e: Event) {\n    this.logger.debug(\"event source connection opened\", e);\n  }\n\n  private onError(e: Event) {\n    const connectionState = (e as any)?.target?.readyState;\n\n    if (connectionState === 2) {\n      this.logger.debug(\"event source connection closed\", e);\n    } else if (connectionState === 1) {\n      this.logger.warn(\"event source connection failed to open\", e);\n    } else {\n      this.logger.warn(\"event source unexpected error occurred\", e);\n    }\n\n    this.disconnect();\n  }\n\n  private createEventSource(url: string): EventSourceLike | undefined {\n    if (this.eventSourceFactory) {\n      return this.eventSourceFactory(url);\n    }\n\n    if (typeof EventSource === \"undefined\") {\n      this.logger.warn(\n        \"EventSource is not available in this environment; SSE channel cannot be opened\",\n      );\n      return;\n    }\n\n    return this.credentials === \"include\"\n      ? new EventSource(url, { withCredentials: true })\n      : new EventSource(url);\n  }\n\n  public async connect() {\n    if (this.isOpen) {\n      this.logger.warn(\"channel connection already open\");\n      return;\n    }\n\n    this.isOpen = true;\n    try {\n      const url = new URL(this.path, this.sseBaseUrl);\n      if (this.channels.length > 0) {\n        url.searchParams.append(\"v\", \"1.2\");\n        url.searchParams.append(\"channels\", this.channels.join(\",\"));\n        url.searchParams.append(\"rewind\", \"1\");\n      }\n      if (this.publishableKey) {\n        url.searchParams.append(\"publishableKey\", this.publishableKey);\n      }\n      if (this.sdkVersion) {\n        url.searchParams.append(SDK_VERSION_HEADER_NAME, this.sdkVersion);\n      }\n      const serializedContext = canonicalContextJSONStringify(this.context);\n      if (serializedContext) {\n        url.searchParams.append(\"contextJson\", serializedContext);\n      }\n\n      this.eventSource = this.createEventSource(url.toString()) ?? null;\n      if (!this.eventSource) {\n        return;\n      }\n\n      this.eventSource.addEventListener(\"error\", (e) => this.onError(e));\n      this.eventSource.addEventListener(\"open\", (e) => this.onOpen(e));\n      this.eventSource.addEventListener(\"message\", (m) => this.onMessage(m));\n\n      this.logger.debug(\"channel connection opened\");\n    } finally {\n      this.isOpen = !!this.eventSource;\n    }\n  }\n\n  public disconnect() {\n    if (!this.isOpen) {\n      return;\n    }\n\n    if (this.eventSource) {\n      this.eventSource.close();\n      this.eventSource = null;\n\n      this.logger.debug(\"channel connection closed\");\n    }\n\n    this.isOpen = false;\n  }\n\n  public open(options?: { retryInterval?: number; retryCount?: number }) {\n    if (!this.eventSourceFactory && typeof EventSource === \"undefined\") {\n      this.logger.warn(\n        \"EventSource is not available in this environment; SSE channel cannot be opened\",\n      );\n      return;\n    }\n\n    const retryInterval = options?.retryInterval ?? 1000 * 30;\n    const retryCount = options?.retryCount ?? 3;\n    let retriesRemaining = retryCount;\n\n    const tryConnect = async () => {\n      try {\n        await this.connect();\n        retriesRemaining = retryCount;\n      } catch (e) {\n        if (retriesRemaining > 0) {\n          this.logger.warn(\n            `failed to connect, ${retriesRemaining} retries remaining`,\n            e,\n          );\n        } else {\n          this.logger.warn(`failed to connect, no retries remaining`, e);\n        }\n      }\n    };\n\n    void tryConnect();\n\n    this.retryInterval = setInterval(() => {\n      if (!this.isConnected() && this.retryInterval) {\n        if (retriesRemaining <= 0) {\n          clearInterval(this.retryInterval);\n          this.retryInterval = null;\n          return;\n        }\n\n        retriesRemaining--;\n        void tryConnect();\n      }\n    }, retryInterval);\n  }\n\n  public close() {\n    if (this.retryInterval) {\n      clearInterval(this.retryInterval);\n      this.retryInterval = null;\n    }\n\n    this.disconnect();\n  }\n\n  public isActive() {\n    return !!this.retryInterval;\n  }\n\n  public isConnected() {\n    return this.isOpen && !!this.eventSource;\n  }\n}\n\nexport function openAblySSEChannel({\n  channel,\n  channels,\n  callback,\n  sseBaseUrl,\n  logger,\n  eventSourceFactory,\n  publishableKey,\n  sdkVersion,\n  path,\n  context,\n  credentials,\n}: {\n  channel?: string;\n  channels?: string[];\n  callback: (req: PubSubMessage) => void;\n  logger: Logger;\n  sseBaseUrl: string;\n  eventSourceFactory?: EventSourceFactory;\n  publishableKey?: string;\n  sdkVersion?: string;\n  path?: string;\n  context?: ReflagContext;\n  credentials?: RequestCredentials;\n}) {\n  const subscribedChannels = channels ?? (channel ? [channel] : []);\n  const sse = new AblySSEChannel(\n    subscribedChannels,\n    sseBaseUrl,\n    callback,\n    logger,\n    eventSourceFactory,\n    publishableKey,\n    sdkVersion,\n    path,\n    context,\n    credentials,\n  );\n\n  sse.open();\n\n  return sse;\n}\n\nexport function closeAblySSEChannel(channel: AblySSEChannel) {\n  channel.close();\n}\n","function delay(ms: number) {\n  if (ms <= 0) {\n    return Promise.resolve();\n  }\n\n  return new Promise<void>((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nexport async function retryOnThrow<T>(\n  retryDelaysMs: number[],\n  operation: () => Promise<T>,\n): Promise<T> {\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt <= retryDelaysMs.length; attempt += 1) {\n    try {\n      return await operation();\n    } catch (error) {\n      lastError = error;\n      if (attempt === retryDelaysMs.length) {\n        throw error;\n      }\n\n      await delay(retryDelaysMs[attempt] ?? 0);\n    }\n  }\n\n  throw lastError;\n}\n","/*! js-cookie v3.0.7 | MIT */\nfunction assign (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n    for (var key in source) {\n      if (key === '__proto__') continue\n      target[key] = source[key];\n    }\n  }\n  return target\n}\n\nvar defaultConverter = {\n  read: function (value) {\n    if (value[0] === '\"') {\n      value = value.slice(1, -1);\n    }\n    return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n  },\n  write: function (value) {\n    return encodeURIComponent(value).replace(\n      /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n      decodeURIComponent\n    )\n  }\n};\n\nfunction init(converter, defaultAttributes) {\n  function set(name, value, attributes) {\n    if (typeof document === 'undefined') {\n      return\n    }\n\n    attributes = assign({}, defaultAttributes, attributes);\n\n    if (typeof attributes.expires === 'number') {\n      attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n    }\n    if (attributes.expires) {\n      attributes.expires = attributes.expires.toUTCString();\n    }\n\n    name = encodeURIComponent(name)\n      .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n      .replace(/[()]/g, escape);\n\n    var stringifiedAttributes = '';\n    for (var attributeName in attributes) {\n      if (!attributes[attributeName]) {\n        continue\n      }\n\n      stringifiedAttributes += '; ' + attributeName;\n\n      if (attributes[attributeName] === true) {\n        continue\n      }\n\n      // Considers RFC 6265 section 5.2:\n      // ...\n      // 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n      //     character:\n      // Consume the characters of the unparsed-attributes up to,\n      // not including, the first %x3B (\";\") character.\n      // ...\n      stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n    }\n\n    return (document.cookie =\n      name + '=' + converter.write(value, name) + stringifiedAttributes)\n  }\n\n  function get(name) {\n    if (typeof document === 'undefined' || (arguments.length && !name)) {\n      return\n    }\n\n    // To prevent the for loop in the first place assign an empty array\n    // in case there are no cookies at all.\n    var cookies = document.cookie ? document.cookie.split('; ') : [];\n    var jar = {};\n    for (var i = 0; i < cookies.length; i++) {\n      var parts = cookies[i].split('=');\n      var value = parts.slice(1).join('=');\n\n      try {\n        var found = decodeURIComponent(parts[0]);\n        if (!(found in jar)) jar[found] = converter.read(value, found);\n        if (name === found) {\n          break\n        }\n      } catch {\n        // Do nothing...\n      }\n    }\n\n    return name ? jar[name] : jar\n  }\n\n  return Object.create(\n    {\n      set,\n      get,\n      remove: function (name, attributes) {\n        set(\n          name,\n          '',\n          assign({}, attributes, {\n            expires: -1\n          })\n        );\n      },\n      withAttributes: function (attributes) {\n        return init(this.converter, assign({}, this.attributes, attributes))\n      },\n      withConverter: function (converter) {\n        return init(assign({}, this.converter, converter), this.attributes)\n      }\n    },\n    {\n      attributes: { value: Object.freeze(defaultAttributes) },\n      converter: { value: Object.freeze(converter) }\n    }\n  )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n\nexport { api as default };\n","import Cookies from \"js-cookie\";\n\nexport const markPromptMessageCompleted = (\n  userId: string,\n  promptId: string,\n  expiresAt: Date,\n) => {\n  Cookies.set(`reflag-prompt-${userId}`, promptId, {\n    expires: expiresAt,\n    sameSite: \"strict\",\n    secure: true,\n  });\n};\n\nexport const checkPromptMessageCompleted = (\n  userId: string,\n  promptId: string,\n) => {\n  const id =\n    Cookies.get(`reflag-prompt-${userId}`) ||\n    Cookies.get(`bucket-prompt-${userId}`); // Legacy cookie name\n  return id === promptId;\n};\n\nexport const rememberAuthToken = (\n  userId: string,\n  channel: string,\n  token: string,\n  expiresAt: Date,\n) => {\n  Cookies.set(`reflag-token-${userId}`, JSON.stringify({ channel, token }), {\n    expires: expiresAt,\n    sameSite: \"strict\",\n    secure: true,\n  });\n};\n\nexport const getAuthToken = (userId: string) => {\n  const val = Cookies.get(`reflag-token-${userId}`);\n  if (!val) {\n    return undefined;\n  }\n\n  try {\n    const { channel, token } = JSON.parse(val) as {\n      channel: string;\n      token: string;\n    };\n    if (!channel?.length || !token?.length) {\n      return undefined;\n    }\n    return {\n      channel,\n      token,\n    };\n  } catch {\n    return undefined;\n  }\n};\n\nexport const forgetAuthToken = (userId: string) => {\n  Cookies.remove(`reflag-token-${userId}`);\n};\n","import { FeedbackPrompt } from \"./feedback\";\nimport {\n  checkPromptMessageCompleted,\n  markPromptMessageCompleted,\n} from \"./promptStorage\";\n\nexport const parsePromptMessage = (\n  message: any,\n): FeedbackPrompt | undefined => {\n  if (\n    typeof message?.question !== \"string\" ||\n    !message.question.length ||\n    typeof message.showAfter !== \"number\" ||\n    typeof message.showBefore !== \"number\" ||\n    typeof message.promptId !== \"string\" ||\n    !message.promptId.length ||\n    typeof message.featureId !== \"string\" ||\n    !message.featureId.length\n  ) {\n    return undefined;\n  } else {\n    return {\n      question: message.question,\n      showAfter: new Date(message.showAfter),\n      showBefore: new Date(message.showBefore),\n      promptId: message.promptId,\n      featureId: message.featureId,\n    };\n  }\n};\n\nexport type FeedbackPromptCompletionHandler = () => void;\nexport type FeedbackPromptDisplayHandler = (\n  userId: string,\n  prompt: FeedbackPrompt,\n  completionHandler: FeedbackPromptCompletionHandler,\n) => void;\n\nexport const processPromptMessage = (\n  userId: string,\n  prompt: FeedbackPrompt,\n  displayHandler: FeedbackPromptDisplayHandler,\n) => {\n  const now = new Date();\n\n  const completionHandler = () => {\n    markPromptMessageCompleted(userId, prompt.promptId, prompt.showBefore);\n  };\n\n  if (checkPromptMessageCompleted(userId, prompt.promptId)) {\n    return false;\n  } else if (now > prompt.showBefore) {\n    return false;\n  } else if (now < prompt.showAfter) {\n    setTimeout(() => {\n      displayHandler(userId, prompt, completionHandler);\n    }, prompt.showAfter.getTime() - now.getTime());\n\n    return true;\n  } else {\n    displayHandler(userId, prompt, completionHandler);\n    return true;\n  }\n};\n","var n,l,u,t,i,o,r,f,e,c,s,a,h={},p=[],v=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function w(n){var l=n.parentNode;l&&l.removeChild(n)}function _(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return g(l,f,i,o,null)}function g(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function m(){return{current:null}}function k(n){return n.children}function b(n,l){this.props=n,this.context=l}function x(n,l){if(null==l)return n.__?x(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?x(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!P.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(P)}function P(){var n,u,t,o,r,e,c,s;for(i.sort(f);n=i.shift();)n.__d&&(u=i.length,o=void 0,e=(r=(t=n).__v).__e,c=[],s=[],t.__P&&((o=d({},r)).__v=r.__v+1,l.vnode&&l.vnode(o),O(t.__P,o,r,t.__n,t.__P.namespaceURI,32&r.__u?[e]:null,c,null==e?x(r):e,!!(32&r.__u),s),o.__v=r.__v,o.__.__k[o.__i]=o,j(c,o,s),o.__e!=e&&C(o)),i.length>u&&i.sort(f));P.__r=0}function S(n,l,u,t,i,o,r,f,e,c,s){var a,v,y,d,w,_=t&&t.__k||p,g=l.length;for(u.__d=e,$(u,l,_),e=u.__d,a=0;a<g;a++)null!=(y=u.__k[a])&&\"boolean\"!=typeof y&&\"function\"!=typeof y&&(v=-1===y.__i?h:_[y.__i]||h,y.__i=a,O(n,y,v,i,o,r,f,e,c,s),d=y.__e,y.ref&&v.ref!=y.ref&&(v.ref&&N(v.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),65536&y.__u||v.__k===y.__k?(e&&\"string\"==typeof y.type&&!n.contains(e)&&(e=x(v)),e=I(y,e,n)):\"function\"==typeof y.type&&void 0!==y.__d?e=y.__d:d&&(e=d.nextSibling),y.__d=void 0,y.__u&=-196609);u.__d=e,u.__e=w}function $(n,l,u){var t,i,o,r,f,e=l.length,c=u.length,s=c,a=0;for(n.__k=[],t=0;t<e;t++)r=t+a,null!=(i=n.__k[t]=null==(i=l[t])||\"boolean\"==typeof i||\"function\"==typeof i?null:\"string\"==typeof i||\"number\"==typeof i||\"bigint\"==typeof i||i.constructor==String?g(null,i,null,null,null):y(i)?g(k,{children:i},null,null,null):void 0===i.constructor&&i.__b>0?g(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=L(i,u,r,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,\"function\"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f==r-1?a=f-r:f==r+1?a++:f>r?s>e-r?a+=f-r:a--:f<r&&a++,f!==t+a&&(i.__u|=65536))):(o=u[r])&&null==o.key&&o.__e&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=x(o)),V(o,o,!1),u[r]=null,s--);if(s)for(t=0;t<c;t++)null!=(o=u[t])&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=x(o)),V(o,o))}function I(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=I(t[i],l,u));return l}n.__e!=l&&(u.insertBefore(n.__e,l||null),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8===l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(y(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i=n.key,o=n.type,r=u-1,f=u+1,e=l[u];if(null===e||e&&i==e.key&&o===e.type&&0==(131072&e.__u))return u;if(t>(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f<l.length;){if(r>=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f<l.length){if((e=l[f])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return f;f++}}return-1}function T(n,l,u){\"-\"===l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||v.test(l)?u:u+\"px\"}function A(n,l,u,t,i){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||T(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/(PointerCapture)$|Capture$/i,\"$1\")),l=l.toLowerCase()in n||\"onFocusOut\"===l||\"onFocusIn\"===l?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=e,n.addEventListener(l,o?s:c,o)):n.removeEventListener(l,o?s:c,o);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!==l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=e++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,o,r,f,e,c,s){var a,h,p,v,w,_,g,m,x,C,M,P,$,I,H,L,T=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[e=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof T)try{if(m=u.props,x=\"prototype\"in T&&T.prototype.render,C=(a=T.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?g=(h=u.__c=t.__c).__=h.__E:(x?u.__c=h=new T(m,M):(u.__c=h=new b(m,M),h.constructor=T,h.render=q),C&&C.sub(h),h.props=m,h.state||(h.state={}),h.context=M,h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),x&&null==h.__s&&(h.__s=h.state),x&&null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=d({},h.__s)),d(h.__s,T.getDerivedStateFromProps(m,h.__s))),v=h.props,w=h.state,h.__v=u,p)x&&null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),x&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(x&&null==T.getDerivedStateFromProps&&m!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(m,M),!h.__e&&(null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(m,h.__s,M)||u.__v===t.__v)){for(u.__v!==t.__v&&(h.props=m,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u)}),P=0;P<h._sb.length;P++)h.__h.push(h._sb[P]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(m,h.__s,M),x&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,w,_)})}if(h.context=M,h.props=m,h.__P=n,h.__e=!1,$=l.__r,I=0,x){for(h.state=h.__s,h.__d=!1,$&&$(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,$&&$(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++I<25);h.state=h.__s,null!=h.getChildContext&&(i=d(d({},i),h.getChildContext())),x&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,w)),S(n,y(L=null!=a&&a.type===k&&null==a.key?a.props.children:a)?L:[L],u,t,i,o,r,f,e,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&f.push(h),g&&(h.__E=h.__=null)}catch(n){u.__v=null,c||null!=r?(u.__e=e,u.__u|=c?160:32,r[r.indexOf(e)]=null):(u.__e=t.__e,u.__k=t.__k),l.__e(n,u,t)}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=z(t.__e,u,t,i,o,r,f,c,s);(a=l.diffed)&&a(u)}function j(n,u,t){u.__d=void 0;for(var i=0;i<t.length;i++)N(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function z(l,u,t,i,o,r,f,e,c){var s,a,p,v,d,_,g,m=t.props,k=u.props,b=u.type;if(\"svg\"===b?o=\"http://www.w3.org/2000/svg\":\"math\"===b?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=r)for(s=0;s<r.length;s++)if((d=r[s])&&\"setAttribute\"in d==!!b&&(b?d.localName===b:3===d.nodeType)){l=d,r[s]=null;break}if(null==l){if(null===b)return document.createTextNode(k);l=document.createElementNS(o,b,k.is&&k),r=null,e=!1}if(null===b)m===k||e&&l.data===k||(l.data=k);else{if(r=r&&n.call(l.childNodes),m=t.props||h,!e&&null!=r)for(m={},s=0;s<l.attributes.length;s++)m[(d=l.attributes[s]).name]=d.value;for(s in m)if(d=m[s],\"children\"==s);else if(\"dangerouslySetInnerHTML\"==s)p=d;else if(\"key\"!==s&&!(s in k)){if(\"value\"==s&&\"defaultValue\"in k||\"checked\"==s&&\"defaultChecked\"in k)continue;A(l,s,null,d,o)}for(s in k)d=k[s],\"children\"==s?v=d:\"dangerouslySetInnerHTML\"==s?a=d:\"value\"==s?_=d:\"checked\"==s?g=d:\"key\"===s||e&&\"function\"!=typeof d||m[s]===d||A(l,s,d,m[s],o);if(a)e||p&&(a.__html===p.__html||a.__html===l.innerHTML)||(l.innerHTML=a.__html),u.__k=[];else if(p&&(l.innerHTML=\"\"),S(l,y(v)?v:[v],u,t,i,\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":o,r,f,r?r[0]:t.__k&&x(t,0),e,c),null!=r)for(s=r.length;s--;)null!=r[s]&&w(r[s]);e||(s=\"value\",void 0!==_&&(_!==l[s]||\"progress\"===b&&!_||\"option\"===b&&_!==m[s])&&A(l,s,_,m[s],o),s=\"checked\",void 0!==g&&g!==l[s]&&A(l,s,g,m[s],o))}return l}function N(n,u,t){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,t)}}function V(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||N(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&V(i[o],u,t||\"function\"!=typeof n.type);t||null==n.__e||w(n.__e),n.__c=n.__=n.__e=n.__d=void 0}function q(n,l,u){return this.constructor(n,u)}function B(u,t,i){var o,r,f,e;l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],e=[],O(t,u=(!o&&i||t).__k=_(k,null,[u]),r||h,h,t.namespaceURI,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,f,!o&&i?i:r?r.__e:t.firstChild,o,e),j(f,u,e)}function D(n,l){B(n,l,D)}function E(l,u,t){var i,o,r,f,e=d({},l.props);for(r in l.type&&l.type.defaultProps&&(f=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=void 0===u[r]&&void 0!==f?f[r]:u[r];return arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),g(l.type,e,i||l.key,o||l.ref,null)}function G(n,l){var u={__c:l=\"__cC\"+a++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=p.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=d({},this.state),\"function\"==typeof n&&(n=n(d({},u),this.props)),n&&d(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},b.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},P.__r=0,e=0,c=F(!1),s=F(!0),a=0;export{b as Component,k as Fragment,E as cloneElement,G as createContext,_ as createElement,m as createRef,_ as h,D as hydrate,t as isValidElement,l as options,B as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","/**\n * ID of HTML DIV element which contains the feedback dialog\n */\nexport const feedbackContainerId = \"reflag-feedback-dialog-container\";\nexport const toolbarContainerId = \"reflag-toolbar-dialog-container\";\n\n/**\n * These events will be propagated to the feedback dialog\n *\n * @see [https://developer.mozilla.org/en-US/docs/Web/API/Element#events](https://developer.mozilla.org/en-US/docs/Web/API/Element#events)\n */\nexport const propagatedEvents = [\n  \"animationcancel\",\n  \"animationend\",\n  \"animationiteration\",\n  \"animationstart\",\n  \"afterscriptexecute\",\n  \"auxclick\",\n  \"beforescriptexecute\",\n  \"blur\",\n  \"click\",\n  \"compositionend\",\n  \"compositionstart\",\n  \"compositionupdate\",\n  \"contextmenu\",\n  \"copy\",\n  \"cut\",\n  \"dblclick\",\n  \"DOMActivate\",\n  \"DOMMouseScroll\",\n  \"error\",\n  \"focusin\",\n  \"focusout\",\n  \"focus\",\n  \"fullscreenchange\",\n  \"fullscreenerror\",\n  \"gesturechange\",\n  \"gestureend\",\n  \"gesturestart\",\n  \"gotpointercapture\",\n  \"keydown\",\n  \"keypress\",\n  \"keyup\",\n  \"lostpointercapture\",\n  \"mousedown\",\n  \"mouseenter\",\n  \"mouseleave\",\n  \"mousemove\",\n  \"mouseout\",\n  \"mouseover\",\n  \"mouseup\",\n  \"mousewheel\",\n  \"paste\",\n  \"pointercancel\",\n  \"pointerdown\",\n  \"pointerenter\",\n  \"pointerleave\",\n  \"pointermove\",\n  \"pointerout\",\n  \"pointerover\",\n  \"pointerup\",\n  \"scroll\",\n  \"select\",\n  \"touchcancel\",\n  \"touchend\",\n  \"touchmove\",\n  \"touchstart\",\n  \"transitioncancel\",\n  \"transitionend\",\n  \"transitionrun\",\n  \"transitionstart\",\n  \"wheel\",\n];\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n  return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n  const lr = ['left', 'right'];\n  const rl = ['right', 'left'];\n  const tb = ['top', 'bottom'];\n  const bt = ['bottom', 'top'];\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rl : lr;\n      return isStart ? lr : rl;\n    case 'left':\n    case 'right':\n      return isStart ? tb : bt;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          // Try next placement and re-run the lifecycle.\n          return {\n            data: {\n              index: nextIndex,\n              overflows: overflowsData\n            },\n            reset: {\n              placement: nextPlacement\n            }\n          };\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: 0,\n    crossAxis: 0,\n    alignmentAxis: null,\n    ...rawValue\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = ['top', 'left'].includes(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if (isYAxis) {\n        availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth;\n      } else {\n        availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  // Browsers without `ShadowRoot` support.\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n  return [':popover-open', ':modal'].some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (e) {\n      return false;\n    }\n  });\n}\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n  return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = currentWin.frameElement;\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = currentWin.frameElement;\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\nfunction getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      ...clippingAncestor,\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n  const x = rect.left + scroll.scrollLeft - offsets.x;\n  const y = rect.top + scroll.scrollTop - offsets.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  return element.offsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = element.getBoundingClientRect();\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import type { Middleware, Padding } from \"@floating-ui/core\";\nimport { arrow as arrowCore, MiddlewareState } from \"@floating-ui/dom\";\nimport { RefObject } from \"preact\";\n\nexport interface Options {\n  /**\n   * The arrow element to be positioned.\n   * @default undefined\n   */\n  element: RefObject<Element | null> | Element | null;\n  /**\n   * The padding between the arrow element and the floating element edges.\n   * Useful when the floating element has rounded corners.\n   * @default 0\n   */\n  padding?: Padding;\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nexport const arrow = (\n  options: Options | ((state: MiddlewareState) => Options),\n): Middleware => {\n  function isRef(value: unknown): value is RefObject<unknown> {\n    return {}.hasOwnProperty.call(value, \"current\");\n  }\n\n  return {\n    name: \"arrow\",\n    options,\n    fn(state) {\n      const { element, padding } =\n        typeof options === \"function\" ? options(state) : options;\n\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrowCore({ element: element.current, padding }).fn(state);\n        }\n\n        return {};\n      } else if (element) {\n        return arrowCore({ element, padding }).fn(state);\n      }\n\n      return {};\n    },\n  };\n};\n","// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nexport function deepEqual(a: any, b: any) {\n  if (a === b) {\n    return true;\n  }\n\n  if (typeof a !== typeof b) {\n    return false;\n  }\n\n  if (typeof a === \"function\" && a.toString() === b.toString()) {\n    return true;\n  }\n\n  let length, i, keys;\n\n  if (a && b && typeof a == \"object\") {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0; ) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n\n    for (i = length; i-- !== 0; ) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n\n    for (i = length; i-- !== 0; ) {\n      const key = keys[i];\n      if (key === \"_owner\" && a.$$typeof) {\n        continue;\n      }\n\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return a !== a && b !== b;\n}\n","export function getDPR(element: Element): number {\n  if (typeof window === \"undefined\") {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n","import { getDPR } from \"./getDPR\";\n\nexport function roundByDPR(element: Element, value: number) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n","import { useLayoutEffect, useRef } from \"preact/hooks\";\n\nexport function useLatestRef<T>(value: T) {\n  const ref = useRef(value);\n  useLayoutEffect(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n","import { computePosition } from \"@floating-ui/dom\";\nimport {\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"preact/hooks\";\n\nimport type {\n  ComputePositionConfig,\n  ReferenceType,\n  UseFloatingData,\n  UseFloatingOptions,\n  UseFloatingReturn,\n} from \"./types\";\nimport { deepEqual } from \"./utils/deepEqual\";\nimport { getDPR } from \"./utils/getDPR\";\nimport { roundByDPR } from \"./utils/roundByDPR\";\nimport { useLatestRef } from \"./utils/useLatestRef\";\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/react\n */\nexport function useFloating<RT extends ReferenceType = ReferenceType>(\n  options: UseFloatingOptions = {},\n): UseFloatingReturn<RT> {\n  const {\n    placement = \"bottom\",\n    strategy = \"absolute\",\n    middleware = [],\n    platform,\n    elements: { reference: externalReference, floating: externalFloating } = {},\n    transform = true,\n    whileElementsMounted,\n    open,\n  } = options;\n\n  const [data, setData] = useState<UseFloatingData>({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false,\n  });\n\n  const [latestMiddleware, setLatestMiddleware] = useState(middleware);\n\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n\n  const [_reference, _setReference] = useState<RT | null>(null);\n  const [_floating, _setFloating] = useState<HTMLElement | null>(null);\n\n  const setReference = useCallback(\n    (node: RT | null) => {\n      if (node != referenceRef.current) {\n        referenceRef.current = node;\n        _setReference(node);\n      }\n    },\n    [_setReference],\n  );\n\n  const setFloating = useCallback(\n    (node: HTMLElement | null) => {\n      if (node !== floatingRef.current) {\n        floatingRef.current = node;\n        _setFloating(node);\n      }\n    },\n    [_setFloating],\n  );\n\n  const referenceEl = (externalReference || _reference) as RT | null;\n  const floatingEl = externalFloating || _floating;\n\n  const referenceRef = useRef<RT | null>(null);\n  const floatingRef = useRef<HTMLElement | null>(null);\n  const dataRef = useRef(data);\n\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n\n  const update = useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n\n    const config: ComputePositionConfig = {\n      placement,\n      strategy,\n      middleware: latestMiddleware,\n    };\n\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n\n    /*eslint-disable-next-line @typescript-eslint/no-floating-promises*/\n    computePosition(referenceRef.current, floatingRef.current, config).then(\n      (positionData) => {\n        const fullData = { ...positionData, isPositioned: true };\n        if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n          dataRef.current = fullData;\n          setData(fullData);\n        }\n      },\n    );\n  }, [latestMiddleware, placement, strategy, platformRef]);\n\n  useLayoutEffect(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData((positionData) => ({ ...positionData, isPositioned: false }));\n    }\n  }, [open]);\n\n  const isMountedRef = useRef(false);\n  useLayoutEffect(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n\n  useLayoutEffect(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      } else {\n        return update();\n      }\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef]);\n\n  const refs = useMemo(\n    () => ({\n      reference: referenceRef,\n      floating: floatingRef,\n      setReference,\n      setFloating,\n    }),\n    [setReference, setFloating],\n  );\n\n  const elements = useMemo(\n    () => ({ reference: referenceEl, floating: floatingEl }),\n    [referenceEl, floatingEl],\n  );\n\n  const floatingStyles = useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0,\n    };\n\n    if (!elements.floating) {\n      return initialStyles;\n    }\n\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: `translate(${x}px, ${y}px)`,\n        ...(getDPR(elements.floating) >= 1.5 && { willChange: \"transform\" }),\n      };\n    }\n\n    return {\n      position: strategy,\n      left: x,\n      top: y,\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n\n  return useMemo(\n    () => ({\n      ...data,\n      update,\n      refs,\n      elements,\n      floatingStyles,\n    }),\n    [data, update, refs, elements, floatingStyles],\n  );\n}\n","import { propagatedEvents } from \"./constants\";\nimport { Offset } from \"./types\";\n\nfunction stopPropagation(e: Event) {\n  e.stopPropagation();\n}\n\nexport function attachContainer(containerId: string) {\n  let container = document.querySelector(`#${containerId}`);\n\n  if (!container) {\n    container = document.createElement(\"div\");\n    container.attachShadow({ mode: \"open\" });\n    (container as HTMLElement).style.all = \"initial\";\n    container.id = containerId;\n    document.body.appendChild(container);\n\n    for (const event of propagatedEvents) {\n      container.addEventListener(event, stopPropagation, { passive: true });\n    }\n  }\n\n  return container.shadowRoot!;\n}\n\nfunction parseOffset(offsetInput?: Offset[\"x\"] | Offset[\"y\"]) {\n  if (offsetInput === undefined) return \"1rem\";\n  if (typeof offsetInput === \"number\") return offsetInput + \"px\";\n\n  return offsetInput;\n}\n\nexport function parseUnanchoredPosition(position: {\n  offset?: Offset;\n  placement: string;\n}) {\n  const offsetY = parseOffset(position.offset?.y);\n  const offsetX = parseOffset(position.offset?.x);\n\n  switch (position.placement) {\n    case \"top-left\":\n      return {\n        top: offsetY,\n        left: offsetX,\n      };\n    case \"top-right\":\n      return {\n        top: offsetY,\n        right: offsetX,\n      };\n    case \"bottom-left\":\n      return {\n        bottom: offsetY,\n        left: offsetX,\n      };\n    case \"bottom-right\":\n      return {\n        bottom: offsetY,\n        right: offsetX,\n      };\n    default:\n      console.error(\"[Reflag]\", \"Invalid placement\", position.placement);\n      return parseUnanchoredPosition({ placement: \"bottom-right\" });\n  }\n}\n","import { MiddlewareData, Placement } from \"@floating-ui/dom\";\nimport { Fragment, FunctionComponent, h, Ref } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport styles from \"./Dialog.css?inline\";\nimport {\n  arrow,\n  autoUpdate,\n  flip,\n  offset,\n  shift,\n  useFloating,\n} from \"./packages/floating-ui-preact-dom\";\nimport { Position } from \"./types\";\nimport { parseUnanchoredPosition } from \"./utils\";\n\ntype CssPosition = Partial<\n  Record<\"top\" | \"left\" | \"right\" | \"bottom\", number | string>\n>;\n\nexport interface OpenDialogOptions {\n  /**\n   * Control the placement and behavior of the dialog.\n   */\n  position: Position;\n\n  strategy?: \"fixed\" | \"absolute\";\n\n  isOpen: boolean;\n  close: () => void;\n  onDismiss?: () => void;\n\n  containerId: string;\n\n  showArrow?: boolean;\n\n  children?: preact.ComponentChildren;\n}\n\nexport function useDialog({\n  onClose,\n  onOpen,\n  initialValue = false,\n}: {\n  onClose?: () => void;\n  onOpen?: () => void;\n  initialValue?: boolean;\n} = {}) {\n  const [isOpen, setIsOpen] = useState<boolean>(initialValue);\n\n  const open = useCallback(() => {\n    setIsOpen(true);\n    onOpen?.();\n  }, [onOpen]);\n  const close = useCallback(() => {\n    setIsOpen(false);\n    onClose?.();\n  }, [onClose]);\n  const toggle = useCallback(() => {\n    if (isOpen) onClose?.();\n    else onOpen?.();\n    setIsOpen((prev) => !prev);\n  }, [isOpen, onClose, onOpen]);\n\n  return {\n    isOpen,\n    open,\n    close,\n    toggle,\n  };\n}\n\nexport const Dialog: FunctionComponent<OpenDialogOptions> = ({\n  position,\n  isOpen,\n  close,\n  onDismiss,\n  containerId,\n  strategy,\n  children,\n  showArrow = true,\n}) => {\n  const arrowRef = useRef<HTMLDivElement>(null);\n  const dialogRef = useRef<HTMLElement>(null);\n\n  const anchor = position.type === \"POPOVER\" ? position.anchor : null;\n  const placement =\n    position.type === \"POPOVER\" ? position.placement : undefined;\n\n  const {\n    refs,\n    floatingStyles,\n    middlewareData,\n    placement: actualPlacement,\n  } = useFloating({\n    elements: {\n      reference: anchor,\n    },\n    strategy,\n    transform: false,\n    placement,\n    whileElementsMounted: autoUpdate,\n    middleware: [\n      flip({\n        padding: 10,\n        mainAxis: true,\n        crossAxis: true,\n      }),\n      shift(),\n      offset(8),\n      arrow({\n        element: arrowRef,\n      }),\n    ],\n  });\n\n  let unanchoredPosition: CssPosition = {};\n  if (position.type === \"DIALOG\") {\n    unanchoredPosition = parseUnanchoredPosition(position);\n  }\n\n  const dismiss = useCallback(() => {\n    close();\n    onDismiss?.();\n  }, [close, onDismiss]);\n\n  useEffect(() => {\n    // Only enable 'quick dismiss' for popovers\n    if (position.type === \"MODAL\" || position.type === \"DIALOG\") return;\n\n    const escapeHandler = (e: KeyboardEvent) => {\n      if (e.key == \"Escape\") {\n        dismiss();\n      }\n    };\n\n    const clickOutsideHandler = (e: MouseEvent) => {\n      if (\n        !(e.target instanceof Element) ||\n        !e.target.closest(`#${containerId}`)\n      ) {\n        dismiss();\n      }\n    };\n\n    const observer = new MutationObserver((mutations) => {\n      if (position.anchor === null) return;\n\n      mutations.forEach((mutation) => {\n        const removedNodes = Array.from(mutation.removedNodes);\n        const hasBeenRemoved = removedNodes.some((node) => {\n          return node === position.anchor || node.contains(position.anchor);\n        });\n\n        if (hasBeenRemoved) {\n          close();\n        }\n      });\n    });\n\n    window.addEventListener(\"mousedown\", clickOutsideHandler);\n    window.addEventListener(\"keydown\", escapeHandler);\n    observer.observe(document.body, {\n      subtree: true,\n      childList: true,\n    });\n\n    return () => {\n      window.removeEventListener(\"mousedown\", clickOutsideHandler);\n      window.removeEventListener(\"keydown\", escapeHandler);\n      observer.disconnect();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- anchor only exists in popover\n  }, [position.type, close, (position as any).anchor, dismiss, containerId]);\n\n  function setDiagRef(node: HTMLElement | null) {\n    refs.setFloating(node);\n    dialogRef.current = node;\n  }\n\n  useEffect(() => {\n    if (!dialogRef.current) return;\n\n    const isPopoverOpen = () => {\n      try {\n        return dialogRef.current?.matches(\":popover-open\") ?? false;\n      } catch {\n        return false;\n      }\n    };\n\n    const isModalOpen =\n      dialogRef.current instanceof HTMLDialogElement &&\n      dialogRef.current.hasAttribute(\"open\");\n\n    if (\n      isOpen &&\n      ((position.type === \"MODAL\" && !isModalOpen) ||\n        (position.type !== \"MODAL\" && !isPopoverOpen()))\n    ) {\n      if (\n        position.type === \"MODAL\" &&\n        dialogRef.current instanceof HTMLDialogElement\n      ) {\n        dialogRef.current.showModal();\n      } else {\n        dialogRef.current.showPopover();\n      }\n    }\n    if (!isOpen) {\n      if (\n        position.type === \"MODAL\" &&\n        dialogRef.current instanceof HTMLDialogElement &&\n        dialogRef.current.hasAttribute(\"open\")\n      ) {\n        dialogRef.current.close();\n      } else if (position.type !== \"MODAL\" && isPopoverOpen()) {\n        dialogRef.current.hidePopover();\n      }\n    }\n  }, [dialogRef, isOpen, position.type]);\n\n  const classes = [\n    \"dialog\",\n    isOpen ? \"open\" : \"\",\n    position.type === \"MODAL\"\n      ? \"modal\"\n      : position.type === \"POPOVER\"\n        ? \"anchored\"\n        : `unanchored unanchored-${position.placement}`,\n    actualPlacement,\n  ].join(\" \");\n\n  return (\n    <>\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      {position.type === \"MODAL\" ? (\n        <dialog\n          ref={setDiagRef}\n          class={classes}\n          style={anchor ? floatingStyles : unanchoredPosition}\n        >\n          {children && <Fragment>{children}</Fragment>}\n\n          {anchor && showArrow && (\n            <DialogArrow\n              arrowData={middlewareData?.arrow}\n              arrowRef={arrowRef}\n              placement={actualPlacement}\n            />\n          )}\n        </dialog>\n      ) : (\n        <div\n          ref={setDiagRef}\n          class={classes}\n          style={anchor ? floatingStyles : unanchoredPosition}\n          popover=\"manual\"\n        >\n          {children && <Fragment>{children}</Fragment>}\n\n          {anchor && showArrow && (\n            <DialogArrow\n              arrowData={middlewareData?.arrow}\n              arrowRef={arrowRef}\n              placement={actualPlacement}\n            />\n          )}\n        </div>\n      )}\n    </>\n  );\n};\n\nfunction DialogArrow({\n  arrowData,\n  arrowRef,\n  placement,\n}: {\n  arrowData: MiddlewareData[\"arrow\"];\n  arrowRef: Ref<HTMLDivElement>;\n  placement: Placement;\n}) {\n  const { x: arrowX, y: arrowY } = arrowData ?? {};\n\n  const staticSide =\n    {\n      top: \"bottom\",\n      right: \"left\",\n      bottom: \"top\",\n      left: \"right\",\n    }[placement.split(\"-\")[0]] || \"bottom\";\n\n  const arrowStyles = {\n    left: arrowX != null ? `${arrowX}px` : \"\",\n    top: arrowY != null ? `${arrowY}px` : \"\",\n    right: \"\",\n    bottom: \"\",\n    [staticSide]: \"-4px\",\n  };\n  return (\n    <div\n      ref={arrowRef}\n      class={[\"arrow\", placement].join(\" \")}\n      style={arrowStyles}\n    />\n  );\n}\n\nexport function DialogHeader({\n  children,\n  innerRef,\n}: {\n  children: preact.ComponentChildren;\n  innerRef?: Ref<HTMLElement>;\n}) {\n  return (\n    <header ref={innerRef} class=\"dialog-header\">\n      {children}\n    </header>\n  );\n}\n\nexport function DialogContent({\n  children,\n  innerRef,\n}: {\n  children: preact.ComponentChildren;\n  innerRef?: Ref<HTMLDivElement>;\n}) {\n  return (\n    <div ref={innerRef} class=\"dialog-content\">\n      {children}\n    </div>\n  );\n}\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Close: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12.0007 10.5865L16.9504 5.63672L18.3646 7.05093L13.4149 12.0007L18.3646 16.9504L16.9504 18.3646L12.0007 13.4149L7.05093 18.3646L5.63672 16.9504L10.5865 12.0007L5.63672 7.05093L7.05093 5.63672L12.0007 10.5865Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FeedbackTranslations } from \"../types\";\n/**\n * {@includeCode ./defaultTranslations.tsx}\n */\nexport const DEFAULT_TRANSLATIONS: FeedbackTranslations = {\n  DefaultQuestionLabel: \"How satisfied are you with this feature?\",\n  QuestionPlaceholder: \"Write a comment\",\n  ScoreStatusDescription: \"Pick a score and leave a comment\",\n  ScoreStatusLoading: \"Saving score, please wait...\",\n  ScoreStatusReceived: \"Score has been received!\",\n  ScoreVeryDissatisfiedLabel: \"Very dissatisfied (1/5)\",\n  ScoreDissatisfiedLabel: \"Dissatisfied (2/5)\",\n  ScoreNeutralLabel: \"Neutral (3/5)\",\n  ScoreSatisfiedLabel: \"Satisfied (4/5)\",\n  ScoreVerySatisfiedLabel: \"Very satisfied (5/5)\",\n  SuccessMessage: \"Feedback received, thank you!\",\n  SendButton: \"Send feedback\",\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Check: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"m10 15.17l9.193-9.191l1.414 1.414l-10.606 10.606l-6.364-6.364l1.414-1.414l4.95 4.95Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const CheckCircle: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 24C5.3724 24 0 18.6276 0 12C0 5.3724 5.3724 0 12 0C18.6276 0 24 5.3724 24 12C24 18.6276 18.6276 24 12 24ZM10.8036 16.8L19.2876 8.3148L17.5908 6.618L10.8036 13.4064L7.4088 10.0116L5.712 11.7084L10.8036 16.8Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport type ButtonProps = h.JSX.HTMLAttributes<HTMLButtonElement> & {\n  variant?: \"primary\" | \"secondary\";\n};\n\nexport const Button: FunctionComponent<ButtonProps> = ({\n  variant = \"primary\",\n  children,\n  ...rest\n}) => {\n  const classes = [\"button\", variant].join(\" \");\n\n  return (\n    <button class={classes} {...rest}>\n      {children}\n    </button>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Logo: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props = { height: \"10px\", width: \"10px\" },\n) => (\n  <svg\n    width=\"128\"\n    height=\"128\"\n    viewBox=\"0 0 128 128\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M117.333 0C123.224 0 128 4.77563 128 10.6667V117.333C128 123.224 123.224 128 117.333 128H10.6667C4.77563 128 1.71804e-07 123.224 0 117.333V10.6667C0 4.77563 4.77563 1.71801e-07 10.6667 0H117.333ZM10.6667 10.6667V117.333L117.333 10.6667H10.6667Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nimport { Logo } from \"../../ui/icons/Logo\";\n\nexport const Plug: FunctionComponent = () => {\n  return (\n    <footer class=\"plug\">\n      <a href=\"https://reflag.com\" rel=\"noreferrer\" target=\"_blank\">\n        Powered by <Logo height=\"10px\" width=\"10px\" /> Reflag\n      </a>\n    </footer>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Dissatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M12 15C13.1835 15 14.2712 15.4113 15.1279 16.0991C15.4665 16.3709 15.4398 16.8738 15.1187 17.166C14.8962 17.3685 14.5788 17.4225 14.2915 17.3332C13.605 17.1198 12.8259 17 12 17C11.1741 17 10.3949 17.1205 9.70841 17.3331C9.42116 17.422 9.104 17.3677 8.88161 17.1653C8.56025 16.8728 8.53318 16.3695 8.87206 16.0976C9.2087 15.8274 9.57986 15.6014 9.97666 15.426C10.6139 15.1442 11.3032 14.9991 12 15ZM8.5 10C8.89783 10 9.27936 10.158 9.56066 10.4393C9.84197 10.7206 10 11.1022 10 11.5C10 11.8978 9.84197 12.2794 9.56066 12.5607C9.27936 12.842 8.89783 13 8.5 13C8.10218 13 7.72065 12.842 7.43934 12.5607C7.15804 12.2794 7 11.8978 7 11.5C7 11.1022 7.15804 10.7206 7.43934 10.4393C7.72065 10.158 8.10218 10 8.5 10ZM15.5 10C15.8978 10 16.2794 10.158 16.5607 10.4393C16.842 10.7206 17 11.1022 17 11.5C17 11.8978 16.842 12.2794 16.5607 12.5607C16.2794 12.842 15.8978 13 15.5 13C15.1022 13 14.7206 12.842 14.4393 12.5607C14.158 12.2794 14 11.8978 14 11.5C14 11.1022 14.158 10.7206 14.4393 10.4393C14.7206 10.158 15.1022 10 15.5 10Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Neutral: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 15C8 14.4477 8.44771 14 9 14H15C15.5523 14 16 14.4477 16 15V15C16 15.5523 15.5523 16 15 16H9C8.44771 16 8 15.5523 8 15V15ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Satisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M7.79862 15.4322C8.85269 16.5065 10.4964 17.4971 11.9993 17.4971C13.5011 17.4971 15.1701 16.5079 16.2097 15.4351C16.5083 15.1269 16.4581 14.6416 16.1408 14.3528C15.9042 14.1375 15.5656 14.0777 15.2972 14.2517C14.5161 14.7578 13.4271 15.7002 11.9993 15.7002C10.5688 15.7002 9.47831 14.7549 8.69694 14.2486C8.43116 14.0764 8.09564 14.1353 7.86141 14.3485C7.5435 14.6378 7.49757 15.1254 7.79862 15.4322Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const VeryDissatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 17C7.44771 17 6.98992 16.5479 7.09965 16.0066C7.29346 15.0506 7.76447 14.1645 8.46447 13.4645C9.40215 12.5268 10.6739 12 12 12C13.3261 12 14.5979 12.5268 15.5355 13.4645C16.2355 14.1645 16.7065 15.0506 16.9003 16.0066C17.0101 16.5479 16.5523 17 16 17V17C15.4477 17 15.0156 16.5403 14.8349 16.0184C14.6877 15.5934 14.4454 15.2028 14.1213 14.8787C13.5587 14.3161 12.7956 14 12 14C11.2043 14 10.4413 14.3161 9.87868 14.8787C9.55459 15.2028 9.31232 15.5934 9.16513 16.0184C8.98442 16.5403 8.55228 17 8 17V17ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const VerySatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2ZM12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4ZM12 12C14 12 15.667 12.333 17 13C17 14.3261 16.4732 15.5979 15.5355 16.5355C14.5979 17.4732 13.3261 18 12 18C10.6739 18 9.40215 17.4732 8.46447 16.5355C7.52678 15.5979 7 14.3261 7 13C8.333 12.333 10 12 12 12ZM8.5 7C9.07633 6.99988 9.63499 7.19889 10.0815 7.56335C10.5279 7.9278 10.8347 8.43532 10.95 9H6.05C6.16526 8.43532 6.47209 7.9278 6.91855 7.56335C7.36501 7.19889 7.92367 6.99988 8.5 7ZM15.5 7C16.0763 6.99988 16.635 7.19889 17.0814 7.56335C17.5279 7.9278 17.8347 8.43532 17.95 9H13.05C13.1653 8.43532 13.4721 7.9278 13.9185 7.56335C14.365 7.19889 14.9237 6.99988 15.5 7Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { Fragment, FunctionComponent, h } from \"preact\";\nimport { useRef } from \"preact/hooks\";\n\nimport { Dissatisfied } from \"../../ui/icons/Dissatisfied\";\nimport { Neutral } from \"../../ui/icons/Neutral\";\nimport { Satisfied } from \"../../ui/icons/Satisfied\";\nimport { VeryDissatisfied } from \"../../ui/icons/VeryDissatisfied\";\nimport { VerySatisfied } from \"../../ui/icons/VerySatisfied\";\nimport {\n  arrow,\n  offset,\n  useFloating,\n} from \"../../ui/packages/floating-ui-preact-dom\";\nimport { FeedbackTranslations } from \"./types\";\n\nconst scores = [\n  {\n    color: \"var(--reflag-feedback-dialog-rating-1-color, #dd6b20)\",\n    bg: \"var(--reflag-feedback-dialog-rating-1-background-color, #fbd38d)\",\n    icon: <VeryDissatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreVeryDissatisfiedLabel,\n    value: 1,\n  },\n  {\n    color: \"var(--reflag-feedback-dialog-rating-2-color, #ed8936)\",\n    bg: \"var(--reflag-feedback-dialog-rating-2-background-color, #feebc8)\",\n    icon: <Dissatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreDissatisfiedLabel,\n    value: 2,\n  },\n  {\n    color: \"var(--reflag-feedback-dialog-rating-3-color, #787c91)\",\n    bg: \"var(--reflag-feedback-dialog-rating-3-background-color, #e9e9ed)\",\n    icon: <Neutral />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreNeutralLabel,\n    value: 3,\n  },\n  {\n    color: \"var(--reflag-feedback-dialog-rating-4-color, #48bb78)\",\n    bg: \"var(--reflag-feedback-dialog-rating-4-background-color, #c6f6d5)\",\n    icon: <Satisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreSatisfiedLabel,\n    value: 4,\n  },\n  {\n    color: \"var(--reflag-feedback-dialog-rating-5-color, #38a169)\",\n    bg: \"var(--reflag-feedback-dialog-rating-5-background-color, #9ae6b4)\",\n    icon: <VerySatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreVerySatisfiedLabel,\n    value: 5,\n  },\n] as const;\n\ntype ScoreNumber = (typeof scores)[number];\n\nexport type StarRatingProps = {\n  name: string;\n  selectedValue?: number;\n  onChange?: h.JSX.GenericEventHandler<HTMLInputElement>;\n  t: FeedbackTranslations;\n};\n\nexport const StarRating: FunctionComponent<StarRatingProps> = ({\n  t,\n  name,\n  selectedValue,\n  onChange,\n}) => {\n  return (\n    <div class=\"star-rating\">\n      <style>\n        {scores.map(\n          ({ bg, color }, index) => `\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked + .button {\n              border-color: ${color};\n            }\n\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked + .button > div {\n              background-color: ${bg};\n            }\n\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked ~ input:nth-of-type(${index + 2}) + .button {\n              border-left-color: ${color};\n            }\n          `,\n        )}\n      </style>\n      <div class=\"star-rating-icons\">\n        {scores.map((score) => (\n          <Score\n            key={score.value}\n            isSelected={score.value === selectedValue}\n            name={name}\n            score={score}\n            t={t}\n            onChange={onChange}\n          />\n        ))}\n      </div>\n    </div>\n  );\n};\n\nconst Score = ({\n  isSelected,\n  name,\n  onChange,\n  score,\n  t,\n}: {\n  isSelected: boolean;\n  name: string;\n  onChange?: h.JSX.GenericEventHandler<HTMLInputElement>;\n  score: ScoreNumber;\n  t: FeedbackTranslations;\n}) => {\n  const arrowRef = useRef<HTMLDivElement>(null);\n  const { refs, floatingStyles, middlewareData } = useFloating({\n    placement: \"top\",\n    middleware: [\n      offset(4),\n      arrow({\n        element: arrowRef,\n      }),\n    ],\n  });\n\n  return (\n    <Fragment>\n      <input\n        defaultChecked={isSelected}\n        id={`reflag-feedback-score-${score.value}`}\n        name={name}\n        type=\"radio\"\n        value={score.value}\n        onChange={onChange}\n      />\n      <label\n        ref={refs.setReference}\n        aria-label={score.getLabel(t)}\n        class=\"button\"\n        for={`reflag-feedback-score-${score.value}`}\n        style={{ color: score.color }}\n      >\n        <div\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            width: \"100%\",\n            height: \"100%\",\n            opacity: 0.2, // TODO: fix overflow\n            zIndex: 1,\n          }}\n        />\n        <span style={{ zIndex: 2, display: \"flex\", alignItems: \"center\" }}>\n          {score.icon}\n        </span>\n      </label>\n      <div ref={refs.setFloating} class=\"button-tooltip\" style={floatingStyles}>\n        {score.getLabel(t)}\n        <div\n          ref={arrowRef}\n          class=\"button-tooltip-arrow\"\n          style={{\n            left:\n              middlewareData.arrow?.x != null\n                ? `${middlewareData.arrow.x}px`\n                : \"\",\n            top:\n              middlewareData.arrow?.y != null\n                ? `${middlewareData.arrow.y}px`\n                : \"\",\n          }}\n        />\n      </div>\n    </Fragment>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { Check } from \"../../ui/icons/Check\";\nimport { CheckCircle } from \"../../ui/icons/CheckCircle\";\nimport { Button } from \"./Button\";\nimport { Plug } from \"./Plug\";\nimport { StarRating } from \"./StarRating\";\nimport {\n  FeedbackScoreSubmission,\n  FeedbackSubmission,\n  FeedbackTranslations,\n} from \"./types\";\n\nconst ANIMATION_SPEED = 400;\n\nfunction getFeedbackDataFromForm(el: HTMLFormElement) {\n  const formData = new FormData(el);\n  return {\n    score: Number(formData.get(\"score\")?.toString()),\n    comment: (formData.get(\"comment\")?.toString() || \"\").trim(),\n  };\n}\n\ntype FeedbackFormProps = {\n  t: FeedbackTranslations;\n  question: string;\n  scoreState: \"idle\" | \"submitting\" | \"submitted\";\n  openWithCommentVisible: boolean;\n  onInteraction: () => void;\n  onSubmit: (\n    data: Omit<FeedbackSubmission, \"feebackId\">,\n  ) => Promise<void> | void;\n  onScoreSubmit: (\n    score: Omit<FeedbackScoreSubmission, \"feebackId\">,\n  ) => Promise<void> | void;\n};\n\nexport const FeedbackForm: FunctionComponent<FeedbackFormProps> = ({\n  question,\n  scoreState,\n  openWithCommentVisible,\n  onInteraction,\n  onSubmit,\n  onScoreSubmit,\n  t,\n}) => {\n  const [hasRating, setHasRating] = useState(false);\n  const [status, setStatus] = useState<\"idle\" | \"submitting\" | \"submitted\">(\n    \"idle\",\n  );\n  const [error, setError] = useState<string>();\n  const [showForm, setShowForm] = useState(true);\n\n  const handleSubmit: h.JSX.GenericEventHandler<HTMLFormElement> = async (\n    e,\n  ) => {\n    e.preventDefault();\n    const data: FeedbackSubmission = {\n      ...getFeedbackDataFromForm(e.target as HTMLFormElement),\n      question,\n    };\n    if (!data.score) return;\n    setError(\"\");\n    try {\n      setStatus(\"submitting\");\n      await onSubmit(data);\n      setStatus(\"submitted\");\n    } catch (err) {\n      setStatus(\"idle\");\n      if (err instanceof Error) {\n        setError(err.message);\n      } else if (typeof err === \"string\") {\n        setError(err);\n      } else {\n        setError(\"Couldn't submit feedback. Please try again.\");\n      }\n    }\n  };\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const formRef = useRef<HTMLFormElement>(null);\n  const headerRef = useRef<HTMLDivElement>(null);\n  const expandedContentRef = useRef<HTMLDivElement>(null);\n  const submittedRef = useRef<HTMLDivElement>(null);\n\n  const transitionToDefault = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (headerRef.current === null) return;\n    if (expandedContentRef.current === null) return;\n\n    containerRef.current.style.maxHeight = `${headerRef.current.clientHeight}px`;\n\n    expandedContentRef.current.style.position = \"absolute\";\n    expandedContentRef.current.style.opacity = \"0\";\n    expandedContentRef.current.style.pointerEvents = \"none\";\n  }, [containerRef, headerRef, expandedContentRef]);\n\n  const transitionToExpanded = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (headerRef.current === null) return;\n    if (expandedContentRef.current === null) return;\n\n    containerRef.current.style.maxHeight = `${\n      headerRef.current.clientHeight + // Header height\n      expandedContentRef.current.clientHeight + // Comment + Button Height\n      10 // Gap height\n    }px`;\n\n    expandedContentRef.current.style.position = \"relative\";\n    expandedContentRef.current.style.opacity = \"1\";\n    expandedContentRef.current.style.pointerEvents = \"all\";\n  }, [containerRef, headerRef, expandedContentRef]);\n\n  const transitionToSuccess = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (formRef.current === null) return;\n    if (submittedRef.current === null) return;\n\n    formRef.current.style.opacity = \"0\";\n    formRef.current.style.pointerEvents = \"none\";\n    containerRef.current.style.maxHeight = `${submittedRef.current.clientHeight}px`;\n\n    // Fade in \"submitted\" step once container has resized\n    setTimeout(() => {\n      submittedRef.current!.style.position = \"relative\";\n      submittedRef.current!.style.opacity = \"1\";\n      submittedRef.current!.style.pointerEvents = \"all\";\n      setShowForm(false);\n    }, ANIMATION_SPEED + 10);\n  }, [formRef, containerRef, submittedRef]);\n\n  useEffect(() => {\n    if (status === \"submitted\") {\n      transitionToSuccess();\n    } else if (openWithCommentVisible || hasRating) {\n      transitionToExpanded();\n    } else {\n      transitionToDefault();\n    }\n  }, [\n    transitionToDefault,\n    transitionToExpanded,\n    transitionToSuccess,\n    openWithCommentVisible,\n    hasRating,\n    status,\n  ]);\n\n  return (\n    <div ref={containerRef} class=\"container\">\n      <div ref={submittedRef} class=\"submitted\">\n        <div class=\"submitted-check\">\n          <CheckCircle height={24} width={24} />\n        </div>\n        <p class=\"text\">{t.SuccessMessage}</p>\n        <Plug />\n      </div>\n      {showForm && (\n        <form\n          ref={formRef}\n          class=\"form\"\n          method=\"dialog\"\n          style={{ opacity: 1 }}\n          onClick={onInteraction}\n          onFocus={onInteraction}\n          onFocusCapture={onInteraction}\n          onSubmit={handleSubmit}\n        >\n          <div\n            ref={headerRef}\n            aria-labelledby=\"reflag-feedback-score-label\"\n            class=\"form-control\"\n            role=\"group\"\n          >\n            <div class=\"title\" id=\"reflag-feedback-score-label\">\n              {question}\n            </div>\n            <StarRating\n              name=\"score\"\n              t={t}\n              onChange={async (e) => {\n                setHasRating(true);\n                await onScoreSubmit({\n                  question,\n                  score: Number(e.currentTarget.value),\n                });\n              }}\n            />\n\n            <ScoreStatus scoreState={scoreState} t={t} />\n          </div>\n\n          <div ref={expandedContentRef} class=\"form-expanded-content\">\n            <div class=\"form-control\">\n              <textarea\n                class=\"textarea\"\n                id=\"reflag-feedback-comment-label\"\n                name=\"comment\"\n                placeholder={t.QuestionPlaceholder}\n                rows={4}\n              />\n            </div>\n\n            {error && <p class=\"error\">{error}</p>}\n\n            <Button\n              disabled={\n                !hasRating ||\n                status === \"submitting\" ||\n                scoreState === \"submitting\"\n              }\n              type=\"submit\"\n            >\n              {t.SendButton}\n            </Button>\n\n            <Plug />\n          </div>\n        </form>\n      )}\n    </div>\n  );\n};\n\nconst ScoreStatus: FunctionComponent<{\n  t: FeedbackTranslations;\n  scoreState: \"idle\" | \"submitting\" | \"submitted\";\n}> = ({ t, scoreState }) => {\n  // Keep track of whether we can show a loading indication - only if 400ms have\n  // elapsed without the score request finishing.\n  const [loadingTimeElapsed, setLoadingTimeElapsed] = useState(false);\n\n  // Keep track of whether we can fall back to the idle/loading states - once\n  // it's been submit once it won't, to prevent flashing.\n  const [hasBeenSubmitted, setHasBeenSubmitted] = useState(false);\n\n  useEffect(() => {\n    if (scoreState === \"idle\") {\n      setLoadingTimeElapsed(false);\n      return;\n    }\n\n    if (scoreState === \"submitted\") {\n      setLoadingTimeElapsed(false);\n      setHasBeenSubmitted(true);\n      return;\n    }\n\n    const timer = setTimeout(() => {\n      setLoadingTimeElapsed(true);\n    }, 400);\n\n    return () => clearTimeout(timer);\n  }, [scoreState]);\n\n  const showIdle =\n    scoreState === \"idle\" ||\n    (scoreState === \"submitting\" && !hasBeenSubmitted && !loadingTimeElapsed);\n  const showLoading =\n    scoreState !== \"submitted\" && !hasBeenSubmitted && loadingTimeElapsed;\n  const showSubmitted = scoreState === \"submitted\" || hasBeenSubmitted;\n\n  return (\n    <div class=\"score-status-container\">\n      <span class=\"score-status\" style={{ opacity: showIdle ? 1 : 0 }}>\n        {t.ScoreStatusDescription}\n      </span>\n\n      <div class=\"score-status\" style={{ opacity: showLoading ? 1 : 0 }}>\n        {t.ScoreStatusLoading}\n      </div>\n\n      <span class=\"score-status\" style={{ opacity: showSubmitted ? 1 : 0 }}>\n        <Check height={14} style={{ marginRight: 3 }} width={14} />{\" \"}\n        {t.ScoreStatusReceived}\n      </span>\n    </div>\n  );\n};\n","import { useCallback, useEffect, useState } from \"preact/hooks\";\n\nexport const useTimer = ({\n  initialDuration,\n  enabled,\n  onEnd,\n}: {\n  initialDuration: number;\n  enabled: boolean;\n  onEnd: () => void;\n}): {\n  duration: number;\n  elapsedFraction: number;\n  startTime: number;\n  endTime: number;\n  stopped: boolean;\n  startWithDuration: (duration: number) => void;\n  stop: () => void;\n} => {\n  const [stopped, setStopped] = useState(!enabled);\n  const [duration, setDuration] = useState(initialDuration);\n  const [startTime, setStartTime] = useState(Date.now());\n  const [currentTime, setCurrentTime] = useState(Date.now());\n\n  useEffect(() => {\n    if (stopped) return;\n\n    const t = setInterval(() => {\n      setCurrentTime(Date.now());\n\n      if (Date.now() >= startTime + duration) {\n        clearTimeout(t);\n        setStopped(true);\n        onEnd();\n      }\n    }, 25);\n\n    return () => {\n      clearTimeout(t);\n    };\n  }, [duration, onEnd, startTime, stopped]);\n\n  const stop = useCallback(() => {\n    setStopped(true);\n  }, []);\n\n  const startWithDuration = useCallback((nextDuration: number) => {\n    setStartTime(Date.now());\n    setDuration(nextDuration);\n    setStopped(false);\n  }, []);\n\n  const endTime = startTime + duration;\n  const elapsedMs = stopped ? 0 : currentTime - startTime;\n  const elapsedFraction = elapsedMs / duration;\n\n  return {\n    duration,\n    elapsedFraction,\n    startTime,\n    endTime,\n    stopped,\n    startWithDuration,\n    stop,\n  };\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const RadialProgress: FunctionComponent<{\n  diameter: number;\n  progress: number;\n}> = ({ diameter, progress }) => {\n  const stroke = 2;\n  const radius = diameter / 2 - stroke;\n  const circumference = 2 * Math.PI * radius;\n  const filled = circumference * progress;\n\n  return (\n    <svg class=\"radial-progress\" height={diameter} width={diameter}>\n      <circle\n        cx={radius + stroke}\n        cy={radius + stroke}\n        fill=\"transparent\"\n        r={radius}\n        stroke-dasharray={circumference}\n        stroke-dashoffset={filled}\n        stroke-width={stroke}\n        transform={`rotate(-90) translate(-${radius * 2 + stroke * 2} 0)`}\n      />\n    </svg>\n  );\n};\n","import { Fragment, FunctionComponent, h } from \"preact\";\nimport { useCallback, useState } from \"preact/hooks\";\n\nimport { feedbackContainerId } from \"../../ui/constants\";\nimport { Dialog, useDialog } from \"../../ui/Dialog\";\nimport { Close } from \"../../ui/icons/Close\";\nimport { DEFAULT_TRANSLATIONS } from \"./config/defaultTranslations\";\nimport { FeedbackForm } from \"./FeedbackForm\";\nimport { useTimer } from \"./hooks/useTimer\";\nimport styles from \"./index.css?inline\";\nimport { RadialProgress } from \"./RadialProgress\";\nimport {\n  FeedbackScoreSubmission,\n  FeedbackSubmission,\n  OpenFeedbackFormOptions,\n  WithRequired,\n} from \"./types\";\n\nexport type FeedbackDialogProps = WithRequired<\n  OpenFeedbackFormOptions,\n  \"onSubmit\" | \"position\"\n>;\n\nconst INACTIVE_DURATION_MS = 20 * 1000;\nconst SUCCESS_DURATION_MS = 3 * 1000;\n\nexport const FeedbackDialog: FunctionComponent<FeedbackDialogProps> = ({\n  key,\n  title = DEFAULT_TRANSLATIONS.DefaultQuestionLabel,\n  position,\n  translations = DEFAULT_TRANSLATIONS,\n  openWithCommentVisible = false,\n  onClose,\n  onDismiss,\n  onSubmit,\n  onScoreSubmit,\n}) => {\n  const [feedbackId, setFeedbackId] = useState<string | undefined>(undefined);\n  const [scoreState, setScoreState] = useState<\n    \"idle\" | \"submitting\" | \"submitted\"\n  >(\"idle\");\n\n  const { isOpen, close } = useDialog({ onClose, initialValue: true });\n\n  const autoClose = useTimer({\n    enabled: position.type === \"DIALOG\",\n    initialDuration: INACTIVE_DURATION_MS,\n    onEnd: close,\n  });\n\n  const submit = useCallback(\n    async (data: Omit<FeedbackSubmission, \"feedbackId\">) => {\n      await onSubmit({ ...data, feedbackId });\n      autoClose.startWithDuration(SUCCESS_DURATION_MS);\n    },\n    [autoClose, feedbackId, onSubmit],\n  );\n\n  const submitScore = useCallback(\n    async (data: Omit<FeedbackScoreSubmission, \"feedbackId\">) => {\n      if (onScoreSubmit !== undefined) {\n        setScoreState(\"submitting\");\n\n        const res = await onScoreSubmit({ ...data, feedbackId });\n        setFeedbackId(res.feedbackId);\n        setScoreState(\"submitted\");\n      }\n    },\n    [feedbackId, onScoreSubmit],\n  );\n  const dismiss = useCallback(() => {\n    autoClose.stop();\n    close();\n    onDismiss?.();\n  }, [autoClose, close, onDismiss]);\n\n  return (\n    <Fragment>\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      <Dialog\n        key={key}\n        close={close}\n        containerId={feedbackContainerId}\n        isOpen={isOpen}\n        position={position}\n        onDismiss={onDismiss}\n      >\n        <Fragment>\n          <FeedbackForm\n            key={key}\n            openWithCommentVisible={openWithCommentVisible}\n            question={title}\n            scoreState={scoreState}\n            t={{ ...DEFAULT_TRANSLATIONS, ...translations }}\n            onInteraction={autoClose.stop}\n            onScoreSubmit={submitScore}\n            onSubmit={submit}\n          />\n\n          <button class=\"close\" onClick={dismiss}>\n            {!autoClose.stopped && autoClose.elapsedFraction > 0 && (\n              <RadialProgress\n                diameter={28}\n                progress={1.0 - autoClose.elapsedFraction}\n              />\n            )}\n            <Close />\n          </button>\n        </Fragment>\n      </Dialog>\n    </Fragment>\n  );\n};\n","import { h, render } from \"preact\";\n\nimport { feedbackContainerId, propagatedEvents } from \"../../ui/constants\";\nimport { Position } from \"../../ui/types\";\nimport { FeedbackDialog } from \"./FeedbackDialog\";\nimport { OpenFeedbackFormOptions } from \"./types\";\n\nexport const DEFAULT_POSITION: Position = {\n  type: \"DIALOG\",\n  placement: \"bottom-right\",\n};\n\nfunction supportsPopoverApi() {\n  return (\n    typeof HTMLElement !== \"undefined\" &&\n    \"showPopover\" in HTMLElement.prototype &&\n    \"hidePopover\" in HTMLElement.prototype\n  );\n}\n\nfunction stopPropagation(e: Event) {\n  e.stopPropagation();\n}\n\nfunction attachDialogContainer() {\n  let container = document.querySelector(`#${feedbackContainerId}`);\n\n  if (!container) {\n    container = document.createElement(\"div\");\n    container.attachShadow({ mode: \"open\" });\n    (container as HTMLElement).style.all = \"initial\";\n    container.id = feedbackContainerId;\n    document.body.appendChild(container);\n\n    for (const event of propagatedEvents) {\n      container.addEventListener(event, stopPropagation, { passive: true });\n    }\n  }\n\n  return container.shadowRoot!;\n}\n\n// this is a counter that increases every time the feedback form is opened\n// and since it's passed as a key to the FeedbackDialog component,\n// it forces a re-render on every form open\nlet openInstances = 0;\n\nexport function openFeedbackForm(options: OpenFeedbackFormOptions): void {\n  const position = options.position || DEFAULT_POSITION;\n\n  if (position.type !== \"MODAL\" && !supportsPopoverApi()) {\n    console.warn(\n      \"[Reflag]\",\n      \"Unable to open feedback popup. Popover API is not supported in this browser\",\n    );\n    return;\n  }\n\n  const shadowRoot = attachDialogContainer();\n\n  if (position.type === \"POPOVER\") {\n    if (!position.anchor) {\n      console.warn(\n        \"[Reflag]\",\n        \"Unable to open popover. Anchor must be a defined DOM-element\",\n      );\n      return;\n    }\n\n    if (!document.body.contains(position.anchor)) {\n      console.warn(\n        \"[Reflag]\",\n        \"Unable to open popover. Anchor must be an attached DOM-element\",\n      );\n      return;\n    }\n  }\n\n  openInstances++;\n\n  render(\n    h(FeedbackDialog, { ...options, position, key: openInstances.toString() }),\n    shadowRoot,\n  );\n}\n","import type { BulkEvent } from \"../bulkQueue\";\nimport { HttpClient } from \"../httpClient\";\nimport { Logger } from \"../logger\";\nimport { AblySSEChannel, openAblySSEChannel } from \"../sse\";\nimport { Position } from \"../ui/types\";\nimport { logResponseError } from \"../utils/responseError\";\nimport { retryOnThrow } from \"../utils/retry\";\nimport {\n  FeedbackPromptCompletionHandler,\n  parsePromptMessage,\n  processPromptMessage,\n} from \"./prompts\";\nimport * as feedbackLib from \"./ui\";\nimport { DEFAULT_POSITION } from \"./ui\";\nimport {\n  FeedbackSubmission,\n  FeedbackTranslations,\n  OpenFeedbackFormOptions,\n} from \"./ui/types\";\n\nconst INITIAL_FETCH_RETRY_DELAYS_MS = [0, 5000];\n\nexport type Key = string;\n\nexport type FeedbackOptions = {\n  /**\n   * Enables automatic feedback prompting if it's set up in Reflag\n   */\n  enableAutoFeedback?: boolean;\n\n  /**\n   *\n   */\n  autoFeedbackHandler?: FeedbackPromptHandler;\n\n  /**\n   * With these options you can override the look of the feedback prompt\n   */\n  ui?: {\n    /**\n     * Control the placement and behavior of the feedback form.\n     */\n    position?: Position;\n\n    /**\n     * Add your own custom translations for the feedback form.\n     * Undefined translation keys fall back to english defaults.\n     */\n    translations?: Partial<FeedbackTranslations>;\n  };\n};\n\nexport type RequestFeedbackData = Omit<\n  OpenFeedbackFormOptions,\n  \"key\" | \"onSubmit\"\n> & {\n  /**\n   * Company ID from your own application.\n   */\n  companyId?: string;\n\n  /**\n   * Allows you to handle a copy of the already submitted\n   * feedback.\n   *\n   * This can be used for side effects, such as storing a\n   * copy of the feedback in your own application or CRM.\n   *\n   * @param {Object} data\n   */\n  onAfterSubmit?: (data: FeedbackSubmission) => void;\n\n  /**\n   * Flag key.\n   */\n  flagKey: string;\n};\n\nexport type RequestFeedbackOptions = RequestFeedbackData & {\n  /**\n   * User ID from your own application.\n   */\n  userId: string;\n};\n\nexport type UnassignedFeedback = {\n  /**\n   * Flag key.\n   */\n  flagKey: string;\n\n  /**\n   * Reflag feedback ID\n   */\n  feedbackId?: string;\n\n  /**\n   * The question that was presented to the user.\n   */\n  question?: string;\n\n  /**\n   * The original question.\n   * This only needs to be populated if the feedback was submitted through the automated feedback surveys channel.\n   */\n  promptedQuestion?: string;\n\n  /**\n   * Customer satisfaction score.\n   */\n  score?: number;\n\n  /**\n   * User supplied comment about your flag.\n   */\n  comment?: string;\n\n  /**\n   * Reflag feedback prompt ID.\n   *\n   * This only exists if the feedback was submitted\n   * as part of an automated prompt from Reflag.\n   *\n   * Used for internal state management of automated\n   * feedback.\n   */\n  promptId?: string;\n\n  /**\n   * Source of the feedback, depending on how the user was asked\n   * - `prompt` - Feedback submitted by way of an automated feedback survey (prompted)\n   * - `widget` - Feedback submitted via `requestFeedback`\n   * - `sdk` - Feedback submitted via `feedback`\n   */\n  source?: \"prompt\" | \"sdk\" | \"widget\";\n};\n\nexport type Feedback = UnassignedFeedback & {\n  /**\n   * User ID from your own application.\n   */\n  userId?: string;\n\n  /**\n   * Company ID from your own application.\n   */\n  companyId?: string;\n};\n\nexport type FeedbackPrompt = {\n  /**\n   * Specific question user was asked\n   */\n  question: string;\n\n  /**\n   * Feedback prompt should appear only after this time\n   */\n  showAfter: Date;\n\n  /**\n   * Feedback prompt will not be shown after this time\n   */\n  showBefore: Date;\n\n  /**\n   * Id of the prompt\n   */\n  promptId: string;\n\n  /**\n   * Feature ID from Reflag\n   */\n  featureId: string;\n};\n\nexport type FeedbackPromptReply = {\n  question: string;\n  companyId?: string;\n  score?: number;\n  comment?: string;\n};\n\nexport type FeedbackPromptReplyHandler = <T extends FeedbackPromptReply | null>(\n  reply: T,\n) => T extends null ? Promise<void> : Promise<{ feedbackId: string }>;\n\nexport type FeedbackPromptHandlerOpenFeedbackFormOptions = Omit<\n  RequestFeedbackOptions,\n  \"featureId\" | \"flagKey\" | \"userId\" | \"companyId\" | \"onClose\" | \"onDismiss\"\n>;\n\nexport type FeedbackPromptHandlerCallbacks = {\n  reply: FeedbackPromptReplyHandler;\n  openFeedbackForm: (\n    options: FeedbackPromptHandlerOpenFeedbackFormOptions,\n  ) => void;\n};\n\nexport type FeedbackPromptHandler = (\n  prompt: FeedbackPrompt,\n  handlers: FeedbackPromptHandlerCallbacks,\n) => void;\n\nexport const createDefaultFeedbackPromptHandler = (\n  options: FeedbackPromptHandlerOpenFeedbackFormOptions = {},\n): FeedbackPromptHandler => {\n  return (_prompt: FeedbackPrompt, handlers) => {\n    handlers.openFeedbackForm(options);\n  };\n};\nexport const DEFAULT_FEEDBACK_CONFIG = {\n  promptHandler: createDefaultFeedbackPromptHandler(),\n  feedbackPosition: DEFAULT_POSITION,\n  translations: {},\n  autoFeedbackEnabled: true,\n};\n\n// Payload can include featureId or flagKey, but the public API only exposes flagKey\n// We use featureId internally because prompting is based on featureId\ntype FeedbackPayload = Omit<Feedback, \"flagKey\"> & {\n  featureId?: string;\n  flagKey?: string;\n};\n\nexport async function feedback(\n  httpClient: HttpClient,\n  logger: Logger,\n  payload: FeedbackPayload,\n) {\n  if (!payload.score && !payload.comment) {\n    logger.error(\n      \"`feedback` call ignored, either `score` or `comment` must be provided\",\n    );\n    return;\n  }\n\n  if (!payload.userId) {\n    logger.error(\"`feedback` call ignored, no `userId` provided\");\n    return;\n  }\n\n  const featureId = \"featureId\" in payload ? payload.featureId : undefined;\n  const flagKey = \"flagKey\" in payload ? payload.flagKey : undefined;\n\n  if (!featureId && !flagKey) {\n    logger.error(\n      \"`feedback` call ignored. Neither `featureId` nor `flagKey` have been provided\",\n    );\n    return;\n  }\n\n  // set default source to sdk\n  const feedbackPayload = {\n    ...payload,\n    flagKey: undefined,\n    source: payload.source ?? \"sdk\",\n    featureId,\n    key: flagKey,\n  };\n\n  const res = await httpClient.post({\n    path: `/feedback`,\n    body: feedbackPayload,\n  });\n\n  if (!res.ok) {\n    await logResponseError({\n      logger,\n      res,\n      message: \"feedback request failed\",\n    });\n  }\n\n  logger.debug(`sent feedback`, res);\n  return res;\n}\n\nexport class AutoFeedback {\n  private initialized = false;\n  private sseChannel: AblySSEChannel | null = null;\n\n  constructor(\n    private sseBaseUrl: string,\n    private logger: Logger,\n    private httpClient: HttpClient,\n    private feedbackPromptHandler: FeedbackPromptHandler = createDefaultFeedbackPromptHandler(),\n    private userId: string,\n    private position: Position = DEFAULT_POSITION,\n    private feedbackTranslations: Partial<FeedbackTranslations> = {},\n    private enqueueBulkEvent?: (event: BulkEvent) => Promise<void>,\n    private credentials?: RequestCredentials,\n  ) {}\n\n  /**\n   * Start receiving automated feedback surveys.\n   */\n  async initialize() {\n    if (this.initialized) {\n      this.logger.warn(\"automatic feedback client already initialized\");\n      return;\n    }\n    this.initialized = true;\n\n    const channel = await this.getChannel();\n    if (!channel) return;\n\n    try {\n      this.logger.debug(`automatic feedback enabled`, channel);\n      this.sseChannel = openAblySSEChannel({\n        channel,\n        callback: (message) =>\n          this.handleFeedbackPromptRequest(\n            this.userId,\n            message.data ?? message,\n          ),\n        logger: this.logger,\n        sseBaseUrl: this.sseBaseUrl,\n        credentials: this.credentials,\n      });\n      this.logger.debug(`automatic feedback connection established`);\n    } catch (e) {\n      this.logger.error(`error initializing automatic feedback client`, e);\n    }\n  }\n\n  stop() {\n    if (this.sseChannel) {\n      this.sseChannel.close();\n      this.sseChannel = null;\n    }\n  }\n\n  async setUser(userId: string) {\n    this.stop();\n    this.initialized = false;\n    this.userId = userId;\n    await this.initialize();\n  }\n\n  setUserId(userId: string) {\n    this.userId = userId;\n  }\n\n  handleFeedbackPromptRequest(userId: string, message: any) {\n    const parsed = parsePromptMessage(message);\n    if (!parsed) {\n      this.logger.error(`invalid feedback prompt message received`, message);\n    } else {\n      if (\n        !processPromptMessage(userId, parsed, async (u, m, cb) => {\n          await this.feedbackPromptEvent({\n            promptId: parsed.promptId,\n            featureId: parsed.featureId,\n            promptedQuestion: parsed.question,\n            event: \"received\",\n            userId,\n          });\n          await this.triggerFeedbackPrompt(u, m, cb);\n        })\n      ) {\n        this.logger.info(\n          `feedback prompt not shown, it was either expired or already processed`,\n          message,\n        );\n      }\n    }\n  }\n\n  async triggerFeedbackPrompt(\n    userId: string,\n    message: FeedbackPrompt,\n    completionHandler: FeedbackPromptCompletionHandler,\n  ) {\n    let feedbackId: string | undefined = undefined;\n\n    await this.feedbackPromptEvent({\n      promptId: message.promptId,\n      featureId: message.featureId,\n      promptedQuestion: message.question,\n      event: \"shown\",\n      userId,\n    });\n\n    const replyCallback: FeedbackPromptReplyHandler = async (reply) => {\n      if (!reply) {\n        await this.feedbackPromptEvent({\n          promptId: message.promptId,\n          featureId: message.featureId,\n          event: \"dismissed\",\n          userId,\n          promptedQuestion: message.question,\n        });\n\n        completionHandler();\n        return;\n      }\n\n      const feedbackPayload = {\n        feedbackId: feedbackId,\n        featureId: message.featureId,\n        userId,\n        companyId: reply.companyId,\n        score: reply.score,\n        comment: reply.comment,\n        promptId: message.promptId,\n        question: reply.question,\n        promptedQuestion: message.question,\n        source: \"prompt\",\n      } satisfies FeedbackPayload;\n\n      const response = await feedback(\n        this.httpClient,\n        this.logger,\n        feedbackPayload,\n      );\n\n      completionHandler();\n\n      if (response && response.ok) {\n        return await response?.json();\n      }\n      return;\n    };\n\n    const handlers: FeedbackPromptHandlerCallbacks = {\n      reply: replyCallback,\n      openFeedbackForm: (options) => {\n        feedbackLib.openFeedbackForm({\n          key: message.featureId,\n          title: message.question,\n          onScoreSubmit: async (data) => {\n            const res = await replyCallback(data);\n            feedbackId = res.feedbackId;\n            return { feedbackId: res.feedbackId };\n          },\n          onSubmit: async (data) => {\n            await replyCallback(data);\n            options.onAfterSubmit?.(data);\n          },\n          onDismiss: () => replyCallback(null),\n          position: this.position,\n          translations: this.feedbackTranslations,\n          ...options,\n        });\n      },\n    };\n\n    this.feedbackPromptHandler(message, handlers);\n  }\n\n  async feedbackPromptEvent(args: {\n    event: \"received\" | \"shown\" | \"dismissed\";\n    featureId: string;\n    promptId: string;\n    promptedQuestion: string;\n    userId: string;\n  }) {\n    const payload = {\n      action: args.event,\n      featureId: args.featureId,\n      promptId: args.promptId,\n      userId: args.userId,\n      promptedQuestion: args.promptedQuestion,\n    };\n\n    if (this.enqueueBulkEvent) {\n      await this.enqueueBulkEvent({\n        type: \"prompt-event\",\n        ...payload,\n      });\n      this.logger.debug(`queued prompt event`, payload);\n      return;\n    }\n\n    const res = await this.httpClient.post({\n      path: `/feedback/prompt-events`,\n      body: payload,\n    });\n    if (!res.ok) {\n      await logResponseError({\n        logger: this.logger,\n        res,\n        message: \"prompt event request failed\",\n        extra: {\n          action: payload.action,\n          featureId: payload.featureId,\n          promptId: payload.promptId,\n        },\n      });\n    }\n    this.logger.debug(`sent prompt event`, res);\n    return res;\n  }\n\n  async getChannel() {\n    try {\n      return await retryOnThrow(INITIAL_FETCH_RETRY_DELAYS_MS, async () => {\n        const res = await this.httpClient.post({\n          path: `/feedback/prompting-init`,\n          body: {\n            userId: this.userId,\n          },\n        });\n\n        this.logger.debug(`automatic feedback status sent`, res);\n        if (!res.ok) {\n          try {\n            await logResponseError({\n              logger: this.logger,\n              res,\n              message: \"automatic feedback init request failed\",\n            });\n          } catch {\n            this.logger.error(\n              `error initializing automatic feedback`,\n              new Error(`unexpected response code: ${res.status}`),\n            );\n          }\n          return;\n        }\n\n        const body: { success: boolean; channel?: string } = await res.json();\n        if (body.success && body.channel) {\n          return body.channel;\n        }\n\n        return undefined;\n      });\n    } catch (e) {\n      this.logger.error(`error initializing automatic feedback`, e);\n      return;\n    }\n  }\n}\n","import { Logger } from \"./logger\";\n\nconst oneMinute = 60 * 1000;\n\nexport default class RateLimiter {\n  private eventsByKey: Record<string, number[]> = {};\n\n  constructor(\n    private eventsPerMinute: number,\n    private logger: Logger,\n  ) {}\n\n  public rateLimited<R>(key: string, func: () => R): R | undefined {\n    const now = Date.now();\n\n    if (!this.eventsByKey[key]) {\n      this.eventsByKey[key] = [];\n    }\n\n    const events = this.eventsByKey[key];\n\n    while (events.length && now - events[0] > oneMinute) {\n      events.shift();\n    }\n\n    const limitExceeded = events.length >= this.eventsPerMinute;\n    if (limitExceeded) {\n      this.logger.debug(\"Rate limit exceeded\", { key });\n      return;\n    }\n\n    events.push(now);\n    return func();\n  }\n}\n","/**\n * Test if the error is a security error returned by the browser when cookies or local storage are blocked.\n * Adapted from the Argos CI project.\n */\nexport function checkIsSecurityError(error: unknown): error is Error {\n  return (\n    error instanceof Error &&\n    // Safari\n    (error.name === \"SecurityError\" ||\n      // Firefox\n      error.name === \"NS_ERROR_FAILURE\" ||\n      error.name === \"NS_ERROR_ABORT\")\n  );\n}\n","import { IS_SERVER } from \"./config\";\nimport { checkIsSecurityError } from \"./security-error\";\n\nexport type StorageAdapter = {\n  getItem(key: string): Promise<string | null>;\n  setItem(key: string, value: string): Promise<void>;\n  removeItem?(key: string): Promise<void>;\n};\n\nexport function createNoopStorageAdapter(): StorageAdapter {\n  return {\n    getItem: async () => null,\n    setItem: async () => undefined,\n    removeItem: async () => undefined,\n  };\n}\n\n/**\n * Get an item from local storage safely.\n */\nexport function getItem(key: string): string | null {\n  try {\n    if (typeof localStorage !== \"undefined\" && localStorage) {\n      return localStorage.getItem(key);\n    }\n    return null;\n  } catch (error) {\n    if (checkIsSecurityError(error)) {\n      return null;\n    }\n    throw error;\n  }\n}\n\n/**\n * Set an item in local storage safely.\n */\nexport function setItem(key: string, value: string): boolean {\n  try {\n    if (typeof localStorage !== \"undefined\" && localStorage) {\n      localStorage.setItem(key, value);\n      return true;\n    }\n    return false;\n  } catch (error) {\n    if (checkIsSecurityError(error)) {\n      return false;\n    }\n    throw error;\n  }\n}\n\n/**\n * Remove an item from local storage safely.\n */\nexport function removeItem(key: string): void {\n  try {\n    if (typeof localStorage !== \"undefined\") {\n      localStorage.removeItem(key);\n    }\n  } catch (error) {\n    if (checkIsSecurityError(error)) {\n      return;\n    }\n    throw error;\n  }\n}\n\nexport function getLocalStorageAdapter(): StorageAdapter {\n  try {\n    if (\n      typeof localStorage === \"undefined\" ||\n      !(\"setItem\" in localStorage) ||\n      !(\"removeItem\" in localStorage)\n    ) {\n      throw new Error(\n        \"localStorage is not available. Provide a custom storage adapter.\",\n      );\n    }\n  } catch (error) {\n    if (!checkIsSecurityError(error)) {\n      throw error;\n    }\n  }\n\n  return {\n    getItem: async (key) => getItem(key),\n    setItem: async (key, value) => {\n      setItem(key, value);\n    },\n    removeItem: async (key) => {\n      removeItem(key);\n    },\n  };\n}\n\nexport function getDefaultStorageAdapter(): StorageAdapter {\n  if (IS_SERVER) return createNoopStorageAdapter();\n  return getLocalStorageAdapter();\n}\n","export type AbortControllerLike = {\n  signal: AbortSignal;\n  abort(): void;\n};\n\ntype AbortSignalListener = () => void;\n\nexport function createAbortController(): AbortControllerLike {\n  try {\n    if (\n      typeof AbortController !== \"undefined\" &&\n      typeof EventTarget !== \"undefined\"\n    ) {\n      return new AbortController();\n    }\n  } catch {\n    // fall through to shim\n  }\n\n  let aborted = false;\n  const listeners = new Set<AbortSignalListener>();\n\n  const signal = {\n    get aborted() {\n      return aborted;\n    },\n    addEventListener(_type: string, listener: AbortSignalListener) {\n      listeners.add(listener);\n    },\n    removeEventListener(_type: string, listener: AbortSignalListener) {\n      listeners.delete(listener);\n    },\n  } as AbortSignal;\n\n  return {\n    signal,\n    abort() {\n      if (aborted) return;\n      aborted = true;\n      for (const listener of listeners) {\n        listener();\n      }\n    },\n  };\n}\n","export type EventListener = () => void;\n\nexport type EventTargetLike = {\n  addEventListener(\n    type: string,\n    listener: EventListener,\n    options?: boolean | { signal?: AbortSignal | null },\n  ): void;\n  removeEventListener(type: string, listener: EventListener): void;\n  dispatchEvent(event: { type: string }): void;\n};\n\nclass SimpleEventTarget implements EventTargetLike {\n  private listeners = new Map<string, Set<EventListener>>();\n\n  addEventListener(\n    type: string,\n    listener: EventListener,\n    options?: boolean | { signal?: AbortSignal | null },\n  ) {\n    let bucket = this.listeners.get(type);\n    if (!bucket) {\n      bucket = new Set();\n      this.listeners.set(type, bucket);\n    }\n\n    bucket.add(listener);\n\n    if (options && typeof options === \"object\" && options.signal) {\n      const signal = options.signal;\n      if (signal.aborted) {\n        bucket.delete(listener);\n        return;\n      }\n\n      const onAbort = () => {\n        bucket?.delete(listener);\n        signal.removeEventListener?.(\"abort\", onAbort);\n      };\n\n      signal.addEventListener?.(\"abort\", onAbort, { once: true });\n    }\n  }\n\n  removeEventListener(type: string, listener: EventListener) {\n    this.listeners.get(type)?.delete(listener);\n  }\n\n  dispatchEvent(event: { type: string }) {\n    const bucket = this.listeners.get(event.type);\n    if (!bucket) return;\n\n    for (const listener of bucket) {\n      listener();\n    }\n  }\n}\n\nexport function createEventTarget(): EventTargetLike {\n  return new SimpleEventTarget();\n}\n","export function isValidFlagStateVersion(value: unknown): value is number {\n  return typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n}\n","import { StorageAdapter } from \"../storage\";\nimport { RawFlag, RawFlagOptIn, RawFlags } from \"./flags\";\nimport { isValidFlagStateVersion } from \"./flagStateVersion\";\n\nconst DEFAULT_STORAGE_KEY = \"__reflag_fetched_flags\";\n\nfunction parseOptIn(optIn: any): RawFlagOptIn | null | undefined {\n  if (typeof optIn === \"undefined\") return undefined;\n  if (optIn === null) return null;\n  if (!isObject(optIn)) return;\n\n  if (\n    typeof optIn.userOptedIn !== \"boolean\" ||\n    typeof optIn.companyOptedIn !== \"boolean\" ||\n    typeof optIn.isOptedIn !== \"boolean\" ||\n    typeof optIn.name !== \"string\" ||\n    !(typeof optIn.description === \"string\" || optIn.description === null)\n  ) {\n    return;\n  }\n\n  return {\n    userOptedIn: optIn.userOptedIn,\n    companyOptedIn: optIn.companyOptedIn,\n    isOptedIn: optIn.isOptedIn,\n    name: optIn.name,\n    description: optIn.description,\n  };\n}\n\nfunction isEvaluationErrorArray(\n  value: any,\n): value is NonNullable<RawFlag[\"evaluationErrors\"]> {\n  return (\n    Array.isArray(value) &&\n    value.every(\n      (error) =>\n        isObject(error) &&\n        typeof error.code === \"string\" &&\n        typeof error.field === \"string\" &&\n        typeof error.message === \"string\" &&\n        (typeof error.operator === \"undefined\" ||\n          typeof error.operator === \"string\"),\n    )\n  );\n}\n\ninterface cacheEntry {\n  expireAt: number;\n  staleAt: number;\n  flags: RawFlags;\n  flagStateVersion?: number;\n}\n\n// Parse and validate an API flags response\nexport function parseAPIFlagsResponse(flagsInput: any): RawFlags | undefined {\n  if (!isObject(flagsInput)) {\n    return;\n  }\n\n  const flags: RawFlags = {};\n  for (const key in flagsInput) {\n    const flag = flagsInput[key];\n    if (!isObject(flag)) return;\n\n    const optIn = parseOptIn(flag.optIn);\n\n    if (\n      typeof flag.isEnabled !== \"boolean\" ||\n      flag.key !== key ||\n      typeof flag.targetingVersion !== \"number\" ||\n      (flag.config && typeof flag.config !== \"object\") ||\n      (flag.missingContextFields &&\n        !Array.isArray(flag.missingContextFields)) ||\n      (flag.ruleEvaluationResults &&\n        !Array.isArray(flag.ruleEvaluationResults)) ||\n      (typeof flag.evaluationErrors !== \"undefined\" &&\n        !isEvaluationErrorArray(flag.evaluationErrors)) ||\n      (typeof flag.config?.evaluationErrors !== \"undefined\" &&\n        !isEvaluationErrorArray(flag.config.evaluationErrors)) ||\n      (typeof flag.optInEnabled !== \"undefined\" &&\n        typeof flag.optInEnabled !== \"boolean\") ||\n      (typeof flag.optIn !== \"undefined\" && typeof optIn === \"undefined\")\n    ) {\n      return;\n    }\n\n    flags[key] = {\n      isEnabled: flag.isEnabled,\n      targetingVersion: flag.targetingVersion,\n      key,\n      config: flag.config,\n      missingContextFields: flag.missingContextFields,\n      ruleEvaluationResults: flag.ruleEvaluationResults,\n      evaluationErrors: flag.evaluationErrors,\n      ...(typeof flag.optInEnabled !== \"undefined\" && {\n        optInEnabled: flag.optInEnabled,\n      }),\n      ...(typeof flag.optIn !== \"undefined\" && { optIn }),\n    };\n  }\n\n  return flags;\n}\n\nexport interface CacheResult {\n  flags: RawFlags;\n  stale: boolean;\n  flagStateVersion?: number;\n}\n\nexport class FlagCache {\n  private storage: StorageAdapter;\n  private readonly storageKey: string;\n  private readonly staleTimeMs: number;\n  private readonly expireTimeMs: number;\n\n  constructor({\n    storage,\n    staleTimeMs,\n    expireTimeMs,\n  }: {\n    storage: StorageAdapter;\n    staleTimeMs: number;\n    expireTimeMs: number;\n  }) {\n    this.storage = storage;\n    this.storageKey = DEFAULT_STORAGE_KEY;\n    this.staleTimeMs = staleTimeMs;\n    this.expireTimeMs = expireTimeMs;\n  }\n\n  async set(\n    key: string,\n    {\n      flags,\n      flagStateVersion,\n    }: {\n      flags: RawFlags;\n      flagStateVersion?: number;\n    },\n  ) {\n    let cacheData: CacheData = {};\n\n    try {\n      const cachedResponseRaw = await this.storage.getItem(this.storageKey);\n      if (cachedResponseRaw) {\n        cacheData = validateCacheData(JSON.parse(cachedResponseRaw)) ?? {};\n      }\n    } catch {\n      // ignore errors\n    }\n\n    cacheData[key] = {\n      expireAt: Date.now() + this.expireTimeMs,\n      staleAt: Date.now() + this.staleTimeMs,\n      flags,\n      flagStateVersion,\n    } satisfies cacheEntry;\n\n    cacheData = Object.fromEntries(\n      Object.entries(cacheData).filter(([_k, v]) => v.expireAt > Date.now()),\n    );\n\n    await this.storage.setItem(this.storageKey, JSON.stringify(cacheData));\n\n    return cacheData;\n  }\n\n  async get(key: string): Promise<CacheResult | undefined> {\n    try {\n      const cachedResponseRaw = await this.storage.getItem(this.storageKey);\n      if (cachedResponseRaw) {\n        const cachedResponse = validateCacheData(JSON.parse(cachedResponseRaw));\n        if (\n          cachedResponse &&\n          cachedResponse[key] &&\n          cachedResponse[key].expireAt > Date.now()\n        ) {\n          return {\n            flags: cachedResponse[key].flags,\n            stale: cachedResponse[key].staleAt < Date.now(),\n            flagStateVersion: cachedResponse[key].flagStateVersion,\n          };\n        }\n      }\n    } catch {\n      // ignore errors\n    }\n    return;\n  }\n}\n\ntype CacheData = Record<string, cacheEntry>;\nfunction validateCacheData(cacheDataInput: any) {\n  if (!isObject(cacheDataInput)) {\n    return;\n  }\n\n  const cacheData: CacheData = {};\n  for (const key in cacheDataInput) {\n    const cacheEntry = cacheDataInput[key];\n    if (!isObject(cacheEntry)) return;\n\n    if (\n      typeof cacheEntry.expireAt !== \"number\" ||\n      typeof cacheEntry.staleAt !== \"number\" ||\n      (cacheEntry.flags && !parseAPIFlagsResponse(cacheEntry.flags)) ||\n      (typeof cacheEntry.flagStateVersion !== \"undefined\" &&\n        !isValidFlagStateVersion(cacheEntry.flagStateVersion))\n    ) {\n      return;\n    }\n\n    cacheData[key] = {\n      expireAt: cacheEntry.expireAt,\n      staleAt: cacheEntry.staleAt,\n      flags: cacheEntry.flags,\n      flagStateVersion: cacheEntry.flagStateVersion,\n    };\n  }\n  return cacheData;\n}\n\n/**\n * Check if the given item is an object.\n *\n * @param item - The item to check.\n * @returns `true` if the item is an object, `false` otherwise.\n **/\nexport function isObject(item: any): item is Record<string, any> {\n  return (item && typeof item === \"object\" && !Array.isArray(item)) || false;\n}\n","import { deepEqual } from \"fast-equals\";\n\nimport type { BulkEvent } from \"../bulkQueue\";\nimport { FLAG_EVENTS_PER_MIN, FLAGS_EXPIRE_MS } from \"../config\";\nimport { canonicalContextJSONStringify, ReflagContext } from \"../context\";\nimport { HttpClient } from \"../httpClient\";\nimport { Logger, loggerWithPrefix } from \"../logger\";\nimport RateLimiter from \"../rateLimiter\";\nimport { getDefaultStorageAdapter, StorageAdapter } from \"../storage\";\nimport { createAbortController } from \"../utils/abortController\";\nimport { createEventTarget } from \"../utils/eventTarget\";\nimport { logResponseError, parseResponseError } from \"../utils/responseError\";\nimport { retryOnThrow } from \"../utils/retry\";\nimport { FlagCache, isObject, parseAPIFlagsResponse } from \"./flagCache\";\nimport { isValidFlagStateVersion } from \"./flagStateVersion\";\n\nconst INITIAL_FETCH_RETRY_DELAYS_MS = [0, 5000];\n\nexport type RawFlagOptIn = {\n  /**\n   * Whether the current user has opted into the flag.\n   */\n  userOptedIn: boolean;\n\n  /**\n   * Whether the current company has opted into the flag.\n   */\n  companyOptedIn: boolean;\n\n  /**\n   * Whether either the current user or company has opted into the flag.\n   */\n  isOptedIn: boolean;\n\n  /**\n   * Display name of the opt-in flag.\n   */\n  name: string;\n\n  /**\n   * SDK-facing opt-in description.\n   */\n  description: string | null;\n};\n\nexport type OptInFlag = RawFlagOptIn & {\n  /**\n   * Flag key.\n   */\n  key: string;\n\n  /**\n   * Result of flag evaluation.\n   */\n  isEnabled: boolean;\n};\n\n/**\n * A flag fetched from the server.\n */\nexport type RawFlag = {\n  /**\n   * Flag key.\n   */\n  key: string;\n\n  /**\n   * Result of flag evaluation.\n   * Note: does not take local overrides into account.\n   */\n  isEnabled: boolean;\n\n  /**\n   * If not null or undefined, the result is being overridden locally\n   */\n  isEnabledOverride?: boolean | null;\n\n  /**\n   * Version of targeting rules.\n   */\n  targetingVersion?: number;\n\n  /**\n   * Rule evaluation results.\n   */\n  ruleEvaluationResults?: boolean[];\n\n  /**\n   * Missing context fields.\n   * @deprecated Use `evaluationErrors` and check for `MISSING_CONTEXT_FIELD`.\n   */\n  missingContextFields?: string[];\n\n  /**\n   * Non-fatal diagnostics produced while evaluating targeting rules.\n   */\n  evaluationErrors?: Array<{\n    code: string;\n    field: string;\n    operator?: string;\n    message: string;\n  }>;\n\n  /**\n   * Whether end-user opt-in is enabled for this flag.\n   */\n  optInEnabled?: boolean;\n\n  /**\n   * Opt-in metadata for this flag and the current context.\n   */\n  optIn?: RawFlagOptIn | null;\n\n  /**\n   * Optional user-defined dynamic configuration.\n   */\n  config?: {\n    /**\n     * The key of the matched configuration value.\n     */\n    key: string;\n\n    /**\n     * The version of the matched configuration value.\n     */\n    version?: number;\n\n    /**\n     * The optional user-supplied payload data.\n     */\n    payload?: any;\n\n    /**\n     * The rule evaluation results.\n     */\n    ruleEvaluationResults?: boolean[];\n\n    /**\n     * The missing context fields.\n     * @deprecated Use `evaluationErrors` and check for `MISSING_CONTEXT_FIELD`.\n     */\n    missingContextFields?: string[];\n\n    /**\n     * Non-fatal diagnostics produced while evaluating targeting rules.\n     */\n    evaluationErrors?: RawFlag[\"evaluationErrors\"];\n  };\n};\n\nexport type RawFlags = Record<string, RawFlag>;\n\nexport type FallbackFlagOverride =\n  | {\n      key: string;\n      payload: any;\n    }\n  | true;\n\ntype FallbackFlags = Record<string, FallbackFlagOverride>;\n\ntype Config = {\n  timeoutMs: number;\n  staleTimeMs: number;\n  staleWhileRevalidate: boolean;\n  expireTimeMs: number;\n  offline: boolean;\n};\n\nexport const DEFAULT_FLAGS_CONFIG: Config = {\n  timeoutMs: 5000,\n  staleTimeMs: 0,\n  staleWhileRevalidate: false,\n  expireTimeMs: FLAGS_EXPIRE_MS,\n  offline: false,\n};\n\nexport type FetchedFlagsResult = {\n  flags: RawFlags;\n  flagStateVersion?: number;\n};\n\nexport type FlagsFetchResult = FetchedFlagsResult & {\n  success: boolean;\n};\n\nexport function validateFlagsResponse(\n  response: any,\n): FlagsFetchResult | undefined {\n  if (!isObject(response)) {\n    return;\n  }\n\n  if (typeof response.success !== \"boolean\" || !isObject(response.features)) {\n    return;\n  }\n\n  const flags = parseAPIFlagsResponse(response.features);\n\n  if (!flags) {\n    return;\n  }\n\n  const flagStateVersion = isValidFlagStateVersion(response.flagStateVersion)\n    ? response.flagStateVersion\n    : undefined;\n\n  return {\n    success: response.success,\n    flags,\n    flagStateVersion,\n  };\n}\n\nexport function flattenJSON(obj: Record<string, any>): Record<string, any> {\n  const result: Record<string, any> = {};\n  for (const key in obj) {\n    if (typeof obj[key] === \"object\") {\n      const flat = flattenJSON(obj[key]);\n      for (const flatKey in flat) {\n        result[`${key}.${flatKey}`] = flat[flatKey];\n      }\n    } else if (typeof obj[key] !== \"undefined\") {\n      result[key] = obj[key];\n    }\n  }\n  return result;\n}\n\n/**\n * Event representing checking the flag evaluation result\n */\nexport interface CheckEvent {\n  /**\n   * `check-is-enabled` means `isEnabled` was checked, `check-config` means `config` was checked.\n   */\n  action: \"check-is-enabled\" | \"check-config\";\n\n  /**\n   * Flag key.\n   */\n  key: string;\n\n  /**\n   * Result of flag or configuration evaluation.\n   * If `action` is `check-is-enabled`, this is the result of the flag evaluation and `value` is a boolean.\n   * If `action` is `check-config`, this is the result of the configuration evaluation.\n   */\n  value?: boolean | { key: string; payload: any };\n\n  /**\n   * Version of targeting rules.\n   */\n  version?: number;\n\n  /**\n   * Rule evaluation results.\n   */\n  ruleEvaluationResults?: boolean[];\n\n  /**\n   * Missing context fields.\n   * @deprecated Use `evaluationErrors` and check for `MISSING_CONTEXT_FIELD`.\n   */\n  missingContextFields?: string[];\n\n  /**\n   * Non-fatal diagnostics produced while evaluating the flag.\n   */\n  evaluationErrors?: RawFlag[\"evaluationErrors\"];\n}\n\nconst storageOverridesKey = `__reflag_overrides`;\nconst REFRESH_LIMIT_COUNT = 20;\nconst REFRESH_LIMIT_WINDOW_MS = 60 * 1000;\n\nexport type FlagOverrides = Record<string, boolean | undefined>;\n\ntype BootstrappedState = {\n  flags: RawFlags;\n  flagStateVersion?: number;\n};\n\ntype FlagsClientOptions = Partial<Config> & {\n  bootstrappedState?: BootstrappedState;\n  bootstrappedFlags?: RawFlags;\n  fallbackFlags?: Record<string, FallbackFlagOverride> | string[];\n  cache?: FlagCache;\n  rateLimiter?: RateLimiter;\n  storage?: StorageAdapter;\n  enqueueBulkEvent?: (event: BulkEvent) => Promise<void>;\n};\n\n/**\n * @internal\n */\nexport class FlagsClient {\n  private initialized = false;\n  private bootstrapped = false;\n  private initializationComplete = false;\n\n  private rateLimiter: RateLimiter;\n  private readonly logger: Logger;\n\n  private cache: FlagCache;\n  private fetchedFlags: RawFlags = {};\n  private fetchedFlagStateVersion: number | undefined;\n  private fetchedFlagsContextVersion = 0;\n  private flagOverrides: FlagOverrides = {};\n  private flags: RawFlags = {};\n  private fallbackFlags: FallbackFlags = {};\n  private contextFetchVersion = 0;\n  private optInFlagsRequested = false;\n  private optInFlagsLoading = false;\n  private optInFlagsLoadingGeneration = 0;\n  private optInMetadataRefreshAttemptContextVersion: number | undefined;\n  private optInMetadataRefresh:\n    | {\n        contextVersion: number;\n        id: object;\n        promise: Promise<void>;\n      }\n    | undefined;\n  private storage: StorageAdapter;\n  private refreshEvents: number[] = [];\n  private enqueueBulkEvent?: (event: BulkEvent) => Promise<void>;\n\n  private config: Config = DEFAULT_FLAGS_CONFIG;\n\n  private eventTarget = createEventTarget();\n  private abortController = createAbortController();\n\n  constructor(\n    private httpClient: HttpClient,\n    private context: ReflagContext,\n    logger: Logger,\n    {\n      bootstrappedState,\n      bootstrappedFlags,\n      cache,\n      rateLimiter,\n      fallbackFlags,\n      storage,\n      enqueueBulkEvent,\n      ...config\n    }: FlagsClientOptions = {},\n  ) {\n    this.config = {\n      ...this.config,\n      ...config,\n    };\n\n    this.logger = loggerWithPrefix(logger, \"[Flags]\");\n    this.rateLimiter =\n      rateLimiter ?? new RateLimiter(FLAG_EVENTS_PER_MIN, this.logger);\n    this.enqueueBulkEvent = enqueueBulkEvent;\n    this.storage = (cache ? undefined : storage) ?? getDefaultStorageAdapter();\n    this.cache =\n      cache ??\n      this.setupCache(this.config.staleTimeMs, this.config.expireTimeMs);\n    this.fallbackFlags = this.setupFallbackFlags(fallbackFlags);\n\n    if (bootstrappedState || bootstrappedFlags) {\n      this.bootstrapped = true;\n      this.setFetchedFlags(\n        bootstrappedState?.flags ?? bootstrappedFlags ?? {},\n        false,\n        bootstrappedState?.flagStateVersion,\n      );\n    }\n  }\n\n  async initialize() {\n    if (this.initialized) {\n      this.logger.warn(\"flags client already initialized\");\n      return;\n    }\n    this.initialized = true;\n\n    let initializationSucceeded = false;\n    try {\n      const cachedOverrides = await this.getOverridesCache();\n      if (Object.keys(cachedOverrides).length > 0) {\n        this.flagOverrides = { ...cachedOverrides, ...this.flagOverrides };\n      }\n\n      if (!this.bootstrapped) {\n        const requestContextVersion = this.contextFetchVersion;\n        this.applyFetchedFlagsResult(\n          await this.maybeFetchFlags(requestContextVersion),\n          true,\n          requestContextVersion,\n        );\n      }\n\n      // Apply overrides and trigger update if flags have changed\n      this.updateFlags();\n      initializationSucceeded = true;\n    } finally {\n      this.initializationComplete = true;\n\n      if (this.optInFlagsRequested) {\n        if (initializationSucceeded && this.bootstrapped) {\n          void this.refreshOptInMetadataIfNeeded();\n        } else {\n          this.finishOptInFlagsLoading(this.optInFlagsLoadingGeneration);\n        }\n      }\n    }\n  }\n\n  /**\n   * Stop the client.\n   */\n  public stop() {\n    this.supersedeOptInFlagsLoading(false);\n    this.abortController.abort();\n  }\n\n  getFlags(): RawFlags {\n    return this.flags;\n  }\n\n  getFetchedFlags(): RawFlags {\n    return this.fetchedFlags;\n  }\n\n  requestOptInFlags() {\n    this.optInFlagsRequested = true;\n\n    if (\n      !this.initializationComplete ||\n      this.fetchedFlagsContextVersion !== this.contextFetchVersion\n    ) {\n      if (!this.bootstrapped || !this.hasOptInMetadataForCurrentContext()) {\n        this.ensureOptInFlagsLoading();\n      }\n      return;\n    }\n\n    if (!this.bootstrapped) {\n      this.finishOptInFlagsLoading(this.optInFlagsLoadingGeneration);\n      return;\n    }\n\n    void this.refreshOptInMetadataIfNeeded();\n  }\n\n  getIsLoadingOptInFlags() {\n    return this.optInFlagsLoading;\n  }\n\n  onOptInFlagsLoadingUpdated(callback: (isLoading: boolean) => void) {\n    const listener = () => callback(this.optInFlagsLoading);\n    this.eventTarget.addEventListener(\"optInFlagsLoadingUpdated\", listener, {\n      signal: this.abortController.signal,\n    });\n  }\n\n  resetOptInMetadataRefresh() {\n    this.optInMetadataRefreshAttemptContextVersion = undefined;\n  }\n\n  markBootstrappedStateApplied() {\n    this.bootstrapped = true;\n    if (!this.optInFlagsRequested) return;\n\n    if (this.hasOptInMetadataForCurrentContext()) {\n      this.finishOptInFlagsLoading(this.optInFlagsLoadingGeneration);\n      return;\n    }\n\n    this.ensureOptInFlagsLoading();\n    if (this.initializationComplete) {\n      void this.refreshOptInMetadataIfNeeded();\n    }\n  }\n\n  async refreshOptInMetadataIfNeeded(): Promise<void> {\n    if (!this.bootstrapped || !this.optInFlagsRequested) return;\n\n    if (\n      !this.initializationComplete ||\n      this.fetchedFlagsContextVersion !== this.contextFetchVersion\n    ) {\n      this.ensureOptInFlagsLoading();\n      return;\n    }\n\n    if (this.hasOptInMetadataForCurrentContext()) {\n      this.finishOptInFlagsLoading(this.optInFlagsLoadingGeneration);\n      return;\n    }\n\n    const contextVersion = this.contextFetchVersion;\n    const pendingRefresh = this.optInMetadataRefresh;\n    if (pendingRefresh?.contextVersion === contextVersion) {\n      return pendingRefresh.promise;\n    }\n\n    if (\n      this.config.offline ||\n      this.optInMetadataRefreshAttemptContextVersion === contextVersion\n    ) {\n      this.finishOptInFlagsLoading(this.optInFlagsLoadingGeneration);\n      return;\n    }\n\n    this.optInMetadataRefreshAttemptContextVersion = contextVersion;\n    this.ensureOptInFlagsLoading();\n    const loadingGeneration = this.optInFlagsLoadingGeneration;\n    const id = {};\n    const promise = (async () => {\n      try {\n        await this.refreshFlags(this.fetchedFlagStateVersion);\n      } catch (error) {\n        this.logger.error(\"error refreshing opt-in flag metadata\", error);\n      } finally {\n        if (this.optInMetadataRefresh?.id === id) {\n          this.optInMetadataRefresh = undefined;\n        }\n        this.finishOptInFlagsLoading(loadingGeneration);\n      }\n    })();\n\n    this.optInMetadataRefresh = { contextVersion, id, promise };\n    return promise;\n  }\n\n  setContextWithoutFetch(\n    context: ReflagContext,\n    invalidatePendingFetches = false,\n  ) {\n    if (!deepEqual(this.context, context) || invalidatePendingFetches) {\n      this.contextFetchVersion += 1;\n      if (this.optInFlagsRequested) {\n        this.startOptInFlagsLoading();\n      }\n    }\n    this.context = context;\n  }\n\n  setFetchedFlags(\n    fetchedFlags: RawFlags,\n    triggerEvent = true,\n    flagStateVersion?: number,\n  ) {\n    // Create a new fetched flags object making sure to clone the flags\n    this.fetchedFlags = { ...fetchedFlags };\n    this.fetchedFlagStateVersion = flagStateVersion;\n    this.fetchedFlagsContextVersion = this.contextFetchVersion;\n    this.warnMissingFlagContextFields(fetchedFlags);\n    this.updateFlags(triggerEvent);\n  }\n\n  private shouldApplyFetchedFlagsResult(\n    flagStateVersion: number | undefined,\n    requestContextVersion: number,\n  ) {\n    if (requestContextVersion !== this.contextFetchVersion) {\n      return false;\n    }\n\n    // A result for the current context must replace flags that still belong to\n    // the previous context, even when the result is unversioned.\n    if (this.fetchedFlagsContextVersion !== requestContextVersion) {\n      return true;\n    }\n\n    if (flagStateVersion === undefined) {\n      return this.fetchedFlagStateVersion === undefined;\n    }\n\n    return (\n      this.fetchedFlagStateVersion === undefined ||\n      flagStateVersion >= this.fetchedFlagStateVersion\n    );\n  }\n\n  private applyFetchedFlagsResult(\n    result: FetchedFlagsResult | undefined,\n    triggerEvent = true,\n    requestContextVersion = this.contextFetchVersion,\n  ) {\n    if (\n      !this.shouldApplyFetchedFlagsResult(\n        result?.flagStateVersion,\n        requestContextVersion,\n      )\n    ) {\n      return false;\n    }\n\n    this.setFetchedFlags(\n      result?.flags ?? {},\n      triggerEvent,\n      result?.flagStateVersion,\n    );\n    return true;\n  }\n\n  async setContext(context: ReflagContext) {\n    this.context = context;\n    const requestVersion = ++this.contextFetchVersion;\n    this.optInMetadataRefreshAttemptContextVersion = requestVersion;\n    const loadingGeneration = this.optInFlagsRequested\n      ? this.startOptInFlagsLoading()\n      : undefined;\n\n    try {\n      const fetchedFlags = await this.maybeFetchFlags(requestVersion);\n\n      if (requestVersion !== this.contextFetchVersion) {\n        return false;\n      }\n\n      this.applyFetchedFlagsResult(fetchedFlags, true, requestVersion);\n      return true;\n    } finally {\n      if (loadingGeneration !== undefined) {\n        this.finishOptInFlagsLoading(loadingGeneration);\n      }\n    }\n  }\n\n  updateFlags(triggerEvent = true) {\n    const updatedFlags = this.mergeFlags(this.fetchedFlags, this.flagOverrides);\n    // Nothing has changed, skipping update\n    if (deepEqual(this.flags, updatedFlags)) return;\n    this.flags = updatedFlags;\n    if (triggerEvent) this.triggerFlagsUpdated();\n  }\n\n  setFlagOverride(key: string, isEnabled: boolean | null) {\n    if (!(typeof isEnabled === \"boolean\" || isEnabled === null)) {\n      throw new Error(\"setFlagOverride: isEnabled must be boolean or null\");\n    }\n\n    if (isEnabled === null) {\n      delete this.flagOverrides[key];\n    } else {\n      this.flagOverrides[key] = isEnabled;\n    }\n    // TODO(next major): make this async and await storage persistence.\n    void this.setOverridesCache(this.flagOverrides);\n\n    this.updateFlags();\n  }\n\n  getFlagOverride(key: string): boolean | null {\n    return this.flagOverrides[key] ?? null;\n  }\n\n  /**\n   * Register a callback to be called when the flags are updated.\n   * Flags are not guaranteed to have actually changed when the callback is called.\n   *\n   * @param callback this will be called when the flags are updated.\n   * @returns a function that can be called to remove the listener\n   */\n  onUpdated(callback: () => void) {\n    this.eventTarget.addEventListener(\"flagsUpdated\", callback, {\n      signal: this.abortController.signal,\n    });\n  }\n\n  /**\n   * Send a flag \"check\" event.\n   *\n   *\n   * @param checkEvent - The flag to send the event for.\n   * @param cb - Callback to call after the event is sent. Might be skipped if the event was rate limited.\n   */\n  async sendCheckEvent(checkEvent: CheckEvent, cb: () => void) {\n    if (this.config.offline) {\n      return;\n    }\n\n    const rateLimitKey = `check-event:${this.fetchParams().toString()}:${checkEvent.key}:${checkEvent.version}:${checkEvent.value}`;\n    await this.rateLimiter.rateLimited(rateLimitKey, async () => {\n      const payload = {\n        action: checkEvent.action,\n        key: checkEvent.key,\n        targetingVersion: checkEvent.version,\n        evalContext: this.context,\n        evalResult: checkEvent.value,\n        evalRuleResults: checkEvent.ruleEvaluationResults,\n        evalMissingFields: checkEvent.missingContextFields,\n        evalErrors: checkEvent.evaluationErrors,\n      };\n\n      if (this.enqueueBulkEvent) {\n        this.enqueueBulkEvent({\n          type: \"feature-flag-event\",\n          ...payload,\n        }).catch((e: any) => {\n          this.logger.warn(`failed to enqueue flag check event`, e);\n        });\n      } else {\n        this.httpClient\n          .post({\n            path: \"features/events\",\n            body: payload,\n          })\n          .then(async (res) => {\n            if (res.ok) {\n              return;\n            }\n\n            await logResponseError({\n              logger: this.logger,\n              level: \"warn\",\n              res,\n              message: \"failed to send flag check event\",\n            });\n          })\n          .catch((e: any) => {\n            this.logger.warn(`failed to send flag check event`, e);\n          });\n      }\n\n      this.logger.debug(`sent flag event`, payload);\n      cb();\n    });\n\n    return checkEvent.value;\n  }\n\n  getFlagStateVersion(): number | undefined {\n    return this.fetchedFlagStateVersion;\n  }\n\n  async fetchFlags(\n    waitForVersion?: number,\n  ): Promise<FlagsFetchResult | undefined> {\n    const params = this.fetchParams();\n    if (\n      waitForVersion !== undefined &&\n      Number.isInteger(waitForVersion) &&\n      waitForVersion >= 0\n    ) {\n      params.set(\"waitForVersion\", String(waitForVersion));\n    }\n    try {\n      return await retryOnThrow(INITIAL_FETCH_RETRY_DELAYS_MS, async () => {\n        const res = await this.httpClient.get({\n          path: \"/features/evaluated\",\n          timeoutMs: this.config.timeoutMs,\n          params,\n        });\n\n        if (!res.ok) {\n          let errorSummary = \"\";\n          let fallbackBody = \"\";\n          try {\n            const { errorDetails, errorSummary: parsedSummary } =\n              await parseResponseError(res);\n            errorSummary = parsedSummary ?? \"\";\n            fallbackBody = errorDetails.responseBody\n              ? ` - ${errorDetails.responseBody}`\n              : \"\";\n          } catch {\n            // Best-effort response parsing only; the response itself is enough to fail.\n          }\n\n          this.logger.error(\n            \"error fetching flags:\",\n            new Error(\n              `unexpected response code: ${res.status}${\n                errorSummary ? ` - ${errorSummary}` : fallbackBody\n              }`,\n            ),\n          );\n          return;\n        }\n\n        const typeRes = validateFlagsResponse(await res.json());\n        if (!typeRes || !typeRes.success) {\n          this.logger.error(\n            \"error fetching flags:\",\n            new Error(\"unable to validate response\"),\n          );\n          return;\n        }\n\n        if (\n          waitForVersion !== undefined &&\n          (typeRes.flagStateVersion === undefined ||\n            typeRes.flagStateVersion < waitForVersion)\n        ) {\n          this.logger.warn(\n            \"ignoring stale flag response for requested flag state version.\",\n            {\n              requestedFlagStateVersion: waitForVersion,\n              responseFlagStateVersion: typeRes.flagStateVersion,\n            },\n          );\n          return;\n        }\n\n        return typeRes;\n      });\n    } catch (e) {\n      this.logger.error(\"error fetching flags:\", e);\n      return;\n    }\n  }\n\n  /**\n   * Force refresh flags from the API, bypassing cache.\n   */\n  async refreshFlags(waitForVersion?: number): Promise<RawFlags | undefined> {\n    if (this.config.offline) {\n      return;\n    }\n\n    // rate limit refreshes to prevent accidental abuse\n    const now = Date.now();\n    this.refreshEvents = this.refreshEvents.filter(\n      (timestamp) => now - timestamp < REFRESH_LIMIT_WINDOW_MS,\n    );\n    if (this.refreshEvents.length >= REFRESH_LIMIT_COUNT) {\n      this.logger.warn(\"refresh rate limit exceeded\");\n      return;\n    }\n    this.refreshEvents.push(now);\n\n    const requestContextVersion = this.contextFetchVersion;\n    const result = await this.fetchFlags(waitForVersion);\n    if (!result || requestContextVersion !== this.contextFetchVersion) {\n      return;\n    }\n\n    this.applyFetchedFlagsResult(result, true, requestContextVersion);\n    return { ...this.fetchedFlags };\n  }\n\n  private async setOverridesCache(overrides: FlagOverrides) {\n    try {\n      await this.storage.setItem(\n        storageOverridesKey,\n        JSON.stringify(overrides),\n      );\n    } catch (error) {\n      this.logger.warn(\n        \"storing flag overrides failed, overrides won't persist\",\n        error,\n      );\n    }\n  }\n\n  private async getOverridesCache(): Promise<FlagOverrides> {\n    try {\n      const overridesStored = await this.storage.getItem(storageOverridesKey);\n      const overrides = JSON.parse(overridesStored || \"{}\");\n      if (!isObject(overrides)) throw new Error(\"invalid overrides\");\n      return overrides;\n    } catch (error) {\n      this.logger.warn(\"getting flag overrides failed\", error);\n      return {};\n    }\n  }\n\n  private async maybeFetchFlags(\n    requestContextVersion = this.contextFetchVersion,\n  ): Promise<FetchedFlagsResult | undefined> {\n    if (this.config.offline) {\n      return;\n    }\n\n    const cacheKey = this.fetchParams().toString();\n    const cachedItem = await this.cache.get(cacheKey);\n\n    if (cachedItem) {\n      if (!cachedItem.stale) return cachedItem;\n\n      // serve successful stale cache if `staleWhileRevalidate` is enabled\n      if (this.config.staleWhileRevalidate) {\n        // re-fetch in the background, but immediately return last successful value\n        this.fetchFlags()\n          .then(async (result) => {\n            if (!result) return;\n\n            await this.cache.set(cacheKey, {\n              flags: result.flags,\n              flagStateVersion: result.flagStateVersion,\n            });\n            this.applyFetchedFlagsResult(result, true, requestContextVersion);\n          })\n          .catch(() => {\n            // we don't care about the result, we just want to re-fetch\n          });\n        return cachedItem;\n      }\n    }\n\n    // if there's no cached item or there is a stale one but `staleWhileRevalidate` is disabled\n    // try fetching a new one\n    const fetchedFlags = await this.fetchFlags();\n\n    if (fetchedFlags) {\n      await this.cache.set(cacheKey, {\n        flags: fetchedFlags.flags,\n        flagStateVersion: fetchedFlags.flagStateVersion,\n      });\n      return {\n        flags: fetchedFlags.flags,\n        flagStateVersion: fetchedFlags.flagStateVersion,\n      };\n    }\n\n    if (cachedItem) {\n      // fetch failed, return stale cache\n      return cachedItem;\n    }\n\n    // fetch failed, nothing cached => return fallbacks\n    return {\n      flags: Object.entries(this.fallbackFlags).reduce(\n        (acc, [key, override]) => {\n          acc[key] = {\n            key,\n            isEnabled: !!override,\n            config:\n              typeof override === \"object\" && \"key\" in override\n                ? {\n                    key: override.key,\n                    payload: override.payload,\n                  }\n                : undefined,\n          };\n          return acc;\n        },\n        {} as RawFlags,\n      ),\n    };\n  }\n\n  private hasOptInMetadataForCurrentContext() {\n    if (this.fetchedFlagsContextVersion !== this.contextFetchVersion) {\n      return false;\n    }\n\n    const fetchedFlags = Object.values(this.fetchedFlags);\n    return (\n      fetchedFlags.length > 0 &&\n      fetchedFlags.every(\n        (flag) =>\n          flag.optInEnabled === false ||\n          (flag.optInEnabled === true && flag.optIn !== undefined),\n      )\n    );\n  }\n\n  private ensureOptInFlagsLoading() {\n    if (!this.optInFlagsLoading) {\n      this.startOptInFlagsLoading();\n    }\n    return this.optInFlagsLoadingGeneration;\n  }\n\n  private startOptInFlagsLoading() {\n    this.optInFlagsLoadingGeneration += 1;\n    this.setOptInFlagsLoading(true);\n    return this.optInFlagsLoadingGeneration;\n  }\n\n  private finishOptInFlagsLoading(generation: number) {\n    if (generation !== this.optInFlagsLoadingGeneration) return;\n    this.setOptInFlagsLoading(false);\n  }\n\n  private supersedeOptInFlagsLoading(isLoading: boolean) {\n    this.optInFlagsLoadingGeneration += 1;\n    this.setOptInFlagsLoading(isLoading);\n  }\n\n  private setOptInFlagsLoading(isLoading: boolean) {\n    if (this.optInFlagsLoading === isLoading) return;\n\n    this.optInFlagsLoading = isLoading;\n    this.eventTarget.dispatchEvent({ type: \"optInFlagsLoadingUpdated\" });\n  }\n\n  private mergeFlags(fetchedFlags: RawFlags, overrides: FlagOverrides) {\n    const mergedFlags: RawFlags = {};\n    // merge fetched flags with overrides into `this.flags`\n    for (const key in fetchedFlags) {\n      const fetchedFlag = fetchedFlags[key];\n      if (!fetchedFlag) continue;\n      const isEnabledOverride = overrides[key] ?? null;\n      mergedFlags[key] = { ...fetchedFlag, isEnabledOverride };\n    }\n    return mergedFlags;\n  }\n\n  private triggerFlagsUpdated() {\n    this.eventTarget.dispatchEvent({ type: \"flagsUpdated\" });\n  }\n\n  private setupCache(staleTimeMs = 0, expireTimeMs = FLAGS_EXPIRE_MS) {\n    return new FlagCache({\n      storage: this.storage,\n      staleTimeMs,\n      expireTimeMs,\n    });\n  }\n\n  private setupFallbackFlags(\n    fallbackFlags?: Record<string, FallbackFlagOverride> | string[],\n  ) {\n    if (Array.isArray(fallbackFlags)) {\n      return fallbackFlags.reduce(\n        (acc, key) => {\n          acc[key] = true;\n          return acc;\n        },\n        {} as Record<string, FallbackFlagOverride>,\n      );\n    } else {\n      return fallbackFlags ?? {};\n    }\n  }\n\n  private fetchParams() {\n    const contextJson = canonicalContextJSONStringify(this.context);\n    const params = new URLSearchParams(\n      contextJson ? { contextJson } : undefined,\n    );\n    // publishableKey should be part of the cache key\n    params.append(\"publishableKey\", this.httpClient.publishableKey);\n\n    // sort the params to ensure that the URL is the same for the same context\n    params.sort();\n\n    return params;\n  }\n\n  private warnMissingFlagContextFields(flags: RawFlags) {\n    const report: Record<string, string[]> = {};\n    for (const flagKey in flags) {\n      const flag = flags[flagKey];\n      if (flag?.missingContextFields?.length) {\n        report[flag.key] = flag.missingContextFields;\n      }\n\n      if (flag?.config?.missingContextFields?.length) {\n        report[`${flag.key}.config`] = flag.config.missingContextFields;\n      }\n    }\n\n    if (Object.keys(report).length > 0) {\n      this.rateLimiter.rateLimited(\n        `flag-missing-context-fields:${this.fetchParams().toString()}`,\n        () => {\n          this.logger.warn(\n            `flag targeting rules might not be correctly evaluated due to missing context fields.`,\n            report,\n          );\n        },\n      );\n    }\n  }\n}\n","import { CompanyContext, UserContext } from \"./context\";\nimport { CheckEvent, RawFlags } from \"./flag/flags\";\n\n/**\n * State of the client.\n */\nexport type State = \"idle\" | \"initializing\" | \"initialized\" | \"stopped\";\n\nexport interface HookArgs {\n  stateUpdated: State;\n  check: CheckEvent;\n  flagsUpdated: RawFlags;\n  optInFlagsLoadingUpdated: boolean;\n\n  /**\n   * @deprecated Use `flagsUpdated` instead.\n   */\n  featuresUpdated: RawFlags;\n  user: UserContext;\n  company: CompanyContext;\n  track: TrackEvent;\n}\n\nexport type TrackEvent = {\n  user: UserContext;\n  company?: CompanyContext;\n  eventName: string;\n  attributes?: Record<string, any> | null;\n};\n\n/**\n * Hooks manager.\n * @internal\n */\nexport class HooksManager {\n  private hooks: {\n    stateUpdated: ((arg0: State) => void)[];\n    check: ((arg0: CheckEvent) => void)[];\n    flagsUpdated: ((arg0: RawFlags) => void)[];\n    optInFlagsLoadingUpdated: ((arg0: boolean) => void)[];\n    user: ((arg0: UserContext) => void)[];\n    company: ((arg0: CompanyContext) => void)[];\n    track: ((arg0: TrackEvent) => void)[];\n  } = {\n    stateUpdated: [],\n    check: [],\n    flagsUpdated: [],\n    optInFlagsLoadingUpdated: [],\n    user: [],\n    company: [],\n    track: [],\n  };\n\n  private _adjustEvent(event: keyof HookArgs) {\n    return event === \"featuresUpdated\" ? \"flagsUpdated\" : event;\n  }\n\n  addHook<THookType extends keyof HookArgs>(\n    event: THookType,\n    cb: (arg0: HookArgs[THookType]) => void,\n  ): () => void {\n    (this.hooks[this._adjustEvent(event)] as any[]).push(cb);\n    return () => {\n      this.removeHook(event, cb);\n    };\n  }\n\n  removeHook<THookType extends keyof HookArgs>(\n    event: THookType,\n    cb: (arg0: HookArgs[THookType]) => void,\n  ): void {\n    this.hooks[this._adjustEvent(event)] = this.hooks[\n      this._adjustEvent(event)\n    ].filter((hook) => hook !== cb) as any;\n  }\n\n  trigger<THookType extends keyof HookArgs>(\n    event: THookType,\n    arg: HookArgs[THookType],\n  ): void {\n    const hooks = this.hooks[this._adjustEvent(event)] as Array<\n      (value: HookArgs[THookType]) => void\n    >;\n    hooks.forEach((hook) => hook(arg));\n  }\n}\n","import { API_BASE_URL, SDK_VERSION, SDK_VERSION_HEADER_NAME } from \"./config\";\nimport { createAbortController } from \"./utils/abortController\";\n\nconst KEEPALIVE_MAX_IN_FLIGHT_BYTES = 60 * 1024;\nconst KEEPALIVE_MAX_IN_FLIGHT_REQUESTS = 15;\n\nexport interface HttpClientOptions {\n  baseUrl?: string;\n  sdkVersion?: string;\n  credentials?: RequestCredentials;\n}\n\nfunction getBodyByteLength(value: string) {\n  return new TextEncoder().encode(value).length;\n}\n\nexport class HttpClient {\n  private readonly baseUrl: string;\n  private readonly sdkVersion: string;\n\n  private readonly fetchOptions: RequestInit;\n  private inFlightKeepaliveBytes = 0;\n  private inFlightKeepaliveRequests = 0;\n\n  constructor(\n    public publishableKey: string,\n    opts: HttpClientOptions = {},\n  ) {\n    this.baseUrl = opts.baseUrl ?? API_BASE_URL;\n\n    // Ensure baseUrl ends with a trailing slash so subsequent\n    // path concatenation works as expected\n    if (!this.baseUrl.endsWith(\"/\")) {\n      this.baseUrl += \"/\";\n    }\n    this.sdkVersion = opts.sdkVersion ?? SDK_VERSION;\n    this.fetchOptions = { credentials: opts.credentials };\n  }\n\n  getUrl(path: string): URL {\n    // see tests for examples\n    if (path.startsWith(\"/\")) {\n      path = path.slice(1);\n    }\n    return new URL(path, this.baseUrl);\n  }\n\n  async get({\n    path,\n    params,\n    timeoutMs,\n  }: {\n    path: string;\n    params?: URLSearchParams;\n    timeoutMs?: number;\n  }): ReturnType<typeof fetch> {\n    if (!params) {\n      params = new URLSearchParams();\n    }\n    params.set(SDK_VERSION_HEADER_NAME, this.sdkVersion);\n    params.set(\"publishableKey\", this.publishableKey);\n\n    // Do not assign `url.search` directly: some React Native URL implementations\n    // expose `search` as getter-only and throw at runtime on assignment.\n    const query = params.toString();\n    const pathWithQuery = query\n      ? `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${query}`\n      : path;\n    const url = this.getUrl(pathWithQuery);\n\n    if (timeoutMs === undefined) {\n      return fetch(url, this.fetchOptions);\n    }\n\n    const controller = createAbortController();\n    const id = setTimeout(() => controller.abort(), timeoutMs);\n\n    const res = await fetch(url, {\n      ...this.fetchOptions,\n      signal: controller.signal,\n    });\n    clearTimeout(id);\n\n    return res;\n  }\n\n  async post({\n    path,\n    body,\n    keepalive,\n  }: {\n    host?: string;\n    path: string;\n    body: any;\n    keepalive?: boolean;\n  }): ReturnType<typeof fetch> {\n    const serializedBody = JSON.stringify(body);\n    const bodyBytes = getBodyByteLength(serializedBody);\n    const shouldUseKeepalive =\n      keepalive &&\n      this.inFlightKeepaliveBytes + bodyBytes <=\n        KEEPALIVE_MAX_IN_FLIGHT_BYTES &&\n      this.inFlightKeepaliveRequests < KEEPALIVE_MAX_IN_FLIGHT_REQUESTS;\n\n    if (shouldUseKeepalive) {\n      this.inFlightKeepaliveBytes += bodyBytes;\n      this.inFlightKeepaliveRequests += 1;\n    }\n\n    try {\n      return await fetch(this.getUrl(path), {\n        ...this.fetchOptions,\n        method: \"POST\",\n        keepalive: shouldUseKeepalive,\n        headers: {\n          \"Content-Type\": \"application/json\",\n          [SDK_VERSION_HEADER_NAME]: this.sdkVersion,\n          Authorization: `Bearer ${this.publishableKey}`,\n        },\n        body: serializedBody,\n      });\n    } finally {\n      if (shouldUseKeepalive) {\n        this.inFlightKeepaliveBytes -= bodyBytes;\n        this.inFlightKeepaliveRequests -= 1;\n      }\n    }\n  }\n}\n","import { h } from \"preact\";\n\ninterface SwitchProps extends h.JSX.HTMLAttributes<HTMLInputElement> {\n  checked: boolean;\n  width?: number;\n  height?: number;\n}\n\nconst gutter = 1;\n\nexport function Switch({\n  checked,\n  width = 24,\n  height = 14,\n  ...props\n}: SwitchProps) {\n  return (\n    <label class=\"switch\" data-enabled={checked}>\n      <input\n        checked={checked}\n        class=\"switch-input\"\n        name=\"enabled\"\n        type=\"checkbox\"\n        {...props}\n      />\n      <div\n        class=\"switch-track\"\n        style={{\n          width: `${width}px`,\n          height: `${height}px`,\n          borderRadius: `${height}px`,\n        }}\n      >\n        <div\n          class=\"switch-dot\"\n          style={{\n            width: `${height - gutter * 2}px`,\n            height: `${height - gutter * 2}px`,\n            transform: checked\n              ? `translateX(${width - (height - gutter * 2) - gutter}px)`\n              : `translateX(${gutter}px)`,\n            top: `${gutter}px`,\n          }}\n        />\n      </div>\n    </label>\n  );\n}\n","import { Fragment, h } from \"preact\";\n\nimport { Switch } from \"./Switch\";\nimport { FlagItem } from \"./Toolbar\";\n\nconst isFound = (flagKey: string, searchQuery: string | null) => {\n  return flagKey.toLocaleLowerCase().includes(searchQuery ?? \"\");\n};\n\nexport function FlagsTable({\n  flags,\n  searchQuery,\n  appBaseUrl,\n  setIsEnabledOverride,\n}: {\n  flags: FlagItem[];\n  searchQuery: string | null;\n  appBaseUrl: string;\n  setIsEnabledOverride: (key: string, isEnabled: boolean | null) => void;\n}) {\n  const hasFlags = flags.length > 0;\n  const hasShownFlags = flags.some((flag) =>\n    isFound(flag.flagKey, searchQuery),\n  );\n\n  // List flags that match the search query first then alphabetically\n  const searchedFlags =\n    searchQuery === null\n      ? flags\n      : [...flags].sort((a, b) => {\n          const aMatches = isFound(a.flagKey, searchQuery);\n          const bMatches = isFound(b.flagKey, searchQuery);\n\n          // If both match or both don't match, sort alphabetically\n          if (aMatches === bMatches) {\n            const aStartsWith = a.flagKey\n              .toLocaleLowerCase()\n              .startsWith(searchQuery);\n            const bStartsWith = b.flagKey\n              .toLocaleLowerCase()\n              .startsWith(searchQuery);\n\n            // If one starts with search query and the other doesn't, prioritize the one that starts with it\n            if (aStartsWith && !bStartsWith) return -1;\n            if (bStartsWith && !aStartsWith) return 1;\n\n            // Otherwise sort alphabetically\n            return a.flagKey.localeCompare(b.flagKey);\n          }\n\n          // Otherwise, matching flags come first\n          return aMatches ? -1 : 1;\n        });\n\n  return (\n    <Fragment>\n      {(!hasFlags || !hasShownFlags) && (\n        <div class=\"flags-table-empty\">\n          No flags {hasFlags ? `matching \"${searchQuery}\"` : \"found\"}\n        </div>\n      )}\n      <table class=\"flags-table\">\n        <tbody>\n          {searchedFlags.map((flag, index) => (\n            <FlagRow\n              key={flag.flagKey}\n              appBaseUrl={appBaseUrl}\n              flag={flag}\n              index={index}\n              isNotVisible={\n                searchQuery !== null && !isFound(flag.flagKey, searchQuery)\n              }\n              setEnabledOverride={(override) =>\n                setIsEnabledOverride(flag.flagKey, override)\n              }\n            />\n          ))}\n        </tbody>\n      </table>\n    </Fragment>\n  );\n}\n\nfunction FlagRow({\n  setEnabledOverride,\n  appBaseUrl,\n  flag,\n  index,\n  isNotVisible,\n}: {\n  flag: FlagItem;\n  appBaseUrl: string;\n  setEnabledOverride: (isEnabled: boolean | null) => void;\n  index: number;\n  isNotVisible: boolean;\n}) {\n  const isEnabledOverride = flag.isEnabledOverride !== null;\n  return (\n    <tr\n      key={flag.flagKey}\n      class={[\"flag-row\", isNotVisible ? \"not-visible\" : undefined].join(\" \")}\n    >\n      <td class=\"flag-name-cell\">\n        <a\n          class=\"flag-link\"\n          href={`${appBaseUrl}/env-current/flags/by-key/${flag.flagKey}`}\n          rel=\"noreferrer\"\n          tabIndex={index + 1}\n          target=\"_blank\"\n        >\n          {flag.flagKey}\n        </a>\n      </td>\n      <td class=\"flag-reset-cell\">\n        {isEnabledOverride ? (\n          <Reset setEnabledOverride={setEnabledOverride} tabIndex={index + 1} />\n        ) : null}\n      </td>\n      <td class=\"flag-switch-cell\">\n        <Switch\n          checked={flag.isEnabledOverride ?? flag.isEnabled}\n          tabIndex={index + 1}\n          onChange={(e) => {\n            const isChecked = e.currentTarget.checked;\n            setEnabledOverride(!isEnabledOverride ? isChecked : null);\n          }}\n        />\n      </td>\n    </tr>\n  );\n}\n\nexport function FlagSearch({ onSearch }: { onSearch: (val: string) => void }) {\n  return (\n    <input\n      class=\"search-input\"\n      placeholder=\"Search flags\"\n      tabIndex={0}\n      type=\"search\"\n      autoFocus\n      onInput={(s) => onSearch(s.currentTarget.value)}\n    />\n  );\n}\n\nfunction Reset({\n  setEnabledOverride,\n  ...props\n}: {\n  setEnabledOverride: (isEnabled: boolean | null) => void;\n} & h.JSX.HTMLAttributes<HTMLAnchorElement>) {\n  return (\n    <a\n      class=\"reset\"\n      href=\"\"\n      onClick={(e) => {\n        e.preventDefault();\n        setEnabledOverride(null);\n      }}\n      {...props}\n    >\n      reset\n    </a>\n  );\n}\n","import { h } from \"preact\";\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"preact/hooks\";\n\nimport { ReflagClient } from \"../client\";\nimport { IS_SERVER } from \"../config\";\nimport { toolbarContainerId } from \"../ui/constants\";\nimport { Dialog, DialogContent, DialogHeader, useDialog } from \"../ui/Dialog\";\nimport { Logo } from \"../ui/icons/Logo\";\nimport { ToolbarPosition } from \"../ui/types\";\nimport { parseUnanchoredPosition } from \"../ui/utils\";\nimport { FlagSearch, FlagsTable } from \"./Flags\";\nimport styles from \"./index.css?inline\";\n\nconst TOOLBAR_HIDE_KEY = \"reflag-toolbar-hidden\";\n\nexport type FlagItem = {\n  flagKey: string;\n  isEnabled: boolean;\n  isEnabledOverride: boolean | null;\n};\n\ntype Flag = {\n  flagKey: string;\n  isEnabled: boolean;\n  isEnabledOverride: boolean | null;\n};\n\nexport default function Toolbar({\n  reflagClient,\n  position,\n}: {\n  reflagClient: ReflagClient;\n  position: ToolbarPosition;\n}) {\n  const toggleToolbarRef = useRef<HTMLDivElement>(null);\n  const dialogContentRef = useRef<HTMLDivElement>(null);\n  const [flags, setFlags] = useState<Flag[]>([]);\n\n  const wasHidden =\n    !IS_SERVER && sessionStorage.getItem(TOOLBAR_HIDE_KEY) === \"true\";\n  const [isHidden, setIsHidden] = useState(wasHidden);\n\n  const updateFlags = useCallback(() => {\n    const rawFlags = reflagClient.getFlags();\n    setFlags(\n      Object.values(rawFlags)\n        .filter((f) => f !== undefined)\n        .map(\n          (flag) =>\n            ({\n              flagKey: flag.key,\n              isEnabledOverride: flag.isEnabledOverride ?? null,\n              isEnabled: flag.isEnabled,\n            }) satisfies FlagItem,\n        ),\n    );\n  }, [reflagClient]);\n\n  const hasAnyOverrides = useMemo(() => {\n    return flags.some((f) => f.isEnabledOverride !== null);\n  }, [flags]);\n\n  useEffect(() => {\n    updateFlags();\n    return reflagClient.on(\"flagsUpdated\", updateFlags);\n  }, [reflagClient, updateFlags]);\n\n  const [search, setSearch] = useState<string | null>(null);\n  const onSearch = (val: string) => {\n    setSearch(val === \"\" ? null : val);\n    dialogContentRef.current?.scrollTo({ top: 0 });\n  };\n\n  const sortedFlags = [...flags].sort((a, b) =>\n    a.flagKey.localeCompare(b.flagKey),\n  );\n\n  const appBaseUrl = reflagClient.getConfig().appBaseUrl;\n\n  const { isOpen, close, toggle } = useDialog();\n\n  const hideToolbar = useCallback(() => {\n    if (IS_SERVER) return;\n    sessionStorage.setItem(TOOLBAR_HIDE_KEY, \"true\");\n    setIsHidden(true);\n    close();\n  }, [close]);\n\n  if (isHidden) {\n    return null;\n  }\n\n  return (\n    <div class=\"toolbar\">\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      <ToolbarToggle\n        hasAnyOverrides={hasAnyOverrides}\n        innerRef={toggleToolbarRef}\n        isOpen={isOpen}\n        position={position}\n        onClick={toggle}\n      />\n      <Dialog\n        close={close}\n        containerId={toolbarContainerId}\n        isOpen={isOpen}\n        position={{\n          type: \"POPOVER\",\n          anchor: toggleToolbarRef.current,\n          placement: \"top-start\",\n        }}\n        showArrow={false}\n        strategy=\"fixed\"\n      >\n        <DialogHeader>\n          <FlagSearch onSearch={onSearch} />\n          <a\n            class=\"toolbar-header-button\"\n            data-tooltip=\"Open Reflag app\"\n            href={`${appBaseUrl}/env-current`}\n          >\n            <svg\n              width=\"15\"\n              height=\"15\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              viewBox=\"0 0 24 24\"\n              fill=\"currentColor\"\n            >\n              <path d=\"M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM9.71002 19.6674C8.74743 17.6259 8.15732 15.3742 8.02731 13H4.06189C4.458 16.1765 6.71639 18.7747 9.71002 19.6674ZM10.0307 13C10.1811 15.4388 10.8778 17.7297 12 19.752C13.1222 17.7297 13.8189 15.4388 13.9693 13H10.0307ZM19.9381 13H15.9727C15.8427 15.3742 15.2526 17.6259 14.29 19.6674C17.2836 18.7747 19.542 16.1765 19.9381 13ZM4.06189 11H8.02731C8.15732 8.62577 8.74743 6.37407 9.71002 4.33256C6.71639 5.22533 4.458 7.8235 4.06189 11ZM10.0307 11H13.9693C13.8189 8.56122 13.1222 6.27025 12 4.24799C10.8778 6.27025 10.1811 8.56122 10.0307 11ZM14.29 4.33256C15.2526 6.37407 15.8427 8.62577 15.9727 11H19.9381C19.542 7.8235 17.2836 5.22533 14.29 4.33256Z\" />\n            </svg>\n          </a>\n          <button\n            class=\"toolbar-header-button\"\n            onClick={hideToolbar}\n            data-tooltip=\"Hide toolbar this session\"\n          >\n            <svg\n              width=\"15\"\n              height=\"15\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              viewBox=\"0 0 24 24\"\n              fill=\"currentColor\"\n            >\n              <path d=\"M17.8827 19.2968C16.1814 20.3755 14.1638 21.0002 12.0003 21.0002C6.60812 21.0002 2.12215 17.1204 1.18164 12.0002C1.61832 9.62282 2.81932 7.5129 4.52047 5.93457L1.39366 2.80777L2.80788 1.39355L22.6069 21.1925L21.1927 22.6068L17.8827 19.2968ZM5.9356 7.3497C4.60673 8.56015 3.6378 10.1672 3.22278 12.0002C4.14022 16.0521 7.7646 19.0002 12.0003 19.0002C13.5997 19.0002 15.112 18.5798 16.4243 17.8384L14.396 15.8101C13.7023 16.2472 12.8808 16.5002 12.0003 16.5002C9.51498 16.5002 7.50026 14.4854 7.50026 12.0002C7.50026 11.1196 7.75317 10.2981 8.19031 9.60442L5.9356 7.3497ZM12.9139 14.328L9.67246 11.0866C9.5613 11.3696 9.50026 11.6777 9.50026 12.0002C9.50026 13.3809 10.6196 14.5002 12.0003 14.5002C12.3227 14.5002 12.6309 14.4391 12.9139 14.328ZM20.8068 16.5925L19.376 15.1617C20.0319 14.2268 20.5154 13.1586 20.7777 12.0002C19.8603 7.94818 16.2359 5.00016 12.0003 5.00016C11.1544 5.00016 10.3329 5.11773 9.55249 5.33818L7.97446 3.76015C9.22127 3.26959 10.5793 3.00016 12.0003 3.00016C17.3924 3.00016 21.8784 6.87992 22.8189 12.0002C22.5067 13.6998 21.8038 15.2628 20.8068 16.5925ZM11.7229 7.50857C11.8146 7.50299 11.9071 7.50016 12.0003 7.50016C14.4855 7.50016 16.5003 9.51488 16.5003 12.0002C16.5003 12.0933 16.4974 12.1858 16.4919 12.2775L11.7229 7.50857Z\" />\n            </svg>\n          </button>\n        </DialogHeader>\n        <DialogContent innerRef={dialogContentRef}>\n          <FlagsTable\n            appBaseUrl={appBaseUrl}\n            flags={sortedFlags}\n            searchQuery={search?.toLocaleLowerCase() ?? null}\n            setIsEnabledOverride={(flagKey, isEnabled) =>\n              reflagClient.getFlag(flagKey).setIsEnabledOverride(isEnabled)\n            }\n          />\n        </DialogContent>\n      </Dialog>\n    </div>\n  );\n}\n\nfunction ToolbarToggle({\n  isOpen,\n  position,\n  onClick,\n  innerRef,\n  hasAnyOverrides,\n}: {\n  isOpen: boolean;\n  position: ToolbarPosition;\n  onClick: () => void;\n  innerRef: React.RefObject<HTMLDivElement>;\n  hasAnyOverrides: boolean;\n  children?: preact.VNode;\n}) {\n  const offsets = parseUnanchoredPosition(position);\n\n  const toggleClasses = [\"toolbar-toggle\", isOpen ? \"open\" : undefined].join(\n    \" \",\n  );\n\n  const indicatorClasses = [\n    \"override-indicator\",\n    hasAnyOverrides ? \"show\" : undefined,\n  ].join(\" \");\n\n  return (\n    <div ref={innerRef} class={toggleClasses} style={offsets} onClick={onClick}>\n      <div class={indicatorClasses} />\n      <Logo height=\"13px\" width=\"13px\" />\n    </div>\n  );\n}\n","import { h, render } from \"preact\";\n\nimport { ReflagClient } from \"../client\";\nimport { toolbarContainerId } from \"../ui/constants\";\nimport { ToolbarPosition } from \"../ui/types\";\nimport { attachContainer } from \"../ui/utils\";\nimport Toolbar from \"./Toolbar\";\n\ntype showToolbarToggleOptions = {\n  reflagClient: ReflagClient;\n  position?: ToolbarPosition;\n};\n\nexport const DEFAULT_PLACEMENT = \"bottom-right\" as const;\n\nexport function showToolbarToggle(options: showToolbarToggleOptions) {\n  const shadowRoot = attachContainer(toolbarContainerId);\n  const position: ToolbarPosition = options.position ?? {\n    placement: DEFAULT_PLACEMENT,\n  };\n\n  render(h(Toolbar, { ...options, position }), shadowRoot);\n}\n","import { deepEqual } from \"fast-equals\";\n\nimport { BulkEvent, BulkQueue } from \"./bulkQueue\";\nimport { API_BASE_URL, APP_BASE_URL, IS_SERVER, SDK_VERSION } from \"./config\";\nimport { ReflagContext, ReflagDeprecatedContext } from \"./context\";\nimport {\n  AutoFeedback,\n  Feedback,\n  feedback,\n  FeedbackOptions,\n  RequestFeedbackData,\n  RequestFeedbackOptions,\n} from \"./feedback/feedback\";\nimport * as feedbackLib from \"./feedback/ui\";\nimport {\n  CheckEvent,\n  FallbackFlagOverride,\n  FlagsClient,\n  OptInFlag,\n  RawFlags,\n} from \"./flag/flags\";\nimport { isValidFlagStateVersion } from \"./flag/flagStateVersion\";\nimport { HookArgs, HooksManager, State } from \"./hooksManager\";\nimport { HttpClient } from \"./httpClient\";\nimport { Logger, loggerWithPrefix, quietConsoleLogger } from \"./logger\";\nimport {\n  AblySSEChannel,\n  EventSourceFactory,\n  openAblySSEChannel,\n  PubSubMessage,\n} from \"./sse\";\nimport { StorageAdapter } from \"./storage\";\nimport { showToolbarToggle } from \"./toolbar\";\nimport { ToolbarPosition } from \"./ui/types\";\nimport { logResponseError } from \"./utils/responseError\";\n\nconst isMobile = typeof window !== \"undefined\" && window.innerWidth < 768;\nconst isNode = typeof document === \"undefined\"; // deno supports \"window\" but not \"document\" according to https://remix.run/docs/en/main/guides/gotchas\n\nfunction normalizeContext({\n  otherContext,\n  ...context\n}: ReflagDeprecatedContext): ReflagContext {\n  return {\n    user: context.user?.id ? { ...context.user } : undefined,\n    company: context.company?.id ? { ...context.company } : undefined,\n    other: { ...otherContext, ...context.other },\n  };\n}\n\n/**\n * (Internal) User context.\n *\n * @internal\n */\nexport type User = {\n  /**\n   * Identifier of the user.\n   */\n  userId: string;\n\n  /**\n   * User attributes.\n   */\n  attributes?: {\n    /**\n     * Name of the user.\n     */\n    name?: string;\n\n    /**\n     * Email of the user.\n     */\n    email?: string;\n\n    /**\n     * Avatar URL of the user.\n     */\n    avatar?: string;\n\n    /**\n     * Custom attributes of the user.\n     */\n    [key: string]: any;\n  };\n\n  /**\n   * Custom context of the user.\n   */\n  context?: PayloadContext;\n};\n\n/**\n * (Internal) Company context.\n *\n * @internal\n */\nexport type Company = {\n  /**\n   * User identifier.\n   */\n  userId: string;\n\n  /**\n   * Company identifier.\n   */\n  companyId: string;\n\n  /**\n   * Company attributes.\n   */\n  attributes?: {\n    /**\n     * Name of the company.\n     */\n    name?: string;\n\n    /**\n     * Custom attributes of the company.\n     */\n    [key: string]: any;\n  };\n\n  context?: PayloadContext;\n};\n\n/**\n * Tracked event.\n */\nexport type TrackedEvent = {\n  /**\n   * Event name.\n   */\n  event: string;\n\n  /**\n   * User identifier.\n   */\n  userId: string;\n\n  /**\n   * Company identifier.\n   */\n  companyId?: string;\n\n  /**\n   * Event attributes.\n   */\n  attributes?: Record<string, any>;\n\n  /**\n   * Custom context of the event.\n   */\n  context?: PayloadContext;\n};\n\n/**\n * (Internal) Custom context of the event.\n *\n * @internal\n */\nexport type PayloadContext = {\n  /**\n   * Whether the company and user associated with the event are active.\n   */\n  active?: boolean;\n};\n\n/**\n * ReflagClient configuration.\n */\nexport interface Config {\n  /**\n   * Base URL of Reflag servers.\n   */\n  apiBaseUrl: string;\n\n  /**\n   * Base URL of the Reflag web app.\n   */\n  appBaseUrl: string;\n\n  /**\n   * Base URL used for pubsub SSE connections.\n   * Defaults to `apiBaseUrl`.\n   */\n  sseBaseUrl: string;\n\n  /**\n   * Whether to enable tracking.\n   */\n  enableTracking: boolean;\n\n  /**\n   * Whether to enable offline mode.\n   */\n  offline: boolean;\n\n  /**\n   * Whether the client is bootstrapped.\n   */\n  bootstrapped: boolean;\n}\n\n/**\n * Toolbar options.\n */\nexport type ToolbarOptions =\n  | boolean\n  | {\n      show?: boolean;\n      position?: ToolbarPosition;\n    };\n\n/**\n * Flag definitions.\n */\nexport type FlagDefinitions = Readonly<Array<string>>;\n\n/**\n * Pre-fetched evaluated state used to bootstrap the client.\n */\nexport type BootstrappedState = {\n  context: ReflagContext;\n  flags: RawFlags;\n  flagStateVersion?: number;\n};\n\n/**\n * ReflagClient initialization options.\n */\nexport type InitOptions = ReflagDeprecatedContext & {\n  /**\n   * Publishable key for authentication\n   */\n  publishableKey: string;\n\n  /**\n   * You can provide a logger to see the logs of the network calls.\n   * This is undefined by default.\n   * For debugging purposes you can just set the browser console to this property:\n   * ```javascript\n   * options.logger = window.console;\n   * ```\n   */\n  logger?: Logger;\n\n  /**\n   * Base URL of Reflag servers. You can override this to use your mocked server.\n   */\n  apiBaseUrl?: string;\n\n  /**\n   * Base URL of the Reflag web app. Links open ín this app by default.\n   */\n  appBaseUrl?: string;\n\n  /**\n   * Whether to enable offline mode. Defaults to `false`.\n   */\n  offline?: boolean;\n\n  /**\n   * Flag keys for which `isEnabled` should fallback to true\n   * if SDK fails to fetch flags from Reflag servers. If a record\n   * is supplied instead of array, the values of each key represent the\n   * configuration values and `isEnabled` is assume `true`.\n   */\n  fallbackFlags?: string[] | Record<string, FallbackFlagOverride>;\n\n  /**\n   * Timeout in milliseconds when fetching flags\n   */\n  timeoutMs?: number;\n\n  /**\n   * If set to true stale flags will be returned while refetching flags\n   */\n  staleWhileRevalidate?: boolean;\n\n  /**\n   * If set, flags will be cached between page loads for this duration\n   */\n  expireTimeMs?: number;\n\n  /**\n   * Stale flags will be returned if staleWhileRevalidate is true if no new flags can be fetched\n   */\n  staleTimeMs?: number;\n\n  /**\n   * When proxying requests, you may want to include credentials like cookies\n   * so you can authorize the request in the proxy.\n   * This option controls the `credentials` option of the fetch API.\n   */\n  credentials?: \"include\" | \"same-origin\" | \"omit\";\n\n  /**\n   * @deprecated SSE now uses the same origin as `apiBaseUrl` by default.\n   * Override only if you need a separate pubsub host temporarily.\n   */\n  sseBaseUrl?: string;\n\n  /**\n   * AutoFeedback specific configuration\n   */\n  feedback?: FeedbackOptions;\n\n  /**\n   * Version of the SDK\n   */\n  sdkVersion?: string;\n\n  /**\n   * Whether to enable tracking. Defaults to `true`.\n   */\n  enableTracking?: boolean;\n\n  /**\n   * Whether to enable live flag updates.\n   *\n   * When enabled, the SDK opens a Server-Sent Events (SSE) connection and\n   * refreshes flag definitions automatically whenever they change on the\n   * server, without relying on context changes or manual refreshes.\n   *\n   * Defaults to `false` in the browser SDK.\n   */\n  enableLiveFlagUpdates?: boolean;\n\n  /**\n   * Optional factory used to create SSE connections.\n   *\n   * By default the SDK uses the global `EventSource` implementation available\n   * in browsers. This option is intended for alternative runtimes where you\n   * need to provide an EventSource-compatible transport manually. The React\n   * Native wrapper already injects a transport automatically.\n   */\n  eventSourceFactory?: EventSourceFactory;\n\n  /**\n   * Toolbar configuration\n   */\n  toolbar?: ToolbarOptions;\n\n  /**\n   * Pre-fetched evaluated state used for the initial flag state.\n   * The client fetches opt-in metadata on demand when opt-in flags are requested.\n   */\n  bootstrappedState?: BootstrappedState;\n\n  /**\n   * Pre-fetched flags used for the initial flag state.\n   * The client fetches opt-in metadata on demand when opt-in flags are requested.\n   * @deprecated Use `bootstrappedState` instead.\n   */\n  bootstrappedFlags?: RawFlags;\n\n  /**\n   * Optional storage adapter used for caching flags and overrides.\n   * Useful for React Native (AsyncStorage).\n   */\n  storage?: StorageAdapter;\n\n  /**\n   * Queue settings for tracking updates sent to `/bulk`.\n   * Applies to user/company updates, check events, and prompt events.\n   * Events are buffered in memory and flushed in the background.\n   */\n  trackingQueue?: {\n    /**\n     * Delay in milliseconds before flushing queued events.\n     * Lower values send sooner; slightly higher values batch better.\n     * Defaults to 200ms.\n     */\n    flushDelayMs?: number;\n\n    /**\n     * Maximum number of queued events retained locally.\n     * Oldest events are dropped when the cap is exceeded.\n     * Defaults to 100.\n     */\n    maxSize?: number;\n\n    /**\n     * Deprecated: retries are no longer performed for bulk delivery.\n     */\n    retryBaseDelayMs?: number;\n\n    /**\n     * Deprecated: retries are no longer performed for bulk delivery.\n     */\n    retryMaxDelayMs?: number;\n  };\n};\n\nconst defaultConfig: Config = {\n  apiBaseUrl: API_BASE_URL,\n  appBaseUrl: APP_BASE_URL,\n  sseBaseUrl: API_BASE_URL,\n  enableTracking: true,\n  offline: false,\n  bootstrapped: false,\n};\n\nconst CLIENT_NOT_INITIALIZED_EVALUATION_ERROR = {\n  code: \"CLIENT_NOT_INITIALIZED\",\n  field: \"\",\n  message:\n    \"ReflagClient was not initialized before this flag was evaluated. Call initialize() before evaluating flags.\",\n} as const;\n\nfunction withClientInitializationDiagnostic(\n  errors: CheckEvent[\"evaluationErrors\"],\n  evaluatedBeforeInitialization: boolean,\n): CheckEvent[\"evaluationErrors\"] {\n  return evaluatedBeforeInitialization\n    ? [...(errors ?? []), CLIENT_NOT_INITIALIZED_EVALUATION_ERROR]\n    : errors;\n}\n\n/**\n * A remotely managed configuration value for a flag.\n */\nexport type FlagRemoteConfig =\n  | {\n      /**\n       * The key of the matched configuration value.\n       */\n      key: string;\n\n      /**\n       * The optional user-supplied payload data.\n       */\n      payload: any;\n    }\n  | { key: undefined; payload: undefined };\n\n/**\n * Options for changing the current user or company's opt-in membership.\n */\nexport type SetOptInOptions = {\n  /**\n   * Whether the scoped subject has opted in.\n   */\n  optedIn: boolean;\n\n  /**\n   * Whether to update the current user or current company. Defaults to `user`.\n   */\n  scope?: \"user\" | \"company\";\n};\n\nexport interface Flag {\n  /**\n   * Result of flag flag evaluation.\n   * Note: Does not take local overrides into account.\n   */\n  isEnabled: boolean;\n\n  /*\n   * Optional user-defined configuration.\n   */\n  config: FlagRemoteConfig;\n\n  /**\n   * Function to send analytics events for this flag.\n   */\n  track: () => Promise<Response | undefined>;\n\n  /**\n   * Function to request feedback for this flag.\n   */\n  requestFeedback: (\n    options: Omit<RequestFeedbackData, \"flagKey\" | \"featureId\">,\n  ) => void;\n\n  /**\n   * The current override status of isEnabled for the flag.\n   */\n  isEnabledOverride: boolean | null;\n\n  /**\n   * Set the override status for isEnabled for the flag.\n   * Set to `null` to remove the override.\n   */\n  setIsEnabledOverride(isEnabled: boolean | null): void;\n}\n\nfunction shouldShowToolbar(opts: InitOptions) {\n  const toolbarOpts = opts.toolbar;\n  if (typeof window === \"undefined\" || typeof window.location === \"undefined\") {\n    return false;\n  }\n  if (typeof toolbarOpts === \"boolean\") return toolbarOpts;\n  if (typeof toolbarOpts?.show === \"boolean\") return toolbarOpts.show;\n  return window.location.hostname === \"localhost\";\n}\n\n/**\n * ReflagClient lets you interact with the Reflag API.\n */\nexport class ReflagClient {\n  private state: State = \"idle\";\n  private initializationFinished = false;\n  private contextUpdateLoading = false;\n  private readonly publishableKey: string;\n  private context: ReflagContext;\n  private config: Config;\n  private requestFeedbackOptions: Partial<RequestFeedbackOptions>;\n  private readonly httpClient: HttpClient;\n\n  private readonly autoFeedback: AutoFeedback | undefined;\n  private autoFeedbackInit: Promise<void> | undefined;\n  private readonly enableLiveFlagUpdates: boolean;\n  private readonly eventSourceFactory: EventSourceFactory | undefined;\n  private readonly credentials: RequestCredentials | undefined;\n  private readonly sdkVersion: string;\n  private pubSubChannel: AblySSEChannel | undefined;\n  private pubSubInit: Promise<void> | undefined;\n  private latestFlagStateVersionSeen: number | undefined;\n  private readonly flagsClient: FlagsClient;\n  private readonly bulkQueue: BulkQueue | undefined;\n  private readonly handleBeforeUnload?: () => void;\n\n  public readonly logger: Logger;\n\n  private readonly hooks: HooksManager;\n\n  private toolbarToggleShown = false;\n\n  /**\n   * Create a new ReflagClient instance.\n   */\n  constructor(opts: InitOptions) {\n    this.publishableKey = opts.publishableKey;\n    this.logger =\n      opts?.logger ?? loggerWithPrefix(quietConsoleLogger, \"[Reflag]\");\n\n    // Create the context object making sure to clone the user and company objects\n    this.context = normalizeContext(\n      opts?.bootstrappedState?.context ?? {\n        user: opts?.user,\n        company: opts?.company,\n        otherContext: opts?.otherContext,\n        other: opts?.other,\n      },\n    );\n\n    const apiBaseUrl = opts?.apiBaseUrl ?? defaultConfig.apiBaseUrl;\n\n    this.config = {\n      apiBaseUrl,\n      appBaseUrl: opts?.appBaseUrl ?? defaultConfig.appBaseUrl,\n      sseBaseUrl: opts?.sseBaseUrl ?? apiBaseUrl,\n      enableTracking: opts?.enableTracking ?? defaultConfig.enableTracking,\n      offline: opts?.offline ?? defaultConfig.offline,\n      bootstrapped:\n        !!opts?.bootstrappedState ||\n        (opts && \"bootstrappedFlags\" in opts && !!opts.bootstrappedFlags),\n    };\n\n    const requestedEnableLiveFlagUpdates = opts?.enableLiveFlagUpdates ?? false;\n    const hasBootstrappedFlagStateVersion = isValidFlagStateVersion(\n      opts?.bootstrappedState?.flagStateVersion,\n    );\n    const bootstrappedWithoutFlagStateVersion =\n      (!!opts?.bootstrappedState && !hasBootstrappedFlagStateVersion) ||\n      (!!opts && \"bootstrappedFlags\" in opts && !!opts.bootstrappedFlags);\n\n    if (requestedEnableLiveFlagUpdates && bootstrappedWithoutFlagStateVersion) {\n      this.logger.warn(\n        \"Live flag updates require `flagStateVersion` when bootstrapping flags. Disabling live flag updates for this client. Upgrade your server SDK (for example `@reflag/node-sdk`) so the bootstrap payload includes `flagStateVersion`, or set `enableLiveFlagUpdates` to `false` when using unversioned bootstrap data.\",\n      );\n    }\n\n    this.enableLiveFlagUpdates =\n      requestedEnableLiveFlagUpdates && !bootstrappedWithoutFlagStateVersion;\n    this.eventSourceFactory = opts?.eventSourceFactory;\n    this.credentials = opts?.credentials;\n    this.sdkVersion = opts?.sdkVersion ?? SDK_VERSION;\n\n    this.requestFeedbackOptions = {\n      position: opts?.feedback?.ui?.position,\n      translations: opts?.feedback?.ui?.translations,\n    };\n\n    this.httpClient = new HttpClient(this.publishableKey, {\n      baseUrl: this.config.apiBaseUrl,\n      sdkVersion: this.sdkVersion,\n      credentials: opts?.credentials,\n    });\n    if (!this.config.offline && this.config.enableTracking) {\n      this.bulkQueue = new BulkQueue(\n        (events) =>\n          this.httpClient.post({\n            path: \"/bulk\",\n            body: events,\n            keepalive: true,\n          }),\n        {\n          flushDelayMs: opts.trackingQueue?.flushDelayMs,\n          maxSize: opts.trackingQueue?.maxSize,\n          logger: this.logger,\n        },\n      );\n    }\n    if (this.bulkQueue && !IS_SERVER) {\n      this.handleBeforeUnload = () => {\n        void this.bulkQueue?.flush();\n      };\n      window.addEventListener(\"beforeunload\", this.handleBeforeUnload, {\n        capture: true,\n      });\n    }\n\n    const bulkQueue = this.bulkQueue;\n\n    this.flagsClient = new FlagsClient(\n      this.httpClient,\n      this.context,\n      this.logger,\n      {\n        bootstrappedState: opts.bootstrappedState\n          ? {\n              flags: opts.bootstrappedState.flags,\n              flagStateVersion: opts.bootstrappedState.flagStateVersion,\n            }\n          : opts.bootstrappedFlags\n            ? { flags: opts.bootstrappedFlags }\n            : undefined,\n        bootstrappedFlags: opts.bootstrappedFlags,\n        expireTimeMs: opts.expireTimeMs,\n        staleTimeMs: opts.staleTimeMs,\n        staleWhileRevalidate: opts.staleWhileRevalidate,\n        timeoutMs: opts.timeoutMs,\n        fallbackFlags: opts.fallbackFlags,\n        offline: this.config.offline,\n        storage: opts.storage,\n        enqueueBulkEvent: bulkQueue\n          ? (event) => bulkQueue.enqueue(event)\n          : undefined,\n      },\n    );\n\n    if (\n      !this.config.offline &&\n      this.context?.user &&\n      !isNode && // do not prompt on server-side\n      opts?.feedback?.enableAutoFeedback !== false // default to on\n    ) {\n      if (isMobile) {\n        this.logger.warn(\n          \"Feedback prompting is not supported on mobile devices\",\n        );\n      } else {\n        this.autoFeedback = new AutoFeedback(\n          this.config.sseBaseUrl,\n          this.logger,\n          this.httpClient,\n          opts?.feedback?.autoFeedbackHandler,\n          String(this.context.user?.id),\n          opts?.feedback?.ui?.position,\n          opts?.feedback?.ui?.translations,\n          bulkQueue ? (event) => bulkQueue.enqueue(event) : undefined,\n          this.credentials,\n        );\n      }\n    }\n\n    if (shouldShowToolbar(opts)) {\n      const position =\n        typeof opts.toolbar === \"object\" ? opts.toolbar.position : undefined;\n      this.showToolbarToggle(position);\n    }\n\n    // Register hooks\n    this.hooks = new HooksManager();\n    this.flagsClient.onUpdated(() => {\n      this.hooks.trigger(\"flagsUpdated\", this.flagsClient.getFlags());\n    });\n    this.flagsClient.onOptInFlagsLoadingUpdated((isLoading) => {\n      this.hooks.trigger(\"optInFlagsLoadingUpdated\", isLoading);\n    });\n  }\n\n  /**\n   * Initialize the Reflag SDK.\n   *\n   * Must be called before calling other SDK methods.\n   */\n  async initialize() {\n    if (this.state === \"initializing\" || this.state === \"initialized\") {\n      this.logger.warn(`\"Reflag client already ${this.state}`);\n      return;\n    }\n    this.setState(\"initializing\");\n\n    const start = Date.now();\n    const wantsPubSub = this.wantsPubSub();\n    const hasPubSubTransport = this.hasPubSubTransport();\n\n    if (!this.config.offline && wantsPubSub && !hasPubSubTransport) {\n      this.logger.debug(\n        \"skipping pubsub initialization because this runtime has no browser EventSource transport\",\n      );\n    }\n\n    await this.flagsClient.initialize();\n\n    // Open SSE after the initial flag load. The pubsub server replays the\n    // latest flag-update message, including `flagStateVersion`, so\n    // `reconcileFlagsWithLatestPubSubVersion()` below can catch up if an update\n    // lands between the fetch and the SSE subscription.\n    if (!this.config.offline && wantsPubSub && hasPubSubTransport) {\n      // do not block on pubsub initialization\n      this.logger.debug(\"initializing pubsub\");\n      this.pubSubInit = this.initializePubSub().catch((e) => {\n        this.logger.error(\"error initializing pubsub\", e);\n      });\n    }\n    this.reconcileFlagsWithLatestPubSubVersion();\n\n    if (!this.config.bootstrapped) {\n      if (this.context.user && this.config.enableTracking) {\n        this.user().catch((e) => {\n          this.logger.error(\"error sending user\", e);\n        });\n      }\n\n      if (this.context.company && this.config.enableTracking) {\n        this.company().catch((e) => {\n          this.logger.error(\"error sending company\", e);\n        });\n      }\n    }\n\n    this.logger.info(\n      \"Reflag initialized in \" +\n        Math.round(Date.now() - start) +\n        \"ms\" +\n        (this.config.offline ? \" (offline mode)\" : \"\"),\n    );\n    this.initializationFinished = true;\n    this.setState(\"initialized\");\n  }\n\n  /**\n   * Stop the SDK.\n   * This will stop any automated feedback surveys.\n   *\n   **/\n  async stop() {\n    if (this.handleBeforeUnload && !IS_SERVER) {\n      window.removeEventListener(\"beforeunload\", this.handleBeforeUnload, {\n        capture: true,\n      });\n    }\n\n    if (this.bulkQueue) {\n      await this.bulkQueue.flush();\n      let remaining = await this.bulkQueue.size();\n      if (remaining > 0) {\n        await this.bulkQueue.flush();\n        remaining = await this.bulkQueue.size();\n      }\n      if (remaining > 0) {\n        throw new Error(\n          `failed to flush all queued bulk events during stop (${remaining} remaining)`,\n        );\n      }\n    }\n\n    if (this.autoFeedback && this.autoFeedbackInit) {\n      // ensure fully initialized before stopping\n      await this.autoFeedbackInit;\n      this.autoFeedback.stop();\n    }\n\n    if (this.pubSubInit) {\n      // ensure fully initialized before stopping\n      await this.pubSubInit;\n    }\n    if (this.pubSubChannel) {\n      this.pubSubChannel.close();\n      this.pubSubChannel = undefined;\n    }\n\n    this.flagsClient.stop();\n    this.setState(\"stopped\");\n  }\n\n  getState() {\n    return this.state;\n  }\n\n  /**\n   * Add an event listener\n   *\n   * @param type Type of events to listen for\n   * @param handler The function to call when the event is triggered.\n   * @returns A function to remove the hook.\n   */\n  on<THookType extends keyof HookArgs>(\n    type: THookType,\n    handler: (args0: HookArgs[THookType]) => void,\n  ) {\n    return this.hooks.addHook(type, handler);\n  }\n\n  /**\n   * Remove an event listener\n   *\n   * @param type Type of event to remove.\n   * @param handler The same function that was passed to `on`.\n   *\n   * @returns A function to remove the hook.\n   */\n  off<THookType extends keyof HookArgs>(\n    type: THookType,\n    handler: (args0: HookArgs[THookType]) => void,\n  ) {\n    this.hooks.removeHook(type, handler);\n  }\n\n  /**\n   * Get the current context.\n   */\n  getContext() {\n    return this.context;\n  }\n\n  /**\n   * Get the current configuration.\n   */\n  getConfig() {\n    return this.config;\n  }\n\n  /**\n   * Update the user context.\n   * Performs a shallow merge with the existing user context.\n   * It will not update the context if nothing has changed.\n   *\n   * @param user\n   */\n  async updateUser(user: { [key: string]: string | number | undefined }) {\n    const newUserContext = {\n      ...this.context.user,\n      ...user,\n      id: user.id ?? this.context.user?.id,\n    };\n\n    return this.applyContext(\n      {\n        user: newUserContext,\n        company: this.context.company,\n        other: this.context.other,\n      },\n      { warnOnMissingIds: false },\n    );\n  }\n\n  /**\n   * Update the company context.\n   * Performs a shallow merge with the existing company context.\n   * It will not update the context if nothing has changed.\n   *\n   * @param company The company details.\n   */\n  async updateCompany(company: { [key: string]: string | number | undefined }) {\n    const newCompanyContext = {\n      ...this.context.company,\n      ...company,\n      id: company.id ?? this.context.company?.id,\n    };\n\n    return this.applyContext(\n      {\n        user: this.context.user,\n        company: newCompanyContext,\n        other: this.context.other,\n      },\n      { warnOnMissingIds: false },\n    );\n  }\n\n  /**\n   * Update the company context.\n   * Performs a shallow merge with the existing company context.\n   * It will not update the context if nothing has changed.\n   *\n   * @param otherContext Additional context.\n   */\n  async updateOtherContext(otherContext: {\n    [key: string]: string | number | undefined;\n  }) {\n    const newOtherContext = {\n      ...this.context.other,\n      ...otherContext,\n    };\n\n    return this.applyContext(\n      {\n        user: this.context.user,\n        company: this.context.company,\n        other: newOtherContext,\n      },\n      { warnOnMissingIds: false },\n    );\n  }\n\n  /**\n   * Update the context.\n   * Replaces the existing context with a new context.\n   *\n   * @param context The context to update.\n   */\n  async setContext(context: ReflagDeprecatedContext) {\n    return this.applyContext(context, { warnOnMissingIds: true });\n  }\n\n  private async applyContext(\n    context: ReflagDeprecatedContext,\n    { warnOnMissingIds }: { warnOnMissingIds: boolean },\n  ) {\n    const previousContext = this.context;\n    const newContext = normalizeContext(context);\n\n    if (warnOnMissingIds && !context.user?.id) {\n      this.logger.warn(\"No user Id provided in context, user will be ignored\");\n    }\n    if (warnOnMissingIds && !context.company?.id) {\n      this.logger.warn(\n        \"No company Id provided in context, company will be ignored\",\n      );\n    }\n\n    // Nothing has changed, skipping update\n    if (deepEqual(previousContext, newContext)) return;\n\n    const userChanged = !deepEqual(previousContext.user, newContext.user);\n    const companyChanged = !deepEqual(\n      previousContext.company,\n      newContext.company,\n    );\n    const userIdChanged =\n      !!newContext.user?.id && newContext.user.id !== previousContext.user?.id;\n\n    this.context = newContext;\n\n    let shouldFlushIdentityUpdate = false;\n\n    if (companyChanged) {\n      void this.company();\n      shouldFlushIdentityUpdate = true;\n    }\n\n    if (userChanged) {\n      void this.user();\n      shouldFlushIdentityUpdate = true;\n      // Update the automatic feedback user if the user ID has changed\n      if (userIdChanged) {\n        void this.updateAutoFeedbackUser(String(newContext.user!.id));\n      }\n    }\n\n    if (shouldFlushIdentityUpdate) {\n      void this.bulkQueue?.flush();\n    }\n\n    const shouldTrackLoading = this.state === \"initialized\";\n    if (shouldTrackLoading) {\n      this.contextUpdateLoading = true;\n      this.setState(\"initializing\");\n    }\n\n    const didApply = await this.flagsClient.setContext(this.context);\n    if (didApply) {\n      this.finishContextUpdate();\n    }\n  }\n\n  applyBootstrappedState(\n    bootstrappedState: BootstrappedState,\n    triggerEvent = true,\n  ) {\n    const previousContext = this.context;\n    const newContext = normalizeContext(bootstrappedState.context);\n\n    const contextChanged = !deepEqual(previousContext, newContext);\n    const userChanged = !deepEqual(previousContext.user, newContext.user);\n    const companyChanged = !deepEqual(\n      previousContext.company,\n      newContext.company,\n    );\n    const userIdChanged =\n      !!newContext.user?.id && newContext.user.id !== previousContext.user?.id;\n\n    const currentFlagStateVersion = this.flagsClient.getFlagStateVersion();\n    const latestKnownFlagStateVersion = Math.max(\n      currentFlagStateVersion ?? -1,\n      this.latestFlagStateVersionSeen ?? -1,\n    );\n    if (latestKnownFlagStateVersion >= 0) {\n      this.latestFlagStateVersionSeen = latestKnownFlagStateVersion;\n    }\n\n    const incomingFlagStateVersion = bootstrappedState.flagStateVersion;\n    if (isValidFlagStateVersion(incomingFlagStateVersion)) {\n      this.latestFlagStateVersionSeen = Math.max(\n        this.latestFlagStateVersionSeen ?? -1,\n        incomingFlagStateVersion,\n      );\n    }\n\n    const shouldIgnoreIncomingFlags =\n      !contextChanged &&\n      latestKnownFlagStateVersion >= 0 &&\n      (incomingFlagStateVersion === undefined ||\n        incomingFlagStateVersion < latestKnownFlagStateVersion);\n\n    this.context = newContext;\n    this.flagsClient.setContextWithoutFetch(\n      newContext,\n      !shouldIgnoreIncomingFlags,\n    );\n\n    if (!shouldIgnoreIncomingFlags) {\n      this.flagsClient.resetOptInMetadataRefresh();\n      this.flagsClient.setFetchedFlags(\n        bootstrappedState.flags,\n        triggerEvent,\n        incomingFlagStateVersion,\n      );\n      this.flagsClient.markBootstrappedStateApplied();\n    }\n\n    if (contextChanged) {\n      this.finishContextUpdate();\n    }\n\n    if (!contextChanged) {\n      return;\n    }\n\n    if (companyChanged) {\n      void this.company();\n    }\n\n    if (userChanged) {\n      void this.user();\n      if (userIdChanged) {\n        void this.updateAutoFeedbackUser(String(newContext.user!.id));\n      }\n    }\n\n    this.reconcileFlagsWithLatestPubSubVersion();\n  }\n\n  /**\n   * Update the flags.\n   *\n   * @param flags The flags to update.\n   * @param triggerEvent Whether to trigger the `flagsUpdated` event.\n   */\n  updateFlags(flags: RawFlags, triggerEvent = true, flagStateVersion?: number) {\n    this.flagsClient.setFetchedFlags(flags, triggerEvent, flagStateVersion);\n  }\n\n  /**\n   * Track an event in Reflag.\n   *\n   * @param eventName The name of the event.\n   * @param attributes Any attributes you want to attach to the event.\n   */\n  async track(\n    eventName: string,\n    attributes?: Record<string, any> | null,\n  ): Promise<Response | undefined> {\n    if (!this.context.user) {\n      this.logger.warn(\"'track' call ignored. No user context provided\");\n      return;\n    }\n    if (!this.config.enableTracking) {\n      this.logger.warn(\"'track' call ignored. 'enableTracking' is false\");\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n\n    const payload: TrackedEvent = {\n      userId: String(this.context.user.id),\n      event: eventName,\n    };\n    if (attributes) payload.attributes = attributes;\n    if (this.context.company?.id)\n      payload.companyId = String(this.context.company?.id);\n\n    const res = await this.httpClient.post({ path: \"/event\", body: payload });\n    if (!res.ok) {\n      await logResponseError({\n        logger: this.logger,\n        res,\n        message: \"track request failed\",\n        extra: { event: eventName },\n      });\n    }\n    this.logger.debug(`sent event`, payload);\n\n    this.hooks.trigger(\"track\", {\n      eventName,\n      attributes,\n      user: this.context.user,\n      company: this.context.company,\n    });\n    return res;\n  }\n\n  /**\n   * Submit user feedback to Reflag. Must include either `score` or `comment`, or both.\n   *\n   * @param payload The feedback details to submit.\n   * @returns The server response.\n   */\n  async feedback(payload: Feedback) {\n    if (this.config.offline) {\n      return;\n    }\n\n    const userId =\n      payload.userId ||\n      (this.context.user?.id ? String(this.context.user?.id) : undefined);\n\n    const companyId =\n      payload.companyId ||\n      (this.context.company?.id ? String(this.context.company?.id) : undefined);\n\n    return await feedback(this.httpClient, this.logger, {\n      userId,\n      companyId,\n      ...payload,\n    });\n  }\n\n  /**\n   * Display the Reflag feedback form UI programmatically.\n   *\n   * This can be used to collect feedback from users in Reflag in cases where Automated Feedback Surveys isn't appropriate.\n   *\n   * @param options\n   */\n  requestFeedback(options: RequestFeedbackData) {\n    if (!this.context.user?.id) {\n      this.logger.error(\n        \"`requestFeedback` call ignored. No `user` context provided at initialization\",\n      );\n      return;\n    }\n\n    if (!options.flagKey) {\n      this.logger.error(\n        \"`requestFeedback` call ignored. No `flagKey` provided\",\n      );\n      return;\n    }\n\n    const feedbackData = {\n      flagKey: options.flagKey,\n      companyId:\n        options.companyId ||\n        (this.context.company?.id\n          ? String(this.context.company?.id)\n          : undefined),\n      source: \"widget\" as const,\n    } satisfies Feedback;\n\n    // Wait a tick before opening the feedback form,\n    // to prevent the same click from closing it.\n    setTimeout(() => {\n      feedbackLib.openFeedbackForm({\n        key: options.flagKey,\n        title: options.title,\n        position: options.position || this.requestFeedbackOptions.position,\n        translations:\n          options.translations || this.requestFeedbackOptions.translations,\n        openWithCommentVisible: options.openWithCommentVisible,\n        onClose: options.onClose,\n        onDismiss: options.onDismiss,\n        onScoreSubmit: async (data) => {\n          const res = await this.feedback({\n            ...feedbackData,\n            ...data,\n          });\n\n          if (res) {\n            const json = await res.json();\n            return { feedbackId: json.feedbackId };\n          }\n          return { feedbackId: undefined };\n        },\n        onSubmit: async (data) => {\n          // Default onSubmit handler\n          await this.feedback({\n            ...feedbackData,\n            ...data,\n          });\n\n          options.onAfterSubmit?.(data);\n        },\n      });\n    }, 1);\n  }\n\n  /**\n   * @deprecated Use `getFlags` instead.\n   */\n  getFeatures() {\n    return this.getFlags();\n  }\n\n  /**\n   * Returns a map of enabled flags.\n   * Accessing a flag will *not* send a check event\n   * and `isEnabled` does not take any flag overrides\n   * into account.\n   *\n   * @returns Map of flags.\n   */\n  getFlags(): RawFlags {\n    return this.flagsClient.getFlags();\n  }\n\n  /**\n   * Force refresh flags from the API, bypassing cache.\n   */\n  refresh() {\n    return this.flagsClient.refreshFlags();\n  }\n\n  /**\n   * Returns opt-in-enabled flags for the current context.\n   */\n  getOptInFlags(): OptInFlag[] {\n    this.flagsClient.requestOptInFlags();\n\n    return Object.values(this.getFlags()).flatMap((flag) => {\n      if (flag.optInEnabled !== true || !flag.optIn) return [];\n\n      return {\n        key: flag.key,\n        name: flag.optIn.name,\n        description: flag.optIn.description,\n        isEnabled: flag.isEnabledOverride ?? flag.isEnabled,\n        userOptedIn: flag.optIn.userOptedIn,\n        companyOptedIn: flag.optIn.companyOptedIn,\n        isOptedIn: flag.optIn.isOptedIn,\n      } satisfies OptInFlag;\n    });\n  }\n\n  /**\n   * Returns whether opt-in flags are loading for the current context.\n   *\n   * Calling this method requests opt-in metadata if it is not already available.\n   */\n  getIsLoadingOptInFlags(): boolean {\n    this.flagsClient.requestOptInFlags();\n    return this.flagsClient.getIsLoadingOptInFlags();\n  }\n\n  /**\n   * Set whether the current user or company has opted into a flag.\n   *\n   * A successful Response is returned after the refreshed flag state confirms\n   * the membership change. HTTP failures return a non-OK Response without\n   * refreshing flags. Offline mode, invalid arguments, or missing scoped context\n   * return undefined. Network and confirmation failures reject the promise;\n   * a confirmation failure may occur after membership changed remotely.\n   */\n  async setOptIn(\n    flagKey: string,\n    options: SetOptInOptions,\n  ): Promise<Response | undefined> {\n    if (this.config.offline) {\n      return;\n    }\n\n    if (typeof flagKey !== \"string\" || !flagKey) {\n      this.logger.error(\"`setOptIn` call ignored. No `flagKey` provided\");\n      return;\n    }\n\n    if (!options || typeof options.optedIn !== \"boolean\") {\n      this.logger.error(\"`setOptIn` call ignored. `optedIn` must be a boolean\");\n      return;\n    }\n\n    const scope = options.scope ?? \"user\";\n    if (scope !== \"user\" && scope !== \"company\") {\n      this.logger.error(\n        '`setOptIn` call ignored. `scope` must be \"user\" or \"company\"',\n      );\n      return;\n    }\n\n    const scopedContext = this.context[scope];\n    if (!scopedContext?.id) {\n      this.logger.error(\n        `\\`setOptIn\\` call ignored. No \\`${scope}\\` context provided`,\n      );\n      return;\n    }\n\n    const failConfirmation = (message: string): never => {\n      const error = new Error(message);\n      this.logger.error(\"set opt-in confirmation failed\", error);\n      throw error;\n    };\n\n    const scopedContextId = String(scopedContext.id);\n    const assertScopedContextUnchanged = () => {\n      const currentScopedContext = this.context[scope];\n      if (\n        currentScopedContext?.id &&\n        String(currentScopedContext.id) === scopedContextId\n      ) {\n        return;\n      }\n\n      failConfirmation(\n        `Opt-in changed remotely, but the ${scope} context changed before the updated state could be confirmed`,\n      );\n    };\n\n    const context = {\n      user: this.context.user\n        ? { ...this.context.user, id: String(this.context.user.id) }\n        : undefined,\n      company: this.context.company\n        ? { ...this.context.company, id: String(this.context.company.id) }\n        : undefined,\n      other: this.context.other,\n    };\n\n    const res = await this.httpClient.post({\n      path: \"/flags/opt-in\",\n      body: {\n        key: flagKey,\n        optedIn: options.optedIn,\n        scope,\n        context,\n      },\n    });\n\n    if (!res.ok) {\n      await logResponseError({\n        logger: this.logger,\n        res: res.clone(),\n        message: \"set opt-in request failed\",\n        extra: { flagKey, optedIn: options.optedIn, scope },\n      });\n      return res;\n    }\n\n    let flagStateVersion: number;\n    try {\n      const body = await res.clone().json();\n      if (!isValidFlagStateVersion(body?.flagStateVersion)) {\n        throw new Error(\"Response did not include a valid flag state version\");\n      }\n      flagStateVersion = body.flagStateVersion;\n    } catch (error) {\n      this.logger.error(\n        \"set opt-in succeeded but its flag state version could not be read\",\n        error,\n      );\n      throw error;\n    }\n\n    assertScopedContextUnchanged();\n    const refreshedFlags =\n      await this.flagsClient.refreshFlags(flagStateVersion);\n    assertScopedContextUnchanged();\n    if (!refreshedFlags) {\n      failConfirmation(\n        \"Opt-in changed remotely, but the updated flag state could not be confirmed\",\n      );\n    }\n\n    const refreshedOptIn = this.flagsClient.getFetchedFlags()[flagKey]?.optIn;\n    const scopedOptIn =\n      scope === \"user\"\n        ? refreshedOptIn?.userOptedIn\n        : refreshedOptIn?.companyOptedIn;\n    const isConfirmed = options.optedIn\n      ? scopedOptIn === true\n      : scopedOptIn !== true;\n    if (!isConfirmed) {\n      failConfirmation(\n        `Opt-in changed remotely, but the updated ${scope} membership was not reflected in the SDK`,\n      );\n    }\n\n    return res;\n  }\n\n  /**\n   * @deprecated Use `getFlag` instead.\n   */\n  getFeature(flagKey: string) {\n    return this.getFlag(flagKey);\n  }\n\n  /**\n   * Return a flag. Accessing `isEnabled` or `config` will automatically send a `check` event.\n   *\n   * @param flagKey - The key of the flag to get.\n   * @returns A flag.\n   */\n  getFlag(flagKey: string): Flag {\n    const f = this.getFlags()[flagKey];\n    const evaluatedBeforeInitialization =\n      !this.initializationFinished &&\n      !this.config.offline &&\n      !this.config.bootstrapped;\n\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    const value = f?.isEnabledOverride ?? f?.isEnabled ?? false;\n    const config = f?.config\n      ? {\n          key: f.config.key,\n          payload: f.config.payload,\n        }\n      : { key: undefined, payload: undefined };\n\n    return {\n      get isEnabled() {\n        self\n          .sendCheckEvent({\n            action: \"check-is-enabled\",\n            key: flagKey,\n            version: f?.targetingVersion,\n            ruleEvaluationResults: f?.ruleEvaluationResults,\n            missingContextFields: f?.missingContextFields,\n            evaluationErrors: withClientInitializationDiagnostic(\n              f?.evaluationErrors,\n              evaluatedBeforeInitialization,\n            ),\n            value,\n          })\n          .catch(() => {\n            // ignore\n          });\n        return value;\n      },\n      get config() {\n        self\n          .sendCheckEvent({\n            action: \"check-config\",\n            key: flagKey,\n            version: f?.config?.version,\n            ruleEvaluationResults: f?.config?.ruleEvaluationResults,\n            missingContextFields: f?.config?.missingContextFields,\n            evaluationErrors: withClientInitializationDiagnostic(\n              f?.config?.evaluationErrors,\n              evaluatedBeforeInitialization,\n            ),\n            value: f?.config && {\n              key: f.config.key,\n              payload: f.config.payload,\n            },\n          })\n          .catch(() => {\n            // ignore\n          });\n\n        return config;\n      },\n      track: () => this.track(flagKey),\n      requestFeedback: (\n        options: Omit<RequestFeedbackData, \"flagKey\" | \"featureId\">,\n      ) => {\n        this.requestFeedback({\n          flagKey,\n          ...options,\n        });\n      },\n      isEnabledOverride: this.flagsClient.getFlagOverride(flagKey),\n      setIsEnabledOverride(isEnabled: boolean | null) {\n        self.flagsClient.setFlagOverride(flagKey, isEnabled);\n      },\n    };\n  }\n\n  showToolbarToggle(position?: ToolbarPosition) {\n    if (this.toolbarToggleShown) {\n      return;\n    }\n    this.toolbarToggleShown = true;\n    this.logger.info(\"opening toolbar toggler\");\n\n    showToolbarToggle({\n      reflagClient: this,\n      position,\n    });\n  }\n\n  private finishContextUpdate() {\n    if (!this.contextUpdateLoading) return;\n\n    this.contextUpdateLoading = false;\n    if (this.state === \"initializing\") {\n      this.setState(\"initialized\");\n    }\n  }\n\n  private setState(state: State) {\n    this.state = state;\n    this.hooks.trigger(\"stateUpdated\", state);\n  }\n\n  private sendCheckEvent(checkEvent: CheckEvent) {\n    return this.flagsClient.sendCheckEvent(checkEvent, () => {\n      this.hooks.trigger(\"check\", checkEvent);\n    });\n  }\n\n  /**\n   * Send attributes to Reflag for the current user\n   */\n  private async user() {\n    if (!this.context.user) {\n      this.logger.warn(\n        \"`user` call ignored. No user context provided at initialization\",\n      );\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n    if (!this.config.enableTracking) {\n      return;\n    }\n    if (!this.bulkQueue) {\n      return;\n    }\n\n    const { id, ...attributes } = this.context.user;\n    const payload: BulkEvent = {\n      type: \"user\",\n      userId: String(id),\n      attributes,\n    };\n    await this.bulkQueue.enqueue(payload);\n    this.logger.debug(`queued user`, payload);\n\n    this.hooks.trigger(\"user\", this.context.user);\n    return;\n  }\n\n  /**\n   * Send attributes to Reflag for the current company.\n   */\n  private async company() {\n    if (!this.context.user) {\n      this.logger.warn(\n        \"`company` call ignored. No user context provided at initialization\",\n      );\n      return;\n    }\n\n    if (!this.context.company) {\n      this.logger.warn(\n        \"`company` call ignored. No company context provided at initialization\",\n      );\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n    if (!this.config.enableTracking) {\n      return;\n    }\n    if (!this.bulkQueue) {\n      return;\n    }\n\n    const { id, ...attributes } = this.context.company;\n    const payload: BulkEvent = {\n      type: \"company\",\n      userId: String(this.context.user.id),\n      companyId: String(id),\n      attributes,\n    };\n    await this.bulkQueue.enqueue(payload);\n    this.logger.debug(`queued company`, payload);\n    this.hooks.trigger(\"company\", this.context.company);\n    return;\n  }\n\n  private wantsPubSub() {\n    return this.enableLiveFlagUpdates || !!this.autoFeedback;\n  }\n\n  private hasPubSubTransport() {\n    return !IS_SERVER || !!this.eventSourceFactory;\n  }\n\n  private async initializePubSub() {\n    this.pubSubChannel?.close();\n    this.pubSubChannel = undefined;\n\n    this.pubSubChannel = openAblySSEChannel({\n      channels: [],\n      callback: (message) => this.handlePubSubMessage(message),\n      logger: this.logger,\n      sseBaseUrl: this.config.sseBaseUrl,\n      eventSourceFactory: this.eventSourceFactory,\n      publishableKey: this.publishableKey,\n      sdkVersion: this.sdkVersion,\n      path: \"sse/client\",\n      context: this.context,\n      credentials: this.credentials,\n    });\n  }\n\n  private handlePubSubMessage(message: PubSubMessage) {\n    const eventName =\n      typeof message.name === \"string\"\n        ? message.name\n        : typeof message.event === \"string\"\n          ? message.event\n          : undefined;\n    const payload = message.data ?? message;\n\n    const flagStateVersion = Number((payload as any)?.flagStateVersion);\n    const hasFlagStateVersion = isValidFlagStateVersion(flagStateVersion);\n\n    if (eventName === \"flags-updated\" || hasFlagStateVersion) {\n      if (!this.enableLiveFlagUpdates) {\n        return;\n      }\n\n      if (hasFlagStateVersion) {\n        this.latestFlagStateVersionSeen = Math.max(\n          this.latestFlagStateVersionSeen ?? -1,\n          flagStateVersion,\n        );\n      }\n\n      const currentVersion = this.flagsClient.getFlagStateVersion();\n      if (\n        this.state === \"initialized\" &&\n        (!hasFlagStateVersion ||\n          currentVersion === undefined ||\n          flagStateVersion > currentVersion)\n      ) {\n        void this.flagsClient\n          .refreshFlags(hasFlagStateVersion ? flagStateVersion : undefined)\n          .catch((e) => {\n            this.logger.error(\"error refreshing flags after live update\", e);\n          });\n      }\n      return;\n    }\n\n    if (this.autoFeedback && this.context.user?.id) {\n      this.autoFeedback.handleFeedbackPromptRequest(\n        String(this.context.user.id),\n        payload,\n      );\n    }\n  }\n\n  private reconcileFlagsWithLatestPubSubVersion() {\n    if (!this.enableLiveFlagUpdates) {\n      return;\n    }\n\n    const latestVersion = this.latestFlagStateVersionSeen;\n    const currentVersion = this.flagsClient.getFlagStateVersion();\n\n    if (\n      latestVersion !== undefined &&\n      (currentVersion === undefined || latestVersion > currentVersion)\n    ) {\n      void this.flagsClient.refreshFlags(latestVersion).catch((e) => {\n        this.logger.error(\n          \"error refreshing flags after pubsub version reconciliation\",\n          e,\n        );\n      });\n    }\n  }\n\n  private async updateAutoFeedbackUser(userId: string) {\n    if (!this.autoFeedback) {\n      return;\n    }\n\n    if (this.pubSubInit) {\n      await this.pubSubInit;\n      this.autoFeedback.setUserId(userId);\n      this.pubSubInit = this.initializePubSub().catch((e) => {\n        this.logger.error(\"error reinitializing pubsub\", e);\n      });\n      await this.pubSubInit;\n      return;\n    }\n\n    // Ensure fully initialized before updating the user\n    await this.autoFeedbackInit;\n    await this.autoFeedback.setUser(userId);\n  }\n}\n"],"names":["getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","a","b","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","result","getStrictProperties","object","hasOwn","property","sameValueZeroEqual","PREACT_VNODE","PREACT_OWNER","REACT_OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","index","areDatesEqual","areErrorsEqual","areFunctionsEqual","areMapsEqual","size","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","matchIndex","aEntry","bEntry","areNumbersEqual","areObjectsEqual","properties","isPropertyEqual","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","areUrlsEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","ERROR_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","URL_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","_a","type","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","_b","meta","deepEqual","createCustomEqual","options","createCustomInternalComparator","API_BASE_URL","APP_BASE_URL","SDK_VERSION_HEADER_NAME","SDK_VERSION","version","FLAG_EVENTS_PER_MIN","FLAGS_EXPIRE_MS","BULK_QUEUE_MAX_SIZE","BULK_QUEUE_FLUSH_DELAY_MS","IS_SERVER","MAX_RESPONSE_BODY_PREVIEW_CHARS","isObject","value","extractApiError","topLevelCode","topLevelMessage","error","parseResponseErrorDetails","res","body","apiErrorCode","apiErrorMessage","parsed","parsedError","formatResponseErrorSummary","details","parseResponseError","errorDetails","errorSummary","logResponseError","args","logger","level","message","extra","DROP_ERROR_THROTTLE_MS","BulkQueue","sendBulk","opts","event","maxPending","batch","sendPromise","delayMs","removed","now","canonicalJSONStringify","serialized","_key","nestedValue","left","right","isPlainObjectWithoutToJSON","prototype","pruneUndefinedObjectValues","ancestors","entries","key","originalKeys","pruned","canonicalContextJSONStringify","context","section","quietConsoleLogger","_","loggerWithPrefix","prefix","AblySSEChannel","channels","sseBaseUrl","messageHandler","eventSourceFactory","publishableKey","sdkVersion","path","credentials","payload","connectionState","url","serializedContext","e","m","retryInterval","retryCount","retriesRemaining","tryConnect","openAblySSEChannel","channel","callback","subscribedChannels","sse","delay","ms","resolve","retryOnThrow","retryDelaysMs","operation","lastError","attempt","target","i","source","defaultConverter","init","converter","defaultAttributes","set","name","attributes","stringifiedAttributes","attributeName","get","cookies","jar","parts","found","api","markPromptMessageCompleted","userId","promptId","expiresAt","Cookies","checkPromptMessageCompleted","parsePromptMessage","processPromptMessage","prompt","displayHandler","completionHandler","n","l","u","o","r","f","c","s","h","p","v","y","d","w","t","g","k","x","C","M","P","O","j","S","$","N","I","L","V","T","A","F","H","q","z","B","feedbackContainerId","toolbarContainerId","propagatedEvents","D","min","max","round","floor","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","start","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","side","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","list","expandPaddingObject","padding","getPaddingObject","rectToClientRect","rect","width","height","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","fn","nextX","nextY","data","reset","detectOverflow","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","element","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","offset","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","_overflowsData$filter2","currentSideAxis","acc","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","selector","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getCssDimensions","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","top","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","scroll","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","isStaticPositioned","getTrueOffsetParent","polyfill","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","observeMove","onMove","io","timeoutId","root","cleanup","_io","refresh","skip","threshold","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","ratio","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","isRef","arrowCore","getDPR","roundByDPR","dpr","useLatestRef","ref","useRef","useLayoutEffect","useFloating","externalReference","externalFloating","transform","whileElementsMounted","open","setData","useState","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","useCallback","referenceRef","setFloating","floatingRef","floatingEl","dataRef","whileElementsMountedRef","platformRef","positionData","fullData","isMountedRef","refs","useMemo","floatingStyles","initialStyles","stopPropagation","attachContainer","containerId","container","parseOffset","offsetInput","parseUnanchoredPosition","position","offsetY","offsetX","useDialog","onClose","onOpen","initialValue","isOpen","setIsOpen","close","toggle","prev","Dialog","onDismiss","children","showArrow","arrowRef","dialogRef","anchor","actualPlacement","unanchoredPosition","dismiss","useEffect","escapeHandler","clickOutsideHandler","observer","mutations","mutation","setDiagRef","isPopoverOpen","isModalOpen","classes","Fragment","styles","DialogArrow","arrowData","arrowX","arrowY","staticSide","arrowStyles","DialogHeader","innerRef","DialogContent","Close","props","DEFAULT_TRANSLATIONS","Check","CheckCircle","Button","variant","rest","Logo","Plug","Dissatisfied","Neutral","Satisfied","VeryDissatisfied","VerySatisfied","scores","StarRating","selectedValue","onChange","bg","color","score","Score","isSelected","ANIMATION_SPEED","getFeedbackDataFromForm","formData","FeedbackForm","question","scoreState","openWithCommentVisible","onInteraction","onSubmit","onScoreSubmit","hasRating","setHasRating","status","setStatus","setError","showForm","setShowForm","handleSubmit","err","containerRef","formRef","headerRef","expandedContentRef","submittedRef","transitionToDefault","transitionToExpanded","transitionToSuccess","ScoreStatus","loadingTimeElapsed","setLoadingTimeElapsed","hasBeenSubmitted","setHasBeenSubmitted","timer","showIdle","showLoading","showSubmitted","useTimer","initialDuration","enabled","onEnd","stopped","setStopped","duration","setDuration","startTime","setStartTime","currentTime","setCurrentTime","stop","startWithDuration","nextDuration","endTime","elapsedFraction","RadialProgress","diameter","progress","radius","circumference","filled","INACTIVE_DURATION_MS","SUCCESS_DURATION_MS","FeedbackDialog","title","translations","feedbackId","setFeedbackId","setScoreState","autoClose","submit","submitScore","DEFAULT_POSITION","supportsPopoverApi","attachDialogContainer","openInstances","openFeedbackForm","shadowRoot","render","INITIAL_FETCH_RETRY_DELAYS_MS","createDefaultFeedbackPromptHandler","_prompt","handlers","feedback","httpClient","featureId","flagKey","feedbackPayload","AutoFeedback","feedbackPromptHandler","feedbackTranslations","enqueueBulkEvent","cb","replyCallback","reply","response","feedbackLib.openFeedbackForm","oneMinute","RateLimiter","eventsPerMinute","func","events","checkIsSecurityError","createNoopStorageAdapter","getItem","setItem","removeItem","getLocalStorageAdapter","getDefaultStorageAdapter","createAbortController","aborted","listeners","_type","listener","SimpleEventTarget","bucket","signal","onAbort","createEventTarget","isValidFlagStateVersion","DEFAULT_STORAGE_KEY","parseOptIn","optIn","isEvaluationErrorArray","parseAPIFlagsResponse","flagsInput","flags","flag","FlagCache","storage","staleTimeMs","expireTimeMs","flagStateVersion","cacheData","cachedResponseRaw","validateCacheData","_k","cachedResponse","cacheDataInput","cacheEntry","item","DEFAULT_FLAGS_CONFIG","validateFlagsResponse","storageOverridesKey","REFRESH_LIMIT_COUNT","REFRESH_LIMIT_WINDOW_MS","FlagsClient","bootstrappedState","bootstrappedFlags","rateLimiter","fallbackFlags","initializationSucceeded","cachedOverrides","requestContextVersion","contextVersion","pendingRefresh","loadingGeneration","id","promise","invalidatePendingFetches","fetchedFlags","triggerEvent","requestVersion","updatedFlags","isEnabled","checkEvent","rateLimitKey","waitForVersion","params","fallbackBody","parsedSummary","typeRes","timestamp","overrides","overridesStored","cacheKey","cachedItem","override","generation","isLoading","mergedFlags","fetchedFlag","isEnabledOverride","contextJson","_c","report","HooksManager","hook","arg","KEEPALIVE_MAX_IN_FLIGHT_BYTES","KEEPALIVE_MAX_IN_FLIGHT_REQUESTS","getBodyByteLength","HttpClient","timeoutMs","query","pathWithQuery","controller","keepalive","serializedBody","bodyBytes","shouldUseKeepalive","gutter","Switch","checked","isFound","searchQuery","FlagsTable","appBaseUrl","setIsEnabledOverride","hasFlags","hasShownFlags","searchedFlags","aMatches","bMatches","aStartsWith","bStartsWith","FlagRow","setEnabledOverride","isNotVisible","Reset","isChecked","FlagSearch","onSearch","TOOLBAR_HIDE_KEY","Toolbar","reflagClient","toggleToolbarRef","dialogContentRef","setFlags","wasHidden","isHidden","setIsHidden","updateFlags","rawFlags","hasAnyOverrides","search","setSearch","val","sortedFlags","hideToolbar","ToolbarToggle","onClick","toggleClasses","indicatorClasses","DEFAULT_PLACEMENT","showToolbarToggle","isMobile","normalizeContext","otherContext","defaultConfig","CLIENT_NOT_INITIALIZED_EVALUATION_ERROR","withClientInitializationDiagnostic","errors","evaluatedBeforeInitialization","shouldShowToolbar","toolbarOpts","ReflagClient","_d","_e","_f","_g","_h","_i","_j","_l","_m","_n","_o","_p","apiBaseUrl","requestedEnableLiveFlagUpdates","hasBootstrappedFlagStateVersion","bootstrappedWithoutFlagStateVersion","bulkQueue","wantsPubSub","hasPubSubTransport","remaining","handler","user","newUserContext","company","newCompanyContext","newOtherContext","warnOnMissingIds","previousContext","newContext","userChanged","companyChanged","userIdChanged","shouldFlushIdentityUpdate","contextChanged","currentFlagStateVersion","latestKnownFlagStateVersion","incomingFlagStateVersion","shouldIgnoreIncomingFlags","eventName","companyId","feedbackData","scope","scopedContext","failConfirmation","scopedContextId","assertScopedContextUnchanged","currentScopedContext","refreshedFlags","refreshedOptIn","scopedOptIn","self","hasFlagStateVersion","currentVersion","latestVersion"],"mappings":"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","x_google_ignoreList":[0,8,11,13,14,15,16,17]}