@fluid-app/portal-sdk 0.1.26 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/{AccountScreen-DTv1-206.cjs → AccountScreen-Dp6QFyEr.cjs} +2 -2
  2. package/dist/{AccountScreen-DTv1-206.cjs.map → AccountScreen-Dp6QFyEr.cjs.map} +1 -1
  3. package/dist/{AccountScreen-BigIbqV5.mjs → AccountScreen-E4ZBgOUS.mjs} +2 -2
  4. package/dist/{AccountScreen-BigIbqV5.mjs.map → AccountScreen-E4ZBgOUS.mjs.map} +1 -1
  5. package/dist/{AccountScreen-B0p9WJoI.cjs → AccountScreen-Vzz8W4Iq.cjs} +3 -3
  6. package/dist/{FluidProvider-PqLUzyvQ.cjs → FluidProvider-BmkSwcgV.cjs} +3 -3
  7. package/dist/{FluidProvider-PqLUzyvQ.cjs.map → FluidProvider-BmkSwcgV.cjs.map} +1 -1
  8. package/dist/{FluidProvider-Bp1sNJnr.mjs → FluidProvider-x96kqsgN.mjs} +3 -3
  9. package/dist/{FluidProvider-Bp1sNJnr.mjs.map → FluidProvider-x96kqsgN.mjs.map} +1 -1
  10. package/dist/LayoutWidget-Dc_wvaLg.mjs.map +1 -1
  11. package/dist/LayoutWidget-fOBC-EML.cjs.map +1 -1
  12. package/dist/{MessagingScreen-CcxyIep3.cjs → MessagingScreen-C33eDdna.cjs} +3 -3
  13. package/dist/{MessagingScreen-D7xu52lk.mjs → MessagingScreen-DVU3c8fX.mjs} +3 -4
  14. package/dist/{MessagingScreen-7pC6SdRs.mjs → MessagingScreen-II_iNqLk.mjs} +3 -3
  15. package/dist/{MessagingScreen-7pC6SdRs.mjs.map → MessagingScreen-II_iNqLk.mjs.map} +1 -1
  16. package/dist/{MessagingScreen-C-kF4Z5h.cjs → MessagingScreen-sAWF7pjl.cjs} +3 -3
  17. package/dist/{MessagingScreen-C-kF4Z5h.cjs.map → MessagingScreen-sAWF7pjl.cjs.map} +1 -1
  18. package/dist/{ProductsScreen-DwcIB1Tp.mjs → ProductsScreen-BOngRxSO.mjs} +4 -4
  19. package/dist/{ProductsScreen-DwcIB1Tp.mjs.map → ProductsScreen-BOngRxSO.mjs.map} +1 -1
  20. package/dist/{ProductsScreen-7t1oNY_N.cjs → ProductsScreen-CdP_m_Ok.cjs} +4 -4
  21. package/dist/{ProductsScreen-FZS6vPqz.mjs → ProductsScreen-DrrBYFl0.mjs} +4 -6
  22. package/dist/{ProductsScreen-DeXWGZXc.cjs → ProductsScreen-DzD-TPh5.cjs} +4 -4
  23. package/dist/{ProductsScreen-DeXWGZXc.cjs.map → ProductsScreen-DzD-TPh5.cjs.map} +1 -1
  24. package/dist/{ShareablesScreen-D2iE3ytr.mjs → ShareablesScreen-BsqZvRSK.mjs} +4 -6
  25. package/dist/{ShareablesScreen-8gKrJQn3.mjs → ShareablesScreen-CQy39TAK.mjs} +4 -4
  26. package/dist/{ShareablesScreen-8gKrJQn3.mjs.map → ShareablesScreen-CQy39TAK.mjs.map} +1 -1
  27. package/dist/{ShareablesScreen-B-kEPPCb.cjs → ShareablesScreen-DYPJgZ3z.cjs} +4 -4
  28. package/dist/{ShareablesScreen-B-kEPPCb.cjs.map → ShareablesScreen-DYPJgZ3z.cjs.map} +1 -1
  29. package/dist/{ShareablesScreen-Cx87emjz.cjs → ShareablesScreen-jHqLmOC6.cjs} +4 -4
  30. package/dist/{ShopScreen-Ds4MVzZT.cjs → ShopScreen--pUsiUNt.cjs} +3 -3
  31. package/dist/{ShopScreen-BMCb4k-O.mjs → ShopScreen-BKBzgkr7.mjs} +3 -3
  32. package/dist/{ShopScreen-BMCb4k-O.mjs.map → ShopScreen-BKBzgkr7.mjs.map} +1 -1
  33. package/dist/{ShopScreen-BstU0BQe.cjs → ShopScreen-BPCwix1m.cjs} +3 -3
  34. package/dist/{ShopScreen-BstU0BQe.cjs.map → ShopScreen-BPCwix1m.cjs.map} +1 -1
  35. package/dist/{TableWidget-D-r0EQ_2.cjs → TableWidget-2ttj9H5g.cjs} +10 -7
  36. package/dist/TableWidget-2ttj9H5g.cjs.map +1 -0
  37. package/dist/{TableWidget-D_6Qi3m8.mjs → TableWidget-BbjQhI2A.mjs} +10 -7
  38. package/dist/TableWidget-BbjQhI2A.mjs.map +1 -0
  39. package/dist/{TableWidget-1Bp4ZHK8.cjs → TableWidget-eVjxq7Lv.cjs} +1 -1
  40. package/dist/index.cjs +28 -21
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +2 -0
  43. package/dist/index.d.cts.map +1 -1
  44. package/dist/index.d.mts +2 -0
  45. package/dist/index.d.mts.map +1 -1
  46. package/dist/index.mjs +28 -21
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/{products-Bu0IiW0A.mjs → products-BAFSvGSa.mjs} +2 -2
  49. package/dist/{products-Bu0IiW0A.mjs.map → products-BAFSvGSa.mjs.map} +1 -1
  50. package/dist/{products-CzuNSVSG.cjs → products-CH5kIItT.cjs} +2 -2
  51. package/dist/{products-CzuNSVSG.cjs.map → products-CH5kIItT.cjs.map} +1 -1
  52. package/dist/registries-4OQmN6DO.cjs.map +1 -1
  53. package/dist/registries-Qk8P123O.mjs.map +1 -1
  54. package/dist/{src-BFKgg3tf.mjs → src-9pW9wS5O.mjs} +2 -2
  55. package/dist/{src-BFKgg3tf.mjs.map → src-9pW9wS5O.mjs.map} +1 -1
  56. package/dist/{src-MZ0kePDW.cjs → src-DMjlIMO9.cjs} +2 -2
  57. package/dist/{src-MZ0kePDW.cjs.map → src-DMjlIMO9.cjs.map} +1 -1
  58. package/dist/{use-fluid-api-CTRIRz1H.cjs → use-fluid-api-DvJuEWRf.cjs} +2 -2
  59. package/dist/{use-fluid-api-CTRIRz1H.cjs.map → use-fluid-api-DvJuEWRf.cjs.map} +1 -1
  60. package/dist/{use-fluid-api-dCyPDaGZ.mjs → use-fluid-api-Zq9sZ5vk.mjs} +2 -2
  61. package/dist/{use-fluid-api-dCyPDaGZ.mjs.map → use-fluid-api-Zq9sZ5vk.mjs.map} +1 -1
  62. package/package.json +11 -11
  63. package/dist/TableWidget-D-r0EQ_2.cjs.map +0 -1
  64. package/dist/TableWidget-D_6Qi3m8.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FluidProvider-Bp1sNJnr.mjs","names":["ApiError","encode","decode","parse","crypto","decode","importJWK","decodeBase64URL","asKeyObject","jwk.isJWK","jwk.isSecretJWK","isKeyLike","invalidKeyInput","jwk.isPrivateJWK","jwk.isPublicJWK","normalize","invalidKeyInput","crypto","getVerifyKey","subtleAlgorithm","crypto","base64url","secs","epoch","jwtPayload","clone","base64url.encode","base64url.decode","base64url","isString","fluidOs.getFluidOSManifest"],"sources":["../../../platform/api-client-core/src/fetch-client.ts","../../../api-clients/fluidos/src/namespaces/fluid_os.ts","../src/client/types.ts","../../../platform/auth/src/types.ts","../../../platform/auth/src/constants.ts","../../../platform/auth/src/browser-utils.ts","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/webcrypto.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/buffer_utils.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/errors.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/crypto_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/invalid_key_input.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/is_key_like.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_disjoint.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_object.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/check_key_length.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_jwk.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/jwk_to_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/normalize_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/key/import.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/check_key_type.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_crit.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_algorithms.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/subtle_dsa.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/flattened/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/compact/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/epoch.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/secs.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/jwt_claims_set.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwt/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/local.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/fetch_jwks.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/remote.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/decode_jwt.js","../../../platform/auth/src/token-utils.ts","../../../platform/auth/src/token-storage.ts","../../../platform/auth/src/url-token.ts","../../../platform/auth/src/dev-utils.ts","../../../platform/auth/src/auth-redirect.ts","../../../../node_modules/.pnpm/colorjs.io@0.5.2/node_modules/colorjs.io/dist/color.js","../../core/src/theme/types.ts","../../core/src/theme/color-engine.ts","../../core/src/theme/tailwind-overrides.ts","../../core/src/theme/css-generator.ts","../../core/src/theme/defaults.ts","../../core/src/theme/serialisation.ts","../../core/src/theme/transforms.ts","../../core/src/theme/theme-applicator.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/client/fluid-client.ts","../src/providers/FluidThemeProvider.tsx","../src/providers/FluidAuthProvider.tsx","../../core/src/data-sources/fetchers/api.ts","../../core/src/data-sources/fetchers/custom.ts","../../core/src/data-sources/fetchers/static.ts","../../core/src/data-sources/transformers.ts","../../core/src/data-sources/registry.ts","../../core/src/data-sources/registry-context.tsx","../../core/src/widget-utils/utils.ts","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx"],"sourcesContent":["/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\nexport interface FetchClientInstance {\n request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n requestWithFormData: <TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n },\n ) => Promise<TResponse>;\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(\n config: FetchClientConfig,\n): FetchClientInstance {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n // Read body as text first to avoid SyntaxError from response.json()\n // when server returns non-JSON bodies with application/json content-type.\n const errorText = await response.text().catch(() => \"\");\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(errorText);\n } catch {\n throw new ApiError(\n errorText.slice(0, 200) ||\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n const msg = (data.message || data.error_message) as string | undefined;\n throw new ApiError(\n msg || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request: request,\n requestWithFormData: requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = FetchClientInstance;\n","/**\n * Generated API client functions for fluid_os\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/fluid_os\";\n\n// ============================================================================\n// Fluid OS - Definitions\n// ============================================================================\n\n/**\n * List Fluid OS definitions\n * Retrieve a list of Fluid OS definitions for the current company\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listFluidOSDefinitions(\n client: FetchClient,\n params?: operations[\"listFluidOSDefinitions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSDefinitions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions`, params);\n}\n\n/**\n * Create a Fluid OS definition\n * Create a new Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createFluidOSDefinition(\n client: FetchClient,\n body: operations[\"createFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/fluid_os/definitions`, body);\n}\n\n/**\n * Get a Fluid OS definition\n * Retrieve a specific Fluid OS definition with all associations\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions/${id}`);\n}\n\n/**\n * Update a Fluid OS definition\n * Update an existing Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/company/fluid_os/definitions/${id}`, body);\n}\n\n/**\n * Delete a Fluid OS definition\n * Delete a Definition\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/fluid_os/definitions/${id}`);\n}\n\n// ============================================================================\n// Fluid OS - Navigation Items\n// ============================================================================\n\n/**\n * List navigation items for a navigation\n * Retrieve a list of navigation items for a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n */\nexport async function listFluidOSNavigationItems(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n): Promise<\n operations[\"listFluidOSNavigationItems\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n );\n}\n\n/**\n * Create a navigation item\n * Create a new navigation item for a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param body - body\n */\nexport async function createFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n body: operations[\"createFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n body,\n );\n}\n\n/**\n * Get a specific navigation item\n * Retrieve a specific navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function getFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n/**\n * Update a navigation item\n * Update an existing navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation item\n * Delete a navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Navigations\n// ============================================================================\n\n/**\n * List navigations for a Fluid OS definition\n * Retrieve a list of navigations for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSNavigations(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSNavigations\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSNavigations\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n params,\n );\n}\n\n/**\n * Create a navigation for a Fluid OS definition\n * Create a new navigation for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n body,\n );\n}\n\n/**\n * Get a specific navigation\n * Retrieve a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n/**\n * Update a navigation\n * Update an existing navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation\n * Delete a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Profiles\n// ============================================================================\n\n/**\n * List profiles for a Fluid OS definition\n * Retrieve a list of profiles for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSProfiles(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSProfiles\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSProfiles\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n params,\n );\n}\n\n/**\n * Create a profile for a Fluid OS definition\n * Create a new profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n body,\n );\n}\n\n/**\n * Get the default profile\n * Retrieve the default profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function getDefaultFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"getDefaultFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/default`,\n );\n}\n\n/**\n * Get a specific profile\n * Retrieve a specific profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n/**\n * Update a profile\n * Update an existing profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n body,\n );\n}\n\n/**\n * Delete a profile\n * Delete a profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Public\n// ============================================================================\n\n/**\n * Get active Fluid OS definition\n * Retrieve the active Fluid OS definition manifest for a specific platform\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function getFluidOSManifest(\n client: FetchClient,\n params: operations[\"getFluidOSManifest\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getFluidOSManifest\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/fluid_os/definitions/active`, params);\n}\n\n// ============================================================================\n// Fluid OS - Screens\n// ============================================================================\n\n/**\n * List screens for a Fluid OS definition\n * Retrieve a list of screens for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSScreens(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSScreens\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSScreens\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n params,\n );\n}\n\n/**\n * Create a screen for a Fluid OS definition\n * Create a new screen for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n body,\n );\n}\n\n/**\n * Get a specific screen\n * Retrieve a specific screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n/**\n * Update a screen\n * Update an existing screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n body,\n );\n}\n\n/**\n * Delete a screen\n * Delete a screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Themes\n// ============================================================================\n\n/**\n * List themes for a Fluid OS definition\n * Retrieve a list of themes for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSThemes(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSThemes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSThemes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n params,\n );\n}\n\n/**\n * Create a theme for a Fluid OS definition\n * Create a new theme for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n body,\n );\n}\n\n/**\n * Get a specific theme\n * Retrieve a specific theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n/**\n * Update a theme\n * Update an existing theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n body,\n );\n}\n\n/**\n * Delete a theme\n * Delete a theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Versions\n// ============================================================================\n\n/**\n * List versions for a Fluid OS definition\n * Retrieve a list of published versions for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSVersions(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSVersions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSVersions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n params,\n );\n}\n\n/**\n * Publish a new version of a Fluid OS definition\n * Publish a new version of the Fluid OS definition. This creates a snapshot of the current definition state including all screens, profiles, themes, and navigations. No request body is required - the manifest is built automatically from the current definition state.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function createFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"createFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n );\n}\n\n/**\n * Get a specific version\n * Retrieve a specific published version including its manifest\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n );\n}\n\n/**\n * Update a version\n * Update a version. Currently only supports activating/deactivating a version.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSVersion\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n body,\n );\n}\n","// ============================================================================\n// HTTP Method Constants\n// ============================================================================\n\n/**\n * HTTP methods supported by the API client.\n * Use `as const` for literal type inference and type safety.\n */\nexport const HTTP_METHODS = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n PATCH: \"PATCH\",\n DELETE: \"DELETE\",\n} as const;\n\n/**\n * Union type of all supported HTTP methods.\n * Derived from HTTP_METHODS constant to avoid duplication.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[keyof typeof HTTP_METHODS];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Fluid SDK client.\n * Use Readonly<FluidSDKConfig> when the config should not be modified after creation.\n */\nexport interface FluidSDKConfig {\n /**\n * Base URL for the Fluid API domain (e.g., \"https://api.fluid.app\").\n * Endpoints include their full path from root (e.g., \"/api/me\").\n */\n readonly baseUrl: string;\n\n /**\n * Function to retrieve the authentication token\n * Return null/undefined if no token is available\n */\n readonly getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Callback invoked when a 401 authentication error occurs\n * Use this to trigger re-authentication flows\n */\n readonly onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"portal\" }\n */\n readonly defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Filestack API key for messaging file uploads.\n * If not provided, file attachments will be disabled in the messaging composer.\n */\n readonly filestackApiKey?: string;\n\n /**\n * Override WebSocket URL for real-time messaging.\n * Default: derived from baseUrl by replacing trailing /api with /cable\n */\n readonly websocketUrl?: string;\n\n /**\n * ISO country code for the store/merchant (e.g., \"US\", \"CA\", \"GB\").\n * Used to fetch country-specific payment methods.\n * @default \"US\"\n */\n readonly countryIso?: string;\n}\n\n/**\n * Options for individual API requests.\n * Uses HttpMethod type for method to ensure type safety.\n */\nexport interface RequestOptions {\n readonly method?: HttpMethod;\n readonly body?: unknown;\n readonly params?: Readonly<Record<string, unknown>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\n/**\n * Pagination parameters for list endpoints\n */\nexport interface PaginationParams {\n readonly page?: number;\n readonly per_page?: number;\n}\n\n// ============================================================================\n// Sort Order - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * Sort order constant - single source of truth for sort direction values.\n * Use SORT_ORDERS.asc instead of \"asc\" for type-safe comparisons.\n */\nexport const SORT_ORDERS = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\n/**\n * Union type of sort order values, derived from SORT_ORDERS constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type SortOrder = (typeof SORT_ORDERS)[keyof typeof SORT_ORDERS];\n\n/**\n * Common filter parameters for list endpoints\n */\nexport interface BaseListParams extends PaginationParams {\n readonly sort_by?: string;\n readonly sort_order?: SortOrder;\n readonly search?: string;\n}\n","/**\n * Auth Types\n *\n * These types define the JWT payload structure and authentication\n * configuration options.\n */\n\n// ============================================================================\n// User Types - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * User type constant - single source of truth for user role values.\n * Use USER_TYPES.admin instead of \"admin\" for type-safe comparisons.\n */\nexport const USER_TYPES = {\n admin: \"admin\",\n rep: \"rep\",\n root_admin: \"root_admin\",\n customer: \"customer\",\n} as const;\n\n/**\n * Union type of all user types, derived from USER_TYPES constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type UserType = (typeof USER_TYPES)[keyof typeof USER_TYPES];\n\n/**\n * Runtime validation for user types.\n * @param value - The value to check\n * @returns true if value is a valid UserType\n */\nexport function isUserType(value: string): value is UserType {\n return Object.values(USER_TYPES).includes(value as UserType);\n}\n\n/**\n * JWT payload structure from Fluid Commerce authentication.\n * Contains user identity and role information.\n */\nexport interface JWTPayload {\n /** User ID */\n id?: number | undefined;\n /** User email address */\n email?: string | undefined;\n /** Full name of the user */\n full_name?: string | undefined;\n /** User role type */\n user_type: UserType;\n /** Original user type (for impersonation scenarios) */\n og_user_type?: UserType | undefined;\n /** Company ID the user belongs to */\n company_id?: number | undefined;\n /** Token expiration timestamp (Unix seconds) */\n exp?: number | undefined;\n /** Authentication type (e.g., \"standard\", \"impersonation\") */\n auth_type?: string | undefined;\n}\n\n/**\n * Configuration options for FluidAuthProvider.\n * All options have sensible defaults.\n */\nexport interface FluidAuthConfig {\n /**\n * URL parameter name for the auth token.\n * @default \"fluidUserToken\"\n */\n tokenKey?: string;\n\n /**\n * Cookie name for storing the auth token.\n * @default \"auth_token\"\n */\n cookieKey?: string;\n\n /**\n * Cookie max age in seconds.\n * @default 777600 (9 days)\n */\n cookieMaxAge?: number;\n\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration.\n * @default 30000 (30 seconds)\n */\n gracePeriodMs?: number;\n\n /**\n * Callback invoked when authentication fails (no valid token).\n * When omitted, the SDK redirects to `authUrl` with the current URL\n * as a redirect parameter so users can log in and return.\n */\n onAuthFailure?: () => void;\n\n /**\n * Base URL for the authentication page.\n * Used by the default auth failure redirect when `onAuthFailure` is not provided.\n * Ignored when a custom `onAuthFailure` callback is set.\n * @default \"https://auth.fluid.app\"\n */\n authUrl?: string;\n\n /**\n * Enable dev-mode auth bypass.\n * When true AND running in Vite dev mode (import.meta.env.DEV),\n * auth will use a synthetic mock user instead of requiring a real JWT.\n * The mock user allows UI rendering but API calls will fail (token is null).\n * @default false\n */\n devBypass?: boolean;\n\n /**\n * JWKS (JSON Web Key Set) URL for signature verification.\n * When provided, JWT signatures will be verified against keys\n * from this endpoint before accepting the token.\n *\n * This provides defense-in-depth client-side verification.\n * Without this, tokens are only decoded (not verified) client-side,\n * and real verification happens server-side on API calls.\n *\n * @example \"https://api.fluid.app/.well-known/jwks.json\"\n */\n jwksUrl?: string;\n}\n\n/**\n * Value provided by the FluidAuthContext.\n * All properties are readonly since context values should not be mutated by consumers.\n */\nexport interface FluidAuthContextValue {\n /** Whether the user is authenticated with a valid token */\n readonly isAuthenticated: boolean;\n /** Whether authentication is still being initialized */\n readonly isLoading: boolean;\n /** Decoded JWT payload if authenticated, null otherwise */\n readonly user: JWTPayload | null;\n /** Raw JWT token string if authenticated, null otherwise */\n readonly token: string | null;\n /** Clear authentication state and stored tokens */\n readonly clearAuth: () => void;\n /** Authentication error if any occurred during initialization */\n readonly error: Error | null;\n}\n\n/**\n * Result of token validation.\n * Uses a discriminated union for type-safe handling of valid/invalid states.\n */\nexport type TokenValidationResult =\n | {\n /** Token is valid */\n isValid: true;\n /** Decoded JWT payload */\n payload: JWTPayload;\n /** No error when valid */\n error?: undefined;\n }\n | {\n /** Token is invalid */\n isValid: false;\n /** Decoded JWT payload if parseable but expired */\n payload?: JWTPayload;\n /** Error message explaining why validation failed */\n error: string;\n };\n","/**\n * Auth Constants\n *\n * These constants define the default values for authentication\n * configuration and storage keys.\n */\n\n/**\n * Authentication-related constants with sensible defaults.\n */\nexport const AUTH_CONSTANTS = {\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration. Tokens are considered valid\n * if they expire within this period.\n */\n TOKEN_GRACE_PERIOD_MS: 30_000, // 30 seconds\n\n /**\n * Default cookie max age in seconds (9 days).\n * This matches the typical JWT token lifetime from the Fluid API.\n */\n COOKIE_MAX_AGE: 777_600, // 9 days in seconds (9 * 24 * 60 * 60)\n} as const;\n\n/**\n * Storage keys for auth tokens.\n */\nexport const STORAGE_KEYS = {\n /** localStorage key for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** localStorage key for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n /** Cookie name for auth token */\n AUTH_COOKIE: \"auth_token\",\n} as const;\n\n/**\n * Default URL parameter names for token extraction.\n */\nexport const URL_PARAMS = {\n /** URL parameter name for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** URL parameter name for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n} as const;\n","/**\n * Browser environment detection utility.\n * Shared across auth modules to avoid duplication.\n */\n\n/**\n * Check if we're running in a browser environment.\n * Checks both `window` and `document` to ensure full DOM availability.\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n","export default crypto;\nexport const isCryptoKey = (key) => key instanceof CryptoKey;\n","import digest from '../runtime/digest.js';\nexport const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nexport function p2s(alg, p2sInput) {\n return concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function lengthAndInput(input) {\n return concat(uint32be(input.length), input);\n}\nexport async function concatKdf(secret, bits, value) {\n const iterations = Math.ceil((bits >> 3) / 32);\n const res = new Uint8Array(iterations * 32);\n for (let iter = 0; iter < iterations; iter++) {\n const buf = new Uint8Array(4 + secret.length + value.length);\n buf.set(uint32be(iter + 1));\n buf.set(secret, 4);\n buf.set(value, 4 + secret.length);\n res.set(await digest('sha256', buf), iter * 32);\n }\n return res.slice(0, bits >> 3);\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nexport const encodeBase64 = (input) => {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < unencoded.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, unencoded.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n};\nexport const encode = (input) => {\n return encodeBase64(input).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\nexport const decodeBase64 = (encoded) => {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n};\nexport const decode = (input) => {\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n};\n","export class JOSEError extends Error {\n constructor(message, options) {\n super(message, options);\n this.code = 'ERR_JOSE_GENERIC';\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nJOSEError.code = 'ERR_JOSE_GENERIC';\nexport class JWTClaimValidationFailed extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTClaimValidationFailed.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\nexport class JWTExpired extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_EXPIRED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTExpired.code = 'ERR_JWT_EXPIRED';\nexport class JOSEAlgNotAllowed extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n }\n}\nJOSEAlgNotAllowed.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\nexport class JOSENotSupported extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_NOT_SUPPORTED';\n }\n}\nJOSENotSupported.code = 'ERR_JOSE_NOT_SUPPORTED';\nexport class JWEDecryptionFailed extends JOSEError {\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n this.code = 'ERR_JWE_DECRYPTION_FAILED';\n }\n}\nJWEDecryptionFailed.code = 'ERR_JWE_DECRYPTION_FAILED';\nexport class JWEInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWE_INVALID';\n }\n}\nJWEInvalid.code = 'ERR_JWE_INVALID';\nexport class JWSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWS_INVALID';\n }\n}\nJWSInvalid.code = 'ERR_JWS_INVALID';\nexport class JWTInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWT_INVALID';\n }\n}\nJWTInvalid.code = 'ERR_JWT_INVALID';\nexport class JWKInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWK_INVALID';\n }\n}\nJWKInvalid.code = 'ERR_JWK_INVALID';\nexport class JWKSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWKS_INVALID';\n }\n}\nJWKSInvalid.code = 'ERR_JWKS_INVALID';\nexport class JWKSNoMatchingKey extends JOSEError {\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_NO_MATCHING_KEY';\n }\n}\nJWKSNoMatchingKey.code = 'ERR_JWKS_NO_MATCHING_KEY';\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n }\n}\nSymbol.asyncIterator;\nJWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\nexport class JWKSTimeout extends JOSEError {\n constructor(message = 'request timed out', options) {\n super(message, options);\n this.code = 'ERR_JWKS_TIMEOUT';\n }\n}\nJWKSTimeout.code = 'ERR_JWKS_TIMEOUT';\nexport class JWSSignatureVerificationFailed extends JOSEError {\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n this.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n }\n}\nJWSSignatureVerificationFailed.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n","function unusable(name, prop = 'algorithm.name') {\n return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\n}\nfunction isAlgorithm(algorithm, name) {\n return algorithm.name === name;\n}\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usages) {\n if (usages.length && !usages.some((expected) => key.usages.includes(expected))) {\n let msg = 'CryptoKey does not support this operation, its usages must include ';\n if (usages.length > 2) {\n const last = usages.pop();\n msg += `one of ${usages.join(', ')}, or ${last}.`;\n }\n else if (usages.length === 2) {\n msg += `one of ${usages[0]} or ${usages[1]}.`;\n }\n else {\n msg += `${usages[0]}.`;\n }\n throw new TypeError(msg);\n }\n}\nexport function checkSigCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'EdDSA': {\n if (key.algorithm.name !== 'Ed25519' && key.algorithm.name !== 'Ed448') {\n throw unusable('Ed25519 or Ed448');\n }\n break;\n }\n case 'Ed25519': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\nexport function checkEncCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n case 'X448':\n break;\n default:\n throw unusable('ECDH, X25519, or X448');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport default (actual, ...types) => {\n return message('Key must be ', actual, ...types);\n};\nexport function withAlg(alg, actual, ...types) {\n return message(`Key for the ${alg} algorithm must be `, actual, ...types);\n}\n","import { isCryptoKey } from './webcrypto.js';\nexport default (key) => {\n if (isCryptoKey(key)) {\n return true;\n }\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nexport const types = ['CryptoKey'];\n","const isDisjoint = (...headers) => {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n};\nexport default isDisjoint;\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\n","export default (alg, key) => {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n};\n","import isObject from './is_object.js';\nexport function isJWK(key) {\n return isObject(key) && typeof key.kty === 'string';\n}\nexport function isPrivateJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'string';\n}\nexport function isPublicJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'undefined';\n}\nexport function isSecretJWK(key) {\n return isJWK(key) && key.kty === 'oct' && typeof key.k === 'string';\n}\n","import crypto from './webcrypto.js';\nimport { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'EdDSA':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nconst parse = async (jwk) => {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const rest = [\n algorithm,\n jwk.ext ?? false,\n jwk.key_ops ?? keyUsages,\n ];\n const keyData = { ...jwk };\n delete keyData.alg;\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, ...rest);\n};\nexport default parse;\n","import { isJWK } from '../lib/is_jwk.js';\nimport { decode } from './base64url.js';\nimport importJWK from './jwk_to_key.js';\nconst exportKeyValue = (k) => decode(k);\nlet privCache;\nlet pubCache;\nconst isKeyObject = (key) => {\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nconst importAndCache = async (cache, key, jwk, alg, freeze = false) => {\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await importJWK({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst normalizePublicKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n delete jwk.d;\n delete jwk.dp;\n delete jwk.dq;\n delete jwk.p;\n delete jwk.q;\n delete jwk.qi;\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n pubCache || (pubCache = new WeakMap());\n return importAndCache(pubCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n pubCache || (pubCache = new WeakMap());\n const cryptoKey = importAndCache(pubCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nconst normalizePrivateKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n privCache || (privCache = new WeakMap());\n return importAndCache(privCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n privCache || (privCache = new WeakMap());\n const cryptoKey = importAndCache(privCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nexport default { normalizePublicKey, normalizePrivateKey };\n","import { decode as decodeBase64URL } from '../runtime/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../runtime/asn1.js';\nimport asKeyObject from '../runtime/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n alg || (alg = jwk.alg);\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n case 'EC':\n case 'OKP':\n return asKeyObject({ ...jwk, alg });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport isKeyLike, { types } from '../runtime/is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined && key.use !== 'sig') {\n throw new TypeError('Invalid key for this operation, when present its use must be sig');\n }\n if (key.key_ops !== undefined && key.key_ops.includes?.(usage) !== true) {\n throw new TypeError(`Invalid key for this operation, when present its key_ops must include ${usage}`);\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, when present its alg must be ${alg}`);\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (key instanceof Uint8Array)\n return;\n if (allowJwk && jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, 'Uint8Array', allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (allowJwk && jwk.isJWK(key)) {\n switch (usage) {\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a private JWK`);\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (usage === 'sign' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n }\n if (usage === 'decrypt' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n if (key.algorithm && usage === 'verify' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n }\n if (key.algorithm && usage === 'encrypt' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n};\nfunction checkKeyType(allowJwk, alg, key, usage) {\n const symmetric = alg.startsWith('HS') ||\n alg === 'dir' ||\n alg.startsWith('PBES2') ||\n /^A\\d{3}(?:GCM)?KW$/.test(alg);\n if (symmetric) {\n symmetricTypeCheck(alg, key, usage, allowJwk);\n }\n else {\n asymmetricTypeCheck(alg, key, usage, allowJwk);\n }\n}\nexport default checkKeyType.bind(undefined, false);\nexport const checkKeyTypeWithJwk = checkKeyType.bind(undefined, true);\n","import { JOSENotSupported } from '../util/errors.js';\nfunction validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\nexport default validateCrit;\n","const validateAlgorithms = (option, algorithms) => {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n};\nexport default validateAlgorithms;\n","import { JOSENotSupported } from '../util/errors.js';\nexport default function subtleDsa(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n return { name: 'Ed25519' };\n case 'EdDSA':\n return { name: algorithm.name };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\n","import crypto, { isCryptoKey } from './webcrypto.js';\nimport { checkSigCryptoKey } from '../lib/crypto_key.js';\nimport invalidKeyInput from '../lib/invalid_key_input.js';\nimport { types } from './is_key_like.js';\nimport normalize from './normalize_key.js';\nexport default async function getCryptoKey(alg, key, usage) {\n if (usage === 'sign') {\n key = await normalize.normalizePrivateKey(key, alg);\n }\n if (usage === 'verify') {\n key = await normalize.normalizePublicKey(key, alg);\n }\n if (isCryptoKey(key)) {\n checkSigCryptoKey(key, alg, usage);\n return key;\n }\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, ...types));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array', 'JSON Web Key'));\n}\n","import subtleAlgorithm from './subtle_dsa.js';\nimport crypto from './webcrypto.js';\nimport checkKeyLength from './check_key_length.js';\nimport getVerifyKey from './get_sign_verify_key.js';\nconst verify = async (alg, key, signature, data) => {\n const cryptoKey = await getVerifyKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n};\nexport default verify;\n","import { decode as base64url } from '../../runtime/base64url.js';\nimport verify from '../../runtime/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder } from '../../lib/buffer_utils.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport isObject from '../../lib/is_object.js';\nimport { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport validateAlgorithms from '../../lib/validate_algorithms.js';\nimport { isJWK } from '../../lib/is_jwk.js';\nimport { importJWK } from '../../key/import.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = base64url(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n checkKeyTypeWithJwk(alg, key, 'verify');\n if (isJWK(key)) {\n key = await importJWK(key, alg);\n }\n }\n else {\n checkKeyTypeWithJwk(alg, key, 'verify');\n }\n const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);\n let signature;\n try {\n signature = base64url(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const verified = await verify(alg, key, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = base64url(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","export default (date) => Math.floor(date.getTime() / 1000);\n","const minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport default (str) => {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n};\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { decoder } from './buffer_utils.js';\nimport epoch from './epoch.js';\nimport secs from './secs.js';\nimport isObject from './is_object.js';\nconst normalizeTyp = (value) => value.toLowerCase().replace(/^application\\//, '');\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport default (protectedHeader, encodedPayload, options = {}) => {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n};\n","import { compactVerify } from '../jws/compact/verify.js';\nimport jwtPayload from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = jwtPayload(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nfunction clone(obj) {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\nclass LocalJWKSet {\n constructor(jwks) {\n this._cached = new WeakMap();\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this._jwks = clone(jwks);\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this._jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && typeof jwk.alg === 'string') {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES256K':\n candidate = jwk.crv === 'secp256k1';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n candidate = jwk.crv === 'Ed25519';\n break;\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const { _cached } = this;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this._cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => clone(set._jwks),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSTimeout } from '../util/errors.js';\nconst fetchJwks = async (url, timeout, options) => {\n let controller;\n let id;\n let timedOut = false;\n if (typeof AbortController === 'function') {\n controller = new AbortController();\n id = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n }\n const response = await fetch(url.href, {\n signal: controller ? controller.signal : undefined,\n redirect: 'manual',\n headers: options.headers,\n }).catch((err) => {\n if (timedOut)\n throw new JWKSTimeout();\n throw err;\n });\n if (id !== undefined)\n clearTimeout(id);\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n};\nexport default fetchJwks;\n","import fetchJwks from '../runtime/fetch_jwks.js';\nimport { JWKSNoMatchingKey } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport isObject from '../lib/is_object.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v5.10.0';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this._url = new URL(url.href);\n this._options = { agent: options?.agent, headers: options?.headers };\n this._timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this._cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this._cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n if (options?.[jwksCache] !== undefined) {\n this._cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this._cacheMaxAge)) {\n this._jwksTimestamp = this._cache.uat;\n this._local = createLocalJWKSet(this._cache.jwks);\n }\n }\n }\n coolingDown() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cooldownDuration\n : false;\n }\n fresh() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cacheMaxAge\n : false;\n }\n async getKey(protectedHeader, token) {\n if (!this._local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this._local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this._local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this._pendingFetch && isCloudflareWorkers()) {\n this._pendingFetch = undefined;\n }\n const headers = new Headers(this._options.headers);\n if (USER_AGENT && !headers.has('User-Agent')) {\n headers.set('User-Agent', USER_AGENT);\n this._options.headers = Object.fromEntries(headers.entries());\n }\n this._pendingFetch || (this._pendingFetch = fetchJwks(this._url, this._timeoutDuration, this._options)\n .then((json) => {\n this._local = createLocalJWKSet(json);\n if (this._cache) {\n this._cache.uat = Date.now();\n this._cache.jwks = json;\n }\n this._jwksTimestamp = Date.now();\n this._pendingFetch = undefined;\n })\n .catch((err) => {\n this._pendingFetch = undefined;\n throw err;\n }));\n await this._pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => !!set._pendingFetch,\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set._local?.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\nexport const experimental_jwksCache = jwksCache;\n","import * as base64url from '../runtime/base64url.js';\nexport const encode = base64url.encode;\nexport const decode = base64url.decode;\n","import { decode as base64url } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport isObject from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = base64url(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","/**\n * Token Utilities\n *\n * Functions for decoding, validating, and checking JWT tokens.\n */\n\nimport {\n decodeJwt,\n jwtVerify,\n createRemoteJWKSet,\n type JWTPayload as JoseJWTPayload,\n} from \"jose\";\nimport { AUTH_CONSTANTS } from \"./constants\";\nimport type { JWTPayload, TokenValidationResult } from \"./types\";\nimport { isUserType } from \"./types\";\n\n/**\n * Extract a JWTPayload from a jose-decoded JWT payload.\n *\n * Type assertions are required because jose's payload type uses `unknown`\n * for custom claims. This helper centralises the mapping so that\n * both {@link decodeToken} and {@link verifyToken} share the same logic.\n */\nfunction extractPayloadFromJose(\n decoded: JoseJWTPayload & Partial<JWTPayload>,\n): JWTPayload {\n const rawUserType = decoded.user_type;\n const rawOgUserType = decoded.og_user_type;\n\n return {\n id: typeof decoded.id === \"number\" ? decoded.id : undefined,\n email: typeof decoded.email === \"string\" ? decoded.email : undefined,\n full_name:\n typeof decoded.full_name === \"string\" ? decoded.full_name : undefined,\n user_type:\n typeof rawUserType === \"string\" && isUserType(rawUserType)\n ? rawUserType\n : \"rep\",\n og_user_type:\n typeof rawOgUserType === \"string\" && isUserType(rawOgUserType)\n ? rawOgUserType\n : undefined,\n company_id:\n typeof decoded.company_id === \"number\" ? decoded.company_id : undefined,\n exp: decoded.exp,\n auth_type:\n typeof decoded.auth_type === \"string\" ? decoded.auth_type : undefined,\n };\n}\n\n/**\n * Decode a JWT token and extract its payload.\n *\n * **Security note:** This function does NOT verify the JWT signature.\n * It only decodes the payload. Any valid JWT structure will be accepted,\n * regardless of who signed it.\n *\n * Client-side token decoding is used for UX purposes only (displaying\n * user info, role-based UI). The real security boundary is the server-side\n * API, which verifies the signature on every request.\n *\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @returns The decoded JWT payload, or null if decoding fails\n */\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n // Type assertion required: jose's decodeJwt returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = decodeJwt(token) as JoseJWTPayload & Partial<JWTPayload>;\n\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] Failed to decode JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Check if a token has expired.\n * Includes a configurable grace period to account for clock skew.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period in milliseconds (default: 30 seconds)\n * @returns true if the token is expired, false otherwise\n */\nexport function isTokenExpired(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): boolean {\n try {\n const decoded = decodeJwt(token);\n\n // If no expiration, token never expires\n if (!decoded.exp) {\n return false;\n }\n\n // exp is in seconds, convert to milliseconds\n const expirationTime = decoded.exp * 1000;\n const currentTime = Date.now();\n\n // Token is expired if current time is past expiration + grace period\n return currentTime > expirationTime + gracePeriodMs;\n } catch {\n // If we can't decode the token, treat it as expired\n return true;\n }\n}\n\n/**\n * Validate a JWT token for format and expiration.\n *\n * **Security note:** This function checks JWT structure and expiration\n * but does NOT verify the signature. It is a UX-level check only.\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period for expiration check (default: 30 seconds)\n * @returns Validation result with status and decoded payload if valid\n */\nexport function validateToken(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): TokenValidationResult {\n // Check if token is provided\n if (!token || token.trim() === \"\") {\n return {\n isValid: false,\n error: \"Token is empty or not provided\",\n };\n }\n\n // Try to decode the token\n const payload = decodeToken(token);\n if (!payload) {\n return {\n isValid: false,\n error: \"Token has invalid format\",\n };\n }\n\n // Check expiration\n if (isTokenExpired(token, gracePeriodMs)) {\n return {\n isValid: false,\n payload,\n error: \"Token has expired\",\n };\n }\n\n return {\n isValid: true,\n payload,\n };\n}\n\n/**\n * Type guard to check if a validation result is valid.\n * Enables TypeScript narrowing of the result type.\n *\n * @param result - The validation result to check\n * @returns true if the token is valid (narrows payload to non-optional)\n */\nexport function isValidToken(\n result: TokenValidationResult,\n): result is TokenValidationResult & { isValid: true; payload: JWTPayload } {\n return result.isValid === true;\n}\n\n/**\n * Get the expiration time of a token as a Date.\n *\n * @param token - The JWT token string\n * @returns The expiration Date, or null if token has no expiration or is invalid\n */\nexport function getTokenExpiration(token: string): Date | null {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return null;\n }\n return new Date(decoded.exp * 1000);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the time remaining until token expiration in milliseconds.\n *\n * @param token - The JWT token string\n * @returns Milliseconds until expiration, or 0 if expired/invalid, or Infinity if no expiration\n */\nexport function getTokenTimeRemaining(token: string): number {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return Infinity;\n }\n const expirationTime = decoded.exp * 1000;\n const remaining = expirationTime - Date.now();\n return Math.max(0, remaining);\n } catch {\n return 0;\n }\n}\n\n/**\n * Verify a JWT token's signature using a JWKS endpoint and extract its payload.\n *\n * Unlike {@link decodeToken}, this function cryptographically verifies\n * that the token was signed by a trusted key.\n *\n * @param token - The JWT token string\n * @param jwksUrl - URL of the JWKS endpoint\n * @returns The verified JWT payload, or null if verification fails\n */\nexport async function verifyToken(\n token: string,\n jwksUrl: string,\n): Promise<JWTPayload | null> {\n try {\n const JWKS = createRemoteJWKSet(new URL(jwksUrl));\n const { payload } = await jwtVerify(token, JWKS);\n\n // Type assertion required: jose's jwtVerify returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = payload as JoseJWTPayload & Partial<JWTPayload>;\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] JWT signature verification failed:\", error);\n return null;\n }\n}\n","/**\n * Token Storage Utilities\n *\n * Functions for storing and retrieving auth tokens from\n * cookies and localStorage.\n */\n\nimport { AUTH_CONSTANTS, STORAGE_KEYS } from \"./constants\";\nimport type { FluidAuthConfig } from \"./types\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Parse cookies from document.cookie string into an object.\n */\nfunction parseCookies(): Record<string, string> {\n if (!isBrowser()) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const cookieString = document.cookie;\n\n if (!cookieString) {\n return cookies;\n }\n\n cookieString.split(\";\").forEach((cookie) => {\n const [name, ...valueParts] = cookie.trim().split(\"=\");\n if (name) {\n cookies[name] = decodeURIComponent(valueParts.join(\"=\"));\n }\n });\n\n return cookies;\n}\n\n/**\n * Set a cookie with the given options.\n */\nfunction setCookie(\n name: string,\n value: string,\n options: Readonly<{\n maxAge?: number;\n path?: string;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n secure?: boolean;\n }> = {},\n): void {\n if (!isBrowser()) {\n return;\n }\n\n const {\n maxAge = AUTH_CONSTANTS.COOKIE_MAX_AGE,\n path = \"/\",\n sameSite = \"lax\",\n secure = window.location.protocol === \"https:\",\n } = options;\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n cookieString += `; path=${path}`;\n cookieString += `; max-age=${maxAge}`;\n cookieString += `; samesite=${sameSite}`;\n\n if (secure) {\n cookieString += \"; secure\";\n }\n\n document.cookie = cookieString;\n}\n\n/**\n * Delete a cookie by setting its max-age to 0.\n */\nfunction deleteCookie(name: string, path: string = \"/\"): void {\n if (!isBrowser()) {\n return;\n }\n\n document.cookie = `${name}=; path=${path}; max-age=0`;\n}\n\n/**\n * Get the stored auth token.\n * Checks cookie first, then falls back to localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n * @returns The stored token or null if not found\n */\nexport function getStoredToken(config?: FluidAuthConfig): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const localStorageKey = STORAGE_KEYS.USER_TOKEN;\n\n // Priority: cookie > localStorage\n const cookies = parseCookies();\n const cookieToken = cookies[cookieKey];\n\n if (cookieToken) {\n return cookieToken;\n }\n\n try {\n return localStorage.getItem(localStorageKey);\n } catch {\n // localStorage might be unavailable (private browsing, etc.)\n return null;\n }\n}\n\n/**\n * Store an auth token in both cookie and localStorage.\n * Using both provides redundancy and compatibility with different auth flows.\n *\n * @param token - The JWT token to store\n * @param config - Optional auth config for custom storage options\n */\nexport function storeToken(token: string, config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const maxAge = config?.cookieMaxAge ?? AUTH_CONSTANTS.COOKIE_MAX_AGE;\n\n // Store in cookie\n try {\n const inIframe = window.self !== window.top;\n const sameSite = inIframe ? \"none\" : \"lax\";\n setCookie(cookieKey, token, {\n maxAge,\n path: \"/\",\n sameSite,\n // SameSite=None requires Secure per RFC 6265bis; browsers silently\n // reject the cookie otherwise (e.g. HTTP localhost in an iframe).\n secure: sameSite === \"none\" || window.location.protocol === \"https:\",\n });\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in cookie:\", error);\n }\n\n // Also store in localStorage as backup\n try {\n localStorage.setItem(STORAGE_KEYS.USER_TOKEN, token);\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in localStorage:\", error);\n }\n}\n\n/**\n * Clear all stored auth tokens from cookies and localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n */\nexport function clearTokens(config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n\n // Clear cookie\n try {\n deleteCookie(cookieKey);\n } catch {\n // Ignore cleanup errors\n }\n\n // Clear localStorage\n try {\n localStorage.removeItem(STORAGE_KEYS.USER_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.COMPANY_TOKEN);\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if any auth token is stored.\n *\n * @param config - Optional auth config\n * @returns true if a token is stored, false otherwise\n */\nexport function hasStoredToken(config?: FluidAuthConfig): boolean {\n return getStoredToken(config) !== null;\n}\n\n/**\n * Clear all stored auth tokens and redirect the user.\n * Combines clearTokens() + window redirect in a single call.\n *\n * @param redirectUrl - URL to redirect to after clearing tokens (default: \"/\")\n * @param config - Optional auth config for custom cookie key\n */\nexport function handleAuthError(\n redirectUrl: string = \"/\",\n config?: FluidAuthConfig,\n): void {\n clearTokens(config);\n if (isBrowser()) {\n window.location.href = redirectUrl;\n }\n}\n","/**\n * URL Token Utilities\n *\n * Functions for extracting and cleaning auth tokens from URL parameters.\n * This is the primary way tokens are passed from the parent Fluid Commerce\n * app to embedded portals.\n *\n * **Security model**: Tokens in URL parameters are a known tradeoff.\n * The token is extracted and immediately cleaned from the URL via\n * `history.replaceState()`. A `Referrer-Policy` meta tag in the\n * starter template prevents the token from leaking in referrer headers.\n */\n\nimport { URL_PARAMS } from \"./constants\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Extract the auth token from the URL query parameters.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns The token value or null if not present\n */\nexport function extractTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the company token from the URL query parameters.\n * This is a legacy parameter that may still be used in some flows.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidCompanyToken\")\n * @returns The token value or null if not present\n */\nexport function extractCompanyTokenFromUrl(\n tokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Remove the auth token from the URL without reloading the page.\n * This prevents the token from being accidentally shared via URL copy/paste\n * or appearing in browser history.\n *\n * Uses history.replaceState to update the URL cleanly.\n *\n * @param tokenKey - The URL parameter name to remove (default: \"fluidUserToken\")\n */\nexport function cleanTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const url = new URL(window.location.href);\n const hadToken = url.searchParams.has(tokenKey);\n const hadCompanyToken = url.searchParams.has(URL_PARAMS.COMPANY_TOKEN);\n\n // Remove both user and company tokens\n url.searchParams.delete(tokenKey);\n url.searchParams.delete(URL_PARAMS.COMPANY_TOKEN);\n\n // Only update URL if we actually removed something\n if (hadToken || hadCompanyToken) {\n // Use replaceState to avoid adding to browser history\n window.history.replaceState(\n window.history.state,\n document.title,\n url.toString(),\n );\n }\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to clean token from URL:\", error);\n }\n}\n\n/**\n * Check if the URL contains an auth token parameter.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns true if the URL contains the token parameter\n */\nexport function hasTokenInUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.has(tokenKey);\n } catch {\n return false;\n }\n}\n\n/**\n * Extract all auth-related tokens from the URL at once.\n *\n * @param userTokenKey - The URL parameter name for user token\n * @param companyTokenKey - The URL parameter name for company token\n * @returns Object with both token values (or null if not present)\n */\nexport function extractAllTokensFromUrl(\n userTokenKey: string = URL_PARAMS.USER_TOKEN,\n companyTokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): { userToken: string | null; companyToken: string | null } {\n if (!isBrowser()) {\n return { userToken: null, companyToken: null };\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return {\n userToken: searchParams.get(userTokenKey),\n companyToken: searchParams.get(companyTokenKey),\n };\n } catch {\n return { userToken: null, companyToken: null };\n }\n}\n","import type { JWTPayload } from \"./types\";\nimport { USER_TYPES } from \"./types\";\n\n/**\n * Check if dev bypass should be active.\n * Requires both the config flag AND Vite dev mode.\n */\nexport function isDevBypassActive(devBypass?: boolean): boolean {\n if (!devBypass) return false;\n\n try {\n // import.meta.env.DEV is a Vite compile-time constant.\n // It's `true` in dev mode and completely tree-shaken in production.\n // The type assertion avoids requiring Vite ambient types in all consumers.\n const meta = import.meta as { env?: { DEV?: boolean } };\n return meta.env?.DEV === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a synthetic dev user for local development.\n * This user has realistic data for UI rendering but no real auth.\n */\nexport function createDevUser(): JWTPayload {\n return {\n id: 99999, // Dev placeholder — avoids falsy 0\n email: \"dev@localhost\",\n full_name: \"Dev User\",\n user_type: USER_TYPES.rep,\n og_user_type: undefined,\n company_id: 99999, // Dev placeholder — avoids falsy 0\n exp: undefined, // Never expires\n auth_type: \"dev_bypass\",\n };\n}\n","/**\n * Auth Redirect Utilities\n *\n * Provides default redirect behavior for authentication failures.\n * When no custom callback is provided, the SDK redirects to Fluid's\n * auth page with a redirect_url pointing back to the current page.\n *\n * Includes loop detection: if a redirect was attempted within the\n * cooldown window, subsequent calls are suppressed to prevent\n * infinite redirect cycles (e.g., auth returns a token the API rejects).\n */\n\n/**\n * Default Fluid authentication URL.\n * Users are redirected here when auth fails and no custom handler is provided.\n */\nexport const DEFAULT_AUTH_URL = \"https://auth.fluid.app\";\n\n/**\n * URL parameter name used by auth.fluid.app when redirecting back with a token.\n * This differs from the SDK's default `fluidUserToken` (used by the parent Fluid app\n * when embedding portals in iframes). The auth provider checks both.\n */\nexport const AUTH_REDIRECT_TOKEN_KEY = \"jwt\";\n\n/** sessionStorage key for loop detection */\nconst REDIRECT_TIMESTAMP_KEY = \"__fluid_auth_redirect_ts\";\n\n/** Minimum seconds between redirect attempts */\nconst REDIRECT_COOLDOWN_S = 10;\n\n/**\n * Check if a redirect was recently attempted.\n * Returns true if we should suppress the redirect to avoid a loop.\n */\nfunction isRedirectLoop(): boolean {\n try {\n const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);\n if (!ts) return false;\n const elapsed = (Date.now() - Number(ts)) / 1000;\n return elapsed < REDIRECT_COOLDOWN_S;\n } catch {\n // sessionStorage unavailable (SSR, privacy mode) — allow redirect\n return false;\n }\n}\n\n/**\n * Record that a redirect is about to happen.\n */\nfunction markRedirect(): void {\n try {\n sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));\n } catch {\n // sessionStorage unavailable — best-effort\n }\n}\n\n/**\n * Creates a redirect function that navigates to the auth URL\n * with the current page URL encoded as a redirect parameter.\n *\n * Includes loop detection: if a redirect was attempted within the last\n * {@link REDIRECT_COOLDOWN_S} seconds, the redirect is suppressed and\n * the normal error UI is allowed to render instead.\n *\n * @param authUrl - Custom auth URL to redirect to. Defaults to DEFAULT_AUTH_URL.\n * @returns A function that performs the redirect when called (no-op if loop detected).\n */\nexport function createDefaultAuthRedirect(authUrl?: string): () => void {\n return () => {\n if (isRedirectLoop()) {\n console.warn(\n \"[FluidAuth] Auth redirect suppressed — possible redirect loop. \" +\n \"Check that your auth server returns a token accepted by the API.\",\n );\n return;\n }\n markRedirect();\n const base = authUrl ?? DEFAULT_AUTH_URL;\n const currentUrl = encodeURIComponent(window.location.href);\n window.location.href = `${base}/?redirect_url=${currentUrl}`;\n };\n}\n\n/**\n * Resolves the effective auth failure handler.\n * Returns the custom callback if provided, otherwise creates a default redirect.\n *\n * @param onAuthFailure - Custom callback from user config\n * @param authUrl - Custom auth URL (only used when creating the default redirect)\n * @returns The resolved handler function\n */\nexport function resolveAuthFailureHandler(\n onAuthFailure?: (() => void) | undefined,\n authUrl?: string | undefined,\n): () => void {\n return onAuthFailure ?? createDefaultAuthRedirect(authUrl);\n}\n","// A is m x n. B is n x p. product is m x p.\nfunction multiplyMatrices (A, B) {\n\tlet m = A.length;\n\n\tif (!Array.isArray(A[0])) {\n\t\t// A is vector, convert to [[a, b, c, ...]]\n\t\tA = [A];\n\t}\n\n\tif (!Array.isArray(B[0])) {\n\t\t// B is vector, convert to [[a], [b], [c], ...]]\n\t\tB = B.map(x => [x]);\n\t}\n\n\tlet p = B[0].length;\n\tlet B_cols = B[0].map((_, i) => B.map(x => x[i])); // transpose B\n\tlet product = A.map(row => B_cols.map(col => {\n\t\tlet ret = 0;\n\n\t\tif (!Array.isArray(row)) {\n\t\t\tfor (let c of col) {\n\t\t\t\tret += row * c;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tfor (let i = 0; i < row.length; i++) {\n\t\t\tret += row[i] * (col[i] || 0);\n\t\t}\n\n\t\treturn ret;\n\t}));\n\n\tif (m === 1) {\n\t\tproduct = product[0]; // Avoid [[a, b, c, ...]]\n\t}\n\n\tif (p === 1) {\n\t\treturn product.map(x => x[0]); // Avoid [[a], [b], [c], ...]]\n\t}\n\n\treturn product;\n}\n\n/**\n * Various utility functions\n */\n\n\n/**\n * Check if a value is a string (including a String object)\n * @param {*} str - Value to check\n * @returns {boolean}\n */\nfunction isString (str) {\n\treturn type(str) === \"string\";\n}\n\n/**\n * Determine the internal JavaScript [[Class]] of an object.\n * @param {*} o - Value to check\n * @returns {string}\n */\nfunction type (o) {\n\tlet str = Object.prototype.toString.call(o);\n\n\treturn (str.match(/^\\[object\\s+(.*?)\\]$/)[1] || \"\").toLowerCase();\n}\n\nfunction serializeNumber (n, {precision, unit }) {\n\tif (isNone(n)) {\n\t\treturn \"none\";\n\t}\n\n\treturn toPrecision(n, precision) + (unit ?? \"\");\n}\n\n/**\n * Check if a value corresponds to a none argument\n * @param {*} n - Value to check\n * @returns {boolean}\n */\nfunction isNone (n) {\n\treturn Number.isNaN(n) || (n instanceof Number && n?.none);\n}\n\n/**\n * Replace none values with 0\n */\nfunction skipNone (n) {\n\treturn isNone(n) ? 0 : n;\n}\n\n/**\n * Round a number to a certain number of significant digits\n * @param {number} n - The number to round\n * @param {number} precision - Number of significant digits\n */\nfunction toPrecision (n, precision) {\n\tif (n === 0) {\n\t\treturn 0;\n\t}\n\tlet integer = ~~n;\n\tlet digits = 0;\n\tif (integer && precision) {\n\t\tdigits = ~~Math.log10(Math.abs(integer)) + 1;\n\t}\n\tconst multiplier = 10.0 ** (precision - digits);\n\treturn Math.floor(n * multiplier + 0.5) / multiplier;\n}\n\nconst angleFactor = {\n\tdeg: 1,\n\tgrad: 0.9,\n\trad: 180 / Math.PI,\n\tturn: 360,\n};\n\n/**\n* Parse a CSS function, regardless of its name and arguments\n* @param String str String to parse\n* @return {{name, args, rawArgs}}\n*/\nfunction parseFunction (str) {\n\tif (!str) {\n\t\treturn;\n\t}\n\n\tstr = str.trim();\n\n\tconst isFunctionRegex = /^([a-z]+)\\((.+?)\\)$/i;\n\tconst isNumberRegex = /^-?[\\d.]+$/;\n\tconst unitValueRegex = /%|deg|g?rad|turn$/;\n\tconst singleArgument = /\\/?\\s*(none|[-\\w.]+(?:%|deg|g?rad|turn)?)/g;\n\tlet parts = str.match(isFunctionRegex);\n\n\tif (parts) {\n\t\t// It is a function, parse args\n\t\tlet args = [];\n\t\tparts[2].replace(singleArgument, ($0, rawArg) => {\n\t\t\tlet match = rawArg.match(unitValueRegex);\n\t\t\tlet arg = rawArg;\n\n\t\t\tif (match) {\n\t\t\t\tlet unit = match[0];\n\t\t\t\t// Drop unit from value\n\t\t\t\tlet unitlessArg = arg.slice(0, -unit.length);\n\n\t\t\t\tif (unit === \"%\") {\n\t\t\t\t\t// Convert percentages to 0-1 numbers\n\t\t\t\t\targ = new Number(unitlessArg / 100);\n\t\t\t\t\targ.type = \"<percentage>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Multiply angle by appropriate factor for its unit\n\t\t\t\t\targ = new Number(unitlessArg * angleFactor[unit]);\n\t\t\t\t\targ.type = \"<angle>\";\n\t\t\t\t\targ.unit = unit;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (isNumberRegex.test(arg)) {\n\t\t\t\t// Convert numerical args to numbers\n\t\t\t\targ = new Number(arg);\n\t\t\t\targ.type = \"<number>\";\n\t\t\t}\n\t\t\telse if (arg === \"none\") {\n\t\t\t\targ = new Number(NaN);\n\t\t\t\targ.none = true;\n\t\t\t}\n\n\t\t\tif ($0.startsWith(\"/\")) {\n\t\t\t\t// It's alpha\n\t\t\t\targ = arg instanceof Number ? arg : new Number(arg);\n\t\t\t\targ.alpha = true;\n\t\t\t}\n\n\t\t\tif (typeof arg === \"object\" && arg instanceof Number) {\n\t\t\t\targ.raw = rawArg;\n\t\t\t}\n\n\t\t\targs.push(arg);\n\t\t});\n\n\t\treturn {\n\t\t\tname: parts[1].toLowerCase(),\n\t\t\trawName: parts[1],\n\t\t\trawArgs: parts[2],\n\t\t\t// An argument could be (as of css-color-4):\n\t\t\t// a number, percentage, degrees (hue), ident (in color())\n\t\t\targs,\n\t\t};\n\t}\n}\n\nfunction last (arr) {\n\treturn arr[arr.length - 1];\n}\n\nfunction interpolate (start, end, p) {\n\tif (isNaN(start)) {\n\t\treturn end;\n\t}\n\n\tif (isNaN(end)) {\n\t\treturn start;\n\t}\n\n\treturn start + (end - start) * p;\n}\n\nfunction interpolateInv (start, end, value) {\n\treturn (value - start) / (end - start);\n}\n\nfunction mapRange (from, to, value) {\n\treturn interpolate(to[0], to[1], interpolateInv(from[0], from[1], value));\n}\n\nfunction parseCoordGrammar (coordGrammars) {\n\treturn coordGrammars.map(coordGrammar => {\n\t\treturn coordGrammar.split(\"|\").map(type => {\n\t\t\ttype = type.trim();\n\t\t\tlet range = type.match(/^(<[a-z]+>)\\[(-?[.\\d]+),\\s*(-?[.\\d]+)\\]?$/);\n\n\t\t\tif (range) {\n\t\t\t\tlet ret = new String(range[1]);\n\t\t\t\tret.range = [+range[2], +range[3]];\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn type;\n\t\t});\n\t});\n}\n\n/**\n * Clamp value between the minimum and maximum\n * @param {number} min minimum value to return\n * @param {number} val the value to return if it is between min and max\n * @param {number} max maximum value to return\n * @returns number\n */\nfunction clamp (min, val, max) {\n\treturn Math.max(Math.min(max, val), min);\n}\n\n/**\n * Copy sign of one value to another.\n * @param {number} - to number to copy sign to\n * @param {number} - from number to copy sign from\n * @returns number\n */\nfunction copySign (to, from) {\n\treturn Math.sign(to) === Math.sign(from) ? to : -to;\n}\n\n/**\n * Perform pow on a signed number and copy sign to result\n * @param {number} - base the base number\n * @param {number} - exp the exponent\n * @returns number\n */\nfunction spow (base, exp) {\n\treturn copySign(Math.abs(base) ** exp, base);\n}\n\n/**\n * Perform a divide, but return zero if the numerator is zero\n * @param {number} n - the numerator\n * @param {number} d - the denominator\n * @returns number\n */\nfunction zdiv (n, d) {\n\treturn (d === 0) ? 0 : n / d;\n}\n\n/**\n * Perform a bisect on a sorted list and locate the insertion point for\n * a value in arr to maintain sorted order.\n * @param {number[]} arr - array of sorted numbers\n * @param {number} value - value to find insertion point for\n * @param {number} lo - used to specify a the low end of a subset of the list\n * @param {number} hi - used to specify a the high end of a subset of the list\n * @returns number\n */\nfunction bisectLeft (arr, value, lo = 0, hi = arr.length) {\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (arr[mid] < value) {\n\t\t\tlo = mid + 1;\n\t\t}\n\t\telse {\n\t\t\thi = mid;\n\t\t}\n\t}\n\treturn lo;\n}\n\nvar util = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tbisectLeft: bisectLeft,\n\tclamp: clamp,\n\tcopySign: copySign,\n\tinterpolate: interpolate,\n\tinterpolateInv: interpolateInv,\n\tisNone: isNone,\n\tisString: isString,\n\tlast: last,\n\tmapRange: mapRange,\n\tmultiplyMatrices: multiplyMatrices,\n\tparseCoordGrammar: parseCoordGrammar,\n\tparseFunction: parseFunction,\n\tserializeNumber: serializeNumber,\n\tskipNone: skipNone,\n\tspow: spow,\n\ttoPrecision: toPrecision,\n\ttype: type,\n\tzdiv: zdiv\n});\n\n/**\n * A class for adding deep extensibility to any piece of JS code\n */\nclass Hooks {\n\tadd (name, callback, first) {\n\t\tif (typeof arguments[0] != \"string\") {\n\t\t\t// Multiple hooks\n\t\t\tfor (var name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\tthis[name] = this[name] || [];\n\n\t\t\tif (callback) {\n\t\t\t\tthis[name][first ? \"unshift\" : \"push\"](callback);\n\t\t\t}\n\t\t}, this);\n\t}\n\n\trun (name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * The instance of {@link Hooks} used throughout Color.js\n */\nconst hooks = new Hooks();\n\n// Global defaults one may want to configure\nvar defaults = {\n\tgamut_mapping: \"css\",\n\tprecision: 5,\n\tdeltaE: \"76\", // Default deltaE method\n\tverbose: globalThis?.process?.env?.NODE_ENV?.toLowerCase() !== \"test\",\n\twarn: function warn (msg) {\n\t\tif (this.verbose) {\n\t\t\tglobalThis?.console?.warn?.(msg);\n\t\t}\n\t},\n};\n\nconst WHITES = {\n\t// for compatibility, the four-digit chromaticity-derived ones everyone else uses\n\tD50: [0.3457 / 0.3585, 1.00000, (1.0 - 0.3457 - 0.3585) / 0.3585],\n\tD65: [0.3127 / 0.3290, 1.00000, (1.0 - 0.3127 - 0.3290) / 0.3290],\n};\n\nfunction getWhite (name) {\n\tif (Array.isArray(name)) {\n\t\treturn name;\n\t}\n\n\treturn WHITES[name];\n}\n\n// Adapt XYZ from white point W1 to W2\nfunction adapt$2 (W1, W2, XYZ, options = {}) {\n\tW1 = getWhite(W1);\n\tW2 = getWhite(W2);\n\n\tif (!W1 || !W2) {\n\t\tthrow new TypeError(`Missing white point to convert ${!W1 ? \"from\" : \"\"}${!W1 && !W2 ? \"/\" : \"\"}${!W2 ? \"to\" : \"\"}`);\n\t}\n\n\tif (W1 === W2) {\n\t\t// Same whitepoints, no conversion needed\n\t\treturn XYZ;\n\t}\n\n\tlet env = {W1, W2, XYZ, options};\n\n\thooks.run(\"chromatic-adaptation-start\", env);\n\n\tif (!env.M) {\n\t\tif (env.W1 === WHITES.D65 && env.W2 === WHITES.D50) {\n\t\t\tenv.M = [\n\t\t\t\t[ 1.0479297925449969, 0.022946870601609652, -0.05019226628920524 ],\n\t\t\t\t[ 0.02962780877005599, 0.9904344267538799, -0.017073799063418826 ],\n\t\t\t\t[ -0.009243040646204504, 0.015055191490298152, 0.7518742814281371 ],\n\t\t\t];\n\t\t}\n\t\telse if (env.W1 === WHITES.D50 && env.W2 === WHITES.D65) {\n\n\t\t\tenv.M = [\n\t\t\t\t[ 0.955473421488075, -0.02309845494876471, 0.06325924320057072 ],\n\t\t\t\t[ -0.0283697093338637, 1.0099953980813041, 0.021041441191917323 ],\n\t\t\t\t[ 0.012314014864481998, -0.020507649298898964, 1.330365926242124 ],\n\t\t\t];\n\t\t}\n\t}\n\n\thooks.run(\"chromatic-adaptation-end\", env);\n\n\tif (env.M) {\n\t\treturn multiplyMatrices(env.M, env.XYZ);\n\t}\n\telse {\n\t\tthrow new TypeError(\"Only Bradford CAT with white points D50 and D65 supported for now.\");\n\t}\n}\n\nconst noneTypes = new Set([\"<number>\", \"<percentage>\", \"<angle>\"]);\n\n/**\n * Validates the coordinates of a color against a format's coord grammar and\n * maps the coordinates to the range or refRange of the coordinates.\n * @param {ColorSpace} space - Colorspace the coords are in\n * @param {object} format - the format object to validate against\n * @param {string} name - the name of the color function. e.g. \"oklab\" or \"color\"\n * @returns {object[]} - an array of type metadata for each coordinate\n */\nfunction coerceCoords (space, format, name, coords) {\n\tlet types = Object.entries(space.coords).map(([id, coordMeta], i) => {\n\t\tlet coordGrammar = format.coordGrammar[i];\n\t\tlet arg = coords[i];\n\t\tlet providedType = arg?.type;\n\n\t\t// Find grammar alternative that matches the provided type\n\t\t// Non-strict equals is intentional because we are comparing w/ string objects\n\t\tlet type;\n\t\tif (arg.none) {\n\t\t\ttype = coordGrammar.find(c => noneTypes.has(c));\n\t\t}\n\t\telse {\n\t\t\ttype = coordGrammar.find(c => c == providedType);\n\t\t}\n\n\t\t// Check that each coord conforms to its grammar\n\t\tif (!type) {\n\t\t\t// Type does not exist in the grammar, throw\n\t\t\tlet coordName = coordMeta.name || id;\n\t\t\tthrow new TypeError(`${providedType ?? arg.raw} not allowed for ${coordName} in ${name}()`);\n\t\t}\n\n\t\tlet fromRange = type.range;\n\n\t\tif (providedType === \"<percentage>\") {\n\t\t\tfromRange ||= [0, 1];\n\t\t}\n\n\t\tlet toRange = coordMeta.range || coordMeta.refRange;\n\n\t\tif (fromRange && toRange) {\n\t\t\tcoords[i] = mapRange(fromRange, toRange, coords[i]);\n\t\t}\n\n\t\treturn type;\n\t});\n\n\treturn types;\n}\n\n\n/**\n * Convert a CSS Color string to a color object\n * @param {string} str\n * @param {object} [options]\n * @param {object} [options.meta] - Object for additional information about the parsing\n * @returns {Color}\n */\nfunction parse (str, {meta} = {}) {\n\tlet env = {\"str\": String(str)?.trim()};\n\thooks.run(\"parse-start\", env);\n\n\tif (env.color) {\n\t\treturn env.color;\n\t}\n\n\tenv.parsed = parseFunction(env.str);\n\n\tif (env.parsed) {\n\t\t// Is a functional syntax\n\t\tlet name = env.parsed.name;\n\n\t\tif (name === \"color\") {\n\t\t\t// color() function\n\t\t\tlet id = env.parsed.args.shift();\n\t\t\t// Check against both <dashed-ident> and <ident> versions\n\t\t\tlet alternateId = id.startsWith(\"--\") ? id.substring(2) : `--${id}`;\n\t\t\tlet ids = [id, alternateId];\n\t\t\tlet alpha = env.parsed.rawArgs.indexOf(\"/\") > 0 ? env.parsed.args.pop() : 1;\n\n\t\t\tfor (let space of ColorSpace.all) {\n\t\t\t\tlet colorSpec = space.getFormat(\"color\");\n\n\t\t\t\tif (colorSpec) {\n\t\t\t\t\tif (ids.includes(colorSpec.id) || colorSpec.ids?.filter((specId) => ids.includes(specId)).length) {\n\t\t\t\t\t\t// From https://drafts.csswg.org/css-color-4/#color-function\n\t\t\t\t\t\t// If more <number>s or <percentage>s are provided than parameters that the colorspace takes, the excess <number>s at the end are ignored.\n\t\t\t\t\t\t// If less <number>s or <percentage>s are provided than parameters that the colorspace takes, the missing parameters default to 0. (This is particularly convenient for multichannel printers where the additional inks are spot colors or varnishes that most colors on the page won’t use.)\n\t\t\t\t\t\tconst coords = Object.keys(space.coords).map((_, i) => env.parsed.args[i] || 0);\n\n\t\t\t\t\t\tlet types;\n\n\t\t\t\t\t\tif (colorSpec.coordGrammar) {\n\t\t\t\t\t\t\ttypes = coerceCoords(space, colorSpec, \"color\", coords);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta) {\n\t\t\t\t\t\t\tObject.assign(meta, {formatId: \"color\", types});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (colorSpec.id.startsWith(\"--\") && !id.startsWith(\"--\")) {\n\t\t\t\t\t\t\tdefaults.warn(`${space.name} is a non-standard space and not currently supported in the CSS spec. ` +\n\t\t\t\t\t\t\t `Use prefixed color(${colorSpec.id}) instead of color(${id}).`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (id.startsWith(\"--\") && !colorSpec.id.startsWith(\"--\")) {\n\t\t\t\t\t\t\tdefaults.warn(`${space.name} is a standard space and supported in the CSS spec. ` +\n\t\t\t\t\t\t\t `Use color(${colorSpec.id}) instead of prefixed color(${id}).`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {spaceId: space.id, coords, alpha};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Not found\n\t\t\tlet didYouMean = \"\";\n\t\t\tlet registryId = id in ColorSpace.registry ? id : alternateId;\n\t\t\tif (registryId in ColorSpace.registry) {\n\t\t\t\t// Used color space id instead of color() id, these are often different\n\t\t\t\tlet cssId = ColorSpace.registry[registryId].formats?.color?.id;\n\n\t\t\t\tif (cssId) {\n\t\t\t\t\tdidYouMean = `Did you mean color(${cssId})?`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new TypeError(`Cannot parse color(${id}). ` + (didYouMean || \"Missing a plugin?\"));\n\t\t}\n\t\telse {\n\t\t\tfor (let space of ColorSpace.all) {\n\t\t\t\t// color space specific function\n\t\t\t\tlet format = space.getFormat(name);\n\t\t\t\tif (format && format.type === \"function\") {\n\t\t\t\t\tlet alpha = 1;\n\n\t\t\t\t\tif (format.lastAlpha || last(env.parsed.args).alpha) {\n\t\t\t\t\t\talpha = env.parsed.args.pop();\n\t\t\t\t\t}\n\n\t\t\t\t\tlet coords = env.parsed.args;\n\n\t\t\t\t\tlet types;\n\n\t\t\t\t\tif (format.coordGrammar) {\n\t\t\t\t\t\ttypes = coerceCoords(space, format, name, coords);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tObject.assign(meta, {formatId: format.name, types});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tspaceId: space.id,\n\t\t\t\t\t\tcoords, alpha,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Custom, colorspace-specific format\n\t\tfor (let space of ColorSpace.all) {\n\t\t\tfor (let formatId in space.formats) {\n\t\t\t\tlet format = space.formats[formatId];\n\n\t\t\t\tif (format.type !== \"custom\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (format.test && !format.test(env.str)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet color = format.parse(env.str);\n\n\t\t\t\tif (color) {\n\t\t\t\t\tcolor.alpha ??= 1;\n\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tmeta.formatId = formatId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn color;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// If we're here, we couldn't parse\n\tthrow new TypeError(`Could not parse ${str} as a color. Missing a plugin?`);\n}\n\n/**\n * Resolves a color reference (object or string) to a plain color object\n * @param {Color | {space, coords, alpha} | string | Array<Color | {space, coords, alpha} | string> } color\n * @returns {{space, coords, alpha} | Array<{space, coords, alpha}}>\n */\nfunction getColor (color) {\n\tif (Array.isArray(color)) {\n\t\treturn color.map(getColor);\n\t}\n\n\tif (!color) {\n\t\tthrow new TypeError(\"Empty color reference\");\n\t}\n\n\tif (isString(color)) {\n\t\tcolor = parse(color);\n\t}\n\n\t// Object fixup\n\tlet space = color.space || color.spaceId;\n\n\tif (!(space instanceof ColorSpace)) {\n\t\t// Convert string id to color space object\n\t\tcolor.space = ColorSpace.get(space);\n\t}\n\n\tif (color.alpha === undefined) {\n\t\tcolor.alpha = 1;\n\t}\n\n\treturn color;\n}\n\nconst ε$7 = .000075;\n\n/**\n * Class to represent a color space\n */\nclass ColorSpace {\n\tconstructor (options) {\n\t\tthis.id = options.id;\n\t\tthis.name = options.name;\n\t\tthis.base = options.base ? ColorSpace.get(options.base) : null;\n\t\tthis.aliases = options.aliases;\n\n\t\tif (this.base) {\n\t\t\tthis.fromBase = options.fromBase;\n\t\t\tthis.toBase = options.toBase;\n\t\t}\n\n\t\t// Coordinate metadata\n\n\t\tlet coords = options.coords ?? this.base.coords;\n\n\t\tfor (let name in coords) {\n\t\t\tif (!(\"name\" in coords[name])) {\n\t\t\t\tcoords[name].name = name;\n\t\t\t}\n\t\t}\n\t\tthis.coords = coords;\n\n\t\t// White point\n\n\t\tlet white = options.white ?? this.base.white ?? \"D65\";\n\t\tthis.white = getWhite(white);\n\n\t\t// Sort out formats\n\n\t\tthis.formats = options.formats ?? {};\n\n\t\tfor (let name in this.formats) {\n\t\t\tlet format = this.formats[name];\n\t\t\tformat.type ||= \"function\";\n\t\t\tformat.name ||= name;\n\t\t}\n\n\t\tif (!this.formats.color?.id) {\n\t\t\tthis.formats.color = {\n\t\t\t\t...this.formats.color ?? {},\n\t\t\t\tid: options.cssId || this.id,\n\t\t\t};\n\t\t}\n\n\t\t// Gamut space\n\n\t\tif (options.gamutSpace) {\n\t\t\t// Gamut space explicitly specified\n\t\t\tthis.gamutSpace = options.gamutSpace === \"self\" ? this : ColorSpace.get(options.gamutSpace);\n\t\t}\n\t\telse {\n\t\t\t// No gamut space specified, calculate a sensible default\n\t\t\tif (this.isPolar) {\n\t\t\t\t// Do not check gamut through polar coordinates\n\t\t\t\tthis.gamutSpace = this.base;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.gamutSpace = this;\n\t\t\t}\n\t\t}\n\n\t\t// Optimize inGamut for unbounded spaces\n\t\tif (this.gamutSpace.isUnbounded) {\n\t\t\tthis.inGamut = (coords, options) => {\n\t\t\t\treturn true;\n\t\t\t};\n\t\t}\n\n\t\t// Other stuff\n\t\tthis.referred = options.referred;\n\n\t\t// Compute ancestors and store them, since they will never change\n\t\tObject.defineProperty(this, \"path\", {\n\t\t\tvalue: getPath(this).reverse(),\n\t\t\twritable: false,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\n\t\thooks.run(\"colorspace-init-end\", this);\n\t}\n\n\tinGamut (coords, {epsilon = ε$7} = {}) {\n\t\tif (!this.equals(this.gamutSpace)) {\n\t\t\tcoords = this.to(this.gamutSpace, coords);\n\t\t\treturn this.gamutSpace.inGamut(coords, {epsilon});\n\t\t}\n\n\t\tlet coordMeta = Object.values(this.coords);\n\n\t\treturn coords.every((c, i) => {\n\t\t\tlet meta = coordMeta[i];\n\n\t\t\tif (meta.type !== \"angle\" && meta.range) {\n\t\t\t\tif (Number.isNaN(c)) {\n\t\t\t\t\t// NaN is always in gamut\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tlet [min, max] = meta.range;\n\t\t\t\treturn (min === undefined || c >= min - epsilon)\n\t\t\t\t && (max === undefined || c <= max + epsilon);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tget isUnbounded () {\n\t\treturn Object.values(this.coords).every(coord => !(\"range\" in coord));\n\t}\n\n\tget cssId () {\n\t\treturn this.formats?.color?.id || this.id;\n\t}\n\n\tget isPolar () {\n\t\tfor (let id in this.coords) {\n\t\t\tif (this.coords[id].type === \"angle\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetFormat (format) {\n\t\tif (typeof format === \"object\") {\n\t\t\tformat = processFormat(format, this);\n\t\t\treturn format;\n\t\t}\n\n\t\tlet ret;\n\t\tif (format === \"default\") {\n\t\t\t// Get first format\n\t\t\tret = Object.values(this.formats)[0];\n\t\t}\n\t\telse {\n\t\t\tret = this.formats[format];\n\t\t}\n\n\t\tif (ret) {\n\t\t\tret = processFormat(ret, this);\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check if this color space is the same as another color space reference.\n\t * Allows proxying color space objects and comparing color spaces with ids.\n\t * @param {string | ColorSpace} space ColorSpace object or id to compare to\n\t * @returns {boolean}\n\t */\n\tequals (space) {\n\t\tif (!space) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this === space || this.id === space || this.id === space.id;\n\t}\n\n\tto (space, coords) {\n\t\tif (arguments.length === 1) {\n\t\t\tconst color = getColor(space);\n\t\t\t[space, coords] = [color.space, color.coords];\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tif (this.equals(space)) {\n\t\t\t// Same space, no change needed\n\t\t\treturn coords;\n\t\t}\n\n\t\t// Convert NaN to 0, which seems to be valid in every coordinate of every color space\n\t\tcoords = coords.map(c => Number.isNaN(c) ? 0 : c);\n\n\t\t// Find connection space = lowest common ancestor in the base tree\n\t\tlet myPath = this.path;\n\t\tlet otherPath = space.path;\n\n\t\tlet connectionSpace, connectionSpaceIndex;\n\n\t\tfor (let i = 0; i < myPath.length; i++) {\n\t\t\tif (myPath[i].equals(otherPath[i])) {\n\t\t\t\tconnectionSpace = myPath[i];\n\t\t\t\tconnectionSpaceIndex = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!connectionSpace) {\n\t\t\t// This should never happen\n\t\t\tthrow new Error(`Cannot convert between color spaces ${this} and ${space}: no connection space was found`);\n\t\t}\n\n\t\t// Go up from current space to connection space\n\t\tfor (let i = myPath.length - 1; i > connectionSpaceIndex; i--) {\n\t\t\tcoords = myPath[i].toBase(coords);\n\t\t}\n\n\t\t// Go down from connection space to target space\n\t\tfor (let i = connectionSpaceIndex + 1; i < otherPath.length; i++) {\n\t\t\tcoords = otherPath[i].fromBase(coords);\n\t\t}\n\n\t\treturn coords;\n\t}\n\n\tfrom (space, coords) {\n\t\tif (arguments.length === 1) {\n\t\t\tconst color = getColor(space);\n\t\t\t[space, coords] = [color.space, color.coords];\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\treturn space.to(this, coords);\n\t}\n\n\ttoString () {\n\t\treturn `${this.name} (${this.id})`;\n\t}\n\n\tgetMinCoords () {\n\t\tlet ret = [];\n\n\t\tfor (let id in this.coords) {\n\t\t\tlet meta = this.coords[id];\n\t\t\tlet range = meta.range || meta.refRange;\n\t\t\tret.push(range?.min ?? 0);\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tstatic registry = {};\n\n\t// Returns array of unique color spaces\n\tstatic get all () {\n\t\treturn [...new Set(Object.values(ColorSpace.registry))];\n\t}\n\n\tstatic register (id, space) {\n\t\tif (arguments.length === 1) {\n\t\t\tspace = arguments[0];\n\t\t\tid = space.id;\n\t\t}\n\n\t\tspace = this.get(space);\n\n\t\tif (this.registry[id] && this.registry[id] !== space) {\n\t\t\tthrow new Error(`Duplicate color space registration: '${id}'`);\n\t\t}\n\t\tthis.registry[id] = space;\n\n\t\t// Register aliases when called without an explicit ID.\n\t\tif (arguments.length === 1 && space.aliases) {\n\t\t\tfor (let alias of space.aliases) {\n\t\t\t\tthis.register(alias, space);\n\t\t\t}\n\t\t}\n\n\t\treturn space;\n\t}\n\n\t/**\n\t * Lookup ColorSpace object by name\n\t * @param {ColorSpace | string} name\n\t */\n\tstatic get (space, ...alternatives) {\n\t\tif (!space || space instanceof ColorSpace) {\n\t\t\treturn space;\n\t\t}\n\n\t\tlet argType = type(space);\n\n\t\tif (argType === \"string\") {\n\t\t\t// It's a color space id\n\t\t\tlet ret = ColorSpace.registry[space.toLowerCase()];\n\n\t\t\tif (!ret) {\n\t\t\t\tthrow new TypeError(`No color space found with id = \"${space}\"`);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tif (alternatives.length) {\n\t\t\treturn ColorSpace.get(...alternatives);\n\t\t}\n\n\t\tthrow new TypeError(`${space} is not a valid color space`);\n\t}\n\n\t/**\n\t * Get metadata about a coordinate of a color space\n\t *\n\t * @static\n\t * @param {Array | string} ref\n\t * @param {ColorSpace | string} [workingSpace]\n\t * @return {Object}\n\t */\n\tstatic resolveCoord (ref, workingSpace) {\n\t\tlet coordType = type(ref);\n\t\tlet space, coord;\n\n\t\tif (coordType === \"string\") {\n\t\t\tif (ref.includes(\".\")) {\n\t\t\t\t// Absolute coordinate\n\t\t\t\t[space, coord] = ref.split(\".\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Relative coordinate\n\t\t\t\t[space, coord] = [, ref];\n\t\t\t}\n\t\t}\n\t\telse if (Array.isArray(ref)) {\n\t\t\t[space, coord] = ref;\n\t\t}\n\t\telse {\n\t\t\t// Object\n\t\t\tspace = ref.space;\n\t\t\tcoord = ref.coordId;\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tif (!space) {\n\t\t\tspace = workingSpace;\n\t\t}\n\n\t\tif (!space) {\n\t\t\tthrow new TypeError(`Cannot resolve coordinate reference ${ref}: No color space specified and relative references are not allowed here`);\n\t\t}\n\n\t\tcoordType = type(coord);\n\n\t\tif (coordType === \"number\" || coordType === \"string\" && coord >= 0) {\n\t\t\t// Resolve numerical coord\n\t\t\tlet meta = Object.entries(space.coords)[coord];\n\n\t\t\tif (meta) {\n\t\t\t\treturn {space, id: meta[0], index: coord, ...meta[1]};\n\t\t\t}\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tlet normalizedCoord = coord.toLowerCase();\n\n\t\tlet i = 0;\n\t\tfor (let id in space.coords) {\n\t\t\tlet meta = space.coords[id];\n\n\t\t\tif (id.toLowerCase() === normalizedCoord || meta.name?.toLowerCase() === normalizedCoord) {\n\t\t\t\treturn {space, id, index: i, ...meta};\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\tthrow new TypeError(`No \"${coord}\" coordinate found in ${space.name}. Its coordinates are: ${Object.keys(space.coords).join(\", \")}`);\n\t}\n\n\tstatic DEFAULT_FORMAT = {\n\t\ttype: \"functions\",\n\t\tname: \"color\",\n\t};\n}\n\nfunction getPath (space) {\n\tlet ret = [space];\n\n\tfor (let s = space; s = s.base;) {\n\t\tret.push(s);\n\t}\n\n\treturn ret;\n}\n\nfunction processFormat (format, {coords} = {}) {\n\tif (format.coords && !format.coordGrammar) {\n\t\tformat.type ||= \"function\";\n\t\tformat.name ||= \"color\";\n\n\t\t// Format has not been processed\n\t\tformat.coordGrammar = parseCoordGrammar(format.coords);\n\n\t\tlet coordFormats = Object.entries(coords).map(([id, coordMeta], i) => {\n\t\t\t// Preferred format for each coord is the first one\n\t\t\tlet outputType = format.coordGrammar[i][0];\n\n\t\t\tlet fromRange = coordMeta.range || coordMeta.refRange;\n\t\t\tlet toRange = outputType.range, suffix = \"\";\n\n\t\t\t// Non-strict equals intentional since outputType could be a string object\n\t\t\tif (outputType == \"<percentage>\") {\n\t\t\t\ttoRange = [0, 100];\n\t\t\t\tsuffix = \"%\";\n\t\t\t}\n\t\t\telse if (outputType == \"<angle>\") {\n\t\t\t\tsuffix = \"deg\";\n\t\t\t}\n\n\t\t\treturn {fromRange, toRange, suffix};\n\t\t});\n\n\t\tformat.serializeCoords = (coords, precision) => {\n\t\t\treturn coords.map((c, i) => {\n\t\t\t\tlet {fromRange, toRange, suffix} = coordFormats[i];\n\n\t\t\t\tif (fromRange && toRange) {\n\t\t\t\t\tc = mapRange(fromRange, toRange, c);\n\t\t\t\t}\n\n\t\t\t\tc = serializeNumber(c, {precision, unit: suffix});\n\n\t\t\t\treturn c;\n\t\t\t});\n\t\t};\n\t}\n\n\treturn format;\n}\n\nvar xyz_d65 = new ColorSpace({\n\tid: \"xyz-d65\",\n\tname: \"XYZ D65\",\n\tcoords: {\n\t\tx: {name: \"X\"},\n\t\ty: {name: \"Y\"},\n\t\tz: {name: \"Z\"},\n\t},\n\twhite: \"D65\",\n\tformats: {\n\t\tcolor: {\n\t\t\tids: [\"xyz-d65\", \"xyz\"],\n\t\t},\n\t},\n\taliases: [\"xyz\"],\n});\n\n/**\n * Convenience class for RGB color spaces\n * @extends {ColorSpace}\n */\nclass RGBColorSpace extends ColorSpace {\n\t/**\n\t * Creates a new RGB ColorSpace.\n\t * If coords are not specified, they will use the default RGB coords.\n\t * Instead of `fromBase()` and `toBase()` functions,\n\t * you can specify to/from XYZ matrices and have `toBase()` and `fromBase()` automatically generated.\n\t * @param {*} options - Same options as {@link ColorSpace} plus:\n\t * @param {number[][]} options.toXYZ_M - Matrix to convert to XYZ\n\t * @param {number[][]} options.fromXYZ_M - Matrix to convert from XYZ\n\t */\n\tconstructor (options) {\n\t\tif (!options.coords) {\n\t\t\toptions.coords = {\n\t\t\t\tr: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Red\",\n\t\t\t\t},\n\t\t\t\tg: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Green\",\n\t\t\t\t},\n\t\t\t\tb: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Blue\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (!options.base) {\n\t\t\toptions.base = xyz_d65;\n\t\t}\n\n\t\tif (options.toXYZ_M && options.fromXYZ_M) {\n\t\t\toptions.toBase ??= rgb => {\n\t\t\t\tlet xyz = multiplyMatrices(options.toXYZ_M, rgb);\n\n\t\t\t\tif (this.white !== this.base.white) {\n\t\t\t\t\t// Perform chromatic adaptation\n\t\t\t\t\txyz = adapt$2(this.white, this.base.white, xyz);\n\t\t\t\t}\n\n\t\t\t\treturn xyz;\n\t\t\t};\n\n\t\t\toptions.fromBase ??= xyz => {\n\t\t\t\txyz = adapt$2(this.base.white, this.white, xyz);\n\t\t\t\treturn multiplyMatrices(options.fromXYZ_M, xyz);\n\t\t\t};\n\t\t}\n\n\t\toptions.referred ??= \"display\";\n\n\t\tsuper(options);\n\t}\n}\n\n/**\n * Get the coordinates of a color in any color space\n * @param {Color} color\n * @param {string | ColorSpace} [space = color.space] The color space to convert to. Defaults to the color's current space\n * @returns {number[]} The color coordinates in the given color space\n */\nfunction getAll (color, space) {\n\tcolor = getColor(color);\n\n\tif (!space || color.space.equals(space)) {\n\t\t// No conversion needed\n\t\treturn color.coords.slice();\n\t}\n\n\tspace = ColorSpace.get(space);\n\treturn space.from(color);\n}\n\nfunction get (color, prop) {\n\tcolor = getColor(color);\n\n\tlet {space, index} = ColorSpace.resolveCoord(prop, color.space);\n\tlet coords = getAll(color, space);\n\treturn coords[index];\n}\n\nfunction setAll (color, space, coords) {\n\tcolor = getColor(color);\n\n\tspace = ColorSpace.get(space);\n\tcolor.coords = space.to(color.space, coords);\n\treturn color;\n}\n\nsetAll.returns = \"color\";\n\n// Set properties and return current instance\nfunction set (color, prop, value) {\n\tcolor = getColor(color);\n\n\tif (arguments.length === 2 && type(arguments[1]) === \"object\") {\n\t\t// Argument is an object literal\n\t\tlet object = arguments[1];\n\t\tfor (let p in object) {\n\t\t\tset(color, p, object[p]);\n\t\t}\n\t}\n\telse {\n\t\tif (typeof value === \"function\") {\n\t\t\tvalue = value(get(color, prop));\n\t\t}\n\n\t\tlet {space, index} = ColorSpace.resolveCoord(prop, color.space);\n\t\tlet coords = getAll(color, space);\n\t\tcoords[index] = value;\n\t\tsetAll(color, space, coords);\n\t}\n\n\treturn color;\n}\n\nset.returns = \"color\";\n\nvar XYZ_D50 = new ColorSpace({\n\tid: \"xyz-d50\",\n\tname: \"XYZ D50\",\n\twhite: \"D50\",\n\tbase: xyz_d65,\n\tfromBase: coords => adapt$2(xyz_d65.white, \"D50\", coords),\n\ttoBase: coords => adapt$2(\"D50\", xyz_d65.white, coords),\n});\n\n// κ * ε = 2^3 = 8\nconst ε$6 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst ε3$1 = 24 / 116;\nconst κ$4 = 24389 / 27; // 29^3/3^3\n\nlet white$4 = WHITES.D50;\n\nvar lab = new ColorSpace({\n\tid: \"lab\",\n\tname: \"Lab\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t},\n\n\t// Assuming XYZ is relative to D50, convert to CIE Lab\n\t// from CIE standard, which now defines these as a rational fraction\n\twhite: white$4,\n\n\tbase: XYZ_D50,\n\t// Convert D50-adapted XYX to Lab\n\t// CIE 15.3:2004 section 8.2.1.1\n\tfromBase (XYZ) {\n\t\t// compute xyz, which is XYZ scaled relative to reference white\n\t\tlet xyz = XYZ.map((value, i) => value / white$4[i]);\n\n\t\t// now compute f\n\t\tlet f = xyz.map(value => value > ε$6 ? Math.cbrt(value) : (κ$4 * value + 16) / 116);\n\n\t\treturn [\n\t\t\t(116 * f[1]) - 16, // L\n\t\t\t500 * (f[0] - f[1]), // a\n\t\t\t200 * (f[1] - f[2]), // b\n\t\t];\n\t},\n\t// Convert Lab to D50-adapted XYZ\n\t// Same result as CIE 15.3:2004 Appendix D although the derivation is different\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\ttoBase (Lab) {\n\t\t// compute f, starting with the luminance-related term\n\t\tlet f = [];\n\t\tf[1] = (Lab[0] + 16) / 116;\n\t\tf[0] = Lab[1] / 500 + f[1];\n\t\tf[2] = f[1] - Lab[2] / 200;\n\n\t\t// compute xyz\n\t\tlet xyz = [\n\t\t\tf[0] > ε3$1 ? Math.pow(f[0], 3) : (116 * f[0] - 16) / κ$4,\n\t\t\tLab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / κ$4,\n\t\t\tf[2] > ε3$1 ? Math.pow(f[2], 3) : (116 * f[2] - 16) / κ$4,\n\t\t];\n\n\t\t// Compute XYZ by scaling xyz by reference white\n\t\treturn xyz.map((value, i) => value * white$4[i]);\n\t},\n\n\tformats: {\n\t\t\"lab\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nfunction constrain (angle) {\n\treturn ((angle % 360) + 360) % 360;\n}\n\nfunction adjust (arc, angles) {\n\tif (arc === \"raw\") {\n\t\treturn angles;\n\t}\n\n\tlet [a1, a2] = angles.map(constrain);\n\n\tlet angleDiff = a2 - a1;\n\n\tif (arc === \"increasing\") {\n\t\tif (angleDiff < 0) {\n\t\t\ta2 += 360;\n\t\t}\n\t}\n\telse if (arc === \"decreasing\") {\n\t\tif (angleDiff > 0) {\n\t\t\ta1 += 360;\n\t\t}\n\t}\n\telse if (arc === \"longer\") {\n\t\tif (-180 < angleDiff && angleDiff < 180) {\n\t\t\tif (angleDiff > 0) {\n\t\t\t\ta1 += 360;\n\t\t\t}\n\t\t\telse {\n\t\t\t\ta2 += 360;\n\t\t\t}\n\t\t}\n\t}\n\telse if (arc === \"shorter\") {\n\t\tif (angleDiff > 180) {\n\t\t\ta1 += 360;\n\t\t}\n\t\telse if (angleDiff < -180) {\n\t\t\ta2 += 360;\n\t\t}\n\t}\n\n\treturn [a1, a2];\n}\n\nvar lch = new ColorSpace({\n\tid: \"lch\",\n\tname: \"LCH\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 150],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: lab,\n\tfromBase (Lab) {\n\t\t// Convert to polar form\n\t\tlet [L, a, b] = Lab;\n\t\tlet hue;\n\t\tconst ε = 0.02;\n\n\t\tif (Math.abs(a) < ε && Math.abs(b) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(b, a) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // L is still L\n\t\t\tMath.sqrt(a ** 2 + b ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (LCH) {\n\t\t// Convert from polar form\n\t\tlet [Lightness, Chroma, Hue] = LCH;\n\t\t// Clamp any negative Chroma\n\t\tif (Chroma < 0) {\n\t\t\tChroma = 0;\n\t\t}\n\t\t// Deal with NaN Hue\n\t\tif (isNaN(Hue)) {\n\t\t\tHue = 0;\n\t\t}\n\t\treturn [\n\t\t\tLightness, // L is still L\n\t\t\tChroma * Math.cos(Hue * Math.PI / 180), // a\n\t\t\tChroma * Math.sin(Hue * Math.PI / 180), // b\n\t\t];\n\t},\n\n\tformats: {\n\t\t\"lch\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\n// deltaE2000 is a statistically significant improvement\n// and is recommended by the CIE and Idealliance\n// especially for color differences less than 10 deltaE76\n// but is wicked complicated\n// and many implementations have small errors!\n// DeltaE2000 is also discontinuous; in case this\n// matters to you, use deltaECMC instead.\n\nconst Gfactor = 25 ** 7;\nconst π$1 = Math.PI;\nconst r2d = 180 / π$1;\nconst d2r$1 = π$1 / 180;\n\nfunction pow7 (x) {\n\t// Faster than x ** 7 or Math.pow(x, 7)\n\n\tconst x2 = x * x;\n\tconst x7 = x2 * x2 * x2 * x;\n\n\treturn x7;\n}\n\nfunction deltaE2000 (color, sample, {kL = 1, kC = 1, kH = 1} = {}) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and the function parameter as the sample,\n\t// calculate deltaE 2000.\n\n\t// This implementation assumes the parametric\n\t// weighting factors kL, kC and kH\n\t// for the influence of viewing conditions\n\t// are all 1, as sadly seems typical.\n\t// kL should be increased for lightness texture or noise\n\t// and kC increased for chroma noise\n\n\tlet [L1, a1, b1] = lab.from(color);\n\tlet C1 = lch.from(lab, [L1, a1, b1])[1];\n\tlet [L2, a2, b2] = lab.from(sample);\n\tlet C2 = lch.from(lab, [L2, a2, b2])[1];\n\n\t// Check for negative Chroma,\n\t// which might happen through\n\t// direct user input of LCH values\n\n\tif (C1 < 0) {\n\t\tC1 = 0;\n\t}\n\tif (C2 < 0) {\n\t\tC2 = 0;\n\t}\n\n\tlet Cbar = (C1 + C2) / 2; // mean Chroma\n\n\t// calculate a-axis asymmetry factor from mean Chroma\n\t// this turns JND ellipses for near-neutral colors back into circles\n\tlet C7 = pow7(Cbar);\n\n\tlet G = 0.5 * (1 - Math.sqrt(C7 / (C7 + Gfactor)));\n\n\t// scale a axes by asymmetry factor\n\t// this by the way is why there is no Lab2000 colorspace\n\tlet adash1 = (1 + G) * a1;\n\tlet adash2 = (1 + G) * a2;\n\n\t// calculate new Chroma from scaled a and original b axes\n\tlet Cdash1 = Math.sqrt(adash1 ** 2 + b1 ** 2);\n\tlet Cdash2 = Math.sqrt(adash2 ** 2 + b2 ** 2);\n\n\t// calculate new hues, with zero hue for true neutrals\n\t// and in degrees, not radians\n\n\tlet h1 = (adash1 === 0 && b1 === 0) ? 0 : Math.atan2(b1, adash1);\n\tlet h2 = (adash2 === 0 && b2 === 0) ? 0 : Math.atan2(b2, adash2);\n\n\tif (h1 < 0) {\n\t\th1 += 2 * π$1;\n\t}\n\tif (h2 < 0) {\n\t\th2 += 2 * π$1;\n\t}\n\n\th1 *= r2d;\n\th2 *= r2d;\n\n\t// Lightness and Chroma differences; sign matters\n\tlet ΔL = L2 - L1;\n\tlet ΔC = Cdash2 - Cdash1;\n\n\t// Hue difference, getting the sign correct\n\tlet hdiff = h2 - h1;\n\tlet hsum = h1 + h2;\n\tlet habs = Math.abs(hdiff);\n\tlet Δh;\n\n\tif (Cdash1 * Cdash2 === 0) {\n\t\tΔh = 0;\n\t}\n\telse if (habs <= 180) {\n\t\tΔh = hdiff;\n\t}\n\telse if (hdiff > 180) {\n\t\tΔh = hdiff - 360;\n\t}\n\telse if (hdiff < -180) {\n\t\tΔh = hdiff + 360;\n\t}\n\telse {\n\t\tdefaults.warn(\"the unthinkable has happened\");\n\t}\n\n\t// weighted Hue difference, more for larger Chroma\n\tlet ΔH = 2 * Math.sqrt(Cdash2 * Cdash1) * Math.sin(Δh * d2r$1 / 2);\n\n\t// calculate mean Lightness and Chroma\n\tlet Ldash = (L1 + L2) / 2;\n\tlet Cdash = (Cdash1 + Cdash2) / 2;\n\tlet Cdash7 = pow7(Cdash);\n\n\t// Compensate for non-linearity in the blue region of Lab.\n\t// Four possibilities for hue weighting factor,\n\t// depending on the angles, to get the correct sign\n\tlet hdash;\n\tif (Cdash1 * Cdash2 === 0) {\n\t\thdash = hsum; // which should be zero\n\t}\n\telse if (habs <= 180) {\n\t\thdash = hsum / 2;\n\t}\n\telse if (hsum < 360) {\n\t\thdash = (hsum + 360) / 2;\n\t}\n\telse {\n\t\thdash = (hsum - 360) / 2;\n\t}\n\n\t// positional corrections to the lack of uniformity of CIELAB\n\t// These are all trying to make JND ellipsoids more like spheres\n\n\t// SL Lightness crispening factor\n\t// a background with L=50 is assumed\n\tlet lsq = (Ldash - 50) ** 2;\n\tlet SL = 1 + ((0.015 * lsq) / Math.sqrt(20 + lsq));\n\n\t// SC Chroma factor, similar to those in CMC and deltaE 94 formulae\n\tlet SC = 1 + 0.045 * Cdash;\n\n\t// Cross term T for blue non-linearity\n\tlet T = 1;\n\tT -= (0.17 * Math.cos(( hdash - 30) * d2r$1));\n\tT += (0.24 * Math.cos( 2 * hdash * d2r$1));\n\tT += (0.32 * Math.cos(((3 * hdash) + 6) * d2r$1));\n\tT -= (0.20 * Math.cos(((4 * hdash) - 63) * d2r$1));\n\n\t// SH Hue factor depends on Chroma,\n\t// as well as adjusted hue angle like deltaE94.\n\tlet SH = 1 + 0.015 * Cdash * T;\n\n\t// RT Hue rotation term compensates for rotation of JND ellipses\n\t// and Munsell constant hue lines\n\t// in the medium-high Chroma blue region\n\t// (Hue 225 to 315)\n\tlet Δθ = 30 * Math.exp(-1 * (((hdash - 275) / 25) ** 2));\n\tlet RC = 2 * Math.sqrt(Cdash7 / (Cdash7 + Gfactor));\n\tlet RT = -1 * Math.sin(2 * Δθ * d2r$1) * RC;\n\n\t// Finally calculate the deltaE, term by term as root sume of squares\n\tlet dE = (ΔL / (kL * SL)) ** 2;\n\tdE += (ΔC / (kC * SC)) ** 2;\n\tdE += (ΔH / (kH * SH)) ** 2;\n\tdE += RT * (ΔC / (kC * SC)) * (ΔH / (kH * SH));\n\treturn Math.sqrt(dE);\n\t// Yay!!!\n}\n\n// Recalculated for consistent reference white\n// see https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-943521484\nconst XYZtoLMS_M$1 = [\n\t[ 0.8190224379967030, 0.3619062600528904, -0.1288737815209879 ],\n\t[ 0.0329836539323885, 0.9292868615863434, 0.0361446663506424 ],\n\t[ 0.0481771893596242, 0.2642395317527308, 0.6335478284694309 ],\n];\n// inverse of XYZtoLMS_M\nconst LMStoXYZ_M$1 = [\n\t[ 1.2268798758459243, -0.5578149944602171, 0.2813910456659647 ],\n\t[ -0.0405757452148008, 1.1122868032803170, -0.0717110580655164 ],\n\t[ -0.0763729366746601, -0.4214933324022432, 1.5869240198367816 ],\n];\nconst LMStoLab_M = [\n\t[ 0.2104542683093140, 0.7936177747023054, -0.0040720430116193 ],\n\t[ 1.9779985324311684, -2.4285922420485799, 0.4505937096174110 ],\n\t[ 0.0259040424655478, 0.7827717124575296, -0.8086757549230774 ],\n];\n// LMStoIab_M inverted\nconst LabtoLMS_M = [\n\t[ 1.0000000000000000, 0.3963377773761749, 0.2158037573099136 ],\n\t[ 1.0000000000000000, -0.1055613458156586, -0.0638541728258133 ],\n\t[ 1.0000000000000000, -0.0894841775298119, -1.2914855480194092 ],\n];\n\nvar OKLab = new ColorSpace({\n\tid: \"oklab\",\n\tname: \"Oklab\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-0.4, 0.4],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-0.4, 0.4],\n\t\t},\n\t},\n\n\t// Note that XYZ is relative to D65\n\twhite: \"D65\",\n\tbase: xyz_d65,\n\tfromBase (XYZ) {\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoLMS_M$1, XYZ);\n\n\t\t// non-linearity\n\t\tlet LMSg = LMS.map(val => Math.cbrt(val));\n\n\t\treturn multiplyMatrices(LMStoLab_M, LMSg);\n\n\t},\n\ttoBase (OKLab) {\n\t\t// move to LMS cone domain\n\t\tlet LMSg = multiplyMatrices(LabtoLMS_M, OKLab);\n\n\t\t// restore linearity\n\t\tlet LMS = LMSg.map(val => val ** 3);\n\n\t\treturn multiplyMatrices(LMStoXYZ_M$1, LMS);\n\t},\n\n\tformats: {\n\t\t\"oklab\": {\n\t\t\tcoords: [\"<percentage> | <number>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in CIE Lab\n\n\nfunction deltaEOK (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaEOK, term by term as root sum of squares\n\tlet [L1, a1, b1] = OKLab.from(color);\n\tlet [L2, a2, b2] = OKLab.from(sample);\n\tlet ΔL = L1 - L2;\n\tlet Δa = a1 - a2;\n\tlet Δb = b1 - b2;\n\treturn Math.sqrt(ΔL ** 2 + Δa ** 2 + Δb ** 2);\n}\n\nconst ε$5 = .000075;\n\n/**\n * Check if a color is in gamut of either its own or another color space\n * @return {Boolean} Is the color in gamut?\n */\nfunction inGamut (color, space, {epsilon = ε$5} = {}) {\n\tcolor = getColor(color);\n\n\tif (!space) {\n\t\tspace = color.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\tlet coords = color.coords;\n\n\tif (space !== color.space) {\n\t\tcoords = space.from(color);\n\t}\n\n\treturn space.inGamut(coords, {epsilon});\n}\n\nfunction clone (color) {\n\treturn {\n\t\tspace: color.space,\n\t\tcoords: color.coords.slice(),\n\t\talpha: color.alpha,\n\t};\n}\n\n/**\n * Euclidean distance of colors in an arbitrary color space\n */\nfunction distance (color1, color2, space = \"lab\") {\n\tspace = ColorSpace.get(space);\n\n\t// Assume getColor() is called on color in space.from()\n\tlet coords1 = space.from(color1);\n\tlet coords2 = space.from(color2);\n\n\treturn Math.sqrt(coords1.reduce((acc, c1, i) => {\n\t\tlet c2 = coords2[i];\n\t\tif (isNaN(c1) || isNaN(c2)) {\n\t\t\treturn acc;\n\t\t}\n\n\t\treturn acc + (c2 - c1) ** 2;\n\t}, 0));\n}\n\nfunction deltaE76 (color, sample) {\n\t// Assume getColor() is called in the distance function\n\treturn distance(color, sample, \"lab\");\n}\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in Lab\n\n// CMC by the Color Measurement Committee of the\n// Bradford Society of Dyeists and Colorsts, 1994.\n// Uses LCH rather than Lab,\n// with different weights for L, C and H differences\n// A nice increase in accuracy for modest increase in complexity\nconst π = Math.PI;\nconst d2r = π / 180;\n\nfunction deltaECMC (color, sample, {l = 2, c = 1} = {}) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE CMC.\n\n\t// This implementation assumes the parametric\n\t// weighting factors l:c are 2:1\n\t// which is typical for non-textile uses.\n\n\tlet [L1, a1, b1] = lab.from(color);\n\tlet [, C1, H1] = lch.from(lab, [L1, a1, b1]);\n\tlet [L2, a2, b2] = lab.from(sample);\n\tlet C2 = lch.from(lab, [L2, a2, b2])[1];\n\n\t// let [L1, a1, b1] = color.getAll(lab);\n\t// let C1 = color.get(\"lch.c\");\n\t// let H1 = color.get(\"lch.h\");\n\t// let [L2, a2, b2] = sample.getAll(lab);\n\t// let C2 = sample.get(\"lch.c\");\n\n\t// Check for negative Chroma,\n\t// which might happen through\n\t// direct user input of LCH values\n\n\tif (C1 < 0) {\n\t\tC1 = 0;\n\t}\n\tif (C2 < 0) {\n\t\tC2 = 0;\n\t}\n\n\t// we don't need H2 as ΔH is calculated from Δa, Δb and ΔC\n\n\t// Lightness and Chroma differences\n\t// These are (color - sample), unlike deltaE2000\n\tlet ΔL = L1 - L2;\n\tlet ΔC = C1 - C2;\n\n\tlet Δa = a1 - a2;\n\tlet Δb = b1 - b2;\n\n\t// weighted Hue difference, less for larger Chroma difference\n\n\tlet H2 = (Δa ** 2) + (Δb ** 2) - (ΔC ** 2);\n\t// due to roundoff error it is possible that, for zero a and b,\n\t// ΔC > Δa + Δb is 0, resulting in attempting\n\t// to take the square root of a negative number\n\n\t// trying instead the equation from Industrial Color Physics\n\t// By Georg A. Klein\n\n\t// let ΔH = ((a1 * b2) - (a2 * b1)) / Math.sqrt(0.5 * ((C2 * C1) + (a2 * a1) + (b2 * b1)));\n\t// console.log({ΔH});\n\t// This gives the same result to 12 decimal places\n\t// except it sometimes NaNs when trying to root a negative number\n\n\t// let ΔH = Math.sqrt(H2); we never actually use the root, it gets squared again!!\n\n\t// positional corrections to the lack of uniformity of CIELAB\n\t// These are all trying to make JND ellipsoids more like spheres\n\n\t// SL Lightness crispening factor, depends entirely on L1 not L2\n\tlet SL = 0.511;\t// linear portion of the Y to L transfer function\n\tif (L1 >= 16) {\t// cubic portion\n\t\tSL = (0.040975 * L1) / (1 + 0.01765 * L1);\n\t}\n\n\t// SC Chroma factor\n\tlet SC = ((0.0638 * C1) / (1 + 0.0131 * C1)) + 0.638;\n\n\t// Cross term T for blue non-linearity\n\tlet T;\n\tif (Number.isNaN(H1)) {\n\t\tH1 = 0;\n\t}\n\n\tif (H1 >= 164 && H1 <= 345) {\n\t\tT = 0.56 + Math.abs(0.2 * Math.cos((H1 + 168) * d2r));\n\t}\n\telse {\n\t\tT = 0.36 + Math.abs(0.4 * Math.cos((H1 + 35) * d2r));\n\t}\n\t// console.log({T});\n\n\t// SH Hue factor also depends on C1,\n\tlet C4 = Math.pow(C1, 4);\n\tlet F = Math.sqrt(C4 / (C4 + 1900));\n\tlet SH = SC * ((F * T) + 1 - F);\n\n\t// Finally calculate the deltaE, term by term as root sume of squares\n\tlet dE = (ΔL / (l * SL)) ** 2;\n\tdE += (ΔC / (c * SC)) ** 2;\n\tdE += (H2 / (SH ** 2));\n\t// dE += (ΔH / SH) ** 2;\n\treturn Math.sqrt(dE);\n\t// Yay!!!\n}\n\nconst Yw$1 = 203;\t// absolute luminance of media white\n\nvar XYZ_Abs_D65 = new ColorSpace({\n// Absolute CIE XYZ, with a D65 whitepoint,\n// as used in most HDR colorspaces as a starting point.\n// SDR spaces are converted per BT.2048\n// so that diffuse, media white is 203 cd/m²\n\tid: \"xyz-abs-d65\",\n\tcssId: \"--xyz-abs-d65\",\n\tname: \"Absolute XYZ D65\",\n\tcoords: {\n\t\tx: {\n\t\t\trefRange: [0, 9504.7],\n\t\t\tname: \"Xa\",\n\t\t},\n\t\ty: {\n\t\t\trefRange: [0, 10000],\n\t\t\tname: \"Ya\",\n\t\t},\n\t\tz: {\n\t\t\trefRange: [0, 10888.3],\n\t\t\tname: \"Za\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\tfromBase (XYZ) {\n\t\t// Make XYZ absolute, not relative to media white\n\t\t// Maximum luminance in PQ is 10,000 cd/m²\n\t\t// Relative XYZ has Y=1 for media white\n\t\treturn XYZ.map (v => Math.max(v * Yw$1, 0));\n\t},\n\ttoBase (AbsXYZ) {\n\t\t// Convert to media-white relative XYZ\n\t\treturn AbsXYZ.map(v => Math.max(v / Yw$1, 0));\n\t},\n});\n\nconst b$1 = 1.15;\nconst g = 0.66;\nconst n$1 = 2610 / (2 ** 14);\nconst ninv$1 = (2 ** 14) / 2610;\nconst c1$2 = 3424 / (2 ** 12);\nconst c2$2 = 2413 / (2 ** 7);\nconst c3$2 = 2392 / (2 ** 7);\nconst p = 1.7 * 2523 / (2 ** 5);\nconst pinv = (2 ** 5) / (1.7 * 2523);\nconst d = -0.56;\nconst d0 = 1.6295499532821566E-11;\n\nconst XYZtoCone_M = [\n\t[ 0.41478972, 0.579999, 0.0146480 ],\n\t[ -0.2015100, 1.120649, 0.0531008 ],\n\t[ -0.0166008, 0.264800, 0.6684799 ],\n];\n// XYZtoCone_M inverted\nconst ConetoXYZ_M = [\n\t[ 1.9242264357876067, -1.0047923125953657, 0.037651404030618 ],\n\t[ 0.35031676209499907, 0.7264811939316552, -0.06538442294808501 ],\n\t[ -0.09098281098284752, -0.3127282905230739, 1.5227665613052603 ],\n];\nconst ConetoIab_M = [\n\t[ 0.5, 0.5, 0 ],\n\t[ 3.524000, -4.066708, 0.542708 ],\n\t[ 0.199076, 1.096799, -1.295875 ],\n];\n// ConetoIab_M inverted\nconst IabtoCone_M = [\n\t[ 1, 0.1386050432715393, 0.05804731615611886 ],\n\t[ 0.9999999999999999, -0.1386050432715393, -0.05804731615611886 ],\n\t[ 0.9999999999999998, -0.09601924202631895, -0.8118918960560388 ],\n];\n\nvar Jzazbz = new ColorSpace({\n\tid: \"jzazbz\",\n\tname: \"Jzazbz\",\n\tcoords: {\n\t\tjz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Jz\",\n\t\t},\n\t\taz: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t},\n\t\tbz: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t},\n\t},\n\n\tbase: XYZ_Abs_D65,\n\tfromBase (XYZ) {\n\t\t// First make XYZ absolute, not relative to media white\n\t\t// Maximum luminance in PQ is 10,000 cd/m²\n\t\t// Relative XYZ has Y=1 for media white\n\t\t// BT.2048 says media white Y=203 at PQ 58\n\n\t\tlet [ Xa, Ya, Za ] = XYZ;\n\n\t\t// modify X and Y\n\t\tlet Xm = (b$1 * Xa) - ((b$1 - 1) * Za);\n\t\tlet Ym = (g * Ya) - ((g - 1) * Xa);\n\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoCone_M, [ Xm, Ym, Za ]);\n\n\t\t// PQ-encode LMS\n\t\tlet PQLMS = LMS.map (function (val) {\n\t\t\tlet num = c1$2 + (c2$2 * ((val / 10000) ** n$1));\n\t\t\tlet denom = 1 + (c3$2 * ((val / 10000) ** n$1));\n\n\t\t\treturn (num / denom) ** p;\n\t\t});\n\n\t\t// almost there, calculate Iz az bz\n\t\tlet [ Iz, az, bz] = multiplyMatrices(ConetoIab_M, PQLMS);\n\t\t// console.log({Iz, az, bz});\n\n\t\tlet Jz = ((1 + d) * Iz) / (1 + (d * Iz)) - d0;\n\t\treturn [Jz, az, bz];\n\t},\n\ttoBase (Jzazbz) {\n\t\tlet [Jz, az, bz] = Jzazbz;\n\t\tlet Iz = (Jz + d0) / (1 + d - d * (Jz + d0));\n\n\t\t// bring into LMS cone domain\n\t\tlet PQLMS = multiplyMatrices(IabtoCone_M, [ Iz, az, bz ]);\n\n\t\t// convert from PQ-coded to linear-light\n\t\tlet LMS = PQLMS.map(function (val) {\n\t\t\tlet num = (c1$2 - (val ** pinv));\n\t\t\tlet denom = (c3$2 * (val ** pinv)) - c2$2;\n\t\t\tlet x = 10000 * ((num / denom) ** ninv$1);\n\n\t\t\treturn (x); \t// luminance relative to diffuse white, [0, 70 or so].\n\t\t});\n\n\t\t// modified abs XYZ\n\t\tlet [ Xm, Ym, Za ] = multiplyMatrices(ConetoXYZ_M, LMS);\n\n\t\t// restore standard D50 relative XYZ, relative to media white\n\t\tlet Xa = (Xm + ((b$1 - 1) * Za)) / b$1;\n\t\tlet Ya = (Ym + ((g - 1) * Xa)) / g;\n\t\treturn [ Xa, Ya, Za ];\n\t},\n\n\tformats: {\n\t\t// https://drafts.csswg.org/css-color-hdr/#Jzazbz\n\t\t\"color\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nvar jzczhz = new ColorSpace({\n\tid: \"jzczhz\",\n\tname: \"JzCzHz\",\n\tcoords: {\n\t\tjz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Jz\",\n\t\t},\n\t\tcz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\thz: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: Jzazbz,\n\tfromBase (jzazbz) {\n\t\t// Convert to polar form\n\t\tlet [Jz, az, bz] = jzazbz;\n\t\tlet hue;\n\t\tconst ε = 0.0002; // chromatic components much smaller than a,b\n\n\t\tif (Math.abs(az) < ε && Math.abs(bz) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(bz, az) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tJz, // Jz is still Jz\n\t\t\tMath.sqrt(az ** 2 + bz ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (jzczhz) {\n\t\t// Convert from polar form\n\t\t// debugger;\n\t\treturn [\n\t\t\tjzczhz[0], // Jz is still Jz\n\t\t\tjzczhz[1] * Math.cos(jzczhz[2] * Math.PI / 180), // az\n\t\t\tjzczhz[1] * Math.sin(jzczhz[2] * Math.PI / 180), // bz\n\t\t];\n\t},\n});\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in Lab\n\n// Uses JzCzHz, which has improved perceptual uniformity\n// and thus a simple Euclidean root-sum of ΔL² ΔC² ΔH²\n// gives good results.\n\nfunction deltaEJz (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE in JzCzHz.\n\tlet [Jz1, Cz1, Hz1] = jzczhz.from(color);\n\tlet [Jz2, Cz2, Hz2] = jzczhz.from(sample);\n\n\t// Lightness and Chroma differences\n\t// sign does not matter as they are squared.\n\tlet ΔJ = Jz1 - Jz2;\n\tlet ΔC = Cz1 - Cz2;\n\n\t// length of chord for ΔH\n\tif ((Number.isNaN(Hz1)) && (Number.isNaN(Hz2))) {\n\t\t// both undefined hues\n\t\tHz1 = 0;\n\t\tHz2 = 0;\n\t}\n\telse if (Number.isNaN(Hz1)) {\n\t\t// one undefined, set to the defined hue\n\t\tHz1 = Hz2;\n\t}\n\telse if (Number.isNaN(Hz2)) {\n\t\tHz2 = Hz1;\n\t}\n\n\tlet Δh = Hz1 - Hz2;\n\tlet ΔH = 2 * Math.sqrt(Cz1 * Cz2) * Math.sin((Δh / 2) * (Math.PI / 180));\n\n\treturn Math.sqrt(ΔJ ** 2 + ΔC ** 2 + ΔH ** 2);\n}\n\nconst c1$1 = 3424 / 4096;\nconst c2$1 = 2413 / 128;\nconst c3$1 = 2392 / 128;\nconst m1$1 = 2610 / 16384;\nconst m2 = 2523 / 32;\nconst im1 = 16384 / 2610;\nconst im2 = 32 / 2523;\n\n// The matrix below includes the 4% crosstalk components\n// and is from the Dolby \"What is ICtCp\" paper\"\nconst XYZtoLMS_M = [\n\t[ 0.3592832590121217, 0.6976051147779502, -0.0358915932320290 ],\n\t[ -0.1920808463704993, 1.1004767970374321, 0.0753748658519118 ],\n\t[ 0.0070797844607479, 0.0748396662186362, 0.8433265453898765 ],\n];\n// linear-light Rec.2020 to LMS, again with crosstalk\n// rational terms from Jan Fröhlich,\n// Encoding High Dynamic Range andWide Color Gamut Imagery, p.97\n// and ITU-R BT.2124-0 p.2\n/*\nconst Rec2020toLMS_M = [\n\t[ 1688 / 4096, 2146 / 4096, 262 / 4096 ],\n\t[ 683 / 4096, 2951 / 4096, 462 / 4096 ],\n\t[ 99 / 4096, 309 / 4096, 3688 / 4096 ]\n];\n*/\n// this includes the Ebner LMS coefficients,\n// the rotation, and the scaling to [-0.5,0.5] range\n// rational terms from Fröhlich p.97\n// and ITU-R BT.2124-0 pp.2-3\nconst LMStoIPT_M = [\n\t[ 2048 / 4096, 2048 / 4096, 0 ],\n\t[ 6610 / 4096, -13613 / 4096, 7003 / 4096 ],\n\t[ 17933 / 4096, -17390 / 4096, -543 / 4096 ],\n];\n\n// inverted matrices, calculated from the above\nconst IPTtoLMS_M = [\n\t[ 0.9999999999999998, 0.0086090370379328, 0.1110296250030260 ],\n\t[ 0.9999999999999998, -0.0086090370379328, -0.1110296250030259 ],\n\t[ 0.9999999999999998, 0.5600313357106791, -0.3206271749873188 ],\n];\n/*\nconst LMStoRec2020_M = [\n\t[ 3.4375568932814012112, -2.5072112125095058195, 0.069654319228104608382],\n\t[-0.79142868665644156125, 1.9838372198740089874, -0.19240853321756742626 ],\n\t[-0.025646662911506476363, -0.099240248643945566751, 1.1248869115554520431 ]\n];\n*/\nconst LMStoXYZ_M = [\n\t[ 2.0701522183894223, -1.3263473389671563, 0.2066510476294053 ],\n\t[ 0.3647385209748072, 0.6805660249472273, -0.0453045459220347 ],\n\t[ -0.0497472075358123, -0.0492609666966131, 1.1880659249923042 ],\n];\n\n// Only the PQ form of ICtCp is implemented here. There is also an HLG form.\n// from Dolby, \"WHAT IS ICTCP?\"\n// https://professional.dolby.com/siteassets/pdfs/ictcp_dolbywhitepaper_v071.pdf\n// and\n// Dolby, \"Perceptual Color Volume\n// Measuring the Distinguishable Colors of HDR and WCG Displays\"\n// https://professional.dolby.com/siteassets/pdfs/dolby-vision-measuring-perceptual-color-volume-v7.1.pdf\nvar ictcp = new ColorSpace({\n\tid: \"ictcp\",\n\tname: \"ICTCP\",\n\t// From BT.2100-2 page 7:\n\t// During production, signal values are expected to exceed the\n\t// range E′ = [0.0 : 1.0]. This provides processing headroom and avoids\n\t// signal degradation during cascaded processing. Such values of E′,\n\t// below 0.0 or exceeding 1.0, should not be clipped during production\n\t// and exchange.\n\t// Values below 0.0 should not be clipped in reference displays (even\n\t// though they represent “negative” light) to allow the black level of\n\t// the signal (LB) to be properly set using test signals known as “PLUGE”\n\tcoords: {\n\t\ti: {\n\t\t\trefRange: [0, 1],\t// Constant luminance,\n\t\t\tname: \"I\",\n\t\t},\n\t\tct: {\n\t\t\trefRange: [-0.5, 0.5],\t// Full BT.2020 gamut in range [-0.5, 0.5]\n\t\t\tname: \"CT\",\n\t\t},\n\t\tcp: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t\tname: \"CP\",\n\t\t},\n\t},\n\n\tbase: XYZ_Abs_D65,\n\tfromBase (XYZ) {\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoLMS_M, XYZ);\n\n\t\treturn LMStoICtCp(LMS);\n\t},\n\ttoBase (ICtCp) {\n\t\tlet LMS = ICtCptoLMS(ICtCp);\n\n\t\treturn multiplyMatrices(LMStoXYZ_M, LMS);\n\t},\n});\n\nfunction LMStoICtCp (LMS) {\n\t// apply the PQ EOTF\n\t// we can't ever be dividing by zero because of the \"1 +\" in the denominator\n\tlet PQLMS = LMS.map (function (val) {\n\t\tlet num = c1$1 + (c2$1 * ((val / 10000) ** m1$1));\n\t\tlet denom = 1 + (c3$1 * ((val / 10000) ** m1$1));\n\n\t\treturn (num / denom) ** m2;\n\t});\n\n\t// LMS to IPT, with rotation for Y'C'bC'r compatibility\n\treturn multiplyMatrices(LMStoIPT_M, PQLMS);\n}\n\nfunction ICtCptoLMS (ICtCp) {\n\tlet PQLMS = multiplyMatrices(IPTtoLMS_M, ICtCp);\n\n\t// From BT.2124-0 Annex 2 Conversion 3\n\tlet LMS = PQLMS.map (function (val) {\n\t\tlet num = Math.max((val ** im2) - c1$1, 0);\n\t\tlet denom = (c2$1 - (c3$1 * (val ** im2)));\n\t\treturn 10000 * ((num / denom) ** im1);\n\t});\n\n\treturn LMS;\n}\n\n// Delta E in ICtCp space,\n// which the ITU calls Delta E ITP, which is shorter\n// formulae from ITU Rec. ITU-R BT.2124-0\n\nfunction deltaEITP (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE in ICtCp\n\t// which is simply the Euclidean distance\n\n\tlet [ I1, T1, P1 ] = ictcp.from(color);\n\tlet [ I2, T2, P2 ] = ictcp.from(sample);\n\n\t// the 0.25 factor is to undo the encoding scaling in Ct\n\t// the 720 is so that 1 deltaE = 1 JND\n\t// per ITU-R BT.2124-0 p.3\n\n\treturn 720 * Math.sqrt((I1 - I2) ** 2 + (0.25 * (T1 - T2) ** 2) + (P1 - P2) ** 2);\n}\n\nconst white$3 = WHITES.D65;\nconst adaptedCoef = 0.42;\nconst adaptedCoefInv = 1 / adaptedCoef;\nconst tau = 2 * Math.PI;\n\nconst cat16 = [\n\t[ 0.401288, 0.650173, -0.051461 ],\n\t[ -0.250268, 1.204414, 0.045854 ],\n\t[ -0.002079, 0.048952, 0.953127 ],\n];\n\nconst cat16Inv = [\n\t[1.8620678550872327, -1.0112546305316843, 0.14918677544445175],\n\t[0.38752654323613717, 0.6214474419314753, -0.008973985167612518],\n\t[-0.015841498849333856, -0.03412293802851557, 1.0499644368778496],\n];\n\nconst m1 = [\n\t[460.0, 451.0, 288.0],\n\t[460.0, -891.0, -261.0],\n\t[460.0, -220.0, -6300.0],\n];\n\nconst surroundMap = {\n\tdark: [0.8, 0.525, 0.8],\n\tdim: [0.9, 0.59, 0.9],\n\taverage: [1, 0.69, 1],\n};\n\nconst hueQuadMap = {\n\t// Red, Yellow, Green, Blue, Red\n\th: [20.14, 90.00, 164.25, 237.53, 380.14],\n\te: [0.8, 0.7, 1.0, 1.2, 0.8],\n\tH: [0.0, 100.0, 200.0, 300.0, 400.0],\n};\n\nconst rad2deg = 180 / Math.PI;\nconst deg2rad$1 = Math.PI / 180;\n\nfunction adapt$1 (coords, fl) {\n\tconst temp = coords.map(c => {\n\t\tconst x = spow(fl * Math.abs(c) * 0.01, adaptedCoef);\n\t\treturn 400 * copySign(x, c) / (x + 27.13);\n\t});\n\treturn temp;\n}\n\nfunction unadapt (adapted, fl) {\n\tconst constant = 100 / fl * (27.13 ** adaptedCoefInv);\n\treturn adapted.map(c => {\n\t\tconst cabs = Math.abs(c);\n\t\treturn copySign(constant * spow(cabs / (400 - cabs), adaptedCoefInv), c);\n\t});\n}\n\nfunction hueQuadrature (h) {\n\tlet hp = constrain(h);\n\tif (hp <= hueQuadMap.h[0]) {\n\t\thp += 360;\n\t}\n\n\tconst i = bisectLeft(hueQuadMap.h, hp) - 1;\n\tconst [hi, hii] = hueQuadMap.h.slice(i, i + 2);\n\tconst [ei, eii] = hueQuadMap.e.slice(i, i + 2);\n\tconst Hi = hueQuadMap.H[i];\n\n\tconst t = (hp - hi) / ei;\n\treturn Hi + (100 * t) / (t + (hii - hp) / eii);\n}\n\nfunction invHueQuadrature (H) {\n\tlet Hp = ((H % 400 + 400) % 400);\n\tconst i = Math.floor(0.01 * Hp);\n\tHp = Hp % 100;\n\tconst [hi, hii] = hueQuadMap.h.slice(i, i + 2);\n\tconst [ei, eii] = hueQuadMap.e.slice(i, i + 2);\n\n\treturn constrain(\n\t\t(Hp * (eii * hi - ei * hii) - 100 * hi * eii) /\n\t\t(Hp * (eii - ei) - 100 * eii),\n\t);\n}\n\nfunction environment (\n\trefWhite,\n\tadaptingLuminance,\n\tbackgroundLuminance,\n\tsurround,\n\tdiscounting,\n) {\n\n\tconst env = {};\n\n\tenv.discounting = discounting;\n\tenv.refWhite = refWhite;\n\tenv.surround = surround;\n\tconst xyzW = refWhite.map(c => {\n\t\treturn c * 100;\n\t});\n\n\t// The average luminance of the environment in `cd/m^2cd/m` (a.k.a. nits)\n\tenv.la = adaptingLuminance;\n\t// The relative luminance of the nearby background\n\tenv.yb = backgroundLuminance;\n\t// Absolute luminance of the reference white.\n\tconst yw = xyzW[1];\n\n\t// Cone response for reference white\n\tconst rgbW = multiplyMatrices(cat16, xyzW);\n\n\t// Surround: dark, dim, and average\n\tsurround = surroundMap[env.surround];\n\tconst f = surround[0];\n\tenv.c = surround[1];\n\tenv.nc = surround[2];\n\n\tconst k = 1 / (5 * env.la + 1);\n\tconst k4 = k ** 4;\n\n\t// Factor of luminance level adaptation\n\tenv.fl = (k4 * env.la + 0.1 * (1 - k4) * (1 - k4) * Math.cbrt(5 * env.la));\n\tenv.flRoot = env.fl ** 0.25;\n\n\tenv.n = env.yb / yw;\n\tenv.z = 1.48 + Math.sqrt(env.n);\n\tenv.nbb = 0.725 * (env.n ** -0.2);\n\tenv.ncb = env.nbb;\n\n\t// Degree of adaptation calculating if not discounting\n\t// illuminant (assumed eye is fully adapted)\n\tconst d = (discounting) ?\n\t\t1 :\n\t\tMath.max(\n\t\t\tMath.min(f * (1 - 1 / 3.6 * Math.exp((-env.la - 42) / 92)), 1),\n\t\t\t0,\n\t\t);\n\tenv.dRgb = rgbW.map(c => {\n\t\treturn interpolate(1, yw / c, d);\n\t});\n\tenv.dRgbInv = env.dRgb.map(c => {\n\t\treturn 1 / c;\n\t});\n\n\t// Achromatic response\n\tconst rgbCW = rgbW.map((c, i) => {\n\t\treturn c * env.dRgb[i];\n\t});\n\tconst rgbAW = adapt$1(rgbCW, env.fl);\n\tenv.aW = env.nbb * (2 * rgbAW[0] + rgbAW[1] + 0.05 * rgbAW[2]);\n\n\t// console.log(env);\n\n\treturn env;\n}\n\n// Pre-calculate everything we can with the viewing conditions\nconst viewingConditions$1 = environment(\n\twhite$3,\n\t64 / Math.PI * 0.2, 20,\n\t\"average\",\n\tfalse,\n);\n\nfunction fromCam16 (cam16, env) {\n\n\t// These check ensure one, and only one attribute for a\n\t// given category is provided.\n\tif (!((cam16.J !== undefined) ^ (cam16.Q !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'J' or 'Q'\");\n\t}\n\n\tif (!((cam16.C !== undefined) ^ (cam16.M !== undefined) ^ (cam16.s !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'C', 'M' or 's'\");\n\t}\n\n\t// Hue is absolutely required\n\tif (!((cam16.h !== undefined) ^ (cam16.H !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'h' or 'H'\");\n\t}\n\n\t// Black\n\tif (cam16.J === 0.0 || cam16.Q === 0.0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\n\t// Break hue into Cartesian components\n\tlet hRad = 0.0;\n\tif (cam16.h !== undefined) {\n\t\thRad = constrain(cam16.h) * deg2rad$1;\n\t}\n\telse {\n\t\thRad = invHueQuadrature(cam16.H) * deg2rad$1;\n\t}\n\n\tconst cosh = Math.cos(hRad);\n\tconst sinh = Math.sin(hRad);\n\n\t// Calculate `Jroot` from one of the lightness derived coordinates.\n\tlet Jroot = 0.0;\n\tif (cam16.J !== undefined) {\n\t\tJroot = spow(cam16.J, 1 / 2) * 0.1;\n\t}\n\telse if (cam16.Q !== undefined) {\n\t\tJroot = 0.25 * env.c * cam16.Q / ((env.aW + 4) * env.flRoot);\n\t}\n\n\t// Calculate the `t` value from one of the chroma derived coordinates\n\tlet alpha = 0.0;\n\tif (cam16.C !== undefined) {\n\t\talpha = cam16.C / Jroot;\n\t}\n\telse if (cam16.M !== undefined) {\n\t\talpha = (cam16.M / env.flRoot) / Jroot;\n\t}\n\telse if (cam16.s !== undefined) {\n\t\talpha = 0.0004 * (cam16.s ** 2) * (env.aW + 4) / env.c;\n\t}\n\tconst t = spow(\n\t\talpha * Math.pow(1.64 - Math.pow(0.29, env.n), -0.73),\n\t\t10 / 9,\n\t);\n\n\t// Eccentricity\n\tconst et = 0.25 * (Math.cos(hRad + 2) + 3.8);\n\n\t// Achromatic response\n\tconst A = env.aW * spow(Jroot, 2 / env.c / env.z);\n\n\t// Calculate red-green and yellow-blue components\n\tconst p1 = 5e4 / 13 * env.nc * env.ncb * et;\n\tconst p2 = A / env.nbb;\n\tconst r = (\n\t\t23 * (p2 + 0.305) *\n\t\tzdiv(t, 23 * p1 + t * (11 * cosh + 108 * sinh))\n\t);\n\tconst a = r * cosh;\n\tconst b = r * sinh;\n\n\t// Calculate back from cone response to XYZ\n\tconst rgb_c = unadapt(\n\t\tmultiplyMatrices(m1, [p2, a, b]).map(c => {\n\t\t\treturn c * 1 / 1403;\n\t\t}),\n\t\tenv.fl,\n\t);\n\treturn multiplyMatrices(\n\t\tcat16Inv,\n\t\trgb_c.map((c, i) => {\n\t\t\treturn c * env.dRgbInv[i];\n\t\t}),\n\t).map(c => {\n\t\treturn c / 100;\n\t});\n}\n\n\nfunction toCam16 (xyzd65, env) {\n\t// Cone response\n\tconst xyz100 = xyzd65.map(c => {\n\t\treturn c * 100;\n\t});\n\tconst rgbA = adapt$1(\n\t\tmultiplyMatrices(cat16, xyz100).map((c, i) => {\n\t\t\treturn c * env.dRgb[i];\n\t\t}),\n\t\tenv.fl,\n\t);\n\n\t// Calculate hue from red-green and yellow-blue components\n\tconst a = rgbA[0] + (-12 * rgbA[1] + rgbA[2]) / 11;\n\tconst b = (rgbA[0] + rgbA[1] - 2 * rgbA[2]) / 9;\n\tconst hRad = ((Math.atan2(b, a) % tau) + tau) % tau;\n\n\t// Eccentricity\n\tconst et = 0.25 * (Math.cos(hRad + 2) + 3.8);\n\n\tconst t = (\n\t\t5e4 / 13 * env.nc * env.ncb *\n\t\tzdiv(\n\t\t\tet * Math.sqrt(a ** 2 + b ** 2),\n\t\t\trgbA[0] + rgbA[1] + 1.05 * rgbA[2] + 0.305,\n\t\t)\n\t);\n\tconst alpha = spow(t, 0.9) * Math.pow(1.64 - Math.pow(0.29, env.n), 0.73);\n\n\t// Achromatic response\n\tconst A = env.nbb * (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]);\n\n\tconst Jroot = spow(A / env.aW, 0.5 * env.c * env.z);\n\n\t// Lightness\n\tconst J = 100 * spow(Jroot, 2);\n\n\t// Brightness\n\tconst Q = (4 / env.c * Jroot * (env.aW + 4) * env.flRoot);\n\n\t// Chroma\n\tconst C = alpha * Jroot;\n\n\t// Colorfulness\n\tconst M = C * env.flRoot;\n\n\t// Hue\n\tconst h = constrain(hRad * rad2deg);\n\n\t// Hue quadrature\n\tconst H = hueQuadrature(h);\n\n\t// Saturation\n\tconst s = 50 * spow(env.c * alpha / (env.aW + 4), 1 / 2);\n\n\t// console.log({J: J, C: C, h: h, s: s, Q: Q, M: M, H: H});\n\n\treturn {J: J, C: C, h: h, s: s, Q: Q, M: M, H: H};\n}\n\n\n// Provided as a way to directly evaluate the CAM16 model\n// https://observablehq.com/@jrus/cam16: reference implementation\n// https://arxiv.org/pdf/1802.06067.pdf: Nico Schlömer\n// https://onlinelibrary.wiley.com/doi/pdf/10.1002/col.22324: hue quadrature\n// https://www.researchgate.net/publication/318152296_Comprehensive_color_solutions_CAM16_CAT16_and_CAM16-UCS\n// Results compared against: https://github.com/colour-science/colour\nvar cam16 = new ColorSpace({\n\tid: \"cam16-jmh\",\n\tcssId: \"--cam16-jmh\",\n\tname: \"CAM16-JMh\",\n\tcoords: {\n\t\tj: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"J\",\n\t\t},\n\t\tm: {\n\t\t\trefRange: [0, 105.0],\n\t\t\tname: \"Colorfulness\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\n\tfromBase (xyz) {\n\t\tconst cam16 = toCam16(xyz, viewingConditions$1);\n\t\treturn [cam16.J, cam16.M, cam16.h];\n\t},\n\ttoBase (cam16) {\n\t\treturn fromCam16(\n\t\t\t{J: cam16[0], M: cam16[1], h: cam16[2]},\n\t\t\tviewingConditions$1,\n\t\t);\n\t},\n});\n\nconst white$2 = WHITES.D65;\nconst ε$4 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ$3 = 24389 / 27; // 29^3/3^3\n\nfunction toLstar (y) {\n\t// Convert XYZ Y to L*\n\n\tconst fy = (y > ε$4) ? Math.cbrt(y) : (κ$3 * y + 16) / 116;\n\treturn (116.0 * fy) - 16.0;\n}\n\nfunction fromLstar (lstar) {\n\t// Convert L* back to XYZ Y\n\n\treturn (lstar > 8) ? Math.pow((lstar + 16) / 116, 3) : lstar / κ$3;\n}\n\nfunction fromHct (coords, env) {\n\t// Use Newton's method to try and converge as quick as possible or\n\t// converge as close as we can. While the requested precision is achieved\n\t// most of the time, it may not always be achievable. Especially past the\n\t// visible spectrum, the algorithm will likely struggle to get the same\n\t// precision. If, for whatever reason, we cannot achieve the accuracy we\n\t// seek in the allotted iterations, just return the closest we were able to\n\t// get.\n\n\tlet [h, c, t] = coords;\n\tlet xyz = [];\n\tlet j = 0;\n\n\t// Shortcut out for black\n\tif (t === 0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\n\t// Calculate the Y we need to target\n\tlet y = fromLstar(t);\n\n\t// A better initial guess yields better results. Polynomials come from\n\t// curve fitting the T vs J response.\n\tif (t > 0) {\n\t\tj = 0.00379058511492914 * t ** 2 + 0.608983189401032 * t + 0.9155088574762233;\n\t}\n\telse {\n\t\tj = 9.514440756550361e-06 * t ** 2 + 0.08693057439788597 * t - 21.928975842194614;\n\t}\n\n\t// Threshold of how close is close enough, and max number of attempts.\n\t// More precision and more attempts means more time spent iterating. Higher\n\t// required precision gives more accuracy but also increases the chance of\n\t// not hitting the goal. 2e-12 allows us to convert round trip with\n\t// reasonable accuracy of six decimal places or more.\n\tconst threshold = 2e-12;\n\tconst max_attempts = 15;\n\n\tlet attempt = 0;\n\tlet last = Infinity;\n\n\t// Try to find a J such that the returned y matches the returned y of the L*\n\twhile (attempt <= max_attempts) {\n\t\txyz = fromCam16({J: j, C: c, h: h}, env);\n\n\t\t// If we are within range, return XYZ\n\t\t// If we are closer than last time, save the values\n\t\tconst delta = Math.abs(xyz[1] - y);\n\t\tif (delta < last) {\n\t\t\tif (delta <= threshold) {\n\t\t\t\treturn xyz;\n\t\t\t}\n\t\t\tlast = delta;\n\t\t}\n\n\t\t// f(j_root) = (j ** (1 / 2)) * 0.1\n\t\t// f(j) = ((f(j_root) * 100) ** 2) / j - 1 = 0\n\t\t// f(j_root) = Y = y / 100\n\t\t// f(j) = (y ** 2) / j - 1\n\t\t// f'(j) = (2 * y) / j\n\t\tj = j - (xyz[1] - y) * j / (2 * xyz[1]);\n\n\t\tattempt += 1;\n\t}\n\n\t// We could not acquire the precision we desired,\n\t// return our closest attempt.\n\treturn fromCam16({J: j, C: c, h: h}, env);\n}\n\nfunction toHct (xyz, env) {\n\t// Calculate HCT by taking the L* of CIE LCh D65 and CAM16 chroma and hue.\n\n\tconst t = toLstar(xyz[1]);\n\tif (t === 0.0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\tconst cam16 = toCam16(xyz, viewingConditions);\n\treturn [constrain(cam16.h), cam16.C, t];\n}\n\n// Pre-calculate everything we can with the viewing conditions\nconst viewingConditions = environment(\n\twhite$2, 200 / Math.PI * fromLstar(50.0),\n\tfromLstar(50.0) * 100,\n\t\"average\",\n\tfalse,\n);\n\n// https://material.io/blog/science-of-color-design\n// This is not a port of the material-color-utilities,\n// but instead implements the full color space as described,\n// combining CAM16 JCh and Lab D65. This does not clamp conversion\n// to HCT to specific chroma bands and provides support for wider\n// gamuts than Google currently supports and does so at a greater\n// precision (> 8 bits back to sRGB).\n// This implementation comes from https://github.com/facelessuser/coloraide\n// which is licensed under MIT.\nvar hct = new ColorSpace({\n\tid: \"hct\",\n\tname: \"HCT\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 145],\n\t\t\tname: \"Colorfulness\",\n\t\t},\n\t\tt: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Tone\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\n\tfromBase (xyz) {\n\t\treturn toHct(xyz);\n\t},\n\ttoBase (hct) {\n\t\treturn fromHct(hct, viewingConditions);\n\t},\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hct\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\nconst deg2rad = Math.PI / 180;\nconst ucsCoeff = [1.00, 0.007, 0.0228];\n\n/**\n* Convert HCT chroma and hue (CAM16 JMh colorfulness and hue) using UCS logic for a and b.\n* @param {number[]} coords - HCT coordinates.\n* @return {number[]}\n*/\nfunction convertUcsAb (coords) {\n\t// We want the distance between the actual color.\n\t// If chroma is negative, it will throw off our calculations.\n\t// Normally, converting back to the base and forward will correct it.\n\t// If we have a negative chroma after this, then we have a color that\n\t// cannot resolve to positive chroma.\n\tif (coords[1] < 0) {\n\t\tcoords = hct.fromBase(hct.toBase(coords));\n\t}\n\n\t// Only in extreme cases (usually outside the visible spectrum)\n\t// can the input value for log become negative.\n\t// Avoid domain error by forcing a zero result via \"max\" if necessary.\n\tconst M = Math.log(Math.max(1 + ucsCoeff[2] * coords[1] * viewingConditions.flRoot, 1.0)) / ucsCoeff[2];\n\tconst hrad = coords[0] * deg2rad;\n\tconst a = M * Math.cos(hrad);\n\tconst b = M * Math.sin(hrad);\n\n\treturn [coords[2], a, b];\n}\n\n\n/**\n* Color distance using HCT.\n* @param {Color} color - Color to compare.\n* @param {Color} sample - Color to compare.\n* @return {number[]}\n*/\nfunction deltaEHCT (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\tlet [ t1, a1, b1 ] = convertUcsAb(hct.from(color));\n\tlet [ t2, a2, b2 ] = convertUcsAb(hct.from(sample));\n\n\t// Use simple euclidean distance with a and b using UCS conversion\n\t// and LCh lightness (HCT tone).\n\treturn Math.sqrt((t1 - t2) ** 2 + (a1 - a2) ** 2 + (b1 - b2) ** 2);\n}\n\nvar deltaEMethods = {\n\tdeltaE76,\n\tdeltaECMC,\n\tdeltaE2000,\n\tdeltaEJz,\n\tdeltaEITP,\n\tdeltaEOK,\n\tdeltaEHCT,\n};\n\n/**\n * Calculate the epsilon to 2 degrees smaller than the specified JND.\n * @param {Number} jnd - The target \"just noticeable difference\".\n * @returns {Number}\n */\nfunction calcEpsilon (jnd) {\n\t// Calculate the epsilon to 2 degrees smaller than the specified JND.\n\n\tconst order = (!jnd) ? 0 : Math.floor(Math.log10(Math.abs(jnd)));\n\t// Limit to an arbitrary value to ensure value is never too small and causes infinite loops.\n\treturn Math.max(parseFloat(`1e${order - 2}`), 1e-6);\n}\n\nconst GMAPPRESET = {\n\t\"hct\": {\n\t\tmethod: \"hct.c\",\n\t\tjnd: 2,\n\t\tdeltaEMethod: \"hct\",\n\t\tblackWhiteClamp: {},\n\t},\n\t\"hct-tonal\": {\n\t\tmethod: \"hct.c\",\n\t\tjnd: 0,\n\t\tdeltaEMethod: \"hct\",\n\t\tblackWhiteClamp: { channel: \"hct.t\", min: 0, max: 100 },\n\t},\n};\n\n/**\n * Force coordinates to be in gamut of a certain color space.\n * Mutates the color it is passed.\n * @param {Object|string} options object or spaceId string\n * @param {string} options.method - How to force into gamut.\n * If \"clip\", coordinates are just clipped to their reference range.\n * If \"css\", coordinates are reduced according to the CSS 4 Gamut Mapping Algorithm.\n * If in the form [colorSpaceId].[coordName], that coordinate is reduced\n * until the color is in gamut. Please note that this may produce nonsensical\n * results for certain coordinates (e.g. hue) or infinite loops if reducing the coordinate never brings the color in gamut.\n * @param {ColorSpace|string} options.space - The space whose gamut we want to map to\n * @param {string} options.deltaEMethod - The delta E method to use while performing gamut mapping.\n * If no method is specified, delta E 2000 is used.\n * @param {Number} options.jnd - The \"just noticeable difference\" to target.\n * @param {Object} options.blackWhiteClamp - Used to configure SDR black and clamping.\n * \"channel\" indicates the \"space.channel\" to use for determining when to clamp.\n * \"min\" indicates the lower limit for black clamping and \"max\" indicates the upper\n * limit for white clamping.\n */\n\nfunction toGamut (\n\tcolor,\n\t{\n\t\tmethod = defaults.gamut_mapping,\n\t\tspace = undefined,\n\t\tdeltaEMethod = \"\",\n\t\tjnd = 2,\n\t\tblackWhiteClamp = {},\n\t} = {},\n) {\n\tcolor = getColor(color);\n\n\tif (isString(arguments[1])) {\n\t\tspace = arguments[1];\n\t}\n\telse if (!space) {\n\t\tspace = color.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\n\t// 3 spaces:\n\t// color.space: current color space\n\t// space: space whose gamut we are mapping to\n\t// mapSpace: space with the coord we're reducing\n\n\tif (inGamut(color, space, { epsilon: 0 })) {\n\t\treturn color;\n\t}\n\n\tlet spaceColor;\n\tif (method === \"css\") {\n\t\tspaceColor = toGamutCSS(color, { space });\n\t}\n\telse {\n\t\tif (method !== \"clip\" && !inGamut(color, space)) {\n\n\t\t\tif (Object.prototype.hasOwnProperty.call(GMAPPRESET, method)) {\n\t\t\t\t({method, jnd, deltaEMethod, blackWhiteClamp} = GMAPPRESET[method]);\n\t\t\t}\n\n\t\t\t// Get the correct delta E method\n\t\t\tlet de = deltaE2000;\n\t\t\tif (deltaEMethod !== \"\") {\n\t\t\t\tfor (let m in deltaEMethods) {\n\t\t\t\t\tif (\"deltae\" + deltaEMethod.toLowerCase() === m.toLowerCase()) {\n\t\t\t\t\t\tde = deltaEMethods[m];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet clipped = toGamut(to(color, space), { method: \"clip\", space });\n\t\t\tif (de(color, clipped) > jnd) {\n\n\t\t\t\t// Clamp to SDR white and black if required\n\t\t\t\tif (Object.keys(blackWhiteClamp).length === 3) {\n\t\t\t\t\tlet channelMeta = ColorSpace.resolveCoord(blackWhiteClamp.channel);\n\t\t\t\t\tlet channel = get(to(color, channelMeta.space), channelMeta.id);\n\t\t\t\t\tif (isNone(channel)) {\n\t\t\t\t\t\tchannel = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (channel >= blackWhiteClamp.max) {\n\t\t\t\t\t\treturn to({ space: \"xyz-d65\", coords: WHITES[\"D65\"] }, color.space);\n\t\t\t\t\t}\n\t\t\t\t\telse if (channel <= blackWhiteClamp.min) {\n\t\t\t\t\t\treturn to({ space: \"xyz-d65\", coords: [0, 0, 0] }, color.space);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Reduce a coordinate of a certain color space until the color is in gamut\n\t\t\t\tlet coordMeta = ColorSpace.resolveCoord(method);\n\t\t\t\tlet mapSpace = coordMeta.space;\n\t\t\t\tlet coordId = coordMeta.id;\n\n\t\t\t\tlet mappedColor = to(color, mapSpace);\n\t\t\t\t// If we were already in the mapped color space, we need to resolve undefined channels\n\t\t\t\tmappedColor.coords.forEach((c, i) => {\n\t\t\t\t\tif (isNone(c)) {\n\t\t\t\t\t\tmappedColor.coords[i] = 0;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet bounds = coordMeta.range || coordMeta.refRange;\n\t\t\t\tlet min = bounds[0];\n\t\t\t\tlet ε = calcEpsilon(jnd);\n\t\t\t\tlet low = min;\n\t\t\t\tlet high = get(mappedColor, coordId);\n\n\t\t\t\twhile (high - low > ε) {\n\t\t\t\t\tlet clipped = clone(mappedColor);\n\t\t\t\t\tclipped = toGamut(clipped, { space, method: \"clip\" });\n\t\t\t\t\tlet deltaE = de(mappedColor, clipped);\n\n\t\t\t\t\tif (deltaE - jnd < ε) {\n\t\t\t\t\t\tlow = get(mappedColor, coordId);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thigh = get(mappedColor, coordId);\n\t\t\t\t\t}\n\n\t\t\t\t\tset(mappedColor, coordId, (low + high) / 2);\n\t\t\t\t}\n\n\t\t\t\tspaceColor = to(mappedColor, space);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tspaceColor = clipped;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tspaceColor = to(color, space);\n\t\t}\n\n\t\tif (method === \"clip\" // Dumb coord clipping\n\t\t\t// finish off smarter gamut mapping with clip to get rid of ε, see #17\n\t\t\t|| !inGamut(spaceColor, space, { epsilon: 0 })\n\t\t) {\n\t\t\tlet bounds = Object.values(space.coords).map(c => c.range || []);\n\n\t\t\tspaceColor.coords = spaceColor.coords.map((c, i) => {\n\t\t\t\tlet [min, max] = bounds[i];\n\n\t\t\t\tif (min !== undefined) {\n\t\t\t\t\tc = Math.max(min, c);\n\t\t\t\t}\n\n\t\t\t\tif (max !== undefined) {\n\t\t\t\t\tc = Math.min(c, max);\n\t\t\t\t}\n\n\t\t\t\treturn c;\n\t\t\t});\n\t\t}\n\t}\n\n\tif (space !== color.space) {\n\t\tspaceColor = to(spaceColor, color.space);\n\t}\n\n\tcolor.coords = spaceColor.coords;\n\treturn color;\n}\n\ntoGamut.returns = \"color\";\n\n// The reference colors to be used if lightness is out of the range 0-1 in the\n// `Oklch` space. These are created in the `Oklab` space, as it is used by the\n// DeltaEOK calculation, so it is guaranteed to be imported.\nconst COLORS = {\n\tWHITE: { space: OKLab, coords: [1, 0, 0] },\n\tBLACK: { space: OKLab, coords: [0, 0, 0] },\n};\n\n/**\n * Given a color `origin`, returns a new color that is in gamut using\n * the CSS Gamut Mapping Algorithm. If `space` is specified, it will be in gamut\n * in `space`, and returned in `space`. Otherwise, it will be in gamut and\n * returned in the color space of `origin`.\n * @param {Object} origin\n * @param {Object} options\n * @param {ColorSpace|string} options.space\n * @returns {Color}\n */\nfunction toGamutCSS (origin, {space} = {}) {\n\tconst JND = 0.02;\n\tconst ε = 0.0001;\n\n\torigin = getColor(origin);\n\n\tif (!space) {\n\t\tspace = origin.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\tconst oklchSpace = ColorSpace.get(\"oklch\");\n\n\tif (space.isUnbounded) {\n\t\treturn to(origin, space);\n\t}\n\n\tconst origin_OKLCH = to(origin, oklchSpace);\n\tlet L = origin_OKLCH.coords[0];\n\n\t// return media white or black, if lightness is out of range\n\tif (L >= 1) {\n\t\tconst white = to(COLORS.WHITE, space);\n\t\twhite.alpha = origin.alpha;\n\t\treturn to(white, space);\n\t}\n\tif (L <= 0) {\n\t\tconst black = to(COLORS.BLACK, space);\n\t\tblack.alpha = origin.alpha;\n\t\treturn to(black, space);\n\t}\n\n\tif (inGamut(origin_OKLCH, space, {epsilon: 0})) {\n\t\treturn to(origin_OKLCH, space);\n\t}\n\n\tfunction clip (_color) {\n\t\tconst destColor = to(_color, space);\n\t\tconst spaceCoords = Object.values(space.coords);\n\t\tdestColor.coords = destColor.coords.map((coord, index) => {\n\t\t\tif (\"range\" in spaceCoords[index]) {\n\t\t\t\tconst [min, max] = spaceCoords[index].range;\n\t\t\t\treturn clamp(min, coord, max);\n\t\t\t}\n\t\t\treturn coord;\n\t\t});\n\t\treturn destColor;\n\t}\n\tlet min = 0;\n\tlet max = origin_OKLCH.coords[1];\n\tlet min_inGamut = true;\n\tlet current = clone(origin_OKLCH);\n\tlet clipped = clip(current);\n\n\tlet E = deltaEOK(clipped, current);\n\tif (E < JND) {\n\t\treturn clipped;\n\t}\n\n\twhile ((max - min) > ε) {\n\t\tconst chroma = (min + max) / 2;\n\t\tcurrent.coords[1] = chroma;\n\t\tif (min_inGamut && inGamut(current, space, {epsilon: 0})) {\n\t\t\tmin = chroma;\n\t\t}\n\t\telse {\n\t\t\tclipped = clip(current);\n\t\t\tE = deltaEOK(clipped, current);\n\t\t\tif (E < JND) {\n\t\t\t\tif ((JND - E < ε)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmin_inGamut = false;\n\t\t\t\t\tmin = chroma;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmax = chroma;\n\t\t\t}\n\t\t}\n\t}\n\treturn clipped;\n}\n\n/**\n * Convert to color space and return a new color\n * @param {Object|string} space - Color space object or id\n * @param {Object} options\n * @param {boolean} options.inGamut - Whether to force resulting color in gamut\n * @returns {Color}\n */\nfunction to (color, space, {inGamut} = {}) {\n\tcolor = getColor(color);\n\tspace = ColorSpace.get(space);\n\n\tlet coords = space.from(color);\n\tlet ret = {space, coords, alpha: color.alpha};\n\n\tif (inGamut) {\n\t\tret = toGamut(ret, inGamut === true ? undefined : inGamut);\n\t}\n\n\treturn ret;\n}\n\nto.returns = \"color\";\n\n/**\n * Generic toString() method, outputs a color(spaceId ...coords) function, a functional syntax, or custom formats defined by the color space\n * @param {Object} options\n * @param {number} options.precision - Significant digits\n * @param {boolean} options.inGamut - Adjust coordinates to fit in gamut first? [default: false]\n */\nfunction serialize (color, {\n\tprecision = defaults.precision,\n\tformat = \"default\",\n\tinGamut: inGamut$1 = true,\n\t...customOptions\n} = {}) {\n\tlet ret;\n\n\tcolor = getColor(color);\n\n\tlet formatId = format;\n\tformat = color.space.getFormat(format)\n\t ?? color.space.getFormat(\"default\")\n\t ?? ColorSpace.DEFAULT_FORMAT;\n\n\t// The assignment to coords and inGamut needs to stay in the order they are now\n\t// The order of the assignment was changed as a workaround for a bug in Next.js\n\t// See this issue for details: https://github.com/color-js/color.js/issues/260\n\n\tlet coords = color.coords.slice(); // clone so we can manipulate it\n\n\tinGamut$1 ||= format.toGamut;\n\n\tif (inGamut$1 && !inGamut(color)) {\n\t\t// FIXME what happens if the color contains NaNs?\n\t\tcoords = toGamut(clone(color), inGamut$1 === true ? undefined : inGamut$1).coords;\n\t}\n\n\tif (format.type === \"custom\") {\n\t\tcustomOptions.precision = precision;\n\n\t\tif (format.serialize) {\n\t\t\tret = format.serialize(coords, color.alpha, customOptions);\n\t\t}\n\t\telse {\n\t\t\tthrow new TypeError(`format ${formatId} can only be used to parse colors, not for serialization`);\n\t\t}\n\t}\n\telse {\n\t\t// Functional syntax\n\t\tlet name = format.name || \"color\";\n\n\t\tif (format.serializeCoords) {\n\t\t\tcoords = format.serializeCoords(coords, precision);\n\t\t}\n\t\telse {\n\t\t\tif (precision !== null) {\n\t\t\t\tcoords = coords.map(c => {\n\t\t\t\t\treturn serializeNumber(c, {precision});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tlet args = [...coords];\n\n\t\tif (name === \"color\") {\n\t\t\t// If output is a color() function, add colorspace id as first argument\n\t\t\tlet cssId = format.id || format.ids?.[0] || color.space.id;\n\t\t\targs.unshift(cssId);\n\t\t}\n\n\t\tlet alpha = color.alpha;\n\t\tif (precision !== null) {\n\t\t\talpha = serializeNumber(alpha, {precision});\n\t\t}\n\n\t\tlet strAlpha = color.alpha >= 1 || format.noAlpha ? \"\" : `${format.commas ? \",\" : \" /\"} ${alpha}`;\n\t\tret = `${name}(${args.join(format.commas ? \", \" : \" \")}${strAlpha})`;\n\t}\n\n\treturn ret;\n}\n\n// convert an array of linear-light rec2020 values to CIE XYZ\n// using D65 (no chromatic adaptation)\n// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n// 0 is actually calculated as 4.994106574466076e-17\nconst toXYZ_M$5 = [\n\t[ 0.6369580483012914, 0.14461690358620832, 0.1688809751641721 ],\n\t[ 0.2627002120112671, 0.6779980715188708, 0.05930171646986196 ],\n\t[ 0.000000000000000, 0.028072693049087428, 1.060985057710791 ],\n];\n\n// from ITU-R BT.2124-0 Annex 2 p.3\nconst fromXYZ_M$5 = [\n\t[ 1.716651187971268, -0.355670783776392, -0.253366281373660 ],\n\t[ -0.666684351832489, 1.616481236634939, 0.0157685458139111 ],\n\t[ 0.017639857445311, -0.042770613257809, 0.942103121235474 ],\n];\n\nvar REC2020Linear = new RGBColorSpace({\n\tid: \"rec2020-linear\",\n\tcssId: \"--rec2020-linear\",\n\tname: \"Linear REC.2020\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$5,\n\tfromXYZ_M: fromXYZ_M$5,\n});\n\n// import sRGB from \"./srgb.js\";\n\nconst α = 1.09929682680944;\nconst β = 0.018053968510807;\n\nvar REC2020 = new RGBColorSpace({\n\tid: \"rec2020\",\n\tname: \"REC.2020\",\n\tbase: REC2020Linear,\n\t// Non-linear transfer function from Rec. ITU-R BT.2020-2 table 4\n\ttoBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val < β * 4.5) {\n\t\t\t\treturn val / 4.5;\n\t\t\t}\n\n\t\t\treturn Math.pow((val + α - 1) / α, 1 / 0.45);\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val >= β) {\n\t\t\t\treturn α * Math.pow(val, 0.45) - (α - 1);\n\t\t\t}\n\n\t\t\treturn 4.5 * val;\n\t\t});\n\t},\n});\n\nconst toXYZ_M$4 = [\n\t[0.4865709486482162, 0.26566769316909306, 0.1982172852343625],\n\t[0.2289745640697488, 0.6917385218365064, 0.079286914093745],\n\t[0.0000000000000000, 0.04511338185890264, 1.043944368900976],\n];\n\nconst fromXYZ_M$4 = [\n\t[ 2.493496911941425, -0.9313836179191239, -0.40271078445071684],\n\t[-0.8294889695615747, 1.7626640603183463, 0.023624685841943577],\n\t[ 0.03584583024378447, -0.07617238926804182, 0.9568845240076872],\n];\n\nvar P3Linear = new RGBColorSpace({\n\tid: \"p3-linear\",\n\tcssId: \"--display-p3-linear\",\n\tname: \"Linear P3\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$4,\n\tfromXYZ_M: fromXYZ_M$4,\n});\n\n// This is the linear-light version of sRGB\n// as used for example in SVG filters\n// or in Canvas\n\n// This matrix was calculated directly from the RGB and white chromaticities\n// when rounded to 8 decimal places, it agrees completely with the official matrix\n// see https://github.com/w3c/csswg-drafts/issues/5922\nconst toXYZ_M$3 = [\n\t[ 0.41239079926595934, 0.357584339383878, 0.1804807884018343 ],\n\t[ 0.21263900587151027, 0.715168678767756, 0.07219231536073371 ],\n\t[ 0.01933081871559182, 0.11919477979462598, 0.9505321522496607 ],\n];\n\n// This matrix is the inverse of the above;\n// again it agrees with the official definition when rounded to 8 decimal places\nconst fromXYZ_M$3 = [\n\t[ 3.2409699419045226, -1.537383177570094, -0.4986107602930034 ],\n\t[ -0.9692436362808796, 1.8759675015077202, 0.04155505740717559 ],\n\t[ 0.05563007969699366, -0.20397695888897652, 1.0569715142428786 ],\n];\n\nvar sRGBLinear = new RGBColorSpace({\n\tid: \"srgb-linear\",\n\tname: \"Linear sRGB\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$3,\n\tfromXYZ_M: fromXYZ_M$3,\n});\n\n/* List of CSS color keywords\n * Note that this does not include currentColor, transparent,\n * or system colors\n */\n\n// To produce: Visit https://www.w3.org/TR/css-color-4/#named-colors\n// and run in the console:\n// copy($$(\"tr\", $(\".named-color-table tbody\")).map(tr => `\"${tr.cells[2].textContent.trim()}\": [${tr.cells[4].textContent.trim().split(/\\s+/).map(c => c === \"0\"? \"0\" : c === \"255\"? \"1\" : c + \" / 255\").join(\", \")}]`).join(\",\\n\"))\nvar KEYWORDS = {\n\t\"aliceblue\": [240 / 255, 248 / 255, 1],\n\t\"antiquewhite\": [250 / 255, 235 / 255, 215 / 255],\n\t\"aqua\": [0, 1, 1],\n\t\"aquamarine\": [127 / 255, 1, 212 / 255],\n\t\"azure\": [240 / 255, 1, 1],\n\t\"beige\": [245 / 255, 245 / 255, 220 / 255],\n\t\"bisque\": [1, 228 / 255, 196 / 255],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [1, 235 / 255, 205 / 255],\n\t\"blue\": [0, 0, 1],\n\t\"blueviolet\": [138 / 255, 43 / 255, 226 / 255],\n\t\"brown\": [165 / 255, 42 / 255, 42 / 255],\n\t\"burlywood\": [222 / 255, 184 / 255, 135 / 255],\n\t\"cadetblue\": [95 / 255, 158 / 255, 160 / 255],\n\t\"chartreuse\": [127 / 255, 1, 0],\n\t\"chocolate\": [210 / 255, 105 / 255, 30 / 255],\n\t\"coral\": [1, 127 / 255, 80 / 255],\n\t\"cornflowerblue\": [100 / 255, 149 / 255, 237 / 255],\n\t\"cornsilk\": [1, 248 / 255, 220 / 255],\n\t\"crimson\": [220 / 255, 20 / 255, 60 / 255],\n\t\"cyan\": [0, 1, 1],\n\t\"darkblue\": [0, 0, 139 / 255],\n\t\"darkcyan\": [0, 139 / 255, 139 / 255],\n\t\"darkgoldenrod\": [184 / 255, 134 / 255, 11 / 255],\n\t\"darkgray\": [169 / 255, 169 / 255, 169 / 255],\n\t\"darkgreen\": [0, 100 / 255, 0],\n\t\"darkgrey\": [169 / 255, 169 / 255, 169 / 255],\n\t\"darkkhaki\": [189 / 255, 183 / 255, 107 / 255],\n\t\"darkmagenta\": [139 / 255, 0, 139 / 255],\n\t\"darkolivegreen\": [85 / 255, 107 / 255, 47 / 255],\n\t\"darkorange\": [1, 140 / 255, 0],\n\t\"darkorchid\": [153 / 255, 50 / 255, 204 / 255],\n\t\"darkred\": [139 / 255, 0, 0],\n\t\"darksalmon\": [233 / 255, 150 / 255, 122 / 255],\n\t\"darkseagreen\": [143 / 255, 188 / 255, 143 / 255],\n\t\"darkslateblue\": [72 / 255, 61 / 255, 139 / 255],\n\t\"darkslategray\": [47 / 255, 79 / 255, 79 / 255],\n\t\"darkslategrey\": [47 / 255, 79 / 255, 79 / 255],\n\t\"darkturquoise\": [0, 206 / 255, 209 / 255],\n\t\"darkviolet\": [148 / 255, 0, 211 / 255],\n\t\"deeppink\": [1, 20 / 255, 147 / 255],\n\t\"deepskyblue\": [0, 191 / 255, 1],\n\t\"dimgray\": [105 / 255, 105 / 255, 105 / 255],\n\t\"dimgrey\": [105 / 255, 105 / 255, 105 / 255],\n\t\"dodgerblue\": [30 / 255, 144 / 255, 1],\n\t\"firebrick\": [178 / 255, 34 / 255, 34 / 255],\n\t\"floralwhite\": [1, 250 / 255, 240 / 255],\n\t\"forestgreen\": [34 / 255, 139 / 255, 34 / 255],\n\t\"fuchsia\": [1, 0, 1],\n\t\"gainsboro\": [220 / 255, 220 / 255, 220 / 255],\n\t\"ghostwhite\": [248 / 255, 248 / 255, 1],\n\t\"gold\": [1, 215 / 255, 0],\n\t\"goldenrod\": [218 / 255, 165 / 255, 32 / 255],\n\t\"gray\": [128 / 255, 128 / 255, 128 / 255],\n\t\"green\": [0, 128 / 255, 0],\n\t\"greenyellow\": [173 / 255, 1, 47 / 255],\n\t\"grey\": [128 / 255, 128 / 255, 128 / 255],\n\t\"honeydew\": [240 / 255, 1, 240 / 255],\n\t\"hotpink\": [1, 105 / 255, 180 / 255],\n\t\"indianred\": [205 / 255, 92 / 255, 92 / 255],\n\t\"indigo\": [75 / 255, 0, 130 / 255],\n\t\"ivory\": [1, 1, 240 / 255],\n\t\"khaki\": [240 / 255, 230 / 255, 140 / 255],\n\t\"lavender\": [230 / 255, 230 / 255, 250 / 255],\n\t\"lavenderblush\": [1, 240 / 255, 245 / 255],\n\t\"lawngreen\": [124 / 255, 252 / 255, 0],\n\t\"lemonchiffon\": [1, 250 / 255, 205 / 255],\n\t\"lightblue\": [173 / 255, 216 / 255, 230 / 255],\n\t\"lightcoral\": [240 / 255, 128 / 255, 128 / 255],\n\t\"lightcyan\": [224 / 255, 1, 1],\n\t\"lightgoldenrodyellow\": [250 / 255, 250 / 255, 210 / 255],\n\t\"lightgray\": [211 / 255, 211 / 255, 211 / 255],\n\t\"lightgreen\": [144 / 255, 238 / 255, 144 / 255],\n\t\"lightgrey\": [211 / 255, 211 / 255, 211 / 255],\n\t\"lightpink\": [1, 182 / 255, 193 / 255],\n\t\"lightsalmon\": [1, 160 / 255, 122 / 255],\n\t\"lightseagreen\": [32 / 255, 178 / 255, 170 / 255],\n\t\"lightskyblue\": [135 / 255, 206 / 255, 250 / 255],\n\t\"lightslategray\": [119 / 255, 136 / 255, 153 / 255],\n\t\"lightslategrey\": [119 / 255, 136 / 255, 153 / 255],\n\t\"lightsteelblue\": [176 / 255, 196 / 255, 222 / 255],\n\t\"lightyellow\": [1, 1, 224 / 255],\n\t\"lime\": [0, 1, 0],\n\t\"limegreen\": [50 / 255, 205 / 255, 50 / 255],\n\t\"linen\": [250 / 255, 240 / 255, 230 / 255],\n\t\"magenta\": [1, 0, 1],\n\t\"maroon\": [128 / 255, 0, 0],\n\t\"mediumaquamarine\": [102 / 255, 205 / 255, 170 / 255],\n\t\"mediumblue\": [0, 0, 205 / 255],\n\t\"mediumorchid\": [186 / 255, 85 / 255, 211 / 255],\n\t\"mediumpurple\": [147 / 255, 112 / 255, 219 / 255],\n\t\"mediumseagreen\": [60 / 255, 179 / 255, 113 / 255],\n\t\"mediumslateblue\": [123 / 255, 104 / 255, 238 / 255],\n\t\"mediumspringgreen\": [0, 250 / 255, 154 / 255],\n\t\"mediumturquoise\": [72 / 255, 209 / 255, 204 / 255],\n\t\"mediumvioletred\": [199 / 255, 21 / 255, 133 / 255],\n\t\"midnightblue\": [25 / 255, 25 / 255, 112 / 255],\n\t\"mintcream\": [245 / 255, 1, 250 / 255],\n\t\"mistyrose\": [1, 228 / 255, 225 / 255],\n\t\"moccasin\": [1, 228 / 255, 181 / 255],\n\t\"navajowhite\": [1, 222 / 255, 173 / 255],\n\t\"navy\": [0, 0, 128 / 255],\n\t\"oldlace\": [253 / 255, 245 / 255, 230 / 255],\n\t\"olive\": [128 / 255, 128 / 255, 0],\n\t\"olivedrab\": [107 / 255, 142 / 255, 35 / 255],\n\t\"orange\": [1, 165 / 255, 0],\n\t\"orangered\": [1, 69 / 255, 0],\n\t\"orchid\": [218 / 255, 112 / 255, 214 / 255],\n\t\"palegoldenrod\": [238 / 255, 232 / 255, 170 / 255],\n\t\"palegreen\": [152 / 255, 251 / 255, 152 / 255],\n\t\"paleturquoise\": [175 / 255, 238 / 255, 238 / 255],\n\t\"palevioletred\": [219 / 255, 112 / 255, 147 / 255],\n\t\"papayawhip\": [1, 239 / 255, 213 / 255],\n\t\"peachpuff\": [1, 218 / 255, 185 / 255],\n\t\"peru\": [205 / 255, 133 / 255, 63 / 255],\n\t\"pink\": [1, 192 / 255, 203 / 255],\n\t\"plum\": [221 / 255, 160 / 255, 221 / 255],\n\t\"powderblue\": [176 / 255, 224 / 255, 230 / 255],\n\t\"purple\": [128 / 255, 0, 128 / 255],\n\t\"rebeccapurple\": [102 / 255, 51 / 255, 153 / 255],\n\t\"red\": [1, 0, 0],\n\t\"rosybrown\": [188 / 255, 143 / 255, 143 / 255],\n\t\"royalblue\": [65 / 255, 105 / 255, 225 / 255],\n\t\"saddlebrown\": [139 / 255, 69 / 255, 19 / 255],\n\t\"salmon\": [250 / 255, 128 / 255, 114 / 255],\n\t\"sandybrown\": [244 / 255, 164 / 255, 96 / 255],\n\t\"seagreen\": [46 / 255, 139 / 255, 87 / 255],\n\t\"seashell\": [1, 245 / 255, 238 / 255],\n\t\"sienna\": [160 / 255, 82 / 255, 45 / 255],\n\t\"silver\": [192 / 255, 192 / 255, 192 / 255],\n\t\"skyblue\": [135 / 255, 206 / 255, 235 / 255],\n\t\"slateblue\": [106 / 255, 90 / 255, 205 / 255],\n\t\"slategray\": [112 / 255, 128 / 255, 144 / 255],\n\t\"slategrey\": [112 / 255, 128 / 255, 144 / 255],\n\t\"snow\": [1, 250 / 255, 250 / 255],\n\t\"springgreen\": [0, 1, 127 / 255],\n\t\"steelblue\": [70 / 255, 130 / 255, 180 / 255],\n\t\"tan\": [210 / 255, 180 / 255, 140 / 255],\n\t\"teal\": [0, 128 / 255, 128 / 255],\n\t\"thistle\": [216 / 255, 191 / 255, 216 / 255],\n\t\"tomato\": [1, 99 / 255, 71 / 255],\n\t\"turquoise\": [64 / 255, 224 / 255, 208 / 255],\n\t\"violet\": [238 / 255, 130 / 255, 238 / 255],\n\t\"wheat\": [245 / 255, 222 / 255, 179 / 255],\n\t\"white\": [1, 1, 1],\n\t\"whitesmoke\": [245 / 255, 245 / 255, 245 / 255],\n\t\"yellow\": [1, 1, 0],\n\t\"yellowgreen\": [154 / 255, 205 / 255, 50 / 255],\n};\n\nlet coordGrammar = Array(3).fill(\"<percentage> | <number>[0, 255]\");\nlet coordGrammarNumber = Array(3).fill(\"<number>[0, 255]\");\n\nvar sRGB = new RGBColorSpace({\n\tid: \"srgb\",\n\tname: \"sRGB\",\n\tbase: sRGBLinear,\n\tfromBase: rgb => {\n\t\t// convert an array of linear-light sRGB values in the range 0.0-1.0\n\t\t// to gamma corrected form\n\t\t// https://en.wikipedia.org/wiki/SRGB\n\t\treturn rgb.map(val => {\n\t\t\tlet sign = val < 0 ? -1 : 1;\n\t\t\tlet abs = val * sign;\n\n\t\t\tif (abs > 0.0031308) {\n\t\t\t\treturn sign * (1.055 * (abs ** (1 / 2.4)) - 0.055);\n\t\t\t}\n\n\t\t\treturn 12.92 * val;\n\t\t});\n\t},\n\ttoBase: rgb => {\n\t\t// convert an array of sRGB values in the range 0.0 - 1.0\n\t\t// to linear light (un-companded) form.\n\t\t// https://en.wikipedia.org/wiki/SRGB\n\t\treturn rgb.map(val => {\n\t\t\tlet sign = val < 0 ? -1 : 1;\n\t\t\tlet abs = val * sign;\n\n\t\t\tif (abs <= 0.04045) {\n\t\t\t\treturn val / 12.92;\n\t\t\t}\n\n\t\t\treturn sign * (((abs + 0.055) / 1.055) ** 2.4);\n\t\t});\n\t},\n\tformats: {\n\t\t\"rgb\": {\n\t\t\tcoords: coordGrammar,\n\t\t},\n\t\t\"rgb_number\": {\n\t\t\tname: \"rgb\",\n\t\t\tcommas: true,\n\t\t\tcoords: coordGrammarNumber,\n\t\t\tnoAlpha: true,\n\t\t},\n\t\t\"color\": { /* use defaults */ },\n\t\t\"rgba\": {\n\t\t\tcoords: coordGrammar,\n\t\t\tcommas: true,\n\t\t\tlastAlpha: true,\n\t\t},\n\t\t\"rgba_number\": {\n\t\t\tname: \"rgba\",\n\t\t\tcommas: true,\n\t\t\tcoords: coordGrammarNumber,\n\t\t},\n\t\t\"hex\": {\n\t\t\ttype: \"custom\",\n\t\t\ttoGamut: true,\n\t\t\ttest: str => /^#([a-f0-9]{3,4}){1,2}$/i.test(str),\n\t\t\tparse (str) {\n\t\t\t\tif (str.length <= 5) {\n\t\t\t\t\t// #rgb or #rgba, duplicate digits\n\t\t\t\t\tstr = str.replace(/[a-f0-9]/gi, \"$&$&\");\n\t\t\t\t}\n\n\t\t\t\tlet rgba = [];\n\t\t\t\tstr.replace(/[a-f0-9]{2}/gi, component => {\n\t\t\t\t\trgba.push(parseInt(component, 16) / 255);\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tspaceId: \"srgb\",\n\t\t\t\t\tcoords: rgba.slice(0, 3),\n\t\t\t\t\talpha: rgba.slice(3)[0],\n\t\t\t\t};\n\t\t\t},\n\t\t\tserialize: (coords, alpha, {\n\t\t\t\tcollapse = true, // collapse to 3-4 digit hex when possible?\n\t\t\t} = {}) => {\n\t\t\t\tif (alpha < 1) {\n\t\t\t\t\tcoords.push(alpha);\n\t\t\t\t}\n\n\t\t\t\tcoords = coords.map(c => Math.round(c * 255));\n\n\t\t\t\tlet collapsible = collapse && coords.every(c => c % 17 === 0);\n\n\t\t\t\tlet hex = coords.map(c => {\n\t\t\t\t\tif (collapsible) {\n\t\t\t\t\t\treturn (c / 17).toString(16);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.toString(16).padStart(2, \"0\");\n\t\t\t\t}).join(\"\");\n\n\t\t\t\treturn \"#\" + hex;\n\t\t\t},\n\t\t},\n\t\t\"keyword\": {\n\t\t\ttype: \"custom\",\n\t\t\ttest: str => /^[a-z]+$/i.test(str),\n\t\t\tparse (str) {\n\t\t\t\tstr = str.toLowerCase();\n\t\t\t\tlet ret = {spaceId: \"srgb\", coords: null, alpha: 1};\n\n\t\t\t\tif (str === \"transparent\") {\n\t\t\t\t\tret.coords = KEYWORDS.black;\n\t\t\t\t\tret.alpha = 0;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tret.coords = KEYWORDS[str];\n\t\t\t\t}\n\n\t\t\t\tif (ret.coords) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n});\n\nvar P3 = new RGBColorSpace({\n\tid: \"p3\",\n\tcssId: \"display-p3\",\n\tname: \"P3\",\n\tbase: P3Linear,\n\t// Gamma encoding/decoding is the same as sRGB\n\tfromBase: sRGB.fromBase,\n\ttoBase: sRGB.toBase,\n});\n\n// Default space for CSS output. Code in Color.js makes this wider if there's a DOM available\ndefaults.display_space = sRGB;\n\nlet supportsNone;\n\nif (typeof CSS !== \"undefined\" && CSS.supports) {\n\t// Find widest supported color space for CSS\n\tfor (let space of [lab, REC2020, P3]) {\n\t\tlet coords = space.getMinCoords();\n\t\tlet color = {space, coords, alpha: 1};\n\t\tlet str = serialize(color);\n\n\t\tif (CSS.supports(\"color\", str)) {\n\t\t\tdefaults.display_space = space;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Returns a serialization of the color that can actually be displayed in the browser.\n * If the default serialization can be displayed, it is returned.\n * Otherwise, the color is converted to Lab, REC2020, or P3, whichever is the widest supported.\n * In Node.js, this is basically equivalent to `serialize()` but returns a `String` object instead.\n *\n * @export\n * @param {{space, coords} | Color | string} color\n * @param {*} [options={}] Options to be passed to serialize()\n * @param {ColorSpace | string} [options.space = defaults.display_space] Color space to use for serialization if default is not supported\n * @returns {String} String object containing the serialized color with a color property containing the converted color (or the original, if no conversion was necessary)\n */\nfunction display (color, {space = defaults.display_space, ...options} = {}) {\n\tlet ret = serialize(color, options);\n\n\tif (typeof CSS === \"undefined\" || CSS.supports(\"color\", ret) || !defaults.display_space) {\n\t\tret = new String(ret);\n\t\tret.color = color;\n\t}\n\telse {\n\t\t// If we're here, what we were about to output is not supported\n\t\tlet fallbackColor = color;\n\n\t\t// First, check if the culprit is none values\n\t\tlet hasNone = color.coords.some(isNone) || isNone(color.alpha);\n\n\t\tif (hasNone) {\n\t\t\t// Does the browser support none values?\n\t\t\tif (!(supportsNone ??= CSS.supports(\"color\", \"hsl(none 50% 50%)\"))) {\n\t\t\t\t// Nope, try again without none\n\t\t\t\tfallbackColor = clone(color);\n\t\t\t\tfallbackColor.coords = fallbackColor.coords.map(skipNone);\n\t\t\t\tfallbackColor.alpha = skipNone(fallbackColor.alpha);\n\n\t\t\t\tret = serialize(fallbackColor, options);\n\n\t\t\t\tif (CSS.supports(\"color\", ret)) {\n\t\t\t\t\t// We're done, now it's supported\n\t\t\t\t\tret = new String(ret);\n\t\t\t\t\tret.color = fallbackColor;\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're here, the color function is not supported\n\t\t// Fall back to fallback space\n\t\tfallbackColor = to(fallbackColor, space);\n\t\tret = new String(serialize(fallbackColor, options));\n\t\tret.color = fallbackColor;\n\t}\n\n\treturn ret;\n}\n\nfunction equals (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\treturn color1.space === color2.space\n\t && color1.alpha === color2.alpha\n\t && color1.coords.every((c, i) => c === color2.coords[i]);\n}\n\n/**\n * Relative luminance\n */\n\nfunction getLuminance (color) {\n\t// Assume getColor() is called on color in get()\n\treturn get(color, [xyz_d65, \"y\"]);\n}\n\nfunction setLuminance (color, value) {\n\t// Assume getColor() is called on color in set()\n\tset(color, [xyz_d65, \"y\"], value);\n}\n\nfunction register$2 (Color) {\n\tObject.defineProperty(Color.prototype, \"luminance\", {\n\t\tget () {\n\t\t\treturn getLuminance(this);\n\t\t},\n\t\tset (value) {\n\t\t\tsetLuminance(this, value);\n\t\t},\n\t});\n}\n\nvar luminance = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tgetLuminance: getLuminance,\n\tregister: register$2,\n\tsetLuminance: setLuminance\n});\n\n// WCAG 2.0 contrast https://www.w3.org/TR/WCAG20-TECHS/G18.html\n// Simple contrast, with fixed 5% viewing flare contribution\n// Symmetric, does not matter which is foreground and which is background\n\n\nfunction contrastWCAG21 (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\treturn (Y1 + .05) / (Y2 + .05);\n}\n\n// APCA 0.0.98G\n// https://github.com/Myndex/apca-w3\n// see also https://github.com/w3c/silver/issues/643\n\n\n// exponents\nconst normBG = 0.56;\nconst normTXT = 0.57;\nconst revTXT = 0.62;\nconst revBG = 0.65;\n\n// clamps\nconst blkThrs = 0.022;\nconst blkClmp = 1.414;\nconst loClip = 0.1;\nconst deltaYmin = 0.0005;\n\n// scalers\n// see https://github.com/w3c/silver/issues/645\nconst scaleBoW = 1.14;\nconst loBoWoffset = 0.027;\nconst scaleWoB = 1.14;\n\nfunction fclamp (Y) {\n\tif (Y >= blkThrs) {\n\t\treturn Y;\n\t}\n\treturn Y + (blkThrs - Y) ** blkClmp;\n}\n\nfunction linearize (val) {\n\tlet sign = val < 0 ? -1 : 1;\n\tlet abs = Math.abs(val);\n\treturn sign * Math.pow(abs, 2.4);\n}\n\n// Not symmetric, requires a foreground (text) color, and a background color\nfunction contrastAPCA (background, foreground) {\n\tforeground = getColor(foreground);\n\tbackground = getColor(background);\n\n\tlet S;\n\tlet C;\n\tlet Sapc;\n\n\t// Myndex as-published, assumes sRGB inputs\n\tlet R, G, B;\n\n\tforeground = to(foreground, \"srgb\");\n\t// Should these be clamped to in-gamut values?\n\n\t// Calculates \"screen luminance\" with non-standard simple gamma EOTF\n\t// weights should be from CSS Color 4, not the ones here which are via Myndex and copied from Lindbloom\n\t[R, G, B] = foreground.coords;\n\tlet lumTxt = linearize(R) * 0.2126729 + linearize(G) * 0.7151522 + linearize(B) * 0.0721750;\n\n\tbackground = to(background, \"srgb\");\n\t[R, G, B] = background.coords;\n\tlet lumBg = linearize(R) * 0.2126729 + linearize(G) * 0.7151522 + linearize(B) * 0.0721750;\n\n\t// toe clamping of very dark values to account for flare\n\tlet Ytxt = fclamp(lumTxt);\n\tlet Ybg = fclamp(lumBg);\n\n\t// are we \"Black on White\" (dark on light), or light on dark?\n\tlet BoW = Ybg > Ytxt;\n\n\t// why is this a delta, when Y is not perceptually uniform?\n\t// Answer: it is a noise gate, see\n\t// https://github.com/LeaVerou/color.js/issues/208\n\tif (Math.abs(Ybg - Ytxt) < deltaYmin) {\n\t\tC = 0;\n\t}\n\telse {\n\t\tif (BoW) {\n\t\t\t// dark text on light background\n\t\t\tS = Ybg ** normBG - Ytxt ** normTXT;\n\t\t\tC = S * scaleBoW;\n\t\t}\n\t\telse {\n\t\t\t// light text on dark background\n\t\t\tS = Ybg ** revBG - Ytxt ** revTXT;\n\t\t\tC = S * scaleWoB;\n\t\t}\n\t}\n\tif (Math.abs(C) < loClip) {\n\t\tSapc = 0;\n\t}\n\telse if (C > 0) {\n\t\t// not clear whether Woffset is loBoWoffset or loWoBoffset\n\t\t// but they have the same value\n\t\tSapc = C - loBoWoffset;\n\t}\n\telse {\n\t\tSapc = C + loBoWoffset;\n\t}\n\n\treturn Sapc * 100;\n}\n\n// Michelson luminance contrast\n// the relation between the spread and the sum of the two luminances\n// Symmetric, does not matter which is foreground and which is background\n// No black level compensation for flare.\n\n\nfunction contrastMichelson (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\tlet denom = (Y1 + Y2);\n\treturn denom === 0 ? 0 : (Y1 - Y2) / denom;\n}\n\n// Weber luminance contrast\n// The difference between the two luminances divided by the lower luminance\n// Symmetric, does not matter which is foreground and which is background\n// No black level compensation for flare.\n\n\n// the darkest sRGB color above black is #000001 and this produces\n// a plain Weber contrast of ~45647.\n// So, setting the divide-by-zero result at 50000 is a reasonable\n// max clamp for the plain Weber\nconst max = 50000;\n\nfunction contrastWeber (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\treturn Y2 === 0 ? max : (Y1 - Y2) / Y2;\n}\n\n// CIE Lightness difference, as used by Google Material Design\n// Google HCT Tone is the same as CIE Lightness\n// https://material.io/blog/science-of-color-design\n\n\nfunction contrastLstar (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet L1 = get(color1, [lab, \"l\"]);\n\tlet L2 = get(color2, [lab, \"l\"]);\n\n\treturn Math.abs(L1 - L2);\n}\n\n// κ * ε = 2^3 = 8\nconst ε$3 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst ε3 = 24 / 116;\nconst κ$2 = 24389 / 27; // 29^3/3^3\n\nlet white$1 = WHITES.D65;\n\nvar lab_d65 = new ColorSpace({\n\tid: \"lab-d65\",\n\tname: \"Lab D65\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t},\n\n\t// Assuming XYZ is relative to D65, convert to CIE Lab\n\t// from CIE standard, which now defines these as a rational fraction\n\twhite: white$1,\n\n\tbase: xyz_d65,\n\t// Convert D65-adapted XYZ to Lab\n\t// CIE 15.3:2004 section 8.2.1.1\n\tfromBase (XYZ) {\n\t\t// compute xyz, which is XYZ scaled relative to reference white\n\t\tlet xyz = XYZ.map((value, i) => value / white$1[i]);\n\n\t\t// now compute f\n\t\tlet f = xyz.map(value => value > ε$3 ? Math.cbrt(value) : (κ$2 * value + 16) / 116);\n\n\t\treturn [\n\t\t\t(116 * f[1]) - 16, // L\n\t\t\t500 * (f[0] - f[1]), // a\n\t\t\t200 * (f[1] - f[2]), // b\n\t\t];\n\t},\n\t// Convert Lab to D65-adapted XYZ\n\t// Same result as CIE 15.3:2004 Appendix D although the derivation is different\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\ttoBase (Lab) {\n\t\t// compute f, starting with the luminance-related term\n\t\tlet f = [];\n\t\tf[1] = (Lab[0] + 16) / 116;\n\t\tf[0] = Lab[1] / 500 + f[1];\n\t\tf[2] = f[1] - Lab[2] / 200;\n\n\t\t// compute xyz\n\t\tlet xyz = [\n\t\t\tf[0] > ε3 ? Math.pow(f[0], 3) : (116 * f[0] - 16) / κ$2,\n\t\t\tLab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / κ$2,\n\t\t\tf[2] > ε3 ? Math.pow(f[2], 3) : (116 * f[2] - 16) / κ$2,\n\t\t];\n\n\t\t// Compute XYZ by scaling xyz by reference white\n\t\treturn xyz.map((value, i) => value * white$1[i]);\n\t},\n\n\tformats: {\n\t\t\"lab-d65\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\n// Delta Phi Star perceptual lightness contrast\n// See https://github.com/Myndex/deltaphistar\n// The (difference between two Lstars each raised to phi) raised to (1/phi)\n// Symmetric, does not matter which is foreground and which is background\n\n\nconst phi = Math.pow(5, 0.5) * 0.5 + 0.5; // Math.phi can be used if Math.js\n\nfunction contrastDeltaPhi (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Lstr1 = get(color1, [lab_d65, \"l\"]);\n\tlet Lstr2 = get(color2, [lab_d65, \"l\"]);\n\n\tlet deltaPhiStar = Math.abs(Math.pow(Lstr1, phi) - Math.pow(Lstr2, phi));\n\n\tlet contrast = Math.pow(deltaPhiStar, (1 / phi)) * Math.SQRT2 - 40;\n\n\treturn (contrast < 7.5) ? 0.0 : contrast ;\n}\n\nvar contrastMethods = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tcontrastAPCA: contrastAPCA,\n\tcontrastDeltaPhi: contrastDeltaPhi,\n\tcontrastLstar: contrastLstar,\n\tcontrastMichelson: contrastMichelson,\n\tcontrastWCAG21: contrastWCAG21,\n\tcontrastWeber: contrastWeber\n});\n\nfunction contrast (background, foreground, o = {}) {\n\tif (isString(o)) {\n\t\to = {algorithm: o};\n\t}\n\n\tlet {algorithm, ...rest} = o;\n\n\tif (!algorithm) {\n\t\tlet algorithms = Object.keys(contrastMethods).map(a => a.replace(/^contrast/, \"\")).join(\", \");\n\t\tthrow new TypeError(`contrast() function needs a contrast algorithm. Please specify one of: ${algorithms}`);\n\t}\n\n\tbackground = getColor(background);\n\tforeground = getColor(foreground);\n\n\tfor (let a in contrastMethods) {\n\t\tif (\"contrast\" + algorithm.toLowerCase() === a.toLowerCase()) {\n\t\t\treturn contrastMethods[a](background, foreground, rest);\n\t\t}\n\t}\n\n\tthrow new TypeError(`Unknown contrast algorithm: ${algorithm}`);\n}\n\n// Chromaticity coordinates\nfunction uv (color) {\n\t// Assumes getAll() calls getColor() on color\n\tlet [X, Y, Z] = getAll(color, xyz_d65);\n\tlet denom = X + 15 * Y + 3 * Z;\n\treturn [4 * X / denom, 9 * Y / denom];\n}\n\nfunction xy (color) {\n\t// Assumes getAll() calls getColor() on color\n\tlet [X, Y, Z] = getAll(color, xyz_d65);\n\tlet sum = X + Y + Z;\n\treturn [X / sum, Y / sum];\n}\n\nfunction register$1 (Color) {\n\t// no setters, as lightness information is lost\n\t// when converting color to chromaticity\n\tObject.defineProperty(Color.prototype, \"uv\", {\n\t\tget () {\n\t\t\treturn uv(this);\n\t\t},\n\t});\n\n\tObject.defineProperty(Color.prototype, \"xy\", {\n\t\tget () {\n\t\t\treturn xy(this);\n\t\t},\n\t});\n}\n\nvar chromaticity = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tregister: register$1,\n\tuv: uv,\n\txy: xy\n});\n\nfunction deltaE (c1, c2, o = {}) {\n\tif (isString(o)) {\n\t\to = {method: o};\n\t}\n\n\tlet {method = defaults.deltaE, ...rest} = o;\n\n\tfor (let m in deltaEMethods) {\n\t\tif (\"deltae\" + method.toLowerCase() === m.toLowerCase()) {\n\t\t\treturn deltaEMethods[m](c1, c2, rest);\n\t\t}\n\t}\n\n\tthrow new TypeError(`Unknown deltaE method: ${method}`);\n}\n\nfunction lighten (color, amount = .25) {\n\tlet space = ColorSpace.get(\"oklch\", \"lch\");\n\tlet lightness = [space, \"l\"];\n\treturn set(color, lightness, l => l * (1 + amount));\n}\n\nfunction darken (color, amount = .25) {\n\tlet space = ColorSpace.get(\"oklch\", \"lch\");\n\tlet lightness = [space, \"l\"];\n\treturn set(color, lightness, l => l * (1 - amount));\n}\n\nvar variations = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tdarken: darken,\n\tlighten: lighten\n});\n\n/**\n * Functions related to color interpolation\n */\n\n/**\n * Return an intermediate color between two colors\n * Signatures: mix(c1, c2, p, options)\n * mix(c1, c2, options)\n * mix(color)\n * @param {Color | string} c1 The first color\n * @param {Color | string} [c2] The second color\n * @param {number} [p=.5] A 0-1 percentage where 0 is c1 and 1 is c2\n * @param {Object} [o={}]\n * @return {Color}\n */\nfunction mix (c1, c2, p = .5, o = {}) {\n\t[c1, c2] = [getColor(c1), getColor(c2)];\n\n\tif (type(p) === \"object\") {\n\t\t[p, o] = [.5, p];\n\t}\n\n\tlet r = range(c1, c2, o);\n\treturn r(p);\n}\n\n/**\n *\n * @param {Color | string | Function} c1 The first color or a range\n * @param {Color | string} [c2] The second color if c1 is not a range\n * @param {Object} [options={}]\n * @return {Color[]}\n */\nfunction steps (c1, c2, options = {}) {\n\tlet colorRange;\n\n\tif (isRange(c1)) {\n\t\t// Tweaking existing range\n\t\t[colorRange, options] = [c1, c2];\n\t\t[c1, c2] = colorRange.rangeArgs.colors;\n\t}\n\n\tlet {\n\t\tmaxDeltaE, deltaEMethod,\n\t\tsteps = 2, maxSteps = 1000,\n\t\t...rangeOptions\n\t} = options;\n\n\tif (!colorRange) {\n\t\t[c1, c2] = [getColor(c1), getColor(c2)];\n\t\tcolorRange = range(c1, c2, rangeOptions);\n\t}\n\n\tlet totalDelta = deltaE(c1, c2);\n\tlet actualSteps = maxDeltaE > 0 ? Math.max(steps, Math.ceil(totalDelta / maxDeltaE) + 1) : steps;\n\tlet ret = [];\n\n\tif (maxSteps !== undefined) {\n\t\tactualSteps = Math.min(actualSteps, maxSteps);\n\t}\n\n\tif (actualSteps === 1) {\n\t\tret = [{p: .5, color: colorRange(.5)}];\n\t}\n\telse {\n\t\tlet step = 1 / (actualSteps - 1);\n\t\tret = Array.from({length: actualSteps}, (_, i) => {\n\t\t\tlet p = i * step;\n\t\t\treturn {p, color: colorRange(p)};\n\t\t});\n\t}\n\n\tif (maxDeltaE > 0) {\n\t\t// Iterate over all stops and find max deltaE\n\t\tlet maxDelta = ret.reduce((acc, cur, i) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tlet ΔΕ = deltaE(cur.color, ret[i - 1].color, deltaEMethod);\n\t\t\treturn Math.max(acc, ΔΕ);\n\t\t}, 0);\n\n\t\twhile (maxDelta > maxDeltaE) {\n\t\t\t// Insert intermediate stops and measure maxDelta again\n\t\t\t// We need to do this for all pairs, otherwise the midpoint shifts\n\t\t\tmaxDelta = 0;\n\n\t\t\tfor (let i = 1; (i < ret.length) && (ret.length < maxSteps); i++) {\n\t\t\t\tlet prev = ret[i - 1];\n\t\t\t\tlet cur = ret[i];\n\n\t\t\t\tlet p = (cur.p + prev.p) / 2;\n\t\t\t\tlet color = colorRange(p);\n\t\t\t\tmaxDelta = Math.max(maxDelta, deltaE(color, prev.color), deltaE(color, cur.color));\n\t\t\t\tret.splice(i, 0, {p, color: colorRange(p)});\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\n\tret = ret.map(a => a.color);\n\n\treturn ret;\n}\n\n/**\n * Interpolate to color2 and return a function that takes a 0-1 percentage\n * @param {Color | string | Function} color1 The first color or an existing range\n * @param {Color | string} [color2] If color1 is a color, this is the second color\n * @param {Object} [options={}]\n * @returns {Function} A function that takes a 0-1 percentage and returns a color\n */\nfunction range (color1, color2, options = {}) {\n\tif (isRange(color1)) {\n\t\t// Tweaking existing range\n\t\tlet [r, options] = [color1, color2];\n\n\t\treturn range(...r.rangeArgs.colors, {...r.rangeArgs.options, ...options});\n\t}\n\n\tlet {space, outputSpace, progression, premultiplied} = options;\n\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\t// Make sure we're working on copies of these colors\n\tcolor1 = clone(color1);\n\tcolor2 = clone(color2);\n\n\tlet rangeArgs = {colors: [color1, color2], options};\n\n\tif (space) {\n\t\tspace = ColorSpace.get(space);\n\t}\n\telse {\n\t\tspace = ColorSpace.registry[defaults.interpolationSpace] || color1.space;\n\t}\n\n\toutputSpace = outputSpace ? ColorSpace.get(outputSpace) : space;\n\n\tcolor1 = to(color1, space);\n\tcolor2 = to(color2, space);\n\n\t// Gamut map to avoid areas of flat color\n\tcolor1 = toGamut(color1);\n\tcolor2 = toGamut(color2);\n\n\t// Handle hue interpolation\n\t// See https://github.com/w3c/csswg-drafts/issues/4735#issuecomment-635741840\n\tif (space.coords.h && space.coords.h.type === \"angle\") {\n\t\tlet arc = options.hue = options.hue || \"shorter\";\n\n\t\tlet hue = [space, \"h\"];\n\t\tlet [θ1, θ2] = [get(color1, hue), get(color2, hue)];\n\t\t// Undefined hues must be evaluated before hue fix-up to properly\n\t\t// calculate hue arcs between undefined and defined hues.\n\t\t// See https://github.com/w3c/csswg-drafts/issues/9436#issuecomment-1746957545\n\t\tif (isNaN(θ1) && !isNaN(θ2)) {\n\t\t\tθ1 = θ2;\n\t\t}\n\t\telse if (isNaN(θ2) && !isNaN(θ1)) {\n\t\t\tθ2 = θ1;\n\t\t}\n\t\t[θ1, θ2] = adjust(arc, [θ1, θ2]);\n\t\tset(color1, hue, θ1);\n\t\tset(color2, hue, θ2);\n\t}\n\n\tif (premultiplied) {\n\t\t// not coping with polar spaces yet\n\t\tcolor1.coords = color1.coords.map(c => c * color1.alpha);\n\t\tcolor2.coords = color2.coords.map(c => c * color2.alpha);\n\t}\n\n\treturn Object.assign(p => {\n\t\tp = progression ? progression(p) : p;\n\t\tlet coords = color1.coords.map((start, i) => {\n\t\t\tlet end = color2.coords[i];\n\t\t\treturn interpolate(start, end, p);\n\t\t});\n\n\t\tlet alpha = interpolate(color1.alpha, color2.alpha, p);\n\t\tlet ret = {space, coords, alpha};\n\n\t\tif (premultiplied) {\n\t\t\t// undo premultiplication\n\t\t\tret.coords = ret.coords.map(c => c / alpha);\n\t\t}\n\n\t\tif (outputSpace !== space) {\n\t\t\tret = to(ret, outputSpace);\n\t\t}\n\n\t\treturn ret;\n\t}, {\n\t\trangeArgs,\n\t});\n}\n\nfunction isRange (val) {\n\treturn type(val) === \"function\" && !!val.rangeArgs;\n}\n\ndefaults.interpolationSpace = \"lab\";\n\nfunction register (Color) {\n\tColor.defineFunction(\"mix\", mix, {returns: \"color\"});\n\tColor.defineFunction(\"range\", range, {returns: \"function<color>\"});\n\tColor.defineFunction(\"steps\", steps, {returns: \"array<color>\"});\n}\n\nvar interpolation = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tisRange: isRange,\n\tmix: mix,\n\trange: range,\n\tregister: register,\n\tsteps: steps\n});\n\nvar HSL = new ColorSpace({\n\tid: \"hsl\",\n\tname: \"HSL\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: sRGB,\n\n\t// Adapted from https://drafts.csswg.org/css-color-4/better-rgbToHsl.js\n\tfromBase: rgb => {\n\t\tlet max = Math.max(...rgb);\n\t\tlet min = Math.min(...rgb);\n\t\tlet [r, g, b] = rgb;\n\t\tlet [h, s, l] = [NaN, 0, (min + max) / 2];\n\t\tlet d = max - min;\n\n\t\tif (d !== 0) {\n\t\t\ts = (l === 0 || l === 1) ? 0 : (max - l) / Math.min(l, 1 - l);\n\n\t\t\tswitch (max) {\n\t\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break;\n\t\t\t\tcase g: h = (b - r) / d + 2; break;\n\t\t\t\tcase b: h = (r - g) / d + 4;\n\t\t\t}\n\n\t\t\th = h * 60;\n\t\t}\n\n\t\t// Very out of gamut colors can produce negative saturation\n\t\t// If so, just rotate the hue by 180 and use a positive saturation\n\t\t// see https://github.com/w3c/csswg-drafts/issues/9222\n\t\tif (s < 0) {\n\t\t\th += 180;\n\t\t\ts = Math.abs(s);\n\t\t}\n\n\t\tif (h >= 360) {\n\t\t\th -= 360;\n\t\t}\n\n\t\treturn [h, s * 100, l * 100];\n\t},\n\n\t// Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative\n\ttoBase: hsl => {\n\t\tlet [h, s, l] = hsl;\n\t\th = h % 360;\n\n\t\tif (h < 0) {\n\t\t\th += 360;\n\t\t}\n\n\t\ts /= 100;\n\t\tl /= 100;\n\n\t\tfunction f (n) {\n\t\t\tlet k = (n + h / 30) % 12;\n\t\t\tlet a = s * Math.min(l, 1 - l);\n\t\t\treturn l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n\t\t}\n\n\t\treturn [f(0), f(8), f(4)];\n\t},\n\n\tformats: {\n\t\t\"hsl\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage>\", \"<percentage>\"],\n\t\t},\n\t\t\"hsla\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage>\", \"<percentage>\"],\n\t\t\tcommas: true,\n\t\t\tlastAlpha: true,\n\t\t},\n\t},\n});\n\n// The Hue, Whiteness Blackness (HWB) colorspace\n// See https://drafts.csswg.org/css-color-4/#the-hwb-notation\n// Note that, like HSL, calculations are done directly on\n// gamma-corrected sRGB values rather than linearising them first.\n\nvar HSV = new ColorSpace({\n\tid: \"hsv\",\n\tname: \"HSV\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tv: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Value\",\n\t\t},\n\t},\n\n\tbase: HSL,\n\t// https://en.wikipedia.org/wiki/HSL_and_HSV#Interconversion\n\tfromBase (hsl) {\n\t\tlet [h, s, l] = hsl;\n\t\ts /= 100;\n\t\tl /= 100;\n\n\t\tlet v = l + s * Math.min(l, 1 - l);\n\n\t\treturn [\n\t\t\th, // h is the same\n\t\t\tv === 0 ? 0 : 200 * (1 - l / v), // s\n\t\t\t100 * v,\n\t\t];\n\t},\n\t// https://en.wikipedia.org/wiki/HSL_and_HSV#Interconversion\n\ttoBase (hsv) {\n\t\tlet [h, s, v] = hsv;\n\n\t\ts /= 100;\n\t\tv /= 100;\n\n\t\tlet l = v * (1 - s / 2);\n\n\t\treturn [\n\t\t\th, // h is the same\n\t\t\t(l === 0 || l === 1) ? 0 : ((v - l) / Math.min(l, 1 - l)) * 100,\n\t\t\tl * 100,\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hsv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n// The Hue, Whiteness Blackness (HWB) colorspace\n// See https://drafts.csswg.org/css-color-4/#the-hwb-notation\n// Note that, like HSL, calculations are done directly on\n// gamma-corrected sRGB values rather than linearising them first.\n\nvar hwb = new ColorSpace({\n\tid: \"hwb\",\n\tname: \"HWB\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\tw: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Whiteness\",\n\t\t},\n\t\tb: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Blackness\",\n\t\t},\n\t},\n\n\tbase: HSV,\n\tfromBase (hsv) {\n\t\tlet [h, s, v] = hsv;\n\n\t\treturn [h, v * (100 - s) / 100, 100 - v];\n\t},\n\ttoBase (hwb) {\n\t\tlet [h, w, b] = hwb;\n\n\t\t// Now convert percentages to [0..1]\n\t\tw /= 100;\n\t\tb /= 100;\n\n\t\t// Achromatic check (white plus black >= 1)\n\t\tlet sum = w + b;\n\t\tif (sum >= 1) {\n\t\t\tlet gray = w / sum;\n\t\t\treturn [h, 0, gray * 100];\n\t\t}\n\n\t\tlet v = (1 - b);\n\t\tlet s = (v === 0) ? 0 : 1 - w / v;\n\t\treturn [h, s * 100, v * 100];\n\t},\n\n\tformats: {\n\t\t\"hwb\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n// convert an array of linear-light a98-rgb values to CIE XYZ\n// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n// has greater numerical precision than section 4.3.5.3 of\n// https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf\n// but the values below were calculated from first principles\n// from the chromaticity coordinates of R G B W\nconst toXYZ_M$2 = [\n\t[ 0.5766690429101305, 0.1855582379065463, 0.1882286462349947 ],\n\t[ 0.29734497525053605, 0.6273635662554661, 0.07529145849399788 ],\n\t[ 0.02703136138641234, 0.07068885253582723, 0.9913375368376388 ],\n];\n\nconst fromXYZ_M$2 = [\n\t[ 2.0415879038107465, -0.5650069742788596, -0.34473135077832956 ],\n\t[ -0.9692436362808795, 1.8759675015077202, 0.04155505740717557 ],\n\t[ 0.013444280632031142, -0.11836239223101838, 1.0151749943912054 ],\n];\n\nvar A98Linear = new RGBColorSpace({\n\tid: \"a98rgb-linear\",\n\tcssId: \"--a98-rgb-linear\",\n\tname: \"Linear Adobe® 98 RGB compatible\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$2,\n\tfromXYZ_M: fromXYZ_M$2,\n});\n\nvar a98rgb = new RGBColorSpace({\n\tid: \"a98rgb\",\n\tcssId: \"a98-rgb\",\n\tname: \"Adobe® 98 RGB compatible\",\n\tbase: A98Linear,\n\ttoBase: RGB => RGB.map(val => Math.pow(Math.abs(val), 563 / 256) * Math.sign(val)),\n\tfromBase: RGB => RGB.map(val => Math.pow(Math.abs(val), 256 / 563) * Math.sign(val)),\n});\n\n// convert an array of prophoto-rgb values to CIE XYZ\n// using D50 (so no chromatic adaptation needed afterwards)\n// matrix cannot be expressed in rational form, but is calculated to 64 bit accuracy\n// see https://github.com/w3c/csswg-drafts/issues/7675\nconst toXYZ_M$1 = [\n\t[ 0.79776664490064230, 0.13518129740053308, 0.03134773412839220 ],\n\t[ 0.28807482881940130, 0.71183523424187300, 0.00008993693872564 ],\n\t[ 0.00000000000000000, 0.00000000000000000, 0.82510460251046020 ],\n];\n\nconst fromXYZ_M$1 = [\n\t[ 1.34578688164715830, -0.25557208737979464, -0.05110186497554526 ],\n\t[ -0.54463070512490190, 1.50824774284514680, 0.02052744743642139 ],\n\t[ 0.00000000000000000, 0.00000000000000000, 1.21196754563894520 ],\n];\n\nvar ProPhotoLinear = new RGBColorSpace({\n\tid: \"prophoto-linear\",\n\tcssId: \"--prophoto-rgb-linear\",\n\tname: \"Linear ProPhoto\",\n\twhite: \"D50\",\n\tbase: XYZ_D50,\n\ttoXYZ_M: toXYZ_M$1,\n\tfromXYZ_M: fromXYZ_M$1,\n});\n\nconst Et = 1 / 512;\nconst Et2 = 16 / 512;\n\nvar prophoto = new RGBColorSpace({\n\tid: \"prophoto\",\n\tcssId: \"prophoto-rgb\",\n\tname: \"ProPhoto\",\n\tbase: ProPhotoLinear,\n\ttoBase (RGB) {\n\t\t// Transfer curve is gamma 1.8 with a small linear portion\n\t\treturn RGB.map(v => v < Et2 ? v / 16 : v ** 1.8);\n\t},\n\tfromBase (RGB) {\n\t\treturn RGB.map(v => v >= Et ? v ** (1 / 1.8) : 16 * v);\n\t},\n});\n\nvar oklch = new ColorSpace({\n\tid: \"oklch\",\n\tname: \"Oklch\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 0.4],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\twhite: \"D65\",\n\n\tbase: OKLab,\n\tfromBase (oklab) {\n\t\t// Convert to polar form\n\t\tlet [L, a, b] = oklab;\n\t\tlet h;\n\t\tconst ε = 0.0002; // chromatic components much smaller than a,b\n\n\t\tif (Math.abs(a) < ε && Math.abs(b) < ε) {\n\t\t\th = NaN;\n\t\t}\n\t\telse {\n\t\t\th = Math.atan2(b, a) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // OKLab L is still L\n\t\t\tMath.sqrt(a ** 2 + b ** 2), // Chroma\n\t\t\tconstrain(h), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\t// Convert from polar form\n\ttoBase (oklch) {\n\t\tlet [L, C, h] = oklch;\n\t\tlet a, b;\n\n\t\t// check for NaN hue\n\t\tif (isNaN(h)) {\n\t\t\ta = 0;\n\t\t\tb = 0;\n\t\t}\n\t\telse {\n\t\t\ta = C * Math.cos(h * Math.PI / 180);\n\t\t\tb = C * Math.sin(h * Math.PI / 180);\n\t\t}\n\n\t\treturn [ L, a, b ];\n\t},\n\n\tformats: {\n\t\t\"oklch\": {\n\t\t\tcoords: [\"<percentage> | <number>\", \"<number> | <percentage>[0,1]\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\nlet white = WHITES.D65;\n\nconst ε$2 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ$1 = 24389 / 27; // 29^3/3^3\nconst [U_PRIME_WHITE, V_PRIME_WHITE] = uv({space: xyz_d65, coords: white});\n\nvar Luv = new ColorSpace({\n\tid: \"luv\",\n\tname: \"Luv\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\t// Reference ranges from https://facelessuser.github.io/coloraide/colors/luv/\n\t\tu: {\n\t\t\trefRange: [-215, 215],\n\t\t},\n\t\tv: {\n\t\t\trefRange: [-215, 215],\n\t\t},\n\t},\n\n\twhite: white,\n\tbase: xyz_d65,\n\n\t// Convert D65-adapted XYZ to Luv\n\t// https://en.wikipedia.org/wiki/CIELUV#The_forward_transformation\n\tfromBase (XYZ) {\n\t\tlet xyz = [skipNone(XYZ[0]), skipNone(XYZ[1]), skipNone(XYZ[2])];\n\t\tlet y = xyz[1];\n\n\t\tlet [up, vp] = uv({space: xyz_d65, coords: xyz});\n\n\t\t// Protect against XYZ of [0, 0, 0]\n\t\tif (!Number.isFinite(up) || !Number.isFinite(vp)) {\n\t\t\treturn [0, 0, 0];\n\t\t}\n\n\t\tlet L = y <= ε$2 ? κ$1 * y : 116 * Math.cbrt(y) - 16;\n\t\treturn [\n\t\t\tL,\n\t\t\t13 * L * (up - U_PRIME_WHITE),\n\t\t\t13 * L * (vp - V_PRIME_WHITE),\n\t\t ];\n\t},\n\n\t// Convert Luv to D65-adapted XYZ\n\t// https://en.wikipedia.org/wiki/CIELUV#The_reverse_transformation\n\ttoBase (Luv) {\n\t\tlet [L, u, v] = Luv;\n\n\t\t// Protect against division by zero and NaN Lightness\n\t\tif (L === 0 || isNone(L)) {\n\t\t\treturn [0, 0, 0];\n\t\t}\n\n\t\tu = skipNone(u);\n\t\tv = skipNone(v);\n\n\t\tlet up = (u / (13 * L)) + U_PRIME_WHITE;\n\t\tlet vp = (v / (13 * L)) + V_PRIME_WHITE;\n\n\t\tlet y = L <= 8 ? L / κ$1 : Math.pow((L + 16) / 116, 3);\n\n\t\treturn [\n\t\t\ty * ((9 * up) / (4 * vp)),\n\t\t\ty,\n\t\t\ty * ((12 - 3 * up - 20 * vp) / (4 * vp)),\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--luv\",\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nvar LCHuv = new ColorSpace({\n\tid: \"lchuv\",\n\tname: \"LChuv\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 220],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: Luv,\n\tfromBase (Luv) {\n\t\t// Convert to polar form\n\t\tlet [L, u, v] = Luv;\n\t\tlet hue;\n\t\tconst ε = 0.02;\n\n\t\tif (Math.abs(u) < ε && Math.abs(v) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(v, u) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // L is still L\n\t\t\tMath.sqrt(u ** 2 + v ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (LCH) {\n\t\t// Convert from polar form\n\t\tlet [Lightness, Chroma, Hue] = LCH;\n\t\t// Clamp any negative Chroma\n\t\tif (Chroma < 0) {\n\t\t\tChroma = 0;\n\t\t}\n\t\t// Deal with NaN Hue\n\t\tif (isNaN(Hue)) {\n\t\t\tHue = 0;\n\t\t}\n\t\treturn [\n\t\t\tLightness, // L is still L\n\t\t\tChroma * Math.cos(Hue * Math.PI / 180), // u\n\t\t\tChroma * Math.sin(Hue * Math.PI / 180), // v\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--lchuv\",\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\n/*\nAdapted from: https://github.com/hsluv/hsluv-javascript/blob/14b49e6cf9a9137916096b8487a5372626b57ba4/src/hsluv.ts\n\nCopyright (c) 2012-2022 Alexei Boronine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\nconst ε$1 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ = 24389 / 27; // 29^3/3^3\n\nconst m_r0 = fromXYZ_M$3[0][0];\nconst m_r1 = fromXYZ_M$3[0][1];\nconst m_r2 = fromXYZ_M$3[0][2];\nconst m_g0 = fromXYZ_M$3[1][0];\nconst m_g1 = fromXYZ_M$3[1][1];\nconst m_g2 = fromXYZ_M$3[1][2];\nconst m_b0 = fromXYZ_M$3[2][0];\nconst m_b1 = fromXYZ_M$3[2][1];\nconst m_b2 = fromXYZ_M$3[2][2];\n\nfunction distanceFromOriginAngle (slope, intercept, angle) {\n\tconst d = intercept / (Math.sin(angle) - slope * Math.cos(angle));\n\treturn d < 0 ? Infinity : d;\n}\n\nfunction calculateBoundingLines (l) {\n\tconst sub1 = Math.pow(l + 16, 3) / 1560896;\n\tconst sub2 = sub1 > ε$1 ? sub1 : l / κ;\n\tconst s1r = sub2 * (284517 * m_r0 - 94839 * m_r2);\n\tconst s2r = sub2 * (838422 * m_r2 + 769860 * m_r1 + 731718 * m_r0);\n\tconst s3r = sub2 * (632260 * m_r2 - 126452 * m_r1);\n\tconst s1g = sub2 * (284517 * m_g0 - 94839 * m_g2);\n\tconst s2g = sub2 * (838422 * m_g2 + 769860 * m_g1 + 731718 * m_g0);\n\tconst s3g = sub2 * (632260 * m_g2 - 126452 * m_g1);\n\tconst s1b = sub2 * (284517 * m_b0 - 94839 * m_b2);\n\tconst s2b = sub2 * (838422 * m_b2 + 769860 * m_b1 + 731718 * m_b0);\n\tconst s3b = sub2 * (632260 * m_b2 - 126452 * m_b1);\n\n\treturn {\n\t\tr0s: s1r / s3r,\n\t\tr0i: s2r * l / s3r,\n\t\tr1s: s1r / (s3r + 126452),\n\t\tr1i: (s2r - 769860) * l / (s3r + 126452),\n\t\tg0s: s1g / s3g,\n\t\tg0i: s2g * l / s3g,\n\t\tg1s: s1g / (s3g + 126452),\n\t\tg1i: (s2g - 769860) * l / (s3g + 126452),\n\t\tb0s: s1b / s3b,\n\t\tb0i: s2b * l / s3b,\n\t\tb1s: s1b / (s3b + 126452),\n\t\tb1i: (s2b - 769860) * l / (s3b + 126452),\n\t};\n}\n\nfunction calcMaxChromaHsluv (lines, h) {\n\tconst hueRad = h / 360 * Math.PI * 2;\n\tconst r0 = distanceFromOriginAngle(lines.r0s, lines.r0i, hueRad);\n\tconst r1 = distanceFromOriginAngle(lines.r1s, lines.r1i, hueRad);\n\tconst g0 = distanceFromOriginAngle(lines.g0s, lines.g0i, hueRad);\n\tconst g1 = distanceFromOriginAngle(lines.g1s, lines.g1i, hueRad);\n\tconst b0 = distanceFromOriginAngle(lines.b0s, lines.b0i, hueRad);\n\tconst b1 = distanceFromOriginAngle(lines.b1s, lines.b1i, hueRad);\n\n\treturn Math.min(r0, r1, g0, g1, b0, b1);\n}\n\nvar hsluv = new ColorSpace({\n\tid: \"hsluv\",\n\tname: \"HSLuv\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: LCHuv,\n\tgamutSpace: sRGB,\n\n\t// Convert LCHuv to HSLuv\n\tfromBase (lch) {\n\t\tlet [l, c, h] = [skipNone(lch[0]), skipNone(lch[1]), skipNone(lch[2])];\n\t\tlet s;\n\n\t\tif (l > 99.9999999) {\n\t\t\ts = 0;\n\t\t\tl = 100;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\ts = 0;\n\t\t\tl = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHsluv(lines, h);\n\t\t\ts = c / max * 100;\n\t\t}\n\n\t\treturn [h, s, l];\n\t},\n\n\t// Convert HSLuv to LCHuv\n\ttoBase (hsl) {\n\t\tlet [h, s, l] = [skipNone(hsl[0]), skipNone(hsl[1]), skipNone(hsl[2])];\n\t\tlet c;\n\n\t\tif (l > 99.9999999) {\n\t\t\tl = 100;\n\t\t\tc = 0;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\tl = 0;\n\t\t\tc = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHsluv(lines, h);\n\t\t\tc = max / 100 * s;\n\t\t}\n\n\t\treturn [l, c, h];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hsluv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n/*\nAdapted from: https://github.com/hsluv/hsluv-javascript/blob/14b49e6cf9a9137916096b8487a5372626b57ba4/src/hsluv.ts\n\nCopyright (c) 2012-2022 Alexei Boronine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\nfromXYZ_M$3[0][0];\nfromXYZ_M$3[0][1];\nfromXYZ_M$3[0][2];\nfromXYZ_M$3[1][0];\nfromXYZ_M$3[1][1];\nfromXYZ_M$3[1][2];\nfromXYZ_M$3[2][0];\nfromXYZ_M$3[2][1];\nfromXYZ_M$3[2][2];\n\nfunction distanceFromOrigin (slope, intercept) {\n\treturn Math.abs(intercept) / Math.sqrt(Math.pow(slope, 2) + 1);\n}\n\nfunction calcMaxChromaHpluv (lines) {\n\tlet r0 = distanceFromOrigin(lines.r0s, lines.r0i);\n\tlet r1 = distanceFromOrigin(lines.r1s, lines.r1i);\n\tlet g0 = distanceFromOrigin(lines.g0s, lines.g0i);\n\tlet g1 = distanceFromOrigin(lines.g1s, lines.g1i);\n\tlet b0 = distanceFromOrigin(lines.b0s, lines.b0i);\n\tlet b1 = distanceFromOrigin(lines.b1s, lines.b1i);\n\n\treturn Math.min(r0, r1, g0, g1, b0, b1);\n}\n\nvar hpluv = new ColorSpace({\n\tid: \"hpluv\",\n\tname: \"HPLuv\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: LCHuv,\n\tgamutSpace: \"self\",\n\n\t// Convert LCHuv to HPLuv\n\tfromBase (lch) {\n\t\tlet [l, c, h] = [skipNone(lch[0]), skipNone(lch[1]), skipNone(lch[2])];\n\t\tlet s;\n\n\t\tif (l > 99.9999999) {\n\t\t\ts = 0;\n\t\t\tl = 100;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\ts = 0;\n\t\t\tl = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHpluv(lines);\n\t\t\ts = c / max * 100;\n\t\t}\n\t\treturn [h, s, l];\n\t},\n\n\t// Convert HPLuv to LCHuv\n\ttoBase (hsl) {\n\t\tlet [h, s, l] = [skipNone(hsl[0]), skipNone(hsl[1]), skipNone(hsl[2])];\n\t\tlet c;\n\n\t\tif (l > 99.9999999) {\n\t\t\tl = 100;\n\t\t\tc = 0;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\tl = 0;\n\t\t\tc = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHpluv(lines);\n\t\t\tc = max / 100 * s;\n\t\t}\n\n\t\treturn [l, c, h];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hpluv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\nconst Yw = 203;\t// absolute luminance of media white, cd/m²\nconst n = 2610 / (2 ** 14);\nconst ninv = (2 ** 14) / 2610;\nconst m = 2523 / (2 ** 5);\nconst minv = (2 ** 5) / 2523;\nconst c1 = 3424 / (2 ** 12);\nconst c2 = 2413 / (2 ** 7);\nconst c3 = 2392 / (2 ** 7);\n\nvar rec2100Pq = new RGBColorSpace({\n\tid: \"rec2100pq\",\n\tcssId: \"rec2100-pq\",\n\tname: \"REC.2100-PQ\",\n\tbase: REC2020Linear,\n\ttoBase (RGB) {\n\t\t// given PQ encoded component in range [0, 1]\n\t\t// return media-white relative linear-light\n\t\treturn RGB.map(function (val) {\n\t\t\tlet x = ((Math.max(((val ** minv) - c1), 0) / (c2 - (c3 * (val ** minv)))) ** ninv);\n\t\t\treturn (x * 10000 / Yw); \t// luminance relative to diffuse white, [0, 70 or so].\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\t// given media-white relative linear-light\n\t\t// returnPQ encoded component in range [0, 1]\n\t\treturn RGB.map(function (val) {\n\t\t\tlet x = Math.max(val * Yw / 10000, 0); \t// absolute luminance of peak white is 10,000 cd/m².\n\t\t\tlet num = (c1 + (c2 * (x ** n)));\n\t\t\tlet denom = (1 + (c3 * (x ** n)));\n\n\t\t\treturn ((num / denom) ** m);\n\t\t});\n\t},\n});\n\n// FIXME see https://github.com/LeaVerou/color.js/issues/190\n\nconst a = 0.17883277;\nconst b = 0.28466892; // 1 - (4 * a)\nconst c = 0.55991073; // 0.5 - a * Math.log(4 *a)\n\nconst scale = 3.7743;\t// Place 18% grey at HLG 0.38, so media white at 0.75\n\nvar rec2100Hlg = new RGBColorSpace({\n\tid: \"rec2100hlg\",\n\tcssId: \"rec2100-hlg\",\n\tname: \"REC.2100-HLG\",\n\treferred: \"scene\",\n\n\tbase: REC2020Linear,\n\ttoBase (RGB) {\n\t\t// given HLG encoded component in range [0, 1]\n\t\t// return media-white relative linear-light\n\t\treturn RGB.map(function (val) {\n\t\t\t// first the HLG EOTF\n\t\t\t// ITU-R BT.2390-10 p.30 section\n\t\t\t// 6.3 The hybrid log-gamma electro-optical transfer function (EOTF)\n\t\t\t// Then scale by 3 so media white is 1.0\n\t\t\tif (val <= 0.5) {\n\t\t\t\treturn (val ** 2) / 3 * scale;\n\t\t\t}\n\t\t\treturn ((Math.exp((val - c) / a) + b) / 12) * scale;\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\t// given media-white relative linear-light\n\t\t// where diffuse white is 1.0,\n\t\t// return HLG encoded component in range [0, 1]\n\t\treturn RGB.map(function (val) {\n\t\t\t// first scale to put linear-light media white at 1/3\n\t\t\tval /= scale;\n\t\t\t// now the HLG OETF\n\t\t\t// ITU-R BT.2390-10 p.23\n\t\t\t// 6.1 The hybrid log-gamma opto-electronic transfer function (OETF)\n\t\t\tif (val <= 1 / 12) {\n\t\t\t\treturn Math.sqrt(3 * val);\n\t\t\t}\n\t\t\treturn a * Math.log(12 * val - b) + c;\n\t\t});\n\t},\n});\n\nconst CATs = {};\n\nhooks.add(\"chromatic-adaptation-start\", env => {\n\tif (env.options.method) {\n\t\tenv.M = adapt(env.W1, env.W2, env.options.method);\n\t}\n});\n\nhooks.add(\"chromatic-adaptation-end\", env => {\n\tif (!env.M) {\n\t\tenv.M = adapt(env.W1, env.W2, env.options.method);\n\t}\n});\n\nfunction defineCAT ({id, toCone_M, fromCone_M}) {\n\t// Use id, toCone_M, fromCone_M like variables\n\tCATs[id] = arguments[0];\n}\n\nfunction adapt (W1, W2, id = \"Bradford\") {\n\t// adapt from a source whitepoint or illuminant W1\n\t// to a destination whitepoint or illuminant W2,\n\t// using the given chromatic adaptation transform (CAT)\n\t// debugger;\n\tlet method = CATs[id];\n\n\tlet [ρs, γs, βs] = multiplyMatrices(method.toCone_M, W1);\n\tlet [ρd, γd, βd] = multiplyMatrices(method.toCone_M, W2);\n\n\t// all practical illuminants have non-zero XYZ so no division by zero can occur below\n\tlet scale = [\n\t\t[ρd / ρs, 0, 0 ],\n\t\t[0, γd / γs, 0 ],\n\t\t[0, 0, βd / βs],\n\t];\n\t// console.log({scale});\n\n\tlet scaled_cone_M = multiplyMatrices(scale, method.toCone_M);\n\tlet adapt_M\t= multiplyMatrices(method.fromCone_M, scaled_cone_M);\n\t// console.log({scaled_cone_M, adapt_M});\n\treturn adapt_M;\n}\n\ndefineCAT({\n\tid: \"von Kries\",\n\ttoCone_M: [\n\t\t[ 0.4002400, 0.7076000, -0.0808100 ],\n\t\t[ -0.2263000, 1.1653200, 0.0457000 ],\n\t\t[ 0.0000000, 0.0000000, 0.9182200 ],\n\t],\n\tfromCone_M: [\n\t\t[ 1.8599363874558397, -1.1293816185800916, 0.21989740959619328 ],\n\t\t[ 0.3611914362417676, 0.6388124632850422, -0.000006370596838649899 ],\n\t\t[ 0, 0, 1.0890636230968613 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"Bradford\",\n\t// Convert an array of XYZ values in the range 0.0 - 1.0\n\t// to cone fundamentals\n\ttoCone_M: [\n\t\t[ 0.8951000, 0.2664000, -0.1614000 ],\n\t\t[ -0.7502000, 1.7135000, 0.0367000 ],\n\t\t[ 0.0389000, -0.0685000, 1.0296000 ],\n\t],\n\t// and back\n\tfromCone_M: [\n\t\t[ 0.9869929054667121, -0.14705425642099013, 0.15996265166373122 ],\n\t\t[ 0.4323052697233945, 0.5183602715367774, 0.049291228212855594 ],\n\t\t[ -0.00852866457517732, 0.04004282165408486, 0.96848669578755 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"CAT02\",\n\t// with complete chromatic adaptation to W2, so D = 1.0\n\ttoCone_M: [\n\t\t[ 0.7328000, 0.4296000, -0.1624000 ],\n\t\t[ -0.7036000, 1.6975000, 0.0061000 ],\n\t\t[ 0.0030000, 0.0136000, 0.9834000 ],\n\t],\n\tfromCone_M: [\n\t\t[ 1.0961238208355142, -0.27886900021828726, 0.18274517938277307 ],\n\t\t[ 0.4543690419753592, 0.4735331543074117, 0.07209780371722911 ],\n\t\t[ -0.009627608738429355, -0.00569803121611342, 1.0153256399545427 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"CAT16\",\n\ttoCone_M: [\n\t\t[ 0.401288, 0.650173, -0.051461 ],\n\t\t[ -0.250268, 1.204414, 0.045854 ],\n\t\t[ -0.002079, 0.048952, 0.953127 ],\n\t],\n\t// the extra precision is needed to avoid roundtripping errors\n\tfromCone_M: [\n\t\t[ 1.862067855087233, -1.0112546305316845, 0.14918677544445172 ],\n\t\t[ 0.3875265432361372, 0.6214474419314753, -0.008973985167612521 ],\n\t\t[ -0.01584149884933386, -0.03412293802851557, 1.0499644368778496 ],\n\t],\n});\n\nObject.assign(WHITES, {\n\t// whitepoint values from ASTM E308-01 with 10nm spacing, 1931 2 degree observer\n\t// all normalized to Y (luminance) = 1.00000\n\t// Illuminant A is a tungsten electric light, giving a very warm, orange light.\n\tA: [1.09850, 1.00000, 0.35585],\n\n\t// Illuminant C was an early approximation to daylight: illuminant A with a blue filter.\n\tC: [0.98074, 1.000000, 1.18232],\n\n\t// The daylight series of illuminants simulate natural daylight.\n\t// The color temperature (in degrees Kelvin/100) ranges from\n\t// cool, overcast daylight (D50) to bright, direct sunlight (D65).\n\tD55: [0.95682, 1.00000, 0.92149],\n\tD75: [0.94972, 1.00000, 1.22638],\n\n\t// Equal-energy illuminant, used in two-stage CAT16\n\tE: [1.00000, 1.00000, 1.00000],\n\n\t// The F series of illuminants represent fluorescent lights\n\tF2: [0.99186, 1.00000, 0.67393],\n\tF7: [0.95041, 1.00000, 1.08747],\n\tF11: [1.00962, 1.00000, 0.64350],\n});\n\n// The ACES whitepoint\n// see TB-2018-001 Derivation of the ACES White Point CIE Chromaticity Coordinates\n// also https://github.com/ampas/aces-dev/blob/master/documents/python/TB-2018-001/aces_wp.py\n// Similar to D60\nWHITES.ACES = [0.32168 / 0.33767, 1.00000, (1.00000 - 0.32168 - 0.33767) / 0.33767];\n\n// convert an array of linear-light ACEScc values to CIE XYZ\nconst toXYZ_M = [\n\t[ 0.6624541811085053, 0.13400420645643313, 0.1561876870049078 ],\n\t[ 0.27222871678091454, 0.6740817658111484, 0.05368951740793705 ],\n\t[ -0.005574649490394108, 0.004060733528982826, 1.0103391003129971 ],\n];\nconst fromXYZ_M = [\n\t[ 1.6410233796943257, -0.32480329418479, -0.23642469523761225 ],\n\t[ -0.6636628587229829, 1.6153315916573379, 0.016756347685530137 ],\n\t[ 0.011721894328375376, -0.008284441996237409, 0.9883948585390215 ],\n];\n\nvar ACEScg = new RGBColorSpace({\n\tid: \"acescg\",\n\tcssId: \"--acescg\",\n\tname: \"ACEScg\",\n\n\t// ACEScg – A scene-referred, linear-light encoding of ACES Data\n\t// https://docs.acescentral.com/specifications/acescg/\n\t// uses the AP1 primaries, see section 4.3.1 Color primaries\n\tcoords: {\n\t\tr: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Red\",\n\t\t},\n\t\tg: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Green\",\n\t\t},\n\t\tb: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Blue\",\n\t\t},\n\t},\n\n\treferred: \"scene\",\n\n\twhite: WHITES.ACES,\n\n\ttoXYZ_M,\n\tfromXYZ_M,\n});\n\n// export default Color;\n\nconst ε = 2 ** -16;\n\n// the smallest value which, in the 32bit IEEE 754 float encoding,\n// decodes as a non-negative value\nconst ACES_min_nonzero = -0.35828683;\n\n// brightest encoded value, decodes to 65504\nconst ACES_cc_max = (Math.log2(65504) + 9.72) / 17.52; // 1.468\n\nvar acescc = new RGBColorSpace({\n\tid: \"acescc\",\n\tcssId: \"--acescc\",\n\tname: \"ACEScc\",\n\t// see S-2014-003 ACEScc – A Logarithmic Encoding of ACES Data\n\t// https://docs.acescentral.com/specifications/acescc/\n\t// uses the AP1 primaries, see section 4.3.1 Color primaries\n\n\t// Appendix A: \"Very small ACES scene referred values below 7 1/4 stops\n\t// below 18% middle gray are encoded as negative ACEScc values.\n\t// These values should be preserved per the encoding in Section 4.4\n\t// so that all positive ACES values are maintained.\"\n\tcoords: {\n\t\tr: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Red\",\n\t\t},\n\t\tg: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Green\",\n\t\t},\n\t\tb: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Blue\",\n\t\t},\n\t},\n\treferred: \"scene\",\n\n\tbase: ACEScg,\n\t// from section 4.4.2 Decoding Function\n\ttoBase (RGB) {\n\t\tconst low = (9.72 - 15) / 17.52; // -0.3014\n\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val <= low) {\n\t\t\t\treturn (2 ** ((val * 17.52) - 9.72) - ε) * 2; // very low values, below -0.3014\n\t\t\t}\n\t\t\telse if (val < ACES_cc_max) {\n\t\t\t\treturn 2 ** ((val * 17.52) - 9.72);\n\t\t\t}\n\t\t\telse { // val >= ACES_cc_max\n\t\t\t\treturn 65504;\n\t\t\t}\n\t\t});\n\t},\n\n\t// Non-linear encoding function from S-2014-003, section 4.4.1 Encoding Function\n\tfromBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val <= 0) {\n\t\t\t\treturn (Math.log2(ε) + 9.72) / 17.52; // -0.3584\n\t\t\t}\n\t\t\telse if (val < ε) {\n\t\t\t\treturn (Math.log2(ε + val * 0.5) + 9.72) / 17.52;\n\t\t\t}\n\t\t\telse { // val >= ε\n\t\t\t\treturn (Math.log2(val) + 9.72) / 17.52;\n\t\t\t}\n\t\t});\n\t},\n\t// encoded media white (rgb 1,1,1) => linear [ 222.861, 222.861, 222.861 ]\n\t// encoded media black (rgb 0,0,0) => linear [ 0.0011857, 0.0011857, 0.0011857]\n});\n\nvar spaces = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tA98RGB: a98rgb,\n\tA98RGB_Linear: A98Linear,\n\tACEScc: acescc,\n\tACEScg: ACEScg,\n\tCAM16_JMh: cam16,\n\tHCT: hct,\n\tHPLuv: hpluv,\n\tHSL: HSL,\n\tHSLuv: hsluv,\n\tHSV: HSV,\n\tHWB: hwb,\n\tICTCP: ictcp,\n\tJzCzHz: jzczhz,\n\tJzazbz: Jzazbz,\n\tLCH: lch,\n\tLCHuv: LCHuv,\n\tLab: lab,\n\tLab_D65: lab_d65,\n\tLuv: Luv,\n\tOKLCH: oklch,\n\tOKLab: OKLab,\n\tP3: P3,\n\tP3_Linear: P3Linear,\n\tProPhoto: prophoto,\n\tProPhoto_Linear: ProPhotoLinear,\n\tREC_2020: REC2020,\n\tREC_2020_Linear: REC2020Linear,\n\tREC_2100_HLG: rec2100Hlg,\n\tREC_2100_PQ: rec2100Pq,\n\tXYZ_ABS_D65: XYZ_Abs_D65,\n\tXYZ_D50: XYZ_D50,\n\tXYZ_D65: xyz_d65,\n\tsRGB: sRGB,\n\tsRGB_Linear: sRGBLinear\n});\n\n/**\n * Class that represents a color\n */\nclass Color {\n\t/**\n\t * Creates an instance of Color.\n\t * Signatures:\n\t * - `new Color(stringToParse)`\n\t * - `new Color(otherColor)`\n\t * - `new Color({space, coords, alpha})`\n\t * - `new Color(space, coords, alpha)`\n\t * - `new Color(spaceId, coords, alpha)`\n\t */\n\tconstructor (...args) {\n\t\tlet color;\n\n\t\tif (args.length === 1) {\n\t\t\tcolor = getColor(args[0]);\n\t\t}\n\n\t\tlet space, coords, alpha;\n\n\t\tif (color) {\n\t\t\tspace = color.space || color.spaceId;\n\t\t\tcoords = color.coords;\n\t\t\talpha = color.alpha;\n\t\t}\n\t\telse {\n\t\t\t// default signature new Color(ColorSpace, array [, alpha])\n\t\t\t[space, coords, alpha] = args;\n\t\t}\n\n\t\tObject.defineProperty(this, \"space\", {\n\t\t\tvalue: ColorSpace.get(space),\n\t\t\twritable: false,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true, // see note in https://262.ecma-international.org/8.0/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver\n\t\t});\n\n\t\tthis.coords = coords ? coords.slice() : [0, 0, 0];\n\n\t\t// Clamp alpha to [0, 1]\n\t\tthis.alpha = alpha > 1 || alpha === undefined ? 1 : (alpha < 0 ? 0 : alpha);\n\n\t\t// Convert \"NaN\" to NaN\n\t\tfor (let i = 0; i < this.coords.length; i++) {\n\t\t\tif (this.coords[i] === \"NaN\") {\n\t\t\t\tthis.coords[i] = NaN;\n\t\t\t}\n\t\t}\n\n\t\t// Define getters and setters for each coordinate\n\t\tfor (let id in this.space.coords) {\n\t\t\tObject.defineProperty(this, id, {\n\t\t\t\tget: () => this.get(id),\n\t\t\t\tset: value => this.set(id, value),\n\t\t\t});\n\t\t}\n\t}\n\n\tget spaceId () {\n\t\treturn this.space.id;\n\t}\n\n\tclone () {\n\t\treturn new Color(this.space, this.coords, this.alpha);\n\t}\n\n\ttoJSON () {\n\t\treturn {\n\t\t\tspaceId: this.spaceId,\n\t\t\tcoords: this.coords,\n\t\t\talpha: this.alpha,\n\t\t};\n\t}\n\n\tdisplay (...args) {\n\t\tlet ret = display(this, ...args);\n\n\t\t// Convert color object to Color instance\n\t\tret.color = new Color(ret.color);\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Get a color from the argument passed\n\t * Basically gets us the same result as new Color(color) but doesn't clone an existing color object\n\t */\n\tstatic get (color, ...args) {\n\t\tif (color instanceof Color) {\n\t\t\treturn color;\n\t\t}\n\n\t\treturn new Color(color, ...args);\n\t}\n\n\tstatic defineFunction (name, code, o = code) {\n\t\tlet {instance = true, returns} = o;\n\n\t\tlet func = function (...args) {\n\t\t\tlet ret = code(...args);\n\n\t\t\tif (returns === \"color\") {\n\t\t\t\tret = Color.get(ret);\n\t\t\t}\n\t\t\telse if (returns === \"function<color>\") {\n\t\t\t\tlet f = ret;\n\t\t\t\tret = function (...args) {\n\t\t\t\t\tlet ret = f(...args);\n\t\t\t\t\treturn Color.get(ret);\n\t\t\t\t};\n\t\t\t\t// Copy any function metadata\n\t\t\t\tObject.assign(ret, f);\n\t\t\t}\n\t\t\telse if (returns === \"array<color>\") {\n\t\t\t\tret = ret.map(c => Color.get(c));\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t};\n\n\t\tif (!(name in Color)) {\n\t\t\tColor[name] = func;\n\t\t}\n\n\t\tif (instance) {\n\t\t\tColor.prototype[name] = function (...args) {\n\t\t\t\treturn func(this, ...args);\n\t\t\t};\n\t\t}\n\t}\n\n\tstatic defineFunctions (o) {\n\t\tfor (let name in o) {\n\t\t\tColor.defineFunction(name, o[name], o[name]);\n\t\t}\n\t}\n\n\tstatic extend (exports) {\n\t\tif (exports.register) {\n\t\t\texports.register(Color);\n\t\t}\n\t\telse {\n\t\t\t// No register method, just add the module's functions\n\t\t\tfor (let name in exports) {\n\t\t\t\tColor.defineFunction(name, exports[name]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nColor.defineFunctions({\n\tget,\n\tgetAll,\n\tset,\n\tsetAll,\n\tto,\n\tequals,\n\tinGamut,\n\ttoGamut,\n\tdistance,\n\ttoString: serialize,\n});\n\nObject.assign(Color, {\n\tutil,\n\thooks,\n\tWHITES,\n\tSpace: ColorSpace,\n\tspaces: ColorSpace.registry,\n\tparse,\n\n\t// Global defaults one may want to configure\n\tdefaults,\n});\n\nfor (let key of Object.keys(spaces)) {\n\tColorSpace.register(spaces[key]);\n}\n\n/**\n * This plugin defines getters and setters for color[spaceId]\n * e.g. color.lch on *any* color gives us the lch coords\n */\n\n// Add space accessors to existing color spaces\nfor (let id in ColorSpace.registry) {\n\taddSpaceAccessors(id, ColorSpace.registry[id]);\n}\n\n// Add space accessors to color spaces not yet created\nhooks.add(\"colorspace-init-end\", space => {\n\taddSpaceAccessors(space.id, space);\n\tspace.aliases?.forEach(alias => {\n\t\taddSpaceAccessors(alias, space);\n\t});\n});\n\nfunction addSpaceAccessors (id, space) {\n\tlet propId = id.replace(/-/g, \"_\");\n\n\tObject.defineProperty(Color.prototype, propId, {\n\t\t// Convert coords to coords in another colorspace and return them\n\t\t// Source colorspace: this.spaceId\n\t\t// Target colorspace: id\n\t\tget () {\n\t\t\tlet ret = this.getAll(id);\n\n\t\t\tif (typeof Proxy === \"undefined\") {\n\t\t\t\t// If proxies are not supported, just return a static array\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Enable color.spaceId.coordName syntax\n\t\t\treturn new Proxy(ret, {\n\t\t\t\thas: (obj, property) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tColorSpace.resolveCoord([space, property]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {}\n\n\t\t\t\t\treturn Reflect.has(obj, property);\n\t\t\t\t},\n\t\t\t\tget: (obj, property, receiver) => {\n\t\t\t\t\tif (property && typeof property !== \"symbol\" && !(property in obj)) {\n\t\t\t\t\t\tlet {index} = ColorSpace.resolveCoord([space, property]);\n\n\t\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\t\treturn obj[index];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Reflect.get(obj, property, receiver);\n\t\t\t\t},\n\t\t\t\tset: (obj, property, value, receiver) => {\n\t\t\t\t\tif (property && typeof property !== \"symbol\" && !(property in obj) || property >= 0) {\n\t\t\t\t\t\tlet {index} = ColorSpace.resolveCoord([space, property]);\n\n\t\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\t\tobj[index] = value;\n\n\t\t\t\t\t\t\t// Update color.coords\n\t\t\t\t\t\t\tthis.setAll(id, obj);\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Reflect.set(obj, property, value, receiver);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t// Convert coords in another colorspace to internal coords and set them\n\t\t// Target colorspace: this.spaceId\n\t\t// Source colorspace: id\n\t\tset (coords) {\n\t\t\tthis.setAll(id, coords);\n\t\t},\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t});\n}\n\n// Import all modules of Color.js\n\nColor.extend(deltaEMethods);\nColor.extend({deltaE});\nObject.assign(Color, {deltaEMethods});\nColor.extend(variations);\nColor.extend({contrast});\nColor.extend(chromaticity);\nColor.extend(luminance);\nColor.extend(interpolation);\nColor.extend(contrastMethods);\n\nexport { Color as default };\n//# sourceMappingURL=color.js.map\n","import type Color from \"colorjs.io\";\n\n// Semantic color names - matches portal-widgets tailwind.config.ts and field-types.ts\nexport const SEMANTIC_COLOR_NAMES = [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n] as const;\nexport type SemanticColorName = (typeof SEMANTIC_COLOR_NAMES)[number];\n\nexport const SHADE_STEPS = [\n 100, 200, 300, 400, 500, 600, 700, 800, 900,\n] as const;\nexport type ShadeStep = (typeof SHADE_STEPS)[number];\n\nexport const FONT_SIZE_KEYS = [\n \"extraSmall\",\n \"small\",\n \"regular\",\n \"large\",\n \"extraLarge\",\n \"giant\",\n] as const;\nexport type FontSizeKey = (typeof FONT_SIZE_KEYS)[number];\n\nexport const FONT_FAMILY_KEYS = [\"header\", \"body\"] as const;\nexport type FontFamilyKey = (typeof FONT_FAMILY_KEYS)[number];\n\nexport const RADIUS_KEYS = [\"small\", \"medium\", \"large\", \"extraLarge\"] as const;\nexport type RadiusKey = (typeof RADIUS_KEYS)[number];\n\n/** Author-time color input (what the user configures) */\nexport interface ThemeColorInput {\n base: Color;\n foreground: Color;\n}\n\n/** Complete theme definition — stored in-memory with Color objects */\nexport interface ThemeDefinition {\n id: string;\n name: string;\n /** Light mode — always fully specified */\n light: Record<SemanticColorName, ThemeColorInput>;\n /**\n * Dark mode — only user-overridden colors.\n * Missing keys are auto-derived from `light` at resolve time.\n */\n dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>>;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n /** When true, theme colors are re-derived from brand guidelines on every load */\n syncWithBrandColors?: boolean;\n}\n\n/** Resolved semantic color with generated shade ramp */\nexport interface ResolvedSemanticColor {\n base: Color;\n foreground: Color;\n shades: Record<ShadeStep, Color>;\n}\n\n/** Complete resolved color set for one mode */\nexport type ResolvedColorSet = Record<SemanticColorName, ResolvedSemanticColor>;\n\n/** Fully resolved theme — all colors materialised for both modes */\nexport interface ResolvedTheme {\n id: string;\n name: string;\n light: ResolvedColorSet;\n dark: ResolvedColorSet;\n fontSizes: ThemeDefinition[\"fontSizes\"];\n fontFamilies: ThemeDefinition[\"fontFamilies\"];\n spacing: string;\n radii: ThemeDefinition[\"radii\"];\n}\n\n/** Plain OKLCH triplet for JSON serialisation (no Color dependency) */\nexport interface OklchPlain {\n l: number;\n c: number;\n h: number;\n}\n\n/** Serialised color pair as stored in the backend payload */\nexport interface ThemeColorPlain {\n base: OklchPlain;\n foreground: OklchPlain;\n}\n\n/** Backend payload — plain JSON, no Color objects */\nexport interface ThemePayload {\n [key: string]: unknown;\n id: string;\n name: string;\n light: Record<SemanticColorName, ThemeColorPlain>;\n dark: Partial<\n Record<SemanticColorName, { base?: OklchPlain; foreground?: OklchPlain }>\n >;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n syncWithBrandColors?: boolean;\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n type SemanticColorName,\n type ShadeStep,\n type ThemeColorInput,\n type ThemeDefinition,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\n/**\n * Attempt to convert any string into a Color using colorjs.io.\n * If the string is exactly 6 characters it is assumed to be a bare hex value\n * (e.g. \"3b82f6\") and a \"#\" prefix is added before parsing.\n *\n * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure\n */\nexport function parseColor(value: string): Color {\n if (value.length === 6) {\n value = `#${value}`;\n }\n try {\n return new Color(value);\n } catch (error) {\n console.warn(\"[theme] Failed to parse color:\", value, error);\n return new Color(\"oklch\", [0.5, 0, 0]);\n }\n}\n\n/**\n * Returns either the original foreground or a corrected lightness variant,\n * whichever provides better contrast against `color`.\n * Inversion triggers when the APCA contrast is below 50.\n */\nexport function getForegroundColor(foreground: Color, color: Color): Color {\n if (foreground.oklch.l == null || color.oklch.l == null) {\n return foreground;\n }\n const contrast = color.contrastAPCA(foreground);\n\n if (contrast < 50) {\n return new Color(\"oklch\", [\n color.oklch.l < 0.7 ? 0.95 : 0.15,\n foreground.oklch.c || 0,\n foreground.oklch.h || 0,\n ]);\n }\n return foreground;\n}\n\n/**\n * Generate a 100–900 shade ramp from a base color.\n * Base anchors at 500. Light shades (100–400) step toward white,\n * dark shades (600–900) step toward black. Dark steps use an asymmetric\n * multiplier (1.6×, 1.875×, 3×, 4× of `darkStep`) for a more gradual\n * initial descent. Chroma is nudged per step for perceptually natural ramps.\n */\nexport function generateShades(base: Color): Record<ShadeStep, Color> {\n const l = base.oklch.l ?? 0;\n const c = base.oklch.c ?? 0;\n const h = base.oklch.h ?? 0;\n\n const safeMax = l >= 0.885 ? 0.995 : 0.97;\n const safeMin = l <= 0.33 ? 0 : 0.21;\n\n const lightStep = (safeMax - l) / 5;\n const darkStep = -(l - safeMin) / 8;\n\n const shade = (lDelta: number, cDelta: number): Color => {\n return new Color(\"oklch\", [\n Math.max(0, Math.min(1, l + lDelta)),\n c <= 0.001 ? c : Math.max(0, c + cDelta),\n h,\n ]);\n };\n\n return {\n 100: shade(5 * lightStep, -0.00375),\n 200: shade(4 * lightStep, -0.00375),\n 300: shade(3 * lightStep, -0.00375),\n 400: shade(2 * lightStep, -0.00375),\n 500: new Color(\"oklch\", [l, c, h]),\n 600: shade(1.6 * darkStep, 0.025),\n 700: shade(1.875 * 2 * darkStep, 0.05),\n 800: shade(3 * 2 * darkStep, 0.075),\n 900: shade(4 * 2 * darkStep, 0.1),\n };\n}\n\n// ── Dark Mode Derivation ────────────────────────────────────────────\n//\n// Dark-mode colors are derived from their light counterparts by adjusting\n// OKLCH lightness and optionally scaling chroma. Neutral slots (background,\n// foreground, muted) use fixed lightness values while chromatic slots\n// (primary, secondary, accent, destructive) invert lightness around 0.5.\n\nconst DARK_DERIVATION_CONFIG: Record<\n SemanticColorName,\n {\n baseLightness: number | \"invert\";\n fgLightness: number | \"invert\";\n chromaScale?: number;\n }\n> = {\n background: { baseLightness: 0.15, fgLightness: 0.93 },\n foreground: { baseLightness: 0.93, fgLightness: 0.15 },\n muted: { baseLightness: 0.22, fgLightness: 0.75 },\n primary: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n secondary: { baseLightness: \"invert\", fgLightness: 0.93, chromaScale: 0.85 },\n accent: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n destructive: {\n baseLightness: \"invert\",\n fgLightness: 0.95,\n chromaScale: 0.95,\n },\n};\n\n/** Invert OKLCH lightness (1 - l), clamped to [0.35, 0.75] to avoid extremes. */\nfunction invertLightness(l: number): number {\n const inverted = 1 - l;\n return Math.max(0.35, Math.min(0.75, inverted));\n}\n\n/**\n * Derive a dark-mode ThemeColorInput from its light-mode counterpart.\n */\nexport function deriveDarkVariant(\n name: SemanticColorName,\n light: ThemeColorInput,\n): ThemeColorInput {\n const config = DARK_DERIVATION_CONFIG[name];\n const chromaScale = config.chromaScale ?? 1;\n\n const baseLightness =\n config.baseLightness === \"invert\"\n ? invertLightness(light.base.oklch.l ?? 0)\n : config.baseLightness;\n\n const fgLightness =\n config.fgLightness === \"invert\"\n ? invertLightness(light.foreground.oklch.l ?? 0)\n : config.fgLightness;\n\n return {\n base: new Color(\"oklch\", [\n baseLightness,\n (light.base.oklch.c || 0) * chromaScale,\n light.base.oklch.h || 0,\n ]),\n foreground: new Color(\"oklch\", [\n fgLightness,\n (light.foreground.oklch.c || 0) * chromaScale,\n light.foreground.oklch.h || 0,\n ]),\n };\n}\n\n// ── Dark Mode Merge ─────────────────────────────────────────────────\n\n/**\n * Merge auto-derived dark colors with any user-specified overrides.\n * For each semantic color, if the user has fully overridden both base and\n * foreground those are used; otherwise the missing channels are derived.\n */\nexport function mergeDarkOverrides(\n def: ThemeDefinition,\n): Record<SemanticColorName, ThemeColorInput> {\n const darkColors = {} as Record<SemanticColorName, ThemeColorInput>;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const lightInput = def.light[name];\n const darkOverride = def.dark[name];\n\n if (darkOverride?.base && darkOverride?.foreground) {\n darkColors[name] = darkOverride as ThemeColorInput;\n } else if (darkOverride) {\n const base =\n darkOverride.base ?? deriveDarkVariant(name, lightInput).base;\n darkColors[name] = {\n base: base,\n foreground:\n darkOverride.foreground ??\n getForegroundColor(def.light.foreground.base, base),\n };\n } else {\n darkColors[name] = deriveDarkVariant(name, lightInput);\n }\n }\n\n return darkColors;\n}\n\n// ── Theme Resolution ────────────────────────────────────────────────\n\nfunction resolveColorSet(\n colors: Record<SemanticColorName, ThemeColorInput>,\n): ResolvedColorSet {\n const resolved = {} as ResolvedColorSet;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const input = colors[name];\n const shades = generateShades(input.base);\n const resolvedShades = {} as Record<ShadeStep, Color>;\n\n for (const step of SHADE_STEPS) {\n resolvedShades[step] = shades[step];\n }\n\n resolved[name] = {\n base: input.base.clone(),\n foreground: input.foreground.clone(),\n shades: resolvedShades,\n };\n }\n\n return resolved;\n}\n\n/**\n * Resolve a ThemeDefinition into a complete ResolvedTheme.\n * Dark mode colors are derived from light where not overridden.\n */\nexport function resolveTheme(def: ThemeDefinition): ResolvedTheme {\n return {\n id: def.id,\n name: def.name,\n light: resolveColorSet(def.light),\n dark: resolveColorSet(mergeDarkOverrides(def)),\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n };\n}\n","import { SHADE_STEPS, type SemanticColorName, type ShadeStep } from \"./types\";\n\n/**\n * Specific overrides, otherwise all the overrides are generated using emitTailwindOverrides\n */\nconst OVERRIDES: Partial<Record<string, string>> = {\n \"--color-gray-50\": \"var(--color-muted)\",\n \"--color-gray-100\": \"var(--color-muted-600)\",\n \"--color-gray-200\": \"var(--color-border)\",\n} as const;\n\n/**\n * Returns the inverted shade for dark mode foreground colors.\n * In dark mode, light shades (50, 100) should map to dark values (950, 900) and vice versa.\n */\nfunction getInvertedStep(shade: ShadeStep): ShadeStep {\n const shadeIndex = SHADE_STEPS.indexOf(shade);\n const invertedIndex = SHADE_STEPS.length - 1 - shadeIndex;\n return SHADE_STEPS[invertedIndex] || 500;\n}\n\n/**\n * Map semantic colors to Tailwind built-in color names.\n */\nexport function emitTailwindOverrides(darkMode: boolean = false): string[] {\n const TAILWIND_COLOR_MAP: Record<string, SemanticColorName> = {\n gray: \"foreground\",\n red: \"destructive\",\n blue: \"primary\",\n green: \"accent\",\n };\n\n const TAILWIND_SHADES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n ] as const;\n const SHADE_REMAP: Partial<Record<number, ShadeStep>> = {\n 50: 100,\n 950: 900,\n };\n\n const lines: string[] = [];\n for (const [twName, semantic] of Object.entries(TAILWIND_COLOR_MAP)) {\n for (const shade of TAILWIND_SHADES) {\n const step = (SHADE_REMAP[shade] ?? shade) as ShadeStep;\n const override = OVERRIDES[`--color-${twName}-${shade}`];\n lines.push(\n `--color-${twName}-${shade}: ${override ? override : `var(--color-${semantic}-${semantic === \"foreground\" && darkMode === true ? getInvertedStep(step) : step})`};`,\n );\n }\n }\n\n lines.push(\"--color-white: var(--color-background);\");\n lines.push(\"--color-black: var(--color-foreground);\");\n\n return lines;\n}\n","import { emitTailwindOverrides } from \"./tailwind-overrides\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n FONT_SIZE_KEYS,\n FONT_FAMILY_KEYS,\n RADIUS_KEYS,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\nfunction colorToCSS(color: import(\"colorjs.io\").default): string {\n const result = color.toString({ format: \"oklch\" });\n if (result.includes(\"NaN\")) {\n console.warn(\n \"[theme] colorToCSS produced NaN, using neutral fallback:\",\n result,\n );\n return \"oklch(0.5 0 0)\";\n }\n return result;\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Emit --color-{name}, --color-{name}-foreground, --color-{name}-{shade} vars.\n * Uses --color- prefix to match portal-widgets/tailwind.config.ts.\n */\nfunction emitColorVars(colors: ResolvedColorSet): string[] {\n const lines: string[] = [];\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const color = colors[name];\n lines.push(`--color-${name}: ${colorToCSS(color.base)};`);\n lines.push(`--color-${name}-foreground: ${colorToCSS(color.foreground)};`);\n for (const step of SHADE_STEPS) {\n lines.push(`--color-${name}-${step}: ${colorToCSS(color.shades[step])};`);\n }\n }\n\n return lines;\n}\n\n/**\n * Emit non-color CSS variables (font sizes, families, spacing, radii).\n */\nfunction emitNonColorVars(theme: ResolvedTheme): string[] {\n const lines: string[] = [];\n for (const key of FONT_SIZE_KEYS) {\n lines.push(`--font-size-${camelToKebab(key)}: ${theme.fontSizes[key]};`);\n }\n for (const key of FONT_FAMILY_KEYS) {\n lines.push(`--font-${key}: ${theme.fontFamilies[key]};`);\n }\n lines.push(`--spacing: ${theme.spacing};`);\n for (const key of RADIUS_KEYS) {\n lines.push(`--radius-${camelToKebab(key)}: ${theme.radii[key]};`);\n }\n return lines;\n}\n\n/**\n * Static CSS alias variables that bridge theme var names to Tailwind/component conventions.\n * These are always emitted and not mode-dependent.\n */\nconst globalCSSOverride = [\n \"--color-background-foreground: var(--color-foreground);\",\n \"--color-foreground-foreground: var(--color-background);\",\n \"--color-contrast: var(--color-foreground);\",\n ...SEMANTIC_COLOR_NAMES.map((value) => `--${value}: var(--color-${value});`),\n ...SEMANTIC_COLOR_NAMES.map(\n (value) => `--${value}-foreground: var(--color-${value}-foreground);`,\n ),\n\n \"--sidebar-ring: var(--color-primary);\",\n \"--sidebar-border: var(--color-border);\",\n \"--sidebar-accent-foreground: var(--color-accent-foreground);\",\n \"--sidebar-accent: var(--color-accent);\",\n \"--sidebar-primary-foreground: var(--color-primary-foreground);\",\n \"--sidebar-primary: var(--color-primary);\",\n \"--sidebar-foreground: var(--color-muted-foreground);\",\n \"--sidebar: var(--color-muted);\",\n \"--border: var(--color-background-600);\",\n \"--ring: var(--color-primary);\",\n \"--popover: var(--color-background);\",\n \"--popover-foreground: var(--color-foreground);\",\n \"--card: var(--color-muted);\",\n \"--card-foreground: var(--color-muted-foreground);\",\n\n \"--radius-sm: var(--radius-small);\",\n \"--radius-md: var(--radius-medium);\",\n \"--radius-lg: var(--radius-large);\",\n \"--radius-xl: var(--radius-extra-large);\",\n \"--text-xs: var(--font-size-extra-small);\",\n \"--text-sm: var(--font-size-small);\",\n \"--text-base: var(--font-size-regular);\",\n \"--text-lg: var(--font-size-large);\",\n \"--text-xl: var(--font-size-extra-large);\",\n \"--text-2xl: var(--font-size-giant);\",\n \"--font-sans: var(--font-body);\",\n // Tailwind's font-mono is repurposed as the display/header font\n \"--font-mono: var(--font-header);\",\n];\n\n/**\n * Overrides for global tailwindcss for specifically dark mode.\n */\nconst globalDarkCSSOverride = [\"--border: var(--color-background-400);\"];\n\nexport interface GenerateThemeCSSOptions {\n /** Whether or not to allow prefers-color-scheme to choose the theme mode */\n disableAutoTheme?: boolean;\n /** Whether to emit Tailwind built-in color overrides (default true) */\n mapTailwindColors?: boolean;\n}\n\n/**\n * Generate a complete CSS string for a resolved theme.\n * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode=\"dark\"]`,\n * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.\n */\nexport function generateThemeCSS(\n theme: ResolvedTheme,\n options: GenerateThemeCSSOptions = {},\n): string {\n const sel = `[data-theme=\"${theme.id}\"]`;\n const tw = options.mapTailwindColors ?? true;\n const blocks: string[] = [];\n\n // Light mode (default)\n blocks.push(`${sel} {`);\n blocks.push(...globalCSSOverride);\n blocks.push(...emitNonColorVars(theme));\n blocks.push(...emitColorVars(theme.light));\n if (tw) blocks.push(...emitTailwindOverrides());\n blocks.push(`}`);\n\n // Dark mode: explicit via attribute\n blocks.push(`${sel}[data-theme-mode=\"dark\"] {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark));\n if (tw) blocks.push(...emitTailwindOverrides(true));\n blocks.push(`}`);\n\n // Dark mode: auto via system preference\n if (!options.disableAutoTheme) {\n blocks.push(`@media (prefers-color-scheme: dark) {`);\n blocks.push(`${sel}:not([data-theme-mode]) {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark).map((l) => `${l}`));\n if (tw) blocks.push(...emitTailwindOverrides(true).map((l) => `${l}`));\n blocks.push(`}`);\n blocks.push(`}`);\n }\n\n return blocks.join(\"\\n\");\n}\n","import Color from \"colorjs.io\";\nimport type {\n FontSizeKey,\n FontFamilyKey,\n RadiusKey,\n ThemeDefinition,\n} from \"./types\";\nimport { getForegroundColor } from \"./color-engine\";\n\n// ── Non-color defaults ──────────────────────────────────────────────\n\nexport const DEFAULT_FONT_SIZES: Record<FontSizeKey, string> = {\n extraSmall: \"0.75rem\",\n small: \"0.875rem\",\n regular: \"1rem\",\n large: \"1.125rem\",\n extraLarge: \"1.25rem\",\n giant: \"1.5rem\",\n};\n\nexport const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string> = {\n header: \"var(--font-inter)\",\n body: \"var(--font-inter)\",\n};\n\nexport const DEFAULT_SPACING = \"0.25rem\";\n\nexport const DEFAULT_RADII: Record<RadiusKey, string> = {\n small: \"0.25rem\",\n medium: \"0.5rem\",\n large: \"0.75rem\",\n extraLarge: \"1rem\",\n};\n\n// ── Default colors (hex) ────────────────────────────────────────────\n\nexport const DEFAULT_COLORS = {\n background: \"#ffffff\",\n foreground: \"#1a1a1a\",\n primary: \"#3b82f6\",\n secondary: \"#6b7280\",\n accent: \"#10b981\",\n muted: \"#f3f4f6\",\n destructive: \"#ef4444\",\n mutedForeground: \"#6b7280\",\n} as const;\n\n// ── Default theme identity ──────────────────────────────────────────\n\nexport const DEFAULT_THEME_ID = \"default\";\nexport const DEFAULT_THEME_NAME = \"Default Theme\";\n\n// ── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Build a fresh ThemeDefinition populated with all defaults.\n * Returns a new object each call because Color instances are mutable — do not cache the result.\n */\nexport function getDefaultThemeDefinition(): ThemeDefinition {\n const bg = new Color(DEFAULT_COLORS.background);\n const fg = new Color(DEFAULT_COLORS.foreground);\n const primary = new Color(DEFAULT_COLORS.primary);\n const secondary = new Color(DEFAULT_COLORS.secondary);\n const accent = new Color(DEFAULT_COLORS.accent);\n const muted = new Color(DEFAULT_COLORS.muted);\n const destructive = new Color(DEFAULT_COLORS.destructive);\n const mutedFg = new Color(DEFAULT_COLORS.mutedForeground);\n\n const darkBg = new Color(\"#0a0a0a\");\n const darkFg = new Color(\"#fafafa\");\n const darkMuted = new Color(\"#171717\");\n const darkMutedForeground = new Color(\"#dddddd\");\n\n return {\n id: DEFAULT_THEME_ID,\n name: DEFAULT_THEME_NAME,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {\n background: { base: darkBg, foreground: darkFg },\n foreground: { base: darkFg, foreground: darkBg },\n muted: { base: darkMuted, foreground: darkMutedForeground },\n },\n fontSizes: { ...DEFAULT_FONT_SIZES },\n fontFamilies: { ...DEFAULT_FONT_FAMILIES },\n spacing: DEFAULT_SPACING,\n radii: { ...DEFAULT_RADII },\n };\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n type SemanticColorName,\n type ThemeColorInput,\n type ThemeDefinition,\n type ThemePayload,\n type OklchPlain,\n type FontSizeKey,\n type FontFamilyKey,\n type RadiusKey,\n} from \"./types\";\nimport {\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n getDefaultThemeDefinition,\n} from \"./defaults\";\n\nfunction colorToPlain(color: Color): OklchPlain {\n return {\n l: color.oklch.l ?? 0,\n c: color.oklch.c ?? 0,\n h: color.oklch.h ?? 0,\n };\n}\n\nfunction plainToColor(plain: OklchPlain): Color {\n return new Color(\"oklch\", [plain.l, plain.c, plain.h]);\n}\n\n/**\n * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload\n * suitable for backend storage.\n */\nexport function serialiseTheme(def: ThemeDefinition): ThemePayload {\n const light = {} as ThemePayload[\"light\"];\n for (const name of SEMANTIC_COLOR_NAMES) {\n light[name] = {\n base: colorToPlain(def.light[name].base),\n foreground: colorToPlain(def.light[name].foreground),\n };\n }\n\n const dark: ThemePayload[\"dark\"] = {};\n for (const [name, value] of Object.entries(def.dark)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: colorToPlain(value.base) } : {}),\n ...(value.foreground\n ? { foreground: colorToPlain(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: def.id,\n name: def.name,\n light,\n dark,\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n ...(def.syncWithBrandColors ? { syncWithBrandColors: true } : {}),\n };\n}\n\n/**\n * Deserialise a backend payload into a ThemeDefinition with Color objects.\n * Accepts `Record<string, unknown>` because API data is untyped at the boundary.\n * Falls back to default colors for any missing light-mode entries.\n */\nexport function deserialiseTheme(\n payload: Record<string, unknown>,\n): ThemeDefinition {\n const lightRaw = ((payload.light as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base: OklchPlain; foreground: OklchPlain }>;\n const darkRaw = ((payload.dark as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base?: OklchPlain; foreground?: OklchPlain }>;\n\n const defaults = getDefaultThemeDefinition();\n const light = {} as Record<SemanticColorName, ThemeColorInput>;\n for (const name of SEMANTIC_COLOR_NAMES) {\n const entry = lightRaw[name];\n if (entry) {\n light[name] = {\n base: plainToColor(entry.base),\n foreground: plainToColor(entry.foreground),\n };\n } else {\n console.warn(\n `[theme] deserialiseTheme: missing light color \"${name}\", using default`,\n );\n light[name] = defaults.light[name];\n }\n }\n\n const dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>> = {};\n for (const [name, value] of Object.entries(darkRaw)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: plainToColor(value.base) } : {}),\n ...(value.foreground\n ? { foreground: plainToColor(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: payload.id as string,\n name: payload.name as string,\n light,\n dark,\n fontSizes: (payload.fontSizes ?? DEFAULT_FONT_SIZES) as Record<\n FontSizeKey,\n string\n >,\n fontFamilies: (payload.fontFamilies ?? DEFAULT_FONT_FAMILIES) as Record<\n FontFamilyKey,\n string\n >,\n spacing: (payload.spacing as string) ?? DEFAULT_SPACING,\n radii: (payload.radii ?? DEFAULT_RADII) as Record<RadiusKey, string>,\n ...(payload.syncWithBrandColors === true\n ? { syncWithBrandColors: true }\n : {}),\n };\n}\n","/**\n * Theme Transforms\n * Convert raw API theme objects to ThemeDefinition format.\n * Handles both new structured format (OKLCH) and legacy flat format (hex strings).\n */\n\nimport type { ThemeDefinition } from \"./types\";\nimport { deserialiseTheme } from \"./serialisation\";\nimport { parseColor, getForegroundColor } from \"./color-engine\";\nimport {\n DEFAULT_COLORS,\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n} from \"./defaults\";\n\n/** Shape of a raw theme from the FluidOS API */\nexport interface RawApiTheme {\n id: number;\n config?: Record<string, unknown> | null;\n active?: boolean | null;\n name?: string | null;\n}\n\n/**\n * Check if a theme config uses the new structured format (has a `light` key\n * that is an object) vs the legacy flat format.\n */\nfunction isNewThemeFormat(config: Record<string, unknown>): boolean {\n return config.light != null && typeof config.light === \"object\";\n}\n\n/**\n * Convert a legacy flat config to a ThemeDefinition.\n * Legacy format: { base: \"#fff\", text: \"#000\", primary: \"oklch(0.6 0.2 250)\", ... }\n */\nfunction legacyConfigToDefinition(\n id: number,\n name: string,\n config: Record<string, string>,\n): ThemeDefinition {\n const bg = parseColor(\n config.base ?? config.background ?? DEFAULT_COLORS.background,\n );\n const fg = parseColor(\n config.text ?? config.foreground ?? DEFAULT_COLORS.foreground,\n );\n const primary = parseColor(config.primary ?? DEFAULT_COLORS.primary);\n const secondary = parseColor(config.secondary ?? DEFAULT_COLORS.secondary);\n const accent = parseColor(config.accent ?? DEFAULT_COLORS.accent);\n const muted = parseColor(config.muted ?? DEFAULT_COLORS.muted);\n const destructive = parseColor(\n config.destructive ?? DEFAULT_COLORS.destructive,\n );\n const mutedFg = parseColor(\n config.mutedForeground ?? DEFAULT_COLORS.mutedForeground,\n );\n\n return {\n id: String(id),\n name,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {},\n fontSizes: {\n extraSmall: config.extraSmall ?? DEFAULT_FONT_SIZES.extraSmall,\n small: config.small ?? DEFAULT_FONT_SIZES.small,\n regular: config.regular ?? DEFAULT_FONT_SIZES.regular,\n large: config.large ?? DEFAULT_FONT_SIZES.large,\n extraLarge: config.extraLarge ?? DEFAULT_FONT_SIZES.extraLarge,\n giant: config.giant ?? DEFAULT_FONT_SIZES.giant,\n },\n fontFamilies: {\n header: config.headerFont ?? DEFAULT_FONT_FAMILIES.header,\n body: config.bodyFont ?? DEFAULT_FONT_FAMILIES.body,\n },\n spacing: config.globalSpacing ?? DEFAULT_SPACING,\n radii: {\n small: config.radiusSmall ?? DEFAULT_RADII.small,\n medium: config.radiusMedium ?? DEFAULT_RADII.medium,\n large: config.radiusLarge ?? DEFAULT_RADII.large,\n extraLarge: config.radiusExtraLarge ?? DEFAULT_RADII.extraLarge,\n },\n };\n}\n\n/**\n * Build a ThemeDefinition from a single API theme object.\n * Handles both new structured format and legacy flat format.\n */\nexport function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition {\n const config = (theme.config ?? {}) as Record<string, unknown>;\n\n if (isNewThemeFormat(config)) {\n return deserialiseTheme({\n ...config,\n id: String(theme.id),\n name: theme.name ?? \"Untitled Theme\",\n });\n }\n\n return legacyConfigToDefinition(\n theme.id,\n theme.name ?? \"Untitled Theme\",\n config as Record<string, string>,\n );\n}\n\n/**\n * Transform raw API themes to ThemeDefinition[].\n * Catches and logs errors per theme (graceful degradation).\n */\nexport function transformThemes(themes: RawApiTheme[]): ThemeDefinition[] {\n return themes.flatMap((theme) => {\n try {\n return [buildThemeDefinition(theme)];\n } catch (error) {\n console.error(`[theme] Failed to build theme id=${theme.id}:`, error);\n return [];\n }\n });\n}\n\n/**\n * Get the active theme ID from a list of raw API themes.\n * Falls back to the first theme if none is marked active.\n */\nexport function getActiveThemeId(themes: RawApiTheme[]): string | undefined {\n const active = themes.find((t) => t.active) ?? themes[0];\n return active ? String(active.id) : undefined;\n}\n","import { generateThemeCSS } from \"./css-generator\";\nimport type { ResolvedTheme } from \"./types\";\nimport type { GenerateThemeCSSOptions } from \"./css-generator\";\n\nconst STYLE_PREFIX = \"theme-style-\";\n\n/**\n * Inject or update a `<style>` element in `<head>` for the given theme.\n * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls\n * for the same theme are idempotent — the existing element is updated in place.\n * No-op when `document` is unavailable (SSR).\n */\nexport function applyTheme(\n theme: ResolvedTheme,\n options?: GenerateThemeCSSOptions,\n): void {\n if (typeof document === \"undefined\") return;\n\n try {\n const styleId = `${STYLE_PREFIX}${theme.id}`;\n let el = document.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!el) {\n el = document.createElement(\"style\");\n el.id = styleId;\n document.head.appendChild(el);\n }\n\n el.textContent = generateThemeCSS(theme, options);\n } catch (error) {\n console.error(`[theme] applyTheme failed for \"${theme.id}\":`, error);\n }\n}\n\n/** Remove an injected theme stylesheet. No-op during SSR. */\nexport function removeTheme(themeId: string): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(`${STYLE_PREFIX}${themeId}`)?.remove();\n}\n\n/** Remove all injected theme stylesheets. No-op during SSR. */\nexport function removeAllThemes(): void {\n if (typeof document === \"undefined\") return;\n document\n .querySelectorAll(`style[id^=\"${STYLE_PREFIX}\"]`)\n .forEach((el) => el.remove());\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/portal-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/portal-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/portal-core/types\";\nimport type { components } from \"@fluid-app/fluidos-api-client\";\n\n/** Raw navigation item from the FluidOS API (derived from generated types) */\nexport type RawApiNavigationItem =\n components[\"schemas\"][\"FluidOSNavigationItem\"];\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/portal-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/** Raw manifest shape from the `/fluid_os/definitions/active` API response */\nexport interface RawManifestResponse {\n manifest: {\n definition_id: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id: number;\n themes?: RawApiTheme[];\n navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * This is the top-level transform used by `FluidClient.app.get()`.\n * It handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n\n return {\n definition_id: manifest.definition_id,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? manifest.definition_id,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? manifest.definition_id,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? manifest.definition_id,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","/**\n * Fluid API Client\n * Adapted from: packages/fluidos-api-client/src/lib/fetch-client.ts\n * Provides authenticated API access with domain-specific methods\n */\n\nimport type { Rep, UpdateRepData, UserMe } from \"../types/rep\";\nimport type { Profile } from \"../types/profile\";\nimport type { UserPermissions } from \"../types/permissions\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\nimport {\n createFetchClient,\n fluidOs,\n type FetchClient,\n} from \"@fluid-app/fluidos-api-client\";\nimport {\n HTTP_METHODS,\n type FluidSDKConfig,\n type RequestOptions,\n type BaseListParams,\n} from \"./types\";\nimport { createDefaultAuthRedirect } from \"../auth/auth-redirect\";\nimport {\n transformManifestToRepAppData,\n type RawManifestResponse,\n} from \"../transforms\";\n\n/**\n * API Error class for structured error handling\n */\nexport class ApiError extends Error {\n readonly status: number;\n readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n // V8-specific stack trace capture (Node.js, Chrome)\n const errorWithCapture = Error as typeof Error & {\n captureStackTrace?: (\n target: object,\n constructor: typeof ApiError,\n ) => void;\n };\n if (errorWithCapture.captureStackTrace) {\n errorWithCapture.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n// ============================================================================\n// Discriminated Union for API Responses\n// ============================================================================\n\n/**\n * Discriminated union representing the result of an API call.\n * Use `isApiSuccess` and `isApiFailure` type guards to narrow.\n */\nexport type ApiResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: ApiError };\n\n/**\n * Type guard for successful API result\n */\nexport function isApiSuccess<T>(\n result: ApiResult<T>,\n): result is { readonly success: true; readonly data: T } {\n return result.success === true;\n}\n\n/**\n * Type guard for failed API result\n */\nexport function isApiFailure<T>(\n result: ApiResult<T>,\n): result is { readonly success: false; readonly error: ApiError } {\n return result.success === false;\n}\n\n/**\n * Type guard to check if a value is a non-null string\n */\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Extract error message from API response data using `in` operator narrowing.\n * Checks common error message field names in order of precedence.\n */\nfunction extractErrorMessage(\n data: Readonly<Record<string, unknown>>,\n fallback: string,\n): string {\n // Use `in` operator to narrow and then type guard to validate string type\n if (\"message\" in data && isString(data.message)) {\n return data.message;\n }\n if (\"error_message\" in data && isString(data.error_message)) {\n return data.error_message;\n }\n if (\"error\" in data && isString(data.error)) {\n return data.error;\n }\n return fallback;\n}\n\n// ============================================================================\n// Domain Types\n// ============================================================================\n\n// ============================================================================\n// Product Types\n// ============================================================================\n\nexport interface Product {\n readonly id: number;\n readonly title: string;\n readonly sku?: string | null;\n readonly price: string | number;\n readonly description?: string | null;\n readonly image_url?: string;\n readonly status?: string;\n readonly active?: boolean;\n readonly slug?: string;\n readonly in_stock?: boolean;\n readonly display_price?: string;\n readonly currency_code?: string;\n readonly updated_at?: string;\n}\n\nexport interface ProductListParams extends BaseListParams {\n readonly search_query?: string;\n readonly status?: readonly (\"active\" | \"draft\" | \"archived\" | \"all\")[];\n readonly category_id?: string;\n readonly category_ids?: readonly number[];\n readonly collection_id?: string;\n readonly collection_ids?: readonly number[];\n readonly order_by?: readonly string[];\n readonly country_code?: readonly string[];\n readonly published_stores?: readonly (\"retail\" | \"rep\")[];\n}\n\nexport interface ProductsResponse {\n readonly products: readonly Product[];\n readonly meta: {\n readonly request_id: string;\n readonly timestamp: string;\n readonly pagination?: {\n readonly current_page: number;\n readonly per_page: number;\n readonly total_pages: number;\n readonly total_count: number;\n };\n };\n}\n\n// ============================================================================\n// Order Types\n// ============================================================================\n\nexport interface Order {\n readonly id: string;\n readonly order_number: string;\n readonly status: string;\n readonly total: number;\n readonly customer_id: string;\n readonly rep_id?: string;\n readonly created_at: string;\n readonly updated_at: string;\n}\n\nexport interface OrderListParams extends BaseListParams {\n readonly status?: string;\n readonly customer_id?: string;\n readonly date_from?: string;\n readonly date_to?: string;\n}\n\nexport interface CreateOrderData {\n readonly customer_id: string;\n readonly line_items: readonly OrderLineItem[];\n readonly notes?: string;\n}\n\nexport interface OrderLineItem {\n readonly product_id: string;\n readonly quantity: number;\n readonly price?: number;\n}\n\n// ============================================================================\n// Analytics Types\n// ============================================================================\n\nexport interface DashboardData {\n readonly total_sales: number;\n readonly total_orders: number;\n readonly total_customers: number;\n readonly recent_orders: readonly Order[];\n}\n\nexport interface SalesParams {\n readonly date_from?: string;\n readonly date_to?: string;\n readonly group_by?: \"day\" | \"week\" | \"month\";\n}\n\nexport interface SalesData {\n readonly total: number;\n readonly data: readonly SalesDataPoint[];\n}\n\nexport interface SalesDataPoint {\n readonly date: string;\n readonly amount: number;\n readonly orders: number;\n}\n\n// ============================================================================\n// Client Return Type\n// ============================================================================\n\n/**\n * The shape returned by `createFluidClient`.\n * Generic helper methods preserve their type parameters so callers\n * can specify response types at each call site.\n */\nexport interface FluidClientReturn {\n readonly fetchClient: FetchClient;\n\n readonly request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n\n readonly requestNullable: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse | null>;\n\n readonly safeRequest: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<ApiResult<TResponse>>;\n\n readonly get: <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n\n readonly post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n\n readonly products: {\n readonly list: (params?: ProductListParams) => Promise<ProductsResponse>;\n readonly get: (id: string | number) => Promise<{ product: Product }>;\n readonly search: (\n query: string,\n params?: ProductListParams,\n ) => Promise<ProductsResponse>;\n };\n\n readonly orders: {\n readonly list: (params?: OrderListParams) => Promise<Order[]>;\n readonly get: (id: string) => Promise<Order>;\n readonly create: (data: CreateOrderData) => Promise<Order>;\n };\n\n readonly users: {\n readonly me: () => Promise<UserMe>;\n };\n\n readonly reps: {\n readonly current: () => Promise<Rep>;\n readonly updateProfile: (data: UpdateRepData) => Promise<Rep>;\n };\n\n readonly profile: {\n readonly get: () => Promise<Profile>;\n };\n\n readonly app: {\n readonly getRaw: () => Promise<RawManifestResponse>;\n readonly get: () => Promise<RepAppData>;\n };\n\n readonly permissions: {\n readonly get: () => Promise<UserPermissions>;\n };\n\n readonly analytics: {\n readonly dashboard: () => Promise<DashboardData>;\n readonly sales: (params?: SalesParams) => Promise<SalesData>;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\n/**\n * Creates a configured Fluid API client instance\n */\nexport function createFluidClient(config: FluidSDKConfig): FluidClientReturn {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();\n\n // Create a fluidos FetchClient for structured API calls (manifest, etc.)\n // Conditional spread for exactOptionalPropertyTypes: only include getAuthToken when defined\n const fetchClient: FetchClient = createFetchClient({\n baseUrl,\n ...(getAuthToken ? { getAuthToken } : {}),\n onAuthError: effectiveOnAuthError,\n defaultHeaders,\n });\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters (Rails-compatible)\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Construct URL by concatenating baseUrl + endpoint\n // Using URL constructor with relative paths would strip the baseUrl path (e.g., /api)\n const normalizedBase = baseUrl.endsWith(\"/\")\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedEndpoint = endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`;\n const url = new URL(normalizedBase + normalizedEndpoint);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n for (const item of value) {\n url.searchParams.append(`${key}[]`, String(item));\n }\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (subValue === undefined || subValue === null) {\n continue;\n }\n\n if (Array.isArray(subValue)) {\n for (const item of subValue) {\n url.searchParams.append(`${key}[${subKey}][]`, String(item));\n }\n } else {\n url.searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Default request options for type-safe defaults.\n * Uses `satisfies` to validate against RequestOptions while preserving literal types.\n */\n const defaultRequestOptions = {\n method: HTTP_METHODS.GET,\n } as const satisfies Partial<RequestOptions>;\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = defaultRequestOptions.method,\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n // Use buildUrl for all requests to ensure baseUrl path is preserved\n const url = buildUrl(\n endpoint,\n method === HTTP_METHODS.GET ? params : undefined,\n );\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n // Only add signal and body when defined to satisfy exactOptionalPropertyTypes\n // RequestInit expects signal: AbortSignal | null, not undefined\n if (signal !== undefined) {\n fetchOptions.signal = signal;\n }\n if (body && method !== HTTP_METHODS.GET) {\n fetchOptions.body = JSON.stringify(body);\n }\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Handle authentication errors — invoke the handler, then throw so\n // TanStack Query surfaces the error instead of caching `null` as data.\n if (response.status === 401) {\n effectiveOnAuthError();\n throw new ApiError(\"Authentication required\", 401, null);\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = (await response.json()) as Record<string, unknown>;\n // Use `in` operator narrowing to safely extract error message\n const errorMessage = extractErrorMessage(\n data,\n `${method} request failed`,\n );\n throw new ApiError(\n errorMessage,\n response.status,\n \"errors\" in data ? data.errors : data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (isApiError(error)) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting nullable responses should use requestNullable<T>\n // which properly types the return as T | null\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n // Type assertion required: 204 No Content has no body to parse.\n // This is safe when TResponse is a union including null (e.g., T | null).\n // For fully type-safe nullable handling, prefer requestNullable() or safeRequest().\n return null as TResponse;\n }\n\n try {\n const data: unknown = await response.json();\n // Runtime check: verify we got an object/array, not a primitive that would be mistyped\n if (data === null || data === undefined) {\n throw new ApiError(\n \"Unexpected null/undefined in JSON response\",\n response.status,\n null,\n );\n }\n // Type assertion required: JSON.parse returns `unknown`, but we've validated\n // the response is not null/undefined. The caller specifies TResponse based on\n // their knowledge of the API endpoint's response schema.\n return data as TResponse;\n } catch (parseError) {\n if (isApiError(parseError)) {\n throw parseError;\n }\n throw new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n );\n }\n }\n\n /**\n * Request function for endpoints that may return null (204 No Content).\n * Properly types the return as T | null.\n */\n async function requestNullable<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse | null> {\n return request<TResponse | null>(endpoint, options);\n }\n\n /**\n * Safe request wrapper that returns a discriminated union instead of throwing.\n * Use `isApiSuccess` or `isApiFailure` to narrow the result.\n */\n async function safeRequest<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<ApiResult<TResponse>> {\n try {\n const data = await request<TResponse>(endpoint, options);\n return { success: true, data };\n } catch (error) {\n if (isApiError(error)) {\n return { success: false, error };\n }\n // Wrap unknown errors in ApiError\n return {\n success: false,\n error: new ApiError(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n null,\n ),\n };\n }\n }\n\n /**\n * Helper to safely convert typed params to Record<string, unknown>.\n * Type assertion required: TypeScript's structural typing allows any object\n * to be treated as Record<string, unknown> when we only need to iterate\n * over its entries. This is safe because buildUrl only reads properties.\n */\n function toParams<T extends object>(\n params: T | undefined,\n ): Record<string, unknown> | undefined {\n return params as Record<string, unknown> | undefined;\n }\n\n // Convenience HTTP methods using HTTP_METHODS constant for type safety\n const get = <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> => {\n // Build request options object, only adding params if defined\n const baseOptions = {\n ...options,\n method: HTTP_METHODS.GET,\n } satisfies RequestOptions;\n\n const convertedParams = toParams(params);\n const requestOptions: RequestOptions =\n convertedParams !== undefined\n ? { ...baseOptions, params: convertedParams }\n : baseOptions;\n\n return request<TResponse>(endpoint, requestOptions);\n };\n\n const post = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.POST,\n body,\n } satisfies RequestOptions);\n\n const put = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PUT,\n body,\n } satisfies RequestOptions);\n\n const patch = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PATCH,\n body,\n } satisfies RequestOptions);\n\n const del = <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.DELETE,\n } satisfies RequestOptions);\n\n // ============================================================================\n // Domain-Specific API Methods\n // ============================================================================\n\n return {\n // Fluidos FetchClient for structured API calls\n fetchClient: fetchClient,\n\n // Low-level methods for custom endpoints\n request: request,\n requestNullable: requestNullable,\n safeRequest: safeRequest,\n get: get,\n post: post,\n put: put,\n patch: patch,\n delete: del,\n\n // Products API - matches fluid-admin's /company/v1/products\n products: {\n list: (params?: ProductListParams): Promise<ProductsResponse> =>\n get<ProductsResponse, ProductListParams>(\n \"/api/company/v1/products\",\n params,\n ),\n get: (id: string | number): Promise<{ product: Product }> =>\n get<{ product: Product }>(`/api/company/v1/products/${id}`),\n search: (\n query: string,\n params?: ProductListParams,\n ): Promise<ProductsResponse> =>\n get<ProductsResponse>(\"/api/company/v1/products\", {\n search_query: query,\n ...params,\n } as Record<string, unknown>),\n },\n\n // Orders API\n orders: {\n list: (params?: OrderListParams): Promise<Order[]> =>\n get<Order[], OrderListParams>(\"/api/orders\", params),\n get: (id: string): Promise<Order> => get<Order>(`/api/orders/${id}`),\n create: (data: CreateOrderData): Promise<Order> =>\n post<Order>(\"/api/orders\", data),\n },\n\n // Users API\n users: {\n me: (): Promise<UserMe> => get<UserMe>(\"/api/me\"),\n },\n\n // Reps API\n reps: {\n current: (): Promise<Rep> => get<Rep>(\"/api/reps/me\"),\n updateProfile: (data: UpdateRepData): Promise<Rep> =>\n patch<Rep>(\"/api/reps/me\", data),\n },\n\n // Profile API (themes, navigation, screens) — legacy endpoint\n profile: {\n get: (): Promise<Profile> => get<Profile>(\"/api/rep_app/manifest\"),\n },\n\n // App API — fluidos endpoint (full manifest with transforms)\n app: {\n /** Fetch the raw manifest (plain JSON, no Color objects). Cache-safe. */\n getRaw: async (): Promise<RawManifestResponse> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n // The fluidos-api-client returns { manifest?, meta? } — cast to\n // RawManifestResponse shape which transformManifestToRepAppData expects\n return raw as unknown as RawManifestResponse;\n },\n /** Fetch the active app definition with full theme/screen/navigation transforms */\n get: async (): Promise<RepAppData> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n return transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n },\n },\n\n // Permissions API\n permissions: {\n get: (): Promise<UserPermissions> =>\n get<UserPermissions>(\"/api/company/roles/my_permissions\"),\n },\n\n // Analytics API\n analytics: {\n dashboard: (): Promise<DashboardData> =>\n get<DashboardData>(\"/api/analytics/dashboard\"),\n sales: (params?: SalesParams): Promise<SalesData> =>\n get<SalesData, SalesParams>(\"/api/analytics/sales\", params),\n },\n };\n}\n\nexport type FluidClient = ReturnType<typeof createFluidClient>;\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using portal-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeAllThemes,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared portal-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from portal-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps): React.JSX.Element {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n removeAllThemes();\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","/**\n * FluidAuthProvider - Authentication Provider for Fluid Portal SDK\n *\n * Handles JWT token extraction from URL, validation, storage, and\n * provides authentication context to child components.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useReducer,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport type {\n FluidAuthConfig,\n FluidAuthContextValue,\n JWTPayload,\n} from \"../auth/types\";\nimport { extractTokenFromUrl, cleanTokenFromUrl } from \"../auth/url-token\";\nimport { getStoredToken, storeToken, clearTokens } from \"../auth/token-storage\";\nimport {\n validateToken,\n verifyToken,\n isTokenExpired,\n} from \"../auth/token-utils\";\nimport { isDevBypassActive, createDevUser } from \"../auth/dev-utils\";\nimport {\n resolveAuthFailureHandler,\n AUTH_REDIRECT_TOKEN_KEY,\n} from \"../auth/auth-redirect\";\n\n/**\n * Auth context - null when outside provider\n */\nconst FluidAuthContext = createContext<FluidAuthContextValue | null>(null);\n\ninterface AuthState {\n isLoading: boolean;\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n}\n\ntype AuthAction =\n | {\n type: \"SET_AUTH\";\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n }\n | { type: \"CLEAR_AUTH\" }\n | { type: \"DONE_LOADING\" };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n switch (action.type) {\n case \"SET_AUTH\":\n return {\n isLoading: false,\n token: action.token,\n user: action.user,\n error: action.error,\n };\n case \"CLEAR_AUTH\":\n return { ...state, token: null, user: null, error: null };\n case \"DONE_LOADING\":\n return { ...state, isLoading: false };\n }\n}\n\nconst initialAuthState: AuthState = {\n isLoading: true,\n token: null,\n user: null,\n error: null,\n};\n\nexport interface FluidAuthProviderProps {\n /** React children to wrap with auth context */\n children: ReactNode;\n /** Auth configuration options */\n config?: FluidAuthConfig;\n}\n\n/**\n * Authentication provider for Fluid portal applications.\n *\n * On mount, this provider:\n * 1. Checks for a token in the URL (passed from parent app)\n * 2. Cleans token from URL immediately (security)\n * 3. Falls back to stored token (cookie/localStorage)\n * 4. Validates the token (checks expiration)\n * 5. Stores valid tokens for future use\n * 6. Calls onAuthFailure if no valid token found\n *\n * @example\n * ```tsx\n * import { FluidAuthProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidAuthProvider\n * config={{\n * onAuthFailure: () => {\n * window.location.href = \"/login\";\n * },\n * }}\n * >\n * <YourApp />\n * </FluidAuthProvider>\n * );\n * }\n * ```\n */\nexport function FluidAuthProvider({\n children,\n config,\n}: FluidAuthProviderProps): React.JSX.Element {\n const configRef = useRef(config);\n configRef.current = config;\n\n const [state, dispatch] = useReducer(authReducer, initialAuthState);\n const { isLoading, token, user, error } = state;\n\n // Initialize auth on mount\n useEffect(() => {\n const initializeAuth = async () => {\n const handleAuthFailure = () => {\n const current = configRef.current;\n const handler = resolveAuthFailureHandler(\n current?.onAuthFailure,\n current?.authUrl,\n );\n handler();\n };\n\n try {\n // DEV BYPASS: Check for env variable token first, then dev bypass\n if (isDevBypassActive(config?.devBypass)) {\n // Check for VITE_DEV_TOKEN env variable first (real token in dev)\n const envToken = import.meta.env.VITE_DEV_TOKEN;\n if (envToken) {\n const validation = validateToken(envToken, config?.gracePeriodMs);\n if (validation.isValid && validation.payload) {\n storeToken(envToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: envToken,\n user: validation.payload,\n error: null,\n });\n return;\n }\n console.warn(\n \"[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user\",\n );\n }\n\n // No valid env token - use synthetic dev user\n console.warn(\n \"[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token.\",\n );\n const devUser = createDevUser();\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: devUser,\n error: null,\n });\n return;\n }\n\n // 1. Try to get token from URL first (fresh authentication)\n const tokenKey = config?.tokenKey ?? \"fluidUserToken\";\n let candidateToken = extractTokenFromUrl(tokenKey);\n\n // Fallback: auth.fluid.app returns the token as \"jwt\", not \"fluidUserToken\"\n if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {\n candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n }\n\n // Clean token from URL immediately after extraction (security)\n // Do this BEFORE validation so the URL is clean even if validation fails\n cleanTokenFromUrl(tokenKey);\n cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n\n // 2. Fall back to stored token\n if (!candidateToken) {\n candidateToken = getStoredToken(config);\n }\n\n // 3. If we have a token, validate it\n if (candidateToken) {\n let payload: JWTPayload | null = null;\n\n if (config?.jwksUrl) {\n // Signature verification enabled - use verifyToken\n payload = await verifyToken(candidateToken, config.jwksUrl);\n if (!payload) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"JWT signature verification failed\"),\n });\n handleAuthFailure();\n return;\n }\n // Also check expiration\n if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"Token has expired\"),\n });\n handleAuthFailure();\n return;\n }\n } else {\n // No JWKS - existing behavior (decode only, check expiration)\n const validation = validateToken(\n candidateToken,\n config?.gracePeriodMs,\n );\n if (validation.isValid && validation.payload) {\n payload = validation.payload;\n } else {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(validation.error ?? \"Invalid token\"),\n });\n handleAuthFailure();\n return;\n }\n }\n\n // Valid token - store it and update state\n storeToken(candidateToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: candidateToken,\n user: payload,\n error: null,\n });\n } else {\n // No token available\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"No authentication token found\"),\n });\n handleAuthFailure();\n }\n } catch (err) {\n const authError =\n err instanceof Error ? err : new Error(\"Authentication error\");\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: authError,\n });\n handleAuthFailure();\n } finally {\n dispatch({ type: \"DONE_LOADING\" });\n }\n };\n\n void initializeAuth();\n // Only run on mount - config changes don't re-initialize\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear auth handler\n const clearAuth = useCallback(() => {\n clearTokens(configRef.current);\n dispatch({ type: \"CLEAR_AUTH\" });\n }, []);\n\n // Memoize context value\n // Use `satisfies` to validate shape at compile time while preserving inference\n const contextValue = useMemo(\n () =>\n ({\n isAuthenticated: user !== null,\n isLoading,\n user,\n token,\n clearAuth,\n error,\n }) satisfies FluidAuthContextValue,\n [token, isLoading, user, clearAuth, error],\n );\n\n return (\n <FluidAuthContext.Provider value={contextValue}>\n {children}\n </FluidAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access the auth context directly.\n * Prefer using `useFluidAuth` for most use cases.\n *\n * @throws Error if used outside FluidAuthProvider\n */\nexport function useFluidAuthContext(): FluidAuthContextValue {\n const context = useContext(FluidAuthContext);\n\n if (!context) {\n throw new Error(\n \"useFluidAuthContext must be used within a FluidAuthProvider. \" +\n \"Wrap your app with <FluidAuthProvider> to use authentication features.\",\n );\n }\n\n return context;\n}\n\n/** Safe accessor — returns null when outside FluidAuthProvider (no throw) */\nexport function useFluidAuthOptional(): FluidAuthContextValue | null {\n return useContext(FluidAuthContext);\n}\n","import type { ApiDataSource, DataSourceContext } from \"../types\";\n\n/**\n * Extracts a value from an object using dot notation path\n * e.g., getByPath({ data: { items: [1,2,3] } }, 'data.items') => [1,2,3]\n */\nfunction getByPath(obj: unknown, path: string): unknown {\n return path.split(\".\").reduce((current, key) => {\n if (current && typeof current === \"object\" && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Replaces {variable} placeholders in an endpoint path with values from the\n * variables map. E.g., \"/reps/{rep_id}/most_shared\" with { rep_id: \"42\" }\n * becomes \"/reps/42/most_shared\".\n */\nfunction interpolateVariables(\n endpoint: string,\n variables?: Record<string, string>,\n): string {\n if (!variables) return endpoint;\n const resolved = endpoint.replace(\n /\\{(\\w+)\\}/g,\n (match, key: string) => variables[key] ?? match,\n );\n const unresolved = resolved.match(/\\{(\\w+)\\}/g);\n if (unresolved) {\n console.warn(\n `[DataSource] Unresolved variable placeholders in endpoint: ${unresolved.join(\", \")}. ` +\n `Endpoint: \"${endpoint}\". Available variables: ${Object.keys(variables).join(\", \") || \"(none)\"}`,\n );\n }\n return resolved;\n}\n\n/**\n * Resolves the full URL for an endpoint.\n * - Substitutes {variable} placeholders from context variables\n * - Absolute URLs (starting with http:// or https://) are used as-is\n * - Relative paths are prefixed with the context's baseUrl\n */\nfunction resolveEndpointUrl(\n endpoint: string,\n baseUrl?: string,\n variables?: Record<string, string>,\n): string {\n const resolved = interpolateVariables(endpoint, variables);\n\n // If endpoint is already absolute, use it directly\n if (resolved.startsWith(\"http://\") || resolved.startsWith(\"https://\")) {\n return resolved;\n }\n\n // If we have a baseUrl, prepend it to the relative endpoint\n if (baseUrl) {\n // Ensure proper joining (no double slashes)\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = resolved.startsWith(\"/\") ? resolved : `/${resolved}`;\n return `${base}${path}`;\n }\n\n // No baseUrl provided, return endpoint as-is (will likely fail for relative paths)\n return resolved;\n}\n\n/**\n * Default API fetcher implementation\n */\nexport async function apiFetcher(\n source: ApiDataSource,\n context: DataSourceContext,\n): Promise<unknown> {\n const { endpoint, method = \"GET\", headers = {}, body } = source;\n\n // Merge context variables with per-source variables (source overrides context)\n const mergedVariables = { ...context.variables, ...source.variables };\n\n // Resolve the full URL, substituting variables and using baseUrl for relative endpoints\n const url = resolveEndpointUrl(endpoint, context.baseUrl, mergedVariables);\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n \"content-type\": \"application/json\",\n ...context.getApiHeaders?.(),\n ...headers,\n },\n signal: context.signal,\n };\n\n if (body && (method === \"POST\" || method === \"PUT\")) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(\n `API request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n // Extract data at resultPath if specified\n if (source.resultPath) {\n return getByPath(data, source.resultPath);\n }\n\n return data;\n}\n","import type {\n CustomDataSource,\n DataSourceContext,\n SelectedItem,\n ShareableType,\n} from \"../types\";\n\n/**\n * Individual resource endpoints for each shareable type.\n * These fetch single items by ID from the company API.\n */\nconst SHAREABLE_ENDPOINTS: Record<\n ShareableType,\n (id: string | number) => string\n> = {\n Medium: (id) => `/company/media/${id}`,\n Page: (id) => `/company/pages/${id}`,\n Library: (id) => `/company/libraries/${id}`,\n Product: (id) => `/company/v1/products/${id}`,\n EnrollmentPack: (id) => `/enrollment_packs/${id}`,\n};\n\n/**\n * Extract the actual resource data from various API response structures.\n * Different endpoints wrap their data differently:\n * - Product: { status, resource: { product: {...} } }\n * - EnrollmentPack: { status, resource: { enrollment_pack: {...} } }\n * - Medium/Page/Library: Direct root or { medium: {...} }\n */\nfunction extractResourceData(\n json: Record<string, unknown>,\n shareableType: ShareableType,\n): Record<string, unknown> {\n // Try nested resource structure first (Product, EnrollmentPack)\n const resource = json.resource as Record<string, unknown> | undefined;\n if (resource) {\n // Check for type-specific key within resource\n const typeKey = shareableType.toLowerCase().replace(\"pack\", \"_pack\");\n if (resource[typeKey]) {\n return resource[typeKey] as Record<string, unknown>;\n }\n // Check common keys\n if (resource.product) return resource.product as Record<string, unknown>;\n if (resource.enrollment_pack)\n return resource.enrollment_pack as Record<string, unknown>;\n }\n\n // Try direct type key (e.g., { medium: {...} })\n const directKey = shareableType.toLowerCase().replace(\"pack\", \"_pack\");\n if (json[directKey]) {\n return json[directKey] as Record<string, unknown>;\n }\n\n // Try common response shapes\n if (json.data) return json.data as Record<string, unknown>;\n if (json.medium) return json.medium as Record<string, unknown>;\n if (json.page) return json.page as Record<string, unknown>;\n if (json.library) return json.library as Record<string, unknown>;\n if (json.product) return json.product as Record<string, unknown>;\n if (json.enrollment_pack)\n return json.enrollment_pack as Record<string, unknown>;\n\n // Return as-is if no wrapper found (Library uses direct serialization)\n return json;\n}\n\n/**\n * Result from fetching a single shareable item\n */\ninterface FetchResult {\n item: SelectedItem;\n data: unknown;\n error?: Error;\n}\n\n/**\n * Fetch a single shareable item by ID from the individual resource endpoint.\n */\nasync function fetchSingleItem(\n item: SelectedItem,\n signal: AbortSignal,\n baseUrl: string = \"\",\n getApiHeaders?: () => Record<string, string>,\n): Promise<FetchResult> {\n const getEndpoint = SHAREABLE_ENDPOINTS[item.shareableType];\n if (!getEndpoint) {\n return {\n item,\n data: null,\n error: new Error(`Unknown shareable type: ${item.shareableType}`),\n };\n }\n\n const endpoint = `${baseUrl}${getEndpoint(item.id)}`;\n\n try {\n const response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n ...getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n return {\n item,\n data: null,\n error: new Error(\n `Failed to fetch ${item.shareableType} with ID ${item.id}: ${response.status}`,\n ),\n };\n }\n\n const json = await response.json();\n\n // Extract the actual resource data from the response wrapper\n const resourceData = extractResourceData(json, item.shareableType);\n\n // Add shareable_type to the response for transformer compatibility\n if (resourceData && typeof resourceData === \"object\") {\n (resourceData as Record<string, unknown>).shareable_type =\n item.shareableType;\n }\n\n return { item, data: resourceData };\n } catch (error) {\n return {\n item,\n data: null,\n error:\n error instanceof Error\n ? error\n : new Error(\n `Unknown error fetching ${item.shareableType} ${item.id}`,\n ),\n };\n }\n}\n\n/**\n * Custom fetcher that fetches selected items.\n *\n * Fetches items from individual resource endpoints using the configured\n * getApiHeaders for authentication.\n *\n * Fetches all items in parallel for performance.\n * Returns an array of successfully fetched items, preserving order.\n * Logs warnings for failed fetches but doesn't throw.\n */\nexport async function customFetcher(\n source: CustomDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { selectedItems } = source;\n if (!selectedItems || selectedItems.length === 0) {\n return [];\n }\n\n // Fallback: fetch from individual endpoints (no auth)\n const results = await Promise.all(\n selectedItems.map((item) =>\n fetchSingleItem(\n item,\n context.signal,\n context.baseUrl,\n context.getApiHeaders,\n ),\n ),\n );\n\n // Process results, collecting successful data and tracking errors\n const successfulData: unknown[] = [];\n const errors: Error[] = [];\n\n for (const result of results) {\n if (result.error) {\n console.warn(\n `[CustomFetcher] Failed to fetch ${result.item.shareableType} #${result.item.id}:`,\n result.error.message,\n );\n errors.push(result.error);\n continue;\n }\n\n if (result.data) {\n successfulData.push(result.data);\n }\n }\n\n // Throw error if all fetches failed\n if (successfulData.length === 0 && errors.length > 0) {\n throw new Error(\n `Failed to fetch all ${errors.length} item(s): ${errors[0]?.message || \"Unknown error\"}`,\n );\n }\n\n return successfulData;\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport type {\n StaticDataSource,\n DataSourceContext,\n StaticSourceType,\n StaticItem,\n} from \"../types\";\n\n/**\n * Endpoint patterns for fetching products by static source type.\n * Tags require backend API support (not yet available).\n */\nconst STATIC_ENDPOINTS: Record<\"collections\" | \"categories\", string> = {\n collections: \"/company/v1/products\",\n categories: \"/company/v1/products\",\n};\n\n/**\n * Query parameter names for each static source type.\n */\nconst STATIC_QUERY_PARAMS: Record<\"collections\" | \"categories\", string> = {\n collections: \"collection_id\",\n categories: \"category_id\",\n};\n\n/**\n * Extract products array from API response.\n * The /company/v1/products endpoint returns { products: [...], meta: {...} }\n */\nfunction extractProducts(json: Record<string, unknown>): unknown[] {\n if (Array.isArray(json.products)) {\n return json.products;\n }\n if (Array.isArray(json.data)) {\n return json.data;\n }\n if (Array.isArray(json)) {\n return json;\n }\n console.warn(\n \"[extractProducts] Could not find products array. Available keys:\",\n Object.keys(json),\n );\n return [];\n}\n\n/**\n * Static data source fetcher.\n *\n * Fetches products filtered by collection or category ID.\n * Tags are not yet supported (requires backend API changes).\n *\n * @param source - The static data source configuration\n * @param context - The data source context with baseUrl and headers\n * @returns Array of products matching the filter criteria\n */\nexport async function staticFetcher(\n source: StaticDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { staticType, selectedId } = source;\n\n // Tags require backend API support - not yet implemented\n if (staticType === \"tags\") {\n throw new Error(\n \"Tags data source is not yet supported. Please select Collections or Categories instead.\",\n );\n }\n\n const endpoint = STATIC_ENDPOINTS[staticType];\n const queryParam = STATIC_QUERY_PARAMS[staticType];\n\n if (!endpoint || !queryParam) {\n throw new Error(\n `Invalid data source configuration: \"${staticType}\" is not a supported static source type.`,\n );\n }\n\n const url = new URL(\n `${context.baseUrl ?? \"\"}${endpoint}`,\n context.baseUrl ? undefined : window.location.origin,\n );\n url.searchParams.set(queryParam, String(selectedId));\n\n try {\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...context.getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: context.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = await response.json();\n return extractProducts(json);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n // Request was cancelled, don't log as error\n return [];\n }\n console.error(\n `[staticFetcher] Error fetching ${staticType} ${selectedId}:`,\n error,\n );\n throw error;\n }\n}\n\n/**\n * Endpoints for listing static source items (collections, categories, tags).\n */\nconst LIST_ENDPOINTS: Record<\n StaticSourceType,\n { endpoint: string; resultKey: string }\n> = {\n collections: {\n endpoint: \"/company/v1/collections\",\n resultKey: \"collections\",\n },\n categories: { endpoint: \"/company/v1/categories\", resultKey: \"categories\" },\n tags: { endpoint: \"/company/v1/tags\", resultKey: \"tags\" },\n};\n\n/**\n * Result type for useStaticSourceItems hook.\n */\nexport interface UseStaticSourceItemsResult {\n /** The fetched items */\n items: StaticItem[];\n /** True while items are being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n/**\n * React hook for fetching static source items (collections, categories).\n * Handles loading state, error state, abort on cleanup, and search filtering.\n *\n * @param staticType - The type of static source to fetch, or null to reset\n * @param context - Context with baseUrl and getApiHeaders\n * @param params - Optional search parameters\n * @returns Object with items, isLoading, and error state\n */\nexport function useStaticSourceItems(\n staticType: StaticSourceType | null,\n context: Pick<DataSourceContext, \"baseUrl\" | \"getApiHeaders\">,\n params?: { search?: string },\n): UseStaticSourceItemsResult {\n const [items, setItems] = useState<StaticItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Extract stable references from context to avoid dependency issues\n const { baseUrl, getApiHeaders } = context;\n const search = params?.search;\n\n // Use ref to avoid infinite re-renders when getApiHeaders changes reference\n const getApiHeadersRef = useRef(getApiHeaders);\n getApiHeadersRef.current = getApiHeaders;\n\n useEffect(() => {\n if (!staticType) {\n setItems([]);\n setError(null);\n return;\n }\n\n let isCancelled = false;\n const abortController = new AbortController();\n setIsLoading(true);\n setError(null);\n\n const config = LIST_ENDPOINTS[staticType];\n const url = new URL(\n `${baseUrl ?? \"\"}${config.endpoint}`,\n baseUrl ? undefined : window.location.origin,\n );\n\n if (search) {\n url.searchParams.set(\"search\", search);\n }\n\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...getApiHeadersRef.current?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: abortController.signal,\n })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch ${staticType}: ${response.status}`);\n }\n const json = await response.json();\n const responseItems = json[config.resultKey] as Array<{\n id: string | number;\n title: string;\n image_url?: string;\n }>;\n\n if (!Array.isArray(responseItems)) {\n console.warn(\n `[useStaticSourceItems] Expected array at \"${config.resultKey}\" but got:`,\n typeof responseItems,\n );\n if (!isCancelled) {\n setItems([]);\n }\n return;\n }\n\n if (!isCancelled) {\n setItems(\n responseItems.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: item.image_url,\n })),\n );\n }\n })\n .catch((err) => {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Log for debugging\n console.error(\n `[useStaticSourceItems] Failed to fetch ${staticType}:`,\n err,\n );\n\n if (isCancelled) return;\n\n setError(\"An unexpected error occurred. Please try again.\");\n setItems([]);\n })\n .finally(() => {\n if (!isCancelled) {\n setIsLoading(false);\n }\n });\n\n return () => {\n isCancelled = true;\n abortController.abort();\n };\n }, [staticType, search, baseUrl]);\n\n return { items, isLoading, error };\n}\n","/**\n * Widget Transformers\n *\n * Transform functions that map API response data to widget-specific prop shapes.\n * Each widget has one transformer that handles all data structure variants:\n * - Standard: Direct field name match\n * - Legacy: Different field names that need mapping\n * - Minimal: Bare minimum fields that need defaults\n *\n * Usage:\n * 1. Transformers are registered in the DataSourceRegistry\n * 2. Reference by name in ApiDataSource.transform\n * 3. Applied after resultPath extraction, before targetProps assignment\n */\n\nimport type { DataTransformer, DataSource } from \"./types\";\n\n/**\n * Helper to extract image URL from various API response structures.\n * Handles:\n * - Flat fields (Medium, Page, Product): image_url, imageUrl, thumbnail_url, src\n * - Nested images array (EnrollmentPack): images[0].image_url\n * - Nested library_items (Library): library_items[0].relateable.image_url\n */\nfunction extractImageUrl(d: Record<string, unknown>): string {\n // Try flat fields first (Medium, Page, Product)\n if (d.image_url) return d.image_url as string;\n if (d.imageUrl) return d.imageUrl as string;\n if (d.thumbnail_url) return d.thumbnail_url as string;\n if (d.src) return d.src as string;\n\n // Try nested images array (EnrollmentPack)\n const images = d.images as Array<Record<string, unknown>> | undefined;\n if (images && images.length > 0) {\n const firstImage = images[0];\n if (firstImage?.image_url) return firstImage.image_url as string;\n if (firstImage?.url) return firstImage.url as string;\n }\n\n // Try nested library_items (Library/Playlist)\n const libraryItems = d.library_items as\n | Array<Record<string, unknown>>\n | undefined;\n if (libraryItems && libraryItems.length > 0) {\n const firstItem = libraryItems[0];\n const relateable = firstItem?.relateable as\n | Record<string, unknown>\n | undefined;\n if (relateable?.image_url) return relateable.image_url as string;\n if (relateable?.imageUrl) return relateable.imageUrl as string;\n if (relateable?.thumbnail_url) return relateable.thumbnail_url as string;\n }\n\n return \"\";\n}\n\n/**\n * Helper to extract description from various API response structures.\n * Handles different field names across endpoints.\n */\nfunction extractDescription(d: Record<string, unknown>): string {\n // Try various description field names\n const desc =\n d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? \"\";\n\n // Handle nested description object (some APIs return { body: \"...\" })\n if (typeof desc === \"object\" && desc !== null && \"body\" in desc) {\n return ((desc as Record<string, unknown>).body as string) ?? \"\";\n }\n\n return desc as string;\n}\n\n/**\n * Helper to extract custom widget config from a selected item.\n */\nfunction extractCustomWidgetConfig(\n d: Record<string, unknown>,\n source: DataSource | undefined,\n): Record<string, unknown> {\n if (source === undefined || source.type !== \"custom\") return {};\n\n const selectedItem = source.selectedItems.find(\n (s) => String(s.id) === String(d.id),\n );\n return selectedItem?.widgetConfig ?? {};\n}\n\n/**\n * ImageWidget transformer from shareable data\n */\nconst toImagePropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", alt: \"Image\", objectFit: \"cover\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: extractImageUrl(d),\n alt: (d.title ?? d.name ?? d.alt ?? \"Image\") as string,\n objectFit: \"cover\" as const,\n };\n};\n\n/**\n * VideoWidget transformer from shareable data\n */\nconst toVideoPropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", poster: \"\", caption: \"\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: ((d.video_url ?? d.videoUrl ?? d.src) as string) || \"\",\n poster: extractImageUrl(d),\n caption: (d.title ?? d.name ?? d.caption ?? \"\") as string,\n };\n};\n\n/**\n * Shareable content transformer\n * Normalizes shareable API responses to a consistent format\n */\nconst toShareableProps: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n // Derive a fallback shareable type from the data source configuration.\n // API presets pass shareable_type in their variables (e.g., \"products\").\n // Custom sources store it per-item (handled below).\n const sourceTypeHint =\n source?.type === \"api\" ? source.variables?.shareable_type : undefined;\n\n return data.map((item: unknown) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n // Resolve shareable type from the item itself, then fall back to source hint\n const shareableType = (d.type ??\n d.relateable_type ??\n d.shareable_type ??\n d.shareableType ??\n sourceTypeHint ??\n \"\") as string;\n\n return {\n id: d.id,\n title: (d.title ?? d.name ?? \"\") as string,\n description: extractDescription(d),\n imageUrl: extractImageUrl(d),\n videoUrl: ((d.video_url ?? d.videoUrl) as string) || null,\n shareableType,\n kind: (d.kind ?? \"image\") as string,\n status: (d.status ?? \"active\") as string,\n wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,\n subscriptionPrice: d.subscription_price ?? null,\n outOfStock: d.out_of_stock ?? false,\n lowInStock: d.low_in_stock ?? false,\n ...d,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * Carousel slides from shareables transformer\n */\nconst toCarouselSlidesFromShareables: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown, index: number) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n const imageUrl = extractImageUrl(d);\n const isVideo = d.kind === \"video\" || d.videoUrl || d.video_url;\n const title = (d.title ?? d.name ?? \"\") as string;\n\n const content = isVideo\n ? {\n type: \"VideoWidget\",\n props: {\n src: ((d.videoUrl ?? d.video_url) as string) || \"\",\n poster: imageUrl,\n caption: title,\n },\n }\n : {\n type: \"ImageWidget\",\n props: {\n src: imageUrl,\n alt: title || \"Slide image\",\n objectFit: \"cover\",\n },\n };\n\n const baseSlide = {\n id: String(d.id ?? `slide-${index}`),\n content,\n title,\n description: extractDescription(d),\n };\n\n return {\n ...baseSlide,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * All widget transformers bundled for registration\n */\nexport const WIDGET_TRANSFORMERS: Record<string, DataTransformer> = {\n toShareableProps,\n toCarouselSlidesFromShareables,\n toImagePropsFromShareable,\n toVideoPropsFromShareable,\n};\n","import type {\n DataSourceRegistry,\n DataFetcher,\n DataTransformer,\n DataSourceType,\n} from \"./types\";\nimport { apiFetcher } from \"./fetchers/api\";\nimport { customFetcher } from \"./fetchers/custom\";\nimport { staticFetcher } from \"./fetchers/static\";\nimport { WIDGET_TRANSFORMERS } from \"./transformers\";\n\nexport interface CreateDataSourceRegistryOptions {\n /** Custom fetchers to add or override */\n fetchers?: Partial<Record<DataSourceType, DataFetcher>>;\n /** Custom transform functions */\n transformers?: Record<string, DataTransformer>;\n}\n\n/**\n * Creates a data source registry with default fetchers.\n * Users can extend this with custom fetchers and transformers.\n */\nexport function createDataSourceRegistry(\n options?: CreateDataSourceRegistryOptions,\n): DataSourceRegistry {\n return {\n fetchers: {\n api: apiFetcher,\n custom: customFetcher,\n static: staticFetcher,\n ...options?.fetchers,\n } as Record<DataSourceType, DataFetcher>,\n transformers: {\n ...WIDGET_TRANSFORMERS,\n ...options?.transformers,\n },\n };\n}\n\n/** Default registry instance */\nexport const DEFAULT_DATA_SOURCE_REGISTRY: DataSourceRegistry =\n createDataSourceRegistry();\n","import type React from \"react\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { DataSourceRegistry } from \"./types\";\nimport { DEFAULT_DATA_SOURCE_REGISTRY } from \"./registry\";\nimport { DataSourceProvider } from \"./context\";\n\ninterface DataSourceRegistryContextValue {\n registry: DataSourceRegistry;\n baseUrl?: string | undefined;\n /** Get API headers function */\n getApiHeaders?: (() => Record<string, string>) | undefined;\n /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string> | undefined;\n}\n\nconst DataSourceRegistryContext = createContext<DataSourceRegistryContextValue>(\n {\n registry: DEFAULT_DATA_SOURCE_REGISTRY,\n },\n);\n\nexport interface DataSourceRegistryProviderProps {\n registry?: DataSourceRegistry | undefined;\n /** Base URL for API calls (e.g., \"https://api.fluid.app/api\") */\n baseUrl?: string | undefined;\n /**\n * Get API headers function\n */\n getApiHeaders?: (() => Record<string, string>) | undefined;\n /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string> | undefined;\n children: ReactNode;\n}\n\n/**\n * Provides data source registry and configuration to all descendants.\n * If no registry is provided, uses the default.\n * Also provides the shared DataSourceProvider from portal-core so that\n * portal-widgets hooks can access baseUrl and getApiHeaders.\n */\nexport function DataSourceRegistryProvider({\n registry,\n baseUrl,\n getApiHeaders,\n variables,\n children,\n}: DataSourceRegistryProviderProps): React.JSX.Element {\n const value = useMemo(\n () => ({\n registry: registry ?? DEFAULT_DATA_SOURCE_REGISTRY,\n baseUrl,\n getApiHeaders,\n variables,\n }),\n [registry, baseUrl, getApiHeaders, variables],\n );\n\n return (\n <DataSourceRegistryContext.Provider value={value}>\n <DataSourceProvider baseUrl={baseUrl} getApiHeaders={getApiHeaders}>\n {children}\n </DataSourceProvider>\n </DataSourceRegistryContext.Provider>\n );\n}\n\n/**\n * Hook to access the data source registry.\n */\nexport function useDataSourceRegistry(): DataSourceRegistry {\n return useContext(DataSourceRegistryContext).registry;\n}\n\n/**\n * Hook to access the full data source registry context (registry + config).\n */\nexport function useDataSourceRegistryConfig(): DataSourceRegistryContextValue {\n return useContext(DataSourceRegistryContext);\n}\n","import type { ComponentType } from \"react\";\nimport type { WidgetSchema, TypedWidgetSchema } from \"../types\";\nimport type { ShareableItem } from \"../types/shareable-item\";\nimport type { WidgetManifest } from \"../registries/widget-manifest\";\n\nexport function createWidgetRegistry<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, ComponentType<any>>,\n>(registry: T, plugins?: WidgetManifest[]): T {\n if (!plugins || plugins.length === 0) {\n return registry;\n }\n\n const pluginEntries = Object.fromEntries(\n plugins.map((p) => [p.type, p.component]),\n );\n\n return { ...registry, ...pluginEntries } as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createScreen<T extends Record<string, ComponentType<any>>>(\n registry: T,\n widgets: TypedWidgetSchema<T>[],\n): TypedWidgetSchema<T>[] {\n // Validate that all widget types exist in the registry at runtime\n widgets.forEach((widget) => {\n if (!(widget.type in registry)) {\n throw new Error(\n `Widget type \"${String(widget.type)}\" not found in registry`,\n );\n }\n });\n return widgets;\n}\n\n// Helper to create WidgetSchema from shareable item\nexport function createWidgetFromShareable(item: ShareableItem): WidgetSchema {\n const isVideo = item.kind === \"video\" || !!item.videoUrl;\n\n if (isVideo && item.videoUrl) {\n return {\n type: \"VideoWidget\",\n props: {\n src: item.videoUrl,\n poster: item.imageUrl,\n caption: item.title,\n },\n };\n }\n\n return {\n type: \"ImageWidget\",\n props: {\n src: item.imageUrl,\n alt: item.title || \"Image\",\n objectFit: \"cover\",\n },\n };\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createFluidClient, type FluidClient } from \"../client/fluid-client\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { useFluidAuthOptional } from \"./FluidAuthProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/portal-core/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/portal-widgets/contexts\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../client/types\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** Configured API client instance */\n readonly client: FluidClient;\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Portal SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{\n * baseUrl: \"https://api.fluid.app/api\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps): React.JSX.Element {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n },\n },\n }),\n [],\n );\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Recreate client only when baseUrl changes (primitive dependency).\n // Wrap callbacks in closures so they always read the latest from configRef,\n // avoiding stale captures when parent passes new getAuthToken/onAuthError.\n const client = useMemo(\n () =>\n createFluidClient({\n ...configRef.current,\n getAuthToken: () => configRef.current.getAuthToken?.() ?? null,\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Context value only changes when client changes\n const contextValue = useMemo(\n () => ({ client, config: configRef.current }) satisfies FluidContextValue,\n [client],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // getAuthToken is typically a synchronous cookie/localStorage read,\n // so we call it and use the result if it's a string (not a Promise).\n const getApiHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const getAuthToken = configRef.current.getAuthToken;\n if (typeof getAuthToken === \"function\") {\n const tokenOrPromise = getAuthToken();\n // Only use synchronous results — async tokens are handled by the SDK client\n if (typeof tokenOrPromise === \"string\") {\n headers.Authorization = `Bearer ${tokenOrPromise}`;\n }\n }\n\n return headers;\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Auto-derive rep_id from auth context for data source path interpolation\n const authContext = useFluidAuthOptional();\n\n const autoVariables = useMemo(() => {\n if (authContext?.user?.id != null) {\n return { rep_id: String(authContext.user.id) };\n }\n return undefined;\n }, [authContext?.user?.id]);\n\n // Explicit prop takes precedence over auto-derived variables\n const effectiveVariables = variables ?? autoVariables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <DataSourceRegistryProvider\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n >\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </DataSourceRegistryProvider>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,42],"mappings":"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"}
1
+ {"version":3,"file":"FluidProvider-x96kqsgN.mjs","names":["ApiError","encode","decode","parse","crypto","decode","importJWK","decodeBase64URL","asKeyObject","jwk.isJWK","jwk.isSecretJWK","isKeyLike","invalidKeyInput","jwk.isPrivateJWK","jwk.isPublicJWK","normalize","invalidKeyInput","crypto","getVerifyKey","subtleAlgorithm","crypto","base64url","secs","epoch","jwtPayload","clone","base64url.encode","base64url.decode","base64url","isString","fluidOs.getFluidOSManifest"],"sources":["../../../platform/api-client-core/src/fetch-client.ts","../../../api-clients/fluidos/src/namespaces/fluid_os.ts","../src/client/types.ts","../../../platform/auth/src/types.ts","../../../platform/auth/src/constants.ts","../../../platform/auth/src/browser-utils.ts","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/webcrypto.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/buffer_utils.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/errors.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/crypto_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/invalid_key_input.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/is_key_like.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_disjoint.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_object.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/check_key_length.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_jwk.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/jwk_to_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/normalize_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/key/import.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/check_key_type.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_crit.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_algorithms.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/subtle_dsa.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/flattened/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/compact/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/epoch.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/secs.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/jwt_claims_set.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwt/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/local.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/fetch_jwks.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/remote.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/decode_jwt.js","../../../platform/auth/src/token-utils.ts","../../../platform/auth/src/token-storage.ts","../../../platform/auth/src/url-token.ts","../../../platform/auth/src/dev-utils.ts","../../../platform/auth/src/auth-redirect.ts","../../../../node_modules/.pnpm/colorjs.io@0.5.2/node_modules/colorjs.io/dist/color.js","../../core/src/theme/types.ts","../../core/src/theme/color-engine.ts","../../core/src/theme/tailwind-overrides.ts","../../core/src/theme/css-generator.ts","../../core/src/theme/defaults.ts","../../core/src/theme/serialisation.ts","../../core/src/theme/transforms.ts","../../core/src/theme/theme-applicator.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/client/fluid-client.ts","../src/providers/FluidThemeProvider.tsx","../src/providers/FluidAuthProvider.tsx","../../core/src/data-sources/fetchers/api.ts","../../core/src/data-sources/fetchers/custom.ts","../../core/src/data-sources/fetchers/static.ts","../../core/src/data-sources/transformers.ts","../../core/src/data-sources/registry.ts","../../core/src/data-sources/registry-context.tsx","../../core/src/widget-utils/utils.ts","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx"],"sourcesContent":["/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\nexport interface FetchClientInstance {\n request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n requestWithFormData: <TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n },\n ) => Promise<TResponse>;\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(\n config: FetchClientConfig,\n): FetchClientInstance {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n // Read body as text first to avoid SyntaxError from response.json()\n // when server returns non-JSON bodies with application/json content-type.\n const errorText = await response.text().catch(() => \"\");\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(errorText);\n } catch {\n throw new ApiError(\n errorText.slice(0, 200) ||\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n const msg = (data.message || data.error_message) as string | undefined;\n throw new ApiError(\n msg || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request: request,\n requestWithFormData: requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = FetchClientInstance;\n","/**\n * Generated API client functions for fluid_os\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/fluid_os\";\n\n// ============================================================================\n// Fluid OS - Definitions\n// ============================================================================\n\n/**\n * List Fluid OS definitions\n * Retrieve a list of Fluid OS definitions for the current company\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listFluidOSDefinitions(\n client: FetchClient,\n params?: operations[\"listFluidOSDefinitions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSDefinitions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions`, params);\n}\n\n/**\n * Create a Fluid OS definition\n * Create a new Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createFluidOSDefinition(\n client: FetchClient,\n body: operations[\"createFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/fluid_os/definitions`, body);\n}\n\n/**\n * Get a Fluid OS definition\n * Retrieve a specific Fluid OS definition with all associations\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions/${id}`);\n}\n\n/**\n * Update a Fluid OS definition\n * Update an existing Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/company/fluid_os/definitions/${id}`, body);\n}\n\n/**\n * Delete a Fluid OS definition\n * Delete a Definition\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/fluid_os/definitions/${id}`);\n}\n\n// ============================================================================\n// Fluid OS - Navigation Items\n// ============================================================================\n\n/**\n * List navigation items for a navigation\n * Retrieve a list of navigation items for a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n */\nexport async function listFluidOSNavigationItems(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n): Promise<\n operations[\"listFluidOSNavigationItems\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n );\n}\n\n/**\n * Create a navigation item\n * Create a new navigation item for a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param body - body\n */\nexport async function createFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n body: operations[\"createFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n body,\n );\n}\n\n/**\n * Get a specific navigation item\n * Retrieve a specific navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function getFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n/**\n * Update a navigation item\n * Update an existing navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation item\n * Delete a navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Navigations\n// ============================================================================\n\n/**\n * List navigations for a Fluid OS definition\n * Retrieve a list of navigations for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSNavigations(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSNavigations\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSNavigations\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n params,\n );\n}\n\n/**\n * Create a navigation for a Fluid OS definition\n * Create a new navigation for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n body,\n );\n}\n\n/**\n * Get a specific navigation\n * Retrieve a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n/**\n * Update a navigation\n * Update an existing navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation\n * Delete a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Profiles\n// ============================================================================\n\n/**\n * List profiles for a Fluid OS definition\n * Retrieve a list of profiles for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSProfiles(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSProfiles\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSProfiles\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n params,\n );\n}\n\n/**\n * Create a profile for a Fluid OS definition\n * Create a new profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n body,\n );\n}\n\n/**\n * Get the default profile\n * Retrieve the default profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function getDefaultFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"getDefaultFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/default`,\n );\n}\n\n/**\n * Get a specific profile\n * Retrieve a specific profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n/**\n * Update a profile\n * Update an existing profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n body,\n );\n}\n\n/**\n * Delete a profile\n * Delete a profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Public\n// ============================================================================\n\n/**\n * Get active Fluid OS definition\n * Retrieve the active Fluid OS definition manifest for a specific platform\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function getFluidOSManifest(\n client: FetchClient,\n params: operations[\"getFluidOSManifest\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getFluidOSManifest\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/fluid_os/definitions/active`, params);\n}\n\n// ============================================================================\n// Fluid OS - Screens\n// ============================================================================\n\n/**\n * List screens for a Fluid OS definition\n * Retrieve a list of screens for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSScreens(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSScreens\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSScreens\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n params,\n );\n}\n\n/**\n * Create a screen for a Fluid OS definition\n * Create a new screen for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n body,\n );\n}\n\n/**\n * Get a specific screen\n * Retrieve a specific screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n/**\n * Update a screen\n * Update an existing screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n body,\n );\n}\n\n/**\n * Delete a screen\n * Delete a screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Themes\n// ============================================================================\n\n/**\n * List themes for a Fluid OS definition\n * Retrieve a list of themes for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSThemes(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSThemes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSThemes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n params,\n );\n}\n\n/**\n * Create a theme for a Fluid OS definition\n * Create a new theme for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n body,\n );\n}\n\n/**\n * Get a specific theme\n * Retrieve a specific theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n/**\n * Update a theme\n * Update an existing theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n body,\n );\n}\n\n/**\n * Delete a theme\n * Delete a theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Versions\n// ============================================================================\n\n/**\n * List versions for a Fluid OS definition\n * Retrieve a list of published versions for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSVersions(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSVersions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSVersions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n params,\n );\n}\n\n/**\n * Publish a new version of a Fluid OS definition\n * Publish a new version of the Fluid OS definition. This creates a snapshot of the current definition state including all screens, profiles, themes, and navigations. No request body is required - the manifest is built automatically from the current definition state.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function createFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"createFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n );\n}\n\n/**\n * Get a specific version\n * Retrieve a specific published version including its manifest\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n );\n}\n\n/**\n * Update a version\n * Update a version. Currently only supports activating/deactivating a version.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSVersion\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n body,\n );\n}\n","// ============================================================================\n// HTTP Method Constants\n// ============================================================================\n\n/**\n * HTTP methods supported by the API client.\n * Use `as const` for literal type inference and type safety.\n */\nexport const HTTP_METHODS = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n PATCH: \"PATCH\",\n DELETE: \"DELETE\",\n} as const;\n\n/**\n * Union type of all supported HTTP methods.\n * Derived from HTTP_METHODS constant to avoid duplication.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[keyof typeof HTTP_METHODS];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Fluid SDK client.\n * Use Readonly<FluidSDKConfig> when the config should not be modified after creation.\n */\nexport interface FluidSDKConfig {\n /**\n * Base URL for the Fluid API domain (e.g., \"https://api.fluid.app\").\n * Endpoints include their full path from root (e.g., \"/api/me\").\n */\n readonly baseUrl: string;\n\n /**\n * Function to retrieve the authentication token\n * Return null/undefined if no token is available\n */\n readonly getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Callback invoked when a 401 authentication error occurs\n * Use this to trigger re-authentication flows\n */\n readonly onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"portal\" }\n */\n readonly defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Filestack API key for messaging file uploads.\n * If not provided, file attachments will be disabled in the messaging composer.\n */\n readonly filestackApiKey?: string;\n\n /**\n * Override WebSocket URL for real-time messaging.\n * Default: derived from baseUrl by replacing trailing /api with /cable\n */\n readonly websocketUrl?: string;\n\n /**\n * ISO country code for the store/merchant (e.g., \"US\", \"CA\", \"GB\").\n * Used to fetch country-specific payment methods.\n * @default \"US\"\n */\n readonly countryIso?: string;\n}\n\n/**\n * Options for individual API requests.\n * Uses HttpMethod type for method to ensure type safety.\n */\nexport interface RequestOptions {\n readonly method?: HttpMethod;\n readonly body?: unknown;\n readonly params?: Readonly<Record<string, unknown>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\n/**\n * Pagination parameters for list endpoints\n */\nexport interface PaginationParams {\n readonly page?: number;\n readonly per_page?: number;\n}\n\n// ============================================================================\n// Sort Order - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * Sort order constant - single source of truth for sort direction values.\n * Use SORT_ORDERS.asc instead of \"asc\" for type-safe comparisons.\n */\nexport const SORT_ORDERS = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\n/**\n * Union type of sort order values, derived from SORT_ORDERS constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type SortOrder = (typeof SORT_ORDERS)[keyof typeof SORT_ORDERS];\n\n/**\n * Common filter parameters for list endpoints\n */\nexport interface BaseListParams extends PaginationParams {\n readonly sort_by?: string;\n readonly sort_order?: SortOrder;\n readonly search?: string;\n}\n","/**\n * Auth Types\n *\n * These types define the JWT payload structure and authentication\n * configuration options.\n */\n\n// ============================================================================\n// User Types - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * User type constant - single source of truth for user role values.\n * Use USER_TYPES.admin instead of \"admin\" for type-safe comparisons.\n */\nexport const USER_TYPES = {\n admin: \"admin\",\n rep: \"rep\",\n root_admin: \"root_admin\",\n customer: \"customer\",\n} as const;\n\n/**\n * Union type of all user types, derived from USER_TYPES constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type UserType = (typeof USER_TYPES)[keyof typeof USER_TYPES];\n\n/**\n * Runtime validation for user types.\n * @param value - The value to check\n * @returns true if value is a valid UserType\n */\nexport function isUserType(value: string): value is UserType {\n return Object.values(USER_TYPES).includes(value as UserType);\n}\n\n/**\n * JWT payload structure from Fluid Commerce authentication.\n * Contains user identity and role information.\n */\nexport interface JWTPayload {\n /** User ID */\n id?: number | undefined;\n /** User email address */\n email?: string | undefined;\n /** Full name of the user */\n full_name?: string | undefined;\n /** User role type */\n user_type: UserType;\n /** Original user type (for impersonation scenarios) */\n og_user_type?: UserType | undefined;\n /** Company ID the user belongs to */\n company_id?: number | undefined;\n /** Token expiration timestamp (Unix seconds) */\n exp?: number | undefined;\n /** Authentication type (e.g., \"standard\", \"impersonation\") */\n auth_type?: string | undefined;\n}\n\n/**\n * Configuration options for FluidAuthProvider.\n * All options have sensible defaults.\n */\nexport interface FluidAuthConfig {\n /**\n * URL parameter name for the auth token.\n * @default \"fluidUserToken\"\n */\n tokenKey?: string;\n\n /**\n * Cookie name for storing the auth token.\n * @default \"auth_token\"\n */\n cookieKey?: string;\n\n /**\n * Cookie max age in seconds.\n * @default 777600 (9 days)\n */\n cookieMaxAge?: number;\n\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration.\n * @default 30000 (30 seconds)\n */\n gracePeriodMs?: number;\n\n /**\n * Callback invoked when authentication fails (no valid token).\n * When omitted, the SDK redirects to `authUrl` with the current URL\n * as a redirect parameter so users can log in and return.\n */\n onAuthFailure?: () => void;\n\n /**\n * Base URL for the authentication page.\n * Used by the default auth failure redirect when `onAuthFailure` is not provided.\n * Ignored when a custom `onAuthFailure` callback is set.\n * @default \"https://auth.fluid.app\"\n */\n authUrl?: string;\n\n /**\n * Enable dev-mode auth bypass.\n * When true AND running in Vite dev mode (import.meta.env.DEV),\n * auth will use a synthetic mock user instead of requiring a real JWT.\n * The mock user allows UI rendering but API calls will fail (token is null).\n * @default false\n */\n devBypass?: boolean;\n\n /**\n * JWKS (JSON Web Key Set) URL for signature verification.\n * When provided, JWT signatures will be verified against keys\n * from this endpoint before accepting the token.\n *\n * This provides defense-in-depth client-side verification.\n * Without this, tokens are only decoded (not verified) client-side,\n * and real verification happens server-side on API calls.\n *\n * @example \"https://api.fluid.app/.well-known/jwks.json\"\n */\n jwksUrl?: string;\n}\n\n/**\n * Value provided by the FluidAuthContext.\n * All properties are readonly since context values should not be mutated by consumers.\n */\nexport interface FluidAuthContextValue {\n /** Whether the user is authenticated with a valid token */\n readonly isAuthenticated: boolean;\n /** Whether authentication is still being initialized */\n readonly isLoading: boolean;\n /** Decoded JWT payload if authenticated, null otherwise */\n readonly user: JWTPayload | null;\n /** Raw JWT token string if authenticated, null otherwise */\n readonly token: string | null;\n /** Clear authentication state and stored tokens */\n readonly clearAuth: () => void;\n /** Authentication error if any occurred during initialization */\n readonly error: Error | null;\n}\n\n/**\n * Result of token validation.\n * Uses a discriminated union for type-safe handling of valid/invalid states.\n */\nexport type TokenValidationResult =\n | {\n /** Token is valid */\n isValid: true;\n /** Decoded JWT payload */\n payload: JWTPayload;\n /** No error when valid */\n error?: undefined;\n }\n | {\n /** Token is invalid */\n isValid: false;\n /** Decoded JWT payload if parseable but expired */\n payload?: JWTPayload;\n /** Error message explaining why validation failed */\n error: string;\n };\n","/**\n * Auth Constants\n *\n * These constants define the default values for authentication\n * configuration and storage keys.\n */\n\n/**\n * Authentication-related constants with sensible defaults.\n */\nexport const AUTH_CONSTANTS = {\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration. Tokens are considered valid\n * if they expire within this period.\n */\n TOKEN_GRACE_PERIOD_MS: 30_000, // 30 seconds\n\n /**\n * Default cookie max age in seconds (9 days).\n * This matches the typical JWT token lifetime from the Fluid API.\n */\n COOKIE_MAX_AGE: 777_600, // 9 days in seconds (9 * 24 * 60 * 60)\n} as const;\n\n/**\n * Storage keys for auth tokens.\n */\nexport const STORAGE_KEYS = {\n /** localStorage key for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** localStorage key for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n /** Cookie name for auth token */\n AUTH_COOKIE: \"auth_token\",\n} as const;\n\n/**\n * Default URL parameter names for token extraction.\n */\nexport const URL_PARAMS = {\n /** URL parameter name for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** URL parameter name for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n} as const;\n","/**\n * Browser environment detection utility.\n * Shared across auth modules to avoid duplication.\n */\n\n/**\n * Check if we're running in a browser environment.\n * Checks both `window` and `document` to ensure full DOM availability.\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n","export default crypto;\nexport const isCryptoKey = (key) => key instanceof CryptoKey;\n","import digest from '../runtime/digest.js';\nexport const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nexport function p2s(alg, p2sInput) {\n return concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function lengthAndInput(input) {\n return concat(uint32be(input.length), input);\n}\nexport async function concatKdf(secret, bits, value) {\n const iterations = Math.ceil((bits >> 3) / 32);\n const res = new Uint8Array(iterations * 32);\n for (let iter = 0; iter < iterations; iter++) {\n const buf = new Uint8Array(4 + secret.length + value.length);\n buf.set(uint32be(iter + 1));\n buf.set(secret, 4);\n buf.set(value, 4 + secret.length);\n res.set(await digest('sha256', buf), iter * 32);\n }\n return res.slice(0, bits >> 3);\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nexport const encodeBase64 = (input) => {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < unencoded.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, unencoded.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n};\nexport const encode = (input) => {\n return encodeBase64(input).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\nexport const decodeBase64 = (encoded) => {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n};\nexport const decode = (input) => {\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n};\n","export class JOSEError extends Error {\n constructor(message, options) {\n super(message, options);\n this.code = 'ERR_JOSE_GENERIC';\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nJOSEError.code = 'ERR_JOSE_GENERIC';\nexport class JWTClaimValidationFailed extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTClaimValidationFailed.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\nexport class JWTExpired extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_EXPIRED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTExpired.code = 'ERR_JWT_EXPIRED';\nexport class JOSEAlgNotAllowed extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n }\n}\nJOSEAlgNotAllowed.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\nexport class JOSENotSupported extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_NOT_SUPPORTED';\n }\n}\nJOSENotSupported.code = 'ERR_JOSE_NOT_SUPPORTED';\nexport class JWEDecryptionFailed extends JOSEError {\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n this.code = 'ERR_JWE_DECRYPTION_FAILED';\n }\n}\nJWEDecryptionFailed.code = 'ERR_JWE_DECRYPTION_FAILED';\nexport class JWEInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWE_INVALID';\n }\n}\nJWEInvalid.code = 'ERR_JWE_INVALID';\nexport class JWSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWS_INVALID';\n }\n}\nJWSInvalid.code = 'ERR_JWS_INVALID';\nexport class JWTInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWT_INVALID';\n }\n}\nJWTInvalid.code = 'ERR_JWT_INVALID';\nexport class JWKInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWK_INVALID';\n }\n}\nJWKInvalid.code = 'ERR_JWK_INVALID';\nexport class JWKSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWKS_INVALID';\n }\n}\nJWKSInvalid.code = 'ERR_JWKS_INVALID';\nexport class JWKSNoMatchingKey extends JOSEError {\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_NO_MATCHING_KEY';\n }\n}\nJWKSNoMatchingKey.code = 'ERR_JWKS_NO_MATCHING_KEY';\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n }\n}\nSymbol.asyncIterator;\nJWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\nexport class JWKSTimeout extends JOSEError {\n constructor(message = 'request timed out', options) {\n super(message, options);\n this.code = 'ERR_JWKS_TIMEOUT';\n }\n}\nJWKSTimeout.code = 'ERR_JWKS_TIMEOUT';\nexport class JWSSignatureVerificationFailed extends JOSEError {\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n this.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n }\n}\nJWSSignatureVerificationFailed.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n","function unusable(name, prop = 'algorithm.name') {\n return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\n}\nfunction isAlgorithm(algorithm, name) {\n return algorithm.name === name;\n}\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usages) {\n if (usages.length && !usages.some((expected) => key.usages.includes(expected))) {\n let msg = 'CryptoKey does not support this operation, its usages must include ';\n if (usages.length > 2) {\n const last = usages.pop();\n msg += `one of ${usages.join(', ')}, or ${last}.`;\n }\n else if (usages.length === 2) {\n msg += `one of ${usages[0]} or ${usages[1]}.`;\n }\n else {\n msg += `${usages[0]}.`;\n }\n throw new TypeError(msg);\n }\n}\nexport function checkSigCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'EdDSA': {\n if (key.algorithm.name !== 'Ed25519' && key.algorithm.name !== 'Ed448') {\n throw unusable('Ed25519 or Ed448');\n }\n break;\n }\n case 'Ed25519': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\nexport function checkEncCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n case 'X448':\n break;\n default:\n throw unusable('ECDH, X25519, or X448');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport default (actual, ...types) => {\n return message('Key must be ', actual, ...types);\n};\nexport function withAlg(alg, actual, ...types) {\n return message(`Key for the ${alg} algorithm must be `, actual, ...types);\n}\n","import { isCryptoKey } from './webcrypto.js';\nexport default (key) => {\n if (isCryptoKey(key)) {\n return true;\n }\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nexport const types = ['CryptoKey'];\n","const isDisjoint = (...headers) => {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n};\nexport default isDisjoint;\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\n","export default (alg, key) => {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n};\n","import isObject from './is_object.js';\nexport function isJWK(key) {\n return isObject(key) && typeof key.kty === 'string';\n}\nexport function isPrivateJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'string';\n}\nexport function isPublicJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'undefined';\n}\nexport function isSecretJWK(key) {\n return isJWK(key) && key.kty === 'oct' && typeof key.k === 'string';\n}\n","import crypto from './webcrypto.js';\nimport { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'EdDSA':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nconst parse = async (jwk) => {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const rest = [\n algorithm,\n jwk.ext ?? false,\n jwk.key_ops ?? keyUsages,\n ];\n const keyData = { ...jwk };\n delete keyData.alg;\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, ...rest);\n};\nexport default parse;\n","import { isJWK } from '../lib/is_jwk.js';\nimport { decode } from './base64url.js';\nimport importJWK from './jwk_to_key.js';\nconst exportKeyValue = (k) => decode(k);\nlet privCache;\nlet pubCache;\nconst isKeyObject = (key) => {\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nconst importAndCache = async (cache, key, jwk, alg, freeze = false) => {\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await importJWK({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst normalizePublicKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n delete jwk.d;\n delete jwk.dp;\n delete jwk.dq;\n delete jwk.p;\n delete jwk.q;\n delete jwk.qi;\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n pubCache || (pubCache = new WeakMap());\n return importAndCache(pubCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n pubCache || (pubCache = new WeakMap());\n const cryptoKey = importAndCache(pubCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nconst normalizePrivateKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n privCache || (privCache = new WeakMap());\n return importAndCache(privCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n privCache || (privCache = new WeakMap());\n const cryptoKey = importAndCache(privCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nexport default { normalizePublicKey, normalizePrivateKey };\n","import { decode as decodeBase64URL } from '../runtime/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../runtime/asn1.js';\nimport asKeyObject from '../runtime/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n alg || (alg = jwk.alg);\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n case 'EC':\n case 'OKP':\n return asKeyObject({ ...jwk, alg });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport isKeyLike, { types } from '../runtime/is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined && key.use !== 'sig') {\n throw new TypeError('Invalid key for this operation, when present its use must be sig');\n }\n if (key.key_ops !== undefined && key.key_ops.includes?.(usage) !== true) {\n throw new TypeError(`Invalid key for this operation, when present its key_ops must include ${usage}`);\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, when present its alg must be ${alg}`);\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (key instanceof Uint8Array)\n return;\n if (allowJwk && jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, 'Uint8Array', allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (allowJwk && jwk.isJWK(key)) {\n switch (usage) {\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a private JWK`);\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (usage === 'sign' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n }\n if (usage === 'decrypt' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n if (key.algorithm && usage === 'verify' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n }\n if (key.algorithm && usage === 'encrypt' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n};\nfunction checkKeyType(allowJwk, alg, key, usage) {\n const symmetric = alg.startsWith('HS') ||\n alg === 'dir' ||\n alg.startsWith('PBES2') ||\n /^A\\d{3}(?:GCM)?KW$/.test(alg);\n if (symmetric) {\n symmetricTypeCheck(alg, key, usage, allowJwk);\n }\n else {\n asymmetricTypeCheck(alg, key, usage, allowJwk);\n }\n}\nexport default checkKeyType.bind(undefined, false);\nexport const checkKeyTypeWithJwk = checkKeyType.bind(undefined, true);\n","import { JOSENotSupported } from '../util/errors.js';\nfunction validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\nexport default validateCrit;\n","const validateAlgorithms = (option, algorithms) => {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n};\nexport default validateAlgorithms;\n","import { JOSENotSupported } from '../util/errors.js';\nexport default function subtleDsa(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n return { name: 'Ed25519' };\n case 'EdDSA':\n return { name: algorithm.name };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\n","import crypto, { isCryptoKey } from './webcrypto.js';\nimport { checkSigCryptoKey } from '../lib/crypto_key.js';\nimport invalidKeyInput from '../lib/invalid_key_input.js';\nimport { types } from './is_key_like.js';\nimport normalize from './normalize_key.js';\nexport default async function getCryptoKey(alg, key, usage) {\n if (usage === 'sign') {\n key = await normalize.normalizePrivateKey(key, alg);\n }\n if (usage === 'verify') {\n key = await normalize.normalizePublicKey(key, alg);\n }\n if (isCryptoKey(key)) {\n checkSigCryptoKey(key, alg, usage);\n return key;\n }\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, ...types));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array', 'JSON Web Key'));\n}\n","import subtleAlgorithm from './subtle_dsa.js';\nimport crypto from './webcrypto.js';\nimport checkKeyLength from './check_key_length.js';\nimport getVerifyKey from './get_sign_verify_key.js';\nconst verify = async (alg, key, signature, data) => {\n const cryptoKey = await getVerifyKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n};\nexport default verify;\n","import { decode as base64url } from '../../runtime/base64url.js';\nimport verify from '../../runtime/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder } from '../../lib/buffer_utils.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport isObject from '../../lib/is_object.js';\nimport { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport validateAlgorithms from '../../lib/validate_algorithms.js';\nimport { isJWK } from '../../lib/is_jwk.js';\nimport { importJWK } from '../../key/import.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = base64url(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n checkKeyTypeWithJwk(alg, key, 'verify');\n if (isJWK(key)) {\n key = await importJWK(key, alg);\n }\n }\n else {\n checkKeyTypeWithJwk(alg, key, 'verify');\n }\n const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);\n let signature;\n try {\n signature = base64url(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const verified = await verify(alg, key, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = base64url(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","export default (date) => Math.floor(date.getTime() / 1000);\n","const minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport default (str) => {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n};\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { decoder } from './buffer_utils.js';\nimport epoch from './epoch.js';\nimport secs from './secs.js';\nimport isObject from './is_object.js';\nconst normalizeTyp = (value) => value.toLowerCase().replace(/^application\\//, '');\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport default (protectedHeader, encodedPayload, options = {}) => {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n};\n","import { compactVerify } from '../jws/compact/verify.js';\nimport jwtPayload from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = jwtPayload(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nfunction clone(obj) {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\nclass LocalJWKSet {\n constructor(jwks) {\n this._cached = new WeakMap();\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this._jwks = clone(jwks);\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this._jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && typeof jwk.alg === 'string') {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES256K':\n candidate = jwk.crv === 'secp256k1';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n candidate = jwk.crv === 'Ed25519';\n break;\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const { _cached } = this;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this._cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => clone(set._jwks),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSTimeout } from '../util/errors.js';\nconst fetchJwks = async (url, timeout, options) => {\n let controller;\n let id;\n let timedOut = false;\n if (typeof AbortController === 'function') {\n controller = new AbortController();\n id = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n }\n const response = await fetch(url.href, {\n signal: controller ? controller.signal : undefined,\n redirect: 'manual',\n headers: options.headers,\n }).catch((err) => {\n if (timedOut)\n throw new JWKSTimeout();\n throw err;\n });\n if (id !== undefined)\n clearTimeout(id);\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n};\nexport default fetchJwks;\n","import fetchJwks from '../runtime/fetch_jwks.js';\nimport { JWKSNoMatchingKey } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport isObject from '../lib/is_object.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v5.10.0';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this._url = new URL(url.href);\n this._options = { agent: options?.agent, headers: options?.headers };\n this._timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this._cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this._cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n if (options?.[jwksCache] !== undefined) {\n this._cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this._cacheMaxAge)) {\n this._jwksTimestamp = this._cache.uat;\n this._local = createLocalJWKSet(this._cache.jwks);\n }\n }\n }\n coolingDown() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cooldownDuration\n : false;\n }\n fresh() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cacheMaxAge\n : false;\n }\n async getKey(protectedHeader, token) {\n if (!this._local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this._local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this._local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this._pendingFetch && isCloudflareWorkers()) {\n this._pendingFetch = undefined;\n }\n const headers = new Headers(this._options.headers);\n if (USER_AGENT && !headers.has('User-Agent')) {\n headers.set('User-Agent', USER_AGENT);\n this._options.headers = Object.fromEntries(headers.entries());\n }\n this._pendingFetch || (this._pendingFetch = fetchJwks(this._url, this._timeoutDuration, this._options)\n .then((json) => {\n this._local = createLocalJWKSet(json);\n if (this._cache) {\n this._cache.uat = Date.now();\n this._cache.jwks = json;\n }\n this._jwksTimestamp = Date.now();\n this._pendingFetch = undefined;\n })\n .catch((err) => {\n this._pendingFetch = undefined;\n throw err;\n }));\n await this._pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => !!set._pendingFetch,\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set._local?.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\nexport const experimental_jwksCache = jwksCache;\n","import * as base64url from '../runtime/base64url.js';\nexport const encode = base64url.encode;\nexport const decode = base64url.decode;\n","import { decode as base64url } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport isObject from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = base64url(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","/**\n * Token Utilities\n *\n * Functions for decoding, validating, and checking JWT tokens.\n */\n\nimport {\n decodeJwt,\n jwtVerify,\n createRemoteJWKSet,\n type JWTPayload as JoseJWTPayload,\n} from \"jose\";\nimport { AUTH_CONSTANTS } from \"./constants\";\nimport type { JWTPayload, TokenValidationResult } from \"./types\";\nimport { isUserType } from \"./types\";\n\n/**\n * Extract a JWTPayload from a jose-decoded JWT payload.\n *\n * Type assertions are required because jose's payload type uses `unknown`\n * for custom claims. This helper centralises the mapping so that\n * both {@link decodeToken} and {@link verifyToken} share the same logic.\n */\nfunction extractPayloadFromJose(\n decoded: JoseJWTPayload & Partial<JWTPayload>,\n): JWTPayload {\n const rawUserType = decoded.user_type;\n const rawOgUserType = decoded.og_user_type;\n\n return {\n id: typeof decoded.id === \"number\" ? decoded.id : undefined,\n email: typeof decoded.email === \"string\" ? decoded.email : undefined,\n full_name:\n typeof decoded.full_name === \"string\" ? decoded.full_name : undefined,\n user_type:\n typeof rawUserType === \"string\" && isUserType(rawUserType)\n ? rawUserType\n : \"rep\",\n og_user_type:\n typeof rawOgUserType === \"string\" && isUserType(rawOgUserType)\n ? rawOgUserType\n : undefined,\n company_id:\n typeof decoded.company_id === \"number\" ? decoded.company_id : undefined,\n exp: decoded.exp,\n auth_type:\n typeof decoded.auth_type === \"string\" ? decoded.auth_type : undefined,\n };\n}\n\n/**\n * Decode a JWT token and extract its payload.\n *\n * **Security note:** This function does NOT verify the JWT signature.\n * It only decodes the payload. Any valid JWT structure will be accepted,\n * regardless of who signed it.\n *\n * Client-side token decoding is used for UX purposes only (displaying\n * user info, role-based UI). The real security boundary is the server-side\n * API, which verifies the signature on every request.\n *\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @returns The decoded JWT payload, or null if decoding fails\n */\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n // Type assertion required: jose's decodeJwt returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = decodeJwt(token) as JoseJWTPayload & Partial<JWTPayload>;\n\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] Failed to decode JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Check if a token has expired.\n * Includes a configurable grace period to account for clock skew.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period in milliseconds (default: 30 seconds)\n * @returns true if the token is expired, false otherwise\n */\nexport function isTokenExpired(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): boolean {\n try {\n const decoded = decodeJwt(token);\n\n // If no expiration, token never expires\n if (!decoded.exp) {\n return false;\n }\n\n // exp is in seconds, convert to milliseconds\n const expirationTime = decoded.exp * 1000;\n const currentTime = Date.now();\n\n // Token is expired if current time is past expiration + grace period\n return currentTime > expirationTime + gracePeriodMs;\n } catch {\n // If we can't decode the token, treat it as expired\n return true;\n }\n}\n\n/**\n * Validate a JWT token for format and expiration.\n *\n * **Security note:** This function checks JWT structure and expiration\n * but does NOT verify the signature. It is a UX-level check only.\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period for expiration check (default: 30 seconds)\n * @returns Validation result with status and decoded payload if valid\n */\nexport function validateToken(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): TokenValidationResult {\n // Check if token is provided\n if (!token || token.trim() === \"\") {\n return {\n isValid: false,\n error: \"Token is empty or not provided\",\n };\n }\n\n // Try to decode the token\n const payload = decodeToken(token);\n if (!payload) {\n return {\n isValid: false,\n error: \"Token has invalid format\",\n };\n }\n\n // Check expiration\n if (isTokenExpired(token, gracePeriodMs)) {\n return {\n isValid: false,\n payload,\n error: \"Token has expired\",\n };\n }\n\n return {\n isValid: true,\n payload,\n };\n}\n\n/**\n * Type guard to check if a validation result is valid.\n * Enables TypeScript narrowing of the result type.\n *\n * @param result - The validation result to check\n * @returns true if the token is valid (narrows payload to non-optional)\n */\nexport function isValidToken(\n result: TokenValidationResult,\n): result is TokenValidationResult & { isValid: true; payload: JWTPayload } {\n return result.isValid === true;\n}\n\n/**\n * Get the expiration time of a token as a Date.\n *\n * @param token - The JWT token string\n * @returns The expiration Date, or null if token has no expiration or is invalid\n */\nexport function getTokenExpiration(token: string): Date | null {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return null;\n }\n return new Date(decoded.exp * 1000);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the time remaining until token expiration in milliseconds.\n *\n * @param token - The JWT token string\n * @returns Milliseconds until expiration, or 0 if expired/invalid, or Infinity if no expiration\n */\nexport function getTokenTimeRemaining(token: string): number {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return Infinity;\n }\n const expirationTime = decoded.exp * 1000;\n const remaining = expirationTime - Date.now();\n return Math.max(0, remaining);\n } catch {\n return 0;\n }\n}\n\n/**\n * Verify a JWT token's signature using a JWKS endpoint and extract its payload.\n *\n * Unlike {@link decodeToken}, this function cryptographically verifies\n * that the token was signed by a trusted key.\n *\n * @param token - The JWT token string\n * @param jwksUrl - URL of the JWKS endpoint\n * @returns The verified JWT payload, or null if verification fails\n */\nexport async function verifyToken(\n token: string,\n jwksUrl: string,\n): Promise<JWTPayload | null> {\n try {\n const JWKS = createRemoteJWKSet(new URL(jwksUrl));\n const { payload } = await jwtVerify(token, JWKS);\n\n // Type assertion required: jose's jwtVerify returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = payload as JoseJWTPayload & Partial<JWTPayload>;\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] JWT signature verification failed:\", error);\n return null;\n }\n}\n","/**\n * Token Storage Utilities\n *\n * Functions for storing and retrieving auth tokens from\n * cookies and localStorage.\n */\n\nimport { AUTH_CONSTANTS, STORAGE_KEYS } from \"./constants\";\nimport type { FluidAuthConfig } from \"./types\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Parse cookies from document.cookie string into an object.\n */\nfunction parseCookies(): Record<string, string> {\n if (!isBrowser()) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const cookieString = document.cookie;\n\n if (!cookieString) {\n return cookies;\n }\n\n cookieString.split(\";\").forEach((cookie) => {\n const [name, ...valueParts] = cookie.trim().split(\"=\");\n if (name) {\n cookies[name] = decodeURIComponent(valueParts.join(\"=\"));\n }\n });\n\n return cookies;\n}\n\n/**\n * Set a cookie with the given options.\n */\nfunction setCookie(\n name: string,\n value: string,\n options: Readonly<{\n maxAge?: number;\n path?: string;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n secure?: boolean;\n }> = {},\n): void {\n if (!isBrowser()) {\n return;\n }\n\n const {\n maxAge = AUTH_CONSTANTS.COOKIE_MAX_AGE,\n path = \"/\",\n sameSite = \"lax\",\n secure = window.location.protocol === \"https:\",\n } = options;\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n cookieString += `; path=${path}`;\n cookieString += `; max-age=${maxAge}`;\n cookieString += `; samesite=${sameSite}`;\n\n if (secure) {\n cookieString += \"; secure\";\n }\n\n document.cookie = cookieString;\n}\n\n/**\n * Delete a cookie by setting its max-age to 0.\n */\nfunction deleteCookie(name: string, path: string = \"/\"): void {\n if (!isBrowser()) {\n return;\n }\n\n document.cookie = `${name}=; path=${path}; max-age=0`;\n}\n\n/**\n * Get the stored auth token.\n * Checks cookie first, then falls back to localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n * @returns The stored token or null if not found\n */\nexport function getStoredToken(config?: FluidAuthConfig): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const localStorageKey = STORAGE_KEYS.USER_TOKEN;\n\n // Priority: cookie > localStorage\n const cookies = parseCookies();\n const cookieToken = cookies[cookieKey];\n\n if (cookieToken) {\n return cookieToken;\n }\n\n try {\n return localStorage.getItem(localStorageKey);\n } catch {\n // localStorage might be unavailable (private browsing, etc.)\n return null;\n }\n}\n\n/**\n * Store an auth token in both cookie and localStorage.\n * Using both provides redundancy and compatibility with different auth flows.\n *\n * @param token - The JWT token to store\n * @param config - Optional auth config for custom storage options\n */\nexport function storeToken(token: string, config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const maxAge = config?.cookieMaxAge ?? AUTH_CONSTANTS.COOKIE_MAX_AGE;\n\n // Store in cookie\n try {\n const inIframe = window.self !== window.top;\n const sameSite = inIframe ? \"none\" : \"lax\";\n setCookie(cookieKey, token, {\n maxAge,\n path: \"/\",\n sameSite,\n // SameSite=None requires Secure per RFC 6265bis; browsers silently\n // reject the cookie otherwise (e.g. HTTP localhost in an iframe).\n secure: sameSite === \"none\" || window.location.protocol === \"https:\",\n });\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in cookie:\", error);\n }\n\n // Also store in localStorage as backup\n try {\n localStorage.setItem(STORAGE_KEYS.USER_TOKEN, token);\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in localStorage:\", error);\n }\n}\n\n/**\n * Clear all stored auth tokens from cookies and localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n */\nexport function clearTokens(config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n\n // Clear cookie\n try {\n deleteCookie(cookieKey);\n } catch {\n // Ignore cleanup errors\n }\n\n // Clear localStorage\n try {\n localStorage.removeItem(STORAGE_KEYS.USER_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.COMPANY_TOKEN);\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if any auth token is stored.\n *\n * @param config - Optional auth config\n * @returns true if a token is stored, false otherwise\n */\nexport function hasStoredToken(config?: FluidAuthConfig): boolean {\n return getStoredToken(config) !== null;\n}\n\n/**\n * Clear all stored auth tokens and redirect the user.\n * Combines clearTokens() + window redirect in a single call.\n *\n * @param redirectUrl - URL to redirect to after clearing tokens (default: \"/\")\n * @param config - Optional auth config for custom cookie key\n */\nexport function handleAuthError(\n redirectUrl: string = \"/\",\n config?: FluidAuthConfig,\n): void {\n clearTokens(config);\n if (isBrowser()) {\n window.location.href = redirectUrl;\n }\n}\n","/**\n * URL Token Utilities\n *\n * Functions for extracting and cleaning auth tokens from URL parameters.\n * This is the primary way tokens are passed from the parent Fluid Commerce\n * app to embedded portals.\n *\n * **Security model**: Tokens in URL parameters are a known tradeoff.\n * The token is extracted and immediately cleaned from the URL via\n * `history.replaceState()`. A `Referrer-Policy` meta tag in the\n * starter template prevents the token from leaking in referrer headers.\n */\n\nimport { URL_PARAMS } from \"./constants\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Extract the auth token from the URL query parameters.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns The token value or null if not present\n */\nexport function extractTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the company token from the URL query parameters.\n * This is a legacy parameter that may still be used in some flows.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidCompanyToken\")\n * @returns The token value or null if not present\n */\nexport function extractCompanyTokenFromUrl(\n tokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Remove the auth token from the URL without reloading the page.\n * This prevents the token from being accidentally shared via URL copy/paste\n * or appearing in browser history.\n *\n * Uses history.replaceState to update the URL cleanly.\n *\n * @param tokenKey - The URL parameter name to remove (default: \"fluidUserToken\")\n */\nexport function cleanTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const url = new URL(window.location.href);\n const hadToken = url.searchParams.has(tokenKey);\n const hadCompanyToken = url.searchParams.has(URL_PARAMS.COMPANY_TOKEN);\n\n // Remove both user and company tokens\n url.searchParams.delete(tokenKey);\n url.searchParams.delete(URL_PARAMS.COMPANY_TOKEN);\n\n // Only update URL if we actually removed something\n if (hadToken || hadCompanyToken) {\n // Use replaceState to avoid adding to browser history\n window.history.replaceState(\n window.history.state,\n document.title,\n url.toString(),\n );\n }\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to clean token from URL:\", error);\n }\n}\n\n/**\n * Check if the URL contains an auth token parameter.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns true if the URL contains the token parameter\n */\nexport function hasTokenInUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.has(tokenKey);\n } catch {\n return false;\n }\n}\n\n/**\n * Extract all auth-related tokens from the URL at once.\n *\n * @param userTokenKey - The URL parameter name for user token\n * @param companyTokenKey - The URL parameter name for company token\n * @returns Object with both token values (or null if not present)\n */\nexport function extractAllTokensFromUrl(\n userTokenKey: string = URL_PARAMS.USER_TOKEN,\n companyTokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): { userToken: string | null; companyToken: string | null } {\n if (!isBrowser()) {\n return { userToken: null, companyToken: null };\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return {\n userToken: searchParams.get(userTokenKey),\n companyToken: searchParams.get(companyTokenKey),\n };\n } catch {\n return { userToken: null, companyToken: null };\n }\n}\n","import type { JWTPayload } from \"./types\";\nimport { USER_TYPES } from \"./types\";\n\n/**\n * Check if dev bypass should be active.\n * Requires both the config flag AND Vite dev mode.\n */\nexport function isDevBypassActive(devBypass?: boolean): boolean {\n if (!devBypass) return false;\n\n try {\n // import.meta.env.DEV is a Vite compile-time constant.\n // It's `true` in dev mode and completely tree-shaken in production.\n // The type assertion avoids requiring Vite ambient types in all consumers.\n const meta = import.meta as { env?: { DEV?: boolean } };\n return meta.env?.DEV === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a synthetic dev user for local development.\n * This user has realistic data for UI rendering but no real auth.\n */\nexport function createDevUser(): JWTPayload {\n return {\n id: 99999, // Dev placeholder — avoids falsy 0\n email: \"dev@localhost\",\n full_name: \"Dev User\",\n user_type: USER_TYPES.rep,\n og_user_type: undefined,\n company_id: 99999, // Dev placeholder — avoids falsy 0\n exp: undefined, // Never expires\n auth_type: \"dev_bypass\",\n };\n}\n","/**\n * Auth Redirect Utilities\n *\n * Provides default redirect behavior for authentication failures.\n * When no custom callback is provided, the SDK redirects to Fluid's\n * auth page with a redirect_url pointing back to the current page.\n *\n * Includes loop detection: if a redirect was attempted within the\n * cooldown window, subsequent calls are suppressed to prevent\n * infinite redirect cycles (e.g., auth returns a token the API rejects).\n */\n\n/**\n * Default Fluid authentication URL.\n * Users are redirected here when auth fails and no custom handler is provided.\n */\nexport const DEFAULT_AUTH_URL = \"https://auth.fluid.app\";\n\n/**\n * URL parameter name used by auth.fluid.app when redirecting back with a token.\n * This differs from the SDK's default `fluidUserToken` (used by the parent Fluid app\n * when embedding portals in iframes). The auth provider checks both.\n */\nexport const AUTH_REDIRECT_TOKEN_KEY = \"jwt\";\n\n/** sessionStorage key for loop detection */\nconst REDIRECT_TIMESTAMP_KEY = \"__fluid_auth_redirect_ts\";\n\n/** Minimum seconds between redirect attempts */\nconst REDIRECT_COOLDOWN_S = 10;\n\n/**\n * Check if a redirect was recently attempted.\n * Returns true if we should suppress the redirect to avoid a loop.\n */\nfunction isRedirectLoop(): boolean {\n try {\n const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);\n if (!ts) return false;\n const elapsed = (Date.now() - Number(ts)) / 1000;\n return elapsed < REDIRECT_COOLDOWN_S;\n } catch {\n // sessionStorage unavailable (SSR, privacy mode) — allow redirect\n return false;\n }\n}\n\n/**\n * Record that a redirect is about to happen.\n */\nfunction markRedirect(): void {\n try {\n sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));\n } catch {\n // sessionStorage unavailable — best-effort\n }\n}\n\n/**\n * Creates a redirect function that navigates to the auth URL\n * with the current page URL encoded as a redirect parameter.\n *\n * Includes loop detection: if a redirect was attempted within the last\n * {@link REDIRECT_COOLDOWN_S} seconds, the redirect is suppressed and\n * the normal error UI is allowed to render instead.\n *\n * @param authUrl - Custom auth URL to redirect to. Defaults to DEFAULT_AUTH_URL.\n * @returns A function that performs the redirect when called (no-op if loop detected).\n */\nexport function createDefaultAuthRedirect(authUrl?: string): () => void {\n return () => {\n if (isRedirectLoop()) {\n console.warn(\n \"[FluidAuth] Auth redirect suppressed — possible redirect loop. \" +\n \"Check that your auth server returns a token accepted by the API.\",\n );\n return;\n }\n markRedirect();\n const base = authUrl ?? DEFAULT_AUTH_URL;\n const currentUrl = encodeURIComponent(window.location.href);\n window.location.href = `${base}/?redirect_url=${currentUrl}`;\n };\n}\n\n/**\n * Resolves the effective auth failure handler.\n * Returns the custom callback if provided, otherwise creates a default redirect.\n *\n * @param onAuthFailure - Custom callback from user config\n * @param authUrl - Custom auth URL (only used when creating the default redirect)\n * @returns The resolved handler function\n */\nexport function resolveAuthFailureHandler(\n onAuthFailure?: (() => void) | undefined,\n authUrl?: string | undefined,\n): () => void {\n return onAuthFailure ?? createDefaultAuthRedirect(authUrl);\n}\n","// A is m x n. B is n x p. product is m x p.\nfunction multiplyMatrices (A, B) {\n\tlet m = A.length;\n\n\tif (!Array.isArray(A[0])) {\n\t\t// A is vector, convert to [[a, b, c, ...]]\n\t\tA = [A];\n\t}\n\n\tif (!Array.isArray(B[0])) {\n\t\t// B is vector, convert to [[a], [b], [c], ...]]\n\t\tB = B.map(x => [x]);\n\t}\n\n\tlet p = B[0].length;\n\tlet B_cols = B[0].map((_, i) => B.map(x => x[i])); // transpose B\n\tlet product = A.map(row => B_cols.map(col => {\n\t\tlet ret = 0;\n\n\t\tif (!Array.isArray(row)) {\n\t\t\tfor (let c of col) {\n\t\t\t\tret += row * c;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tfor (let i = 0; i < row.length; i++) {\n\t\t\tret += row[i] * (col[i] || 0);\n\t\t}\n\n\t\treturn ret;\n\t}));\n\n\tif (m === 1) {\n\t\tproduct = product[0]; // Avoid [[a, b, c, ...]]\n\t}\n\n\tif (p === 1) {\n\t\treturn product.map(x => x[0]); // Avoid [[a], [b], [c], ...]]\n\t}\n\n\treturn product;\n}\n\n/**\n * Various utility functions\n */\n\n\n/**\n * Check if a value is a string (including a String object)\n * @param {*} str - Value to check\n * @returns {boolean}\n */\nfunction isString (str) {\n\treturn type(str) === \"string\";\n}\n\n/**\n * Determine the internal JavaScript [[Class]] of an object.\n * @param {*} o - Value to check\n * @returns {string}\n */\nfunction type (o) {\n\tlet str = Object.prototype.toString.call(o);\n\n\treturn (str.match(/^\\[object\\s+(.*?)\\]$/)[1] || \"\").toLowerCase();\n}\n\nfunction serializeNumber (n, {precision, unit }) {\n\tif (isNone(n)) {\n\t\treturn \"none\";\n\t}\n\n\treturn toPrecision(n, precision) + (unit ?? \"\");\n}\n\n/**\n * Check if a value corresponds to a none argument\n * @param {*} n - Value to check\n * @returns {boolean}\n */\nfunction isNone (n) {\n\treturn Number.isNaN(n) || (n instanceof Number && n?.none);\n}\n\n/**\n * Replace none values with 0\n */\nfunction skipNone (n) {\n\treturn isNone(n) ? 0 : n;\n}\n\n/**\n * Round a number to a certain number of significant digits\n * @param {number} n - The number to round\n * @param {number} precision - Number of significant digits\n */\nfunction toPrecision (n, precision) {\n\tif (n === 0) {\n\t\treturn 0;\n\t}\n\tlet integer = ~~n;\n\tlet digits = 0;\n\tif (integer && precision) {\n\t\tdigits = ~~Math.log10(Math.abs(integer)) + 1;\n\t}\n\tconst multiplier = 10.0 ** (precision - digits);\n\treturn Math.floor(n * multiplier + 0.5) / multiplier;\n}\n\nconst angleFactor = {\n\tdeg: 1,\n\tgrad: 0.9,\n\trad: 180 / Math.PI,\n\tturn: 360,\n};\n\n/**\n* Parse a CSS function, regardless of its name and arguments\n* @param String str String to parse\n* @return {{name, args, rawArgs}}\n*/\nfunction parseFunction (str) {\n\tif (!str) {\n\t\treturn;\n\t}\n\n\tstr = str.trim();\n\n\tconst isFunctionRegex = /^([a-z]+)\\((.+?)\\)$/i;\n\tconst isNumberRegex = /^-?[\\d.]+$/;\n\tconst unitValueRegex = /%|deg|g?rad|turn$/;\n\tconst singleArgument = /\\/?\\s*(none|[-\\w.]+(?:%|deg|g?rad|turn)?)/g;\n\tlet parts = str.match(isFunctionRegex);\n\n\tif (parts) {\n\t\t// It is a function, parse args\n\t\tlet args = [];\n\t\tparts[2].replace(singleArgument, ($0, rawArg) => {\n\t\t\tlet match = rawArg.match(unitValueRegex);\n\t\t\tlet arg = rawArg;\n\n\t\t\tif (match) {\n\t\t\t\tlet unit = match[0];\n\t\t\t\t// Drop unit from value\n\t\t\t\tlet unitlessArg = arg.slice(0, -unit.length);\n\n\t\t\t\tif (unit === \"%\") {\n\t\t\t\t\t// Convert percentages to 0-1 numbers\n\t\t\t\t\targ = new Number(unitlessArg / 100);\n\t\t\t\t\targ.type = \"<percentage>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Multiply angle by appropriate factor for its unit\n\t\t\t\t\targ = new Number(unitlessArg * angleFactor[unit]);\n\t\t\t\t\targ.type = \"<angle>\";\n\t\t\t\t\targ.unit = unit;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (isNumberRegex.test(arg)) {\n\t\t\t\t// Convert numerical args to numbers\n\t\t\t\targ = new Number(arg);\n\t\t\t\targ.type = \"<number>\";\n\t\t\t}\n\t\t\telse if (arg === \"none\") {\n\t\t\t\targ = new Number(NaN);\n\t\t\t\targ.none = true;\n\t\t\t}\n\n\t\t\tif ($0.startsWith(\"/\")) {\n\t\t\t\t// It's alpha\n\t\t\t\targ = arg instanceof Number ? arg : new Number(arg);\n\t\t\t\targ.alpha = true;\n\t\t\t}\n\n\t\t\tif (typeof arg === \"object\" && arg instanceof Number) {\n\t\t\t\targ.raw = rawArg;\n\t\t\t}\n\n\t\t\targs.push(arg);\n\t\t});\n\n\t\treturn {\n\t\t\tname: parts[1].toLowerCase(),\n\t\t\trawName: parts[1],\n\t\t\trawArgs: parts[2],\n\t\t\t// An argument could be (as of css-color-4):\n\t\t\t// a number, percentage, degrees (hue), ident (in color())\n\t\t\targs,\n\t\t};\n\t}\n}\n\nfunction last (arr) {\n\treturn arr[arr.length - 1];\n}\n\nfunction interpolate (start, end, p) {\n\tif (isNaN(start)) {\n\t\treturn end;\n\t}\n\n\tif (isNaN(end)) {\n\t\treturn start;\n\t}\n\n\treturn start + (end - start) * p;\n}\n\nfunction interpolateInv (start, end, value) {\n\treturn (value - start) / (end - start);\n}\n\nfunction mapRange (from, to, value) {\n\treturn interpolate(to[0], to[1], interpolateInv(from[0], from[1], value));\n}\n\nfunction parseCoordGrammar (coordGrammars) {\n\treturn coordGrammars.map(coordGrammar => {\n\t\treturn coordGrammar.split(\"|\").map(type => {\n\t\t\ttype = type.trim();\n\t\t\tlet range = type.match(/^(<[a-z]+>)\\[(-?[.\\d]+),\\s*(-?[.\\d]+)\\]?$/);\n\n\t\t\tif (range) {\n\t\t\t\tlet ret = new String(range[1]);\n\t\t\t\tret.range = [+range[2], +range[3]];\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn type;\n\t\t});\n\t});\n}\n\n/**\n * Clamp value between the minimum and maximum\n * @param {number} min minimum value to return\n * @param {number} val the value to return if it is between min and max\n * @param {number} max maximum value to return\n * @returns number\n */\nfunction clamp (min, val, max) {\n\treturn Math.max(Math.min(max, val), min);\n}\n\n/**\n * Copy sign of one value to another.\n * @param {number} - to number to copy sign to\n * @param {number} - from number to copy sign from\n * @returns number\n */\nfunction copySign (to, from) {\n\treturn Math.sign(to) === Math.sign(from) ? to : -to;\n}\n\n/**\n * Perform pow on a signed number and copy sign to result\n * @param {number} - base the base number\n * @param {number} - exp the exponent\n * @returns number\n */\nfunction spow (base, exp) {\n\treturn copySign(Math.abs(base) ** exp, base);\n}\n\n/**\n * Perform a divide, but return zero if the numerator is zero\n * @param {number} n - the numerator\n * @param {number} d - the denominator\n * @returns number\n */\nfunction zdiv (n, d) {\n\treturn (d === 0) ? 0 : n / d;\n}\n\n/**\n * Perform a bisect on a sorted list and locate the insertion point for\n * a value in arr to maintain sorted order.\n * @param {number[]} arr - array of sorted numbers\n * @param {number} value - value to find insertion point for\n * @param {number} lo - used to specify a the low end of a subset of the list\n * @param {number} hi - used to specify a the high end of a subset of the list\n * @returns number\n */\nfunction bisectLeft (arr, value, lo = 0, hi = arr.length) {\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (arr[mid] < value) {\n\t\t\tlo = mid + 1;\n\t\t}\n\t\telse {\n\t\t\thi = mid;\n\t\t}\n\t}\n\treturn lo;\n}\n\nvar util = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tbisectLeft: bisectLeft,\n\tclamp: clamp,\n\tcopySign: copySign,\n\tinterpolate: interpolate,\n\tinterpolateInv: interpolateInv,\n\tisNone: isNone,\n\tisString: isString,\n\tlast: last,\n\tmapRange: mapRange,\n\tmultiplyMatrices: multiplyMatrices,\n\tparseCoordGrammar: parseCoordGrammar,\n\tparseFunction: parseFunction,\n\tserializeNumber: serializeNumber,\n\tskipNone: skipNone,\n\tspow: spow,\n\ttoPrecision: toPrecision,\n\ttype: type,\n\tzdiv: zdiv\n});\n\n/**\n * A class for adding deep extensibility to any piece of JS code\n */\nclass Hooks {\n\tadd (name, callback, first) {\n\t\tif (typeof arguments[0] != \"string\") {\n\t\t\t// Multiple hooks\n\t\t\tfor (var name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\tthis[name] = this[name] || [];\n\n\t\t\tif (callback) {\n\t\t\t\tthis[name][first ? \"unshift\" : \"push\"](callback);\n\t\t\t}\n\t\t}, this);\n\t}\n\n\trun (name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * The instance of {@link Hooks} used throughout Color.js\n */\nconst hooks = new Hooks();\n\n// Global defaults one may want to configure\nvar defaults = {\n\tgamut_mapping: \"css\",\n\tprecision: 5,\n\tdeltaE: \"76\", // Default deltaE method\n\tverbose: globalThis?.process?.env?.NODE_ENV?.toLowerCase() !== \"test\",\n\twarn: function warn (msg) {\n\t\tif (this.verbose) {\n\t\t\tglobalThis?.console?.warn?.(msg);\n\t\t}\n\t},\n};\n\nconst WHITES = {\n\t// for compatibility, the four-digit chromaticity-derived ones everyone else uses\n\tD50: [0.3457 / 0.3585, 1.00000, (1.0 - 0.3457 - 0.3585) / 0.3585],\n\tD65: [0.3127 / 0.3290, 1.00000, (1.0 - 0.3127 - 0.3290) / 0.3290],\n};\n\nfunction getWhite (name) {\n\tif (Array.isArray(name)) {\n\t\treturn name;\n\t}\n\n\treturn WHITES[name];\n}\n\n// Adapt XYZ from white point W1 to W2\nfunction adapt$2 (W1, W2, XYZ, options = {}) {\n\tW1 = getWhite(W1);\n\tW2 = getWhite(W2);\n\n\tif (!W1 || !W2) {\n\t\tthrow new TypeError(`Missing white point to convert ${!W1 ? \"from\" : \"\"}${!W1 && !W2 ? \"/\" : \"\"}${!W2 ? \"to\" : \"\"}`);\n\t}\n\n\tif (W1 === W2) {\n\t\t// Same whitepoints, no conversion needed\n\t\treturn XYZ;\n\t}\n\n\tlet env = {W1, W2, XYZ, options};\n\n\thooks.run(\"chromatic-adaptation-start\", env);\n\n\tif (!env.M) {\n\t\tif (env.W1 === WHITES.D65 && env.W2 === WHITES.D50) {\n\t\t\tenv.M = [\n\t\t\t\t[ 1.0479297925449969, 0.022946870601609652, -0.05019226628920524 ],\n\t\t\t\t[ 0.02962780877005599, 0.9904344267538799, -0.017073799063418826 ],\n\t\t\t\t[ -0.009243040646204504, 0.015055191490298152, 0.7518742814281371 ],\n\t\t\t];\n\t\t}\n\t\telse if (env.W1 === WHITES.D50 && env.W2 === WHITES.D65) {\n\n\t\t\tenv.M = [\n\t\t\t\t[ 0.955473421488075, -0.02309845494876471, 0.06325924320057072 ],\n\t\t\t\t[ -0.0283697093338637, 1.0099953980813041, 0.021041441191917323 ],\n\t\t\t\t[ 0.012314014864481998, -0.020507649298898964, 1.330365926242124 ],\n\t\t\t];\n\t\t}\n\t}\n\n\thooks.run(\"chromatic-adaptation-end\", env);\n\n\tif (env.M) {\n\t\treturn multiplyMatrices(env.M, env.XYZ);\n\t}\n\telse {\n\t\tthrow new TypeError(\"Only Bradford CAT with white points D50 and D65 supported for now.\");\n\t}\n}\n\nconst noneTypes = new Set([\"<number>\", \"<percentage>\", \"<angle>\"]);\n\n/**\n * Validates the coordinates of a color against a format's coord grammar and\n * maps the coordinates to the range or refRange of the coordinates.\n * @param {ColorSpace} space - Colorspace the coords are in\n * @param {object} format - the format object to validate against\n * @param {string} name - the name of the color function. e.g. \"oklab\" or \"color\"\n * @returns {object[]} - an array of type metadata for each coordinate\n */\nfunction coerceCoords (space, format, name, coords) {\n\tlet types = Object.entries(space.coords).map(([id, coordMeta], i) => {\n\t\tlet coordGrammar = format.coordGrammar[i];\n\t\tlet arg = coords[i];\n\t\tlet providedType = arg?.type;\n\n\t\t// Find grammar alternative that matches the provided type\n\t\t// Non-strict equals is intentional because we are comparing w/ string objects\n\t\tlet type;\n\t\tif (arg.none) {\n\t\t\ttype = coordGrammar.find(c => noneTypes.has(c));\n\t\t}\n\t\telse {\n\t\t\ttype = coordGrammar.find(c => c == providedType);\n\t\t}\n\n\t\t// Check that each coord conforms to its grammar\n\t\tif (!type) {\n\t\t\t// Type does not exist in the grammar, throw\n\t\t\tlet coordName = coordMeta.name || id;\n\t\t\tthrow new TypeError(`${providedType ?? arg.raw} not allowed for ${coordName} in ${name}()`);\n\t\t}\n\n\t\tlet fromRange = type.range;\n\n\t\tif (providedType === \"<percentage>\") {\n\t\t\tfromRange ||= [0, 1];\n\t\t}\n\n\t\tlet toRange = coordMeta.range || coordMeta.refRange;\n\n\t\tif (fromRange && toRange) {\n\t\t\tcoords[i] = mapRange(fromRange, toRange, coords[i]);\n\t\t}\n\n\t\treturn type;\n\t});\n\n\treturn types;\n}\n\n\n/**\n * Convert a CSS Color string to a color object\n * @param {string} str\n * @param {object} [options]\n * @param {object} [options.meta] - Object for additional information about the parsing\n * @returns {Color}\n */\nfunction parse (str, {meta} = {}) {\n\tlet env = {\"str\": String(str)?.trim()};\n\thooks.run(\"parse-start\", env);\n\n\tif (env.color) {\n\t\treturn env.color;\n\t}\n\n\tenv.parsed = parseFunction(env.str);\n\n\tif (env.parsed) {\n\t\t// Is a functional syntax\n\t\tlet name = env.parsed.name;\n\n\t\tif (name === \"color\") {\n\t\t\t// color() function\n\t\t\tlet id = env.parsed.args.shift();\n\t\t\t// Check against both <dashed-ident> and <ident> versions\n\t\t\tlet alternateId = id.startsWith(\"--\") ? id.substring(2) : `--${id}`;\n\t\t\tlet ids = [id, alternateId];\n\t\t\tlet alpha = env.parsed.rawArgs.indexOf(\"/\") > 0 ? env.parsed.args.pop() : 1;\n\n\t\t\tfor (let space of ColorSpace.all) {\n\t\t\t\tlet colorSpec = space.getFormat(\"color\");\n\n\t\t\t\tif (colorSpec) {\n\t\t\t\t\tif (ids.includes(colorSpec.id) || colorSpec.ids?.filter((specId) => ids.includes(specId)).length) {\n\t\t\t\t\t\t// From https://drafts.csswg.org/css-color-4/#color-function\n\t\t\t\t\t\t// If more <number>s or <percentage>s are provided than parameters that the colorspace takes, the excess <number>s at the end are ignored.\n\t\t\t\t\t\t// If less <number>s or <percentage>s are provided than parameters that the colorspace takes, the missing parameters default to 0. (This is particularly convenient for multichannel printers where the additional inks are spot colors or varnishes that most colors on the page won’t use.)\n\t\t\t\t\t\tconst coords = Object.keys(space.coords).map((_, i) => env.parsed.args[i] || 0);\n\n\t\t\t\t\t\tlet types;\n\n\t\t\t\t\t\tif (colorSpec.coordGrammar) {\n\t\t\t\t\t\t\ttypes = coerceCoords(space, colorSpec, \"color\", coords);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta) {\n\t\t\t\t\t\t\tObject.assign(meta, {formatId: \"color\", types});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (colorSpec.id.startsWith(\"--\") && !id.startsWith(\"--\")) {\n\t\t\t\t\t\t\tdefaults.warn(`${space.name} is a non-standard space and not currently supported in the CSS spec. ` +\n\t\t\t\t\t\t\t `Use prefixed color(${colorSpec.id}) instead of color(${id}).`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (id.startsWith(\"--\") && !colorSpec.id.startsWith(\"--\")) {\n\t\t\t\t\t\t\tdefaults.warn(`${space.name} is a standard space and supported in the CSS spec. ` +\n\t\t\t\t\t\t\t `Use color(${colorSpec.id}) instead of prefixed color(${id}).`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {spaceId: space.id, coords, alpha};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Not found\n\t\t\tlet didYouMean = \"\";\n\t\t\tlet registryId = id in ColorSpace.registry ? id : alternateId;\n\t\t\tif (registryId in ColorSpace.registry) {\n\t\t\t\t// Used color space id instead of color() id, these are often different\n\t\t\t\tlet cssId = ColorSpace.registry[registryId].formats?.color?.id;\n\n\t\t\t\tif (cssId) {\n\t\t\t\t\tdidYouMean = `Did you mean color(${cssId})?`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new TypeError(`Cannot parse color(${id}). ` + (didYouMean || \"Missing a plugin?\"));\n\t\t}\n\t\telse {\n\t\t\tfor (let space of ColorSpace.all) {\n\t\t\t\t// color space specific function\n\t\t\t\tlet format = space.getFormat(name);\n\t\t\t\tif (format && format.type === \"function\") {\n\t\t\t\t\tlet alpha = 1;\n\n\t\t\t\t\tif (format.lastAlpha || last(env.parsed.args).alpha) {\n\t\t\t\t\t\talpha = env.parsed.args.pop();\n\t\t\t\t\t}\n\n\t\t\t\t\tlet coords = env.parsed.args;\n\n\t\t\t\t\tlet types;\n\n\t\t\t\t\tif (format.coordGrammar) {\n\t\t\t\t\t\ttypes = coerceCoords(space, format, name, coords);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tObject.assign(meta, {formatId: format.name, types});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tspaceId: space.id,\n\t\t\t\t\t\tcoords, alpha,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Custom, colorspace-specific format\n\t\tfor (let space of ColorSpace.all) {\n\t\t\tfor (let formatId in space.formats) {\n\t\t\t\tlet format = space.formats[formatId];\n\n\t\t\t\tif (format.type !== \"custom\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (format.test && !format.test(env.str)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet color = format.parse(env.str);\n\n\t\t\t\tif (color) {\n\t\t\t\t\tcolor.alpha ??= 1;\n\n\t\t\t\t\tif (meta) {\n\t\t\t\t\t\tmeta.formatId = formatId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn color;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// If we're here, we couldn't parse\n\tthrow new TypeError(`Could not parse ${str} as a color. Missing a plugin?`);\n}\n\n/**\n * Resolves a color reference (object or string) to a plain color object\n * @param {Color | {space, coords, alpha} | string | Array<Color | {space, coords, alpha} | string> } color\n * @returns {{space, coords, alpha} | Array<{space, coords, alpha}}>\n */\nfunction getColor (color) {\n\tif (Array.isArray(color)) {\n\t\treturn color.map(getColor);\n\t}\n\n\tif (!color) {\n\t\tthrow new TypeError(\"Empty color reference\");\n\t}\n\n\tif (isString(color)) {\n\t\tcolor = parse(color);\n\t}\n\n\t// Object fixup\n\tlet space = color.space || color.spaceId;\n\n\tif (!(space instanceof ColorSpace)) {\n\t\t// Convert string id to color space object\n\t\tcolor.space = ColorSpace.get(space);\n\t}\n\n\tif (color.alpha === undefined) {\n\t\tcolor.alpha = 1;\n\t}\n\n\treturn color;\n}\n\nconst ε$7 = .000075;\n\n/**\n * Class to represent a color space\n */\nclass ColorSpace {\n\tconstructor (options) {\n\t\tthis.id = options.id;\n\t\tthis.name = options.name;\n\t\tthis.base = options.base ? ColorSpace.get(options.base) : null;\n\t\tthis.aliases = options.aliases;\n\n\t\tif (this.base) {\n\t\t\tthis.fromBase = options.fromBase;\n\t\t\tthis.toBase = options.toBase;\n\t\t}\n\n\t\t// Coordinate metadata\n\n\t\tlet coords = options.coords ?? this.base.coords;\n\n\t\tfor (let name in coords) {\n\t\t\tif (!(\"name\" in coords[name])) {\n\t\t\t\tcoords[name].name = name;\n\t\t\t}\n\t\t}\n\t\tthis.coords = coords;\n\n\t\t// White point\n\n\t\tlet white = options.white ?? this.base.white ?? \"D65\";\n\t\tthis.white = getWhite(white);\n\n\t\t// Sort out formats\n\n\t\tthis.formats = options.formats ?? {};\n\n\t\tfor (let name in this.formats) {\n\t\t\tlet format = this.formats[name];\n\t\t\tformat.type ||= \"function\";\n\t\t\tformat.name ||= name;\n\t\t}\n\n\t\tif (!this.formats.color?.id) {\n\t\t\tthis.formats.color = {\n\t\t\t\t...this.formats.color ?? {},\n\t\t\t\tid: options.cssId || this.id,\n\t\t\t};\n\t\t}\n\n\t\t// Gamut space\n\n\t\tif (options.gamutSpace) {\n\t\t\t// Gamut space explicitly specified\n\t\t\tthis.gamutSpace = options.gamutSpace === \"self\" ? this : ColorSpace.get(options.gamutSpace);\n\t\t}\n\t\telse {\n\t\t\t// No gamut space specified, calculate a sensible default\n\t\t\tif (this.isPolar) {\n\t\t\t\t// Do not check gamut through polar coordinates\n\t\t\t\tthis.gamutSpace = this.base;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.gamutSpace = this;\n\t\t\t}\n\t\t}\n\n\t\t// Optimize inGamut for unbounded spaces\n\t\tif (this.gamutSpace.isUnbounded) {\n\t\t\tthis.inGamut = (coords, options) => {\n\t\t\t\treturn true;\n\t\t\t};\n\t\t}\n\n\t\t// Other stuff\n\t\tthis.referred = options.referred;\n\n\t\t// Compute ancestors and store them, since they will never change\n\t\tObject.defineProperty(this, \"path\", {\n\t\t\tvalue: getPath(this).reverse(),\n\t\t\twritable: false,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\n\t\thooks.run(\"colorspace-init-end\", this);\n\t}\n\n\tinGamut (coords, {epsilon = ε$7} = {}) {\n\t\tif (!this.equals(this.gamutSpace)) {\n\t\t\tcoords = this.to(this.gamutSpace, coords);\n\t\t\treturn this.gamutSpace.inGamut(coords, {epsilon});\n\t\t}\n\n\t\tlet coordMeta = Object.values(this.coords);\n\n\t\treturn coords.every((c, i) => {\n\t\t\tlet meta = coordMeta[i];\n\n\t\t\tif (meta.type !== \"angle\" && meta.range) {\n\t\t\t\tif (Number.isNaN(c)) {\n\t\t\t\t\t// NaN is always in gamut\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tlet [min, max] = meta.range;\n\t\t\t\treturn (min === undefined || c >= min - epsilon)\n\t\t\t\t && (max === undefined || c <= max + epsilon);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tget isUnbounded () {\n\t\treturn Object.values(this.coords).every(coord => !(\"range\" in coord));\n\t}\n\n\tget cssId () {\n\t\treturn this.formats?.color?.id || this.id;\n\t}\n\n\tget isPolar () {\n\t\tfor (let id in this.coords) {\n\t\t\tif (this.coords[id].type === \"angle\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetFormat (format) {\n\t\tif (typeof format === \"object\") {\n\t\t\tformat = processFormat(format, this);\n\t\t\treturn format;\n\t\t}\n\n\t\tlet ret;\n\t\tif (format === \"default\") {\n\t\t\t// Get first format\n\t\t\tret = Object.values(this.formats)[0];\n\t\t}\n\t\telse {\n\t\t\tret = this.formats[format];\n\t\t}\n\n\t\tif (ret) {\n\t\t\tret = processFormat(ret, this);\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check if this color space is the same as another color space reference.\n\t * Allows proxying color space objects and comparing color spaces with ids.\n\t * @param {string | ColorSpace} space ColorSpace object or id to compare to\n\t * @returns {boolean}\n\t */\n\tequals (space) {\n\t\tif (!space) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this === space || this.id === space || this.id === space.id;\n\t}\n\n\tto (space, coords) {\n\t\tif (arguments.length === 1) {\n\t\t\tconst color = getColor(space);\n\t\t\t[space, coords] = [color.space, color.coords];\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tif (this.equals(space)) {\n\t\t\t// Same space, no change needed\n\t\t\treturn coords;\n\t\t}\n\n\t\t// Convert NaN to 0, which seems to be valid in every coordinate of every color space\n\t\tcoords = coords.map(c => Number.isNaN(c) ? 0 : c);\n\n\t\t// Find connection space = lowest common ancestor in the base tree\n\t\tlet myPath = this.path;\n\t\tlet otherPath = space.path;\n\n\t\tlet connectionSpace, connectionSpaceIndex;\n\n\t\tfor (let i = 0; i < myPath.length; i++) {\n\t\t\tif (myPath[i].equals(otherPath[i])) {\n\t\t\t\tconnectionSpace = myPath[i];\n\t\t\t\tconnectionSpaceIndex = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!connectionSpace) {\n\t\t\t// This should never happen\n\t\t\tthrow new Error(`Cannot convert between color spaces ${this} and ${space}: no connection space was found`);\n\t\t}\n\n\t\t// Go up from current space to connection space\n\t\tfor (let i = myPath.length - 1; i > connectionSpaceIndex; i--) {\n\t\t\tcoords = myPath[i].toBase(coords);\n\t\t}\n\n\t\t// Go down from connection space to target space\n\t\tfor (let i = connectionSpaceIndex + 1; i < otherPath.length; i++) {\n\t\t\tcoords = otherPath[i].fromBase(coords);\n\t\t}\n\n\t\treturn coords;\n\t}\n\n\tfrom (space, coords) {\n\t\tif (arguments.length === 1) {\n\t\t\tconst color = getColor(space);\n\t\t\t[space, coords] = [color.space, color.coords];\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\treturn space.to(this, coords);\n\t}\n\n\ttoString () {\n\t\treturn `${this.name} (${this.id})`;\n\t}\n\n\tgetMinCoords () {\n\t\tlet ret = [];\n\n\t\tfor (let id in this.coords) {\n\t\t\tlet meta = this.coords[id];\n\t\t\tlet range = meta.range || meta.refRange;\n\t\t\tret.push(range?.min ?? 0);\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tstatic registry = {};\n\n\t// Returns array of unique color spaces\n\tstatic get all () {\n\t\treturn [...new Set(Object.values(ColorSpace.registry))];\n\t}\n\n\tstatic register (id, space) {\n\t\tif (arguments.length === 1) {\n\t\t\tspace = arguments[0];\n\t\t\tid = space.id;\n\t\t}\n\n\t\tspace = this.get(space);\n\n\t\tif (this.registry[id] && this.registry[id] !== space) {\n\t\t\tthrow new Error(`Duplicate color space registration: '${id}'`);\n\t\t}\n\t\tthis.registry[id] = space;\n\n\t\t// Register aliases when called without an explicit ID.\n\t\tif (arguments.length === 1 && space.aliases) {\n\t\t\tfor (let alias of space.aliases) {\n\t\t\t\tthis.register(alias, space);\n\t\t\t}\n\t\t}\n\n\t\treturn space;\n\t}\n\n\t/**\n\t * Lookup ColorSpace object by name\n\t * @param {ColorSpace | string} name\n\t */\n\tstatic get (space, ...alternatives) {\n\t\tif (!space || space instanceof ColorSpace) {\n\t\t\treturn space;\n\t\t}\n\n\t\tlet argType = type(space);\n\n\t\tif (argType === \"string\") {\n\t\t\t// It's a color space id\n\t\t\tlet ret = ColorSpace.registry[space.toLowerCase()];\n\n\t\t\tif (!ret) {\n\t\t\t\tthrow new TypeError(`No color space found with id = \"${space}\"`);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tif (alternatives.length) {\n\t\t\treturn ColorSpace.get(...alternatives);\n\t\t}\n\n\t\tthrow new TypeError(`${space} is not a valid color space`);\n\t}\n\n\t/**\n\t * Get metadata about a coordinate of a color space\n\t *\n\t * @static\n\t * @param {Array | string} ref\n\t * @param {ColorSpace | string} [workingSpace]\n\t * @return {Object}\n\t */\n\tstatic resolveCoord (ref, workingSpace) {\n\t\tlet coordType = type(ref);\n\t\tlet space, coord;\n\n\t\tif (coordType === \"string\") {\n\t\t\tif (ref.includes(\".\")) {\n\t\t\t\t// Absolute coordinate\n\t\t\t\t[space, coord] = ref.split(\".\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Relative coordinate\n\t\t\t\t[space, coord] = [, ref];\n\t\t\t}\n\t\t}\n\t\telse if (Array.isArray(ref)) {\n\t\t\t[space, coord] = ref;\n\t\t}\n\t\telse {\n\t\t\t// Object\n\t\t\tspace = ref.space;\n\t\t\tcoord = ref.coordId;\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tif (!space) {\n\t\t\tspace = workingSpace;\n\t\t}\n\n\t\tif (!space) {\n\t\t\tthrow new TypeError(`Cannot resolve coordinate reference ${ref}: No color space specified and relative references are not allowed here`);\n\t\t}\n\n\t\tcoordType = type(coord);\n\n\t\tif (coordType === \"number\" || coordType === \"string\" && coord >= 0) {\n\t\t\t// Resolve numerical coord\n\t\t\tlet meta = Object.entries(space.coords)[coord];\n\n\t\t\tif (meta) {\n\t\t\t\treturn {space, id: meta[0], index: coord, ...meta[1]};\n\t\t\t}\n\t\t}\n\n\t\tspace = ColorSpace.get(space);\n\n\t\tlet normalizedCoord = coord.toLowerCase();\n\n\t\tlet i = 0;\n\t\tfor (let id in space.coords) {\n\t\t\tlet meta = space.coords[id];\n\n\t\t\tif (id.toLowerCase() === normalizedCoord || meta.name?.toLowerCase() === normalizedCoord) {\n\t\t\t\treturn {space, id, index: i, ...meta};\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\tthrow new TypeError(`No \"${coord}\" coordinate found in ${space.name}. Its coordinates are: ${Object.keys(space.coords).join(\", \")}`);\n\t}\n\n\tstatic DEFAULT_FORMAT = {\n\t\ttype: \"functions\",\n\t\tname: \"color\",\n\t};\n}\n\nfunction getPath (space) {\n\tlet ret = [space];\n\n\tfor (let s = space; s = s.base;) {\n\t\tret.push(s);\n\t}\n\n\treturn ret;\n}\n\nfunction processFormat (format, {coords} = {}) {\n\tif (format.coords && !format.coordGrammar) {\n\t\tformat.type ||= \"function\";\n\t\tformat.name ||= \"color\";\n\n\t\t// Format has not been processed\n\t\tformat.coordGrammar = parseCoordGrammar(format.coords);\n\n\t\tlet coordFormats = Object.entries(coords).map(([id, coordMeta], i) => {\n\t\t\t// Preferred format for each coord is the first one\n\t\t\tlet outputType = format.coordGrammar[i][0];\n\n\t\t\tlet fromRange = coordMeta.range || coordMeta.refRange;\n\t\t\tlet toRange = outputType.range, suffix = \"\";\n\n\t\t\t// Non-strict equals intentional since outputType could be a string object\n\t\t\tif (outputType == \"<percentage>\") {\n\t\t\t\ttoRange = [0, 100];\n\t\t\t\tsuffix = \"%\";\n\t\t\t}\n\t\t\telse if (outputType == \"<angle>\") {\n\t\t\t\tsuffix = \"deg\";\n\t\t\t}\n\n\t\t\treturn {fromRange, toRange, suffix};\n\t\t});\n\n\t\tformat.serializeCoords = (coords, precision) => {\n\t\t\treturn coords.map((c, i) => {\n\t\t\t\tlet {fromRange, toRange, suffix} = coordFormats[i];\n\n\t\t\t\tif (fromRange && toRange) {\n\t\t\t\t\tc = mapRange(fromRange, toRange, c);\n\t\t\t\t}\n\n\t\t\t\tc = serializeNumber(c, {precision, unit: suffix});\n\n\t\t\t\treturn c;\n\t\t\t});\n\t\t};\n\t}\n\n\treturn format;\n}\n\nvar xyz_d65 = new ColorSpace({\n\tid: \"xyz-d65\",\n\tname: \"XYZ D65\",\n\tcoords: {\n\t\tx: {name: \"X\"},\n\t\ty: {name: \"Y\"},\n\t\tz: {name: \"Z\"},\n\t},\n\twhite: \"D65\",\n\tformats: {\n\t\tcolor: {\n\t\t\tids: [\"xyz-d65\", \"xyz\"],\n\t\t},\n\t},\n\taliases: [\"xyz\"],\n});\n\n/**\n * Convenience class for RGB color spaces\n * @extends {ColorSpace}\n */\nclass RGBColorSpace extends ColorSpace {\n\t/**\n\t * Creates a new RGB ColorSpace.\n\t * If coords are not specified, they will use the default RGB coords.\n\t * Instead of `fromBase()` and `toBase()` functions,\n\t * you can specify to/from XYZ matrices and have `toBase()` and `fromBase()` automatically generated.\n\t * @param {*} options - Same options as {@link ColorSpace} plus:\n\t * @param {number[][]} options.toXYZ_M - Matrix to convert to XYZ\n\t * @param {number[][]} options.fromXYZ_M - Matrix to convert from XYZ\n\t */\n\tconstructor (options) {\n\t\tif (!options.coords) {\n\t\t\toptions.coords = {\n\t\t\t\tr: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Red\",\n\t\t\t\t},\n\t\t\t\tg: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Green\",\n\t\t\t\t},\n\t\t\t\tb: {\n\t\t\t\t\trange: [0, 1],\n\t\t\t\t\tname: \"Blue\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (!options.base) {\n\t\t\toptions.base = xyz_d65;\n\t\t}\n\n\t\tif (options.toXYZ_M && options.fromXYZ_M) {\n\t\t\toptions.toBase ??= rgb => {\n\t\t\t\tlet xyz = multiplyMatrices(options.toXYZ_M, rgb);\n\n\t\t\t\tif (this.white !== this.base.white) {\n\t\t\t\t\t// Perform chromatic adaptation\n\t\t\t\t\txyz = adapt$2(this.white, this.base.white, xyz);\n\t\t\t\t}\n\n\t\t\t\treturn xyz;\n\t\t\t};\n\n\t\t\toptions.fromBase ??= xyz => {\n\t\t\t\txyz = adapt$2(this.base.white, this.white, xyz);\n\t\t\t\treturn multiplyMatrices(options.fromXYZ_M, xyz);\n\t\t\t};\n\t\t}\n\n\t\toptions.referred ??= \"display\";\n\n\t\tsuper(options);\n\t}\n}\n\n/**\n * Get the coordinates of a color in any color space\n * @param {Color} color\n * @param {string | ColorSpace} [space = color.space] The color space to convert to. Defaults to the color's current space\n * @returns {number[]} The color coordinates in the given color space\n */\nfunction getAll (color, space) {\n\tcolor = getColor(color);\n\n\tif (!space || color.space.equals(space)) {\n\t\t// No conversion needed\n\t\treturn color.coords.slice();\n\t}\n\n\tspace = ColorSpace.get(space);\n\treturn space.from(color);\n}\n\nfunction get (color, prop) {\n\tcolor = getColor(color);\n\n\tlet {space, index} = ColorSpace.resolveCoord(prop, color.space);\n\tlet coords = getAll(color, space);\n\treturn coords[index];\n}\n\nfunction setAll (color, space, coords) {\n\tcolor = getColor(color);\n\n\tspace = ColorSpace.get(space);\n\tcolor.coords = space.to(color.space, coords);\n\treturn color;\n}\n\nsetAll.returns = \"color\";\n\n// Set properties and return current instance\nfunction set (color, prop, value) {\n\tcolor = getColor(color);\n\n\tif (arguments.length === 2 && type(arguments[1]) === \"object\") {\n\t\t// Argument is an object literal\n\t\tlet object = arguments[1];\n\t\tfor (let p in object) {\n\t\t\tset(color, p, object[p]);\n\t\t}\n\t}\n\telse {\n\t\tif (typeof value === \"function\") {\n\t\t\tvalue = value(get(color, prop));\n\t\t}\n\n\t\tlet {space, index} = ColorSpace.resolveCoord(prop, color.space);\n\t\tlet coords = getAll(color, space);\n\t\tcoords[index] = value;\n\t\tsetAll(color, space, coords);\n\t}\n\n\treturn color;\n}\n\nset.returns = \"color\";\n\nvar XYZ_D50 = new ColorSpace({\n\tid: \"xyz-d50\",\n\tname: \"XYZ D50\",\n\twhite: \"D50\",\n\tbase: xyz_d65,\n\tfromBase: coords => adapt$2(xyz_d65.white, \"D50\", coords),\n\ttoBase: coords => adapt$2(\"D50\", xyz_d65.white, coords),\n});\n\n// κ * ε = 2^3 = 8\nconst ε$6 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst ε3$1 = 24 / 116;\nconst κ$4 = 24389 / 27; // 29^3/3^3\n\nlet white$4 = WHITES.D50;\n\nvar lab = new ColorSpace({\n\tid: \"lab\",\n\tname: \"Lab\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t},\n\n\t// Assuming XYZ is relative to D50, convert to CIE Lab\n\t// from CIE standard, which now defines these as a rational fraction\n\twhite: white$4,\n\n\tbase: XYZ_D50,\n\t// Convert D50-adapted XYX to Lab\n\t// CIE 15.3:2004 section 8.2.1.1\n\tfromBase (XYZ) {\n\t\t// compute xyz, which is XYZ scaled relative to reference white\n\t\tlet xyz = XYZ.map((value, i) => value / white$4[i]);\n\n\t\t// now compute f\n\t\tlet f = xyz.map(value => value > ε$6 ? Math.cbrt(value) : (κ$4 * value + 16) / 116);\n\n\t\treturn [\n\t\t\t(116 * f[1]) - 16, // L\n\t\t\t500 * (f[0] - f[1]), // a\n\t\t\t200 * (f[1] - f[2]), // b\n\t\t];\n\t},\n\t// Convert Lab to D50-adapted XYZ\n\t// Same result as CIE 15.3:2004 Appendix D although the derivation is different\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\ttoBase (Lab) {\n\t\t// compute f, starting with the luminance-related term\n\t\tlet f = [];\n\t\tf[1] = (Lab[0] + 16) / 116;\n\t\tf[0] = Lab[1] / 500 + f[1];\n\t\tf[2] = f[1] - Lab[2] / 200;\n\n\t\t// compute xyz\n\t\tlet xyz = [\n\t\t\tf[0] > ε3$1 ? Math.pow(f[0], 3) : (116 * f[0] - 16) / κ$4,\n\t\t\tLab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / κ$4,\n\t\t\tf[2] > ε3$1 ? Math.pow(f[2], 3) : (116 * f[2] - 16) / κ$4,\n\t\t];\n\n\t\t// Compute XYZ by scaling xyz by reference white\n\t\treturn xyz.map((value, i) => value * white$4[i]);\n\t},\n\n\tformats: {\n\t\t\"lab\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nfunction constrain (angle) {\n\treturn ((angle % 360) + 360) % 360;\n}\n\nfunction adjust (arc, angles) {\n\tif (arc === \"raw\") {\n\t\treturn angles;\n\t}\n\n\tlet [a1, a2] = angles.map(constrain);\n\n\tlet angleDiff = a2 - a1;\n\n\tif (arc === \"increasing\") {\n\t\tif (angleDiff < 0) {\n\t\t\ta2 += 360;\n\t\t}\n\t}\n\telse if (arc === \"decreasing\") {\n\t\tif (angleDiff > 0) {\n\t\t\ta1 += 360;\n\t\t}\n\t}\n\telse if (arc === \"longer\") {\n\t\tif (-180 < angleDiff && angleDiff < 180) {\n\t\t\tif (angleDiff > 0) {\n\t\t\t\ta1 += 360;\n\t\t\t}\n\t\t\telse {\n\t\t\t\ta2 += 360;\n\t\t\t}\n\t\t}\n\t}\n\telse if (arc === \"shorter\") {\n\t\tif (angleDiff > 180) {\n\t\t\ta1 += 360;\n\t\t}\n\t\telse if (angleDiff < -180) {\n\t\t\ta2 += 360;\n\t\t}\n\t}\n\n\treturn [a1, a2];\n}\n\nvar lch = new ColorSpace({\n\tid: \"lch\",\n\tname: \"LCH\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 150],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: lab,\n\tfromBase (Lab) {\n\t\t// Convert to polar form\n\t\tlet [L, a, b] = Lab;\n\t\tlet hue;\n\t\tconst ε = 0.02;\n\n\t\tif (Math.abs(a) < ε && Math.abs(b) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(b, a) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // L is still L\n\t\t\tMath.sqrt(a ** 2 + b ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (LCH) {\n\t\t// Convert from polar form\n\t\tlet [Lightness, Chroma, Hue] = LCH;\n\t\t// Clamp any negative Chroma\n\t\tif (Chroma < 0) {\n\t\t\tChroma = 0;\n\t\t}\n\t\t// Deal with NaN Hue\n\t\tif (isNaN(Hue)) {\n\t\t\tHue = 0;\n\t\t}\n\t\treturn [\n\t\t\tLightness, // L is still L\n\t\t\tChroma * Math.cos(Hue * Math.PI / 180), // a\n\t\t\tChroma * Math.sin(Hue * Math.PI / 180), // b\n\t\t];\n\t},\n\n\tformats: {\n\t\t\"lch\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\n// deltaE2000 is a statistically significant improvement\n// and is recommended by the CIE and Idealliance\n// especially for color differences less than 10 deltaE76\n// but is wicked complicated\n// and many implementations have small errors!\n// DeltaE2000 is also discontinuous; in case this\n// matters to you, use deltaECMC instead.\n\nconst Gfactor = 25 ** 7;\nconst π$1 = Math.PI;\nconst r2d = 180 / π$1;\nconst d2r$1 = π$1 / 180;\n\nfunction pow7 (x) {\n\t// Faster than x ** 7 or Math.pow(x, 7)\n\n\tconst x2 = x * x;\n\tconst x7 = x2 * x2 * x2 * x;\n\n\treturn x7;\n}\n\nfunction deltaE2000 (color, sample, {kL = 1, kC = 1, kH = 1} = {}) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and the function parameter as the sample,\n\t// calculate deltaE 2000.\n\n\t// This implementation assumes the parametric\n\t// weighting factors kL, kC and kH\n\t// for the influence of viewing conditions\n\t// are all 1, as sadly seems typical.\n\t// kL should be increased for lightness texture or noise\n\t// and kC increased for chroma noise\n\n\tlet [L1, a1, b1] = lab.from(color);\n\tlet C1 = lch.from(lab, [L1, a1, b1])[1];\n\tlet [L2, a2, b2] = lab.from(sample);\n\tlet C2 = lch.from(lab, [L2, a2, b2])[1];\n\n\t// Check for negative Chroma,\n\t// which might happen through\n\t// direct user input of LCH values\n\n\tif (C1 < 0) {\n\t\tC1 = 0;\n\t}\n\tif (C2 < 0) {\n\t\tC2 = 0;\n\t}\n\n\tlet Cbar = (C1 + C2) / 2; // mean Chroma\n\n\t// calculate a-axis asymmetry factor from mean Chroma\n\t// this turns JND ellipses for near-neutral colors back into circles\n\tlet C7 = pow7(Cbar);\n\n\tlet G = 0.5 * (1 - Math.sqrt(C7 / (C7 + Gfactor)));\n\n\t// scale a axes by asymmetry factor\n\t// this by the way is why there is no Lab2000 colorspace\n\tlet adash1 = (1 + G) * a1;\n\tlet adash2 = (1 + G) * a2;\n\n\t// calculate new Chroma from scaled a and original b axes\n\tlet Cdash1 = Math.sqrt(adash1 ** 2 + b1 ** 2);\n\tlet Cdash2 = Math.sqrt(adash2 ** 2 + b2 ** 2);\n\n\t// calculate new hues, with zero hue for true neutrals\n\t// and in degrees, not radians\n\n\tlet h1 = (adash1 === 0 && b1 === 0) ? 0 : Math.atan2(b1, adash1);\n\tlet h2 = (adash2 === 0 && b2 === 0) ? 0 : Math.atan2(b2, adash2);\n\n\tif (h1 < 0) {\n\t\th1 += 2 * π$1;\n\t}\n\tif (h2 < 0) {\n\t\th2 += 2 * π$1;\n\t}\n\n\th1 *= r2d;\n\th2 *= r2d;\n\n\t// Lightness and Chroma differences; sign matters\n\tlet ΔL = L2 - L1;\n\tlet ΔC = Cdash2 - Cdash1;\n\n\t// Hue difference, getting the sign correct\n\tlet hdiff = h2 - h1;\n\tlet hsum = h1 + h2;\n\tlet habs = Math.abs(hdiff);\n\tlet Δh;\n\n\tif (Cdash1 * Cdash2 === 0) {\n\t\tΔh = 0;\n\t}\n\telse if (habs <= 180) {\n\t\tΔh = hdiff;\n\t}\n\telse if (hdiff > 180) {\n\t\tΔh = hdiff - 360;\n\t}\n\telse if (hdiff < -180) {\n\t\tΔh = hdiff + 360;\n\t}\n\telse {\n\t\tdefaults.warn(\"the unthinkable has happened\");\n\t}\n\n\t// weighted Hue difference, more for larger Chroma\n\tlet ΔH = 2 * Math.sqrt(Cdash2 * Cdash1) * Math.sin(Δh * d2r$1 / 2);\n\n\t// calculate mean Lightness and Chroma\n\tlet Ldash = (L1 + L2) / 2;\n\tlet Cdash = (Cdash1 + Cdash2) / 2;\n\tlet Cdash7 = pow7(Cdash);\n\n\t// Compensate for non-linearity in the blue region of Lab.\n\t// Four possibilities for hue weighting factor,\n\t// depending on the angles, to get the correct sign\n\tlet hdash;\n\tif (Cdash1 * Cdash2 === 0) {\n\t\thdash = hsum; // which should be zero\n\t}\n\telse if (habs <= 180) {\n\t\thdash = hsum / 2;\n\t}\n\telse if (hsum < 360) {\n\t\thdash = (hsum + 360) / 2;\n\t}\n\telse {\n\t\thdash = (hsum - 360) / 2;\n\t}\n\n\t// positional corrections to the lack of uniformity of CIELAB\n\t// These are all trying to make JND ellipsoids more like spheres\n\n\t// SL Lightness crispening factor\n\t// a background with L=50 is assumed\n\tlet lsq = (Ldash - 50) ** 2;\n\tlet SL = 1 + ((0.015 * lsq) / Math.sqrt(20 + lsq));\n\n\t// SC Chroma factor, similar to those in CMC and deltaE 94 formulae\n\tlet SC = 1 + 0.045 * Cdash;\n\n\t// Cross term T for blue non-linearity\n\tlet T = 1;\n\tT -= (0.17 * Math.cos(( hdash - 30) * d2r$1));\n\tT += (0.24 * Math.cos( 2 * hdash * d2r$1));\n\tT += (0.32 * Math.cos(((3 * hdash) + 6) * d2r$1));\n\tT -= (0.20 * Math.cos(((4 * hdash) - 63) * d2r$1));\n\n\t// SH Hue factor depends on Chroma,\n\t// as well as adjusted hue angle like deltaE94.\n\tlet SH = 1 + 0.015 * Cdash * T;\n\n\t// RT Hue rotation term compensates for rotation of JND ellipses\n\t// and Munsell constant hue lines\n\t// in the medium-high Chroma blue region\n\t// (Hue 225 to 315)\n\tlet Δθ = 30 * Math.exp(-1 * (((hdash - 275) / 25) ** 2));\n\tlet RC = 2 * Math.sqrt(Cdash7 / (Cdash7 + Gfactor));\n\tlet RT = -1 * Math.sin(2 * Δθ * d2r$1) * RC;\n\n\t// Finally calculate the deltaE, term by term as root sume of squares\n\tlet dE = (ΔL / (kL * SL)) ** 2;\n\tdE += (ΔC / (kC * SC)) ** 2;\n\tdE += (ΔH / (kH * SH)) ** 2;\n\tdE += RT * (ΔC / (kC * SC)) * (ΔH / (kH * SH));\n\treturn Math.sqrt(dE);\n\t// Yay!!!\n}\n\n// Recalculated for consistent reference white\n// see https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-943521484\nconst XYZtoLMS_M$1 = [\n\t[ 0.8190224379967030, 0.3619062600528904, -0.1288737815209879 ],\n\t[ 0.0329836539323885, 0.9292868615863434, 0.0361446663506424 ],\n\t[ 0.0481771893596242, 0.2642395317527308, 0.6335478284694309 ],\n];\n// inverse of XYZtoLMS_M\nconst LMStoXYZ_M$1 = [\n\t[ 1.2268798758459243, -0.5578149944602171, 0.2813910456659647 ],\n\t[ -0.0405757452148008, 1.1122868032803170, -0.0717110580655164 ],\n\t[ -0.0763729366746601, -0.4214933324022432, 1.5869240198367816 ],\n];\nconst LMStoLab_M = [\n\t[ 0.2104542683093140, 0.7936177747023054, -0.0040720430116193 ],\n\t[ 1.9779985324311684, -2.4285922420485799, 0.4505937096174110 ],\n\t[ 0.0259040424655478, 0.7827717124575296, -0.8086757549230774 ],\n];\n// LMStoIab_M inverted\nconst LabtoLMS_M = [\n\t[ 1.0000000000000000, 0.3963377773761749, 0.2158037573099136 ],\n\t[ 1.0000000000000000, -0.1055613458156586, -0.0638541728258133 ],\n\t[ 1.0000000000000000, -0.0894841775298119, -1.2914855480194092 ],\n];\n\nvar OKLab = new ColorSpace({\n\tid: \"oklab\",\n\tname: \"Oklab\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-0.4, 0.4],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-0.4, 0.4],\n\t\t},\n\t},\n\n\t// Note that XYZ is relative to D65\n\twhite: \"D65\",\n\tbase: xyz_d65,\n\tfromBase (XYZ) {\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoLMS_M$1, XYZ);\n\n\t\t// non-linearity\n\t\tlet LMSg = LMS.map(val => Math.cbrt(val));\n\n\t\treturn multiplyMatrices(LMStoLab_M, LMSg);\n\n\t},\n\ttoBase (OKLab) {\n\t\t// move to LMS cone domain\n\t\tlet LMSg = multiplyMatrices(LabtoLMS_M, OKLab);\n\n\t\t// restore linearity\n\t\tlet LMS = LMSg.map(val => val ** 3);\n\n\t\treturn multiplyMatrices(LMStoXYZ_M$1, LMS);\n\t},\n\n\tformats: {\n\t\t\"oklab\": {\n\t\t\tcoords: [\"<percentage> | <number>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in CIE Lab\n\n\nfunction deltaEOK (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaEOK, term by term as root sum of squares\n\tlet [L1, a1, b1] = OKLab.from(color);\n\tlet [L2, a2, b2] = OKLab.from(sample);\n\tlet ΔL = L1 - L2;\n\tlet Δa = a1 - a2;\n\tlet Δb = b1 - b2;\n\treturn Math.sqrt(ΔL ** 2 + Δa ** 2 + Δb ** 2);\n}\n\nconst ε$5 = .000075;\n\n/**\n * Check if a color is in gamut of either its own or another color space\n * @return {Boolean} Is the color in gamut?\n */\nfunction inGamut (color, space, {epsilon = ε$5} = {}) {\n\tcolor = getColor(color);\n\n\tif (!space) {\n\t\tspace = color.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\tlet coords = color.coords;\n\n\tif (space !== color.space) {\n\t\tcoords = space.from(color);\n\t}\n\n\treturn space.inGamut(coords, {epsilon});\n}\n\nfunction clone (color) {\n\treturn {\n\t\tspace: color.space,\n\t\tcoords: color.coords.slice(),\n\t\talpha: color.alpha,\n\t};\n}\n\n/**\n * Euclidean distance of colors in an arbitrary color space\n */\nfunction distance (color1, color2, space = \"lab\") {\n\tspace = ColorSpace.get(space);\n\n\t// Assume getColor() is called on color in space.from()\n\tlet coords1 = space.from(color1);\n\tlet coords2 = space.from(color2);\n\n\treturn Math.sqrt(coords1.reduce((acc, c1, i) => {\n\t\tlet c2 = coords2[i];\n\t\tif (isNaN(c1) || isNaN(c2)) {\n\t\t\treturn acc;\n\t\t}\n\n\t\treturn acc + (c2 - c1) ** 2;\n\t}, 0));\n}\n\nfunction deltaE76 (color, sample) {\n\t// Assume getColor() is called in the distance function\n\treturn distance(color, sample, \"lab\");\n}\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in Lab\n\n// CMC by the Color Measurement Committee of the\n// Bradford Society of Dyeists and Colorsts, 1994.\n// Uses LCH rather than Lab,\n// with different weights for L, C and H differences\n// A nice increase in accuracy for modest increase in complexity\nconst π = Math.PI;\nconst d2r = π / 180;\n\nfunction deltaECMC (color, sample, {l = 2, c = 1} = {}) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE CMC.\n\n\t// This implementation assumes the parametric\n\t// weighting factors l:c are 2:1\n\t// which is typical for non-textile uses.\n\n\tlet [L1, a1, b1] = lab.from(color);\n\tlet [, C1, H1] = lch.from(lab, [L1, a1, b1]);\n\tlet [L2, a2, b2] = lab.from(sample);\n\tlet C2 = lch.from(lab, [L2, a2, b2])[1];\n\n\t// let [L1, a1, b1] = color.getAll(lab);\n\t// let C1 = color.get(\"lch.c\");\n\t// let H1 = color.get(\"lch.h\");\n\t// let [L2, a2, b2] = sample.getAll(lab);\n\t// let C2 = sample.get(\"lch.c\");\n\n\t// Check for negative Chroma,\n\t// which might happen through\n\t// direct user input of LCH values\n\n\tif (C1 < 0) {\n\t\tC1 = 0;\n\t}\n\tif (C2 < 0) {\n\t\tC2 = 0;\n\t}\n\n\t// we don't need H2 as ΔH is calculated from Δa, Δb and ΔC\n\n\t// Lightness and Chroma differences\n\t// These are (color - sample), unlike deltaE2000\n\tlet ΔL = L1 - L2;\n\tlet ΔC = C1 - C2;\n\n\tlet Δa = a1 - a2;\n\tlet Δb = b1 - b2;\n\n\t// weighted Hue difference, less for larger Chroma difference\n\n\tlet H2 = (Δa ** 2) + (Δb ** 2) - (ΔC ** 2);\n\t// due to roundoff error it is possible that, for zero a and b,\n\t// ΔC > Δa + Δb is 0, resulting in attempting\n\t// to take the square root of a negative number\n\n\t// trying instead the equation from Industrial Color Physics\n\t// By Georg A. Klein\n\n\t// let ΔH = ((a1 * b2) - (a2 * b1)) / Math.sqrt(0.5 * ((C2 * C1) + (a2 * a1) + (b2 * b1)));\n\t// console.log({ΔH});\n\t// This gives the same result to 12 decimal places\n\t// except it sometimes NaNs when trying to root a negative number\n\n\t// let ΔH = Math.sqrt(H2); we never actually use the root, it gets squared again!!\n\n\t// positional corrections to the lack of uniformity of CIELAB\n\t// These are all trying to make JND ellipsoids more like spheres\n\n\t// SL Lightness crispening factor, depends entirely on L1 not L2\n\tlet SL = 0.511;\t// linear portion of the Y to L transfer function\n\tif (L1 >= 16) {\t// cubic portion\n\t\tSL = (0.040975 * L1) / (1 + 0.01765 * L1);\n\t}\n\n\t// SC Chroma factor\n\tlet SC = ((0.0638 * C1) / (1 + 0.0131 * C1)) + 0.638;\n\n\t// Cross term T for blue non-linearity\n\tlet T;\n\tif (Number.isNaN(H1)) {\n\t\tH1 = 0;\n\t}\n\n\tif (H1 >= 164 && H1 <= 345) {\n\t\tT = 0.56 + Math.abs(0.2 * Math.cos((H1 + 168) * d2r));\n\t}\n\telse {\n\t\tT = 0.36 + Math.abs(0.4 * Math.cos((H1 + 35) * d2r));\n\t}\n\t// console.log({T});\n\n\t// SH Hue factor also depends on C1,\n\tlet C4 = Math.pow(C1, 4);\n\tlet F = Math.sqrt(C4 / (C4 + 1900));\n\tlet SH = SC * ((F * T) + 1 - F);\n\n\t// Finally calculate the deltaE, term by term as root sume of squares\n\tlet dE = (ΔL / (l * SL)) ** 2;\n\tdE += (ΔC / (c * SC)) ** 2;\n\tdE += (H2 / (SH ** 2));\n\t// dE += (ΔH / SH) ** 2;\n\treturn Math.sqrt(dE);\n\t// Yay!!!\n}\n\nconst Yw$1 = 203;\t// absolute luminance of media white\n\nvar XYZ_Abs_D65 = new ColorSpace({\n// Absolute CIE XYZ, with a D65 whitepoint,\n// as used in most HDR colorspaces as a starting point.\n// SDR spaces are converted per BT.2048\n// so that diffuse, media white is 203 cd/m²\n\tid: \"xyz-abs-d65\",\n\tcssId: \"--xyz-abs-d65\",\n\tname: \"Absolute XYZ D65\",\n\tcoords: {\n\t\tx: {\n\t\t\trefRange: [0, 9504.7],\n\t\t\tname: \"Xa\",\n\t\t},\n\t\ty: {\n\t\t\trefRange: [0, 10000],\n\t\t\tname: \"Ya\",\n\t\t},\n\t\tz: {\n\t\t\trefRange: [0, 10888.3],\n\t\t\tname: \"Za\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\tfromBase (XYZ) {\n\t\t// Make XYZ absolute, not relative to media white\n\t\t// Maximum luminance in PQ is 10,000 cd/m²\n\t\t// Relative XYZ has Y=1 for media white\n\t\treturn XYZ.map (v => Math.max(v * Yw$1, 0));\n\t},\n\ttoBase (AbsXYZ) {\n\t\t// Convert to media-white relative XYZ\n\t\treturn AbsXYZ.map(v => Math.max(v / Yw$1, 0));\n\t},\n});\n\nconst b$1 = 1.15;\nconst g = 0.66;\nconst n$1 = 2610 / (2 ** 14);\nconst ninv$1 = (2 ** 14) / 2610;\nconst c1$2 = 3424 / (2 ** 12);\nconst c2$2 = 2413 / (2 ** 7);\nconst c3$2 = 2392 / (2 ** 7);\nconst p = 1.7 * 2523 / (2 ** 5);\nconst pinv = (2 ** 5) / (1.7 * 2523);\nconst d = -0.56;\nconst d0 = 1.6295499532821566E-11;\n\nconst XYZtoCone_M = [\n\t[ 0.41478972, 0.579999, 0.0146480 ],\n\t[ -0.2015100, 1.120649, 0.0531008 ],\n\t[ -0.0166008, 0.264800, 0.6684799 ],\n];\n// XYZtoCone_M inverted\nconst ConetoXYZ_M = [\n\t[ 1.9242264357876067, -1.0047923125953657, 0.037651404030618 ],\n\t[ 0.35031676209499907, 0.7264811939316552, -0.06538442294808501 ],\n\t[ -0.09098281098284752, -0.3127282905230739, 1.5227665613052603 ],\n];\nconst ConetoIab_M = [\n\t[ 0.5, 0.5, 0 ],\n\t[ 3.524000, -4.066708, 0.542708 ],\n\t[ 0.199076, 1.096799, -1.295875 ],\n];\n// ConetoIab_M inverted\nconst IabtoCone_M = [\n\t[ 1, 0.1386050432715393, 0.05804731615611886 ],\n\t[ 0.9999999999999999, -0.1386050432715393, -0.05804731615611886 ],\n\t[ 0.9999999999999998, -0.09601924202631895, -0.8118918960560388 ],\n];\n\nvar Jzazbz = new ColorSpace({\n\tid: \"jzazbz\",\n\tname: \"Jzazbz\",\n\tcoords: {\n\t\tjz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Jz\",\n\t\t},\n\t\taz: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t},\n\t\tbz: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t},\n\t},\n\n\tbase: XYZ_Abs_D65,\n\tfromBase (XYZ) {\n\t\t// First make XYZ absolute, not relative to media white\n\t\t// Maximum luminance in PQ is 10,000 cd/m²\n\t\t// Relative XYZ has Y=1 for media white\n\t\t// BT.2048 says media white Y=203 at PQ 58\n\n\t\tlet [ Xa, Ya, Za ] = XYZ;\n\n\t\t// modify X and Y\n\t\tlet Xm = (b$1 * Xa) - ((b$1 - 1) * Za);\n\t\tlet Ym = (g * Ya) - ((g - 1) * Xa);\n\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoCone_M, [ Xm, Ym, Za ]);\n\n\t\t// PQ-encode LMS\n\t\tlet PQLMS = LMS.map (function (val) {\n\t\t\tlet num = c1$2 + (c2$2 * ((val / 10000) ** n$1));\n\t\t\tlet denom = 1 + (c3$2 * ((val / 10000) ** n$1));\n\n\t\t\treturn (num / denom) ** p;\n\t\t});\n\n\t\t// almost there, calculate Iz az bz\n\t\tlet [ Iz, az, bz] = multiplyMatrices(ConetoIab_M, PQLMS);\n\t\t// console.log({Iz, az, bz});\n\n\t\tlet Jz = ((1 + d) * Iz) / (1 + (d * Iz)) - d0;\n\t\treturn [Jz, az, bz];\n\t},\n\ttoBase (Jzazbz) {\n\t\tlet [Jz, az, bz] = Jzazbz;\n\t\tlet Iz = (Jz + d0) / (1 + d - d * (Jz + d0));\n\n\t\t// bring into LMS cone domain\n\t\tlet PQLMS = multiplyMatrices(IabtoCone_M, [ Iz, az, bz ]);\n\n\t\t// convert from PQ-coded to linear-light\n\t\tlet LMS = PQLMS.map(function (val) {\n\t\t\tlet num = (c1$2 - (val ** pinv));\n\t\t\tlet denom = (c3$2 * (val ** pinv)) - c2$2;\n\t\t\tlet x = 10000 * ((num / denom) ** ninv$1);\n\n\t\t\treturn (x); \t// luminance relative to diffuse white, [0, 70 or so].\n\t\t});\n\n\t\t// modified abs XYZ\n\t\tlet [ Xm, Ym, Za ] = multiplyMatrices(ConetoXYZ_M, LMS);\n\n\t\t// restore standard D50 relative XYZ, relative to media white\n\t\tlet Xa = (Xm + ((b$1 - 1) * Za)) / b$1;\n\t\tlet Ya = (Ym + ((g - 1) * Xa)) / g;\n\t\treturn [ Xa, Ya, Za ];\n\t},\n\n\tformats: {\n\t\t// https://drafts.csswg.org/css-color-hdr/#Jzazbz\n\t\t\"color\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nvar jzczhz = new ColorSpace({\n\tid: \"jzczhz\",\n\tname: \"JzCzHz\",\n\tcoords: {\n\t\tjz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Jz\",\n\t\t},\n\t\tcz: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\thz: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: Jzazbz,\n\tfromBase (jzazbz) {\n\t\t// Convert to polar form\n\t\tlet [Jz, az, bz] = jzazbz;\n\t\tlet hue;\n\t\tconst ε = 0.0002; // chromatic components much smaller than a,b\n\n\t\tif (Math.abs(az) < ε && Math.abs(bz) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(bz, az) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tJz, // Jz is still Jz\n\t\t\tMath.sqrt(az ** 2 + bz ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (jzczhz) {\n\t\t// Convert from polar form\n\t\t// debugger;\n\t\treturn [\n\t\t\tjzczhz[0], // Jz is still Jz\n\t\t\tjzczhz[1] * Math.cos(jzczhz[2] * Math.PI / 180), // az\n\t\t\tjzczhz[1] * Math.sin(jzczhz[2] * Math.PI / 180), // bz\n\t\t];\n\t},\n});\n\n// More accurate color-difference formulae\n// than the simple 1976 Euclidean distance in Lab\n\n// Uses JzCzHz, which has improved perceptual uniformity\n// and thus a simple Euclidean root-sum of ΔL² ΔC² ΔH²\n// gives good results.\n\nfunction deltaEJz (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE in JzCzHz.\n\tlet [Jz1, Cz1, Hz1] = jzczhz.from(color);\n\tlet [Jz2, Cz2, Hz2] = jzczhz.from(sample);\n\n\t// Lightness and Chroma differences\n\t// sign does not matter as they are squared.\n\tlet ΔJ = Jz1 - Jz2;\n\tlet ΔC = Cz1 - Cz2;\n\n\t// length of chord for ΔH\n\tif ((Number.isNaN(Hz1)) && (Number.isNaN(Hz2))) {\n\t\t// both undefined hues\n\t\tHz1 = 0;\n\t\tHz2 = 0;\n\t}\n\telse if (Number.isNaN(Hz1)) {\n\t\t// one undefined, set to the defined hue\n\t\tHz1 = Hz2;\n\t}\n\telse if (Number.isNaN(Hz2)) {\n\t\tHz2 = Hz1;\n\t}\n\n\tlet Δh = Hz1 - Hz2;\n\tlet ΔH = 2 * Math.sqrt(Cz1 * Cz2) * Math.sin((Δh / 2) * (Math.PI / 180));\n\n\treturn Math.sqrt(ΔJ ** 2 + ΔC ** 2 + ΔH ** 2);\n}\n\nconst c1$1 = 3424 / 4096;\nconst c2$1 = 2413 / 128;\nconst c3$1 = 2392 / 128;\nconst m1$1 = 2610 / 16384;\nconst m2 = 2523 / 32;\nconst im1 = 16384 / 2610;\nconst im2 = 32 / 2523;\n\n// The matrix below includes the 4% crosstalk components\n// and is from the Dolby \"What is ICtCp\" paper\"\nconst XYZtoLMS_M = [\n\t[ 0.3592832590121217, 0.6976051147779502, -0.0358915932320290 ],\n\t[ -0.1920808463704993, 1.1004767970374321, 0.0753748658519118 ],\n\t[ 0.0070797844607479, 0.0748396662186362, 0.8433265453898765 ],\n];\n// linear-light Rec.2020 to LMS, again with crosstalk\n// rational terms from Jan Fröhlich,\n// Encoding High Dynamic Range andWide Color Gamut Imagery, p.97\n// and ITU-R BT.2124-0 p.2\n/*\nconst Rec2020toLMS_M = [\n\t[ 1688 / 4096, 2146 / 4096, 262 / 4096 ],\n\t[ 683 / 4096, 2951 / 4096, 462 / 4096 ],\n\t[ 99 / 4096, 309 / 4096, 3688 / 4096 ]\n];\n*/\n// this includes the Ebner LMS coefficients,\n// the rotation, and the scaling to [-0.5,0.5] range\n// rational terms from Fröhlich p.97\n// and ITU-R BT.2124-0 pp.2-3\nconst LMStoIPT_M = [\n\t[ 2048 / 4096, 2048 / 4096, 0 ],\n\t[ 6610 / 4096, -13613 / 4096, 7003 / 4096 ],\n\t[ 17933 / 4096, -17390 / 4096, -543 / 4096 ],\n];\n\n// inverted matrices, calculated from the above\nconst IPTtoLMS_M = [\n\t[ 0.9999999999999998, 0.0086090370379328, 0.1110296250030260 ],\n\t[ 0.9999999999999998, -0.0086090370379328, -0.1110296250030259 ],\n\t[ 0.9999999999999998, 0.5600313357106791, -0.3206271749873188 ],\n];\n/*\nconst LMStoRec2020_M = [\n\t[ 3.4375568932814012112, -2.5072112125095058195, 0.069654319228104608382],\n\t[-0.79142868665644156125, 1.9838372198740089874, -0.19240853321756742626 ],\n\t[-0.025646662911506476363, -0.099240248643945566751, 1.1248869115554520431 ]\n];\n*/\nconst LMStoXYZ_M = [\n\t[ 2.0701522183894223, -1.3263473389671563, 0.2066510476294053 ],\n\t[ 0.3647385209748072, 0.6805660249472273, -0.0453045459220347 ],\n\t[ -0.0497472075358123, -0.0492609666966131, 1.1880659249923042 ],\n];\n\n// Only the PQ form of ICtCp is implemented here. There is also an HLG form.\n// from Dolby, \"WHAT IS ICTCP?\"\n// https://professional.dolby.com/siteassets/pdfs/ictcp_dolbywhitepaper_v071.pdf\n// and\n// Dolby, \"Perceptual Color Volume\n// Measuring the Distinguishable Colors of HDR and WCG Displays\"\n// https://professional.dolby.com/siteassets/pdfs/dolby-vision-measuring-perceptual-color-volume-v7.1.pdf\nvar ictcp = new ColorSpace({\n\tid: \"ictcp\",\n\tname: \"ICTCP\",\n\t// From BT.2100-2 page 7:\n\t// During production, signal values are expected to exceed the\n\t// range E′ = [0.0 : 1.0]. This provides processing headroom and avoids\n\t// signal degradation during cascaded processing. Such values of E′,\n\t// below 0.0 or exceeding 1.0, should not be clipped during production\n\t// and exchange.\n\t// Values below 0.0 should not be clipped in reference displays (even\n\t// though they represent “negative” light) to allow the black level of\n\t// the signal (LB) to be properly set using test signals known as “PLUGE”\n\tcoords: {\n\t\ti: {\n\t\t\trefRange: [0, 1],\t// Constant luminance,\n\t\t\tname: \"I\",\n\t\t},\n\t\tct: {\n\t\t\trefRange: [-0.5, 0.5],\t// Full BT.2020 gamut in range [-0.5, 0.5]\n\t\t\tname: \"CT\",\n\t\t},\n\t\tcp: {\n\t\t\trefRange: [-0.5, 0.5],\n\t\t\tname: \"CP\",\n\t\t},\n\t},\n\n\tbase: XYZ_Abs_D65,\n\tfromBase (XYZ) {\n\t\t// move to LMS cone domain\n\t\tlet LMS = multiplyMatrices(XYZtoLMS_M, XYZ);\n\n\t\treturn LMStoICtCp(LMS);\n\t},\n\ttoBase (ICtCp) {\n\t\tlet LMS = ICtCptoLMS(ICtCp);\n\n\t\treturn multiplyMatrices(LMStoXYZ_M, LMS);\n\t},\n});\n\nfunction LMStoICtCp (LMS) {\n\t// apply the PQ EOTF\n\t// we can't ever be dividing by zero because of the \"1 +\" in the denominator\n\tlet PQLMS = LMS.map (function (val) {\n\t\tlet num = c1$1 + (c2$1 * ((val / 10000) ** m1$1));\n\t\tlet denom = 1 + (c3$1 * ((val / 10000) ** m1$1));\n\n\t\treturn (num / denom) ** m2;\n\t});\n\n\t// LMS to IPT, with rotation for Y'C'bC'r compatibility\n\treturn multiplyMatrices(LMStoIPT_M, PQLMS);\n}\n\nfunction ICtCptoLMS (ICtCp) {\n\tlet PQLMS = multiplyMatrices(IPTtoLMS_M, ICtCp);\n\n\t// From BT.2124-0 Annex 2 Conversion 3\n\tlet LMS = PQLMS.map (function (val) {\n\t\tlet num = Math.max((val ** im2) - c1$1, 0);\n\t\tlet denom = (c2$1 - (c3$1 * (val ** im2)));\n\t\treturn 10000 * ((num / denom) ** im1);\n\t});\n\n\treturn LMS;\n}\n\n// Delta E in ICtCp space,\n// which the ITU calls Delta E ITP, which is shorter\n// formulae from ITU Rec. ITU-R BT.2124-0\n\nfunction deltaEITP (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\t// Given this color as the reference\n\t// and a sample,\n\t// calculate deltaE in ICtCp\n\t// which is simply the Euclidean distance\n\n\tlet [ I1, T1, P1 ] = ictcp.from(color);\n\tlet [ I2, T2, P2 ] = ictcp.from(sample);\n\n\t// the 0.25 factor is to undo the encoding scaling in Ct\n\t// the 720 is so that 1 deltaE = 1 JND\n\t// per ITU-R BT.2124-0 p.3\n\n\treturn 720 * Math.sqrt((I1 - I2) ** 2 + (0.25 * (T1 - T2) ** 2) + (P1 - P2) ** 2);\n}\n\nconst white$3 = WHITES.D65;\nconst adaptedCoef = 0.42;\nconst adaptedCoefInv = 1 / adaptedCoef;\nconst tau = 2 * Math.PI;\n\nconst cat16 = [\n\t[ 0.401288, 0.650173, -0.051461 ],\n\t[ -0.250268, 1.204414, 0.045854 ],\n\t[ -0.002079, 0.048952, 0.953127 ],\n];\n\nconst cat16Inv = [\n\t[1.8620678550872327, -1.0112546305316843, 0.14918677544445175],\n\t[0.38752654323613717, 0.6214474419314753, -0.008973985167612518],\n\t[-0.015841498849333856, -0.03412293802851557, 1.0499644368778496],\n];\n\nconst m1 = [\n\t[460.0, 451.0, 288.0],\n\t[460.0, -891.0, -261.0],\n\t[460.0, -220.0, -6300.0],\n];\n\nconst surroundMap = {\n\tdark: [0.8, 0.525, 0.8],\n\tdim: [0.9, 0.59, 0.9],\n\taverage: [1, 0.69, 1],\n};\n\nconst hueQuadMap = {\n\t// Red, Yellow, Green, Blue, Red\n\th: [20.14, 90.00, 164.25, 237.53, 380.14],\n\te: [0.8, 0.7, 1.0, 1.2, 0.8],\n\tH: [0.0, 100.0, 200.0, 300.0, 400.0],\n};\n\nconst rad2deg = 180 / Math.PI;\nconst deg2rad$1 = Math.PI / 180;\n\nfunction adapt$1 (coords, fl) {\n\tconst temp = coords.map(c => {\n\t\tconst x = spow(fl * Math.abs(c) * 0.01, adaptedCoef);\n\t\treturn 400 * copySign(x, c) / (x + 27.13);\n\t});\n\treturn temp;\n}\n\nfunction unadapt (adapted, fl) {\n\tconst constant = 100 / fl * (27.13 ** adaptedCoefInv);\n\treturn adapted.map(c => {\n\t\tconst cabs = Math.abs(c);\n\t\treturn copySign(constant * spow(cabs / (400 - cabs), adaptedCoefInv), c);\n\t});\n}\n\nfunction hueQuadrature (h) {\n\tlet hp = constrain(h);\n\tif (hp <= hueQuadMap.h[0]) {\n\t\thp += 360;\n\t}\n\n\tconst i = bisectLeft(hueQuadMap.h, hp) - 1;\n\tconst [hi, hii] = hueQuadMap.h.slice(i, i + 2);\n\tconst [ei, eii] = hueQuadMap.e.slice(i, i + 2);\n\tconst Hi = hueQuadMap.H[i];\n\n\tconst t = (hp - hi) / ei;\n\treturn Hi + (100 * t) / (t + (hii - hp) / eii);\n}\n\nfunction invHueQuadrature (H) {\n\tlet Hp = ((H % 400 + 400) % 400);\n\tconst i = Math.floor(0.01 * Hp);\n\tHp = Hp % 100;\n\tconst [hi, hii] = hueQuadMap.h.slice(i, i + 2);\n\tconst [ei, eii] = hueQuadMap.e.slice(i, i + 2);\n\n\treturn constrain(\n\t\t(Hp * (eii * hi - ei * hii) - 100 * hi * eii) /\n\t\t(Hp * (eii - ei) - 100 * eii),\n\t);\n}\n\nfunction environment (\n\trefWhite,\n\tadaptingLuminance,\n\tbackgroundLuminance,\n\tsurround,\n\tdiscounting,\n) {\n\n\tconst env = {};\n\n\tenv.discounting = discounting;\n\tenv.refWhite = refWhite;\n\tenv.surround = surround;\n\tconst xyzW = refWhite.map(c => {\n\t\treturn c * 100;\n\t});\n\n\t// The average luminance of the environment in `cd/m^2cd/m` (a.k.a. nits)\n\tenv.la = adaptingLuminance;\n\t// The relative luminance of the nearby background\n\tenv.yb = backgroundLuminance;\n\t// Absolute luminance of the reference white.\n\tconst yw = xyzW[1];\n\n\t// Cone response for reference white\n\tconst rgbW = multiplyMatrices(cat16, xyzW);\n\n\t// Surround: dark, dim, and average\n\tsurround = surroundMap[env.surround];\n\tconst f = surround[0];\n\tenv.c = surround[1];\n\tenv.nc = surround[2];\n\n\tconst k = 1 / (5 * env.la + 1);\n\tconst k4 = k ** 4;\n\n\t// Factor of luminance level adaptation\n\tenv.fl = (k4 * env.la + 0.1 * (1 - k4) * (1 - k4) * Math.cbrt(5 * env.la));\n\tenv.flRoot = env.fl ** 0.25;\n\n\tenv.n = env.yb / yw;\n\tenv.z = 1.48 + Math.sqrt(env.n);\n\tenv.nbb = 0.725 * (env.n ** -0.2);\n\tenv.ncb = env.nbb;\n\n\t// Degree of adaptation calculating if not discounting\n\t// illuminant (assumed eye is fully adapted)\n\tconst d = (discounting) ?\n\t\t1 :\n\t\tMath.max(\n\t\t\tMath.min(f * (1 - 1 / 3.6 * Math.exp((-env.la - 42) / 92)), 1),\n\t\t\t0,\n\t\t);\n\tenv.dRgb = rgbW.map(c => {\n\t\treturn interpolate(1, yw / c, d);\n\t});\n\tenv.dRgbInv = env.dRgb.map(c => {\n\t\treturn 1 / c;\n\t});\n\n\t// Achromatic response\n\tconst rgbCW = rgbW.map((c, i) => {\n\t\treturn c * env.dRgb[i];\n\t});\n\tconst rgbAW = adapt$1(rgbCW, env.fl);\n\tenv.aW = env.nbb * (2 * rgbAW[0] + rgbAW[1] + 0.05 * rgbAW[2]);\n\n\t// console.log(env);\n\n\treturn env;\n}\n\n// Pre-calculate everything we can with the viewing conditions\nconst viewingConditions$1 = environment(\n\twhite$3,\n\t64 / Math.PI * 0.2, 20,\n\t\"average\",\n\tfalse,\n);\n\nfunction fromCam16 (cam16, env) {\n\n\t// These check ensure one, and only one attribute for a\n\t// given category is provided.\n\tif (!((cam16.J !== undefined) ^ (cam16.Q !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'J' or 'Q'\");\n\t}\n\n\tif (!((cam16.C !== undefined) ^ (cam16.M !== undefined) ^ (cam16.s !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'C', 'M' or 's'\");\n\t}\n\n\t// Hue is absolutely required\n\tif (!((cam16.h !== undefined) ^ (cam16.H !== undefined))) {\n\t\tthrow new Error(\"Conversion requires one and only one: 'h' or 'H'\");\n\t}\n\n\t// Black\n\tif (cam16.J === 0.0 || cam16.Q === 0.0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\n\t// Break hue into Cartesian components\n\tlet hRad = 0.0;\n\tif (cam16.h !== undefined) {\n\t\thRad = constrain(cam16.h) * deg2rad$1;\n\t}\n\telse {\n\t\thRad = invHueQuadrature(cam16.H) * deg2rad$1;\n\t}\n\n\tconst cosh = Math.cos(hRad);\n\tconst sinh = Math.sin(hRad);\n\n\t// Calculate `Jroot` from one of the lightness derived coordinates.\n\tlet Jroot = 0.0;\n\tif (cam16.J !== undefined) {\n\t\tJroot = spow(cam16.J, 1 / 2) * 0.1;\n\t}\n\telse if (cam16.Q !== undefined) {\n\t\tJroot = 0.25 * env.c * cam16.Q / ((env.aW + 4) * env.flRoot);\n\t}\n\n\t// Calculate the `t` value from one of the chroma derived coordinates\n\tlet alpha = 0.0;\n\tif (cam16.C !== undefined) {\n\t\talpha = cam16.C / Jroot;\n\t}\n\telse if (cam16.M !== undefined) {\n\t\talpha = (cam16.M / env.flRoot) / Jroot;\n\t}\n\telse if (cam16.s !== undefined) {\n\t\talpha = 0.0004 * (cam16.s ** 2) * (env.aW + 4) / env.c;\n\t}\n\tconst t = spow(\n\t\talpha * Math.pow(1.64 - Math.pow(0.29, env.n), -0.73),\n\t\t10 / 9,\n\t);\n\n\t// Eccentricity\n\tconst et = 0.25 * (Math.cos(hRad + 2) + 3.8);\n\n\t// Achromatic response\n\tconst A = env.aW * spow(Jroot, 2 / env.c / env.z);\n\n\t// Calculate red-green and yellow-blue components\n\tconst p1 = 5e4 / 13 * env.nc * env.ncb * et;\n\tconst p2 = A / env.nbb;\n\tconst r = (\n\t\t23 * (p2 + 0.305) *\n\t\tzdiv(t, 23 * p1 + t * (11 * cosh + 108 * sinh))\n\t);\n\tconst a = r * cosh;\n\tconst b = r * sinh;\n\n\t// Calculate back from cone response to XYZ\n\tconst rgb_c = unadapt(\n\t\tmultiplyMatrices(m1, [p2, a, b]).map(c => {\n\t\t\treturn c * 1 / 1403;\n\t\t}),\n\t\tenv.fl,\n\t);\n\treturn multiplyMatrices(\n\t\tcat16Inv,\n\t\trgb_c.map((c, i) => {\n\t\t\treturn c * env.dRgbInv[i];\n\t\t}),\n\t).map(c => {\n\t\treturn c / 100;\n\t});\n}\n\n\nfunction toCam16 (xyzd65, env) {\n\t// Cone response\n\tconst xyz100 = xyzd65.map(c => {\n\t\treturn c * 100;\n\t});\n\tconst rgbA = adapt$1(\n\t\tmultiplyMatrices(cat16, xyz100).map((c, i) => {\n\t\t\treturn c * env.dRgb[i];\n\t\t}),\n\t\tenv.fl,\n\t);\n\n\t// Calculate hue from red-green and yellow-blue components\n\tconst a = rgbA[0] + (-12 * rgbA[1] + rgbA[2]) / 11;\n\tconst b = (rgbA[0] + rgbA[1] - 2 * rgbA[2]) / 9;\n\tconst hRad = ((Math.atan2(b, a) % tau) + tau) % tau;\n\n\t// Eccentricity\n\tconst et = 0.25 * (Math.cos(hRad + 2) + 3.8);\n\n\tconst t = (\n\t\t5e4 / 13 * env.nc * env.ncb *\n\t\tzdiv(\n\t\t\tet * Math.sqrt(a ** 2 + b ** 2),\n\t\t\trgbA[0] + rgbA[1] + 1.05 * rgbA[2] + 0.305,\n\t\t)\n\t);\n\tconst alpha = spow(t, 0.9) * Math.pow(1.64 - Math.pow(0.29, env.n), 0.73);\n\n\t// Achromatic response\n\tconst A = env.nbb * (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]);\n\n\tconst Jroot = spow(A / env.aW, 0.5 * env.c * env.z);\n\n\t// Lightness\n\tconst J = 100 * spow(Jroot, 2);\n\n\t// Brightness\n\tconst Q = (4 / env.c * Jroot * (env.aW + 4) * env.flRoot);\n\n\t// Chroma\n\tconst C = alpha * Jroot;\n\n\t// Colorfulness\n\tconst M = C * env.flRoot;\n\n\t// Hue\n\tconst h = constrain(hRad * rad2deg);\n\n\t// Hue quadrature\n\tconst H = hueQuadrature(h);\n\n\t// Saturation\n\tconst s = 50 * spow(env.c * alpha / (env.aW + 4), 1 / 2);\n\n\t// console.log({J: J, C: C, h: h, s: s, Q: Q, M: M, H: H});\n\n\treturn {J: J, C: C, h: h, s: s, Q: Q, M: M, H: H};\n}\n\n\n// Provided as a way to directly evaluate the CAM16 model\n// https://observablehq.com/@jrus/cam16: reference implementation\n// https://arxiv.org/pdf/1802.06067.pdf: Nico Schlömer\n// https://onlinelibrary.wiley.com/doi/pdf/10.1002/col.22324: hue quadrature\n// https://www.researchgate.net/publication/318152296_Comprehensive_color_solutions_CAM16_CAT16_and_CAM16-UCS\n// Results compared against: https://github.com/colour-science/colour\nvar cam16 = new ColorSpace({\n\tid: \"cam16-jmh\",\n\tcssId: \"--cam16-jmh\",\n\tname: \"CAM16-JMh\",\n\tcoords: {\n\t\tj: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"J\",\n\t\t},\n\t\tm: {\n\t\t\trefRange: [0, 105.0],\n\t\t\tname: \"Colorfulness\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\n\tfromBase (xyz) {\n\t\tconst cam16 = toCam16(xyz, viewingConditions$1);\n\t\treturn [cam16.J, cam16.M, cam16.h];\n\t},\n\ttoBase (cam16) {\n\t\treturn fromCam16(\n\t\t\t{J: cam16[0], M: cam16[1], h: cam16[2]},\n\t\t\tviewingConditions$1,\n\t\t);\n\t},\n});\n\nconst white$2 = WHITES.D65;\nconst ε$4 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ$3 = 24389 / 27; // 29^3/3^3\n\nfunction toLstar (y) {\n\t// Convert XYZ Y to L*\n\n\tconst fy = (y > ε$4) ? Math.cbrt(y) : (κ$3 * y + 16) / 116;\n\treturn (116.0 * fy) - 16.0;\n}\n\nfunction fromLstar (lstar) {\n\t// Convert L* back to XYZ Y\n\n\treturn (lstar > 8) ? Math.pow((lstar + 16) / 116, 3) : lstar / κ$3;\n}\n\nfunction fromHct (coords, env) {\n\t// Use Newton's method to try and converge as quick as possible or\n\t// converge as close as we can. While the requested precision is achieved\n\t// most of the time, it may not always be achievable. Especially past the\n\t// visible spectrum, the algorithm will likely struggle to get the same\n\t// precision. If, for whatever reason, we cannot achieve the accuracy we\n\t// seek in the allotted iterations, just return the closest we were able to\n\t// get.\n\n\tlet [h, c, t] = coords;\n\tlet xyz = [];\n\tlet j = 0;\n\n\t// Shortcut out for black\n\tif (t === 0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\n\t// Calculate the Y we need to target\n\tlet y = fromLstar(t);\n\n\t// A better initial guess yields better results. Polynomials come from\n\t// curve fitting the T vs J response.\n\tif (t > 0) {\n\t\tj = 0.00379058511492914 * t ** 2 + 0.608983189401032 * t + 0.9155088574762233;\n\t}\n\telse {\n\t\tj = 9.514440756550361e-06 * t ** 2 + 0.08693057439788597 * t - 21.928975842194614;\n\t}\n\n\t// Threshold of how close is close enough, and max number of attempts.\n\t// More precision and more attempts means more time spent iterating. Higher\n\t// required precision gives more accuracy but also increases the chance of\n\t// not hitting the goal. 2e-12 allows us to convert round trip with\n\t// reasonable accuracy of six decimal places or more.\n\tconst threshold = 2e-12;\n\tconst max_attempts = 15;\n\n\tlet attempt = 0;\n\tlet last = Infinity;\n\n\t// Try to find a J such that the returned y matches the returned y of the L*\n\twhile (attempt <= max_attempts) {\n\t\txyz = fromCam16({J: j, C: c, h: h}, env);\n\n\t\t// If we are within range, return XYZ\n\t\t// If we are closer than last time, save the values\n\t\tconst delta = Math.abs(xyz[1] - y);\n\t\tif (delta < last) {\n\t\t\tif (delta <= threshold) {\n\t\t\t\treturn xyz;\n\t\t\t}\n\t\t\tlast = delta;\n\t\t}\n\n\t\t// f(j_root) = (j ** (1 / 2)) * 0.1\n\t\t// f(j) = ((f(j_root) * 100) ** 2) / j - 1 = 0\n\t\t// f(j_root) = Y = y / 100\n\t\t// f(j) = (y ** 2) / j - 1\n\t\t// f'(j) = (2 * y) / j\n\t\tj = j - (xyz[1] - y) * j / (2 * xyz[1]);\n\n\t\tattempt += 1;\n\t}\n\n\t// We could not acquire the precision we desired,\n\t// return our closest attempt.\n\treturn fromCam16({J: j, C: c, h: h}, env);\n}\n\nfunction toHct (xyz, env) {\n\t// Calculate HCT by taking the L* of CIE LCh D65 and CAM16 chroma and hue.\n\n\tconst t = toLstar(xyz[1]);\n\tif (t === 0.0) {\n\t\treturn [0.0, 0.0, 0.0];\n\t}\n\tconst cam16 = toCam16(xyz, viewingConditions);\n\treturn [constrain(cam16.h), cam16.C, t];\n}\n\n// Pre-calculate everything we can with the viewing conditions\nconst viewingConditions = environment(\n\twhite$2, 200 / Math.PI * fromLstar(50.0),\n\tfromLstar(50.0) * 100,\n\t\"average\",\n\tfalse,\n);\n\n// https://material.io/blog/science-of-color-design\n// This is not a port of the material-color-utilities,\n// but instead implements the full color space as described,\n// combining CAM16 JCh and Lab D65. This does not clamp conversion\n// to HCT to specific chroma bands and provides support for wider\n// gamuts than Google currently supports and does so at a greater\n// precision (> 8 bits back to sRGB).\n// This implementation comes from https://github.com/facelessuser/coloraide\n// which is licensed under MIT.\nvar hct = new ColorSpace({\n\tid: \"hct\",\n\tname: \"HCT\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 145],\n\t\t\tname: \"Colorfulness\",\n\t\t},\n\t\tt: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Tone\",\n\t\t},\n\t},\n\n\tbase: xyz_d65,\n\n\tfromBase (xyz) {\n\t\treturn toHct(xyz);\n\t},\n\ttoBase (hct) {\n\t\treturn fromHct(hct, viewingConditions);\n\t},\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hct\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\nconst deg2rad = Math.PI / 180;\nconst ucsCoeff = [1.00, 0.007, 0.0228];\n\n/**\n* Convert HCT chroma and hue (CAM16 JMh colorfulness and hue) using UCS logic for a and b.\n* @param {number[]} coords - HCT coordinates.\n* @return {number[]}\n*/\nfunction convertUcsAb (coords) {\n\t// We want the distance between the actual color.\n\t// If chroma is negative, it will throw off our calculations.\n\t// Normally, converting back to the base and forward will correct it.\n\t// If we have a negative chroma after this, then we have a color that\n\t// cannot resolve to positive chroma.\n\tif (coords[1] < 0) {\n\t\tcoords = hct.fromBase(hct.toBase(coords));\n\t}\n\n\t// Only in extreme cases (usually outside the visible spectrum)\n\t// can the input value for log become negative.\n\t// Avoid domain error by forcing a zero result via \"max\" if necessary.\n\tconst M = Math.log(Math.max(1 + ucsCoeff[2] * coords[1] * viewingConditions.flRoot, 1.0)) / ucsCoeff[2];\n\tconst hrad = coords[0] * deg2rad;\n\tconst a = M * Math.cos(hrad);\n\tconst b = M * Math.sin(hrad);\n\n\treturn [coords[2], a, b];\n}\n\n\n/**\n* Color distance using HCT.\n* @param {Color} color - Color to compare.\n* @param {Color} sample - Color to compare.\n* @return {number[]}\n*/\nfunction deltaEHCT (color, sample) {\n\t[color, sample] = getColor([color, sample]);\n\n\tlet [ t1, a1, b1 ] = convertUcsAb(hct.from(color));\n\tlet [ t2, a2, b2 ] = convertUcsAb(hct.from(sample));\n\n\t// Use simple euclidean distance with a and b using UCS conversion\n\t// and LCh lightness (HCT tone).\n\treturn Math.sqrt((t1 - t2) ** 2 + (a1 - a2) ** 2 + (b1 - b2) ** 2);\n}\n\nvar deltaEMethods = {\n\tdeltaE76,\n\tdeltaECMC,\n\tdeltaE2000,\n\tdeltaEJz,\n\tdeltaEITP,\n\tdeltaEOK,\n\tdeltaEHCT,\n};\n\n/**\n * Calculate the epsilon to 2 degrees smaller than the specified JND.\n * @param {Number} jnd - The target \"just noticeable difference\".\n * @returns {Number}\n */\nfunction calcEpsilon (jnd) {\n\t// Calculate the epsilon to 2 degrees smaller than the specified JND.\n\n\tconst order = (!jnd) ? 0 : Math.floor(Math.log10(Math.abs(jnd)));\n\t// Limit to an arbitrary value to ensure value is never too small and causes infinite loops.\n\treturn Math.max(parseFloat(`1e${order - 2}`), 1e-6);\n}\n\nconst GMAPPRESET = {\n\t\"hct\": {\n\t\tmethod: \"hct.c\",\n\t\tjnd: 2,\n\t\tdeltaEMethod: \"hct\",\n\t\tblackWhiteClamp: {},\n\t},\n\t\"hct-tonal\": {\n\t\tmethod: \"hct.c\",\n\t\tjnd: 0,\n\t\tdeltaEMethod: \"hct\",\n\t\tblackWhiteClamp: { channel: \"hct.t\", min: 0, max: 100 },\n\t},\n};\n\n/**\n * Force coordinates to be in gamut of a certain color space.\n * Mutates the color it is passed.\n * @param {Object|string} options object or spaceId string\n * @param {string} options.method - How to force into gamut.\n * If \"clip\", coordinates are just clipped to their reference range.\n * If \"css\", coordinates are reduced according to the CSS 4 Gamut Mapping Algorithm.\n * If in the form [colorSpaceId].[coordName], that coordinate is reduced\n * until the color is in gamut. Please note that this may produce nonsensical\n * results for certain coordinates (e.g. hue) or infinite loops if reducing the coordinate never brings the color in gamut.\n * @param {ColorSpace|string} options.space - The space whose gamut we want to map to\n * @param {string} options.deltaEMethod - The delta E method to use while performing gamut mapping.\n * If no method is specified, delta E 2000 is used.\n * @param {Number} options.jnd - The \"just noticeable difference\" to target.\n * @param {Object} options.blackWhiteClamp - Used to configure SDR black and clamping.\n * \"channel\" indicates the \"space.channel\" to use for determining when to clamp.\n * \"min\" indicates the lower limit for black clamping and \"max\" indicates the upper\n * limit for white clamping.\n */\n\nfunction toGamut (\n\tcolor,\n\t{\n\t\tmethod = defaults.gamut_mapping,\n\t\tspace = undefined,\n\t\tdeltaEMethod = \"\",\n\t\tjnd = 2,\n\t\tblackWhiteClamp = {},\n\t} = {},\n) {\n\tcolor = getColor(color);\n\n\tif (isString(arguments[1])) {\n\t\tspace = arguments[1];\n\t}\n\telse if (!space) {\n\t\tspace = color.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\n\t// 3 spaces:\n\t// color.space: current color space\n\t// space: space whose gamut we are mapping to\n\t// mapSpace: space with the coord we're reducing\n\n\tif (inGamut(color, space, { epsilon: 0 })) {\n\t\treturn color;\n\t}\n\n\tlet spaceColor;\n\tif (method === \"css\") {\n\t\tspaceColor = toGamutCSS(color, { space });\n\t}\n\telse {\n\t\tif (method !== \"clip\" && !inGamut(color, space)) {\n\n\t\t\tif (Object.prototype.hasOwnProperty.call(GMAPPRESET, method)) {\n\t\t\t\t({method, jnd, deltaEMethod, blackWhiteClamp} = GMAPPRESET[method]);\n\t\t\t}\n\n\t\t\t// Get the correct delta E method\n\t\t\tlet de = deltaE2000;\n\t\t\tif (deltaEMethod !== \"\") {\n\t\t\t\tfor (let m in deltaEMethods) {\n\t\t\t\t\tif (\"deltae\" + deltaEMethod.toLowerCase() === m.toLowerCase()) {\n\t\t\t\t\t\tde = deltaEMethods[m];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet clipped = toGamut(to(color, space), { method: \"clip\", space });\n\t\t\tif (de(color, clipped) > jnd) {\n\n\t\t\t\t// Clamp to SDR white and black if required\n\t\t\t\tif (Object.keys(blackWhiteClamp).length === 3) {\n\t\t\t\t\tlet channelMeta = ColorSpace.resolveCoord(blackWhiteClamp.channel);\n\t\t\t\t\tlet channel = get(to(color, channelMeta.space), channelMeta.id);\n\t\t\t\t\tif (isNone(channel)) {\n\t\t\t\t\t\tchannel = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (channel >= blackWhiteClamp.max) {\n\t\t\t\t\t\treturn to({ space: \"xyz-d65\", coords: WHITES[\"D65\"] }, color.space);\n\t\t\t\t\t}\n\t\t\t\t\telse if (channel <= blackWhiteClamp.min) {\n\t\t\t\t\t\treturn to({ space: \"xyz-d65\", coords: [0, 0, 0] }, color.space);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Reduce a coordinate of a certain color space until the color is in gamut\n\t\t\t\tlet coordMeta = ColorSpace.resolveCoord(method);\n\t\t\t\tlet mapSpace = coordMeta.space;\n\t\t\t\tlet coordId = coordMeta.id;\n\n\t\t\t\tlet mappedColor = to(color, mapSpace);\n\t\t\t\t// If we were already in the mapped color space, we need to resolve undefined channels\n\t\t\t\tmappedColor.coords.forEach((c, i) => {\n\t\t\t\t\tif (isNone(c)) {\n\t\t\t\t\t\tmappedColor.coords[i] = 0;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet bounds = coordMeta.range || coordMeta.refRange;\n\t\t\t\tlet min = bounds[0];\n\t\t\t\tlet ε = calcEpsilon(jnd);\n\t\t\t\tlet low = min;\n\t\t\t\tlet high = get(mappedColor, coordId);\n\n\t\t\t\twhile (high - low > ε) {\n\t\t\t\t\tlet clipped = clone(mappedColor);\n\t\t\t\t\tclipped = toGamut(clipped, { space, method: \"clip\" });\n\t\t\t\t\tlet deltaE = de(mappedColor, clipped);\n\n\t\t\t\t\tif (deltaE - jnd < ε) {\n\t\t\t\t\t\tlow = get(mappedColor, coordId);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thigh = get(mappedColor, coordId);\n\t\t\t\t\t}\n\n\t\t\t\t\tset(mappedColor, coordId, (low + high) / 2);\n\t\t\t\t}\n\n\t\t\t\tspaceColor = to(mappedColor, space);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tspaceColor = clipped;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tspaceColor = to(color, space);\n\t\t}\n\n\t\tif (method === \"clip\" // Dumb coord clipping\n\t\t\t// finish off smarter gamut mapping with clip to get rid of ε, see #17\n\t\t\t|| !inGamut(spaceColor, space, { epsilon: 0 })\n\t\t) {\n\t\t\tlet bounds = Object.values(space.coords).map(c => c.range || []);\n\n\t\t\tspaceColor.coords = spaceColor.coords.map((c, i) => {\n\t\t\t\tlet [min, max] = bounds[i];\n\n\t\t\t\tif (min !== undefined) {\n\t\t\t\t\tc = Math.max(min, c);\n\t\t\t\t}\n\n\t\t\t\tif (max !== undefined) {\n\t\t\t\t\tc = Math.min(c, max);\n\t\t\t\t}\n\n\t\t\t\treturn c;\n\t\t\t});\n\t\t}\n\t}\n\n\tif (space !== color.space) {\n\t\tspaceColor = to(spaceColor, color.space);\n\t}\n\n\tcolor.coords = spaceColor.coords;\n\treturn color;\n}\n\ntoGamut.returns = \"color\";\n\n// The reference colors to be used if lightness is out of the range 0-1 in the\n// `Oklch` space. These are created in the `Oklab` space, as it is used by the\n// DeltaEOK calculation, so it is guaranteed to be imported.\nconst COLORS = {\n\tWHITE: { space: OKLab, coords: [1, 0, 0] },\n\tBLACK: { space: OKLab, coords: [0, 0, 0] },\n};\n\n/**\n * Given a color `origin`, returns a new color that is in gamut using\n * the CSS Gamut Mapping Algorithm. If `space` is specified, it will be in gamut\n * in `space`, and returned in `space`. Otherwise, it will be in gamut and\n * returned in the color space of `origin`.\n * @param {Object} origin\n * @param {Object} options\n * @param {ColorSpace|string} options.space\n * @returns {Color}\n */\nfunction toGamutCSS (origin, {space} = {}) {\n\tconst JND = 0.02;\n\tconst ε = 0.0001;\n\n\torigin = getColor(origin);\n\n\tif (!space) {\n\t\tspace = origin.space;\n\t}\n\n\tspace = ColorSpace.get(space);\n\tconst oklchSpace = ColorSpace.get(\"oklch\");\n\n\tif (space.isUnbounded) {\n\t\treturn to(origin, space);\n\t}\n\n\tconst origin_OKLCH = to(origin, oklchSpace);\n\tlet L = origin_OKLCH.coords[0];\n\n\t// return media white or black, if lightness is out of range\n\tif (L >= 1) {\n\t\tconst white = to(COLORS.WHITE, space);\n\t\twhite.alpha = origin.alpha;\n\t\treturn to(white, space);\n\t}\n\tif (L <= 0) {\n\t\tconst black = to(COLORS.BLACK, space);\n\t\tblack.alpha = origin.alpha;\n\t\treturn to(black, space);\n\t}\n\n\tif (inGamut(origin_OKLCH, space, {epsilon: 0})) {\n\t\treturn to(origin_OKLCH, space);\n\t}\n\n\tfunction clip (_color) {\n\t\tconst destColor = to(_color, space);\n\t\tconst spaceCoords = Object.values(space.coords);\n\t\tdestColor.coords = destColor.coords.map((coord, index) => {\n\t\t\tif (\"range\" in spaceCoords[index]) {\n\t\t\t\tconst [min, max] = spaceCoords[index].range;\n\t\t\t\treturn clamp(min, coord, max);\n\t\t\t}\n\t\t\treturn coord;\n\t\t});\n\t\treturn destColor;\n\t}\n\tlet min = 0;\n\tlet max = origin_OKLCH.coords[1];\n\tlet min_inGamut = true;\n\tlet current = clone(origin_OKLCH);\n\tlet clipped = clip(current);\n\n\tlet E = deltaEOK(clipped, current);\n\tif (E < JND) {\n\t\treturn clipped;\n\t}\n\n\twhile ((max - min) > ε) {\n\t\tconst chroma = (min + max) / 2;\n\t\tcurrent.coords[1] = chroma;\n\t\tif (min_inGamut && inGamut(current, space, {epsilon: 0})) {\n\t\t\tmin = chroma;\n\t\t}\n\t\telse {\n\t\t\tclipped = clip(current);\n\t\t\tE = deltaEOK(clipped, current);\n\t\t\tif (E < JND) {\n\t\t\t\tif ((JND - E < ε)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmin_inGamut = false;\n\t\t\t\t\tmin = chroma;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmax = chroma;\n\t\t\t}\n\t\t}\n\t}\n\treturn clipped;\n}\n\n/**\n * Convert to color space and return a new color\n * @param {Object|string} space - Color space object or id\n * @param {Object} options\n * @param {boolean} options.inGamut - Whether to force resulting color in gamut\n * @returns {Color}\n */\nfunction to (color, space, {inGamut} = {}) {\n\tcolor = getColor(color);\n\tspace = ColorSpace.get(space);\n\n\tlet coords = space.from(color);\n\tlet ret = {space, coords, alpha: color.alpha};\n\n\tif (inGamut) {\n\t\tret = toGamut(ret, inGamut === true ? undefined : inGamut);\n\t}\n\n\treturn ret;\n}\n\nto.returns = \"color\";\n\n/**\n * Generic toString() method, outputs a color(spaceId ...coords) function, a functional syntax, or custom formats defined by the color space\n * @param {Object} options\n * @param {number} options.precision - Significant digits\n * @param {boolean} options.inGamut - Adjust coordinates to fit in gamut first? [default: false]\n */\nfunction serialize (color, {\n\tprecision = defaults.precision,\n\tformat = \"default\",\n\tinGamut: inGamut$1 = true,\n\t...customOptions\n} = {}) {\n\tlet ret;\n\n\tcolor = getColor(color);\n\n\tlet formatId = format;\n\tformat = color.space.getFormat(format)\n\t ?? color.space.getFormat(\"default\")\n\t ?? ColorSpace.DEFAULT_FORMAT;\n\n\t// The assignment to coords and inGamut needs to stay in the order they are now\n\t// The order of the assignment was changed as a workaround for a bug in Next.js\n\t// See this issue for details: https://github.com/color-js/color.js/issues/260\n\n\tlet coords = color.coords.slice(); // clone so we can manipulate it\n\n\tinGamut$1 ||= format.toGamut;\n\n\tif (inGamut$1 && !inGamut(color)) {\n\t\t// FIXME what happens if the color contains NaNs?\n\t\tcoords = toGamut(clone(color), inGamut$1 === true ? undefined : inGamut$1).coords;\n\t}\n\n\tif (format.type === \"custom\") {\n\t\tcustomOptions.precision = precision;\n\n\t\tif (format.serialize) {\n\t\t\tret = format.serialize(coords, color.alpha, customOptions);\n\t\t}\n\t\telse {\n\t\t\tthrow new TypeError(`format ${formatId} can only be used to parse colors, not for serialization`);\n\t\t}\n\t}\n\telse {\n\t\t// Functional syntax\n\t\tlet name = format.name || \"color\";\n\n\t\tif (format.serializeCoords) {\n\t\t\tcoords = format.serializeCoords(coords, precision);\n\t\t}\n\t\telse {\n\t\t\tif (precision !== null) {\n\t\t\t\tcoords = coords.map(c => {\n\t\t\t\t\treturn serializeNumber(c, {precision});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tlet args = [...coords];\n\n\t\tif (name === \"color\") {\n\t\t\t// If output is a color() function, add colorspace id as first argument\n\t\t\tlet cssId = format.id || format.ids?.[0] || color.space.id;\n\t\t\targs.unshift(cssId);\n\t\t}\n\n\t\tlet alpha = color.alpha;\n\t\tif (precision !== null) {\n\t\t\talpha = serializeNumber(alpha, {precision});\n\t\t}\n\n\t\tlet strAlpha = color.alpha >= 1 || format.noAlpha ? \"\" : `${format.commas ? \",\" : \" /\"} ${alpha}`;\n\t\tret = `${name}(${args.join(format.commas ? \", \" : \" \")}${strAlpha})`;\n\t}\n\n\treturn ret;\n}\n\n// convert an array of linear-light rec2020 values to CIE XYZ\n// using D65 (no chromatic adaptation)\n// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n// 0 is actually calculated as 4.994106574466076e-17\nconst toXYZ_M$5 = [\n\t[ 0.6369580483012914, 0.14461690358620832, 0.1688809751641721 ],\n\t[ 0.2627002120112671, 0.6779980715188708, 0.05930171646986196 ],\n\t[ 0.000000000000000, 0.028072693049087428, 1.060985057710791 ],\n];\n\n// from ITU-R BT.2124-0 Annex 2 p.3\nconst fromXYZ_M$5 = [\n\t[ 1.716651187971268, -0.355670783776392, -0.253366281373660 ],\n\t[ -0.666684351832489, 1.616481236634939, 0.0157685458139111 ],\n\t[ 0.017639857445311, -0.042770613257809, 0.942103121235474 ],\n];\n\nvar REC2020Linear = new RGBColorSpace({\n\tid: \"rec2020-linear\",\n\tcssId: \"--rec2020-linear\",\n\tname: \"Linear REC.2020\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$5,\n\tfromXYZ_M: fromXYZ_M$5,\n});\n\n// import sRGB from \"./srgb.js\";\n\nconst α = 1.09929682680944;\nconst β = 0.018053968510807;\n\nvar REC2020 = new RGBColorSpace({\n\tid: \"rec2020\",\n\tname: \"REC.2020\",\n\tbase: REC2020Linear,\n\t// Non-linear transfer function from Rec. ITU-R BT.2020-2 table 4\n\ttoBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val < β * 4.5) {\n\t\t\t\treturn val / 4.5;\n\t\t\t}\n\n\t\t\treturn Math.pow((val + α - 1) / α, 1 / 0.45);\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val >= β) {\n\t\t\t\treturn α * Math.pow(val, 0.45) - (α - 1);\n\t\t\t}\n\n\t\t\treturn 4.5 * val;\n\t\t});\n\t},\n});\n\nconst toXYZ_M$4 = [\n\t[0.4865709486482162, 0.26566769316909306, 0.1982172852343625],\n\t[0.2289745640697488, 0.6917385218365064, 0.079286914093745],\n\t[0.0000000000000000, 0.04511338185890264, 1.043944368900976],\n];\n\nconst fromXYZ_M$4 = [\n\t[ 2.493496911941425, -0.9313836179191239, -0.40271078445071684],\n\t[-0.8294889695615747, 1.7626640603183463, 0.023624685841943577],\n\t[ 0.03584583024378447, -0.07617238926804182, 0.9568845240076872],\n];\n\nvar P3Linear = new RGBColorSpace({\n\tid: \"p3-linear\",\n\tcssId: \"--display-p3-linear\",\n\tname: \"Linear P3\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$4,\n\tfromXYZ_M: fromXYZ_M$4,\n});\n\n// This is the linear-light version of sRGB\n// as used for example in SVG filters\n// or in Canvas\n\n// This matrix was calculated directly from the RGB and white chromaticities\n// when rounded to 8 decimal places, it agrees completely with the official matrix\n// see https://github.com/w3c/csswg-drafts/issues/5922\nconst toXYZ_M$3 = [\n\t[ 0.41239079926595934, 0.357584339383878, 0.1804807884018343 ],\n\t[ 0.21263900587151027, 0.715168678767756, 0.07219231536073371 ],\n\t[ 0.01933081871559182, 0.11919477979462598, 0.9505321522496607 ],\n];\n\n// This matrix is the inverse of the above;\n// again it agrees with the official definition when rounded to 8 decimal places\nconst fromXYZ_M$3 = [\n\t[ 3.2409699419045226, -1.537383177570094, -0.4986107602930034 ],\n\t[ -0.9692436362808796, 1.8759675015077202, 0.04155505740717559 ],\n\t[ 0.05563007969699366, -0.20397695888897652, 1.0569715142428786 ],\n];\n\nvar sRGBLinear = new RGBColorSpace({\n\tid: \"srgb-linear\",\n\tname: \"Linear sRGB\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$3,\n\tfromXYZ_M: fromXYZ_M$3,\n});\n\n/* List of CSS color keywords\n * Note that this does not include currentColor, transparent,\n * or system colors\n */\n\n// To produce: Visit https://www.w3.org/TR/css-color-4/#named-colors\n// and run in the console:\n// copy($$(\"tr\", $(\".named-color-table tbody\")).map(tr => `\"${tr.cells[2].textContent.trim()}\": [${tr.cells[4].textContent.trim().split(/\\s+/).map(c => c === \"0\"? \"0\" : c === \"255\"? \"1\" : c + \" / 255\").join(\", \")}]`).join(\",\\n\"))\nvar KEYWORDS = {\n\t\"aliceblue\": [240 / 255, 248 / 255, 1],\n\t\"antiquewhite\": [250 / 255, 235 / 255, 215 / 255],\n\t\"aqua\": [0, 1, 1],\n\t\"aquamarine\": [127 / 255, 1, 212 / 255],\n\t\"azure\": [240 / 255, 1, 1],\n\t\"beige\": [245 / 255, 245 / 255, 220 / 255],\n\t\"bisque\": [1, 228 / 255, 196 / 255],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [1, 235 / 255, 205 / 255],\n\t\"blue\": [0, 0, 1],\n\t\"blueviolet\": [138 / 255, 43 / 255, 226 / 255],\n\t\"brown\": [165 / 255, 42 / 255, 42 / 255],\n\t\"burlywood\": [222 / 255, 184 / 255, 135 / 255],\n\t\"cadetblue\": [95 / 255, 158 / 255, 160 / 255],\n\t\"chartreuse\": [127 / 255, 1, 0],\n\t\"chocolate\": [210 / 255, 105 / 255, 30 / 255],\n\t\"coral\": [1, 127 / 255, 80 / 255],\n\t\"cornflowerblue\": [100 / 255, 149 / 255, 237 / 255],\n\t\"cornsilk\": [1, 248 / 255, 220 / 255],\n\t\"crimson\": [220 / 255, 20 / 255, 60 / 255],\n\t\"cyan\": [0, 1, 1],\n\t\"darkblue\": [0, 0, 139 / 255],\n\t\"darkcyan\": [0, 139 / 255, 139 / 255],\n\t\"darkgoldenrod\": [184 / 255, 134 / 255, 11 / 255],\n\t\"darkgray\": [169 / 255, 169 / 255, 169 / 255],\n\t\"darkgreen\": [0, 100 / 255, 0],\n\t\"darkgrey\": [169 / 255, 169 / 255, 169 / 255],\n\t\"darkkhaki\": [189 / 255, 183 / 255, 107 / 255],\n\t\"darkmagenta\": [139 / 255, 0, 139 / 255],\n\t\"darkolivegreen\": [85 / 255, 107 / 255, 47 / 255],\n\t\"darkorange\": [1, 140 / 255, 0],\n\t\"darkorchid\": [153 / 255, 50 / 255, 204 / 255],\n\t\"darkred\": [139 / 255, 0, 0],\n\t\"darksalmon\": [233 / 255, 150 / 255, 122 / 255],\n\t\"darkseagreen\": [143 / 255, 188 / 255, 143 / 255],\n\t\"darkslateblue\": [72 / 255, 61 / 255, 139 / 255],\n\t\"darkslategray\": [47 / 255, 79 / 255, 79 / 255],\n\t\"darkslategrey\": [47 / 255, 79 / 255, 79 / 255],\n\t\"darkturquoise\": [0, 206 / 255, 209 / 255],\n\t\"darkviolet\": [148 / 255, 0, 211 / 255],\n\t\"deeppink\": [1, 20 / 255, 147 / 255],\n\t\"deepskyblue\": [0, 191 / 255, 1],\n\t\"dimgray\": [105 / 255, 105 / 255, 105 / 255],\n\t\"dimgrey\": [105 / 255, 105 / 255, 105 / 255],\n\t\"dodgerblue\": [30 / 255, 144 / 255, 1],\n\t\"firebrick\": [178 / 255, 34 / 255, 34 / 255],\n\t\"floralwhite\": [1, 250 / 255, 240 / 255],\n\t\"forestgreen\": [34 / 255, 139 / 255, 34 / 255],\n\t\"fuchsia\": [1, 0, 1],\n\t\"gainsboro\": [220 / 255, 220 / 255, 220 / 255],\n\t\"ghostwhite\": [248 / 255, 248 / 255, 1],\n\t\"gold\": [1, 215 / 255, 0],\n\t\"goldenrod\": [218 / 255, 165 / 255, 32 / 255],\n\t\"gray\": [128 / 255, 128 / 255, 128 / 255],\n\t\"green\": [0, 128 / 255, 0],\n\t\"greenyellow\": [173 / 255, 1, 47 / 255],\n\t\"grey\": [128 / 255, 128 / 255, 128 / 255],\n\t\"honeydew\": [240 / 255, 1, 240 / 255],\n\t\"hotpink\": [1, 105 / 255, 180 / 255],\n\t\"indianred\": [205 / 255, 92 / 255, 92 / 255],\n\t\"indigo\": [75 / 255, 0, 130 / 255],\n\t\"ivory\": [1, 1, 240 / 255],\n\t\"khaki\": [240 / 255, 230 / 255, 140 / 255],\n\t\"lavender\": [230 / 255, 230 / 255, 250 / 255],\n\t\"lavenderblush\": [1, 240 / 255, 245 / 255],\n\t\"lawngreen\": [124 / 255, 252 / 255, 0],\n\t\"lemonchiffon\": [1, 250 / 255, 205 / 255],\n\t\"lightblue\": [173 / 255, 216 / 255, 230 / 255],\n\t\"lightcoral\": [240 / 255, 128 / 255, 128 / 255],\n\t\"lightcyan\": [224 / 255, 1, 1],\n\t\"lightgoldenrodyellow\": [250 / 255, 250 / 255, 210 / 255],\n\t\"lightgray\": [211 / 255, 211 / 255, 211 / 255],\n\t\"lightgreen\": [144 / 255, 238 / 255, 144 / 255],\n\t\"lightgrey\": [211 / 255, 211 / 255, 211 / 255],\n\t\"lightpink\": [1, 182 / 255, 193 / 255],\n\t\"lightsalmon\": [1, 160 / 255, 122 / 255],\n\t\"lightseagreen\": [32 / 255, 178 / 255, 170 / 255],\n\t\"lightskyblue\": [135 / 255, 206 / 255, 250 / 255],\n\t\"lightslategray\": [119 / 255, 136 / 255, 153 / 255],\n\t\"lightslategrey\": [119 / 255, 136 / 255, 153 / 255],\n\t\"lightsteelblue\": [176 / 255, 196 / 255, 222 / 255],\n\t\"lightyellow\": [1, 1, 224 / 255],\n\t\"lime\": [0, 1, 0],\n\t\"limegreen\": [50 / 255, 205 / 255, 50 / 255],\n\t\"linen\": [250 / 255, 240 / 255, 230 / 255],\n\t\"magenta\": [1, 0, 1],\n\t\"maroon\": [128 / 255, 0, 0],\n\t\"mediumaquamarine\": [102 / 255, 205 / 255, 170 / 255],\n\t\"mediumblue\": [0, 0, 205 / 255],\n\t\"mediumorchid\": [186 / 255, 85 / 255, 211 / 255],\n\t\"mediumpurple\": [147 / 255, 112 / 255, 219 / 255],\n\t\"mediumseagreen\": [60 / 255, 179 / 255, 113 / 255],\n\t\"mediumslateblue\": [123 / 255, 104 / 255, 238 / 255],\n\t\"mediumspringgreen\": [0, 250 / 255, 154 / 255],\n\t\"mediumturquoise\": [72 / 255, 209 / 255, 204 / 255],\n\t\"mediumvioletred\": [199 / 255, 21 / 255, 133 / 255],\n\t\"midnightblue\": [25 / 255, 25 / 255, 112 / 255],\n\t\"mintcream\": [245 / 255, 1, 250 / 255],\n\t\"mistyrose\": [1, 228 / 255, 225 / 255],\n\t\"moccasin\": [1, 228 / 255, 181 / 255],\n\t\"navajowhite\": [1, 222 / 255, 173 / 255],\n\t\"navy\": [0, 0, 128 / 255],\n\t\"oldlace\": [253 / 255, 245 / 255, 230 / 255],\n\t\"olive\": [128 / 255, 128 / 255, 0],\n\t\"olivedrab\": [107 / 255, 142 / 255, 35 / 255],\n\t\"orange\": [1, 165 / 255, 0],\n\t\"orangered\": [1, 69 / 255, 0],\n\t\"orchid\": [218 / 255, 112 / 255, 214 / 255],\n\t\"palegoldenrod\": [238 / 255, 232 / 255, 170 / 255],\n\t\"palegreen\": [152 / 255, 251 / 255, 152 / 255],\n\t\"paleturquoise\": [175 / 255, 238 / 255, 238 / 255],\n\t\"palevioletred\": [219 / 255, 112 / 255, 147 / 255],\n\t\"papayawhip\": [1, 239 / 255, 213 / 255],\n\t\"peachpuff\": [1, 218 / 255, 185 / 255],\n\t\"peru\": [205 / 255, 133 / 255, 63 / 255],\n\t\"pink\": [1, 192 / 255, 203 / 255],\n\t\"plum\": [221 / 255, 160 / 255, 221 / 255],\n\t\"powderblue\": [176 / 255, 224 / 255, 230 / 255],\n\t\"purple\": [128 / 255, 0, 128 / 255],\n\t\"rebeccapurple\": [102 / 255, 51 / 255, 153 / 255],\n\t\"red\": [1, 0, 0],\n\t\"rosybrown\": [188 / 255, 143 / 255, 143 / 255],\n\t\"royalblue\": [65 / 255, 105 / 255, 225 / 255],\n\t\"saddlebrown\": [139 / 255, 69 / 255, 19 / 255],\n\t\"salmon\": [250 / 255, 128 / 255, 114 / 255],\n\t\"sandybrown\": [244 / 255, 164 / 255, 96 / 255],\n\t\"seagreen\": [46 / 255, 139 / 255, 87 / 255],\n\t\"seashell\": [1, 245 / 255, 238 / 255],\n\t\"sienna\": [160 / 255, 82 / 255, 45 / 255],\n\t\"silver\": [192 / 255, 192 / 255, 192 / 255],\n\t\"skyblue\": [135 / 255, 206 / 255, 235 / 255],\n\t\"slateblue\": [106 / 255, 90 / 255, 205 / 255],\n\t\"slategray\": [112 / 255, 128 / 255, 144 / 255],\n\t\"slategrey\": [112 / 255, 128 / 255, 144 / 255],\n\t\"snow\": [1, 250 / 255, 250 / 255],\n\t\"springgreen\": [0, 1, 127 / 255],\n\t\"steelblue\": [70 / 255, 130 / 255, 180 / 255],\n\t\"tan\": [210 / 255, 180 / 255, 140 / 255],\n\t\"teal\": [0, 128 / 255, 128 / 255],\n\t\"thistle\": [216 / 255, 191 / 255, 216 / 255],\n\t\"tomato\": [1, 99 / 255, 71 / 255],\n\t\"turquoise\": [64 / 255, 224 / 255, 208 / 255],\n\t\"violet\": [238 / 255, 130 / 255, 238 / 255],\n\t\"wheat\": [245 / 255, 222 / 255, 179 / 255],\n\t\"white\": [1, 1, 1],\n\t\"whitesmoke\": [245 / 255, 245 / 255, 245 / 255],\n\t\"yellow\": [1, 1, 0],\n\t\"yellowgreen\": [154 / 255, 205 / 255, 50 / 255],\n};\n\nlet coordGrammar = Array(3).fill(\"<percentage> | <number>[0, 255]\");\nlet coordGrammarNumber = Array(3).fill(\"<number>[0, 255]\");\n\nvar sRGB = new RGBColorSpace({\n\tid: \"srgb\",\n\tname: \"sRGB\",\n\tbase: sRGBLinear,\n\tfromBase: rgb => {\n\t\t// convert an array of linear-light sRGB values in the range 0.0-1.0\n\t\t// to gamma corrected form\n\t\t// https://en.wikipedia.org/wiki/SRGB\n\t\treturn rgb.map(val => {\n\t\t\tlet sign = val < 0 ? -1 : 1;\n\t\t\tlet abs = val * sign;\n\n\t\t\tif (abs > 0.0031308) {\n\t\t\t\treturn sign * (1.055 * (abs ** (1 / 2.4)) - 0.055);\n\t\t\t}\n\n\t\t\treturn 12.92 * val;\n\t\t});\n\t},\n\ttoBase: rgb => {\n\t\t// convert an array of sRGB values in the range 0.0 - 1.0\n\t\t// to linear light (un-companded) form.\n\t\t// https://en.wikipedia.org/wiki/SRGB\n\t\treturn rgb.map(val => {\n\t\t\tlet sign = val < 0 ? -1 : 1;\n\t\t\tlet abs = val * sign;\n\n\t\t\tif (abs <= 0.04045) {\n\t\t\t\treturn val / 12.92;\n\t\t\t}\n\n\t\t\treturn sign * (((abs + 0.055) / 1.055) ** 2.4);\n\t\t});\n\t},\n\tformats: {\n\t\t\"rgb\": {\n\t\t\tcoords: coordGrammar,\n\t\t},\n\t\t\"rgb_number\": {\n\t\t\tname: \"rgb\",\n\t\t\tcommas: true,\n\t\t\tcoords: coordGrammarNumber,\n\t\t\tnoAlpha: true,\n\t\t},\n\t\t\"color\": { /* use defaults */ },\n\t\t\"rgba\": {\n\t\t\tcoords: coordGrammar,\n\t\t\tcommas: true,\n\t\t\tlastAlpha: true,\n\t\t},\n\t\t\"rgba_number\": {\n\t\t\tname: \"rgba\",\n\t\t\tcommas: true,\n\t\t\tcoords: coordGrammarNumber,\n\t\t},\n\t\t\"hex\": {\n\t\t\ttype: \"custom\",\n\t\t\ttoGamut: true,\n\t\t\ttest: str => /^#([a-f0-9]{3,4}){1,2}$/i.test(str),\n\t\t\tparse (str) {\n\t\t\t\tif (str.length <= 5) {\n\t\t\t\t\t// #rgb or #rgba, duplicate digits\n\t\t\t\t\tstr = str.replace(/[a-f0-9]/gi, \"$&$&\");\n\t\t\t\t}\n\n\t\t\t\tlet rgba = [];\n\t\t\t\tstr.replace(/[a-f0-9]{2}/gi, component => {\n\t\t\t\t\trgba.push(parseInt(component, 16) / 255);\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tspaceId: \"srgb\",\n\t\t\t\t\tcoords: rgba.slice(0, 3),\n\t\t\t\t\talpha: rgba.slice(3)[0],\n\t\t\t\t};\n\t\t\t},\n\t\t\tserialize: (coords, alpha, {\n\t\t\t\tcollapse = true, // collapse to 3-4 digit hex when possible?\n\t\t\t} = {}) => {\n\t\t\t\tif (alpha < 1) {\n\t\t\t\t\tcoords.push(alpha);\n\t\t\t\t}\n\n\t\t\t\tcoords = coords.map(c => Math.round(c * 255));\n\n\t\t\t\tlet collapsible = collapse && coords.every(c => c % 17 === 0);\n\n\t\t\t\tlet hex = coords.map(c => {\n\t\t\t\t\tif (collapsible) {\n\t\t\t\t\t\treturn (c / 17).toString(16);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.toString(16).padStart(2, \"0\");\n\t\t\t\t}).join(\"\");\n\n\t\t\t\treturn \"#\" + hex;\n\t\t\t},\n\t\t},\n\t\t\"keyword\": {\n\t\t\ttype: \"custom\",\n\t\t\ttest: str => /^[a-z]+$/i.test(str),\n\t\t\tparse (str) {\n\t\t\t\tstr = str.toLowerCase();\n\t\t\t\tlet ret = {spaceId: \"srgb\", coords: null, alpha: 1};\n\n\t\t\t\tif (str === \"transparent\") {\n\t\t\t\t\tret.coords = KEYWORDS.black;\n\t\t\t\t\tret.alpha = 0;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tret.coords = KEYWORDS[str];\n\t\t\t\t}\n\n\t\t\t\tif (ret.coords) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n});\n\nvar P3 = new RGBColorSpace({\n\tid: \"p3\",\n\tcssId: \"display-p3\",\n\tname: \"P3\",\n\tbase: P3Linear,\n\t// Gamma encoding/decoding is the same as sRGB\n\tfromBase: sRGB.fromBase,\n\ttoBase: sRGB.toBase,\n});\n\n// Default space for CSS output. Code in Color.js makes this wider if there's a DOM available\ndefaults.display_space = sRGB;\n\nlet supportsNone;\n\nif (typeof CSS !== \"undefined\" && CSS.supports) {\n\t// Find widest supported color space for CSS\n\tfor (let space of [lab, REC2020, P3]) {\n\t\tlet coords = space.getMinCoords();\n\t\tlet color = {space, coords, alpha: 1};\n\t\tlet str = serialize(color);\n\n\t\tif (CSS.supports(\"color\", str)) {\n\t\t\tdefaults.display_space = space;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Returns a serialization of the color that can actually be displayed in the browser.\n * If the default serialization can be displayed, it is returned.\n * Otherwise, the color is converted to Lab, REC2020, or P3, whichever is the widest supported.\n * In Node.js, this is basically equivalent to `serialize()` but returns a `String` object instead.\n *\n * @export\n * @param {{space, coords} | Color | string} color\n * @param {*} [options={}] Options to be passed to serialize()\n * @param {ColorSpace | string} [options.space = defaults.display_space] Color space to use for serialization if default is not supported\n * @returns {String} String object containing the serialized color with a color property containing the converted color (or the original, if no conversion was necessary)\n */\nfunction display (color, {space = defaults.display_space, ...options} = {}) {\n\tlet ret = serialize(color, options);\n\n\tif (typeof CSS === \"undefined\" || CSS.supports(\"color\", ret) || !defaults.display_space) {\n\t\tret = new String(ret);\n\t\tret.color = color;\n\t}\n\telse {\n\t\t// If we're here, what we were about to output is not supported\n\t\tlet fallbackColor = color;\n\n\t\t// First, check if the culprit is none values\n\t\tlet hasNone = color.coords.some(isNone) || isNone(color.alpha);\n\n\t\tif (hasNone) {\n\t\t\t// Does the browser support none values?\n\t\t\tif (!(supportsNone ??= CSS.supports(\"color\", \"hsl(none 50% 50%)\"))) {\n\t\t\t\t// Nope, try again without none\n\t\t\t\tfallbackColor = clone(color);\n\t\t\t\tfallbackColor.coords = fallbackColor.coords.map(skipNone);\n\t\t\t\tfallbackColor.alpha = skipNone(fallbackColor.alpha);\n\n\t\t\t\tret = serialize(fallbackColor, options);\n\n\t\t\t\tif (CSS.supports(\"color\", ret)) {\n\t\t\t\t\t// We're done, now it's supported\n\t\t\t\t\tret = new String(ret);\n\t\t\t\t\tret.color = fallbackColor;\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're here, the color function is not supported\n\t\t// Fall back to fallback space\n\t\tfallbackColor = to(fallbackColor, space);\n\t\tret = new String(serialize(fallbackColor, options));\n\t\tret.color = fallbackColor;\n\t}\n\n\treturn ret;\n}\n\nfunction equals (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\treturn color1.space === color2.space\n\t && color1.alpha === color2.alpha\n\t && color1.coords.every((c, i) => c === color2.coords[i]);\n}\n\n/**\n * Relative luminance\n */\n\nfunction getLuminance (color) {\n\t// Assume getColor() is called on color in get()\n\treturn get(color, [xyz_d65, \"y\"]);\n}\n\nfunction setLuminance (color, value) {\n\t// Assume getColor() is called on color in set()\n\tset(color, [xyz_d65, \"y\"], value);\n}\n\nfunction register$2 (Color) {\n\tObject.defineProperty(Color.prototype, \"luminance\", {\n\t\tget () {\n\t\t\treturn getLuminance(this);\n\t\t},\n\t\tset (value) {\n\t\t\tsetLuminance(this, value);\n\t\t},\n\t});\n}\n\nvar luminance = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tgetLuminance: getLuminance,\n\tregister: register$2,\n\tsetLuminance: setLuminance\n});\n\n// WCAG 2.0 contrast https://www.w3.org/TR/WCAG20-TECHS/G18.html\n// Simple contrast, with fixed 5% viewing flare contribution\n// Symmetric, does not matter which is foreground and which is background\n\n\nfunction contrastWCAG21 (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\treturn (Y1 + .05) / (Y2 + .05);\n}\n\n// APCA 0.0.98G\n// https://github.com/Myndex/apca-w3\n// see also https://github.com/w3c/silver/issues/643\n\n\n// exponents\nconst normBG = 0.56;\nconst normTXT = 0.57;\nconst revTXT = 0.62;\nconst revBG = 0.65;\n\n// clamps\nconst blkThrs = 0.022;\nconst blkClmp = 1.414;\nconst loClip = 0.1;\nconst deltaYmin = 0.0005;\n\n// scalers\n// see https://github.com/w3c/silver/issues/645\nconst scaleBoW = 1.14;\nconst loBoWoffset = 0.027;\nconst scaleWoB = 1.14;\n\nfunction fclamp (Y) {\n\tif (Y >= blkThrs) {\n\t\treturn Y;\n\t}\n\treturn Y + (blkThrs - Y) ** blkClmp;\n}\n\nfunction linearize (val) {\n\tlet sign = val < 0 ? -1 : 1;\n\tlet abs = Math.abs(val);\n\treturn sign * Math.pow(abs, 2.4);\n}\n\n// Not symmetric, requires a foreground (text) color, and a background color\nfunction contrastAPCA (background, foreground) {\n\tforeground = getColor(foreground);\n\tbackground = getColor(background);\n\n\tlet S;\n\tlet C;\n\tlet Sapc;\n\n\t// Myndex as-published, assumes sRGB inputs\n\tlet R, G, B;\n\n\tforeground = to(foreground, \"srgb\");\n\t// Should these be clamped to in-gamut values?\n\n\t// Calculates \"screen luminance\" with non-standard simple gamma EOTF\n\t// weights should be from CSS Color 4, not the ones here which are via Myndex and copied from Lindbloom\n\t[R, G, B] = foreground.coords;\n\tlet lumTxt = linearize(R) * 0.2126729 + linearize(G) * 0.7151522 + linearize(B) * 0.0721750;\n\n\tbackground = to(background, \"srgb\");\n\t[R, G, B] = background.coords;\n\tlet lumBg = linearize(R) * 0.2126729 + linearize(G) * 0.7151522 + linearize(B) * 0.0721750;\n\n\t// toe clamping of very dark values to account for flare\n\tlet Ytxt = fclamp(lumTxt);\n\tlet Ybg = fclamp(lumBg);\n\n\t// are we \"Black on White\" (dark on light), or light on dark?\n\tlet BoW = Ybg > Ytxt;\n\n\t// why is this a delta, when Y is not perceptually uniform?\n\t// Answer: it is a noise gate, see\n\t// https://github.com/LeaVerou/color.js/issues/208\n\tif (Math.abs(Ybg - Ytxt) < deltaYmin) {\n\t\tC = 0;\n\t}\n\telse {\n\t\tif (BoW) {\n\t\t\t// dark text on light background\n\t\t\tS = Ybg ** normBG - Ytxt ** normTXT;\n\t\t\tC = S * scaleBoW;\n\t\t}\n\t\telse {\n\t\t\t// light text on dark background\n\t\t\tS = Ybg ** revBG - Ytxt ** revTXT;\n\t\t\tC = S * scaleWoB;\n\t\t}\n\t}\n\tif (Math.abs(C) < loClip) {\n\t\tSapc = 0;\n\t}\n\telse if (C > 0) {\n\t\t// not clear whether Woffset is loBoWoffset or loWoBoffset\n\t\t// but they have the same value\n\t\tSapc = C - loBoWoffset;\n\t}\n\telse {\n\t\tSapc = C + loBoWoffset;\n\t}\n\n\treturn Sapc * 100;\n}\n\n// Michelson luminance contrast\n// the relation between the spread and the sum of the two luminances\n// Symmetric, does not matter which is foreground and which is background\n// No black level compensation for flare.\n\n\nfunction contrastMichelson (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\tlet denom = (Y1 + Y2);\n\treturn denom === 0 ? 0 : (Y1 - Y2) / denom;\n}\n\n// Weber luminance contrast\n// The difference between the two luminances divided by the lower luminance\n// Symmetric, does not matter which is foreground and which is background\n// No black level compensation for flare.\n\n\n// the darkest sRGB color above black is #000001 and this produces\n// a plain Weber contrast of ~45647.\n// So, setting the divide-by-zero result at 50000 is a reasonable\n// max clamp for the plain Weber\nconst max = 50000;\n\nfunction contrastWeber (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Y1 = Math.max(getLuminance(color1), 0);\n\tlet Y2 = Math.max(getLuminance(color2), 0);\n\n\tif (Y2 > Y1) {\n\t\t[Y1, Y2] = [Y2, Y1];\n\t}\n\n\treturn Y2 === 0 ? max : (Y1 - Y2) / Y2;\n}\n\n// CIE Lightness difference, as used by Google Material Design\n// Google HCT Tone is the same as CIE Lightness\n// https://material.io/blog/science-of-color-design\n\n\nfunction contrastLstar (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet L1 = get(color1, [lab, \"l\"]);\n\tlet L2 = get(color2, [lab, \"l\"]);\n\n\treturn Math.abs(L1 - L2);\n}\n\n// κ * ε = 2^3 = 8\nconst ε$3 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst ε3 = 24 / 116;\nconst κ$2 = 24389 / 27; // 29^3/3^3\n\nlet white$1 = WHITES.D65;\n\nvar lab_d65 = new ColorSpace({\n\tid: \"lab-d65\",\n\tname: \"Lab D65\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\ta: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t\tb: {\n\t\t\trefRange: [-125, 125],\n\t\t},\n\t},\n\n\t// Assuming XYZ is relative to D65, convert to CIE Lab\n\t// from CIE standard, which now defines these as a rational fraction\n\twhite: white$1,\n\n\tbase: xyz_d65,\n\t// Convert D65-adapted XYZ to Lab\n\t// CIE 15.3:2004 section 8.2.1.1\n\tfromBase (XYZ) {\n\t\t// compute xyz, which is XYZ scaled relative to reference white\n\t\tlet xyz = XYZ.map((value, i) => value / white$1[i]);\n\n\t\t// now compute f\n\t\tlet f = xyz.map(value => value > ε$3 ? Math.cbrt(value) : (κ$2 * value + 16) / 116);\n\n\t\treturn [\n\t\t\t(116 * f[1]) - 16, // L\n\t\t\t500 * (f[0] - f[1]), // a\n\t\t\t200 * (f[1] - f[2]), // b\n\t\t];\n\t},\n\t// Convert Lab to D65-adapted XYZ\n\t// Same result as CIE 15.3:2004 Appendix D although the derivation is different\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\ttoBase (Lab) {\n\t\t// compute f, starting with the luminance-related term\n\t\tlet f = [];\n\t\tf[1] = (Lab[0] + 16) / 116;\n\t\tf[0] = Lab[1] / 500 + f[1];\n\t\tf[2] = f[1] - Lab[2] / 200;\n\n\t\t// compute xyz\n\t\tlet xyz = [\n\t\t\tf[0] > ε3 ? Math.pow(f[0], 3) : (116 * f[0] - 16) / κ$2,\n\t\t\tLab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / κ$2,\n\t\t\tf[2] > ε3 ? Math.pow(f[2], 3) : (116 * f[2] - 16) / κ$2,\n\t\t];\n\n\t\t// Compute XYZ by scaling xyz by reference white\n\t\treturn xyz.map((value, i) => value * white$1[i]);\n\t},\n\n\tformats: {\n\t\t\"lab-d65\": {\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\n// Delta Phi Star perceptual lightness contrast\n// See https://github.com/Myndex/deltaphistar\n// The (difference between two Lstars each raised to phi) raised to (1/phi)\n// Symmetric, does not matter which is foreground and which is background\n\n\nconst phi = Math.pow(5, 0.5) * 0.5 + 0.5; // Math.phi can be used if Math.js\n\nfunction contrastDeltaPhi (color1, color2) {\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\tlet Lstr1 = get(color1, [lab_d65, \"l\"]);\n\tlet Lstr2 = get(color2, [lab_d65, \"l\"]);\n\n\tlet deltaPhiStar = Math.abs(Math.pow(Lstr1, phi) - Math.pow(Lstr2, phi));\n\n\tlet contrast = Math.pow(deltaPhiStar, (1 / phi)) * Math.SQRT2 - 40;\n\n\treturn (contrast < 7.5) ? 0.0 : contrast ;\n}\n\nvar contrastMethods = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tcontrastAPCA: contrastAPCA,\n\tcontrastDeltaPhi: contrastDeltaPhi,\n\tcontrastLstar: contrastLstar,\n\tcontrastMichelson: contrastMichelson,\n\tcontrastWCAG21: contrastWCAG21,\n\tcontrastWeber: contrastWeber\n});\n\nfunction contrast (background, foreground, o = {}) {\n\tif (isString(o)) {\n\t\to = {algorithm: o};\n\t}\n\n\tlet {algorithm, ...rest} = o;\n\n\tif (!algorithm) {\n\t\tlet algorithms = Object.keys(contrastMethods).map(a => a.replace(/^contrast/, \"\")).join(\", \");\n\t\tthrow new TypeError(`contrast() function needs a contrast algorithm. Please specify one of: ${algorithms}`);\n\t}\n\n\tbackground = getColor(background);\n\tforeground = getColor(foreground);\n\n\tfor (let a in contrastMethods) {\n\t\tif (\"contrast\" + algorithm.toLowerCase() === a.toLowerCase()) {\n\t\t\treturn contrastMethods[a](background, foreground, rest);\n\t\t}\n\t}\n\n\tthrow new TypeError(`Unknown contrast algorithm: ${algorithm}`);\n}\n\n// Chromaticity coordinates\nfunction uv (color) {\n\t// Assumes getAll() calls getColor() on color\n\tlet [X, Y, Z] = getAll(color, xyz_d65);\n\tlet denom = X + 15 * Y + 3 * Z;\n\treturn [4 * X / denom, 9 * Y / denom];\n}\n\nfunction xy (color) {\n\t// Assumes getAll() calls getColor() on color\n\tlet [X, Y, Z] = getAll(color, xyz_d65);\n\tlet sum = X + Y + Z;\n\treturn [X / sum, Y / sum];\n}\n\nfunction register$1 (Color) {\n\t// no setters, as lightness information is lost\n\t// when converting color to chromaticity\n\tObject.defineProperty(Color.prototype, \"uv\", {\n\t\tget () {\n\t\t\treturn uv(this);\n\t\t},\n\t});\n\n\tObject.defineProperty(Color.prototype, \"xy\", {\n\t\tget () {\n\t\t\treturn xy(this);\n\t\t},\n\t});\n}\n\nvar chromaticity = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tregister: register$1,\n\tuv: uv,\n\txy: xy\n});\n\nfunction deltaE (c1, c2, o = {}) {\n\tif (isString(o)) {\n\t\to = {method: o};\n\t}\n\n\tlet {method = defaults.deltaE, ...rest} = o;\n\n\tfor (let m in deltaEMethods) {\n\t\tif (\"deltae\" + method.toLowerCase() === m.toLowerCase()) {\n\t\t\treturn deltaEMethods[m](c1, c2, rest);\n\t\t}\n\t}\n\n\tthrow new TypeError(`Unknown deltaE method: ${method}`);\n}\n\nfunction lighten (color, amount = .25) {\n\tlet space = ColorSpace.get(\"oklch\", \"lch\");\n\tlet lightness = [space, \"l\"];\n\treturn set(color, lightness, l => l * (1 + amount));\n}\n\nfunction darken (color, amount = .25) {\n\tlet space = ColorSpace.get(\"oklch\", \"lch\");\n\tlet lightness = [space, \"l\"];\n\treturn set(color, lightness, l => l * (1 - amount));\n}\n\nvar variations = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tdarken: darken,\n\tlighten: lighten\n});\n\n/**\n * Functions related to color interpolation\n */\n\n/**\n * Return an intermediate color between two colors\n * Signatures: mix(c1, c2, p, options)\n * mix(c1, c2, options)\n * mix(color)\n * @param {Color | string} c1 The first color\n * @param {Color | string} [c2] The second color\n * @param {number} [p=.5] A 0-1 percentage where 0 is c1 and 1 is c2\n * @param {Object} [o={}]\n * @return {Color}\n */\nfunction mix (c1, c2, p = .5, o = {}) {\n\t[c1, c2] = [getColor(c1), getColor(c2)];\n\n\tif (type(p) === \"object\") {\n\t\t[p, o] = [.5, p];\n\t}\n\n\tlet r = range(c1, c2, o);\n\treturn r(p);\n}\n\n/**\n *\n * @param {Color | string | Function} c1 The first color or a range\n * @param {Color | string} [c2] The second color if c1 is not a range\n * @param {Object} [options={}]\n * @return {Color[]}\n */\nfunction steps (c1, c2, options = {}) {\n\tlet colorRange;\n\n\tif (isRange(c1)) {\n\t\t// Tweaking existing range\n\t\t[colorRange, options] = [c1, c2];\n\t\t[c1, c2] = colorRange.rangeArgs.colors;\n\t}\n\n\tlet {\n\t\tmaxDeltaE, deltaEMethod,\n\t\tsteps = 2, maxSteps = 1000,\n\t\t...rangeOptions\n\t} = options;\n\n\tif (!colorRange) {\n\t\t[c1, c2] = [getColor(c1), getColor(c2)];\n\t\tcolorRange = range(c1, c2, rangeOptions);\n\t}\n\n\tlet totalDelta = deltaE(c1, c2);\n\tlet actualSteps = maxDeltaE > 0 ? Math.max(steps, Math.ceil(totalDelta / maxDeltaE) + 1) : steps;\n\tlet ret = [];\n\n\tif (maxSteps !== undefined) {\n\t\tactualSteps = Math.min(actualSteps, maxSteps);\n\t}\n\n\tif (actualSteps === 1) {\n\t\tret = [{p: .5, color: colorRange(.5)}];\n\t}\n\telse {\n\t\tlet step = 1 / (actualSteps - 1);\n\t\tret = Array.from({length: actualSteps}, (_, i) => {\n\t\t\tlet p = i * step;\n\t\t\treturn {p, color: colorRange(p)};\n\t\t});\n\t}\n\n\tif (maxDeltaE > 0) {\n\t\t// Iterate over all stops and find max deltaE\n\t\tlet maxDelta = ret.reduce((acc, cur, i) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tlet ΔΕ = deltaE(cur.color, ret[i - 1].color, deltaEMethod);\n\t\t\treturn Math.max(acc, ΔΕ);\n\t\t}, 0);\n\n\t\twhile (maxDelta > maxDeltaE) {\n\t\t\t// Insert intermediate stops and measure maxDelta again\n\t\t\t// We need to do this for all pairs, otherwise the midpoint shifts\n\t\t\tmaxDelta = 0;\n\n\t\t\tfor (let i = 1; (i < ret.length) && (ret.length < maxSteps); i++) {\n\t\t\t\tlet prev = ret[i - 1];\n\t\t\t\tlet cur = ret[i];\n\n\t\t\t\tlet p = (cur.p + prev.p) / 2;\n\t\t\t\tlet color = colorRange(p);\n\t\t\t\tmaxDelta = Math.max(maxDelta, deltaE(color, prev.color), deltaE(color, cur.color));\n\t\t\t\tret.splice(i, 0, {p, color: colorRange(p)});\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\n\tret = ret.map(a => a.color);\n\n\treturn ret;\n}\n\n/**\n * Interpolate to color2 and return a function that takes a 0-1 percentage\n * @param {Color | string | Function} color1 The first color or an existing range\n * @param {Color | string} [color2] If color1 is a color, this is the second color\n * @param {Object} [options={}]\n * @returns {Function} A function that takes a 0-1 percentage and returns a color\n */\nfunction range (color1, color2, options = {}) {\n\tif (isRange(color1)) {\n\t\t// Tweaking existing range\n\t\tlet [r, options] = [color1, color2];\n\n\t\treturn range(...r.rangeArgs.colors, {...r.rangeArgs.options, ...options});\n\t}\n\n\tlet {space, outputSpace, progression, premultiplied} = options;\n\n\tcolor1 = getColor(color1);\n\tcolor2 = getColor(color2);\n\n\t// Make sure we're working on copies of these colors\n\tcolor1 = clone(color1);\n\tcolor2 = clone(color2);\n\n\tlet rangeArgs = {colors: [color1, color2], options};\n\n\tif (space) {\n\t\tspace = ColorSpace.get(space);\n\t}\n\telse {\n\t\tspace = ColorSpace.registry[defaults.interpolationSpace] || color1.space;\n\t}\n\n\toutputSpace = outputSpace ? ColorSpace.get(outputSpace) : space;\n\n\tcolor1 = to(color1, space);\n\tcolor2 = to(color2, space);\n\n\t// Gamut map to avoid areas of flat color\n\tcolor1 = toGamut(color1);\n\tcolor2 = toGamut(color2);\n\n\t// Handle hue interpolation\n\t// See https://github.com/w3c/csswg-drafts/issues/4735#issuecomment-635741840\n\tif (space.coords.h && space.coords.h.type === \"angle\") {\n\t\tlet arc = options.hue = options.hue || \"shorter\";\n\n\t\tlet hue = [space, \"h\"];\n\t\tlet [θ1, θ2] = [get(color1, hue), get(color2, hue)];\n\t\t// Undefined hues must be evaluated before hue fix-up to properly\n\t\t// calculate hue arcs between undefined and defined hues.\n\t\t// See https://github.com/w3c/csswg-drafts/issues/9436#issuecomment-1746957545\n\t\tif (isNaN(θ1) && !isNaN(θ2)) {\n\t\t\tθ1 = θ2;\n\t\t}\n\t\telse if (isNaN(θ2) && !isNaN(θ1)) {\n\t\t\tθ2 = θ1;\n\t\t}\n\t\t[θ1, θ2] = adjust(arc, [θ1, θ2]);\n\t\tset(color1, hue, θ1);\n\t\tset(color2, hue, θ2);\n\t}\n\n\tif (premultiplied) {\n\t\t// not coping with polar spaces yet\n\t\tcolor1.coords = color1.coords.map(c => c * color1.alpha);\n\t\tcolor2.coords = color2.coords.map(c => c * color2.alpha);\n\t}\n\n\treturn Object.assign(p => {\n\t\tp = progression ? progression(p) : p;\n\t\tlet coords = color1.coords.map((start, i) => {\n\t\t\tlet end = color2.coords[i];\n\t\t\treturn interpolate(start, end, p);\n\t\t});\n\n\t\tlet alpha = interpolate(color1.alpha, color2.alpha, p);\n\t\tlet ret = {space, coords, alpha};\n\n\t\tif (premultiplied) {\n\t\t\t// undo premultiplication\n\t\t\tret.coords = ret.coords.map(c => c / alpha);\n\t\t}\n\n\t\tif (outputSpace !== space) {\n\t\t\tret = to(ret, outputSpace);\n\t\t}\n\n\t\treturn ret;\n\t}, {\n\t\trangeArgs,\n\t});\n}\n\nfunction isRange (val) {\n\treturn type(val) === \"function\" && !!val.rangeArgs;\n}\n\ndefaults.interpolationSpace = \"lab\";\n\nfunction register (Color) {\n\tColor.defineFunction(\"mix\", mix, {returns: \"color\"});\n\tColor.defineFunction(\"range\", range, {returns: \"function<color>\"});\n\tColor.defineFunction(\"steps\", steps, {returns: \"array<color>\"});\n}\n\nvar interpolation = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tisRange: isRange,\n\tmix: mix,\n\trange: range,\n\tregister: register,\n\tsteps: steps\n});\n\nvar HSL = new ColorSpace({\n\tid: \"hsl\",\n\tname: \"HSL\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: sRGB,\n\n\t// Adapted from https://drafts.csswg.org/css-color-4/better-rgbToHsl.js\n\tfromBase: rgb => {\n\t\tlet max = Math.max(...rgb);\n\t\tlet min = Math.min(...rgb);\n\t\tlet [r, g, b] = rgb;\n\t\tlet [h, s, l] = [NaN, 0, (min + max) / 2];\n\t\tlet d = max - min;\n\n\t\tif (d !== 0) {\n\t\t\ts = (l === 0 || l === 1) ? 0 : (max - l) / Math.min(l, 1 - l);\n\n\t\t\tswitch (max) {\n\t\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break;\n\t\t\t\tcase g: h = (b - r) / d + 2; break;\n\t\t\t\tcase b: h = (r - g) / d + 4;\n\t\t\t}\n\n\t\t\th = h * 60;\n\t\t}\n\n\t\t// Very out of gamut colors can produce negative saturation\n\t\t// If so, just rotate the hue by 180 and use a positive saturation\n\t\t// see https://github.com/w3c/csswg-drafts/issues/9222\n\t\tif (s < 0) {\n\t\t\th += 180;\n\t\t\ts = Math.abs(s);\n\t\t}\n\n\t\tif (h >= 360) {\n\t\t\th -= 360;\n\t\t}\n\n\t\treturn [h, s * 100, l * 100];\n\t},\n\n\t// Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative\n\ttoBase: hsl => {\n\t\tlet [h, s, l] = hsl;\n\t\th = h % 360;\n\n\t\tif (h < 0) {\n\t\t\th += 360;\n\t\t}\n\n\t\ts /= 100;\n\t\tl /= 100;\n\n\t\tfunction f (n) {\n\t\t\tlet k = (n + h / 30) % 12;\n\t\t\tlet a = s * Math.min(l, 1 - l);\n\t\t\treturn l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n\t\t}\n\n\t\treturn [f(0), f(8), f(4)];\n\t},\n\n\tformats: {\n\t\t\"hsl\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage>\", \"<percentage>\"],\n\t\t},\n\t\t\"hsla\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage>\", \"<percentage>\"],\n\t\t\tcommas: true,\n\t\t\tlastAlpha: true,\n\t\t},\n\t},\n});\n\n// The Hue, Whiteness Blackness (HWB) colorspace\n// See https://drafts.csswg.org/css-color-4/#the-hwb-notation\n// Note that, like HSL, calculations are done directly on\n// gamma-corrected sRGB values rather than linearising them first.\n\nvar HSV = new ColorSpace({\n\tid: \"hsv\",\n\tname: \"HSV\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tv: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Value\",\n\t\t},\n\t},\n\n\tbase: HSL,\n\t// https://en.wikipedia.org/wiki/HSL_and_HSV#Interconversion\n\tfromBase (hsl) {\n\t\tlet [h, s, l] = hsl;\n\t\ts /= 100;\n\t\tl /= 100;\n\n\t\tlet v = l + s * Math.min(l, 1 - l);\n\n\t\treturn [\n\t\t\th, // h is the same\n\t\t\tv === 0 ? 0 : 200 * (1 - l / v), // s\n\t\t\t100 * v,\n\t\t];\n\t},\n\t// https://en.wikipedia.org/wiki/HSL_and_HSV#Interconversion\n\ttoBase (hsv) {\n\t\tlet [h, s, v] = hsv;\n\n\t\ts /= 100;\n\t\tv /= 100;\n\n\t\tlet l = v * (1 - s / 2);\n\n\t\treturn [\n\t\t\th, // h is the same\n\t\t\t(l === 0 || l === 1) ? 0 : ((v - l) / Math.min(l, 1 - l)) * 100,\n\t\t\tl * 100,\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hsv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n// The Hue, Whiteness Blackness (HWB) colorspace\n// See https://drafts.csswg.org/css-color-4/#the-hwb-notation\n// Note that, like HSL, calculations are done directly on\n// gamma-corrected sRGB values rather than linearising them first.\n\nvar hwb = new ColorSpace({\n\tid: \"hwb\",\n\tname: \"HWB\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\tw: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Whiteness\",\n\t\t},\n\t\tb: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Blackness\",\n\t\t},\n\t},\n\n\tbase: HSV,\n\tfromBase (hsv) {\n\t\tlet [h, s, v] = hsv;\n\n\t\treturn [h, v * (100 - s) / 100, 100 - v];\n\t},\n\ttoBase (hwb) {\n\t\tlet [h, w, b] = hwb;\n\n\t\t// Now convert percentages to [0..1]\n\t\tw /= 100;\n\t\tb /= 100;\n\n\t\t// Achromatic check (white plus black >= 1)\n\t\tlet sum = w + b;\n\t\tif (sum >= 1) {\n\t\t\tlet gray = w / sum;\n\t\t\treturn [h, 0, gray * 100];\n\t\t}\n\n\t\tlet v = (1 - b);\n\t\tlet s = (v === 0) ? 0 : 1 - w / v;\n\t\treturn [h, s * 100, v * 100];\n\t},\n\n\tformats: {\n\t\t\"hwb\": {\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n// convert an array of linear-light a98-rgb values to CIE XYZ\n// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n// has greater numerical precision than section 4.3.5.3 of\n// https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf\n// but the values below were calculated from first principles\n// from the chromaticity coordinates of R G B W\nconst toXYZ_M$2 = [\n\t[ 0.5766690429101305, 0.1855582379065463, 0.1882286462349947 ],\n\t[ 0.29734497525053605, 0.6273635662554661, 0.07529145849399788 ],\n\t[ 0.02703136138641234, 0.07068885253582723, 0.9913375368376388 ],\n];\n\nconst fromXYZ_M$2 = [\n\t[ 2.0415879038107465, -0.5650069742788596, -0.34473135077832956 ],\n\t[ -0.9692436362808795, 1.8759675015077202, 0.04155505740717557 ],\n\t[ 0.013444280632031142, -0.11836239223101838, 1.0151749943912054 ],\n];\n\nvar A98Linear = new RGBColorSpace({\n\tid: \"a98rgb-linear\",\n\tcssId: \"--a98-rgb-linear\",\n\tname: \"Linear Adobe® 98 RGB compatible\",\n\twhite: \"D65\",\n\ttoXYZ_M: toXYZ_M$2,\n\tfromXYZ_M: fromXYZ_M$2,\n});\n\nvar a98rgb = new RGBColorSpace({\n\tid: \"a98rgb\",\n\tcssId: \"a98-rgb\",\n\tname: \"Adobe® 98 RGB compatible\",\n\tbase: A98Linear,\n\ttoBase: RGB => RGB.map(val => Math.pow(Math.abs(val), 563 / 256) * Math.sign(val)),\n\tfromBase: RGB => RGB.map(val => Math.pow(Math.abs(val), 256 / 563) * Math.sign(val)),\n});\n\n// convert an array of prophoto-rgb values to CIE XYZ\n// using D50 (so no chromatic adaptation needed afterwards)\n// matrix cannot be expressed in rational form, but is calculated to 64 bit accuracy\n// see https://github.com/w3c/csswg-drafts/issues/7675\nconst toXYZ_M$1 = [\n\t[ 0.79776664490064230, 0.13518129740053308, 0.03134773412839220 ],\n\t[ 0.28807482881940130, 0.71183523424187300, 0.00008993693872564 ],\n\t[ 0.00000000000000000, 0.00000000000000000, 0.82510460251046020 ],\n];\n\nconst fromXYZ_M$1 = [\n\t[ 1.34578688164715830, -0.25557208737979464, -0.05110186497554526 ],\n\t[ -0.54463070512490190, 1.50824774284514680, 0.02052744743642139 ],\n\t[ 0.00000000000000000, 0.00000000000000000, 1.21196754563894520 ],\n];\n\nvar ProPhotoLinear = new RGBColorSpace({\n\tid: \"prophoto-linear\",\n\tcssId: \"--prophoto-rgb-linear\",\n\tname: \"Linear ProPhoto\",\n\twhite: \"D50\",\n\tbase: XYZ_D50,\n\ttoXYZ_M: toXYZ_M$1,\n\tfromXYZ_M: fromXYZ_M$1,\n});\n\nconst Et = 1 / 512;\nconst Et2 = 16 / 512;\n\nvar prophoto = new RGBColorSpace({\n\tid: \"prophoto\",\n\tcssId: \"prophoto-rgb\",\n\tname: \"ProPhoto\",\n\tbase: ProPhotoLinear,\n\ttoBase (RGB) {\n\t\t// Transfer curve is gamma 1.8 with a small linear portion\n\t\treturn RGB.map(v => v < Et2 ? v / 16 : v ** 1.8);\n\t},\n\tfromBase (RGB) {\n\t\treturn RGB.map(v => v >= Et ? v ** (1 / 1.8) : 16 * v);\n\t},\n});\n\nvar oklch = new ColorSpace({\n\tid: \"oklch\",\n\tname: \"Oklch\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 1],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 0.4],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\twhite: \"D65\",\n\n\tbase: OKLab,\n\tfromBase (oklab) {\n\t\t// Convert to polar form\n\t\tlet [L, a, b] = oklab;\n\t\tlet h;\n\t\tconst ε = 0.0002; // chromatic components much smaller than a,b\n\n\t\tif (Math.abs(a) < ε && Math.abs(b) < ε) {\n\t\t\th = NaN;\n\t\t}\n\t\telse {\n\t\t\th = Math.atan2(b, a) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // OKLab L is still L\n\t\t\tMath.sqrt(a ** 2 + b ** 2), // Chroma\n\t\t\tconstrain(h), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\t// Convert from polar form\n\ttoBase (oklch) {\n\t\tlet [L, C, h] = oklch;\n\t\tlet a, b;\n\n\t\t// check for NaN hue\n\t\tif (isNaN(h)) {\n\t\t\ta = 0;\n\t\t\tb = 0;\n\t\t}\n\t\telse {\n\t\t\ta = C * Math.cos(h * Math.PI / 180);\n\t\t\tb = C * Math.sin(h * Math.PI / 180);\n\t\t}\n\n\t\treturn [ L, a, b ];\n\t},\n\n\tformats: {\n\t\t\"oklch\": {\n\t\t\tcoords: [\"<percentage> | <number>\", \"<number> | <percentage>[0,1]\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\nlet white = WHITES.D65;\n\nconst ε$2 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ$1 = 24389 / 27; // 29^3/3^3\nconst [U_PRIME_WHITE, V_PRIME_WHITE] = uv({space: xyz_d65, coords: white});\n\nvar Luv = new ColorSpace({\n\tid: \"luv\",\n\tname: \"Luv\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\t// Reference ranges from https://facelessuser.github.io/coloraide/colors/luv/\n\t\tu: {\n\t\t\trefRange: [-215, 215],\n\t\t},\n\t\tv: {\n\t\t\trefRange: [-215, 215],\n\t\t},\n\t},\n\n\twhite: white,\n\tbase: xyz_d65,\n\n\t// Convert D65-adapted XYZ to Luv\n\t// https://en.wikipedia.org/wiki/CIELUV#The_forward_transformation\n\tfromBase (XYZ) {\n\t\tlet xyz = [skipNone(XYZ[0]), skipNone(XYZ[1]), skipNone(XYZ[2])];\n\t\tlet y = xyz[1];\n\n\t\tlet [up, vp] = uv({space: xyz_d65, coords: xyz});\n\n\t\t// Protect against XYZ of [0, 0, 0]\n\t\tif (!Number.isFinite(up) || !Number.isFinite(vp)) {\n\t\t\treturn [0, 0, 0];\n\t\t}\n\n\t\tlet L = y <= ε$2 ? κ$1 * y : 116 * Math.cbrt(y) - 16;\n\t\treturn [\n\t\t\tL,\n\t\t\t13 * L * (up - U_PRIME_WHITE),\n\t\t\t13 * L * (vp - V_PRIME_WHITE),\n\t\t ];\n\t},\n\n\t// Convert Luv to D65-adapted XYZ\n\t// https://en.wikipedia.org/wiki/CIELUV#The_reverse_transformation\n\ttoBase (Luv) {\n\t\tlet [L, u, v] = Luv;\n\n\t\t// Protect against division by zero and NaN Lightness\n\t\tif (L === 0 || isNone(L)) {\n\t\t\treturn [0, 0, 0];\n\t\t}\n\n\t\tu = skipNone(u);\n\t\tv = skipNone(v);\n\n\t\tlet up = (u / (13 * L)) + U_PRIME_WHITE;\n\t\tlet vp = (v / (13 * L)) + V_PRIME_WHITE;\n\n\t\tlet y = L <= 8 ? L / κ$1 : Math.pow((L + 16) / 116, 3);\n\n\t\treturn [\n\t\t\ty * ((9 * up) / (4 * vp)),\n\t\t\ty,\n\t\t\ty * ((12 - 3 * up - 20 * vp) / (4 * vp)),\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--luv\",\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>[-1,1]\", \"<number> | <percentage>[-1,1]\"],\n\t\t},\n\t},\n});\n\nvar LCHuv = new ColorSpace({\n\tid: \"lchuv\",\n\tname: \"LChuv\",\n\tcoords: {\n\t\tl: {\n\t\t\trefRange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t\tc: {\n\t\t\trefRange: [0, 220],\n\t\t\tname: \"Chroma\",\n\t\t},\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t},\n\n\tbase: Luv,\n\tfromBase (Luv) {\n\t\t// Convert to polar form\n\t\tlet [L, u, v] = Luv;\n\t\tlet hue;\n\t\tconst ε = 0.02;\n\n\t\tif (Math.abs(u) < ε && Math.abs(v) < ε) {\n\t\t\thue = NaN;\n\t\t}\n\t\telse {\n\t\t\thue = Math.atan2(v, u) * 180 / Math.PI;\n\t\t}\n\n\t\treturn [\n\t\t\tL, // L is still L\n\t\t\tMath.sqrt(u ** 2 + v ** 2), // Chroma\n\t\t\tconstrain(hue), // Hue, in degrees [0 to 360)\n\t\t];\n\t},\n\ttoBase (LCH) {\n\t\t// Convert from polar form\n\t\tlet [Lightness, Chroma, Hue] = LCH;\n\t\t// Clamp any negative Chroma\n\t\tif (Chroma < 0) {\n\t\t\tChroma = 0;\n\t\t}\n\t\t// Deal with NaN Hue\n\t\tif (isNaN(Hue)) {\n\t\t\tHue = 0;\n\t\t}\n\t\treturn [\n\t\t\tLightness, // L is still L\n\t\t\tChroma * Math.cos(Hue * Math.PI / 180), // u\n\t\t\tChroma * Math.sin(Hue * Math.PI / 180), // v\n\t\t];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--lchuv\",\n\t\t\tcoords: [\"<number> | <percentage>\", \"<number> | <percentage>\", \"<number> | <angle>\"],\n\t\t},\n\t},\n});\n\n/*\nAdapted from: https://github.com/hsluv/hsluv-javascript/blob/14b49e6cf9a9137916096b8487a5372626b57ba4/src/hsluv.ts\n\nCopyright (c) 2012-2022 Alexei Boronine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\nconst ε$1 = 216 / 24389; // 6^3/29^3 == (24/116)^3\nconst κ = 24389 / 27; // 29^3/3^3\n\nconst m_r0 = fromXYZ_M$3[0][0];\nconst m_r1 = fromXYZ_M$3[0][1];\nconst m_r2 = fromXYZ_M$3[0][2];\nconst m_g0 = fromXYZ_M$3[1][0];\nconst m_g1 = fromXYZ_M$3[1][1];\nconst m_g2 = fromXYZ_M$3[1][2];\nconst m_b0 = fromXYZ_M$3[2][0];\nconst m_b1 = fromXYZ_M$3[2][1];\nconst m_b2 = fromXYZ_M$3[2][2];\n\nfunction distanceFromOriginAngle (slope, intercept, angle) {\n\tconst d = intercept / (Math.sin(angle) - slope * Math.cos(angle));\n\treturn d < 0 ? Infinity : d;\n}\n\nfunction calculateBoundingLines (l) {\n\tconst sub1 = Math.pow(l + 16, 3) / 1560896;\n\tconst sub2 = sub1 > ε$1 ? sub1 : l / κ;\n\tconst s1r = sub2 * (284517 * m_r0 - 94839 * m_r2);\n\tconst s2r = sub2 * (838422 * m_r2 + 769860 * m_r1 + 731718 * m_r0);\n\tconst s3r = sub2 * (632260 * m_r2 - 126452 * m_r1);\n\tconst s1g = sub2 * (284517 * m_g0 - 94839 * m_g2);\n\tconst s2g = sub2 * (838422 * m_g2 + 769860 * m_g1 + 731718 * m_g0);\n\tconst s3g = sub2 * (632260 * m_g2 - 126452 * m_g1);\n\tconst s1b = sub2 * (284517 * m_b0 - 94839 * m_b2);\n\tconst s2b = sub2 * (838422 * m_b2 + 769860 * m_b1 + 731718 * m_b0);\n\tconst s3b = sub2 * (632260 * m_b2 - 126452 * m_b1);\n\n\treturn {\n\t\tr0s: s1r / s3r,\n\t\tr0i: s2r * l / s3r,\n\t\tr1s: s1r / (s3r + 126452),\n\t\tr1i: (s2r - 769860) * l / (s3r + 126452),\n\t\tg0s: s1g / s3g,\n\t\tg0i: s2g * l / s3g,\n\t\tg1s: s1g / (s3g + 126452),\n\t\tg1i: (s2g - 769860) * l / (s3g + 126452),\n\t\tb0s: s1b / s3b,\n\t\tb0i: s2b * l / s3b,\n\t\tb1s: s1b / (s3b + 126452),\n\t\tb1i: (s2b - 769860) * l / (s3b + 126452),\n\t};\n}\n\nfunction calcMaxChromaHsluv (lines, h) {\n\tconst hueRad = h / 360 * Math.PI * 2;\n\tconst r0 = distanceFromOriginAngle(lines.r0s, lines.r0i, hueRad);\n\tconst r1 = distanceFromOriginAngle(lines.r1s, lines.r1i, hueRad);\n\tconst g0 = distanceFromOriginAngle(lines.g0s, lines.g0i, hueRad);\n\tconst g1 = distanceFromOriginAngle(lines.g1s, lines.g1i, hueRad);\n\tconst b0 = distanceFromOriginAngle(lines.b0s, lines.b0i, hueRad);\n\tconst b1 = distanceFromOriginAngle(lines.b1s, lines.b1i, hueRad);\n\n\treturn Math.min(r0, r1, g0, g1, b0, b1);\n}\n\nvar hsluv = new ColorSpace({\n\tid: \"hsluv\",\n\tname: \"HSLuv\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: LCHuv,\n\tgamutSpace: sRGB,\n\n\t// Convert LCHuv to HSLuv\n\tfromBase (lch) {\n\t\tlet [l, c, h] = [skipNone(lch[0]), skipNone(lch[1]), skipNone(lch[2])];\n\t\tlet s;\n\n\t\tif (l > 99.9999999) {\n\t\t\ts = 0;\n\t\t\tl = 100;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\ts = 0;\n\t\t\tl = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHsluv(lines, h);\n\t\t\ts = c / max * 100;\n\t\t}\n\n\t\treturn [h, s, l];\n\t},\n\n\t// Convert HSLuv to LCHuv\n\ttoBase (hsl) {\n\t\tlet [h, s, l] = [skipNone(hsl[0]), skipNone(hsl[1]), skipNone(hsl[2])];\n\t\tlet c;\n\n\t\tif (l > 99.9999999) {\n\t\t\tl = 100;\n\t\t\tc = 0;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\tl = 0;\n\t\t\tc = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHsluv(lines, h);\n\t\t\tc = max / 100 * s;\n\t\t}\n\n\t\treturn [l, c, h];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hsluv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\n/*\nAdapted from: https://github.com/hsluv/hsluv-javascript/blob/14b49e6cf9a9137916096b8487a5372626b57ba4/src/hsluv.ts\n\nCopyright (c) 2012-2022 Alexei Boronine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\nfromXYZ_M$3[0][0];\nfromXYZ_M$3[0][1];\nfromXYZ_M$3[0][2];\nfromXYZ_M$3[1][0];\nfromXYZ_M$3[1][1];\nfromXYZ_M$3[1][2];\nfromXYZ_M$3[2][0];\nfromXYZ_M$3[2][1];\nfromXYZ_M$3[2][2];\n\nfunction distanceFromOrigin (slope, intercept) {\n\treturn Math.abs(intercept) / Math.sqrt(Math.pow(slope, 2) + 1);\n}\n\nfunction calcMaxChromaHpluv (lines) {\n\tlet r0 = distanceFromOrigin(lines.r0s, lines.r0i);\n\tlet r1 = distanceFromOrigin(lines.r1s, lines.r1i);\n\tlet g0 = distanceFromOrigin(lines.g0s, lines.g0i);\n\tlet g1 = distanceFromOrigin(lines.g1s, lines.g1i);\n\tlet b0 = distanceFromOrigin(lines.b0s, lines.b0i);\n\tlet b1 = distanceFromOrigin(lines.b1s, lines.b1i);\n\n\treturn Math.min(r0, r1, g0, g1, b0, b1);\n}\n\nvar hpluv = new ColorSpace({\n\tid: \"hpluv\",\n\tname: \"HPLuv\",\n\tcoords: {\n\t\th: {\n\t\t\trefRange: [0, 360],\n\t\t\ttype: \"angle\",\n\t\t\tname: \"Hue\",\n\t\t},\n\t\ts: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Saturation\",\n\t\t},\n\t\tl: {\n\t\t\trange: [0, 100],\n\t\t\tname: \"Lightness\",\n\t\t},\n\t},\n\n\tbase: LCHuv,\n\tgamutSpace: \"self\",\n\n\t// Convert LCHuv to HPLuv\n\tfromBase (lch) {\n\t\tlet [l, c, h] = [skipNone(lch[0]), skipNone(lch[1]), skipNone(lch[2])];\n\t\tlet s;\n\n\t\tif (l > 99.9999999) {\n\t\t\ts = 0;\n\t\t\tl = 100;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\ts = 0;\n\t\t\tl = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHpluv(lines);\n\t\t\ts = c / max * 100;\n\t\t}\n\t\treturn [h, s, l];\n\t},\n\n\t// Convert HPLuv to LCHuv\n\ttoBase (hsl) {\n\t\tlet [h, s, l] = [skipNone(hsl[0]), skipNone(hsl[1]), skipNone(hsl[2])];\n\t\tlet c;\n\n\t\tif (l > 99.9999999) {\n\t\t\tl = 100;\n\t\t\tc = 0;\n\t\t}\n\t\telse if (l < 0.00000001) {\n\t\t\tl = 0;\n\t\t\tc = 0;\n\t\t}\n\t\telse {\n\t\t\tlet lines = calculateBoundingLines(l);\n\t\t\tlet max = calcMaxChromaHpluv(lines);\n\t\t\tc = max / 100 * s;\n\t\t}\n\n\t\treturn [l, c, h];\n\t},\n\n\tformats: {\n\t\tcolor: {\n\t\t\tid: \"--hpluv\",\n\t\t\tcoords: [\"<number> | <angle>\", \"<percentage> | <number>\", \"<percentage> | <number>\"],\n\t\t},\n\t},\n});\n\nconst Yw = 203;\t// absolute luminance of media white, cd/m²\nconst n = 2610 / (2 ** 14);\nconst ninv = (2 ** 14) / 2610;\nconst m = 2523 / (2 ** 5);\nconst minv = (2 ** 5) / 2523;\nconst c1 = 3424 / (2 ** 12);\nconst c2 = 2413 / (2 ** 7);\nconst c3 = 2392 / (2 ** 7);\n\nvar rec2100Pq = new RGBColorSpace({\n\tid: \"rec2100pq\",\n\tcssId: \"rec2100-pq\",\n\tname: \"REC.2100-PQ\",\n\tbase: REC2020Linear,\n\ttoBase (RGB) {\n\t\t// given PQ encoded component in range [0, 1]\n\t\t// return media-white relative linear-light\n\t\treturn RGB.map(function (val) {\n\t\t\tlet x = ((Math.max(((val ** minv) - c1), 0) / (c2 - (c3 * (val ** minv)))) ** ninv);\n\t\t\treturn (x * 10000 / Yw); \t// luminance relative to diffuse white, [0, 70 or so].\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\t// given media-white relative linear-light\n\t\t// returnPQ encoded component in range [0, 1]\n\t\treturn RGB.map(function (val) {\n\t\t\tlet x = Math.max(val * Yw / 10000, 0); \t// absolute luminance of peak white is 10,000 cd/m².\n\t\t\tlet num = (c1 + (c2 * (x ** n)));\n\t\t\tlet denom = (1 + (c3 * (x ** n)));\n\n\t\t\treturn ((num / denom) ** m);\n\t\t});\n\t},\n});\n\n// FIXME see https://github.com/LeaVerou/color.js/issues/190\n\nconst a = 0.17883277;\nconst b = 0.28466892; // 1 - (4 * a)\nconst c = 0.55991073; // 0.5 - a * Math.log(4 *a)\n\nconst scale = 3.7743;\t// Place 18% grey at HLG 0.38, so media white at 0.75\n\nvar rec2100Hlg = new RGBColorSpace({\n\tid: \"rec2100hlg\",\n\tcssId: \"rec2100-hlg\",\n\tname: \"REC.2100-HLG\",\n\treferred: \"scene\",\n\n\tbase: REC2020Linear,\n\ttoBase (RGB) {\n\t\t// given HLG encoded component in range [0, 1]\n\t\t// return media-white relative linear-light\n\t\treturn RGB.map(function (val) {\n\t\t\t// first the HLG EOTF\n\t\t\t// ITU-R BT.2390-10 p.30 section\n\t\t\t// 6.3 The hybrid log-gamma electro-optical transfer function (EOTF)\n\t\t\t// Then scale by 3 so media white is 1.0\n\t\t\tif (val <= 0.5) {\n\t\t\t\treturn (val ** 2) / 3 * scale;\n\t\t\t}\n\t\t\treturn ((Math.exp((val - c) / a) + b) / 12) * scale;\n\t\t});\n\t},\n\tfromBase (RGB) {\n\t\t// given media-white relative linear-light\n\t\t// where diffuse white is 1.0,\n\t\t// return HLG encoded component in range [0, 1]\n\t\treturn RGB.map(function (val) {\n\t\t\t// first scale to put linear-light media white at 1/3\n\t\t\tval /= scale;\n\t\t\t// now the HLG OETF\n\t\t\t// ITU-R BT.2390-10 p.23\n\t\t\t// 6.1 The hybrid log-gamma opto-electronic transfer function (OETF)\n\t\t\tif (val <= 1 / 12) {\n\t\t\t\treturn Math.sqrt(3 * val);\n\t\t\t}\n\t\t\treturn a * Math.log(12 * val - b) + c;\n\t\t});\n\t},\n});\n\nconst CATs = {};\n\nhooks.add(\"chromatic-adaptation-start\", env => {\n\tif (env.options.method) {\n\t\tenv.M = adapt(env.W1, env.W2, env.options.method);\n\t}\n});\n\nhooks.add(\"chromatic-adaptation-end\", env => {\n\tif (!env.M) {\n\t\tenv.M = adapt(env.W1, env.W2, env.options.method);\n\t}\n});\n\nfunction defineCAT ({id, toCone_M, fromCone_M}) {\n\t// Use id, toCone_M, fromCone_M like variables\n\tCATs[id] = arguments[0];\n}\n\nfunction adapt (W1, W2, id = \"Bradford\") {\n\t// adapt from a source whitepoint or illuminant W1\n\t// to a destination whitepoint or illuminant W2,\n\t// using the given chromatic adaptation transform (CAT)\n\t// debugger;\n\tlet method = CATs[id];\n\n\tlet [ρs, γs, βs] = multiplyMatrices(method.toCone_M, W1);\n\tlet [ρd, γd, βd] = multiplyMatrices(method.toCone_M, W2);\n\n\t// all practical illuminants have non-zero XYZ so no division by zero can occur below\n\tlet scale = [\n\t\t[ρd / ρs, 0, 0 ],\n\t\t[0, γd / γs, 0 ],\n\t\t[0, 0, βd / βs],\n\t];\n\t// console.log({scale});\n\n\tlet scaled_cone_M = multiplyMatrices(scale, method.toCone_M);\n\tlet adapt_M\t= multiplyMatrices(method.fromCone_M, scaled_cone_M);\n\t// console.log({scaled_cone_M, adapt_M});\n\treturn adapt_M;\n}\n\ndefineCAT({\n\tid: \"von Kries\",\n\ttoCone_M: [\n\t\t[ 0.4002400, 0.7076000, -0.0808100 ],\n\t\t[ -0.2263000, 1.1653200, 0.0457000 ],\n\t\t[ 0.0000000, 0.0000000, 0.9182200 ],\n\t],\n\tfromCone_M: [\n\t\t[ 1.8599363874558397, -1.1293816185800916, 0.21989740959619328 ],\n\t\t[ 0.3611914362417676, 0.6388124632850422, -0.000006370596838649899 ],\n\t\t[ 0, 0, 1.0890636230968613 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"Bradford\",\n\t// Convert an array of XYZ values in the range 0.0 - 1.0\n\t// to cone fundamentals\n\ttoCone_M: [\n\t\t[ 0.8951000, 0.2664000, -0.1614000 ],\n\t\t[ -0.7502000, 1.7135000, 0.0367000 ],\n\t\t[ 0.0389000, -0.0685000, 1.0296000 ],\n\t],\n\t// and back\n\tfromCone_M: [\n\t\t[ 0.9869929054667121, -0.14705425642099013, 0.15996265166373122 ],\n\t\t[ 0.4323052697233945, 0.5183602715367774, 0.049291228212855594 ],\n\t\t[ -0.00852866457517732, 0.04004282165408486, 0.96848669578755 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"CAT02\",\n\t// with complete chromatic adaptation to W2, so D = 1.0\n\ttoCone_M: [\n\t\t[ 0.7328000, 0.4296000, -0.1624000 ],\n\t\t[ -0.7036000, 1.6975000, 0.0061000 ],\n\t\t[ 0.0030000, 0.0136000, 0.9834000 ],\n\t],\n\tfromCone_M: [\n\t\t[ 1.0961238208355142, -0.27886900021828726, 0.18274517938277307 ],\n\t\t[ 0.4543690419753592, 0.4735331543074117, 0.07209780371722911 ],\n\t\t[ -0.009627608738429355, -0.00569803121611342, 1.0153256399545427 ],\n\t],\n});\n\ndefineCAT({\n\tid: \"CAT16\",\n\ttoCone_M: [\n\t\t[ 0.401288, 0.650173, -0.051461 ],\n\t\t[ -0.250268, 1.204414, 0.045854 ],\n\t\t[ -0.002079, 0.048952, 0.953127 ],\n\t],\n\t// the extra precision is needed to avoid roundtripping errors\n\tfromCone_M: [\n\t\t[ 1.862067855087233, -1.0112546305316845, 0.14918677544445172 ],\n\t\t[ 0.3875265432361372, 0.6214474419314753, -0.008973985167612521 ],\n\t\t[ -0.01584149884933386, -0.03412293802851557, 1.0499644368778496 ],\n\t],\n});\n\nObject.assign(WHITES, {\n\t// whitepoint values from ASTM E308-01 with 10nm spacing, 1931 2 degree observer\n\t// all normalized to Y (luminance) = 1.00000\n\t// Illuminant A is a tungsten electric light, giving a very warm, orange light.\n\tA: [1.09850, 1.00000, 0.35585],\n\n\t// Illuminant C was an early approximation to daylight: illuminant A with a blue filter.\n\tC: [0.98074, 1.000000, 1.18232],\n\n\t// The daylight series of illuminants simulate natural daylight.\n\t// The color temperature (in degrees Kelvin/100) ranges from\n\t// cool, overcast daylight (D50) to bright, direct sunlight (D65).\n\tD55: [0.95682, 1.00000, 0.92149],\n\tD75: [0.94972, 1.00000, 1.22638],\n\n\t// Equal-energy illuminant, used in two-stage CAT16\n\tE: [1.00000, 1.00000, 1.00000],\n\n\t// The F series of illuminants represent fluorescent lights\n\tF2: [0.99186, 1.00000, 0.67393],\n\tF7: [0.95041, 1.00000, 1.08747],\n\tF11: [1.00962, 1.00000, 0.64350],\n});\n\n// The ACES whitepoint\n// see TB-2018-001 Derivation of the ACES White Point CIE Chromaticity Coordinates\n// also https://github.com/ampas/aces-dev/blob/master/documents/python/TB-2018-001/aces_wp.py\n// Similar to D60\nWHITES.ACES = [0.32168 / 0.33767, 1.00000, (1.00000 - 0.32168 - 0.33767) / 0.33767];\n\n// convert an array of linear-light ACEScc values to CIE XYZ\nconst toXYZ_M = [\n\t[ 0.6624541811085053, 0.13400420645643313, 0.1561876870049078 ],\n\t[ 0.27222871678091454, 0.6740817658111484, 0.05368951740793705 ],\n\t[ -0.005574649490394108, 0.004060733528982826, 1.0103391003129971 ],\n];\nconst fromXYZ_M = [\n\t[ 1.6410233796943257, -0.32480329418479, -0.23642469523761225 ],\n\t[ -0.6636628587229829, 1.6153315916573379, 0.016756347685530137 ],\n\t[ 0.011721894328375376, -0.008284441996237409, 0.9883948585390215 ],\n];\n\nvar ACEScg = new RGBColorSpace({\n\tid: \"acescg\",\n\tcssId: \"--acescg\",\n\tname: \"ACEScg\",\n\n\t// ACEScg – A scene-referred, linear-light encoding of ACES Data\n\t// https://docs.acescentral.com/specifications/acescg/\n\t// uses the AP1 primaries, see section 4.3.1 Color primaries\n\tcoords: {\n\t\tr: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Red\",\n\t\t},\n\t\tg: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Green\",\n\t\t},\n\t\tb: {\n\t\t\trange: [0, 65504],\n\t\t\tname: \"Blue\",\n\t\t},\n\t},\n\n\treferred: \"scene\",\n\n\twhite: WHITES.ACES,\n\n\ttoXYZ_M,\n\tfromXYZ_M,\n});\n\n// export default Color;\n\nconst ε = 2 ** -16;\n\n// the smallest value which, in the 32bit IEEE 754 float encoding,\n// decodes as a non-negative value\nconst ACES_min_nonzero = -0.35828683;\n\n// brightest encoded value, decodes to 65504\nconst ACES_cc_max = (Math.log2(65504) + 9.72) / 17.52; // 1.468\n\nvar acescc = new RGBColorSpace({\n\tid: \"acescc\",\n\tcssId: \"--acescc\",\n\tname: \"ACEScc\",\n\t// see S-2014-003 ACEScc – A Logarithmic Encoding of ACES Data\n\t// https://docs.acescentral.com/specifications/acescc/\n\t// uses the AP1 primaries, see section 4.3.1 Color primaries\n\n\t// Appendix A: \"Very small ACES scene referred values below 7 1/4 stops\n\t// below 18% middle gray are encoded as negative ACEScc values.\n\t// These values should be preserved per the encoding in Section 4.4\n\t// so that all positive ACES values are maintained.\"\n\tcoords: {\n\t\tr: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Red\",\n\t\t},\n\t\tg: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Green\",\n\t\t},\n\t\tb: {\n\t\t\trange: [ACES_min_nonzero, ACES_cc_max],\n\t\t\tname: \"Blue\",\n\t\t},\n\t},\n\treferred: \"scene\",\n\n\tbase: ACEScg,\n\t// from section 4.4.2 Decoding Function\n\ttoBase (RGB) {\n\t\tconst low = (9.72 - 15) / 17.52; // -0.3014\n\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val <= low) {\n\t\t\t\treturn (2 ** ((val * 17.52) - 9.72) - ε) * 2; // very low values, below -0.3014\n\t\t\t}\n\t\t\telse if (val < ACES_cc_max) {\n\t\t\t\treturn 2 ** ((val * 17.52) - 9.72);\n\t\t\t}\n\t\t\telse { // val >= ACES_cc_max\n\t\t\t\treturn 65504;\n\t\t\t}\n\t\t});\n\t},\n\n\t// Non-linear encoding function from S-2014-003, section 4.4.1 Encoding Function\n\tfromBase (RGB) {\n\t\treturn RGB.map(function (val) {\n\t\t\tif (val <= 0) {\n\t\t\t\treturn (Math.log2(ε) + 9.72) / 17.52; // -0.3584\n\t\t\t}\n\t\t\telse if (val < ε) {\n\t\t\t\treturn (Math.log2(ε + val * 0.5) + 9.72) / 17.52;\n\t\t\t}\n\t\t\telse { // val >= ε\n\t\t\t\treturn (Math.log2(val) + 9.72) / 17.52;\n\t\t\t}\n\t\t});\n\t},\n\t// encoded media white (rgb 1,1,1) => linear [ 222.861, 222.861, 222.861 ]\n\t// encoded media black (rgb 0,0,0) => linear [ 0.0011857, 0.0011857, 0.0011857]\n});\n\nvar spaces = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tA98RGB: a98rgb,\n\tA98RGB_Linear: A98Linear,\n\tACEScc: acescc,\n\tACEScg: ACEScg,\n\tCAM16_JMh: cam16,\n\tHCT: hct,\n\tHPLuv: hpluv,\n\tHSL: HSL,\n\tHSLuv: hsluv,\n\tHSV: HSV,\n\tHWB: hwb,\n\tICTCP: ictcp,\n\tJzCzHz: jzczhz,\n\tJzazbz: Jzazbz,\n\tLCH: lch,\n\tLCHuv: LCHuv,\n\tLab: lab,\n\tLab_D65: lab_d65,\n\tLuv: Luv,\n\tOKLCH: oklch,\n\tOKLab: OKLab,\n\tP3: P3,\n\tP3_Linear: P3Linear,\n\tProPhoto: prophoto,\n\tProPhoto_Linear: ProPhotoLinear,\n\tREC_2020: REC2020,\n\tREC_2020_Linear: REC2020Linear,\n\tREC_2100_HLG: rec2100Hlg,\n\tREC_2100_PQ: rec2100Pq,\n\tXYZ_ABS_D65: XYZ_Abs_D65,\n\tXYZ_D50: XYZ_D50,\n\tXYZ_D65: xyz_d65,\n\tsRGB: sRGB,\n\tsRGB_Linear: sRGBLinear\n});\n\n/**\n * Class that represents a color\n */\nclass Color {\n\t/**\n\t * Creates an instance of Color.\n\t * Signatures:\n\t * - `new Color(stringToParse)`\n\t * - `new Color(otherColor)`\n\t * - `new Color({space, coords, alpha})`\n\t * - `new Color(space, coords, alpha)`\n\t * - `new Color(spaceId, coords, alpha)`\n\t */\n\tconstructor (...args) {\n\t\tlet color;\n\n\t\tif (args.length === 1) {\n\t\t\tcolor = getColor(args[0]);\n\t\t}\n\n\t\tlet space, coords, alpha;\n\n\t\tif (color) {\n\t\t\tspace = color.space || color.spaceId;\n\t\t\tcoords = color.coords;\n\t\t\talpha = color.alpha;\n\t\t}\n\t\telse {\n\t\t\t// default signature new Color(ColorSpace, array [, alpha])\n\t\t\t[space, coords, alpha] = args;\n\t\t}\n\n\t\tObject.defineProperty(this, \"space\", {\n\t\t\tvalue: ColorSpace.get(space),\n\t\t\twritable: false,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true, // see note in https://262.ecma-international.org/8.0/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver\n\t\t});\n\n\t\tthis.coords = coords ? coords.slice() : [0, 0, 0];\n\n\t\t// Clamp alpha to [0, 1]\n\t\tthis.alpha = alpha > 1 || alpha === undefined ? 1 : (alpha < 0 ? 0 : alpha);\n\n\t\t// Convert \"NaN\" to NaN\n\t\tfor (let i = 0; i < this.coords.length; i++) {\n\t\t\tif (this.coords[i] === \"NaN\") {\n\t\t\t\tthis.coords[i] = NaN;\n\t\t\t}\n\t\t}\n\n\t\t// Define getters and setters for each coordinate\n\t\tfor (let id in this.space.coords) {\n\t\t\tObject.defineProperty(this, id, {\n\t\t\t\tget: () => this.get(id),\n\t\t\t\tset: value => this.set(id, value),\n\t\t\t});\n\t\t}\n\t}\n\n\tget spaceId () {\n\t\treturn this.space.id;\n\t}\n\n\tclone () {\n\t\treturn new Color(this.space, this.coords, this.alpha);\n\t}\n\n\ttoJSON () {\n\t\treturn {\n\t\t\tspaceId: this.spaceId,\n\t\t\tcoords: this.coords,\n\t\t\talpha: this.alpha,\n\t\t};\n\t}\n\n\tdisplay (...args) {\n\t\tlet ret = display(this, ...args);\n\n\t\t// Convert color object to Color instance\n\t\tret.color = new Color(ret.color);\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Get a color from the argument passed\n\t * Basically gets us the same result as new Color(color) but doesn't clone an existing color object\n\t */\n\tstatic get (color, ...args) {\n\t\tif (color instanceof Color) {\n\t\t\treturn color;\n\t\t}\n\n\t\treturn new Color(color, ...args);\n\t}\n\n\tstatic defineFunction (name, code, o = code) {\n\t\tlet {instance = true, returns} = o;\n\n\t\tlet func = function (...args) {\n\t\t\tlet ret = code(...args);\n\n\t\t\tif (returns === \"color\") {\n\t\t\t\tret = Color.get(ret);\n\t\t\t}\n\t\t\telse if (returns === \"function<color>\") {\n\t\t\t\tlet f = ret;\n\t\t\t\tret = function (...args) {\n\t\t\t\t\tlet ret = f(...args);\n\t\t\t\t\treturn Color.get(ret);\n\t\t\t\t};\n\t\t\t\t// Copy any function metadata\n\t\t\t\tObject.assign(ret, f);\n\t\t\t}\n\t\t\telse if (returns === \"array<color>\") {\n\t\t\t\tret = ret.map(c => Color.get(c));\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t};\n\n\t\tif (!(name in Color)) {\n\t\t\tColor[name] = func;\n\t\t}\n\n\t\tif (instance) {\n\t\t\tColor.prototype[name] = function (...args) {\n\t\t\t\treturn func(this, ...args);\n\t\t\t};\n\t\t}\n\t}\n\n\tstatic defineFunctions (o) {\n\t\tfor (let name in o) {\n\t\t\tColor.defineFunction(name, o[name], o[name]);\n\t\t}\n\t}\n\n\tstatic extend (exports) {\n\t\tif (exports.register) {\n\t\t\texports.register(Color);\n\t\t}\n\t\telse {\n\t\t\t// No register method, just add the module's functions\n\t\t\tfor (let name in exports) {\n\t\t\t\tColor.defineFunction(name, exports[name]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nColor.defineFunctions({\n\tget,\n\tgetAll,\n\tset,\n\tsetAll,\n\tto,\n\tequals,\n\tinGamut,\n\ttoGamut,\n\tdistance,\n\ttoString: serialize,\n});\n\nObject.assign(Color, {\n\tutil,\n\thooks,\n\tWHITES,\n\tSpace: ColorSpace,\n\tspaces: ColorSpace.registry,\n\tparse,\n\n\t// Global defaults one may want to configure\n\tdefaults,\n});\n\nfor (let key of Object.keys(spaces)) {\n\tColorSpace.register(spaces[key]);\n}\n\n/**\n * This plugin defines getters and setters for color[spaceId]\n * e.g. color.lch on *any* color gives us the lch coords\n */\n\n// Add space accessors to existing color spaces\nfor (let id in ColorSpace.registry) {\n\taddSpaceAccessors(id, ColorSpace.registry[id]);\n}\n\n// Add space accessors to color spaces not yet created\nhooks.add(\"colorspace-init-end\", space => {\n\taddSpaceAccessors(space.id, space);\n\tspace.aliases?.forEach(alias => {\n\t\taddSpaceAccessors(alias, space);\n\t});\n});\n\nfunction addSpaceAccessors (id, space) {\n\tlet propId = id.replace(/-/g, \"_\");\n\n\tObject.defineProperty(Color.prototype, propId, {\n\t\t// Convert coords to coords in another colorspace and return them\n\t\t// Source colorspace: this.spaceId\n\t\t// Target colorspace: id\n\t\tget () {\n\t\t\tlet ret = this.getAll(id);\n\n\t\t\tif (typeof Proxy === \"undefined\") {\n\t\t\t\t// If proxies are not supported, just return a static array\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Enable color.spaceId.coordName syntax\n\t\t\treturn new Proxy(ret, {\n\t\t\t\thas: (obj, property) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tColorSpace.resolveCoord([space, property]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {}\n\n\t\t\t\t\treturn Reflect.has(obj, property);\n\t\t\t\t},\n\t\t\t\tget: (obj, property, receiver) => {\n\t\t\t\t\tif (property && typeof property !== \"symbol\" && !(property in obj)) {\n\t\t\t\t\t\tlet {index} = ColorSpace.resolveCoord([space, property]);\n\n\t\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\t\treturn obj[index];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Reflect.get(obj, property, receiver);\n\t\t\t\t},\n\t\t\t\tset: (obj, property, value, receiver) => {\n\t\t\t\t\tif (property && typeof property !== \"symbol\" && !(property in obj) || property >= 0) {\n\t\t\t\t\t\tlet {index} = ColorSpace.resolveCoord([space, property]);\n\n\t\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\t\tobj[index] = value;\n\n\t\t\t\t\t\t\t// Update color.coords\n\t\t\t\t\t\t\tthis.setAll(id, obj);\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Reflect.set(obj, property, value, receiver);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t// Convert coords in another colorspace to internal coords and set them\n\t\t// Target colorspace: this.spaceId\n\t\t// Source colorspace: id\n\t\tset (coords) {\n\t\t\tthis.setAll(id, coords);\n\t\t},\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t});\n}\n\n// Import all modules of Color.js\n\nColor.extend(deltaEMethods);\nColor.extend({deltaE});\nObject.assign(Color, {deltaEMethods});\nColor.extend(variations);\nColor.extend({contrast});\nColor.extend(chromaticity);\nColor.extend(luminance);\nColor.extend(interpolation);\nColor.extend(contrastMethods);\n\nexport { Color as default };\n//# sourceMappingURL=color.js.map\n","import type Color from \"colorjs.io\";\n\n// Semantic color names - matches portal-widgets tailwind.config.ts and field-types.ts\nexport const SEMANTIC_COLOR_NAMES = [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n] as const;\nexport type SemanticColorName = (typeof SEMANTIC_COLOR_NAMES)[number];\n\nexport const SHADE_STEPS = [\n 100, 200, 300, 400, 500, 600, 700, 800, 900,\n] as const;\nexport type ShadeStep = (typeof SHADE_STEPS)[number];\n\nexport const FONT_SIZE_KEYS = [\n \"extraSmall\",\n \"small\",\n \"regular\",\n \"large\",\n \"extraLarge\",\n \"giant\",\n] as const;\nexport type FontSizeKey = (typeof FONT_SIZE_KEYS)[number];\n\nexport const FONT_FAMILY_KEYS = [\"header\", \"body\"] as const;\nexport type FontFamilyKey = (typeof FONT_FAMILY_KEYS)[number];\n\nexport const RADIUS_KEYS = [\"small\", \"medium\", \"large\", \"extraLarge\"] as const;\nexport type RadiusKey = (typeof RADIUS_KEYS)[number];\n\n/** Author-time color input (what the user configures) */\nexport interface ThemeColorInput {\n base: Color;\n foreground: Color;\n}\n\n/** Complete theme definition — stored in-memory with Color objects */\nexport interface ThemeDefinition {\n id: string;\n name: string;\n /** Light mode — always fully specified */\n light: Record<SemanticColorName, ThemeColorInput>;\n /**\n * Dark mode — only user-overridden colors.\n * Missing keys are auto-derived from `light` at resolve time.\n */\n dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>>;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n /** When true, theme colors are re-derived from brand guidelines on every load */\n syncWithBrandColors?: boolean;\n}\n\n/** Resolved semantic color with generated shade ramp */\nexport interface ResolvedSemanticColor {\n base: Color;\n foreground: Color;\n shades: Record<ShadeStep, Color>;\n}\n\n/** Complete resolved color set for one mode */\nexport type ResolvedColorSet = Record<SemanticColorName, ResolvedSemanticColor>;\n\n/** Fully resolved theme — all colors materialised for both modes */\nexport interface ResolvedTheme {\n id: string;\n name: string;\n light: ResolvedColorSet;\n dark: ResolvedColorSet;\n fontSizes: ThemeDefinition[\"fontSizes\"];\n fontFamilies: ThemeDefinition[\"fontFamilies\"];\n spacing: string;\n radii: ThemeDefinition[\"radii\"];\n}\n\n/** Plain OKLCH triplet for JSON serialisation (no Color dependency) */\nexport interface OklchPlain {\n l: number;\n c: number;\n h: number;\n}\n\n/** Serialised color pair as stored in the backend payload */\nexport interface ThemeColorPlain {\n base: OklchPlain;\n foreground: OklchPlain;\n}\n\n/** Backend payload — plain JSON, no Color objects */\nexport interface ThemePayload {\n [key: string]: unknown;\n id: string;\n name: string;\n light: Record<SemanticColorName, ThemeColorPlain>;\n dark: Partial<\n Record<SemanticColorName, { base?: OklchPlain; foreground?: OklchPlain }>\n >;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n syncWithBrandColors?: boolean;\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n type SemanticColorName,\n type ShadeStep,\n type ThemeColorInput,\n type ThemeDefinition,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\n/**\n * Attempt to convert any string into a Color using colorjs.io.\n * If the string is exactly 6 characters it is assumed to be a bare hex value\n * (e.g. \"3b82f6\") and a \"#\" prefix is added before parsing.\n *\n * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure\n */\nexport function parseColor(value: string): Color {\n if (value.length === 6) {\n value = `#${value}`;\n }\n try {\n return new Color(value);\n } catch (error) {\n console.warn(\"[theme] Failed to parse color:\", value, error);\n return new Color(\"oklch\", [0.5, 0, 0]);\n }\n}\n\n/**\n * Returns either the original foreground or a corrected lightness variant,\n * whichever provides better contrast against `color`.\n * Inversion triggers when the APCA contrast is below 50.\n */\nexport function getForegroundColor(foreground: Color, color: Color): Color {\n if (foreground.oklch.l == null || color.oklch.l == null) {\n return foreground;\n }\n const contrast = color.contrastAPCA(foreground);\n\n if (contrast < 50) {\n return new Color(\"oklch\", [\n color.oklch.l < 0.7 ? 0.95 : 0.15,\n foreground.oklch.c || 0,\n foreground.oklch.h || 0,\n ]);\n }\n return foreground;\n}\n\n/**\n * Generate a 100–900 shade ramp from a base color.\n * Base anchors at 500. Light shades (100–400) step toward white,\n * dark shades (600–900) step toward black. Dark steps use an asymmetric\n * multiplier (1.6×, 1.875×, 3×, 4× of `darkStep`) for a more gradual\n * initial descent. Chroma is nudged per step for perceptually natural ramps.\n */\nexport function generateShades(base: Color): Record<ShadeStep, Color> {\n const l = base.oklch.l ?? 0;\n const c = base.oklch.c ?? 0;\n const h = base.oklch.h ?? 0;\n\n const safeMax = l >= 0.885 ? 0.995 : 0.97;\n const safeMin = l <= 0.33 ? 0 : 0.21;\n\n const lightStep = (safeMax - l) / 5;\n const darkStep = -(l - safeMin) / 8;\n\n const shade = (lDelta: number, cDelta: number): Color => {\n return new Color(\"oklch\", [\n Math.max(0, Math.min(1, l + lDelta)),\n c <= 0.001 ? c : Math.max(0, c + cDelta),\n h,\n ]);\n };\n\n return {\n 100: shade(5 * lightStep, -0.00375),\n 200: shade(4 * lightStep, -0.00375),\n 300: shade(3 * lightStep, -0.00375),\n 400: shade(2 * lightStep, -0.00375),\n 500: new Color(\"oklch\", [l, c, h]),\n 600: shade(1.6 * darkStep, 0.025),\n 700: shade(1.875 * 2 * darkStep, 0.05),\n 800: shade(3 * 2 * darkStep, 0.075),\n 900: shade(4 * 2 * darkStep, 0.1),\n };\n}\n\n// ── Dark Mode Derivation ────────────────────────────────────────────\n//\n// Dark-mode colors are derived from their light counterparts by adjusting\n// OKLCH lightness and optionally scaling chroma. Neutral slots (background,\n// foreground, muted) use fixed lightness values while chromatic slots\n// (primary, secondary, accent, destructive) invert lightness around 0.5.\n\nconst DARK_DERIVATION_CONFIG: Record<\n SemanticColorName,\n {\n baseLightness: number | \"invert\";\n fgLightness: number | \"invert\";\n chromaScale?: number;\n }\n> = {\n background: { baseLightness: 0.15, fgLightness: 0.93 },\n foreground: { baseLightness: 0.93, fgLightness: 0.15 },\n muted: { baseLightness: 0.22, fgLightness: 0.75 },\n primary: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n secondary: { baseLightness: \"invert\", fgLightness: 0.93, chromaScale: 0.85 },\n accent: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n destructive: {\n baseLightness: \"invert\",\n fgLightness: 0.95,\n chromaScale: 0.95,\n },\n};\n\n/** Invert OKLCH lightness (1 - l), clamped to [0.35, 0.75] to avoid extremes. */\nfunction invertLightness(l: number): number {\n const inverted = 1 - l;\n return Math.max(0.35, Math.min(0.75, inverted));\n}\n\n/**\n * Derive a dark-mode ThemeColorInput from its light-mode counterpart.\n */\nexport function deriveDarkVariant(\n name: SemanticColorName,\n light: ThemeColorInput,\n): ThemeColorInput {\n const config = DARK_DERIVATION_CONFIG[name];\n const chromaScale = config.chromaScale ?? 1;\n\n const baseLightness =\n config.baseLightness === \"invert\"\n ? invertLightness(light.base.oklch.l ?? 0)\n : config.baseLightness;\n\n const fgLightness =\n config.fgLightness === \"invert\"\n ? invertLightness(light.foreground.oklch.l ?? 0)\n : config.fgLightness;\n\n return {\n base: new Color(\"oklch\", [\n baseLightness,\n (light.base.oklch.c || 0) * chromaScale,\n light.base.oklch.h || 0,\n ]),\n foreground: new Color(\"oklch\", [\n fgLightness,\n (light.foreground.oklch.c || 0) * chromaScale,\n light.foreground.oklch.h || 0,\n ]),\n };\n}\n\n// ── Dark Mode Merge ─────────────────────────────────────────────────\n\n/**\n * Merge auto-derived dark colors with any user-specified overrides.\n * For each semantic color, if the user has fully overridden both base and\n * foreground those are used; otherwise the missing channels are derived.\n */\nexport function mergeDarkOverrides(\n def: ThemeDefinition,\n): Record<SemanticColorName, ThemeColorInput> {\n const darkColors = {} as Record<SemanticColorName, ThemeColorInput>;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const lightInput = def.light[name];\n const darkOverride = def.dark[name];\n\n if (darkOverride?.base && darkOverride?.foreground) {\n darkColors[name] = darkOverride as ThemeColorInput;\n } else if (darkOverride) {\n const base =\n darkOverride.base ?? deriveDarkVariant(name, lightInput).base;\n darkColors[name] = {\n base: base,\n foreground:\n darkOverride.foreground ??\n getForegroundColor(def.light.foreground.base, base),\n };\n } else {\n darkColors[name] = deriveDarkVariant(name, lightInput);\n }\n }\n\n return darkColors;\n}\n\n// ── Theme Resolution ────────────────────────────────────────────────\n\nfunction resolveColorSet(\n colors: Record<SemanticColorName, ThemeColorInput>,\n): ResolvedColorSet {\n const resolved = {} as ResolvedColorSet;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const input = colors[name];\n const shades = generateShades(input.base);\n const resolvedShades = {} as Record<ShadeStep, Color>;\n\n for (const step of SHADE_STEPS) {\n resolvedShades[step] = shades[step];\n }\n\n resolved[name] = {\n base: input.base.clone(),\n foreground: input.foreground.clone(),\n shades: resolvedShades,\n };\n }\n\n return resolved;\n}\n\n/**\n * Resolve a ThemeDefinition into a complete ResolvedTheme.\n * Dark mode colors are derived from light where not overridden.\n */\nexport function resolveTheme(def: ThemeDefinition): ResolvedTheme {\n return {\n id: def.id,\n name: def.name,\n light: resolveColorSet(def.light),\n dark: resolveColorSet(mergeDarkOverrides(def)),\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n };\n}\n","import { SHADE_STEPS, type SemanticColorName, type ShadeStep } from \"./types\";\n\n/**\n * Specific overrides, otherwise all the overrides are generated using emitTailwindOverrides\n */\nconst OVERRIDES: Partial<Record<string, string>> = {\n \"--color-gray-50\": \"var(--color-muted)\",\n \"--color-gray-100\": \"var(--color-muted-600)\",\n \"--color-gray-200\": \"var(--color-border)\",\n} as const;\n\n/**\n * Returns the inverted shade for dark mode foreground colors.\n * In dark mode, light shades (50, 100) should map to dark values (950, 900) and vice versa.\n */\nfunction getInvertedStep(shade: ShadeStep): ShadeStep {\n const shadeIndex = SHADE_STEPS.indexOf(shade);\n const invertedIndex = SHADE_STEPS.length - 1 - shadeIndex;\n return SHADE_STEPS[invertedIndex] || 500;\n}\n\n/**\n * Map semantic colors to Tailwind built-in color names.\n */\nexport function emitTailwindOverrides(darkMode: boolean = false): string[] {\n const TAILWIND_COLOR_MAP: Record<string, SemanticColorName> = {\n gray: \"foreground\",\n red: \"destructive\",\n blue: \"primary\",\n green: \"accent\",\n };\n\n const TAILWIND_SHADES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n ] as const;\n const SHADE_REMAP: Partial<Record<number, ShadeStep>> = {\n 50: 100,\n 950: 900,\n };\n\n const lines: string[] = [];\n for (const [twName, semantic] of Object.entries(TAILWIND_COLOR_MAP)) {\n for (const shade of TAILWIND_SHADES) {\n const step = (SHADE_REMAP[shade] ?? shade) as ShadeStep;\n const override = OVERRIDES[`--color-${twName}-${shade}`];\n lines.push(\n `--color-${twName}-${shade}: ${override ? override : `var(--color-${semantic}-${semantic === \"foreground\" && darkMode === true ? getInvertedStep(step) : step})`};`,\n );\n }\n }\n\n lines.push(\"--color-white: var(--color-background);\");\n lines.push(\"--color-black: var(--color-foreground);\");\n\n return lines;\n}\n","import { emitTailwindOverrides } from \"./tailwind-overrides\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n FONT_SIZE_KEYS,\n FONT_FAMILY_KEYS,\n RADIUS_KEYS,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\nfunction colorToCSS(color: import(\"colorjs.io\").default): string {\n const result = color.toString({ format: \"oklch\" });\n if (result.includes(\"NaN\")) {\n console.warn(\n \"[theme] colorToCSS produced NaN, using neutral fallback:\",\n result,\n );\n return \"oklch(0.5 0 0)\";\n }\n return result;\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Emit --color-{name}, --color-{name}-foreground, --color-{name}-{shade} vars.\n * Uses --color- prefix to match portal-widgets/tailwind.config.ts.\n */\nfunction emitColorVars(colors: ResolvedColorSet): string[] {\n const lines: string[] = [];\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const color = colors[name];\n lines.push(`--color-${name}: ${colorToCSS(color.base)};`);\n lines.push(`--color-${name}-foreground: ${colorToCSS(color.foreground)};`);\n for (const step of SHADE_STEPS) {\n lines.push(`--color-${name}-${step}: ${colorToCSS(color.shades[step])};`);\n }\n }\n\n return lines;\n}\n\n/**\n * Emit non-color CSS variables (font sizes, families, spacing, radii).\n */\nfunction emitNonColorVars(theme: ResolvedTheme): string[] {\n const lines: string[] = [];\n for (const key of FONT_SIZE_KEYS) {\n lines.push(`--font-size-${camelToKebab(key)}: ${theme.fontSizes[key]};`);\n }\n for (const key of FONT_FAMILY_KEYS) {\n lines.push(`--font-${key}: ${theme.fontFamilies[key]};`);\n }\n lines.push(`--spacing: ${theme.spacing};`);\n for (const key of RADIUS_KEYS) {\n lines.push(`--radius-${camelToKebab(key)}: ${theme.radii[key]};`);\n }\n return lines;\n}\n\n/**\n * Static CSS alias variables that bridge theme var names to Tailwind/component conventions.\n * These are always emitted and not mode-dependent.\n */\nconst globalCSSOverride = [\n \"--color-background-foreground: var(--color-foreground);\",\n \"--color-foreground-foreground: var(--color-background);\",\n \"--color-contrast: var(--color-foreground);\",\n ...SEMANTIC_COLOR_NAMES.map((value) => `--${value}: var(--color-${value});`),\n ...SEMANTIC_COLOR_NAMES.map(\n (value) => `--${value}-foreground: var(--color-${value}-foreground);`,\n ),\n\n \"--sidebar-ring: var(--color-primary);\",\n \"--sidebar-border: var(--color-border);\",\n \"--sidebar-accent-foreground: var(--color-accent-foreground);\",\n \"--sidebar-accent: var(--color-accent);\",\n \"--sidebar-primary-foreground: var(--color-primary-foreground);\",\n \"--sidebar-primary: var(--color-primary);\",\n \"--sidebar-foreground: var(--color-muted-foreground);\",\n \"--sidebar: var(--color-muted);\",\n \"--border: var(--color-background-600);\",\n \"--ring: var(--color-primary);\",\n \"--popover: var(--color-background);\",\n \"--popover-foreground: var(--color-foreground);\",\n \"--card: var(--color-muted);\",\n \"--card-foreground: var(--color-muted-foreground);\",\n\n \"--radius-sm: var(--radius-small);\",\n \"--radius-md: var(--radius-medium);\",\n \"--radius-lg: var(--radius-large);\",\n \"--radius-xl: var(--radius-extra-large);\",\n \"--text-xs: var(--font-size-extra-small);\",\n \"--text-sm: var(--font-size-small);\",\n \"--text-base: var(--font-size-regular);\",\n \"--text-lg: var(--font-size-large);\",\n \"--text-xl: var(--font-size-extra-large);\",\n \"--text-2xl: var(--font-size-giant);\",\n \"--font-sans: var(--font-body);\",\n // Tailwind's font-mono is repurposed as the display/header font\n \"--font-mono: var(--font-header);\",\n];\n\n/**\n * Overrides for global tailwindcss for specifically dark mode.\n */\nconst globalDarkCSSOverride = [\"--border: var(--color-background-400);\"];\n\nexport interface GenerateThemeCSSOptions {\n /** Whether or not to allow prefers-color-scheme to choose the theme mode */\n disableAutoTheme?: boolean;\n /** Whether to emit Tailwind built-in color overrides (default true) */\n mapTailwindColors?: boolean;\n}\n\n/**\n * Generate a complete CSS string for a resolved theme.\n * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode=\"dark\"]`,\n * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.\n */\nexport function generateThemeCSS(\n theme: ResolvedTheme,\n options: GenerateThemeCSSOptions = {},\n): string {\n const sel = `[data-theme=\"${theme.id}\"]`;\n const tw = options.mapTailwindColors ?? true;\n const blocks: string[] = [];\n\n // Light mode (default)\n blocks.push(`${sel} {`);\n blocks.push(...globalCSSOverride);\n blocks.push(...emitNonColorVars(theme));\n blocks.push(...emitColorVars(theme.light));\n if (tw) blocks.push(...emitTailwindOverrides());\n blocks.push(`}`);\n\n // Dark mode: explicit via attribute\n blocks.push(`${sel}[data-theme-mode=\"dark\"] {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark));\n if (tw) blocks.push(...emitTailwindOverrides(true));\n blocks.push(`}`);\n\n // Dark mode: auto via system preference\n if (!options.disableAutoTheme) {\n blocks.push(`@media (prefers-color-scheme: dark) {`);\n blocks.push(`${sel}:not([data-theme-mode]) {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark).map((l) => `${l}`));\n if (tw) blocks.push(...emitTailwindOverrides(true).map((l) => `${l}`));\n blocks.push(`}`);\n blocks.push(`}`);\n }\n\n return blocks.join(\"\\n\");\n}\n","import Color from \"colorjs.io\";\nimport type {\n FontSizeKey,\n FontFamilyKey,\n RadiusKey,\n ThemeDefinition,\n} from \"./types\";\nimport { getForegroundColor } from \"./color-engine\";\n\n// ── Non-color defaults ──────────────────────────────────────────────\n\nexport const DEFAULT_FONT_SIZES: Record<FontSizeKey, string> = {\n extraSmall: \"0.75rem\",\n small: \"0.875rem\",\n regular: \"1rem\",\n large: \"1.125rem\",\n extraLarge: \"1.25rem\",\n giant: \"1.5rem\",\n};\n\nexport const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string> = {\n header: \"var(--font-inter)\",\n body: \"var(--font-inter)\",\n};\n\nexport const DEFAULT_SPACING = \"0.25rem\";\n\nexport const DEFAULT_RADII: Record<RadiusKey, string> = {\n small: \"0.25rem\",\n medium: \"0.5rem\",\n large: \"0.75rem\",\n extraLarge: \"1rem\",\n};\n\n// ── Default colors (hex) ────────────────────────────────────────────\n\nexport const DEFAULT_COLORS = {\n background: \"#ffffff\",\n foreground: \"#1a1a1a\",\n primary: \"#3b82f6\",\n secondary: \"#6b7280\",\n accent: \"#10b981\",\n muted: \"#f3f4f6\",\n destructive: \"#ef4444\",\n mutedForeground: \"#6b7280\",\n} as const;\n\n// ── Default theme identity ──────────────────────────────────────────\n\nexport const DEFAULT_THEME_ID = \"default\";\nexport const DEFAULT_THEME_NAME = \"Default Theme\";\n\n// ── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Build a fresh ThemeDefinition populated with all defaults.\n * Returns a new object each call because Color instances are mutable — do not cache the result.\n */\nexport function getDefaultThemeDefinition(): ThemeDefinition {\n const bg = new Color(DEFAULT_COLORS.background);\n const fg = new Color(DEFAULT_COLORS.foreground);\n const primary = new Color(DEFAULT_COLORS.primary);\n const secondary = new Color(DEFAULT_COLORS.secondary);\n const accent = new Color(DEFAULT_COLORS.accent);\n const muted = new Color(DEFAULT_COLORS.muted);\n const destructive = new Color(DEFAULT_COLORS.destructive);\n const mutedFg = new Color(DEFAULT_COLORS.mutedForeground);\n\n const darkBg = new Color(\"#0a0a0a\");\n const darkFg = new Color(\"#fafafa\");\n const darkMuted = new Color(\"#171717\");\n const darkMutedForeground = new Color(\"#dddddd\");\n\n return {\n id: DEFAULT_THEME_ID,\n name: DEFAULT_THEME_NAME,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {\n background: { base: darkBg, foreground: darkFg },\n foreground: { base: darkFg, foreground: darkBg },\n muted: { base: darkMuted, foreground: darkMutedForeground },\n },\n fontSizes: { ...DEFAULT_FONT_SIZES },\n fontFamilies: { ...DEFAULT_FONT_FAMILIES },\n spacing: DEFAULT_SPACING,\n radii: { ...DEFAULT_RADII },\n };\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n type SemanticColorName,\n type ThemeColorInput,\n type ThemeDefinition,\n type ThemePayload,\n type OklchPlain,\n type FontSizeKey,\n type FontFamilyKey,\n type RadiusKey,\n} from \"./types\";\nimport {\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n getDefaultThemeDefinition,\n} from \"./defaults\";\n\nfunction colorToPlain(color: Color): OklchPlain {\n return {\n l: color.oklch.l ?? 0,\n c: color.oklch.c ?? 0,\n h: color.oklch.h ?? 0,\n };\n}\n\nfunction plainToColor(plain: OklchPlain): Color {\n return new Color(\"oklch\", [plain.l, plain.c, plain.h]);\n}\n\n/**\n * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload\n * suitable for backend storage.\n */\nexport function serialiseTheme(def: ThemeDefinition): ThemePayload {\n const light = {} as ThemePayload[\"light\"];\n for (const name of SEMANTIC_COLOR_NAMES) {\n light[name] = {\n base: colorToPlain(def.light[name].base),\n foreground: colorToPlain(def.light[name].foreground),\n };\n }\n\n const dark: ThemePayload[\"dark\"] = {};\n for (const [name, value] of Object.entries(def.dark)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: colorToPlain(value.base) } : {}),\n ...(value.foreground\n ? { foreground: colorToPlain(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: def.id,\n name: def.name,\n light,\n dark,\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n ...(def.syncWithBrandColors ? { syncWithBrandColors: true } : {}),\n };\n}\n\n/**\n * Deserialise a backend payload into a ThemeDefinition with Color objects.\n * Accepts `Record<string, unknown>` because API data is untyped at the boundary.\n * Falls back to default colors for any missing light-mode entries.\n */\nexport function deserialiseTheme(\n payload: Record<string, unknown>,\n): ThemeDefinition {\n const lightRaw = ((payload.light as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base: OklchPlain; foreground: OklchPlain }>;\n const darkRaw = ((payload.dark as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base?: OklchPlain; foreground?: OklchPlain }>;\n\n const defaults = getDefaultThemeDefinition();\n const light = {} as Record<SemanticColorName, ThemeColorInput>;\n for (const name of SEMANTIC_COLOR_NAMES) {\n const entry = lightRaw[name];\n if (entry) {\n light[name] = {\n base: plainToColor(entry.base),\n foreground: plainToColor(entry.foreground),\n };\n } else {\n console.warn(\n `[theme] deserialiseTheme: missing light color \"${name}\", using default`,\n );\n light[name] = defaults.light[name];\n }\n }\n\n const dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>> = {};\n for (const [name, value] of Object.entries(darkRaw)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: plainToColor(value.base) } : {}),\n ...(value.foreground\n ? { foreground: plainToColor(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: payload.id as string,\n name: payload.name as string,\n light,\n dark,\n fontSizes: (payload.fontSizes ?? DEFAULT_FONT_SIZES) as Record<\n FontSizeKey,\n string\n >,\n fontFamilies: (payload.fontFamilies ?? DEFAULT_FONT_FAMILIES) as Record<\n FontFamilyKey,\n string\n >,\n spacing: (payload.spacing as string) ?? DEFAULT_SPACING,\n radii: (payload.radii ?? DEFAULT_RADII) as Record<RadiusKey, string>,\n ...(payload.syncWithBrandColors === true\n ? { syncWithBrandColors: true }\n : {}),\n };\n}\n","/**\n * Theme Transforms\n * Convert raw API theme objects to ThemeDefinition format.\n * Handles both new structured format (OKLCH) and legacy flat format (hex strings).\n */\n\nimport type { ThemeDefinition } from \"./types\";\nimport { deserialiseTheme } from \"./serialisation\";\nimport { parseColor, getForegroundColor } from \"./color-engine\";\nimport {\n DEFAULT_COLORS,\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n} from \"./defaults\";\n\n/** Shape of a raw theme from the FluidOS API */\nexport interface RawApiTheme {\n id: number;\n config?: Record<string, unknown> | null;\n active?: boolean | null;\n name?: string | null;\n}\n\n/**\n * Check if a theme config uses the new structured format (has a `light` key\n * that is an object) vs the legacy flat format.\n */\nfunction isNewThemeFormat(config: Record<string, unknown>): boolean {\n return config.light != null && typeof config.light === \"object\";\n}\n\n/**\n * Convert a legacy flat config to a ThemeDefinition.\n * Legacy format: { base: \"#fff\", text: \"#000\", primary: \"oklch(0.6 0.2 250)\", ... }\n */\nfunction legacyConfigToDefinition(\n id: number,\n name: string,\n config: Record<string, string>,\n): ThemeDefinition {\n const bg = parseColor(\n config.base ?? config.background ?? DEFAULT_COLORS.background,\n );\n const fg = parseColor(\n config.text ?? config.foreground ?? DEFAULT_COLORS.foreground,\n );\n const primary = parseColor(config.primary ?? DEFAULT_COLORS.primary);\n const secondary = parseColor(config.secondary ?? DEFAULT_COLORS.secondary);\n const accent = parseColor(config.accent ?? DEFAULT_COLORS.accent);\n const muted = parseColor(config.muted ?? DEFAULT_COLORS.muted);\n const destructive = parseColor(\n config.destructive ?? DEFAULT_COLORS.destructive,\n );\n const mutedFg = parseColor(\n config.mutedForeground ?? DEFAULT_COLORS.mutedForeground,\n );\n\n return {\n id: String(id),\n name,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {},\n fontSizes: {\n extraSmall: config.extraSmall ?? DEFAULT_FONT_SIZES.extraSmall,\n small: config.small ?? DEFAULT_FONT_SIZES.small,\n regular: config.regular ?? DEFAULT_FONT_SIZES.regular,\n large: config.large ?? DEFAULT_FONT_SIZES.large,\n extraLarge: config.extraLarge ?? DEFAULT_FONT_SIZES.extraLarge,\n giant: config.giant ?? DEFAULT_FONT_SIZES.giant,\n },\n fontFamilies: {\n header: config.headerFont ?? DEFAULT_FONT_FAMILIES.header,\n body: config.bodyFont ?? DEFAULT_FONT_FAMILIES.body,\n },\n spacing: config.globalSpacing ?? DEFAULT_SPACING,\n radii: {\n small: config.radiusSmall ?? DEFAULT_RADII.small,\n medium: config.radiusMedium ?? DEFAULT_RADII.medium,\n large: config.radiusLarge ?? DEFAULT_RADII.large,\n extraLarge: config.radiusExtraLarge ?? DEFAULT_RADII.extraLarge,\n },\n };\n}\n\n/**\n * Build a ThemeDefinition from a single API theme object.\n * Handles both new structured format and legacy flat format.\n */\nexport function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition {\n const config = (theme.config ?? {}) as Record<string, unknown>;\n\n if (isNewThemeFormat(config)) {\n return deserialiseTheme({\n ...config,\n id: String(theme.id),\n name: theme.name ?? \"Untitled Theme\",\n });\n }\n\n return legacyConfigToDefinition(\n theme.id,\n theme.name ?? \"Untitled Theme\",\n config as Record<string, string>,\n );\n}\n\n/**\n * Transform raw API themes to ThemeDefinition[].\n * Catches and logs errors per theme (graceful degradation).\n */\nexport function transformThemes(themes: RawApiTheme[]): ThemeDefinition[] {\n return themes.flatMap((theme) => {\n try {\n return [buildThemeDefinition(theme)];\n } catch (error) {\n console.error(`[theme] Failed to build theme id=${theme.id}:`, error);\n return [];\n }\n });\n}\n\n/**\n * Get the active theme ID from a list of raw API themes.\n * Falls back to the first theme if none is marked active.\n */\nexport function getActiveThemeId(themes: RawApiTheme[]): string | undefined {\n const active = themes.find((t) => t.active) ?? themes[0];\n return active ? String(active.id) : undefined;\n}\n","import { generateThemeCSS } from \"./css-generator\";\nimport type { ResolvedTheme } from \"./types\";\nimport type { GenerateThemeCSSOptions } from \"./css-generator\";\n\nconst STYLE_PREFIX = \"theme-style-\";\n\n/**\n * Inject or update a `<style>` element in `<head>` for the given theme.\n * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls\n * for the same theme are idempotent — the existing element is updated in place.\n * No-op when `document` is unavailable (SSR).\n */\nexport function applyTheme(\n theme: ResolvedTheme,\n options?: GenerateThemeCSSOptions,\n): void {\n if (typeof document === \"undefined\") return;\n\n try {\n const styleId = `${STYLE_PREFIX}${theme.id}`;\n let el = document.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!el) {\n el = document.createElement(\"style\");\n el.id = styleId;\n document.head.appendChild(el);\n }\n\n el.textContent = generateThemeCSS(theme, options);\n } catch (error) {\n console.error(`[theme] applyTheme failed for \"${theme.id}\":`, error);\n }\n}\n\n/** Remove an injected theme stylesheet. No-op during SSR. */\nexport function removeTheme(themeId: string): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(`${STYLE_PREFIX}${themeId}`)?.remove();\n}\n\n/** Remove all injected theme stylesheets. No-op during SSR. */\nexport function removeAllThemes(): void {\n if (typeof document === \"undefined\") return;\n document\n .querySelectorAll(`style[id^=\"${STYLE_PREFIX}\"]`)\n .forEach((el) => el.remove());\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/portal-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/portal-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/portal-core/types\";\nimport type { components } from \"@fluid-app/fluidos-api-client\";\n\n/** Raw navigation item from the FluidOS API (derived from generated types) */\nexport type RawApiNavigationItem =\n components[\"schemas\"][\"FluidOSNavigationItem\"];\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/portal-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/** Raw manifest shape from the `/fluid_os/definitions/active` API response */\nexport interface RawManifestResponse {\n manifest: {\n definition_id: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id: number;\n themes?: RawApiTheme[];\n navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * This is the top-level transform used by `FluidClient.app.get()`.\n * It handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n\n return {\n definition_id: manifest.definition_id,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? manifest.definition_id,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? manifest.definition_id,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? manifest.definition_id,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","/**\n * Fluid API Client\n * Adapted from: packages/fluidos-api-client/src/lib/fetch-client.ts\n * Provides authenticated API access with domain-specific methods\n */\n\nimport type { Rep, UpdateRepData, UserMe } from \"../types/rep\";\nimport type { Profile } from \"../types/profile\";\nimport type { UserPermissions } from \"../types/permissions\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\nimport {\n createFetchClient,\n fluidOs,\n type FetchClient,\n} from \"@fluid-app/fluidos-api-client\";\nimport {\n HTTP_METHODS,\n type FluidSDKConfig,\n type RequestOptions,\n type BaseListParams,\n} from \"./types\";\nimport { createDefaultAuthRedirect } from \"../auth/auth-redirect\";\nimport {\n transformManifestToRepAppData,\n type RawManifestResponse,\n} from \"../transforms\";\n\n/**\n * API Error class for structured error handling\n */\nexport class ApiError extends Error {\n readonly status: number;\n readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n // V8-specific stack trace capture (Node.js, Chrome)\n const errorWithCapture = Error as typeof Error & {\n captureStackTrace?: (\n target: object,\n constructor: typeof ApiError,\n ) => void;\n };\n if (errorWithCapture.captureStackTrace) {\n errorWithCapture.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n// ============================================================================\n// Discriminated Union for API Responses\n// ============================================================================\n\n/**\n * Discriminated union representing the result of an API call.\n * Use `isApiSuccess` and `isApiFailure` type guards to narrow.\n */\nexport type ApiResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: ApiError };\n\n/**\n * Type guard for successful API result\n */\nexport function isApiSuccess<T>(\n result: ApiResult<T>,\n): result is { readonly success: true; readonly data: T } {\n return result.success === true;\n}\n\n/**\n * Type guard for failed API result\n */\nexport function isApiFailure<T>(\n result: ApiResult<T>,\n): result is { readonly success: false; readonly error: ApiError } {\n return result.success === false;\n}\n\n/**\n * Type guard to check if a value is a non-null string\n */\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Extract error message from API response data using `in` operator narrowing.\n * Checks common error message field names in order of precedence.\n */\nfunction extractErrorMessage(\n data: Readonly<Record<string, unknown>>,\n fallback: string,\n): string {\n // Use `in` operator to narrow and then type guard to validate string type\n if (\"message\" in data && isString(data.message)) {\n return data.message;\n }\n if (\"error_message\" in data && isString(data.error_message)) {\n return data.error_message;\n }\n if (\"error\" in data && isString(data.error)) {\n return data.error;\n }\n return fallback;\n}\n\n// ============================================================================\n// Domain Types\n// ============================================================================\n\n// ============================================================================\n// Product Types\n// ============================================================================\n\nexport interface Product {\n readonly id: number;\n readonly title: string;\n readonly sku?: string | null;\n readonly price: string | number;\n readonly description?: string | null;\n readonly image_url?: string;\n readonly status?: string;\n readonly active?: boolean;\n readonly slug?: string;\n readonly in_stock?: boolean;\n readonly display_price?: string;\n readonly currency_code?: string;\n readonly updated_at?: string;\n}\n\nexport interface ProductListParams extends BaseListParams {\n readonly search_query?: string;\n readonly status?: readonly (\"active\" | \"draft\" | \"archived\" | \"all\")[];\n readonly category_id?: string;\n readonly category_ids?: readonly number[];\n readonly collection_id?: string;\n readonly collection_ids?: readonly number[];\n readonly order_by?: readonly string[];\n readonly country_code?: readonly string[];\n readonly published_stores?: readonly (\"retail\" | \"rep\")[];\n}\n\nexport interface ProductsResponse {\n readonly products: readonly Product[];\n readonly meta: {\n readonly request_id: string;\n readonly timestamp: string;\n readonly pagination?: {\n readonly current_page: number;\n readonly per_page: number;\n readonly total_pages: number;\n readonly total_count: number;\n };\n };\n}\n\n// ============================================================================\n// Order Types\n// ============================================================================\n\nexport interface Order {\n readonly id: string;\n readonly order_number: string;\n readonly status: string;\n readonly total: number;\n readonly customer_id: string;\n readonly rep_id?: string;\n readonly created_at: string;\n readonly updated_at: string;\n}\n\nexport interface OrderListParams extends BaseListParams {\n readonly status?: string;\n readonly customer_id?: string;\n readonly date_from?: string;\n readonly date_to?: string;\n}\n\nexport interface CreateOrderData {\n readonly customer_id: string;\n readonly line_items: readonly OrderLineItem[];\n readonly notes?: string;\n}\n\nexport interface OrderLineItem {\n readonly product_id: string;\n readonly quantity: number;\n readonly price?: number;\n}\n\n// ============================================================================\n// Analytics Types\n// ============================================================================\n\nexport interface DashboardData {\n readonly total_sales: number;\n readonly total_orders: number;\n readonly total_customers: number;\n readonly recent_orders: readonly Order[];\n}\n\nexport interface SalesParams {\n readonly date_from?: string;\n readonly date_to?: string;\n readonly group_by?: \"day\" | \"week\" | \"month\";\n}\n\nexport interface SalesData {\n readonly total: number;\n readonly data: readonly SalesDataPoint[];\n}\n\nexport interface SalesDataPoint {\n readonly date: string;\n readonly amount: number;\n readonly orders: number;\n}\n\n// ============================================================================\n// Client Return Type\n// ============================================================================\n\n/**\n * The shape returned by `createFluidClient`.\n * Generic helper methods preserve their type parameters so callers\n * can specify response types at each call site.\n */\nexport interface FluidClientReturn {\n readonly fetchClient: FetchClient;\n\n readonly request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n\n readonly requestNullable: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse | null>;\n\n readonly safeRequest: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<ApiResult<TResponse>>;\n\n readonly get: <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n\n readonly post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n\n readonly products: {\n readonly list: (params?: ProductListParams) => Promise<ProductsResponse>;\n readonly get: (id: string | number) => Promise<{ product: Product }>;\n readonly search: (\n query: string,\n params?: ProductListParams,\n ) => Promise<ProductsResponse>;\n };\n\n readonly orders: {\n readonly list: (params?: OrderListParams) => Promise<Order[]>;\n readonly get: (id: string) => Promise<Order>;\n readonly create: (data: CreateOrderData) => Promise<Order>;\n };\n\n readonly users: {\n readonly me: () => Promise<UserMe>;\n };\n\n readonly reps: {\n readonly current: () => Promise<Rep>;\n readonly updateProfile: (data: UpdateRepData) => Promise<Rep>;\n };\n\n readonly profile: {\n readonly get: () => Promise<Profile>;\n };\n\n readonly app: {\n readonly getRaw: () => Promise<RawManifestResponse>;\n readonly get: () => Promise<RepAppData>;\n };\n\n readonly permissions: {\n readonly get: () => Promise<UserPermissions>;\n };\n\n readonly analytics: {\n readonly dashboard: () => Promise<DashboardData>;\n readonly sales: (params?: SalesParams) => Promise<SalesData>;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\n/**\n * Creates a configured Fluid API client instance\n */\nexport function createFluidClient(config: FluidSDKConfig): FluidClientReturn {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();\n\n // Create a fluidos FetchClient for structured API calls (manifest, etc.)\n // Conditional spread for exactOptionalPropertyTypes: only include getAuthToken when defined\n const fetchClient: FetchClient = createFetchClient({\n baseUrl,\n ...(getAuthToken ? { getAuthToken } : {}),\n onAuthError: effectiveOnAuthError,\n defaultHeaders,\n });\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters (Rails-compatible)\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Construct URL by concatenating baseUrl + endpoint\n // Using URL constructor with relative paths would strip the baseUrl path (e.g., /api)\n const normalizedBase = baseUrl.endsWith(\"/\")\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedEndpoint = endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`;\n const url = new URL(normalizedBase + normalizedEndpoint);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n for (const item of value) {\n url.searchParams.append(`${key}[]`, String(item));\n }\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (subValue === undefined || subValue === null) {\n continue;\n }\n\n if (Array.isArray(subValue)) {\n for (const item of subValue) {\n url.searchParams.append(`${key}[${subKey}][]`, String(item));\n }\n } else {\n url.searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Default request options for type-safe defaults.\n * Uses `satisfies` to validate against RequestOptions while preserving literal types.\n */\n const defaultRequestOptions = {\n method: HTTP_METHODS.GET,\n } as const satisfies Partial<RequestOptions>;\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = defaultRequestOptions.method,\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n // Use buildUrl for all requests to ensure baseUrl path is preserved\n const url = buildUrl(\n endpoint,\n method === HTTP_METHODS.GET ? params : undefined,\n );\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n // Only add signal and body when defined to satisfy exactOptionalPropertyTypes\n // RequestInit expects signal: AbortSignal | null, not undefined\n if (signal !== undefined) {\n fetchOptions.signal = signal;\n }\n if (body && method !== HTTP_METHODS.GET) {\n fetchOptions.body = JSON.stringify(body);\n }\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Handle authentication errors — invoke the handler, then throw so\n // TanStack Query surfaces the error instead of caching `null` as data.\n if (response.status === 401) {\n effectiveOnAuthError();\n throw new ApiError(\"Authentication required\", 401, null);\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = (await response.json()) as Record<string, unknown>;\n // Use `in` operator narrowing to safely extract error message\n const errorMessage = extractErrorMessage(\n data,\n `${method} request failed`,\n );\n throw new ApiError(\n errorMessage,\n response.status,\n \"errors\" in data ? data.errors : data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (isApiError(error)) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting nullable responses should use requestNullable<T>\n // which properly types the return as T | null\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n // Type assertion required: 204 No Content has no body to parse.\n // This is safe when TResponse is a union including null (e.g., T | null).\n // For fully type-safe nullable handling, prefer requestNullable() or safeRequest().\n return null as TResponse;\n }\n\n try {\n const data: unknown = await response.json();\n // Runtime check: verify we got an object/array, not a primitive that would be mistyped\n if (data === null || data === undefined) {\n throw new ApiError(\n \"Unexpected null/undefined in JSON response\",\n response.status,\n null,\n );\n }\n // Type assertion required: JSON.parse returns `unknown`, but we've validated\n // the response is not null/undefined. The caller specifies TResponse based on\n // their knowledge of the API endpoint's response schema.\n return data as TResponse;\n } catch (parseError) {\n if (isApiError(parseError)) {\n throw parseError;\n }\n throw new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n );\n }\n }\n\n /**\n * Request function for endpoints that may return null (204 No Content).\n * Properly types the return as T | null.\n */\n async function requestNullable<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse | null> {\n return request<TResponse | null>(endpoint, options);\n }\n\n /**\n * Safe request wrapper that returns a discriminated union instead of throwing.\n * Use `isApiSuccess` or `isApiFailure` to narrow the result.\n */\n async function safeRequest<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<ApiResult<TResponse>> {\n try {\n const data = await request<TResponse>(endpoint, options);\n return { success: true, data };\n } catch (error) {\n if (isApiError(error)) {\n return { success: false, error };\n }\n // Wrap unknown errors in ApiError\n return {\n success: false,\n error: new ApiError(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n null,\n ),\n };\n }\n }\n\n /**\n * Helper to safely convert typed params to Record<string, unknown>.\n * Type assertion required: TypeScript's structural typing allows any object\n * to be treated as Record<string, unknown> when we only need to iterate\n * over its entries. This is safe because buildUrl only reads properties.\n */\n function toParams<T extends object>(\n params: T | undefined,\n ): Record<string, unknown> | undefined {\n return params as Record<string, unknown> | undefined;\n }\n\n // Convenience HTTP methods using HTTP_METHODS constant for type safety\n const get = <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> => {\n // Build request options object, only adding params if defined\n const baseOptions = {\n ...options,\n method: HTTP_METHODS.GET,\n } satisfies RequestOptions;\n\n const convertedParams = toParams(params);\n const requestOptions: RequestOptions =\n convertedParams !== undefined\n ? { ...baseOptions, params: convertedParams }\n : baseOptions;\n\n return request<TResponse>(endpoint, requestOptions);\n };\n\n const post = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.POST,\n body,\n } satisfies RequestOptions);\n\n const put = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PUT,\n body,\n } satisfies RequestOptions);\n\n const patch = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PATCH,\n body,\n } satisfies RequestOptions);\n\n const del = <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.DELETE,\n } satisfies RequestOptions);\n\n // ============================================================================\n // Domain-Specific API Methods\n // ============================================================================\n\n return {\n // Fluidos FetchClient for structured API calls\n fetchClient: fetchClient,\n\n // Low-level methods for custom endpoints\n request: request,\n requestNullable: requestNullable,\n safeRequest: safeRequest,\n get: get,\n post: post,\n put: put,\n patch: patch,\n delete: del,\n\n // Products API - matches fluid-admin's /company/v1/products\n products: {\n list: (params?: ProductListParams): Promise<ProductsResponse> =>\n get<ProductsResponse, ProductListParams>(\n \"/api/company/v1/products\",\n params,\n ),\n get: (id: string | number): Promise<{ product: Product }> =>\n get<{ product: Product }>(`/api/company/v1/products/${id}`),\n search: (\n query: string,\n params?: ProductListParams,\n ): Promise<ProductsResponse> =>\n get<ProductsResponse>(\"/api/company/v1/products\", {\n search_query: query,\n ...params,\n } as Record<string, unknown>),\n },\n\n // Orders API\n orders: {\n list: (params?: OrderListParams): Promise<Order[]> =>\n get<Order[], OrderListParams>(\"/api/orders\", params),\n get: (id: string): Promise<Order> => get<Order>(`/api/orders/${id}`),\n create: (data: CreateOrderData): Promise<Order> =>\n post<Order>(\"/api/orders\", data),\n },\n\n // Users API\n users: {\n me: (): Promise<UserMe> => get<UserMe>(\"/api/me\"),\n },\n\n // Reps API\n reps: {\n current: (): Promise<Rep> => get<Rep>(\"/api/reps/me\"),\n updateProfile: (data: UpdateRepData): Promise<Rep> =>\n patch<Rep>(\"/api/reps/me\", data),\n },\n\n // Profile API (themes, navigation, screens) — legacy endpoint\n profile: {\n get: (): Promise<Profile> => get<Profile>(\"/api/rep_app/manifest\"),\n },\n\n // App API — fluidos endpoint (full manifest with transforms)\n app: {\n /** Fetch the raw manifest (plain JSON, no Color objects). Cache-safe. */\n getRaw: async (): Promise<RawManifestResponse> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n // The fluidos-api-client returns { manifest?, meta? } — cast to\n // RawManifestResponse shape which transformManifestToRepAppData expects\n return raw as unknown as RawManifestResponse;\n },\n /** Fetch the active app definition with full theme/screen/navigation transforms */\n get: async (): Promise<RepAppData> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n return transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n },\n },\n\n // Permissions API\n permissions: {\n get: (): Promise<UserPermissions> =>\n get<UserPermissions>(\"/api/company/roles/my_permissions\"),\n },\n\n // Analytics API\n analytics: {\n dashboard: (): Promise<DashboardData> =>\n get<DashboardData>(\"/api/analytics/dashboard\"),\n sales: (params?: SalesParams): Promise<SalesData> =>\n get<SalesData, SalesParams>(\"/api/analytics/sales\", params),\n },\n };\n}\n\nexport type FluidClient = ReturnType<typeof createFluidClient>;\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using portal-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeAllThemes,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared portal-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from portal-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps): React.JSX.Element {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n removeAllThemes();\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","/**\n * FluidAuthProvider - Authentication Provider for Fluid Portal SDK\n *\n * Handles JWT token extraction from URL, validation, storage, and\n * provides authentication context to child components.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useReducer,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport type {\n FluidAuthConfig,\n FluidAuthContextValue,\n JWTPayload,\n} from \"../auth/types\";\nimport { extractTokenFromUrl, cleanTokenFromUrl } from \"../auth/url-token\";\nimport { getStoredToken, storeToken, clearTokens } from \"../auth/token-storage\";\nimport {\n validateToken,\n verifyToken,\n isTokenExpired,\n} from \"../auth/token-utils\";\nimport { isDevBypassActive, createDevUser } from \"../auth/dev-utils\";\nimport {\n resolveAuthFailureHandler,\n AUTH_REDIRECT_TOKEN_KEY,\n} from \"../auth/auth-redirect\";\n\n/**\n * Auth context - null when outside provider\n */\nconst FluidAuthContext = createContext<FluidAuthContextValue | null>(null);\n\ninterface AuthState {\n isLoading: boolean;\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n}\n\ntype AuthAction =\n | {\n type: \"SET_AUTH\";\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n }\n | { type: \"CLEAR_AUTH\" }\n | { type: \"DONE_LOADING\" };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n switch (action.type) {\n case \"SET_AUTH\":\n return {\n isLoading: false,\n token: action.token,\n user: action.user,\n error: action.error,\n };\n case \"CLEAR_AUTH\":\n return { ...state, token: null, user: null, error: null };\n case \"DONE_LOADING\":\n return { ...state, isLoading: false };\n }\n}\n\nconst initialAuthState: AuthState = {\n isLoading: true,\n token: null,\n user: null,\n error: null,\n};\n\nexport interface FluidAuthProviderProps {\n /** React children to wrap with auth context */\n children: ReactNode;\n /** Auth configuration options */\n config?: FluidAuthConfig;\n}\n\n/**\n * Authentication provider for Fluid portal applications.\n *\n * On mount, this provider:\n * 1. Checks for a token in the URL (passed from parent app)\n * 2. Cleans token from URL immediately (security)\n * 3. Falls back to stored token (cookie/localStorage)\n * 4. Validates the token (checks expiration)\n * 5. Stores valid tokens for future use\n * 6. Calls onAuthFailure if no valid token found\n *\n * @example\n * ```tsx\n * import { FluidAuthProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidAuthProvider\n * config={{\n * onAuthFailure: () => {\n * window.location.href = \"/login\";\n * },\n * }}\n * >\n * <YourApp />\n * </FluidAuthProvider>\n * );\n * }\n * ```\n */\nexport function FluidAuthProvider({\n children,\n config,\n}: FluidAuthProviderProps): React.JSX.Element {\n const configRef = useRef(config);\n configRef.current = config;\n\n const [state, dispatch] = useReducer(authReducer, initialAuthState);\n const { isLoading, token, user, error } = state;\n\n // Initialize auth on mount\n useEffect(() => {\n const initializeAuth = async () => {\n const handleAuthFailure = () => {\n const current = configRef.current;\n const handler = resolveAuthFailureHandler(\n current?.onAuthFailure,\n current?.authUrl,\n );\n handler();\n };\n\n try {\n // DEV BYPASS: Check for env variable token first, then dev bypass\n if (isDevBypassActive(config?.devBypass)) {\n // Check for VITE_DEV_TOKEN env variable first (real token in dev)\n const envToken = import.meta.env.VITE_DEV_TOKEN;\n if (envToken) {\n const validation = validateToken(envToken, config?.gracePeriodMs);\n if (validation.isValid && validation.payload) {\n storeToken(envToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: envToken,\n user: validation.payload,\n error: null,\n });\n return;\n }\n console.warn(\n \"[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user\",\n );\n }\n\n // No valid env token - use synthetic dev user\n console.warn(\n \"[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token.\",\n );\n const devUser = createDevUser();\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: devUser,\n error: null,\n });\n return;\n }\n\n // 1. Try to get token from URL first (fresh authentication)\n const tokenKey = config?.tokenKey ?? \"fluidUserToken\";\n let candidateToken = extractTokenFromUrl(tokenKey);\n\n // Fallback: auth.fluid.app returns the token as \"jwt\", not \"fluidUserToken\"\n if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {\n candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n }\n\n // Clean token from URL immediately after extraction (security)\n // Do this BEFORE validation so the URL is clean even if validation fails\n cleanTokenFromUrl(tokenKey);\n cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n\n // 2. Fall back to stored token\n if (!candidateToken) {\n candidateToken = getStoredToken(config);\n }\n\n // 3. If we have a token, validate it\n if (candidateToken) {\n let payload: JWTPayload | null = null;\n\n if (config?.jwksUrl) {\n // Signature verification enabled - use verifyToken\n payload = await verifyToken(candidateToken, config.jwksUrl);\n if (!payload) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"JWT signature verification failed\"),\n });\n handleAuthFailure();\n return;\n }\n // Also check expiration\n if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"Token has expired\"),\n });\n handleAuthFailure();\n return;\n }\n } else {\n // No JWKS - existing behavior (decode only, check expiration)\n const validation = validateToken(\n candidateToken,\n config?.gracePeriodMs,\n );\n if (validation.isValid && validation.payload) {\n payload = validation.payload;\n } else {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(validation.error ?? \"Invalid token\"),\n });\n handleAuthFailure();\n return;\n }\n }\n\n // Valid token - store it and update state\n storeToken(candidateToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: candidateToken,\n user: payload,\n error: null,\n });\n } else {\n // No token available\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"No authentication token found\"),\n });\n handleAuthFailure();\n }\n } catch (err) {\n const authError =\n err instanceof Error ? err : new Error(\"Authentication error\");\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: authError,\n });\n handleAuthFailure();\n } finally {\n dispatch({ type: \"DONE_LOADING\" });\n }\n };\n\n void initializeAuth();\n // Only run on mount - config changes don't re-initialize\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear auth handler\n const clearAuth = useCallback(() => {\n clearTokens(configRef.current);\n dispatch({ type: \"CLEAR_AUTH\" });\n }, []);\n\n // Memoize context value\n // Use `satisfies` to validate shape at compile time while preserving inference\n const contextValue = useMemo(\n () =>\n ({\n isAuthenticated: user !== null,\n isLoading,\n user,\n token,\n clearAuth,\n error,\n }) satisfies FluidAuthContextValue,\n [token, isLoading, user, clearAuth, error],\n );\n\n return (\n <FluidAuthContext.Provider value={contextValue}>\n {children}\n </FluidAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access the auth context directly.\n * Prefer using `useFluidAuth` for most use cases.\n *\n * @throws Error if used outside FluidAuthProvider\n */\nexport function useFluidAuthContext(): FluidAuthContextValue {\n const context = useContext(FluidAuthContext);\n\n if (!context) {\n throw new Error(\n \"useFluidAuthContext must be used within a FluidAuthProvider. \" +\n \"Wrap your app with <FluidAuthProvider> to use authentication features.\",\n );\n }\n\n return context;\n}\n\n/** Safe accessor — returns null when outside FluidAuthProvider (no throw) */\nexport function useFluidAuthOptional(): FluidAuthContextValue | null {\n return useContext(FluidAuthContext);\n}\n","import type { ApiDataSource, DataSourceContext } from \"../types\";\n\n/**\n * Extracts a value from an object using dot notation path\n * e.g., getByPath({ data: { items: [1,2,3] } }, 'data.items') => [1,2,3]\n */\nfunction getByPath(obj: unknown, path: string): unknown {\n return path.split(\".\").reduce((current, key) => {\n if (current && typeof current === \"object\" && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Replaces {variable} placeholders in an endpoint path with values from the\n * variables map. E.g., \"/reps/{rep_id}/most_shared\" with { rep_id: \"42\" }\n * becomes \"/reps/42/most_shared\".\n */\nfunction interpolateVariables(\n endpoint: string,\n variables?: Record<string, string>,\n): string {\n if (!variables) return endpoint;\n const resolved = endpoint.replace(\n /\\{(\\w+)\\}/g,\n (match, key: string) => variables[key] ?? match,\n );\n const unresolved = resolved.match(/\\{(\\w+)\\}/g);\n if (unresolved) {\n console.warn(\n `[DataSource] Unresolved variable placeholders in endpoint: ${unresolved.join(\", \")}. ` +\n `Endpoint: \"${endpoint}\". Available variables: ${Object.keys(variables).join(\", \") || \"(none)\"}`,\n );\n }\n return resolved;\n}\n\n/**\n * Resolves the full URL for an endpoint.\n * - Substitutes {variable} placeholders from context variables\n * - Absolute URLs (starting with http:// or https://) are used as-is\n * - Relative paths are prefixed with the context's baseUrl\n */\nfunction resolveEndpointUrl(\n endpoint: string,\n baseUrl?: string,\n variables?: Record<string, string>,\n): string {\n const resolved = interpolateVariables(endpoint, variables);\n\n // If endpoint is already absolute, use it directly\n if (resolved.startsWith(\"http://\") || resolved.startsWith(\"https://\")) {\n return resolved;\n }\n\n // If we have a baseUrl, prepend it to the relative endpoint\n if (baseUrl) {\n // Ensure proper joining (no double slashes)\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = resolved.startsWith(\"/\") ? resolved : `/${resolved}`;\n return `${base}${path}`;\n }\n\n // No baseUrl provided, return endpoint as-is (will likely fail for relative paths)\n return resolved;\n}\n\n/**\n * Default API fetcher implementation\n */\nexport async function apiFetcher(\n source: ApiDataSource,\n context: DataSourceContext,\n): Promise<unknown> {\n const { endpoint, method = \"GET\", headers = {}, body } = source;\n\n // Merge context variables with per-source variables (source overrides context)\n const mergedVariables = { ...context.variables, ...source.variables };\n\n // Resolve the full URL, substituting variables and using baseUrl for relative endpoints\n const url = resolveEndpointUrl(endpoint, context.baseUrl, mergedVariables);\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n \"content-type\": \"application/json\",\n ...context.getApiHeaders?.(),\n ...headers,\n },\n signal: context.signal,\n };\n\n if (body && (method === \"POST\" || method === \"PUT\")) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(\n `API request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n // Extract data at resultPath if specified\n if (source.resultPath) {\n return getByPath(data, source.resultPath);\n }\n\n return data;\n}\n","import type {\n CustomDataSource,\n DataSourceContext,\n SelectedItem,\n ShareableType,\n} from \"../types\";\n\n/**\n * Individual resource endpoints for each shareable type.\n * These fetch single items by ID from the company API.\n */\nconst SHAREABLE_ENDPOINTS: Record<\n ShareableType,\n (id: string | number) => string\n> = {\n Medium: (id) => `/company/media/${id}`,\n Page: (id) => `/company/pages/${id}`,\n Library: (id) => `/company/libraries/${id}`,\n Product: (id) => `/company/v1/products/${id}`,\n EnrollmentPack: (id) => `/enrollment_packs/${id}`,\n};\n\n/**\n * Extract the actual resource data from various API response structures.\n * Different endpoints wrap their data differently:\n * - Product: { status, resource: { product: {...} } }\n * - EnrollmentPack: { status, resource: { enrollment_pack: {...} } }\n * - Medium/Page/Library: Direct root or { medium: {...} }\n */\nfunction extractResourceData(\n json: Record<string, unknown>,\n shareableType: ShareableType,\n): Record<string, unknown> {\n // Try nested resource structure first (Product, EnrollmentPack)\n const resource = json.resource as Record<string, unknown> | undefined;\n if (resource) {\n // Check for type-specific key within resource\n const typeKey = shareableType.toLowerCase().replace(\"pack\", \"_pack\");\n if (resource[typeKey]) {\n return resource[typeKey] as Record<string, unknown>;\n }\n // Check common keys\n if (resource.product) return resource.product as Record<string, unknown>;\n if (resource.enrollment_pack)\n return resource.enrollment_pack as Record<string, unknown>;\n }\n\n // Try direct type key (e.g., { medium: {...} })\n const directKey = shareableType.toLowerCase().replace(\"pack\", \"_pack\");\n if (json[directKey]) {\n return json[directKey] as Record<string, unknown>;\n }\n\n // Try common response shapes\n if (json.data) return json.data as Record<string, unknown>;\n if (json.medium) return json.medium as Record<string, unknown>;\n if (json.page) return json.page as Record<string, unknown>;\n if (json.library) return json.library as Record<string, unknown>;\n if (json.product) return json.product as Record<string, unknown>;\n if (json.enrollment_pack)\n return json.enrollment_pack as Record<string, unknown>;\n\n // Return as-is if no wrapper found (Library uses direct serialization)\n return json;\n}\n\n/**\n * Result from fetching a single shareable item\n */\ninterface FetchResult {\n item: SelectedItem;\n data: unknown;\n error?: Error;\n}\n\n/**\n * Fetch a single shareable item by ID from the individual resource endpoint.\n */\nasync function fetchSingleItem(\n item: SelectedItem,\n signal: AbortSignal,\n baseUrl: string = \"\",\n getApiHeaders?: () => Record<string, string>,\n): Promise<FetchResult> {\n const getEndpoint = SHAREABLE_ENDPOINTS[item.shareableType];\n if (!getEndpoint) {\n return {\n item,\n data: null,\n error: new Error(`Unknown shareable type: ${item.shareableType}`),\n };\n }\n\n const endpoint = `${baseUrl}${getEndpoint(item.id)}`;\n\n try {\n const response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n ...getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n return {\n item,\n data: null,\n error: new Error(\n `Failed to fetch ${item.shareableType} with ID ${item.id}: ${response.status}`,\n ),\n };\n }\n\n const json = await response.json();\n\n // Extract the actual resource data from the response wrapper\n const resourceData = extractResourceData(json, item.shareableType);\n\n // Add shareable_type to the response for transformer compatibility\n if (resourceData && typeof resourceData === \"object\") {\n (resourceData as Record<string, unknown>).shareable_type =\n item.shareableType;\n }\n\n return { item, data: resourceData };\n } catch (error) {\n return {\n item,\n data: null,\n error:\n error instanceof Error\n ? error\n : new Error(\n `Unknown error fetching ${item.shareableType} ${item.id}`,\n ),\n };\n }\n}\n\n/**\n * Custom fetcher that fetches selected items.\n *\n * Fetches items from individual resource endpoints using the configured\n * getApiHeaders for authentication.\n *\n * Fetches all items in parallel for performance.\n * Returns an array of successfully fetched items, preserving order.\n * Logs warnings for failed fetches but doesn't throw.\n */\nexport async function customFetcher(\n source: CustomDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { selectedItems } = source;\n if (!selectedItems || selectedItems.length === 0) {\n return [];\n }\n\n // Fallback: fetch from individual endpoints (no auth)\n const results = await Promise.all(\n selectedItems.map((item) =>\n fetchSingleItem(\n item,\n context.signal,\n context.baseUrl,\n context.getApiHeaders,\n ),\n ),\n );\n\n // Process results, collecting successful data and tracking errors\n const successfulData: unknown[] = [];\n const errors: Error[] = [];\n\n for (const result of results) {\n if (result.error) {\n console.warn(\n `[CustomFetcher] Failed to fetch ${result.item.shareableType} #${result.item.id}:`,\n result.error.message,\n );\n errors.push(result.error);\n continue;\n }\n\n if (result.data) {\n successfulData.push(result.data);\n }\n }\n\n // Throw error if all fetches failed\n if (successfulData.length === 0 && errors.length > 0) {\n throw new Error(\n `Failed to fetch all ${errors.length} item(s): ${errors[0]?.message || \"Unknown error\"}`,\n );\n }\n\n return successfulData;\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport type {\n StaticDataSource,\n DataSourceContext,\n StaticSourceType,\n StaticItem,\n} from \"../types\";\n\n/**\n * Endpoint patterns for fetching products by static source type.\n * Tags require backend API support (not yet available).\n */\nconst STATIC_ENDPOINTS: Record<\"collections\" | \"categories\", string> = {\n collections: \"/company/v1/products\",\n categories: \"/company/v1/products\",\n};\n\n/**\n * Query parameter names for each static source type.\n */\nconst STATIC_QUERY_PARAMS: Record<\"collections\" | \"categories\", string> = {\n collections: \"collection_id\",\n categories: \"category_id\",\n};\n\n/**\n * Extract products array from API response.\n * The /company/v1/products endpoint returns { products: [...], meta: {...} }\n */\nfunction extractProducts(json: Record<string, unknown>): unknown[] {\n if (Array.isArray(json.products)) {\n return json.products;\n }\n if (Array.isArray(json.data)) {\n return json.data;\n }\n if (Array.isArray(json)) {\n return json;\n }\n console.warn(\n \"[extractProducts] Could not find products array. Available keys:\",\n Object.keys(json),\n );\n return [];\n}\n\n/**\n * Static data source fetcher.\n *\n * Fetches products filtered by collection or category ID.\n * Tags are not yet supported (requires backend API changes).\n *\n * @param source - The static data source configuration\n * @param context - The data source context with baseUrl and headers\n * @returns Array of products matching the filter criteria\n */\nexport async function staticFetcher(\n source: StaticDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { staticType, selectedId } = source;\n\n // Tags require backend API support - not yet implemented\n if (staticType === \"tags\") {\n throw new Error(\n \"Tags data source is not yet supported. Please select Collections or Categories instead.\",\n );\n }\n\n const endpoint = STATIC_ENDPOINTS[staticType];\n const queryParam = STATIC_QUERY_PARAMS[staticType];\n\n if (!endpoint || !queryParam) {\n throw new Error(\n `Invalid data source configuration: \"${staticType}\" is not a supported static source type.`,\n );\n }\n\n const url = new URL(\n `${context.baseUrl ?? \"\"}${endpoint}`,\n context.baseUrl ? undefined : window.location.origin,\n );\n url.searchParams.set(queryParam, String(selectedId));\n\n try {\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...context.getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: context.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = await response.json();\n return extractProducts(json);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n // Request was cancelled, don't log as error\n return [];\n }\n console.error(\n `[staticFetcher] Error fetching ${staticType} ${selectedId}:`,\n error,\n );\n throw error;\n }\n}\n\n/**\n * Endpoints for listing static source items (collections, categories, tags).\n */\nconst LIST_ENDPOINTS: Record<\n StaticSourceType,\n { endpoint: string; resultKey: string }\n> = {\n collections: {\n endpoint: \"/company/v1/collections\",\n resultKey: \"collections\",\n },\n categories: { endpoint: \"/company/v1/categories\", resultKey: \"categories\" },\n tags: { endpoint: \"/company/v1/tags\", resultKey: \"tags\" },\n};\n\n/**\n * Result type for useStaticSourceItems hook.\n */\nexport interface UseStaticSourceItemsResult {\n /** The fetched items */\n items: StaticItem[];\n /** True while items are being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n/**\n * React hook for fetching static source items (collections, categories).\n * Handles loading state, error state, abort on cleanup, and search filtering.\n *\n * @param staticType - The type of static source to fetch, or null to reset\n * @param context - Context with baseUrl and getApiHeaders\n * @param params - Optional search parameters\n * @returns Object with items, isLoading, and error state\n */\nexport function useStaticSourceItems(\n staticType: StaticSourceType | null,\n context: Pick<DataSourceContext, \"baseUrl\" | \"getApiHeaders\">,\n params?: { search?: string },\n): UseStaticSourceItemsResult {\n const [items, setItems] = useState<StaticItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Extract stable references from context to avoid dependency issues\n const { baseUrl, getApiHeaders } = context;\n const search = params?.search;\n\n // Use ref to avoid infinite re-renders when getApiHeaders changes reference\n const getApiHeadersRef = useRef(getApiHeaders);\n getApiHeadersRef.current = getApiHeaders;\n\n useEffect(() => {\n if (!staticType) {\n setItems([]);\n setError(null);\n return;\n }\n\n let isCancelled = false;\n const abortController = new AbortController();\n setIsLoading(true);\n setError(null);\n\n const config = LIST_ENDPOINTS[staticType];\n const url = new URL(\n `${baseUrl ?? \"\"}${config.endpoint}`,\n baseUrl ? undefined : window.location.origin,\n );\n\n if (search) {\n url.searchParams.set(\"search\", search);\n }\n\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...getApiHeadersRef.current?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: abortController.signal,\n })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch ${staticType}: ${response.status}`);\n }\n const json = await response.json();\n const responseItems = json[config.resultKey] as Array<{\n id: string | number;\n title: string;\n image_url?: string;\n }>;\n\n if (!Array.isArray(responseItems)) {\n console.warn(\n `[useStaticSourceItems] Expected array at \"${config.resultKey}\" but got:`,\n typeof responseItems,\n );\n if (!isCancelled) {\n setItems([]);\n }\n return;\n }\n\n if (!isCancelled) {\n setItems(\n responseItems.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: item.image_url,\n })),\n );\n }\n })\n .catch((err) => {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Log for debugging\n console.error(\n `[useStaticSourceItems] Failed to fetch ${staticType}:`,\n err,\n );\n\n if (isCancelled) return;\n\n setError(\"An unexpected error occurred. Please try again.\");\n setItems([]);\n })\n .finally(() => {\n if (!isCancelled) {\n setIsLoading(false);\n }\n });\n\n return () => {\n isCancelled = true;\n abortController.abort();\n };\n }, [staticType, search, baseUrl]);\n\n return { items, isLoading, error };\n}\n","/**\n * Widget Transformers\n *\n * Transform functions that map API response data to widget-specific prop shapes.\n * Each widget has one transformer that handles all data structure variants:\n * - Standard: Direct field name match\n * - Legacy: Different field names that need mapping\n * - Minimal: Bare minimum fields that need defaults\n *\n * Usage:\n * 1. Transformers are registered in the DataSourceRegistry\n * 2. Reference by name in ApiDataSource.transform\n * 3. Applied after resultPath extraction, before targetProps assignment\n */\n\nimport type { DataTransformer, DataSource } from \"./types\";\n\n/**\n * Helper to extract image URL from various API response structures.\n * Handles:\n * - Flat fields (Medium, Page, Product): image_url, imageUrl, thumbnail_url, src\n * - Nested images array (EnrollmentPack): images[0].image_url\n * - Nested library_items (Library): library_items[0].relateable.image_url\n */\nfunction extractImageUrl(d: Record<string, unknown>): string {\n // Try flat fields first (Medium, Page, Product)\n if (d.image_url) return d.image_url as string;\n if (d.imageUrl) return d.imageUrl as string;\n if (d.thumbnail_url) return d.thumbnail_url as string;\n if (d.src) return d.src as string;\n\n // Try nested images array (EnrollmentPack)\n const images = d.images as Array<Record<string, unknown>> | undefined;\n if (images && images.length > 0) {\n const firstImage = images[0];\n if (firstImage?.image_url) return firstImage.image_url as string;\n if (firstImage?.url) return firstImage.url as string;\n }\n\n // Try nested library_items (Library/Playlist)\n const libraryItems = d.library_items as\n | Array<Record<string, unknown>>\n | undefined;\n if (libraryItems && libraryItems.length > 0) {\n const firstItem = libraryItems[0];\n const relateable = firstItem?.relateable as\n | Record<string, unknown>\n | undefined;\n if (relateable?.image_url) return relateable.image_url as string;\n if (relateable?.imageUrl) return relateable.imageUrl as string;\n if (relateable?.thumbnail_url) return relateable.thumbnail_url as string;\n }\n\n return \"\";\n}\n\n/**\n * Helper to extract description from various API response structures.\n * Handles different field names across endpoints.\n */\nfunction extractDescription(d: Record<string, unknown>): string {\n // Try various description field names\n const desc =\n d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? \"\";\n\n // Handle nested description object (some APIs return { body: \"...\" })\n if (typeof desc === \"object\" && desc !== null && \"body\" in desc) {\n return ((desc as Record<string, unknown>).body as string) ?? \"\";\n }\n\n return desc as string;\n}\n\n/**\n * Helper to extract custom widget config from a selected item.\n */\nfunction extractCustomWidgetConfig(\n d: Record<string, unknown>,\n source: DataSource | undefined,\n): Record<string, unknown> {\n if (source === undefined || source.type !== \"custom\") return {};\n\n const selectedItem = source.selectedItems.find(\n (s) => String(s.id) === String(d.id),\n );\n return selectedItem?.widgetConfig ?? {};\n}\n\n/**\n * ImageWidget transformer from shareable data\n */\nconst toImagePropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", alt: \"Image\", objectFit: \"cover\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: extractImageUrl(d),\n alt: (d.title ?? d.name ?? d.alt ?? \"Image\") as string,\n objectFit: \"cover\" as const,\n };\n};\n\n/**\n * VideoWidget transformer from shareable data\n */\nconst toVideoPropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", poster: \"\", caption: \"\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: ((d.video_url ?? d.videoUrl ?? d.src) as string) || \"\",\n poster: extractImageUrl(d),\n caption: (d.title ?? d.name ?? d.caption ?? \"\") as string,\n };\n};\n\n/**\n * Shareable content transformer\n * Normalizes shareable API responses to a consistent format\n */\nconst toShareableProps: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n // Derive a fallback shareable type from the data source configuration.\n // API presets pass shareable_type in their variables (e.g., \"products\").\n // Custom sources store it per-item (handled below).\n const sourceTypeHint =\n source?.type === \"api\" ? source.variables?.shareable_type : undefined;\n\n return data.map((item: unknown) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n // Resolve shareable type from the item itself, then fall back to source hint\n const shareableType = (d.type ??\n d.relateable_type ??\n d.shareable_type ??\n d.shareableType ??\n sourceTypeHint ??\n \"\") as string;\n\n return {\n id: d.id,\n title: (d.title ?? d.name ?? \"\") as string,\n description: extractDescription(d),\n imageUrl: extractImageUrl(d),\n videoUrl: ((d.video_url ?? d.videoUrl) as string) || null,\n shareableType,\n kind: (d.kind ?? \"image\") as string,\n status: (d.status ?? \"active\") as string,\n wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,\n subscriptionPrice: d.subscription_price ?? null,\n outOfStock: d.out_of_stock ?? false,\n lowInStock: d.low_in_stock ?? false,\n ...d,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * Carousel slides from shareables transformer\n */\nconst toCarouselSlidesFromShareables: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown, index: number) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n const imageUrl = extractImageUrl(d);\n const isVideo = d.kind === \"video\" || d.videoUrl || d.video_url;\n const title = (d.title ?? d.name ?? \"\") as string;\n\n const content = isVideo\n ? {\n type: \"VideoWidget\",\n props: {\n src: ((d.videoUrl ?? d.video_url) as string) || \"\",\n poster: imageUrl,\n caption: title,\n },\n }\n : {\n type: \"ImageWidget\",\n props: {\n src: imageUrl,\n alt: title || \"Slide image\",\n objectFit: \"cover\",\n },\n };\n\n const baseSlide = {\n id: String(d.id ?? `slide-${index}`),\n content,\n title,\n description: extractDescription(d),\n };\n\n return {\n ...baseSlide,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * All widget transformers bundled for registration\n */\nexport const WIDGET_TRANSFORMERS: Record<string, DataTransformer> = {\n toShareableProps,\n toCarouselSlidesFromShareables,\n toImagePropsFromShareable,\n toVideoPropsFromShareable,\n};\n","import type {\n DataSourceRegistry,\n DataFetcher,\n DataTransformer,\n DataSourceType,\n} from \"./types\";\nimport { apiFetcher } from \"./fetchers/api\";\nimport { customFetcher } from \"./fetchers/custom\";\nimport { staticFetcher } from \"./fetchers/static\";\nimport { WIDGET_TRANSFORMERS } from \"./transformers\";\n\nexport interface CreateDataSourceRegistryOptions {\n /** Custom fetchers to add or override */\n fetchers?: Partial<Record<DataSourceType, DataFetcher>>;\n /** Custom transform functions */\n transformers?: Record<string, DataTransformer>;\n}\n\n/**\n * Creates a data source registry with default fetchers.\n * Users can extend this with custom fetchers and transformers.\n */\nexport function createDataSourceRegistry(\n options?: CreateDataSourceRegistryOptions,\n): DataSourceRegistry {\n return {\n fetchers: {\n api: apiFetcher,\n custom: customFetcher,\n static: staticFetcher,\n ...options?.fetchers,\n } as Record<DataSourceType, DataFetcher>,\n transformers: {\n ...WIDGET_TRANSFORMERS,\n ...options?.transformers,\n },\n };\n}\n\n/** Default registry instance */\nexport const DEFAULT_DATA_SOURCE_REGISTRY: DataSourceRegistry =\n createDataSourceRegistry();\n","import type React from \"react\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { DataSourceRegistry } from \"./types\";\nimport { DEFAULT_DATA_SOURCE_REGISTRY } from \"./registry\";\nimport { DataSourceProvider } from \"./context\";\n\ninterface DataSourceRegistryContextValue {\n registry: DataSourceRegistry;\n baseUrl?: string | undefined;\n /** Get API headers function */\n getApiHeaders?: (() => Record<string, string>) | undefined;\n /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string> | undefined;\n}\n\nconst DataSourceRegistryContext = createContext<DataSourceRegistryContextValue>(\n {\n registry: DEFAULT_DATA_SOURCE_REGISTRY,\n },\n);\n\nexport interface DataSourceRegistryProviderProps {\n registry?: DataSourceRegistry | undefined;\n /** Base URL for API calls (e.g., \"https://api.fluid.app/api\") */\n baseUrl?: string | undefined;\n /**\n * Get API headers function\n */\n getApiHeaders?: (() => Record<string, string>) | undefined;\n /** Dynamic variables for endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string> | undefined;\n children: ReactNode;\n}\n\n/**\n * Provides data source registry and configuration to all descendants.\n * If no registry is provided, uses the default.\n * Also provides the shared DataSourceProvider from portal-core so that\n * portal-widgets hooks can access baseUrl and getApiHeaders.\n */\nexport function DataSourceRegistryProvider({\n registry,\n baseUrl,\n getApiHeaders,\n variables,\n children,\n}: DataSourceRegistryProviderProps): React.JSX.Element {\n const value = useMemo(\n () => ({\n registry: registry ?? DEFAULT_DATA_SOURCE_REGISTRY,\n baseUrl,\n getApiHeaders,\n variables,\n }),\n [registry, baseUrl, getApiHeaders, variables],\n );\n\n return (\n <DataSourceRegistryContext.Provider value={value}>\n <DataSourceProvider baseUrl={baseUrl} getApiHeaders={getApiHeaders}>\n {children}\n </DataSourceProvider>\n </DataSourceRegistryContext.Provider>\n );\n}\n\n/**\n * Hook to access the data source registry.\n */\nexport function useDataSourceRegistry(): DataSourceRegistry {\n return useContext(DataSourceRegistryContext).registry;\n}\n\n/**\n * Hook to access the full data source registry context (registry + config).\n */\nexport function useDataSourceRegistryConfig(): DataSourceRegistryContextValue {\n return useContext(DataSourceRegistryContext);\n}\n","import type { ComponentType } from \"react\";\nimport type { WidgetSchema, TypedWidgetSchema } from \"../types\";\nimport type { ShareableItem } from \"../types/shareable-item\";\nimport type { WidgetManifest } from \"../registries/widget-manifest\";\n\nexport function createWidgetRegistry<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, ComponentType<any>>,\n>(registry: T, plugins?: WidgetManifest[]): T {\n if (!plugins || plugins.length === 0) {\n return registry;\n }\n\n const pluginEntries = Object.fromEntries(\n plugins.map((p) => [p.type, p.component]),\n );\n\n return { ...registry, ...pluginEntries } as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createScreen<T extends Record<string, ComponentType<any>>>(\n registry: T,\n widgets: TypedWidgetSchema<T>[],\n): TypedWidgetSchema<T>[] {\n // Validate that all widget types exist in the registry at runtime\n widgets.forEach((widget) => {\n if (!(widget.type in registry)) {\n throw new Error(\n `Widget type \"${String(widget.type)}\" not found in registry`,\n );\n }\n });\n return widgets;\n}\n\n// Helper to create WidgetSchema from shareable item\nexport function createWidgetFromShareable(item: ShareableItem): WidgetSchema {\n const isVideo = item.kind === \"video\" || !!item.videoUrl;\n\n if (isVideo && item.videoUrl) {\n return {\n type: \"VideoWidget\",\n props: {\n src: item.videoUrl,\n poster: item.imageUrl,\n caption: item.title,\n },\n };\n }\n\n return {\n type: \"ImageWidget\",\n props: {\n src: item.imageUrl,\n alt: item.title || \"Image\",\n objectFit: \"cover\",\n },\n };\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createFluidClient, type FluidClient } from \"../client/fluid-client\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { useFluidAuthOptional } from \"./FluidAuthProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/portal-core/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/portal-widgets/contexts\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../client/types\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** Configured API client instance */\n readonly client: FluidClient;\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Portal SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{\n * baseUrl: \"https://api.fluid.app/api\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps): React.JSX.Element {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n },\n },\n }),\n [],\n );\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Recreate client only when baseUrl changes (primitive dependency).\n // Wrap callbacks in closures so they always read the latest from configRef,\n // avoiding stale captures when parent passes new getAuthToken/onAuthError.\n const client = useMemo(\n () =>\n createFluidClient({\n ...configRef.current,\n getAuthToken: () => configRef.current.getAuthToken?.() ?? null,\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Context value only changes when client changes\n const contextValue = useMemo(\n () => ({ client, config: configRef.current }) satisfies FluidContextValue,\n [client],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // getAuthToken is typically a synchronous cookie/localStorage read,\n // so we call it and use the result if it's a string (not a Promise).\n const getApiHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const getAuthToken = configRef.current.getAuthToken;\n if (typeof getAuthToken === \"function\") {\n const tokenOrPromise = getAuthToken();\n // Only use synchronous results — async tokens are handled by the SDK client\n if (typeof tokenOrPromise === \"string\") {\n headers.Authorization = `Bearer ${tokenOrPromise}`;\n }\n }\n\n return headers;\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Auto-derive rep_id from auth context for data source path interpolation\n const authContext = useFluidAuthOptional();\n\n const autoVariables = useMemo(() => {\n if (authContext?.user?.id != null) {\n return { rep_id: String(authContext.user.id) };\n }\n return undefined;\n }, [authContext?.user?.id]);\n\n // Explicit prop takes precedence over auto-derived variables\n const effectiveVariables = variables ?? autoVariables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <DataSourceRegistryProvider\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n >\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </DataSourceRegistryProvider>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,42],"mappings":"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"}