{"version":3,"sources":["/home/runner/work/react-enable/react-enable/dist/index.cjs","../src/utils.ts","../src/EnableContext.tsx","../src/useAllDisabled.tsx","../src/useDisabled.tsx","../src/Disable.tsx","../src/useAllEnabled.tsx","../src/useEnabled.tsx","../src/Enable.tsx","../src/Features.tsx","../src/FeatureContext.tsx","../src/FeatureState.tsx","../src/FeaturesState.tsx","../src/useConsoleOverride.tsx","../src/GlobalEnable.tsx","../src/usePersist.tsx","../src/useTestCallback.tsx","../src/rolloutHash.tsx","../src/testFeature.tsx","../src/ToggleFeatures.tsx","../src/tailwind.css"],"names":["jsx","Fragment","createContext","testFeature","useMemo","useEffect","useContext"],"mappings":"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","file":"/home/runner/work/react-enable/react-enable/dist/index.cjs","sourcesContent":[null,"import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n  input?: string[] | string | null,\n): [EnableContextType, string[]] {\n  const test = useContext(EnableContext);\n\n  // We memoize just to prevent re-renders since this could be at the leaf of a tree\n  const converted = useMemo(\n    () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n    [input],\n  );\n\n  return [test, converted];\n}\n","import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext<EnableContextType>((_s) => false);\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n  const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n  return (\n    withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n  );\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n  const [test, queryAnyWithout] = useTestAndConvert(without);\n  return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC<EnableProps> = ({\n  feature = [],\n  allFeatures = [],\n  children,\n}) => {\n  const isAny = useDisabled(feature);\n  const isAll = useAllDisabled(allFeatures);\n\n  if (isAny || isAll) {\n    return <>{children}</>;\n  }\n\n  return null;\n};\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n  const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n  return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n  const [test, queryAnyPresent] = useTestAndConvert(feature);\n  return queryAnyPresent.some(test);\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n  readonly feature?: string[] | string;\n  readonly allFeatures?: string[];\n  children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n  feature = [],\n  allFeatures = [],\n  children,\n}: EnableProps): JSX.Element | null {\n  const isAny = useEnabled(feature);\n  const isAll = useAllEnabled(allFeatures);\n\n  if (isAny || isAll) {\n    return <>{children}</>;\n  }\n\n  return null;\n}\n","import {\n  type ReactNode,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useReducer,\n  useRef,\n} from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\nconst ROLLOUT_ID_KEY = 'react-enable:rollout-stable-id';\n\ninterface FeatureProps {\n  readonly features: readonly FeatureDescription[];\n  readonly children?: ReactNode;\n  readonly disableConsole?: boolean;\n  readonly storage?: Storage;\n\n  /// Stable identifier for percentage-based rollouts. If not provided, one will be\n  /// auto-generated and persisted to storage. This ensures consistent feature assignment\n  /// for the same user/session across page loads.\n  readonly rolloutStableId?: string;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n  children,\n  features,\n  disableConsole = false,\n  storage = window.sessionStorage,\n  rolloutStableId,\n}: FeatureProps): JSX.Element {\n  // Capture only first value; we don't care about future updates\n  const featuresRef = useRef(features);\n\n  // Generate or retrieve stable ID for rollouts\n  const stableId = useMemo(() => {\n    if (rolloutStableId != null) {\n      return rolloutStableId;\n    }\n\n    // Try to retrieve existing ID from storage\n    if (storage != null) {\n      try {\n        const existingId = storage.getItem(ROLLOUT_ID_KEY);\n        if (existingId != null) {\n          return existingId;\n        }\n      } catch (e) {\n        // Can't read from storage; generate new ID\n      }\n    }\n\n    // Generate new stable ID\n    const newId = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n\n    // Persist to storage\n    if (storage != null) {\n      try {\n        storage.setItem(ROLLOUT_ID_KEY, newId);\n      } catch (e) {\n        // Can't persist; ID will still work for this session\n      }\n    }\n\n    return newId;\n  }, [rolloutStableId, storage]);\n  const [overridesState, overridesDispatch] = useReducer(\n    featuresReducer,\n    initialFeaturesState,\n  );\n  const [defaultsState, defaultsDispatch] = useReducer(\n    featuresReducer,\n    initialFeaturesState,\n  );\n\n  useLayoutEffect(() => {\n    /// Load defaults\n    defaultsDispatch({ type: 'INIT', features });\n    return () => {\n      defaultsDispatch({ type: 'DE_INIT' });\n    };\n  }, [features]);\n\n  useLayoutEffect(() => {\n    let f: Record<string, boolean | undefined> = {};\n    if (storage != null) {\n      try {\n        const featuresJson = storage.getItem(KEY);\n        if (featuresJson != null) {\n          const fh = JSON.parse(featuresJson);\n          f = fh.overrides;\n        }\n      } catch (e) {\n        // Can't parse or get or otherwise; ignore\n        console.error('error in localStorage', e);\n      }\n    }\n\n    overridesDispatch({\n      type: 'INIT',\n      features: (featuresRef.current ?? [])\n        .filter((x) => x.noOverride !== true)\n        .map((x) => ({\n          name: x.name,\n          description: x.description,\n          defaultValue: f?.[x.name] ?? undefined,\n        })),\n    });\n\n    return () => {\n      overridesDispatch({ type: 'DE_INIT' });\n    };\n  }, [storage]);\n\n  // Handle async operations for features with onChangeDefault\n  useEffect(() => {\n    if (defaultsState.value !== 'ready') {\n      return;\n    }\n\n    // Check for features in async states and handle them\n    Object.entries(defaultsState.context.features).forEach(\n      ([name, feature]) => {\n        if (\n          feature.value === 'asyncEnabled' ||\n          feature.value === 'asyncDisabled' ||\n          feature.value === 'asyncUnspecified'\n        ) {\n          const targetValue =\n            feature.value === 'asyncEnabled'\n              ? true\n              : feature.value === 'asyncDisabled'\n                ? false\n                : undefined;\n\n          const onChangeDefault = feature.featureDesc?.onChangeDefault;\n          if (onChangeDefault != null && feature.featureDesc != null) {\n            onChangeDefault(feature.featureDesc.name, targetValue)\n              .then((result) => {\n                defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n              })\n              .catch(() => {\n                defaultsDispatch({\n                  type: 'ASYNC_DONE',\n                  name,\n                  value: undefined,\n                });\n              });\n          }\n        }\n      },\n    );\n  }, [defaultsState]);\n\n  usePersist(storage, featuresRef.current, overridesState);\n\n  const testCallback = useTestCallback(overridesState, defaultsState, stableId);\n  useConsoleOverride(\n    !disableConsole,\n    featuresRef.current,\n    testCallback,\n    defaultsDispatch,\n  );\n\n  const featureValue = useMemo(\n    () => ({\n      overridesSend: overridesDispatch,\n      defaultsSend: defaultsDispatch,\n      featuresDescription: featuresRef.current,\n      overridesState,\n      defaultsState,\n      test: testCallback,\n    }),\n    [overridesState, defaultsState, testCallback],\n  );\n\n  return (\n    <FeatureContext.Provider value={featureValue}>\n      <EnableContext.Provider value={testCallback}>\n        {children}\n      </EnableContext.Provider>\n    </FeatureContext.Provider>\n  );\n}\n","import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext<FeatureContextType | null>(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n  // Make changes to the overrides\n  overridesSend: FeaturesDispatch;\n\n  // Make changes to defaults\n  defaultsSend: FeaturesDispatch;\n\n  featuresDescription: readonly FeatureDescription[];\n\n  // State is in layers; overrides and defaults\n  overridesState: FeaturesState;\n  defaultsState: FeaturesState;\n\n  /// Test with proper fallback and respecting the user's force preference\n  test: (flag: string) => FeatureValue;\n}\n","import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n  | 'initial'\n  | 'enabled'\n  | 'disabled'\n  | 'unspecified'\n  | 'asyncEnabled'\n  | 'asyncDisabled'\n  | 'asyncUnspecified';\n\nexport interface FeatureState {\n  value: FeatureStateValue;\n  featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch<FeatureAction>;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n  featureState: FeatureState,\n): [FeatureValue, boolean] {\n  return [\n    featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n      ? true\n      : featureState.value === 'disabled' ||\n          featureState.value === 'asyncDisabled'\n        ? false\n        : undefined,\n    featureState.featureDesc?.force ?? false,\n  ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription<K extends string = string> {\n  readonly name: K;\n  readonly description?: string;\n\n  /// If set, will be used to update the feature default state instead of simply overriding.\n  /// For example, you might use this to update a feature flag on a backend server.\n  /// when set, the feature will be updated on the backend server, and the result of the async\n  /// will be used for the final state after the change. while changing, the feature will be\n  /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n  readonly onChangeDefault?: (\n    name: K,\n    newValue: FeatureValue,\n  ) => Promise<FeatureValue>;\n\n  /// if set true, will force the field to what it is set here through layers of states.\n  /// useful to invert the layers, similar to !important in CSS.\n  readonly force?: boolean;\n\n  /// If set to true, the feature will not be overridable by the user.\n  readonly noOverride?: boolean;\n\n  /// can be used to specify what should happen if the feature is not set to a particular value.\n  readonly defaultValue?: FeatureValue;\n\n  /// Percentage-based rollout (0-1). If set, the feature will be enabled for a percentage of users\n  /// based on a stable identifier. For example, 0.3 means 30% of users will see this feature enabled.\n  /// Requires a rolloutStableId to be provided to the Features component.\n  readonly enableFor?: number;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n  | { type: 'DISABLE' }\n  | { type: 'ENABLE' }\n  | { type: 'INIT'; feature: FeatureDescription }\n  | { type: 'SET'; value: FeatureValue }\n  | { type: 'TOGGLE' }\n  | { type: 'UNSET' }\n  | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n  value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n  state: FeatureState,\n  action: FeatureAction,\n): FeatureState {\n  switch (action.type) {\n    case 'INIT': {\n      const { feature } = action;\n      const value =\n        feature.defaultValue === true\n          ? 'enabled'\n          : feature.defaultValue === false\n            ? 'disabled'\n            : 'unspecified';\n      return {\n        value: value as FeatureStateValue,\n        featureDesc: feature,\n      };\n    }\n\n    case 'ENABLE': {\n      if (state.featureDesc?.onChangeDefault != null) {\n        return { ...state, value: 'asyncEnabled' };\n      }\n      return { ...state, value: 'enabled' };\n    }\n\n    case 'DISABLE': {\n      if (state.featureDesc?.onChangeDefault != null) {\n        return { ...state, value: 'asyncDisabled' };\n      }\n      return { ...state, value: 'disabled' };\n    }\n\n    case 'TOGGLE': {\n      if (state.featureDesc?.onChangeDefault != null) {\n        return { ...state, value: 'asyncEnabled' };\n      }\n      return { ...state, value: 'enabled' };\n    }\n\n    case 'UNSET': {\n      if (state.featureDesc?.onChangeDefault != null) {\n        return { ...state, value: 'asyncUnspecified' };\n      }\n      return { ...state, value: 'unspecified' };\n    }\n\n    case 'SET': {\n      const { value } = action;\n      if (state.featureDesc?.onChangeDefault != null) {\n        if (value === true) {\n          return { ...state, value: 'asyncEnabled' };\n        }\n        if (value === false) {\n          return { ...state, value: 'asyncDisabled' };\n        }\n        return { ...state, value: 'asyncUnspecified' };\n      }\n      if (value === true) {\n        return { ...state, value: 'enabled' };\n      }\n      if (value === false) {\n        return { ...state, value: 'disabled' };\n      }\n      return { ...state, value: 'unspecified' };\n    }\n\n    case 'ASYNC_DONE': {\n      const { value } = action;\n      if (value === true) {\n        return { ...state, value: 'enabled' };\n      }\n      if (value === false) {\n        return { ...state, value: 'disabled' };\n      }\n      return { ...state, value: 'unspecified' };\n    }\n\n    default:\n      return state;\n  }\n}\n","import type { Dispatch } from 'react';\n\nimport {\n  type FeatureDescription,\n  type FeatureState,\n  type FeatureValue,\n  valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n  // features are layered:\n  //  - defaults: if nothing else matches, provided a value for feature\n  //  - browser: browser-local values for features (kept in local storage, etc)\n  //  - user: values from the user's profile, if any\n  //  - org: value from the org's profile, if any\n  features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n  | { type: 'DE_INIT' }\n  | { type: 'DISABLE'; name: string }\n  | { type: 'ENABLE'; name: string }\n  | { type: 'INIT'; features: readonly FeatureDescription[] }\n  | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n  | { type: 'SET'; name: string; value: FeatureValue }\n  | { type: 'TOGGLE'; name: string }\n  | { type: 'UNSET'; name: string }\n  | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n  value: 'idle' | 'ready';\n  context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch<FeaturesAction>;\n\nexport function valueOfFeature(\n  featuresState: FeaturesState,\n  feature: string,\n): [FeatureValue, boolean] {\n  if (featuresState.context.features[feature] == null) {\n    return [undefined, false];\n  }\n  const featureState = featuresState.context.features[feature];\n  if (featureState != null) {\n    return valueForState(featureState);\n  }\n  return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n  value: 'idle',\n  context: {\n    features: {},\n  },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n  state: FeaturesState,\n  action: FeaturesAction,\n): FeaturesState {\n  switch (action.type) {\n    case 'INIT': {\n      if (!action.features || action.features.length === 0) {\n        return state;\n      }\n\n      const features: { [x: string]: FeatureState } = {};\n      for (const feature of action.features) {\n        // Initialize each feature\n        const featureState = {\n          value:\n            feature.defaultValue === true\n              ? ('enabled' as const)\n              : feature.defaultValue === false\n                ? ('disabled' as const)\n                : ('unspecified' as const),\n          featureDesc: feature,\n        };\n        features[feature.name] = featureState;\n      }\n\n      return {\n        value: 'ready',\n        context: { features },\n      };\n    }\n\n    case 'DE_INIT': {\n      return initialFeaturesState;\n    }\n\n    case 'SET_ALL': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const features = { ...state.context.features };\n      Object.keys(features).forEach((name) => {\n        const value = action.features[name] ?? undefined;\n        const currentFeature = features[name];\n\n        if (currentFeature.featureDesc?.onChangeDefault != null) {\n          if (value === true) {\n            features[name] = { ...currentFeature, value: 'asyncEnabled' };\n          } else if (value === false) {\n            features[name] = { ...currentFeature, value: 'asyncDisabled' };\n          } else {\n            features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n          }\n        } else {\n          if (value === true) {\n            features[name] = { ...currentFeature, value: 'enabled' };\n          } else if (value === false) {\n            features[name] = { ...currentFeature, value: 'disabled' };\n          } else {\n            features[name] = { ...currentFeature, value: 'unspecified' };\n          }\n        }\n      });\n\n      return {\n        ...state,\n        context: { features },\n      };\n    }\n\n    case 'SET': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const { value } = action;\n      let newValue: FeatureState['value'];\n\n      if (feature.featureDesc?.onChangeDefault != null) {\n        if (value === true) {\n          newValue = 'asyncEnabled';\n        } else if (value === false) {\n          newValue = 'asyncDisabled';\n        } else {\n          newValue = 'asyncUnspecified';\n        }\n      } else {\n        if (value === true) {\n          newValue = 'enabled';\n        } else if (value === false) {\n          newValue = 'disabled';\n        } else {\n          newValue = 'unspecified';\n        }\n      }\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    case 'TOGGLE': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const newValue =\n        feature.featureDesc?.onChangeDefault != null\n          ? 'asyncEnabled'\n          : 'enabled';\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    case 'ENABLE': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const newValue =\n        feature.featureDesc?.onChangeDefault != null\n          ? 'asyncEnabled'\n          : 'enabled';\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    case 'DISABLE': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const newValue =\n        feature.featureDesc?.onChangeDefault != null\n          ? 'asyncDisabled'\n          : 'disabled';\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    case 'UNSET': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const newValue =\n        feature.featureDesc?.onChangeDefault != null\n          ? 'asyncUnspecified'\n          : 'unspecified';\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    case 'ASYNC_DONE': {\n      if (state.value !== 'ready') {\n        return state;\n      }\n\n      const feature = state.context.features[action.name];\n      if (feature == null) {\n        return state;\n      }\n\n      const { value } = action;\n      const newValue =\n        value === true\n          ? 'enabled'\n          : value === false\n            ? 'disabled'\n            : 'unspecified';\n\n      return {\n        ...state,\n        context: {\n          features: {\n            ...state.context.features,\n            [action.name]: { ...feature, value: newValue },\n          },\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n}\n","import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n  consoleOverride: boolean,\n  features: readonly FeatureDescription[],\n  testFeature: (_: string) => FeatureValue,\n  dispatch: FeaturesDispatch,\n): void {\n  useEffect(() => {\n    if (!consoleOverride) {\n      // Clean up window.feature immediately if consoleOverride is disabled\n      if (window.feature != null) {\n        window.feature = undefined;\n      }\n      return () => {\n        if (window.feature != null) {\n          window.feature = undefined;\n        }\n      };\n    }\n    window.feature = new GlobalEnable(dispatch, testFeature, features);\n    return () => {\n      if (window.feature != null) {\n        window.feature = undefined;\n      }\n    };\n  }, [features, dispatch, consoleOverride, testFeature]);\n}\n","import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n  private readonly featureDesc: readonly FeatureDescription[];\n  private readonly dispatch: FeaturesDispatch;\n  private readonly testFeature: (value: string) => FeatureValue;\n\n  constructor(\n    dispatch: FeaturesDispatch,\n    testFeature: (_: string) => FeatureValue,\n    featureDesc: readonly FeatureDescription[],\n  ) {\n    this.featureDesc = featureDesc;\n    this.dispatch = dispatch;\n    this.testFeature = testFeature;\n  }\n\n  public toggle(feature: string): void {\n    this.dispatch({ type: 'TOGGLE', name: feature });\n  }\n\n  public enable(feature: string): void {\n    this.dispatch({ type: 'ENABLE', name: feature });\n  }\n\n  public unset(feature: string): void {\n    this.dispatch({ type: 'UNSET', name: feature });\n  }\n\n  public disable(feature: string): void {\n    this.dispatch({ type: 'DISABLE', name: feature });\n  }\n\n  public setAll(features: { [key: string]: FeatureValue }): void {\n    this.dispatch({ type: 'SET_ALL', features });\n  }\n\n  public listFeatures(): readonly [string, FeatureValue][] {\n    return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n  }\n}\ndeclare global {\n  interface Window {\n    feature?: GlobalEnable;\n  }\n}\n","import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n  storage: Storage | undefined,\n  features: readonly FeatureDescription[],\n  overrideState: FeaturesState,\n): void {\n  const overrides = useMemo(() => {\n    const newOverrides: { [key: string]: FeatureValue } = {};\n    if (overrideState.value === 'ready') {\n      for (const feature of features) {\n        const [value] = valueOfFeature(overrideState, feature.name);\n        if (value != null) {\n          newOverrides[feature.name] = value;\n        }\n      }\n    }\n    return newOverrides;\n  }, [features, overrideState]);\n\n  const strState =\n    Object.keys(overrides).length === 0 || storage == null\n      ? '{}'\n      : JSON.stringify({ overrides });\n\n  useEffect(() => {\n    try {\n      if (storage != null && overrideState.value === 'ready') {\n        storage.setItem(KEY, strState);\n      }\n    } catch (e) {\n      // Can't set for some reason\n    }\n  }, [overrideState, storage, strState]);\n}\n","import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n  overridesState: FeaturesState,\n  defaultsState: FeaturesState,\n  rolloutStableId?: string,\n): (feature: string) => boolean | undefined {\n  return useCallback(\n    (f: string) =>\n      testFeature(f, [overridesState, defaultsState], rolloutStableId),\n    [overridesState, defaultsState, rolloutStableId],\n  );\n}\n","/**\n * Simple hash function to convert a string into a number between 0 and 1.\n * This is used for percentage-based rollouts to ensure consistent feature\n * assignment for the same user/session.\n * Uses a variant of the djb2 hash algorithm.\n *\n * @param str - The string to hash (typically featureName + rolloutStableId)\n * @returns A number between 0 and 1\n */\nexport function hashToPercentage(str: string): number {\n  let hash = 5381;\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i);\n    hash = ((hash << 5) + hash + char) | 0; // hash * 33 + char\n  }\n  // Convert to unsigned 32-bit integer and normalize to 0-1\n  const unsigned = hash >>> 0;\n  return unsigned / 4294967296; // 2^32\n}\n\n/**\n * Determines if a feature should be enabled based on percentage rollout.\n *\n * @param featureName - Name of the feature\n * @param rolloutStableId - Stable identifier for consistent hashing\n * @param percentage - Target percentage (0-1)\n * @returns true if the feature should be enabled for this user\n */\nexport function isInRollout(\n  featureName: string,\n  rolloutStableId: string,\n  percentage: number,\n): boolean {\n  if (percentage <= 0) return false;\n  if (percentage >= 1) return true;\n\n  const combinedKey = `${featureName}:${rolloutStableId}`;\n  const hash = hashToPercentage(combinedKey);\n  return hash < percentage;\n}\n","import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\nimport { isInRollout } from './rolloutHash';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n * @param rolloutStableId Optional stable identifier for percentage-based rollouts\n */\n\nexport default function testFeature(\n  feature: string,\n  states: FeaturesState[],\n  rolloutStableId?: string,\n): FeatureValue {\n  const values = states.map((state) => valueOfFeature(state, feature));\n\n  // look for best forced option, in order\n  for (const [featureValue, featureForced] of values) {\n    if (featureValue != null && featureForced) {\n      return featureValue;\n    }\n  }\n\n  // look for best non-forced option, in order\n  for (const [featureValue] of values) {\n    if (featureValue != null) {\n      return featureValue;\n    }\n  }\n\n  // Check for percentage-based rollout if no explicit value is set\n  if (rolloutStableId != null) {\n    // Look through states to find the feature description with enableFor\n    for (const state of states) {\n      if (state.value === 'ready' && state.context.features[feature] != null) {\n        const featureState = state.context.features[feature];\n        const enableFor = featureState.featureDesc?.enableFor;\n\n        if (enableFor != null) {\n          return isInRollout(feature, rolloutStableId, enableFor);\n        }\n      }\n    }\n  }\n\n  // unset if nothing hit\n  return undefined;\n}\n","import { RadioGroup } from '@headlessui/react';\nimport { type ReactNode, useCallback, useContext, useState } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n  feature,\n}: {\n  feature: FeatureDescription;\n}): JSX.Element | null {\n  const context = useContext(FeatureContext);\n  const handleChangeSelection = useCallback(\n    (value: 'false' | 'true' | 'unset') => {\n      if (context?.overridesSend != null) {\n        switch (value) {\n          case 'true': {\n            context.overridesSend({ type: 'ENABLE', name: feature.name });\n            break;\n          }\n          case 'false': {\n            context.overridesSend({ type: 'DISABLE', name: feature.name });\n            break;\n          }\n          case 'unset': {\n            context.overridesSend({ type: 'UNSET', name: feature.name });\n            break;\n          }\n        }\n      }\n    },\n    [feature.name, context],\n  );\n\n  if (context == null) {\n    return null;\n  }\n\n  const { overridesState, test: testFeature, defaultsState } = context;\n\n  const valueInDefaults = (\n    valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n  ).toString() as 'false' | 'true' | 'unset';\n\n  const valueInOverrides = (\n    valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n  ).toString() as 'false' | 'true' | 'unset';\n\n  const actualChecked = testFeature(feature.name);\n\n  return (\n    <RadioGroup\n      disabled={feature.noOverride}\n      onChange={handleChangeSelection}\n      value={valueInOverrides}\n    >\n      <RadioGroup.Label>\n        <h6 className=\"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7\">\n          <span className=\"font-medium\">\n            Feature: <code>{feature.name}</code>\n          </span>\n          {feature.noOverride === true ? (\n            <div className=\"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1\">\n              <svg\n                aria-hidden=\"true\"\n                className=\"h-4 w-4 min-w-4\"\n                fill=\"currentColor\"\n                viewBox=\"0 0 20 20\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <path\n                  clipRule=\"evenodd\"\n                  d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\"\n                  fillRule=\"evenodd\"\n                />\n              </svg>\n              <div>No Overrides</div>\n            </div>\n          ) : null}\n          {actualChecked === true ? (\n            <div className=\"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1\">\n              <svg\n                aria-hidden=\"true\"\n                className=\"h-4 w-4 min-w-4\"\n                fill=\"currentColor\"\n                viewBox=\"0 0 20 20\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <path\n                  clipRule=\"evenodd\"\n                  d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n                  fillRule=\"evenodd\"\n                />\n              </svg>\n              <div>{actualChecked ? 'Enabled' : 'Disabled'}</div>\n            </div>\n          ) : null}\n        </h6>\n        {feature.description == null ? null : (\n          <p className=\"text-base text-gray-500 text-sm\">\n            {feature.description}\n          </p>\n        )}\n      </RadioGroup.Label>\n      <div className=\"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4\">\n        {[\n          {\n            id: 'false',\n            title: `Disable ${feature.name}`,\n            description: 'Override the feature to be disabled',\n          },\n          {\n            id: 'unset',\n            title: 'Default',\n            description: 'Inherit enabled state from defaults',\n            disabled: (feature.noOverride ?? false) || feature.force,\n            defaultValue:\n              valueInDefaults === 'true' ? (\n                <div className=\"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1\">\n                  <span>Enabled</span>\n                </div>\n              ) : (\n                <div className=\"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1\">\n                  <span>Disabled</span>\n                </div>\n              ),\n          },\n          {\n            id: 'true',\n            title: `Enable ${feature.name}`,\n            description: 'Override the feature to be enabled',\n          },\n        ].map((option) => (\n          <RadioGroup.Option\n            className={({ checked, active, disabled }) =>\n              classNames(\n                checked ? 'border-transparent' : 'border-gray-300',\n                !disabled && active\n                  ? 'border-blue-500 ring-2 ring-blue-500'\n                  : '',\n                disabled\n                  ? 'border-transparent ring-gray-500 cursor-not-allowed'\n                  : 'cursor-pointer',\n                'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n              )\n            }\n            disabled={option.disabled}\n            key={option.id}\n            value={option.id}\n          >\n            {({ checked, active, disabled }) => (\n              <>\n                <div className=\"flex flex-col grow\">\n                  <RadioGroup.Label\n                    as=\"span\"\n                    className=\"flex flex-nowrap flex-row gap-1 items-center space-between\"\n                  >\n                    <span className=\"text-sm font-medium text-gray-900 grow shrink\">\n                      {option.title}\n                    </span>\n                    {option.defaultValue != null ? option.defaultValue : null}\n                    <svg\n                      aria-hidden=\"true\"\n                      className={classNames(\n                        !checked ? 'invisible' : '',\n                        'h-5 w-5 text-blue-500 min-w-4',\n                      )}\n                      fill=\"currentColor\"\n                      viewBox=\"0 0 20 20\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                    >\n                      <path\n                        clipRule=\"evenodd\"\n                        d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n                        fillRule=\"evenodd\"\n                      />\n                    </svg>\n                  </RadioGroup.Label>\n                  <RadioGroup.Description\n                    as=\"span\"\n                    className=\"mt-1 flex items-center text-sm text-gray-500\"\n                  >\n                    {option.description}\n                  </RadioGroup.Description>\n                </div>\n                <div\n                  aria-hidden=\"true\"\n                  className={classNames(\n                    !disabled && active ? 'border' : 'border-2',\n                    checked\n                      ? disabled\n                        ? 'border-gray-500'\n                        : 'border-blue-500'\n                      : 'border-transparent',\n                    'absolute -inset-px rounded-lg pointer-events-none',\n                  )}\n                />\n              </>\n            )}\n          </RadioGroup.Option>\n        ))}\n      </div>\n    </RadioGroup>\n  );\n}\n\nfunction ShadowContent({\n  root,\n  children,\n}: {\n  children: ReactNode;\n  root: Element;\n}) {\n  return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n  defaultOpen = false,\n  hidden = false,\n}: {\n  defaultOpen?: boolean;\n  hidden?: boolean;\n}): JSX.Element | null {\n  const [root, setCoreRoot] = useState<HTMLDivElement | null>(null);\n\n  const setRoot = (host: HTMLDivElement | null) => {\n    if (host == null || root != null) {\n      return;\n    }\n    const shadowRoot = host?.attachShadow({ mode: 'open' });\n    const style = document.createElement('style');\n    const renderDiv = document.createElement('div');\n    style.textContent = styles;\n    shadowRoot.appendChild(style);\n    shadowRoot.appendChild(renderDiv);\n    setCoreRoot(renderDiv);\n  };\n\n  if (hidden) {\n    return null;\n  }\n\n  return (\n    <div\n      ref={setRoot}\n      style={{\n        zIndex: 99999,\n        position: 'fixed',\n        width: '0',\n        height: '0',\n        bottom: 0,\n      }}\n    >\n      {root != null ? (\n        <ShadowContent root={root}>\n          <ToggleFeatureUnwrapped defaultOpen={defaultOpen} />\n        </ShadowContent>\n      ) : null}\n    </div>\n  );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n  defaultOpen = false,\n  hidden = false,\n}: {\n  defaultOpen?: boolean;\n  hidden?: boolean;\n}): JSX.Element | null {\n  const [open, setOpen] = useState(defaultOpen);\n  const context = useContext(FeatureContext);\n\n  if (context == null) {\n    return null;\n  }\n\n  if (hidden) {\n    return null;\n  }\n\n  // We want: Real value after all nestings, value of the override. we toggle override\n  const { featuresDescription } = context;\n\n  if (featuresDescription.length === 0) {\n    return null;\n  }\n\n  return (\n    <div className=\"relative\">\n      <div className=\"absolute bottom-0 left-0 mx-4 my-4\">\n        <button\n          className=\"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white  border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm\"\n          onClick={() => setOpen(true)}\n          title=\"Toggle features\"\n          type=\"button\"\n        >\n          <svg\n            className=\"w-6 h-6 min-h-6 min-w-6\"\n            fill=\"currentColor\"\n            viewBox=\"0 0 20 20\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <path\n              clipRule=\"evenodd\"\n              d=\"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z\"\n              fillRule=\"evenodd\"\n            />\n          </svg>\n        </button>\n      </div>\n      {!open ? null : (\n        <div className=\"fixed z-10 inset-0 overflow-y-auto\">\n          <div className=\"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0\">\n            <div className=\"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full\">\n              <div>\n                <div className=\"mt-1 sm:mt-3\">\n                  <h3 className=\"flex flex-row gap-4 flex-nowrap items-center space-between\">\n                    <div className=\"grow text-lg leading-6 font-medium text-gray-900\">\n                      Feature Flag Overrides\n                    </div>\n                  </h3>\n                  <p className=\"text-sm text-gray-500\">\n                    Features can be enabled or disabled unless they are forced\n                    upstream. You can also revert to default.\n                  </p>\n                  <div className=\"mt-6\">\n                    <fieldset className=\"flex flex-col gap-9\">\n                      <legend className=\"sr-only\">Feature Flags</legend>\n                      {featuresDescription.map((feature) => (\n                        <ToggleFeature feature={feature} key={feature.name} />\n                      ))}\n                    </fieldset>\n                  </div>\n                  <div className=\"flex justify-center items-center mt-5 sm:mt-6\">\n                    <button\n                      className=\"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm\"\n                      onClick={() => setOpen(false)}\n                      type=\"button\"\n                    >\n                      Done\n                    </button>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n","*, ::before, ::after {\n  --tw-border-spacing-x: 0;\n  --tw-border-spacing-y: 0;\n  --tw-translate-x: 0;\n  --tw-translate-y: 0;\n  --tw-rotate: 0;\n  --tw-skew-x: 0;\n  --tw-skew-y: 0;\n  --tw-scale-x: 1;\n  --tw-scale-y: 1;\n  --tw-pan-x:  ;\n  --tw-pan-y:  ;\n  --tw-pinch-zoom:  ;\n  --tw-scroll-snap-strictness: proximity;\n  --tw-gradient-from-position:  ;\n  --tw-gradient-via-position:  ;\n  --tw-gradient-to-position:  ;\n  --tw-ordinal:  ;\n  --tw-slashed-zero:  ;\n  --tw-numeric-figure:  ;\n  --tw-numeric-spacing:  ;\n  --tw-numeric-fraction:  ;\n  --tw-ring-inset:  ;\n  --tw-ring-offset-width: 0px;\n  --tw-ring-offset-color: #fff;\n  --tw-ring-color: rgba(59, 130, 246, 0.5);\n  --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n  --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n  --tw-blur:  ;\n  --tw-brightness:  ;\n  --tw-contrast:  ;\n  --tw-grayscale:  ;\n  --tw-hue-rotate:  ;\n  --tw-invert:  ;\n  --tw-saturate:  ;\n  --tw-sepia:  ;\n  --tw-drop-shadow:  ;\n  --tw-backdrop-blur:  ;\n  --tw-backdrop-brightness:  ;\n  --tw-backdrop-contrast:  ;\n  --tw-backdrop-grayscale:  ;\n  --tw-backdrop-hue-rotate:  ;\n  --tw-backdrop-invert:  ;\n  --tw-backdrop-opacity:  ;\n  --tw-backdrop-saturate:  ;\n  --tw-backdrop-sepia:  ;\n  --tw-contain-size:  ;\n  --tw-contain-layout:  ;\n  --tw-contain-paint:  ;\n  --tw-contain-style:  ;\n}\n\n::-ms-backdrop {\n  --tw-border-spacing-x: 0;\n  --tw-border-spacing-y: 0;\n  --tw-translate-x: 0;\n  --tw-translate-y: 0;\n  --tw-rotate: 0;\n  --tw-skew-x: 0;\n  --tw-skew-y: 0;\n  --tw-scale-x: 1;\n  --tw-scale-y: 1;\n  --tw-pan-x:  ;\n  --tw-pan-y:  ;\n  --tw-pinch-zoom:  ;\n  --tw-scroll-snap-strictness: proximity;\n  --tw-gradient-from-position:  ;\n  --tw-gradient-via-position:  ;\n  --tw-gradient-to-position:  ;\n  --tw-ordinal:  ;\n  --tw-slashed-zero:  ;\n  --tw-numeric-figure:  ;\n  --tw-numeric-spacing:  ;\n  --tw-numeric-fraction:  ;\n  --tw-ring-inset:  ;\n  --tw-ring-offset-width: 0px;\n  --tw-ring-offset-color: #fff;\n  --tw-ring-color: rgba(59, 130, 246, 0.5);\n  --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n  --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n  --tw-blur:  ;\n  --tw-brightness:  ;\n  --tw-contrast:  ;\n  --tw-grayscale:  ;\n  --tw-hue-rotate:  ;\n  --tw-invert:  ;\n  --tw-saturate:  ;\n  --tw-sepia:  ;\n  --tw-drop-shadow:  ;\n  --tw-backdrop-blur:  ;\n  --tw-backdrop-brightness:  ;\n  --tw-backdrop-contrast:  ;\n  --tw-backdrop-grayscale:  ;\n  --tw-backdrop-hue-rotate:  ;\n  --tw-backdrop-invert:  ;\n  --tw-backdrop-opacity:  ;\n  --tw-backdrop-saturate:  ;\n  --tw-backdrop-sepia:  ;\n  --tw-contain-size:  ;\n  --tw-contain-layout:  ;\n  --tw-contain-paint:  ;\n  --tw-contain-style:  ;\n}\n\n::backdrop {\n  --tw-border-spacing-x: 0;\n  --tw-border-spacing-y: 0;\n  --tw-translate-x: 0;\n  --tw-translate-y: 0;\n  --tw-rotate: 0;\n  --tw-skew-x: 0;\n  --tw-skew-y: 0;\n  --tw-scale-x: 1;\n  --tw-scale-y: 1;\n  --tw-pan-x:  ;\n  --tw-pan-y:  ;\n  --tw-pinch-zoom:  ;\n  --tw-scroll-snap-strictness: proximity;\n  --tw-gradient-from-position:  ;\n  --tw-gradient-via-position:  ;\n  --tw-gradient-to-position:  ;\n  --tw-ordinal:  ;\n  --tw-slashed-zero:  ;\n  --tw-numeric-figure:  ;\n  --tw-numeric-spacing:  ;\n  --tw-numeric-fraction:  ;\n  --tw-ring-inset:  ;\n  --tw-ring-offset-width: 0px;\n  --tw-ring-offset-color: #fff;\n  --tw-ring-color: rgba(59, 130, 246, 0.5);\n  --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n  --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow: 0 0 rgba(0,0,0,0);\n  --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n  --tw-blur:  ;\n  --tw-brightness:  ;\n  --tw-contrast:  ;\n  --tw-grayscale:  ;\n  --tw-hue-rotate:  ;\n  --tw-invert:  ;\n  --tw-saturate:  ;\n  --tw-sepia:  ;\n  --tw-drop-shadow:  ;\n  --tw-backdrop-blur:  ;\n  --tw-backdrop-brightness:  ;\n  --tw-backdrop-contrast:  ;\n  --tw-backdrop-grayscale:  ;\n  --tw-backdrop-hue-rotate:  ;\n  --tw-backdrop-invert:  ;\n  --tw-backdrop-opacity:  ;\n  --tw-backdrop-saturate:  ;\n  --tw-backdrop-sepia:  ;\n  --tw-contain-size:  ;\n  --tw-contain-layout:  ;\n  --tw-contain-paint:  ;\n  --tw-contain-style:  ;\n}\n\n/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  /* 1 */\n  border-width: 0;\n  /* 2 */\n  border-style: solid;\n  /* 2 */\n  border-color: #e5e7eb;\n  /* 2 */\n}\n\n::before,\n::after {\n  --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n  line-height: 1.5;\n  /* 1 */\n  -webkit-text-size-adjust: 100%;\n  /* 2 */\n  -moz-tab-size: 4;\n  /* 3 */\n  -o-tab-size: 4;\n     tab-size: 4;\n  /* 3 */\n  font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  /* 4 */\n  -webkit-font-feature-settings: normal;\n          font-feature-settings: normal;\n  /* 5 */\n  font-variation-settings: normal;\n  /* 6 */\n  -webkit-tap-highlight-color: transparent;\n  /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n  margin: 0;\n  /* 1 */\n  line-height: inherit;\n  /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n  height: 0;\n  /* 1 */\n  color: inherit;\n  /* 2 */\n  border-top-width: 1px;\n  /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n  -webkit-text-decoration: underline dotted;\n          text-decoration: underline;\n          -webkit-text-decoration: underline dotted currentColor;\n                  text-decoration: underline dotted currentColor;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-size: inherit;\n  font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n  color: inherit;\n  text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  /* 1 */\n  -webkit-font-feature-settings: normal;\n          font-feature-settings: normal;\n  /* 2 */\n  font-variation-settings: normal;\n  /* 3 */\n  font-size: 1em;\n  /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n  text-indent: 0;\n  /* 1 */\n  border-color: inherit;\n  /* 2 */\n  border-collapse: collapse;\n  /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit;\n  /* 1 */\n  -webkit-font-feature-settings: inherit;\n          font-feature-settings: inherit;\n  /* 1 */\n  font-variation-settings: inherit;\n  /* 1 */\n  font-size: 100%;\n  /* 1 */\n  font-weight: inherit;\n  /* 1 */\n  line-height: inherit;\n  /* 1 */\n  letter-spacing: inherit;\n  /* 1 */\n  color: inherit;\n  /* 1 */\n  margin: 0;\n  /* 2 */\n  padding: 0;\n  /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n  -webkit-appearance: button;\n  /* 1 */\n  background-color: transparent;\n  /* 2 */\n  background-image: none;\n  /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n  outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n  -webkit-appearance: textfield;\n  /* 1 */\n  outline-offset: -2px;\n  /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button;\n  /* 1 */\n  font: inherit;\n  /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n  margin: 0;\n}\n\nfieldset {\n  margin: 0;\n  padding: 0;\n}\n\nlegend {\n  padding: 0;\n}\n\nol,\nul,\nmenu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n  padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n  resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n  opacity: 1;\n  /* 1 */\n  color: #9ca3af;\n  /* 2 */\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n  opacity: 1;\n  /* 1 */\n  color: #9ca3af;\n  /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n  opacity: 1;\n  /* 1 */\n  color: #9ca3af;\n  /* 2 */\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n  opacity: 1;\n  /* 1 */\n  color: #9ca3af;\n  /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n  opacity: 1;\n  /* 1 */\n  color: #9ca3af;\n  /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n  cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n  cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n   This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n  display: block;\n  /* 1 */\n  vertical-align: middle;\n  /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n  max-width: 100%;\n  height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden=\"until-found\"])) {\n  display: none;\n}\n\n[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n  background-color: #fff;\n  border-color: #6b7280;\n  border-width: 1px;\n  border-radius: 0px;\n  padding-top: 0.5rem;\n  padding-right: 0.75rem;\n  padding-bottom: 0.5rem;\n  padding-left: 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n  --tw-ring-offset-width: 0px;\n  --tw-ring-offset-color: #fff;\n  --tw-ring-color: #2563eb;\n  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n  border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n  color: #6b7280;\n  opacity: 1;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n  color: #6b7280;\n  opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n  color: #6b7280;\n  opacity: 1;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n  color: #6b7280;\n  opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n  color: #6b7280;\n  opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n  padding: 0;\n}\n\n::-webkit-date-and-time-value {\n  min-height: 1.5em;\n  text-align: inherit;\n}\n\n::-webkit-datetime-edit {\n  display: -webkit-inline-box;\n  display: inline-flex;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n  padding-top: 0;\n  padding-bottom: 0;\n}\n\nselect {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n  background-position: right 0.5rem center;\n  background-repeat: no-repeat;\n  background-size: 1.5em 1.5em;\n  padding-right: 2.5rem;\n  -webkit-print-color-adjust: exact;\n          print-color-adjust: exact;\n}\n\n[multiple],[size]:where(select:not([size=\"1\"])) {\n  background-image: none;\n  background-image: initial;\n  background-position: 0 0;\n  background-position: initial;\n  background-repeat: repeat;\n  background-repeat: initial;\n  background-size: auto auto;\n  background-size: initial;\n  padding-right: 0.75rem;\n  -webkit-print-color-adjust: unset;\n          print-color-adjust: inherit;\n}\n\n[type='checkbox'],[type='radio'] {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n  padding: 0;\n  -webkit-print-color-adjust: exact;\n          print-color-adjust: exact;\n  display: inline-block;\n  vertical-align: middle;\n  background-origin: border-box;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          -ms-user-select: none;\n      user-select: none;\n  -ms-flex-negative: 0;\n      flex-shrink: 0;\n  height: 1rem;\n  width: 1rem;\n  color: #2563eb;\n  background-color: #fff;\n  border-color: #6b7280;\n  border-width: 1px;\n  --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='checkbox'] {\n  border-radius: 0px;\n}\n\n[type='radio'] {\n  border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n  --tw-ring-offset-width: 2px;\n  --tw-ring-offset-color: #fff;\n  --tw-ring-color: #2563eb;\n  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n  border-color: transparent;\n  background-color: currentColor;\n  background-size: 100% 100%;\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active)  {\n  [type='checkbox']:checked {\n    -webkit-appearance: auto;\n       -moz-appearance: auto;\n            appearance: auto;\n  }\n}\n\n[type='radio']:checked {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active)  {\n  [type='radio']:checked {\n    -webkit-appearance: auto;\n       -moz-appearance: auto;\n            appearance: auto;\n  }\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n  border-color: transparent;\n  background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n  border-color: transparent;\n  background-color: currentColor;\n  background-size: 100% 100%;\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n@media (forced-colors: active)  {\n  [type='checkbox']:indeterminate {\n    -webkit-appearance: auto;\n       -moz-appearance: auto;\n            appearance: auto;\n  }\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n  border-color: transparent;\n  background-color: currentColor;\n}\n\n[type='file'] {\n  background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;\n  background: initial;\n  border-color: inherit;\n  border-width: 0;\n  border-radius: 0;\n  padding: 0;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n[type='file']:focus {\n  outline: 1px solid ButtonText;\n  outline: 1px auto -webkit-focus-ring-color;\n}\n\n.container {\n  width: 100%;\n}\n\n@media (min-width: 640px) {\n  .container {\n    max-width: 640px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 768px;\n  }\n}\n\n@media (min-width: 1024px) {\n  .container {\n    max-width: 1024px;\n  }\n}\n\n@media (min-width: 1280px) {\n  .container {\n    max-width: 1280px;\n  }\n}\n\n@media (min-width: 1536px) {\n  .container {\n    max-width: 1536px;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border-width: 0;\n}\n\n.pointer-events-none {\n  pointer-events: none;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.fixed {\n  position: fixed;\n}\n\n.absolute {\n  position: absolute;\n}\n\n.relative {\n  position: relative;\n}\n\n.-inset-px {\n  top: -1px;\n  right: -1px;\n  bottom: -1px;\n  left: -1px;\n}\n\n.inset-0 {\n  top: 0px;\n  right: 0px;\n  bottom: 0px;\n  left: 0px;\n}\n\n.bottom-0 {\n  bottom: 0px;\n}\n\n.left-0 {\n  left: 0px;\n}\n\n.z-10 {\n  z-index: 10;\n}\n\n.mx-4 {\n  margin-left: 1rem;\n  margin-right: 1rem;\n}\n\n.mx-8 {\n  margin-left: 2rem;\n  margin-right: 2rem;\n}\n\n.my-4 {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n}\n\n.mt-1 {\n  margin-top: 0.25rem;\n}\n\n.mt-4 {\n  margin-top: 1rem;\n}\n\n.mt-5 {\n  margin-top: 1.25rem;\n}\n\n.mt-6 {\n  margin-top: 1.5rem;\n}\n\n.inline-block {\n  display: inline-block;\n}\n\n.flex {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.inline-flex {\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n}\n\n.grid {\n  display: grid;\n}\n\n.hidden {\n  display: none;\n}\n\n.h-4 {\n  height: 1rem;\n}\n\n.h-5 {\n  height: 1.25rem;\n}\n\n.h-6 {\n  height: 1.5rem;\n}\n\n.h-7 {\n  height: 1.75rem;\n}\n\n.h-8 {\n  height: 2rem;\n}\n\n.min-h-6 {\n  min-height: 1.5rem;\n}\n\n.min-h-screen {\n  min-height: 100vh;\n}\n\n.w-4 {\n  width: 1rem;\n}\n\n.w-5 {\n  width: 1.25rem;\n}\n\n.w-6 {\n  width: 1.5rem;\n}\n\n.w-8 {\n  width: 2rem;\n}\n\n.min-w-4 {\n  min-width: 1rem;\n}\n\n.min-w-6 {\n  min-width: 1.5rem;\n}\n\n.max-w-full {\n  max-width: 100%;\n}\n\n.shrink {\n  -ms-flex-negative: 1;\n      flex-shrink: 1;\n}\n\n.grow {\n  -webkit-box-flex: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n}\n\n.transform {\n  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n          transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-not-allowed {\n  cursor: not-allowed;\n}\n\n.cursor-pointer {\n  cursor: pointer;\n}\n\n.grid-cols-1 {\n  grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n\n.flex-row {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: row;\n          flex-direction: row;\n}\n\n.flex-col {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap;\n      flex-wrap: nowrap;\n}\n\n.items-end {\n  -webkit-box-align: end;\n      -ms-flex-align: end;\n          align-items: flex-end;\n}\n\n.items-center {\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n}\n\n.justify-center {\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n}\n\n.gap-1 {\n  gap: 0.25rem;\n}\n\n.gap-2 {\n  gap: 0.5rem;\n}\n\n.gap-4 {\n  gap: 1rem;\n}\n\n.gap-9 {\n  gap: 2.25rem;\n}\n\n.gap-y-6 {\n  row-gap: 1.5rem;\n}\n\n.overflow-hidden {\n  overflow: hidden;\n}\n\n.overflow-y-auto {\n  overflow-y: auto;\n}\n\n.rounded-full {\n  border-radius: 9999px;\n}\n\n.rounded-lg {\n  border-radius: 0.5rem;\n}\n\n.rounded-sm {\n  border-radius: 0.125rem;\n}\n\n.border {\n  border-width: 1px;\n}\n\n.border-2 {\n  border-width: 2px;\n}\n\n.border-blue-500 {\n  --tw-border-opacity: 1;\n  border-color: rgba(59, 130, 246, 1);\n  border-color: rgba(59, 130, 246, var(--tw-border-opacity, 1));\n}\n\n.border-gray-300 {\n  --tw-border-opacity: 1;\n  border-color: rgba(209, 213, 219, 1);\n  border-color: rgba(209, 213, 219, var(--tw-border-opacity, 1));\n}\n\n.border-gray-500 {\n  --tw-border-opacity: 1;\n  border-color: rgba(107, 114, 128, 1);\n  border-color: rgba(107, 114, 128, var(--tw-border-opacity, 1));\n}\n\n.border-green-500 {\n  --tw-border-opacity: 1;\n  border-color: rgba(34, 197, 94, 1);\n  border-color: rgba(34, 197, 94, var(--tw-border-opacity, 1));\n}\n\n.border-orange-500 {\n  --tw-border-opacity: 1;\n  border-color: rgba(249, 115, 22, 1);\n  border-color: rgba(249, 115, 22, var(--tw-border-opacity, 1));\n}\n\n.border-red-500 {\n  --tw-border-opacity: 1;\n  border-color: rgba(239, 68, 68, 1);\n  border-color: rgba(239, 68, 68, var(--tw-border-opacity, 1));\n}\n\n.border-transparent {\n  border-color: transparent;\n}\n\n.bg-blue-600 {\n  --tw-bg-opacity: 1;\n  background-color: rgba(37, 99, 235, 1);\n  background-color: rgba(37, 99, 235, var(--tw-bg-opacity, 1));\n}\n\n.bg-white {\n  --tw-bg-opacity: 1;\n  background-color: rgba(255, 255, 255, 1);\n  background-color: rgba(255, 255, 255, var(--tw-bg-opacity, 1));\n}\n\n.p-1 {\n  padding: 0.25rem;\n}\n\n.p-3 {\n  padding: 0.75rem;\n}\n\n.px-2 {\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n}\n\n.px-4 {\n  padding-left: 1rem;\n  padding-right: 1rem;\n}\n\n.py-1 {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n}\n\n.pb-0 {\n  padding-bottom: 0px;\n}\n\n.pb-10 {\n  padding-bottom: 2.5rem;\n}\n\n.pb-4 {\n  padding-bottom: 1rem;\n}\n\n.pl-4 {\n  padding-left: 1rem;\n}\n\n.pr-4 {\n  padding-right: 1rem;\n}\n\n.pt-0 {\n  padding-top: 0px;\n}\n\n.pt-4 {\n  padding-top: 1rem;\n}\n\n.pt-5 {\n  padding-top: 1.25rem;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.align-middle {\n  vertical-align: middle;\n}\n\n.align-bottom {\n  vertical-align: bottom;\n}\n\n.text-base {\n  font-size: 1rem;\n  line-height: 1.5rem;\n}\n\n.text-lg {\n  font-size: 1.125rem;\n  line-height: 1.75rem;\n}\n\n.text-sm {\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n}\n\n.text-xs {\n  font-size: 0.75rem;\n  line-height: 1rem;\n}\n\n.font-medium {\n  font-weight: 500;\n}\n\n.leading-6 {\n  line-height: 1.5rem;\n}\n\n.leading-7 {\n  line-height: 1.75rem;\n}\n\n.text-blue-500 {\n  --tw-text-opacity: 1;\n  color: rgba(59, 130, 246, 1);\n  color: rgba(59, 130, 246, var(--tw-text-opacity, 1));\n}\n\n.text-gray-500 {\n  --tw-text-opacity: 1;\n  color: rgba(107, 114, 128, 1);\n  color: rgba(107, 114, 128, var(--tw-text-opacity, 1));\n}\n\n.text-gray-900 {\n  --tw-text-opacity: 1;\n  color: rgba(17, 24, 39, 1);\n  color: rgba(17, 24, 39, var(--tw-text-opacity, 1));\n}\n\n.text-green-500 {\n  --tw-text-opacity: 1;\n  color: rgba(34, 197, 94, 1);\n  color: rgba(34, 197, 94, var(--tw-text-opacity, 1));\n}\n\n.text-orange-500 {\n  --tw-text-opacity: 1;\n  color: rgba(249, 115, 22, 1);\n  color: rgba(249, 115, 22, var(--tw-text-opacity, 1));\n}\n\n.text-red-500 {\n  --tw-text-opacity: 1;\n  color: rgba(239, 68, 68, 1);\n  color: rgba(239, 68, 68, var(--tw-text-opacity, 1));\n}\n\n.text-white {\n  --tw-text-opacity: 1;\n  color: rgba(255, 255, 255, 1);\n  color: rgba(255, 255, 255, var(--tw-text-opacity, 1));\n}\n\n.shadow {\n  --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n  -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n          box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n          box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-sm {\n  --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n  -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n          box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n          box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-xl {\n  --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n  --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n  -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n          box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n          box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.ring-2 {\n  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.ring-blue-500 {\n  --tw-ring-opacity: 1;\n  --tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity, 1));\n}\n\n.ring-gray-500 {\n  --tw-ring-opacity: 1;\n  --tw-ring-color: rgba(107, 114, 128, var(--tw-ring-opacity, 1));\n}\n\n.invert {\n  --tw-invert: invert(100%);\n  -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n          filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.filter {\n  -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n          filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition-all {\n  -webkit-transition-property: all;\n  transition-property: all;\n  -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n          transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n  -webkit-transition-duration: 150ms;\n          transition-duration: 150ms;\n}\n\n.focus\\:outline-none:focus {\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n  -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n          box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.focus\\:ring-blue-600:focus {\n  --tw-ring-opacity: 1;\n  --tw-ring-color: rgba(37, 99, 235, var(--tw-ring-opacity, 1));\n}\n\n.focus\\:ring-offset-2:focus {\n  --tw-ring-offset-width: 2px;\n}\n\n@media (min-width: 640px) {\n  .sm\\:my-8 {\n    margin-top: 2rem;\n    margin-bottom: 2rem;\n  }\n\n  .sm\\:mt-3 {\n    margin-top: 0.75rem;\n  }\n\n  .sm\\:mt-6 {\n    margin-top: 1.5rem;\n  }\n\n  .sm\\:block {\n    display: block;\n  }\n\n  .sm\\:grid-cols-3 {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n\n  .sm\\:gap-x-4 {\n    -moz-column-gap: 1rem;\n         -webkit-column-gap: 1rem;\n            column-gap: 1rem;\n  }\n\n  .sm\\:p-0 {\n    padding: 0px;\n  }\n\n  .sm\\:p-6 {\n    padding: 1.5rem;\n  }\n\n  .sm\\:align-middle {\n    vertical-align: middle;\n  }\n\n  .sm\\:text-sm {\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n}\n\n@media (min-width: 1024px) {\n  .lg\\:max-w-\\[80\\%\\] {\n    max-width: 80%;\n  }\n\n  .lg\\:gap-4 {\n    gap: 1rem;\n  }\n}\n"]}