@ews-admin/global-design-system 1.37.0 → 1.39.0

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 (47) hide show
  1. package/dist/components/AssistantChat/ActionTooltip.d.ts +12 -0
  2. package/dist/components/AssistantChat/ActionTooltip.d.ts.map +1 -0
  3. package/dist/components/AssistantChat/AssistantChat.d.ts.map +1 -1
  4. package/dist/components/AssistantChat/AssistantChat.types.d.ts +37 -1
  5. package/dist/components/AssistantChat/AssistantChat.types.d.ts.map +1 -1
  6. package/dist/components/AssistantChat/AssistantComposer.d.ts +16 -3
  7. package/dist/components/AssistantChat/AssistantComposer.d.ts.map +1 -1
  8. package/dist/components/AssistantChat/AssistantDictationBar.d.ts +28 -0
  9. package/dist/components/AssistantChat/AssistantDictationBar.d.ts.map +1 -0
  10. package/dist/components/AssistantChat/AssistantSuggestionCard.d.ts +1 -1
  11. package/dist/components/AssistantChat/AssistantSuggestionCard.d.ts.map +1 -1
  12. package/dist/components/AssistantChat/AssistantVoiceMode.d.ts +37 -0
  13. package/dist/components/AssistantChat/AssistantVoiceMode.d.ts.map +1 -0
  14. package/dist/components/AssistantChat/assistantMarkdown.d.ts.map +1 -1
  15. package/dist/components/AssistantChat/index.d.ts +4 -0
  16. package/dist/components/AssistantChat/index.d.ts.map +1 -1
  17. package/dist/components/AssistantLauncher/AssistantLauncher.d.ts +15 -0
  18. package/dist/components/AssistantLauncher/AssistantLauncher.d.ts.map +1 -1
  19. package/dist/components/AssistantLauncher/index.d.ts +1 -1
  20. package/dist/components/AssistantLauncher/index.d.ts.map +1 -1
  21. package/dist/hooks/index.d.ts +1 -1
  22. package/dist/hooks/index.d.ts.map +1 -1
  23. package/dist/hooks/useSpeechRecognition.d.ts +2 -0
  24. package/dist/hooks/useSpeechRecognition.d.ts.map +1 -1
  25. package/dist/index.css +1 -1
  26. package/dist/index.d.ts +133 -7
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.esm.css +1 -1
  29. package/dist/index.esm.js +435 -58
  30. package/dist/index.esm.js.map +1 -1
  31. package/dist/index.js +437 -56
  32. package/dist/index.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/components/AssistantChat/ActionTooltip.tsx +31 -0
  35. package/src/components/AssistantChat/AssistantChat.tsx +43 -5
  36. package/src/components/AssistantChat/AssistantChat.types.ts +27 -1
  37. package/src/components/AssistantChat/AssistantComposer.tsx +106 -68
  38. package/src/components/AssistantChat/AssistantDictationBar.tsx +268 -0
  39. package/src/components/AssistantChat/AssistantSuggestionCard.tsx +7 -6
  40. package/src/components/AssistantChat/AssistantVoiceMode.tsx +304 -0
  41. package/src/components/AssistantChat/assistantMarkdown.tsx +4 -1
  42. package/src/components/AssistantChat/index.ts +4 -0
  43. package/src/components/AssistantLauncher/AssistantLauncher.tsx +156 -79
  44. package/src/components/AssistantLauncher/index.ts +1 -1
  45. package/src/hooks/index.ts +1 -1
  46. package/src/hooks/useSpeechRecognition.ts +9 -0
  47. package/src/index.ts +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/utils/env-config.ts","../src/utils/locations.ts","../src/utils/phone.ts","../src/utils/index.ts","../src/components/Button/Button.tsx","../src/icons/Icon.tsx","../src/icons/DoctorIcon.tsx","../src/icons/PatientIcon.tsx","../src/icons/UserIcon.tsx","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/hooks/useDebounce.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useIdleLock.ts","../src/hooks/useSelectField.ts","../src/hooks/useSpeechRecognition.ts","../src/components/SearchAutocomplete/SearchAutocomplete.tsx","../src/components/MultiSearchAutocomplete/MultiSearchAutocomplete.tsx","../src/components/Modal/Modal.tsx","../src/components/ProfileImageUpload/ProfileImageUpload.tsx","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/UserAgent_DEPRECATED.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/ExecutionEnvironment.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/isEventSupported.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/normalizeWheel.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/index.js","../node_modules/.pnpm/react-easy-crop@6.2.4_react-dom@18.3.1_react@18.3.1/node_modules/react-easy-crop/index.module.mjs","../src/components/ImageCropModal/cropImage.ts","../src/components/ImageCropModal/ImageCropModal.tsx","../src/components/DropdownMultiSelect/DropdownMultiSelect.tsx","../src/components/PhoneInput/PhoneInput.tsx","../src/assets/logo/logoIcon.png","../src/assets/logo/logo.png","../src/assets/logo/logoFullWhite.png","../src/assets/logo/logoWhite.png","../src/components/Logo/logoAssets.ts","../src/components/Logo/Logo.tsx","../src/theme/themeConfig.ts","../src/theme/ThemeProvider.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/ThemeDebugger/ThemeDebugger.tsx","../src/components/RegionSelect/RegionSelect.tsx","../src/components/Tag/Tag.tsx","../src/components/TagList/TagList.tsx","../src/components/PaymentDueBanner/PaymentDueBanner.tsx","../src/components/SecureLoader/SecureLoader.tsx","../src/components/PinPad/PinPad.tsx","../src/components/PinCodeInput/PinCodeInput.tsx","../src/components/AssistantChat/AssistantComposer.tsx","../src/components/AssistantChat/AssistantConfirmationCard.tsx","../src/components/AssistantChat/AssistantConversationList.tsx","../src/components/AssistantChat/assistantMarkdown.tsx","../src/components/AssistantChat/AssistantMessages.tsx","../src/components/AssistantChat/AssistantSuggestionCard.tsx","../src/components/AssistantChat/AssistantChat.tsx","../src/assistant/store.ts","../src/components/AssistantLauncher/AssistantLauncher.tsx","../src/assistant/transport.ts","../src/components/LockScreen/LockScreen.tsx","../src/molecules/SpecialtySearchAutocomplete/SpecialtySearchAutocomplete.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","export type Environment = \"local\" | \"dev\" | \"qa\" | \"prod\";\n\nexport interface EnvConfigOverrides {\n bffUrl?: string;\n loginBffUrl?: string;\n assistantBffUrl?: string;\n appUrl?: string;\n loginUrl?: string;\n dashboardUrl?: string;\n adminUrl?: string;\n}\n\nexport interface EnvConfig {\n env: Environment;\n bffUrl: string;\n loginBffUrl: string;\n /** MED-1783: the assistant BFF (medecine360-assistant-bff), base path included. */\n assistantBffUrl: string;\n appUrl: string;\n loginUrl: string;\n dashboardUrl: string;\n adminUrl: string;\n}\n\nconst LOCAL_PORTS = {\n bff: 8082,\n loginBff: 8080,\n assistantBff: 8083,\n app: 3000,\n login: 3001,\n dashboard: 3002,\n admin: 3008,\n} as const;\n\nfunction buildUrls(environment: Environment): Omit<EnvConfig, \"env\"> {\n if (environment === \"local\") {\n const domain = \"medecine360local.com\";\n // APIs run at api.medecine360local.com (no \"local.\" prefix)\n // Frontend apps run at local.{app}.medecine360local.com\n return {\n bffUrl: `http://api.${domain}:${LOCAL_PORTS.bff}/api/v1`,\n loginBffUrl: `http://api.${domain}:${LOCAL_PORTS.loginBff}/api/v1`,\n assistantBffUrl: `http://api.${domain}:${LOCAL_PORTS.assistantBff}/api/v1`,\n appUrl: `http://local.app.${domain}:${LOCAL_PORTS.app}`,\n loginUrl: `http://local.login.${domain}:${LOCAL_PORTS.login}`,\n dashboardUrl: `http://local.dashboard.${domain}:${LOCAL_PORTS.dashboard}`,\n adminUrl: `http://local.admin.${domain}:${LOCAL_PORTS.admin}`,\n };\n }\n\n const prefix = environment === \"prod\" ? \"\" : `${environment}.`;\n const domain = \"medecine360.com\";\n\n return {\n bffUrl: `https://${prefix}api.${domain}/bff/api/v1`,\n loginBffUrl: `https://${prefix}api.${domain}/login-bff/api/v1`,\n assistantBffUrl: `https://${prefix}api.${domain}/assistant/api/v1`,\n appUrl: environment === \"prod\" ? `https://${prefix}${domain}` : `https://${prefix}app.${domain}`,\n loginUrl: `https://${prefix}login.${domain}`,\n dashboardUrl: `https://${prefix}dashboard.${domain}`,\n adminUrl: `https://${prefix}admin.${domain}`,\n };\n}\n\n/**\n * Derives the environment from the host the app is served from, for builds\n * that did not set VITE_ENV. Hosts actually served (Traefik rules in\n * infrastructure/medecine360-hetzner/deployment/docker-stack.*.yml):\n * - local: localhost, 127.0.0.1, *.medecine360local.com (local.app., api., ...)\n * - dev: dev.{app,login,dashboard,admin,api}.medecine360.com\n * - qa: qa.{app,login,dashboard,admin,api}.medecine360.com\n * - prod: medecine360.com, {login,dashboard,admin,api}.medecine360.com\n * Any other host (or no window, e.g. SSR or tests) falls back to local.\n */\nfunction environmentFromHost(): Environment {\n const hostname =\n typeof window !== \"undefined\" ? window.location?.hostname?.toLowerCase() : undefined;\n if (!hostname) return \"local\";\n if (hostname === \"medecine360.com\" || hostname.endsWith(\".medecine360.com\")) {\n if (hostname.startsWith(\"dev.\")) return \"dev\";\n if (hostname.startsWith(\"qa.\")) return \"qa\";\n return \"prod\";\n }\n return \"local\";\n}\n\n/**\n * Creates an environment configuration with all derived URLs.\n *\n * For deployed environments (dev, qa, prod), only the environment name is needed\n * — all URLs follow a predictable convention.\n *\n * For local development, sensible defaults are provided but can be overridden\n * (e.g. to point BFF URL at a mock server).\n *\n * When env is empty (build without VITE_ENV), the environment is derived from\n * the current host instead of always assuming local, so a deployed build never\n * links to http://local.*.medecine360local.com. A console warning names the\n * derived environment so the misconfigured build stays visible.\n *\n * @param env - The environment name (VITE_ENV value)\n * @param overrides - Optional URL overrides (e.g. for local mock servers)\n */\nexport function createEnvConfig(\n env: string,\n overrides?: EnvConfigOverrides,\n): EnvConfig {\n let environment = env as Environment;\n if (!environment) {\n environment = environmentFromHost();\n console.warn(\n `[env-config] VITE_ENV is not set; using \"${environment}\" derived from the current host.`,\n );\n }\n const derived = buildUrls(environment);\n\n return {\n env: environment,\n ...derived,\n ...overrides,\n };\n}\n","export enum SupportedCountry {\n SENEGAL = \"SENEGAL\",\n CHAD = \"CHAD\",\n}\n\nconst REGIONS_BY_COUNTRY: Record<string, string[]> = {\n[SupportedCountry.SENEGAL]: [\n \"Dakar\",\n \"Diourbel\",\n \"Fatick\",\n \"Kaffrine\", // missing in your list\n \"Kaolack\", // missing in your list (spelling variant of Kaolac)\n \"Kédougou\",\n \"Kolda\",\n \"Louga\",\n \"Matam\",\n \"Saint-Louis\",\n \"Sédhiou\",\n \"Tambacounda\",\n \"Thiès\",\n \"Ziguinchor\",\n],\n [SupportedCountry.CHAD]: [\n \"N'Djamena\",\n \"Moundou\",\n \"Sarh\",\n \"Abéché\",\n \"Doba\",\n \"Pala\",\n \"Am Timan\",\n \"Mongo\",\n \"Faya-Largeau\",\n ],\n};\n\n/**\n * Returns the list of regions for a given country.\n * Matching is case-insensitive; defaults to Senegal when country is unknown.\n */\nexport function getRegionsByCountry(country: string): string[] {\n const key = country?.toUpperCase();\n return REGIONS_BY_COUNTRY[key] ?? REGIONS_BY_COUNTRY[SupportedCountry.SENEGAL];\n}\n\n/**\n * Returns regions as SelectOption-compatible objects { value, label }.\n */\nexport function getRegionOptions(country: string): { value: string; label: string }[] {\n return getRegionsByCountry(country).map((region) => ({\n value: region,\n label: region,\n }));\n}\n","/**\n * Country code option for phone number selection\n */\nexport interface CountryCodeOption {\n code: string;\n country: string;\n}\n\n/**\n * Props for country code select component\n */\nexport interface CountryCodeSelectProps {\n options: CountryCodeOption[];\n value: string;\n onChange: (code: string) => void;\n}\n\n/**\n * Available country codes supported by the platform\n */\nexport const COUNTRY_CODES: CountryCodeOption[] = [\n { code: \"+221\", country: \"SN\" }, // Senegal\n { code: \"+235\", country: \"TD\" }, // Chad\n];\n\n/**\n * Determines the default country code based on phone number prefix or country ISO code.\n * Falls back to \"+221\" (Senegal) when no match is found.\n */\nexport function getDefaultCountryCode(\n phoneNumber?: string,\n country?: string\n): string {\n if (phoneNumber) {\n const match = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code)\n );\n if (match) return match.code;\n }\n\n if (country) {\n const match = COUNTRY_CODES.find(\n ({ country: c }) => c.toUpperCase() === country.toUpperCase()\n );\n if (match) return match.code;\n }\n\n return \"+221\";\n}\n\n/**\n * Extracts the country code prefix from a phone number and returns both\n * the detected country code and the local number without the prefix.\n *\n * @example\n * extractCountryCodeFromPhoneNumber(\"+22177123456\") // { countryCode: \"+221\", cleanedPhoneNumber: \"77123456\" }\n * extractCountryCodeFromPhoneNumber(\"77123456\") // { countryCode: \"+221\", cleanedPhoneNumber: \"77123456\" }\n */\nexport function extractCountryCodeFromPhoneNumber(\n phoneNumber: string,\n country?: string\n): { countryCode: string; cleanedPhoneNumber: string } {\n const matched = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code)\n );\n\n if (matched) {\n const cleaned = phoneNumber\n .replace(new RegExp(`^\\\\${matched.code}\\\\s*`), \"\")\n .trim();\n return { countryCode: matched.code, cleanedPhoneNumber: cleaned };\n }\n\n // Same dial code, but without the leading \"+\" — e.g. the backend's canonical\n // digits-only storage format (\"221770000010\" instead of \"+221770000010\").\n // Without this check the caller below would treat the whole string (dial\n // code digits included) as the local part.\n const bareMatch = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code.slice(1))\n );\n\n if (bareMatch) {\n const cleaned = phoneNumber\n .replace(new RegExp(`^${bareMatch.code.slice(1)}\\\\s*`), \"\")\n .trim();\n return { countryCode: bareMatch.code, cleanedPhoneNumber: cleaned };\n }\n\n return {\n countryCode: getDefaultCountryCode(phoneNumber, country),\n cleanedPhoneNumber: phoneNumber.trim(),\n };\n}\n\n/**\n * Formats a phone number by prepending the country code if not already present.\n * If the number already starts with a known country code (with or without the\n * leading \"+\") it is returned unchanged except for the \"+\" being added when\n * missing. Leading zeros, spaces and dashes are stripped from the local part\n * before formatting.\n *\n * @example\n * formatPhoneNumberWithCountryCode(\"77123456\", \"+221\") // \"+22177123456\"\n * formatPhoneNumberWithCountryCode(\"+22177123456\", \"+221\") // \"+22177123456\" (unchanged)\n * formatPhoneNumberWithCountryCode(\"077123456\", \"+221\") // \"+22177123456\" (leading 0 stripped)\n * formatPhoneNumberWithCountryCode(\"22177123456\") // \"+22177123456\" (backend's\n * // canonical digits-only\n * // storage format — just add \"+\",\n * // don't re-prepend the dial code)\n */\nexport function formatPhoneNumberWithCountryCode(\n phoneNumber: string,\n countryCode: string = \"+221\"\n): string {\n const trimmed = phoneNumber?.trim() || \"\";\n\n if (!trimmed) return \"\";\n\n // Already has a known country code — return as-is\n if (COUNTRY_CODES.some(({ code }) => trimmed.startsWith(code))) {\n return trimmed;\n }\n\n // Same dial code, but without the leading \"+\" (e.g. \"221770000010\", the\n // backend's canonical digits-only storage format). Just add the \"+\" —\n // re-prepending countryCode here would double the dial-code digits\n // (\"+221221770000010\").\n const bareMatch = COUNTRY_CODES.find(({ code }) =>\n trimmed.startsWith(code.slice(1))\n );\n if (bareMatch) {\n return `+${trimmed}`;\n }\n\n // Strip leading zeros, spaces, dashes and + signs from the local part\n const cleaned = trimmed.replace(/^[\\s+0-]*/, \"\").trim();\n\n if (!cleaned) return \"\";\n\n return `${countryCode}${cleaned}`;\n}\n\n/**\n * National digit groups used to display a phone number, per country code:\n * Senegal numbers have 9 national digits (77 123 45 67, 33 823 45 67), Chad\n * numbers 8 (66 12 34 56).\n */\nconst DISPLAY_DIGIT_GROUPS: Record<string, number[]> = {\n \"+221\": [2, 3, 2, 2],\n \"+235\": [2, 2, 2, 2],\n};\n\n/**\n * Formats a phone number for display only: the country code, then the\n * national digits in their usual groups. Do not use it for values sent to the\n * API, form values or tel: links; formatPhoneNumberWithCountryCode gives the\n * unspaced value for those. A number from another country, or of an\n * unexpected length, is returned as formatPhoneNumberWithCountryCode returns it.\n *\n * @example\n * formatPhoneNumberForDisplay(\"221771234567\") // \"+221 77 123 45 67\" (backend's storage format)\n * formatPhoneNumberForDisplay(\"771234567\") // \"+221 77 123 45 67\"\n * formatPhoneNumberForDisplay(\"+23566123456\") // \"+235 66 12 34 56\"\n * formatPhoneNumberForDisplay(\"+22177123\") // \"+22177123\" (unexpected length, unchanged)\n */\nexport function formatPhoneNumberForDisplay(\n phoneNumber: string,\n countryCode: string = \"+221\"\n): string {\n const canonical = formatPhoneNumberWithCountryCode(phoneNumber, countryCode);\n const code = COUNTRY_CODES.find(({ code: c }) => canonical.startsWith(c))?.code;\n const groups = code ? DISPLAY_DIGIT_GROUPS[code] : undefined;\n if (!code || !groups) return canonical;\n\n const national = canonical.slice(code.length).replace(/[\\s-]/g, \"\");\n const expectedLength = groups.reduce((sum, size) => sum + size, 0);\n if (!/^\\d+$/.test(national) || national.length !== expectedLength) return canonical;\n\n const parts: string[] = [];\n let start = 0;\n for (const size of groups) {\n parts.push(national.slice(start, start + size));\n start += size;\n }\n return `${code} ${parts.join(\" \")}`;\n}\n","import { clsx, type ClassValue } from \"clsx\";\n\nexport { createEnvConfig } from \"./env-config\";\nexport {\n SupportedCountry,\n getRegionsByCountry,\n getRegionOptions,\n} from \"./locations\";\nexport type {} from \"./locations\";\nexport {\n COUNTRY_CODES,\n extractCountryCodeFromPhoneNumber,\n formatPhoneNumberForDisplay,\n formatPhoneNumberWithCountryCode,\n getDefaultCountryCode,\n} from \"./phone\";\nexport type { CountryCodeOption, CountryCodeSelectProps } from \"./phone\";\nexport type {\n EnvConfig,\n EnvConfigOverrides,\n Environment,\n} from \"./env-config\";\n\n/**\n * Default currency for price formatting\n */\nexport const CURRENCY = \"XOF\";\n\n/**\n * Utility function to merge class names\n * @param inputs - Class values to merge\n * @returns Merged class string\n */\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n\n/**\n * Utility function to format currency\n * @param amount - Amount to format\n * @param currency - Currency code (default: CURRENCY constant)\n * @returns Formatted currency string\n */\nexport function formatCurrency(amount: number, currency = CURRENCY): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n }).format(amount);\n}\n\nexport interface FormatDateOptions extends Intl.DateTimeFormatOptions {\n locale?: string | string[];\n}\n\n/**\n * Parses a date value the way every date coming from these platforms'\n * Java/Kotlin backends actually shows up, without the classic off-by-one\n * timezone bug.\n *\n * A bare \"YYYY-MM-DD\" string is parsed by `new Date(...)` as UTC midnight\n * (per the ECMAScript spec), which then shifts a day earlier once formatted\n * in any timezone behind UTC. This function parses date-only strings (and\n * Jackson's `[year, month, day, ...]` LocalDate/LocalDateTime array\n * serialization) as local calendar components instead. Full ISO datetime\n * strings (with a time and/or timezone), Date objects, and numeric\n * timestamps are unaffected and still go through the normal `new Date(...)`\n * parse.\n */\nexport function parseDateSafe(\n date: Date | string | number | number[]\n): Date {\n if (Array.isArray(date)) {\n const [y, m, d, h = 0, min = 0, s = 0] = date;\n return new Date(y, m - 1, d, h, min, s);\n }\n if (typeof date === \"string\") {\n const dateOnlyMatch = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (dateOnlyMatch) {\n return new Date(\n Number(dateOnlyMatch[1]),\n Number(dateOnlyMatch[2]) - 1,\n Number(dateOnlyMatch[3])\n );\n }\n }\n return new Date(date);\n}\n\nexport function formatDate(\n date: Date | string | number | number[],\n options?: FormatDateOptions\n): string {\n const { locale = \"en-US\", ...intlOptions } = options ?? {};\n const dateObj = parseDateSafe(date);\n return new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n ...intlOptions,\n }).format(dateObj);\n}\n\n/**\n * Utility function to debounce function calls\n * @param func - Function to debounce\n * @param wait - Wait time in milliseconds\n * @returns Debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Utility function to generate unique ID\n * @param prefix - Optional prefix for the ID\n * @returns Unique ID string\n */\nexport function generateId(prefix = \"ews\"): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Utility function to format numeric input by removing non-digit characters\n * @param value - String value to format\n * @returns String with only numeric characters\n */\nexport const formatNumeric = (value: string): string => {\n return value.replace(/\\D/g, \"\");\n};\n\n/**\n * Utility function to validate phone numbers\n * Validates phone numbers with 1-17 digits, optionally starting with + symbol\n * @param value - Phone number string to validate\n * @returns Boolean indicating if the phone number is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n const trimmedValue = value.trim();\n // Allow + at the beginning, followed by 1-17 digits\n // Or just 1-17 digits without +\n const phoneRegex = /^(\\+\\d{1,17}|\\d{1,17})$/;\n return phoneRegex.test(trimmedValue);\n}\n\n/**\n * Blood type enum matching backend BloodTypeEnum values\n */\nexport enum BloodType {\n A_POSITIVE = \"A+\",\n A_NEGATIVE = \"A-\",\n B_POSITIVE = \"B+\",\n B_NEGATIVE = \"B-\",\n AB_POSITIVE = \"AB+\",\n AB_NEGATIVE = \"AB-\",\n O_POSITIVE = \"O+\",\n O_NEGATIVE = \"O-\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Ordered list of all blood type values.\n * Use this to build select/dropdown options.\n */\nexport const BLOOD_TYPES: BloodType[] = [\n BloodType.A_POSITIVE,\n BloodType.A_NEGATIVE,\n BloodType.B_POSITIVE,\n BloodType.B_NEGATIVE,\n BloodType.AB_POSITIVE,\n BloodType.AB_NEGATIVE,\n BloodType.O_POSITIVE,\n BloodType.O_NEGATIVE,\n BloodType.UNKNOWN,\n];\n","import React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Button variant\n */\n variant?:\n | \"ews-primary\"\n | \"ews-secondary\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"outline\"\n | \"ghost\";\n /**\n * Button size\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Whether the button is in a loading state\n */\n loading?: boolean;\n /**\n * Whether the button should take full width\n */\n fullWidth?: boolean;\n /**\n * Icon to display before the button text\n */\n leftIcon?: React.ReactNode;\n /**\n * Icon to display after the button text\n */\n rightIcon?: React.ReactNode;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"ews-primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n leftIcon,\n rightIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center font-medium rounded-md transition-colors focus:outline-none disabled:opacity-50 disabled:pointer-events-none\";\n\n const variants = {\n \"ews-primary\": \"bg-ews-primary text-white hover:bg-ews-primary-hover\",\n \"ews-secondary\":\n \"bg-ews-secondary text-white hover:bg-ews-secondary-hover\",\n success: \"bg-ews-success text-white hover:bg-ews-success-hover\",\n warning: \"bg-ews-warning text-white hover:bg-ews-warning-hover\",\n error: \"bg-ews-error text-white hover:bg-ews-error-hover\",\n outline:\n \"bg-transparent text-sm font-medium text-ews-primary hover:text-ews-primary/80\",\n ghost:\n \"border border-ews-primary text-ews-primary hover:bg-ews-primary hover:text-white disabled:border-gray-400 disabled:text-gray-400 focus:ring-2 focus:ring-offset-2 focus:ring-ews-primary\",\n };\n\n const sizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n };\n\n const iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n };\n\n return (\n <button\n className={cn(\n baseStyles,\n variants[variant],\n sizes[size],\n fullWidth && \"w-full\",\n className\n )}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <svg\n className=\"mr-2 -ml-1 w-4 h-4 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {!loading && leftIcon && (\n <span className={cn(\"flex items-center mr-2\", iconSizes[size])}>\n {leftIcon}\n </span>\n )}\n {children}\n {!loading && rightIcon && (\n <span className={cn(\"flex items-center ml-2\", iconSizes[size])}>\n {rightIcon}\n </span>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { LucideProps } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface IconProps extends Omit<LucideProps, \"size\"> {\n /**\n * Icon size\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n /**\n * The Lucide icon component to render\n */\n icon: React.ComponentType<LucideProps>;\n}\n\n// Simple icon props for individual icon components\nexport interface SimpleIconProps {\n /**\n * Icon size in pixels\n */\n size?: number;\n /**\n * Icon color (can be hex, rgb, or Tailwind class)\n */\n color?: string;\n /**\n * Additional CSS classes (supports Tailwind classes)\n */\n className?: string;\n /**\n * Other props passed to the underlying icon\n */\n [key: string]: unknown;\n}\n\nconst Icon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ size = \"md\", icon: IconComponent, className, ...props }, ref) => {\n const sizes = {\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n };\n\n const iconSize = typeof size === \"number\" ? size : sizes[size];\n\n return (\n <IconComponent\n ref={ref}\n size={iconSize}\n className={cn(\"shrink-0\", className)}\n {...props}\n />\n );\n }\n);\n\nIcon.displayName = \"Icon\";\n\nexport { Icon };\n","import { Stethoscope } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const DoctorIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return (\n <Stethoscope size={size} color={color} className={className} {...props} />\n );\n};\n","import { Heart } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const PatientIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return <Heart size={size} color={color} className={className} {...props} />;\n};\n","import { User } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const UserIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return <User size={size} color={color} className={className} {...props} />;\n};\n","import { ChevronDown } from \"lucide-react\";\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { Eye, EyeOff } from \"../../icons\";\nimport { cn } from \"../../utils\";\n\nexport interface CountryCodeOption {\n code: string;\n country: string;\n}\n\nexport interface CountryCodeSelectProps {\n /**\n * Array of country code options\n */\n options: CountryCodeOption[];\n /**\n * Currently selected country code\n */\n value: string;\n /**\n * Handler for when country code changes\n */\n onChange: (code: string) => void;\n}\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n /**\n * Input variant\n */\n variant?: \"default\" | \"error\" | \"success\";\n /**\n * Input size\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Label for the input\n */\n label?: string;\n /**\n * Helper text to display below the input\n */\n helperText?: string;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Icon to display before the input\n */\n leftIcon?: React.ReactNode;\n /**\n * Icon to display after the input\n */\n rightIcon?: React.ReactNode;\n /**\n * Text or node to display as a left addon (e.g., currency \"FCFA\")\n */\n leftAddon?: React.ReactNode;\n /**\n * Text or node to display as a right addon inside the input (e.g., currency \"FCFA\")\n */\n rightAddon?: React.ReactNode;\n /**\n * Whether the input should take full width\n */\n fullWidth?: boolean;\n /**\n * Whether to show password toggle for password inputs\n */\n showPasswordToggle?: boolean;\n /**\n * Whether the input is required (shows red asterisk)\n */\n required?: boolean;\n /**\n * Country code dropdown configuration for phone inputs\n */\n countryCodeSelect?: CountryCodeSelectProps;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n label,\n helperText,\n error,\n leftIcon,\n rightIcon,\n fullWidth = false,\n showPasswordToggle = false,\n required = false,\n countryCodeSelect,\n leftAddon,\n rightAddon,\n id,\n type = \"text\",\n onChange,\n onBlur,\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const inputId = id || `input-${generatedId.replace(/:/g, \"\")}`;\n const hasError = Boolean(error);\n const actualVariant = hasError ? \"error\" : variant;\n\n // Password visibility state\n const [showPassword, setShowPassword] = useState(false);\n const isPasswordInput = type === \"password\";\n const shouldShowPasswordToggle = showPasswordToggle && isPasswordInput;\n const actualType = isPasswordInput && showPassword ? \"text\" : type;\n\n // Normalize spaces for text-like inputs\n const shouldNormalize = type !== \"password\" && type !== \"number\" && type !== \"checkbox\";\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (shouldNormalize) {\n e.target.value = e.target.value.replace(/^\\s+/, \"\").replace(/\\s{2,}/g, \" \");\n }\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (shouldNormalize && onChange) {\n const trimmed = e.target.value.replace(/\\s+$/, \"\");\n if (trimmed !== e.target.value) {\n e.target.value = trimmed;\n onChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }\n onBlur?.(e);\n };\n\n // Country code dropdown state\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const baseStyles =\n \"block w-full rounded-md border transition-colors focus:outline-none focus:ring-2 focus:ring-offset-0 hover:border-ews-primary\";\n\n const variants = {\n default:\n \"border-ews-gray-300 focus:border-ews-primary focus:ring-ews-primary\",\n error: \"border-ews-error focus:border-ews-error focus:ring-ews-error\",\n success:\n \"border-ews-success focus:border-ews-success focus:ring-ews-success\",\n };\n\n const sizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-base\",\n lg: \"px-4 py-3 text-lg\",\n };\n\n const iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n };\n\n const isCheckbox = type === \"checkbox\";\n\n // For checkboxes, render with or without label based on label prop\n if (isCheckbox) {\n if (label) {\n // Render checkbox with built-in label\n return (\n <div className={cn(\"space-y-1\", fullWidth ? \"w-full\" : \"w-auto\")}>\n <div className=\"flex items-start space-x-3\">\n <input\n id={inputId}\n type={actualType}\n className={cn(\n \"mt-0.5\", // Slight top margin to align with first line of text\n className\n )}\n ref={ref}\n onChange={onChange}\n onBlur={onBlur}\n {...props}\n />\n <div className=\"flex-1\">\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium cursor-pointer text-ews-gray-700\"\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-sm\",\n error ? \"text-ews-error\" : \"text-ews-gray-500\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n } else {\n // Render just the checkbox for external label usage\n return (\n <input\n id={inputId}\n type={actualType}\n className={cn(className)}\n ref={ref}\n onChange={onChange}\n onBlur={onBlur}\n {...props}\n />\n );\n }\n }\n\n // Default rendering for non-checkbox inputs\n return (\n <div className={cn(\"space-y-1\", fullWidth ? \"w-full\" : \"w-auto\")}>\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-ews-gray-700\"\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n )}\n <div className=\"relative\">\n {countryCodeSelect && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-1 z-10\" ref={dropdownRef}>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsDropdownOpen(!isDropdownOpen)}\n className={cn(\n \"flex items-center gap-1 px-2 py-1 rounded text-ews-gray-700\",\n \"hover:bg-ews-gray-50 transition-colors cursor-pointer\",\n \"focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-0\",\n \"border-0 bg-transparent text-base\"\n )}\n >\n <span className=\"font-medium\">{countryCodeSelect.value}</span>\n <ChevronDown\n className={cn(\n \"w-4 h-4 text-ews-gray-400 transition-transform\",\n isDropdownOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isDropdownOpen && (\n <div\n className={cn(\n \"absolute top-full left-0 mt-1 bg-white rounded-md border shadow-lg\",\n \"border-ews-gray-300 min-w-[120px] z-50\"\n )}\n style={{ maxHeight: \"200px\", overflowY: \"auto\" }}\n >\n {countryCodeSelect.options.map((item) => {\n const isSelected = item.code === countryCodeSelect.value;\n return (\n <div\n key={item.code}\n onClick={() => {\n countryCodeSelect.onChange(item.code);\n setIsDropdownOpen(false);\n }}\n className={cn(\n \"px-3 py-2 text-sm cursor-pointer transition-colors\",\n isSelected && \"bg-ews-primary text-white\",\n !isSelected && \"hover:bg-ews-gray-50\"\n )}\n >\n <span className=\"font-medium\">{item.code}</span>\n {item.country && (\n <span className={cn(\n \"ml-2 text-xs\",\n isSelected ? \"text-white/80\" : \"text-ews-gray-500\"\n )}>\n {item.country}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n )}\n {leftIcon && !countryCodeSelect && !leftAddon && (\n <div className=\"flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none\">\n <span className={cn(\"text-ews-gray-400\", iconSizes[size])}>\n {leftIcon}\n </span>\n </div>\n )}\n {leftAddon && !countryCodeSelect && !leftIcon && (\n <div className=\"flex absolute inset-y-0 left-0 items-center pointer-events-none overflow-hidden rounded-l-md\">\n <span className=\"flex items-center h-full px-3 text-sm font-medium whitespace-nowrap bg-ews-gray-50 border-r border-ews-gray-300 text-ews-gray-600\">\n {leftAddon}\n </span>\n </div>\n )}\n <input\n id={inputId}\n type={actualType}\n className={cn(\n baseStyles,\n variants[actualVariant],\n sizes[size],\n countryCodeSelect && \"pl-24\",\n leftIcon && !countryCodeSelect && !leftAddon && \"pl-10\",\n leftAddon && !countryCodeSelect && !leftIcon && \"pl-16\",\n (rightIcon || shouldShowPasswordToggle) && \"pr-10\",\n rightAddon && !rightIcon && !shouldShowPasswordToggle && \"pr-16\",\n className\n )}\n ref={ref}\n onChange={handleChange}\n onBlur={handleBlur}\n {...props}\n />\n {rightAddon && !rightIcon && !shouldShowPasswordToggle && (\n <div className=\"flex absolute inset-y-0 right-0 items-center pr-3 pointer-events-none\">\n <span className=\"text-sm font-medium text-ews-gray-500\">\n {rightAddon}\n </span>\n </div>\n )}\n {rightIcon && !shouldShowPasswordToggle && (\n <div className=\"flex absolute inset-y-0 right-0 items-center pr-3 pointer-events-none\">\n <span className={cn(\"text-ews-gray-400\", iconSizes[size])}>\n {rightIcon}\n </span>\n </div>\n )}\n {shouldShowPasswordToggle && (\n <button\n type=\"button\"\n className=\"flex absolute inset-y-0 right-0 items-center pr-3\"\n onClick={() => setShowPassword(!showPassword)}\n tabIndex={-1}\n >\n <span\n className={cn(\n \"transition-colors text-ews-gray-400 hover:text-ews-gray-600\",\n iconSizes[size]\n )}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </span>\n </button>\n )}\n </div>\n {(error || helperText) && (\n <p\n className={cn(\n \"text-sm\",\n error ? \"text-ews-error\" : \"text-ews-gray-500\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n\n","import { ChevronDown, Search, X } from \"lucide-react\";\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input\";\n\nexport interface SelectOption<T = unknown> {\n value: T;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps<T = unknown> {\n /**\n * Array of options to display\n */\n options: SelectOption<T>[];\n /**\n * Current selected value\n */\n value?: T;\n /**\n * Callback when selection changes\n */\n onChange?: (value: T, option: SelectOption<T>) => void;\n /**\n * Placeholder text when no option is selected\n */\n placeholder?: string;\n /**\n * Label for the select\n */\n label?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Whether the select is in an error state\n */\n isError?: boolean;\n /**\n * Size variant\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Whether the select is disabled\n */\n disabled?: boolean;\n /**\n * Whether the select is required\n */\n required?: boolean;\n /**\n * Whether the select is searchable\n */\n searchable?: boolean;\n /**\n * Whether the select allows multiple selections\n */\n multiple?: boolean;\n /**\n * Custom class name for the select element\n */\n selectClassName?: string;\n /**\n * Custom class name for the container\n */\n containerClassName?: string;\n /**\n * Custom class name for the dropdown\n */\n dropdownClassName?: string;\n /**\n * Maximum height of the dropdown\n */\n maxHeight?: number;\n /**\n * Whether to show clear button\n */\n clearable?: boolean;\n /**\n * Custom render function for options\n */\n renderOption?: (\n option: SelectOption<T>,\n isSelected: boolean\n ) => React.ReactNode;\n /**\n * Custom render function for selected value\n */\n renderValue?: (option: SelectOption<T> | null) => React.ReactNode;\n /**\n * Custom render function for the trigger button content.\n * When provided, replaces the selected-value/placeholder area and hides\n * the built-in chevron so the trigger can render its own UI (e.g. a user\n * avatar menu).\n */\n renderTrigger?: () => React.ReactNode;\n /**\n * MED-1501: placeholder of the in-dropdown search input, so the caller can\n * translate it. Defaults to the English \"Search options...\".\n */\n searchPlaceholder?: string;\n /**\n * MED-1501: text shown when a search matches no option, so the caller can\n * translate it. Defaults to the English \"No options found\".\n */\n noOptionsFoundText?: string;\n /**\n * MED-1501: text shown when there is no option at all, so the caller can\n * translate it. Defaults to the English \"No options available\".\n */\n noOptionsAvailableText?: string;\n}\n\nconst Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n value,\n onChange,\n placeholder = \"Select an option...\",\n label,\n helperText,\n error,\n isError = false,\n size = \"md\",\n disabled = false,\n required = false,\n searchable = false,\n multiple: _multiple = false,\n selectClassName,\n containerClassName,\n dropdownClassName,\n maxHeight = 200,\n clearable = false,\n renderOption,\n renderValue,\n renderTrigger,\n searchPlaceholder = \"Search options...\",\n noOptionsFoundText = \"No options found\",\n noOptionsAvailableText = \"No options available\",\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const selectId = `select-${generatedId}`;\n const hasError = isError || !!error;\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const [dropdownPosition, setDropdownPosition] = useState<\"bottom\" | \"top\">(\n \"bottom\"\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Find selected option\n const selectedOption = options.find((option) => option.value === value);\n\n // Filter options based on search term\n const filteredOptions = searchable\n ? options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n )\n : options;\n\n // Calculate dropdown position based on available space\n const calculateDropdownPosition = useCallback(() => {\n if (!containerRef.current) return;\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n // More accurate height calculation\n const optionHeight = 40; // Approximate height per option\n const searchHeight = searchable ? 60 : 0;\n const padding = 16; // py-1 = 8px top + 8px bottom\n const dropdownHeight = Math.min(\n maxHeight,\n filteredOptions.length * optionHeight + searchHeight + padding\n );\n\n const spaceBelow = viewportHeight - containerRect.bottom;\n const spaceAbove = containerRect.top;\n\n // Add some buffer (20px) to prevent edge cases\n const buffer = 20;\n\n // If there's not enough space below but enough space above, position on top\n if (\n spaceBelow < dropdownHeight + buffer &&\n spaceAbove > dropdownHeight + buffer\n ) {\n setDropdownPosition(\"top\");\n } else {\n setDropdownPosition(\"bottom\");\n }\n }, [filteredOptions.length, searchable, maxHeight]);\n\n // Alternative calculation using actual dropdown element when available\n const calculateDropdownPositionWithElement = () => {\n if (!containerRef.current || !dropdownRef.current) return;\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const dropdownRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n const spaceBelow = viewportHeight - containerRect.bottom;\n const spaceAbove = containerRect.top;\n const actualDropdownHeight = dropdownRect.height;\n\n // If there's not enough space below but enough space above, position on top\n if (\n spaceBelow < actualDropdownHeight &&\n spaceAbove > actualDropdownHeight\n ) {\n setDropdownPosition(\"top\");\n } else {\n setDropdownPosition(\"bottom\");\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Calculate position when dropdown opens\n useEffect(() => {\n if (isOpen) {\n // First calculation based on estimated height\n calculateDropdownPosition();\n\n // Second calculation after dropdown is rendered with actual height\n requestAnimationFrame(() => {\n calculateDropdownPositionWithElement();\n });\n }\n }, [\n isOpen,\n filteredOptions.length,\n searchable,\n maxHeight,\n calculateDropdownPosition,\n ]);\n\n // Recalculate position on window resize\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) {\n calculateDropdownPosition();\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleResize);\n };\n }, [isOpen, calculateDropdownPosition]);\n\n // Handle keyboard navigation\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setFocusedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1\n );\n }\n break;\n case \"Enter\":\n event.preventDefault();\n if (\n isOpen &&\n focusedIndex >= 0 &&\n focusedIndex < filteredOptions.length\n ) {\n handleSelect(filteredOptions[focusedIndex]);\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n break;\n case \"Tab\":\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n break;\n }\n };\n\n // Handle option selection\n const handleSelect = (option: SelectOption) => {\n if (option.disabled) return;\n\n onChange?.(option.value, option);\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n };\n\n // Handle clear\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation();\n onChange?.(undefined as unknown, {} as SelectOption);\n };\n\n // Handle toggle\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n if (!isOpen && searchable) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n };\n\n // Scroll focused option into view\n useEffect(() => {\n if (focusedIndex >= 0 && optionRefs.current[focusedIndex]) {\n optionRefs.current[focusedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [focusedIndex]);\n\n const sizeClasses = {\n sm: \"text-sm px-3 py-1.5\",\n md: \"text-sm px-3 py-2\",\n lg: \"text-base px-4 py-2.5\",\n };\n\n const iconSizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n };\n\n return (\n <div className={cn(\"w-full\", containerClassName)} ref={containerRef}>\n {label && (\n <label\n htmlFor={selectId}\n className={cn(\n \"block text-sm font-medium mb-1\",\n \"text-ews-gray-700\",\n disabled && \"text-ews-gray-400\"\n )}\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {/* Custom select trigger */}\n <div\n ref={ref as React.RefObject<HTMLDivElement>}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-labelledby={label ? selectId : undefined}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleToggle}\n className={cn(\n // Base styles\n \"ews-select-trigger w-full bg-white border rounded-md shadow-sm transition-colors cursor-pointer\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-0\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-ews-gray-50\",\n\n // Size\n sizeClasses[size],\n\n // Border and focus states\n hasError\n ? \"border-ews-error focus:border-ews-error focus:ring-ews-error/20\"\n : \"border-ews-gray-300 focus:border-ews-primary focus:ring-ews-primary/20\",\n\n // Hover state\n !disabled && !hasError && \"hover:border-ews-gray-400\",\n\n // Text color\n \"text-ews-gray-900\",\n\n // Padding for icons\n \"pr-10\",\n\n selectClassName\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center\">\n {renderTrigger ? (\n renderTrigger()\n ) : (\n <>\n <div className=\"flex-1 min-w-0\">\n {selectedOption ? (\n renderValue ? (\n renderValue(selectedOption)\n ) : (\n <span className=\"truncate\">{selectedOption.label}</span>\n )\n ) : (\n <span className=\"text-ews-gray-500\">{placeholder}</span>\n )}\n </div>\n\n <div className=\"flex items-center ml-2 space-x-1\">\n {clearable && selectedOption && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"p-1 rounded hover:bg-ews-gray-100\"\n >\n <X\n className={cn(\n iconSizeClasses[size],\n \"text-ews-gray-400\"\n )}\n />\n </button>\n )}\n <ChevronDown\n className={cn(\n iconSizeClasses[size],\n hasError ? \"text-ews-error\" : \"text-ews-gray-400\",\n disabled && \"text-ews-gray-300\",\n isOpen && \"rotate-180 transition-transform\"\n )}\n />\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Custom dropdown */}\n {isOpen && (\n <div\n ref={dropdownRef}\n role=\"listbox\"\n className={cn(\n \"absolute z-50 w-full bg-white rounded-md border shadow-lg border-ews-gray-300\",\n \"focus:outline-none\",\n dropdownPosition === \"top\"\n ? \"bottom-full mb-1\"\n : \"top-full mt-1\",\n dropdownClassName\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n {/* Search input */}\n {searchable && (\n <div className=\"p-2 border-b border-ews-gray-200\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 w-4 h-4 transform -translate-y-1/2 text-ews-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={searchPlaceholder}\n leftIcon={\n <Search className=\"w-4 h-4 text-ews-gray-400\" />\n }\n />\n </div>\n </div>\n )}\n\n {/* Options list */}\n <div\n className=\"overflow-auto py-1\"\n style={{ maxHeight: `${maxHeight - (searchable ? 60 : 0)}px` }}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-ews-gray-500\">\n {searchTerm ? noOptionsFoundText : noOptionsAvailableText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = option.value === value;\n const isFocused = index === focusedIndex;\n\n return (\n <div\n key={`${String(option.value)}-${index}`}\n ref={(el) => (optionRefs.current[index] = el)}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleSelect(option)}\n className={cn(\n \"px-3 py-2 text-sm cursor-pointer transition-colors\",\n isSelected && \"bg-ews-primary text-white\",\n !isSelected && isFocused && \"bg-ews-gray-100\",\n !isSelected && !isFocused && \"hover:bg-ews-gray-50\",\n option.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {renderOption ? (\n renderOption(option, isSelected)\n ) : (\n <span className=\"truncate\">{option.label}</span>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Helper text or error message */}\n {(helperText || error) && (\n <div className=\"mt-1\">\n {error ? (\n <p className=\"text-sm text-ews-error\">{error}</p>\n ) : (\n <p className=\"text-sm text-ews-gray-500\">{helperText}</p>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\n\nexport { Select };\n","import { useEffect, useState } from \"react\";\n\nconst DEFAULT_DELAY = 500;\n\n/**\n * A custom hook that debounces a value\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (optional, defaults to 300ms)\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n const actualDelay = delay ?? DEFAULT_DELAY;\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, actualDelay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, actualDelay]);\n\n return debouncedValue;\n}\n\n/**\n * A custom hook that provides a debounced callback function\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (optional, defaults to 300ms)\n * @returns A debounced version of the callback\n */\nexport function useDebouncedCallback<T extends (...args: unknown[]) => unknown>(\n callback: T,\n delay?: number\n): T {\n const [debounceTimer, setDebounceTimer] = useState<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n const debouncedCallback = ((...args: Parameters<T>) => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n const actualDelay = delay ?? DEFAULT_DELAY;\n const newTimer = setTimeout(() => {\n callback(...args);\n }, actualDelay);\n\n setDebounceTimer(newTimer);\n }) as T;\n\n useEffect(() => {\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n };\n }, [debounceTimer]);\n\n return debouncedCallback;\n}\n","import { useEffect, useState } from \"react\";\n\nconst matches = (query: string, fallback: boolean) =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(query).matches\n : fallback;\n\n/**\n * Whether a CSS media query matches, updated when it changes. Returns\n * `defaultValue` where `matchMedia` does not exist (server rendering, old\n * test environments).\n */\nexport const useMediaQuery = (query: string, defaultValue = false): boolean => {\n const [value, setValue] = useState(() => matches(query, defaultValue));\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const list = window.matchMedia(query);\n const onChange = () => setValue(list.matches);\n onChange();\n // Safari < 14 only has addListener.\n if (list.addEventListener) {\n list.addEventListener(\"change\", onChange);\n return () => list.removeEventListener(\"change\", onChange);\n }\n list.addListener(onChange);\n return () => list.removeListener(onChange);\n }, [query]);\n\n return value;\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseIdleLockOptions {\n /** Inactivity delay before locking. Default 15 minutes. */\n timeoutMs?: number;\n /** Called each time the screen becomes locked (idle, `lock()` or another tab). */\n onLock?: () => void;\n /** localStorage key of the locked flag, also the BroadcastChannel name. */\n storageKey?: string;\n /** Turns the inactivity timer off (e.g. until the session is loaded). Default true. */\n enabled?: boolean;\n}\n\nexport interface UseIdleLockResult {\n locked: boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 900_000;\nconst DEFAULT_STORAGE_KEY = \"ews-idle-lock\";\nconst ACTIVITY_WRITE_INTERVAL_MS = 5_000;\nconst ACTIVITY_EVENTS = [\n \"pointerdown\",\n \"pointermove\",\n \"keydown\",\n \"wheel\",\n \"scroll\",\n \"touchstart\",\n] as const;\n\nconst readStorage = (key: string): string | null => {\n try {\n return typeof window === \"undefined\" ? null : window.localStorage.getItem(key);\n } catch {\n return null;\n }\n};\n\nconst writeStorage = (key: string, value: string | null) => {\n try {\n if (typeof window === \"undefined\") return;\n if (value === null) window.localStorage.removeItem(key);\n else window.localStorage.setItem(key, value);\n } catch {\n // Storage unavailable (private mode, quota): the lock still works in this tab.\n }\n};\n\n/**\n * Locks the screen after `timeoutMs` without user activity. The locked flag is\n * kept in localStorage (it survives a reload) and shared between tabs through\n * a BroadcastChannel, or the `storage` event where BroadcastChannel is missing:\n * locking or unlocking one tab does the same in every tab. Activity in any tab\n * keeps every tab unlocked.\n */\nexport function useIdleLock({\n timeoutMs = DEFAULT_TIMEOUT_MS,\n onLock,\n storageKey = DEFAULT_STORAGE_KEY,\n enabled = true,\n}: UseIdleLockOptions = {}): UseIdleLockResult {\n const activityKey = `${storageKey}:activity`;\n const [locked, setLocked] = useState(() => readStorage(storageKey) === \"1\");\n const lockedRef = useRef(locked);\n const onLockRef = useRef(onLock);\n const lastActivity = useRef(Date.now());\n const lastActivityWrite = useRef(0);\n const channelRef = useRef<{ postMessage: (message: string) => void } | null>(\n null,\n );\n\n useEffect(() => {\n onLockRef.current = onLock;\n }, [onLock]);\n\n const markActivity = useCallback(\n (now: number) => {\n lastActivity.current = now;\n if (now - lastActivityWrite.current >= ACTIVITY_WRITE_INTERVAL_MS) {\n lastActivityWrite.current = now;\n writeStorage(activityKey, String(now));\n }\n },\n [activityKey],\n );\n\n const applyLocked = useCallback((next: boolean) => {\n if (lockedRef.current === next) return;\n lockedRef.current = next;\n setLocked(next);\n if (next) onLockRef.current?.();\n }, []);\n\n const lock = useCallback(() => {\n if (lockedRef.current) return;\n writeStorage(storageKey, \"1\");\n channelRef.current?.postMessage(\"lock\");\n applyLocked(true);\n }, [storageKey, applyLocked]);\n\n const unlock = useCallback(() => {\n lastActivityWrite.current = 0;\n markActivity(Date.now());\n writeStorage(storageKey, null);\n channelRef.current?.postMessage(\"unlock\");\n applyLocked(false);\n }, [storageKey, applyLocked, markActivity]);\n\n // Cross-tab sync.\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onRemote = (nextLocked: boolean) => {\n if (!nextLocked) lastActivity.current = Date.now();\n applyLocked(nextLocked);\n };\n\n if (typeof window.BroadcastChannel === \"function\") {\n const channel = new window.BroadcastChannel(storageKey);\n channelRef.current = channel;\n channel.onmessage = (event: MessageEvent) => {\n if (event.data === \"lock\") onRemote(true);\n else if (event.data === \"unlock\") onRemote(false);\n };\n return () => {\n channelRef.current = null;\n channel.close();\n };\n }\n\n const onStorage = (event: StorageEvent) => {\n if (event.key !== storageKey) return;\n onRemote(event.newValue === \"1\");\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [storageKey, applyLocked]);\n\n // Inactivity timer.\n useEffect(() => {\n if (!enabled || locked || typeof window === \"undefined\") return;\n lastActivity.current = Date.now();\n let timer: ReturnType<typeof setTimeout>;\n\n const idleFor = () => {\n const shared = Number(readStorage(activityKey)) || 0;\n return Date.now() - Math.max(lastActivity.current, shared);\n };\n\n const check = () => {\n const idle = idleFor();\n if (idle >= timeoutMs) lock();\n else timer = setTimeout(check, timeoutMs - idle);\n };\n\n const onActivity = () => markActivity(Date.now());\n\n // Timers are throttled in background tabs: check the delay on return.\n const onVisibility = () => {\n if (document.visibilityState !== \"visible\") return;\n if (idleFor() >= timeoutMs) lock();\n else onActivity();\n };\n\n timer = setTimeout(check, timeoutMs);\n ACTIVITY_EVENTS.forEach((name) =>\n document.addEventListener(name, onActivity, { capture: true, passive: true }),\n );\n document.addEventListener(\"visibilitychange\", onVisibility);\n\n return () => {\n clearTimeout(timer);\n ACTIVITY_EVENTS.forEach((name) =>\n document.removeEventListener(name, onActivity, { capture: true }),\n );\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [enabled, locked, timeoutMs, activityKey, lock, markActivity]);\n\n return { locked, lock, unlock };\n}\n","import {\n Control,\n FieldPath,\n FieldPathValue,\n FieldValues,\n RegisterOptions,\n useController,\n} from \"react-hook-form\";\nimport { SelectOption, SelectProps } from \"../components/Select\";\n\nexport interface UseSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> {\n name: TName;\n control: Control<TFieldValues>;\n options: SelectOption[];\n rules?: Omit<\n RegisterOptions<TFieldValues, TName>,\n \"disabled\" | \"valueAsNumber\" | \"valueAsDate\" | \"setValueAs\"\n >;\n defaultValue?: FieldPathValue<TFieldValues, TName>;\n}\n\nexport function useSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n>({\n name,\n control,\n options: _options,\n rules,\n defaultValue,\n}: UseSelectFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error, invalid },\n } = useController({\n name,\n control,\n rules,\n defaultValue,\n });\n\n const selectProps: Omit<SelectProps, \"options\"> = {\n value: field.value,\n onChange: (value) => field.onChange(value),\n isError: invalid,\n error: error?.message,\n };\n\n return {\n selectProps,\n field,\n error,\n invalid,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** The subset of the Web Speech API the hook uses; browsers expose it unprefixed or as webkit*. */\ninterface SpeechRecognitionLike {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: { results: ArrayLike<ArrayLike<{ transcript: string }>> }) => void) | null;\n onerror: ((event: { error?: string }) => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\n\nconst BCP47: Record<string, string> = { fr: \"fr-FR\", en: \"en-US\", ar: \"ar-SA\" };\n\nexport function getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n if (typeof window === \"undefined\") return undefined;\n const w = window as unknown as {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n };\n return w.SpeechRecognition ?? w.webkitSpeechRecognition;\n}\n\nexport interface UseSpeechRecognitionOptions {\n /** `fr`, `en`, `ar` or a BCP 47 tag. */\n language: string;\n /** Called with the final transcript when recognition stops. */\n onResult: (transcript: string) => void;\n /** Called with interim text while the user speaks. */\n onInterim?: (transcript: string) => void;\n}\n\n/**\n * Push-to-talk on the browser speech API (MED-1783). `supported` is false on\n * the server and in browsers without the API, so the app can hide the mic.\n */\nexport function useSpeechRecognition({\n language,\n onResult,\n onInterim,\n}: UseSpeechRecognitionOptions) {\n const [supported, setSupported] = useState(false);\n const [listening, setListening] = useState(false);\n const recognitionRef = useRef<SpeechRecognitionLike | null>(null);\n const transcriptRef = useRef(\"\");\n const callbacks = useRef({ onResult, onInterim });\n callbacks.current = { onResult, onInterim };\n\n // Detected after mount: the server never has the API, and the markup must match.\n useEffect(() => {\n setSupported(getSpeechRecognition() !== undefined);\n }, []);\n\n const stop = useCallback(() => {\n recognitionRef.current?.stop();\n }, []);\n\n const start = useCallback(() => {\n const Ctor = getSpeechRecognition();\n if (!Ctor || recognitionRef.current) return;\n const recognition = new Ctor();\n recognition.lang = BCP47[language] ?? language;\n recognition.interimResults = true;\n recognition.continuous = true;\n transcriptRef.current = \"\";\n recognition.onresult = (event) => {\n let text = \"\";\n for (let i = 0; i < event.results.length; i++) {\n text += event.results[i][0]?.transcript ?? \"\";\n }\n transcriptRef.current = text.trim();\n callbacks.current.onInterim?.(transcriptRef.current);\n };\n recognition.onerror = () => {\n recognition.stop();\n };\n recognition.onend = () => {\n recognitionRef.current = null;\n setListening(false);\n if (transcriptRef.current) callbacks.current.onResult(transcriptRef.current);\n };\n recognitionRef.current = recognition;\n setListening(true);\n recognition.start();\n }, [language]);\n\n useEffect(() => () => recognitionRef.current?.abort(), []);\n\n return { supported, listening, start, stop };\n}\n","import { LucideIcon, Search, X } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useDebounce } from \"../../hooks\";\nimport { Input } from \"../Input/Input\";\n\n// Generic interface for searchable entities\nexport interface SearchableEntity {\n id: string;\n [key: string]: unknown;\n}\n\ninterface SearchAutocompleteProps<T extends SearchableEntity> {\n onSelect: (id: string, entity?: T) => void;\n selectedId: string;\n searchFunction: (keyword: string) => Promise<T[]>;\n getEntityById?: (id: string) => Promise<T | undefined>;\n getDisplayValue: (entity: T) => string;\n getSecondaryText?: (entity: T) => string | null;\n placeholder: string;\n icon?: LucideIcon;\n disabled?: boolean;\n minSearchLength?: number;\n debounceTime?: number;\n error?: string;\n /**\n * MED-1501: builds the hint appended to the placeholder while the search\n * term is still too short. Return `null` (or an empty string) to suppress\n * the hint entirely. Defaults to the English \"(min. N characters)\", so\n * callers that do not pass it keep today's placeholder.\n */\n getMinCharactersHint?: (minSearchLength: number) => string | null;\n /**\n * MED-1690: message shown when the search returns nothing. Defaults to the English\n * \"No results found. Try a different search term.\", so callers that do not pass it are unchanged.\n */\n noResultsText?: string;\n}\n\nexport function SearchAutocomplete<T extends SearchableEntity>({\n onSelect,\n selectedId,\n searchFunction,\n getEntityById,\n getDisplayValue,\n getSecondaryText,\n placeholder,\n icon = Search,\n disabled = false,\n minSearchLength = 2,\n debounceTime = 300,\n error,\n getMinCharactersHint = (min) => `(min. ${min} characters)`,\n noResultsText = \"No results found. Try a different search term.\",\n}: SearchAutocompleteProps<T>) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [entities, setEntities] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [selectedEntity, setSelectedEntity] = useState<T | null>(null);\n const [initialLoadDone, setInitialLoadDone] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const debouncedSearchTerm = useDebounce(searchTerm, debounceTime);\n\n // Track if this is an initial load or a user-initiated search\n const isUserSearch = useRef(false);\n\n // Only fetch the selected entity by ID once on initial load\n useEffect(() => {\n const fetchSelectedEntity = async () => {\n // Only fetch if we have a selectedId, getEntityById function, and haven't loaded yet\n if (!selectedId || !getEntityById || initialLoadDone) return;\n\n setIsLoading(true);\n try {\n const entity = await getEntityById(selectedId);\n if (entity) {\n setSelectedEntity(entity);\n setSearchTerm(getDisplayValue(entity));\n }\n } catch (error) {\n console.error(\"Error fetching selected entity:\", error);\n } finally {\n setIsLoading(false);\n setInitialLoadDone(true);\n }\n };\n\n fetchSelectedEntity();\n }, [selectedId, getEntityById, getDisplayValue, initialLoadDone]);\n\n // Handle search term changes - only for user-initiated searches\n useEffect(() => {\n // Skip if this is just setting the initial value\n if (!isUserSearch.current) return;\n\n // Clear entities if search term is too short\n if (searchTerm.trim().length < minSearchLength) {\n setEntities([]);\n setSearchError(null);\n }\n }, [searchTerm, minSearchLength]);\n\n // Fetch entities when debounced search term changes - only for user searches\n useEffect(() => {\n const fetchEntities = async () => {\n if (\n !debouncedSearchTerm ||\n debouncedSearchTerm.length < minSearchLength\n ) {\n return;\n }\n\n setIsLoading(true);\n setSearchError(null);\n try {\n const results = await searchFunction(debouncedSearchTerm);\n setEntities(results);\n } catch (error) {\n console.error(\"Error fetching search results:\", error);\n setSearchError(\n error instanceof Error ? error.message : \"Search failed\"\n );\n } finally {\n setIsLoading(false);\n }\n };\n\n // Only fetch if this is a user-initiated search\n if (isUserSearch.current) {\n fetchEntities();\n }\n }, [debouncedSearchTerm, searchFunction, minSearchLength]);\n\n // Handle click outside to close dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setShowDropdown(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n // Mark this as a user-initiated search\n isUserSearch.current = true;\n\n setSearchTerm(value);\n\n if (selectedEntity) {\n setSelectedEntity(null);\n onSelect(\"\");\n }\n\n setShowDropdown(value.trim().length >= minSearchLength);\n };\n\n const handleEntitySelect = (entity: T) => {\n // This is a user selection, not an API fetch\n isUserSearch.current = false;\n\n console.log(`Selected entity with ID: ${entity.id}`);\n setSelectedEntity(entity);\n setSearchTerm(getDisplayValue(entity));\n onSelect(entity.id, entity);\n setShowDropdown(false);\n };\n\n const handleClearSelection = () => {\n // This is a user action, but not a search\n isUserSearch.current = false;\n\n setSelectedEntity(null);\n setSearchTerm(\"\");\n onSelect(\"\");\n };\n\n const minCharactersHint = getMinCharactersHint(minSearchLength);\n const inputPlaceholder = minCharactersHint\n ? `${placeholder} ${minCharactersHint}`\n : placeholder;\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder={inputPlaceholder}\n value={selectedEntity ? \"\" : searchTerm}\n onChange={handleSearchChange}\n onFocus={() =>\n searchTerm.length >= minSearchLength &&\n isUserSearch.current &&\n setShowDropdown(true)\n }\n disabled={disabled}\n autoComplete=\"off\"\n name=\"search-autocomplete\"\n leftIcon={React.createElement(icon, { size: 16 })}\n />\n\n {selectedEntity && (\n <button\n type=\"button\"\n className=\"flex absolute inset-y-0 right-0 items-center pr-3\"\n onClick={handleClearSelection}\n disabled={disabled}\n >\n <X className=\"w-5 h-5 text-gray-400 hover:text-gray-500\" />\n </button>\n )}\n </div>\n\n {/* Selected Entity Display */}\n {selectedEntity && (\n <div className=\"p-4 mt-3 rounded-lg border bg-neutral-50 border-neutral-200\">\n <div className=\"flex justify-between items-center\">\n <div className=\"flex items-center\">\n {(selectedEntity as { photoUrl?: string }).photoUrl ? (\n <img\n src={(selectedEntity as { photoUrl?: string }).photoUrl!}\n alt={getDisplayValue(selectedEntity)}\n className=\"object-cover mr-3 w-10 h-10 rounded-full\"\n />\n ) : (\n React.createElement(icon, {\n className: \"w-10 h-10 text-neutral-400 mr-3\",\n })\n )}\n <div>\n <div className=\"font-medium text-neutral-900\">\n {getDisplayValue(selectedEntity)}\n </div>\n {getSecondaryText && getSecondaryText(selectedEntity) && (\n <div className=\"text-sm text-neutral-500\">\n {getSecondaryText(selectedEntity)}\n </div>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleClearSelection}\n className=\"transition-colors text-neutral-400 hover:text-neutral-600\"\n disabled={disabled}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n )}\n\n {showDropdown && entities?.length > 0 && (\n <div className=\"overflow-auto absolute z-10 mt-1 w-full max-h-60 bg-white rounded-md shadow-lg\">\n <ul className=\"py-1\">\n {entities.map((entity) => (\n <li\n key={entity.id}\n className=\"px-4 py-2 cursor-pointer hover:bg-gray-100\"\n onClick={() => handleEntitySelect(entity)}\n >\n <div className=\"flex items-center\">\n {React.createElement(icon, {\n className: \"w-4 h-4 text-gray-400\",\n })}\n <div className=\"ml-2\">\n <div className=\"font-medium\">{getDisplayValue(entity)}</div>\n {getSecondaryText && getSecondaryText(entity) && (\n <div className=\"text-xs text-gray-500\">\n {getSecondaryText(entity)}\n </div>\n )}\n </div>\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {showDropdown && searchError && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-red-600 bg-white rounded-md border border-red-200 shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n Error: {searchError}\n </div>\n </div>\n )}\n\n {showDropdown && error && !searchError && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-red-600 bg-white rounded-md border border-red-200 shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {showDropdown &&\n debouncedSearchTerm &&\n entities?.length === 0 &&\n !isLoading &&\n !searchError &&\n !error && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-gray-500 bg-white rounded-md shadow-lg\">\n {debouncedSearchTerm.length < minSearchLength\n ? `Type at least ${minSearchLength} characters to search`\n : noResultsText}\n </div>\n )}\n\n {isLoading && showDropdown && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-gray-500 bg-white rounded-md shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <div className=\"mr-2 w-4 h-4 rounded-full border-b-2 animate-spin border-ews-primary\"></div>\n Loading...\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { Check, Search, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useDebounce } from \"../../hooks\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input/Input\";\nimport { SearchableEntity } from \"../SearchAutocomplete/SearchAutocomplete\";\n\ninterface MultiSearchAutocompleteProps<T extends SearchableEntity> {\n items: T[];\n selectedItems: T[];\n onSelectionChange: (items: T[]) => void;\n onSearch: (searchTerm: string) => Promise<void>;\n getEntityById?: (id: string) => Promise<T | undefined>;\n getPrimaryText: (entity: T) => string;\n getSecondaryText?: (entity: T) => string | null;\n placeholder: string;\n disabled?: boolean;\n loading?: boolean;\n multiple?: boolean;\n className?: string;\n renderSelectedItem?: (entity: T) => React.ReactNode;\n renderListItem?: (entity: T, isSelected: boolean) => React.ReactNode;\n keepOpenOnSelect?: boolean;\n error?: string;\n minSearchLength?: number;\n debounceTime?: number;\n}\n\nexport function MultiSearchAutocomplete<T extends SearchableEntity>({\n items,\n selectedItems,\n onSelectionChange,\n onSearch,\n getEntityById: _getEntityById,\n getPrimaryText,\n getSecondaryText,\n placeholder,\n disabled = false,\n loading = false,\n multiple = true,\n className,\n renderSelectedItem,\n renderListItem,\n keepOpenOnSelect = true,\n error,\n minSearchLength = 2,\n debounceTime = 300,\n}: MultiSearchAutocompleteProps<T>) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const [filteredItems, setFilteredItems] = useState<T[]>(items);\n const [isSearching, setIsSearching] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const debouncedSearchTerm = useDebounce(searchTerm, debounceTime);\n\n // Handle search term changes\n useEffect(() => {\n // If search term is empty, show all items\n if (!searchTerm.trim()) {\n setFilteredItems(items);\n setSearchError(null);\n return;\n }\n\n // If search term is too short, don't search\n if (searchTerm.length < minSearchLength) {\n setFilteredItems([]);\n setSearchError(null);\n return;\n }\n }, [searchTerm, items, minSearchLength]);\n\n // Debounced search with API calls\n useEffect(() => {\n // If debounced search term is empty or too short, don't search\n if (\n !debouncedSearchTerm.trim() ||\n debouncedSearchTerm.length < minSearchLength\n ) {\n return;\n }\n\n const performSearch = async () => {\n try {\n setIsSearching(true);\n setSearchError(null);\n await onSearch(debouncedSearchTerm);\n } catch (err) {\n setSearchError(err instanceof Error ? err.message : \"Search failed\");\n } finally {\n setIsSearching(false);\n }\n };\n\n performSearch();\n }, [debouncedSearchTerm, onSearch, minSearchLength]);\n\n // Update filtered items when items prop changes\n useEffect(() => {\n setFilteredItems(items);\n }, [items]);\n\n const handleItemToggle = useCallback(\n (item: T) => {\n if (multiple) {\n const isSelected = selectedItems.some(\n (selected) => selected.id === item.id\n );\n\n if (isSelected) {\n onSelectionChange(\n selectedItems.filter((selected) => selected.id !== item.id)\n );\n } else {\n onSelectionChange([...selectedItems, item]);\n }\n // Keep dropdown open for multiple selection\n if (keepOpenOnSelect) {\n setIsOpen(true);\n }\n } else {\n onSelectionChange([item]);\n setIsOpen(false);\n }\n },\n [selectedItems, onSelectionChange, multiple, keepOpenOnSelect]\n );\n\n const handleRemoveItem = useCallback(\n (itemToRemove: T) => {\n onSelectionChange(\n selectedItems.filter((item) => item.id !== itemToRemove.id)\n );\n },\n [selectedItems, onSelectionChange]\n );\n\n const handleInputFocus = () => {\n if (!disabled) {\n setIsOpen(true);\n }\n };\n\n const handleInputBlur = () => {\n // Don't close immediately to allow for clicks on dropdown items\n // Only close if keepOpenOnSelect is false\n if (!keepOpenOnSelect) {\n setTimeout(() => setIsOpen(false), 150);\n }\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscapeKey);\n };\n }, [isOpen]);\n\n // Default render functions\n const defaultRenderSelectedItem = (entity: T) => (\n <span className=\"inline-flex items-center px-3 py-1 text-sm font-medium rounded-full border bg-ews-primary/10 text-ews-primary border-ews-primary/20\">\n {getPrimaryText(entity)}\n <button\n type=\"button\"\n onClick={() => handleRemoveItem(entity)}\n className=\"ml-2 text-ews-primary/60 hover:text-ews-primary\"\n disabled={disabled}\n title=\"Remove item\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n );\n\n const defaultRenderListItem = (entity: T, isSelected: boolean) => (\n <div className=\"flex items-center space-x-3\">\n <div\n className={cn(\n \"flex justify-center items-center w-5 h-5 rounded border-2\",\n isSelected\n ? \"bg-ews-primary border-ews-primary\"\n : \"border-ews-gray-300\"\n )}\n >\n {isSelected && <Check className=\"w-3 h-3 text-white\" />}\n </div>\n <div className=\"flex flex-col\">\n <span\n className={cn(\n \"font-medium\",\n isSelected ? \"text-ews-primary\" : \"text-gray-900\"\n )}\n >\n {getPrimaryText(entity)}\n </span>\n {getSecondaryText && (\n <span\n className={cn(\n \"text-sm\",\n isSelected ? \"text-ews-primary/70\" : \"text-gray-500\"\n )}\n >\n {getSecondaryText(entity)}\n </span>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={cn(\"relative\", className)} ref={dropdownRef}>\n {/* Selected items display */}\n {selectedItems.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {selectedItems.map((item) => (\n <div key={item.id}>\n {renderSelectedItem\n ? renderSelectedItem(item)\n : defaultRenderSelectedItem(item)}\n </div>\n ))}\n </div>\n )}\n\n {/* Search input */}\n <Input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n disabled={disabled}\n leftIcon={<Search className=\"w-4 h-4\" />}\n className=\"w-full\"\n />\n\n {/* Dropdown */}\n {isOpen && !disabled && (\n <div className=\"overflow-auto absolute z-10 mt-1 w-full max-h-60 bg-white rounded-lg border border-gray-200 shadow-lg\">\n {loading || isSearching ? (\n <div className=\"flex items-center px-4 py-3 text-sm text-gray-500\">\n <div className=\"mr-2 w-4 h-4 rounded-full border-b-2 animate-spin border-ews-primary\"></div>\n {isSearching ? \"Searching...\" : \"Loading...\"}\n </div>\n ) : searchError ? (\n <div className=\"px-4 py-3 text-sm text-red-600\">\n <div className=\"flex items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n Error: {searchError}\n </div>\n </div>\n ) : error ? (\n <div className=\"px-4 py-3 text-sm text-red-600\">\n <div className=\"flex items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n {error}\n </div>\n </div>\n ) : filteredItems.length === 0 ? (\n <div className=\"px-4 py-3 text-sm text-gray-500\">\n {searchTerm.length < minSearchLength\n ? `Type at least ${minSearchLength} characters to search`\n : \"No items found\"}\n </div>\n ) : (\n <div className=\"py-1\">\n {filteredItems.map((item) => {\n const isSelected = selectedItems.some(\n (selected) => selected.id === item.id\n );\n\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleItemToggle(item)}\n className={cn(\n \"flex items-center px-4 py-3 w-full text-left transition-colors\",\n isSelected\n ? \"border-l-4 bg-ews-primary/10 text-ews-primary border-ews-primary\"\n : \"text-gray-900 hover:bg-ews-primary/5\"\n )}\n >\n {renderListItem\n ? renderListItem(item, isSelected)\n : defaultRenderListItem(item, isSelected)}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { AlertCircle, AlertTriangle, CheckCircle, X } from \"lucide-react\";\nimport React, { useEffect } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ErrorField {\n name: string;\n message: string;\n path?: string;\n}\n\nexport interface ErrorObject {\n code: string;\n message: string;\n fields?: ErrorField[];\n}\n\nexport interface ModalProps {\n /**\n * Whether the modal is open\n */\n isOpen: boolean;\n /**\n * Function to call when modal should be closed\n */\n onClose: () => void;\n /**\n * Modal title\n */\n title: string;\n /**\n * Modal content/description\n */\n children?: React.ReactNode;\n /**\n * Modal variant\n */\n variant?: \"error\" | \"warning\" | \"confirmation\" | \"info\";\n /**\n * Modal size/width\n */\n size?:\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"5xl\"\n | \"6xl\"\n | \"7xl\"\n | \"8xl\"\n | \"9xl\"\n | \"10xl\"\n | \"full\";\n /**\n * Primary action button text\n */\n primaryAction?: string;\n /**\n * Secondary action button text\n */\n secondaryAction?: string;\n /**\n * Function to call when primary action is clicked\n */\n onPrimaryAction?: () => void;\n /**\n * Function to call when secondary action is clicked\n */\n onSecondaryAction?: () => void;\n /**\n * Whether the primary action button is loading\n */\n isLoading?: boolean;\n /**\n * Whether the modal can be closed by clicking outside or pressing escape\n */\n closeOnOverlayClick?: boolean;\n /**\n * Custom className for the modal\n */\n className?: string;\n /**\n * Custom className for the content\n */\n contentClassName?: string;\n /**\n * Error object for error modals\n */\n error?: ErrorObject;\n}\n\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n variant = \"info\",\n size = \"md\",\n primaryAction,\n secondaryAction,\n onPrimaryAction,\n onSecondaryAction,\n isLoading = false,\n closeOnOverlayClick = true,\n className,\n contentClassName,\n error,\n}: ModalProps) => {\n // Handle escape key press\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n // Prevent body scroll when modal is open\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"unset\";\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const getVariantStyles = () => {\n switch (variant) {\n case \"error\":\n return {\n icon: <AlertCircle className=\"w-6 h-6 text-ews-error\" />,\n iconBg: \"bg-ews-error/10\",\n titleColor: \"text-ews-error\",\n borderColor: \"border-ews-error/20\",\n };\n case \"warning\":\n return {\n icon: <AlertTriangle className=\"w-6 h-6 text-ews-warning\" />,\n iconBg: \"bg-ews-warning/10\",\n titleColor: \"text-ews-warning\",\n borderColor: \"border-ews-warning/20\",\n };\n case \"confirmation\":\n return {\n icon: <CheckCircle className=\"w-6 h-6 text-ews-success\" />,\n iconBg: \"bg-ews-success/10\",\n titleColor: \"text-ews-success\",\n borderColor: \"border-ews-success/20\",\n };\n default:\n return {\n icon: <AlertCircle className=\"w-6 h-6 text-ews-primary\" />,\n iconBg: \"bg-ews-primary/10\",\n titleColor: \"text-ews-primary\",\n borderColor: \"border-ews-primary/20\",\n };\n }\n };\n\n const variantStyles = getVariantStyles();\n\n const getSizeClasses = () => {\n const sizeMap = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n \"2xl\": \"max-w-2xl\",\n \"3xl\": \"max-w-3xl\",\n \"4xl\": \"max-w-4xl\",\n \"5xl\": \"max-w-5xl\",\n \"6xl\": \"max-w-6xl\",\n \"7xl\": \"max-w-7xl\",\n \"8xl\": \"max-w-8xl\",\n \"9xl\": \"max-w-9xl\",\n \"10xl\": \"max-w-10xl\",\n full: \"max-w-full\",\n };\n return sizeMap[size] || sizeMap.md;\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && closeOnOverlayClick) {\n onClose();\n }\n };\n\n return (\n <div className=\"flex fixed inset-0 z-50 justify-center items-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 backdrop-blur-sm bg-black/50\"\n onClick={handleOverlayClick}\n />\n\n {/* Modal */}\n <div\n className={cn(\n \"relative w-full bg-white rounded-lg shadow-xl transition-all transform\",\n \"duration-200 animate-in fade-in-0 zoom-in-95\",\n getSizeClasses(),\n \"mx-4\",\n className,\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"modal-title\"\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center justify-between p-6 border-b\",\n variantStyles.borderColor,\n )}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={cn(\"p-2 rounded-full\", variantStyles.iconBg)}>\n {variantStyles.icon}\n </div>\n <h2\n id=\"modal-title\"\n className={cn(\"text-lg font-semibold\", variantStyles.titleColor)}\n >\n {title}\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 text-gray-400 transition-colors hover:text-gray-600\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className={cn(\"p-6\", contentClassName)}>\n <div className=\"leading-relaxed text-gray-700\">\n {error && variant === \"error\" ? (\n <div className=\"space-y-3\">\n <p>{error.message}</p>\n {error.fields && error.fields.length > 0 && (\n <div>\n <p className=\"font-semibold text-gray-900\">\n Erreurs de champ:\n </p>\n <ul className=\"mt-2 space-y-1\">\n {error.fields.map((field, index) => (\n <li key={index} className=\"text-ews-error\">\n • {field.path}: {field.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ) : (\n children\n )}\n </div>\n </div>\n\n {/* Actions */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex justify-end items-center p-6 pt-0 space-x-3\">\n {secondaryAction && (\n <Button\n variant=\"outline\"\n onClick={onSecondaryAction || onClose}\n disabled={isLoading}\n >\n {secondaryAction}\n </Button>\n )}\n {primaryAction && (\n <Button\n variant={variant === \"error\" ? \"error\" : \"ews-primary\"}\n onClick={onPrimaryAction}\n loading={isLoading}\n >\n {primaryAction}\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { Modal };\n","import { Pencil, Trash } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"../../utils\";\nimport { Modal } from \"../Modal/Modal\";\n\nconst ACCEPTED_MIME_TYPES = [\"image/jpeg\", \"image/png\", \"image/webp\"] as const;\nexport type AcceptedImageMimeType = (typeof ACCEPTED_MIME_TYPES)[number];\n\nexport interface ProfileImageUploadProps {\n /** Current image URL — pass your default placeholder URL when no custom image is set */\n imageUrl: string;\n /** Alt text for accessibility */\n altText: string;\n /** Disable editing */\n readOnly?: boolean;\n /** Avatar diameter */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Upload progress 0–100.\n * Progress bar is hidden when 0; auto-hides 1 s after reaching 100.\n */\n uploadProgress?: number;\n /**\n * When true the progress bar stays visible in an indeterminate (pulsing)\n * state for phases with no measurable progress (pre-upload / post-upload).\n * The bar auto-hides 1 s after both `isLoading` is false and progress reached 100.\n */\n isLoading?: boolean;\n /**\n * Whether to show the delete button.\n * Pass `false` when `imageUrl` is a default/fallback image.\n */\n showDeleteButton?: boolean;\n /**\n * Accepted MIME types (default: JPEG, PNG, WEBP).\n * Used for both the file-input `accept` attribute and client-side validation.\n */\n acceptedFormats?: AcceptedImageMimeType[];\n /** Max allowed file size in MB (default: 5) */\n maxFileSizeMB?: number;\n /**\n * Optional aspect-ratio hint shown below the avatar (e.g. \"1:1\", \"4:3\").\n * Pure informational — no cropping is enforced client-side.\n */\n aspectRatioHint?: string;\n /** Called with the validated File once the user picks an acceptable file */\n onFileSelect: (file: File) => void;\n /** Called when the selected file exceeds `maxFileSizeMB` */\n onFileSizeExceeded?: () => void;\n /** Called when the selected file's MIME type is not in `acceptedFormats` */\n onInvalidFormat?: () => void;\n /** Called when the user confirms deletion in the modal */\n onDeleteConfirm: () => void;\n /** Deletion confirmation modal — title text */\n deleteConfirmTitle: string;\n /** Deletion confirmation modal — body text */\n deleteConfirmMessage: string;\n /** Deletion confirmation modal — primary button label */\n deleteConfirmLabel: string;\n /** Deletion confirmation modal — secondary / cancel label */\n cancelLabel: string;\n}\n\nconst SIZE_CLASSES: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: \"h-10 w-10\",\n md: \"h-16 w-16\",\n lg: \"h-32 w-32\",\n};\n\nconst INDICATOR_CLASSES: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: \"h-2 w-2\",\n md: \"h-4 w-4\",\n lg: \"h-8 w-8\",\n};\n\nfunction UploadProgressBar({\n progress,\n isLoading,\n}: {\n progress: number;\n isLoading?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (isLoading) {\n setVisible(true);\n return;\n }\n // isLoading just turned false\n if (progress >= 100) {\n setVisible(true);\n const t = setTimeout(() => setVisible(false), 1000);\n return () => clearTimeout(t);\n }\n // Legacy path (no isLoading prop): driven purely by progress\n if (progress > 0 && progress < 100) {\n setVisible(true);\n return;\n }\n setVisible(false);\n }, [progress, isLoading]);\n\n if (!visible) return null;\n\n const indeterminate = isLoading && progress === 0;\n\n return (\n <div className=\"mt-2 h-1.5 w-32 rounded-full bg-gray-200\">\n <div\n className={cn(\n \"h-full rounded-full bg-ews-primary transition-all duration-300\",\n indeterminate && \"animate-pulse\"\n )}\n style={{ width: indeterminate ? \"35%\" : `${progress}%` }}\n />\n </div>\n );\n}\n\nexport const ProfileImageUpload: React.FC<ProfileImageUploadProps> = ({\n imageUrl,\n altText,\n readOnly = false,\n size = \"lg\",\n uploadProgress = 0,\n isLoading = false,\n showDeleteButton = true,\n acceptedFormats = [...ACCEPTED_MIME_TYPES],\n maxFileSizeMB = 5,\n aspectRatioHint,\n onFileSelect,\n onFileSizeExceeded,\n onInvalidFormat,\n onDeleteConfirm,\n deleteConfirmTitle,\n deleteConfirmMessage,\n deleteConfirmLabel,\n cancelLabel,\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isHovered, setIsHovered] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const acceptAttr = acceptedFormats.join(\",\");\n\n const handleEditClick = () => fileInputRef.current?.click();\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (acceptedFormats.indexOf(file.type as AcceptedImageMimeType) === -1) {\n onInvalidFormat?.();\n e.target.value = \"\";\n return;\n }\n\n if (file.size > maxFileSizeMB * 1024 * 1024) {\n onFileSizeExceeded?.();\n e.target.value = \"\";\n return;\n }\n\n onFileSelect(file);\n e.target.value = \"\";\n };\n\n const handleConfirmDelete = () => {\n setShowConfirm(false);\n onDeleteConfirm();\n };\n\n return (\n <>\n <div className=\"inline-flex flex-col items-center\">\n <div\n className=\"relative\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <img\n src={imageUrl}\n alt={altText}\n className={cn(\n \"rounded-full border-4 border-white object-cover\",\n SIZE_CLASSES[size]\n )}\n />\n\n {/* Online status dot */}\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-4 border-white bg-green-400\",\n INDICATOR_CLASSES[size]\n )}\n />\n\n <input\n type=\"file\"\n ref={fileInputRef}\n accept={acceptAttr}\n className=\"hidden\"\n onChange={handleFileChange}\n />\n\n {isHovered && !readOnly && !isLoading && (\n <>\n {/* Edit / upload button */}\n <button\n type=\"button\"\n onClick={handleEditClick}\n className=\"absolute left-0 top-0 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-ews-primary transition-colors hover:bg-ews-secondary\"\n aria-label=\"Edit profile image\"\n >\n <Pencil className=\"h-4 w-4 text-white\" />\n </button>\n\n {/* Delete button — only when not a fallback/default image */}\n {showDeleteButton && (\n <button\n type=\"button\"\n onClick={() => setShowConfirm(true)}\n className=\"absolute left-0 top-10 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-red-600 transition-colors hover:bg-red-700\"\n aria-label=\"Delete profile image\"\n >\n <Trash className=\"h-4 w-4 text-white\" />\n </button>\n )}\n </>\n )}\n </div>\n\n <UploadProgressBar progress={uploadProgress} isLoading={isLoading} />\n\n {aspectRatioHint && (\n <p className=\"mt-1 text-xs text-gray-400\">Ratio: {aspectRatioHint}</p>\n )}\n </div>\n\n {/* Delete confirmation */}\n <Modal\n isOpen={showConfirm}\n onClose={() => setShowConfirm(false)}\n title={deleteConfirmTitle}\n variant=\"error\"\n size=\"sm\"\n primaryAction={deleteConfirmLabel}\n secondaryAction={cancelLabel}\n onPrimaryAction={handleConfirmDelete}\n onSecondaryAction={() => setShowConfirm(false)}\n >\n <p>{deleteConfirmMessage}</p>\n </Modal>\n </>\n );\n};\n","/**\n * Copyright 2004-present Facebook. All Rights Reserved.\n *\n * @providesModule UserAgent_DEPRECATED\n */\n\n/**\n * Provides entirely client-side User Agent and OS detection. You should prefer\n * the non-deprecated UserAgent module when possible, which exposes our\n * authoritative server-side PHP-based detection to the client.\n *\n * Usage is straightforward:\n *\n * if (UserAgent_DEPRECATED.ie()) {\n * // IE\n * }\n *\n * You can also do version checks:\n *\n * if (UserAgent_DEPRECATED.ie() >= 7) {\n * // IE7 or better\n * }\n *\n * The browser functions will return NaN if the browser does not match, so\n * you can also do version compares the other way:\n *\n * if (UserAgent_DEPRECATED.ie() < 7) {\n * // IE6 or worse\n * }\n *\n * Note that the version is a float and may include a minor version number,\n * so you should always use range operators to perform comparisons, not\n * strict equality.\n *\n * **Note:** You should **strongly** prefer capability detection to browser\n * version detection where it's reasonable:\n *\n * http://www.quirksmode.org/js/support.html\n *\n * Further, we have a large number of mature wrapper functions and classes\n * which abstract away many browser irregularities. Check the documentation,\n * grep for things, or ask on javascript@lists.facebook.com before writing yet\n * another copy of \"event || window.event\".\n *\n */\n\nvar _populated = false;\n\n// Browsers\nvar _ie, _firefox, _opera, _webkit, _chrome;\n\n// Actual IE browser for compatibility mode\nvar _ie_real_version;\n\n// Platforms\nvar _osx, _windows, _linux, _android;\n\n// Architectures\nvar _win64;\n\n// Devices\nvar _iphone, _ipad, _native;\n\nvar _mobile;\n\nfunction _populate() {\n if (_populated) {\n return;\n }\n\n _populated = true;\n\n // To work around buggy JS libraries that can't handle multi-digit\n // version numbers, Opera 10's user agent string claims it's Opera\n // 9, then later includes a Version/X.Y field:\n //\n // Opera/9.80 (foo) Presto/2.2.15 Version/10.10\n var uas = navigator.userAgent;\n var agent = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))|(?:Trident\\/\\d+\\.\\d+.*rv:(\\d+\\.\\d+))/.exec(uas);\n var os = /(Mac OS X)|(Windows)|(Linux)/.exec(uas);\n\n _iphone = /\\b(iPhone|iP[ao]d)/.exec(uas);\n _ipad = /\\b(iP[ao]d)/.exec(uas);\n _android = /Android/i.exec(uas);\n _native = /FBAN\\/\\w+;/i.exec(uas);\n _mobile = /Mobile/i.exec(uas);\n\n // Note that the IE team blog would have you believe you should be checking\n // for 'Win64; x64'. But MSDN then reveals that you can actually be coming\n // from either x64 or ia64; so ultimately, you should just check for Win64\n // as in indicator of whether you're in 64-bit IE. 32-bit IE on 64-bit\n // Windows will send 'WOW64' instead.\n _win64 = !!(/Win64/.exec(uas));\n\n if (agent) {\n _ie = agent[1] ? parseFloat(agent[1]) : (\n agent[5] ? parseFloat(agent[5]) : NaN);\n // IE compatibility mode\n if (_ie && document && document.documentMode) {\n _ie = document.documentMode;\n }\n // grab the \"true\" ie version from the trident token if available\n var trident = /(?:Trident\\/(\\d+.\\d+))/.exec(uas);\n _ie_real_version = trident ? parseFloat(trident[1]) + 4 : _ie;\n\n _firefox = agent[2] ? parseFloat(agent[2]) : NaN;\n _opera = agent[3] ? parseFloat(agent[3]) : NaN;\n _webkit = agent[4] ? parseFloat(agent[4]) : NaN;\n if (_webkit) {\n // We do not add the regexp to the above test, because it will always\n // match 'safari' only since 'AppleWebKit' appears before 'Chrome' in\n // the userAgent string.\n agent = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(uas);\n _chrome = agent && agent[1] ? parseFloat(agent[1]) : NaN;\n } else {\n _chrome = NaN;\n }\n } else {\n _ie = _firefox = _opera = _chrome = _webkit = NaN;\n }\n\n if (os) {\n if (os[1]) {\n // Detect OS X version. If no version number matches, set _osx to true.\n // Version examples: 10, 10_6_1, 10.7\n // Parses version number as a float, taking only first two sets of\n // digits. If only one set of digits is found, returns just the major\n // version number.\n var ver = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(uas);\n\n _osx = ver ? parseFloat(ver[1].replace('_', '.')) : true;\n } else {\n _osx = false;\n }\n _windows = !!os[2];\n _linux = !!os[3];\n } else {\n _osx = _windows = _linux = false;\n }\n}\n\nvar UserAgent_DEPRECATED = {\n\n /**\n * Check if the UA is Internet Explorer.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n ie: function() {\n return _populate() || _ie;\n },\n\n /**\n * Check if we're in Internet Explorer compatibility mode.\n *\n * @return bool true if in compatibility mode, false if\n * not compatibility mode or not ie\n */\n ieCompatibilityMode: function() {\n return _populate() || (_ie_real_version > _ie);\n },\n\n\n /**\n * Whether the browser is 64-bit IE. Really, this is kind of weak sauce; we\n * only need this because Skype can't handle 64-bit IE yet. We need to remove\n * this when we don't need it -- tracked by #601957.\n */\n ie64: function() {\n return UserAgent_DEPRECATED.ie() && _win64;\n },\n\n /**\n * Check if the UA is Firefox.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n firefox: function() {\n return _populate() || _firefox;\n },\n\n\n /**\n * Check if the UA is Opera.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n opera: function() {\n return _populate() || _opera;\n },\n\n\n /**\n * Check if the UA is WebKit.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n webkit: function() {\n return _populate() || _webkit;\n },\n\n /**\n * For Push\n * WILL BE REMOVED VERY SOON. Use UserAgent_DEPRECATED.webkit\n */\n safari: function() {\n return UserAgent_DEPRECATED.webkit();\n },\n\n /**\n * Check if the UA is a Chrome browser.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n chrome : function() {\n return _populate() || _chrome;\n },\n\n\n /**\n * Check if the user is running Windows.\n *\n * @return bool `true' if the user's OS is Windows.\n */\n windows: function() {\n return _populate() || _windows;\n },\n\n\n /**\n * Check if the user is running Mac OS X.\n *\n * @return float|bool Returns a float if a version number is detected,\n * otherwise true/false.\n */\n osx: function() {\n return _populate() || _osx;\n },\n\n /**\n * Check if the user is running Linux.\n *\n * @return bool `true' if the user's OS is some flavor of Linux.\n */\n linux: function() {\n return _populate() || _linux;\n },\n\n /**\n * Check if the user is running on an iPhone or iPod platform.\n *\n * @return bool `true' if the user is running some flavor of the\n * iPhone OS.\n */\n iphone: function() {\n return _populate() || _iphone;\n },\n\n mobile: function() {\n return _populate() || (_iphone || _ipad || _android || _mobile);\n },\n\n nativeApp: function() {\n // webviews inside of the native apps\n return _populate() || _native;\n },\n\n android: function() {\n return _populate() || _android;\n },\n\n ipad: function() {\n return _populate() || _ipad;\n }\n};\n\nmodule.exports = UserAgent_DEPRECATED;\n","/**\n * Copyright (c) 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ExecutionEnvironment\n */\n\n/*jslint evil: true */\n\n'use strict';\n\nvar canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n canUseDOM: canUseDOM,\n\n canUseWorkers: typeof Worker !== 'undefined',\n\n canUseEventListeners:\n canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n canUseViewport: canUseDOM && !!window.screen,\n\n isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isEventSupported\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n useHasFeature =\n document.implementation &&\n document.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n if (!ExecutionEnvironment.canUseDOM ||\n capture && !('addEventListener' in document)) {\n return false;\n }\n\n var eventName = 'on' + eventNameSuffix;\n var isSupported = eventName in document;\n\n if (!isSupported) {\n var element = document.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\n\nmodule.exports = isEventSupported;\n","/**\n * Copyright (c) 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule normalizeWheel\n * @typechecks\n */\n\n'use strict';\n\nvar UserAgent_DEPRECATED = require('./UserAgent_DEPRECATED');\n\nvar isEventSupported = require('./isEventSupported');\n\n\n// Reasonable defaults\nvar PIXEL_STEP = 10;\nvar LINE_HEIGHT = 40;\nvar PAGE_HEIGHT = 800;\n\n/**\n * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is\n * complicated, thus this doc is long and (hopefully) detailed enough to answer\n * your questions.\n *\n * If you need to react to the mouse wheel in a predictable way, this code is\n * like your bestest friend. * hugs *\n *\n * As of today, there are 4 DOM event types you can listen to:\n *\n * 'wheel' -- Chrome(31+), FF(17+), IE(9+)\n * 'mousewheel' -- Chrome, IE(6+), Opera, Safari\n * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother!\n * 'DOMMouseScroll' -- FF(0.9.7+) since 2003\n *\n * So what to do? The is the best:\n *\n * normalizeWheel.getEventType();\n *\n * In your event callback, use this code to get sane interpretation of the\n * deltas. This code will return an object with properties:\n *\n * spinX -- normalized spin speed (use for zoom) - x plane\n * spinY -- \" - y plane\n * pixelX -- normalized distance (to pixels) - x plane\n * pixelY -- \" - y plane\n *\n * Wheel values are provided by the browser assuming you are using the wheel to\n * scroll a web page by a number of lines or pixels (or pages). Values can vary\n * significantly on different platforms and browsers, forgetting that you can\n * scroll at different speeds. Some devices (like trackpads) emit more events\n * at smaller increments with fine granularity, and some emit massive jumps with\n * linear speed or acceleration.\n *\n * This code does its best to normalize the deltas for you:\n *\n * - spin is trying to normalize how far the wheel was spun (or trackpad\n * dragged). This is super useful for zoom support where you want to\n * throw away the chunky scroll steps on the PC and make those equal to\n * the slow and smooth tiny steps on the Mac. Key data: This code tries to\n * resolve a single slow step on a wheel to 1.\n *\n * - pixel is normalizing the desired scroll delta in pixel units. You'll\n * get the crazy differences between browsers, but at least it'll be in\n * pixels!\n *\n * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This\n * should translate to positive value zooming IN, negative zooming OUT.\n * This matches the newer 'wheel' event.\n *\n * Why are there spinX, spinY (or pixels)?\n *\n * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn\n * with a mouse. It results in side-scrolling in the browser by default.\n *\n * - spinY is what you expect -- it's the classic axis of a mouse wheel.\n *\n * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and\n * probably is by browsers in conjunction with fancy 3D controllers .. but\n * you know.\n *\n * Implementation info:\n *\n * Examples of 'wheel' event if you scroll slowly (down) by one step with an\n * average mouse:\n *\n * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)\n * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)\n * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)\n * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)\n * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)\n *\n * On the trackpad:\n *\n * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)\n * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)\n *\n * On other/older browsers.. it's more complicated as there can be multiple and\n * also missing delta values.\n *\n * The 'wheel' event is more standard:\n *\n * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n *\n * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and\n * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain\n * backward compatibility with older events. Those other values help us\n * better normalize spin speed. Example of what the browsers provide:\n *\n * | event.wheelDelta | event.detail\n * ------------------+------------------+--------------\n * Safari v5/OS X | -120 | 0\n * Safari v5/Win7 | -120 | 0\n * Chrome v17/OS X | -120 | 0\n * Chrome v17/Win7 | -120 | 0\n * IE9/Win7 | -120 | undefined\n * Firefox v4/OS X | undefined | 1\n * Firefox v4/Win7 | undefined | 3\n *\n */\nfunction normalizeWheel(/*object*/ event) /*object*/ {\n var sX = 0, sY = 0, // spinX, spinY\n pX = 0, pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in event) { sY = event.detail; }\n if ('wheelDelta' in event) { sY = -event.wheelDelta / 120; }\n if ('wheelDeltaY' in event) { sY = -event.wheelDeltaY / 120; }\n if ('wheelDeltaX' in event) { sX = -event.wheelDeltaX / 120; }\n\n // side scrolling on FF with DOMMouseScroll\n if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in event) { pY = event.deltaY; }\n if ('deltaX' in event) { pX = event.deltaX; }\n\n if ((pX || pY) && event.deltaMode) {\n if (event.deltaMode == 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) { sX = (pX < 1) ? -1 : 1; }\n if (pY && !sY) { sY = (pY < 1) ? -1 : 1; }\n\n return { spinX : sX,\n spinY : sY,\n pixelX : pX,\n pixelY : pY };\n}\n\n\n/**\n * The best combination if you prefer spinX + spinY normalization. It favors\n * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with\n * 'wheel' event, making spin speed determination impossible.\n */\nnormalizeWheel.getEventType = function() /*string*/ {\n return (UserAgent_DEPRECATED.firefox())\n ? 'DOMMouseScroll'\n : (isEventSupported('wheel'))\n ? 'wheel'\n : 'mousewheel';\n};\n\nmodule.exports = normalizeWheel;\n","module.exports = require('./src/normalizeWheel.js');\n","import * as React from \"react\";\nimport normalizeWheel from \"normalize-wheel\";\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/typeof.js\nfunction _typeof(o) {\n\t\"@babel/helpers - typeof\";\n\treturn _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(o) {\n\t\treturn typeof o;\n\t} : function(o) {\n\t\treturn o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n\t}, _typeof(o);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/toPrimitive.js\nfunction toPrimitive(t, r) {\n\tif (\"object\" != _typeof(t) || !t) return t;\n\tvar e = t[Symbol.toPrimitive];\n\tif (void 0 !== e) {\n\t\tvar i = e.call(t, r || \"default\");\n\t\tif (\"object\" != _typeof(i)) return i;\n\t\tthrow new TypeError(\"@@toPrimitive must return a primitive value.\");\n\t}\n\treturn (\"string\" === r ? String : Number)(t);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/toPropertyKey.js\nfunction toPropertyKey(t) {\n\tvar i = toPrimitive(t, \"string\");\n\treturn \"symbol\" == _typeof(i) ? i : i + \"\";\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/defineProperty.js\nfunction _defineProperty(e, r, t) {\n\treturn (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n\t\tvalue: t,\n\t\tenumerable: !0,\n\t\tconfigurable: !0,\n\t\twritable: !0\n\t}) : e[r] = t, e;\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/objectSpread2.js\nfunction ownKeys(e, r) {\n\tvar t = Object.keys(e);\n\tif (Object.getOwnPropertySymbols) {\n\t\tvar o = Object.getOwnPropertySymbols(e);\n\t\tr && (o = o.filter(function(r) {\n\t\t\treturn Object.getOwnPropertyDescriptor(e, r).enumerable;\n\t\t})), t.push.apply(t, o);\n\t}\n\treturn t;\n}\nfunction _objectSpread2(e) {\n\tfor (var r = 1; r < arguments.length; r++) {\n\t\tvar t = null != arguments[r] ? arguments[r] : {};\n\t\tr % 2 ? ownKeys(Object(t), !0).forEach(function(r) {\n\t\t\t_defineProperty(e, r, t[r]);\n\t\t}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {\n\t\t\tObject.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n\t\t});\n\t}\n\treturn e;\n}\n//#endregion\n//#region src/helpers.ts\n/**\n* Compute the dimension of the crop area based on media size,\n* aspect ratio and optionally rotation\n*/\nfunction getCropSize(mediaWidth, mediaHeight, containerWidth, containerHeight, aspect, rotation = 0) {\n\tconst { width, height } = rotateSize(mediaWidth, mediaHeight, rotation);\n\tconst fittingWidth = Math.min(width, containerWidth);\n\tconst fittingHeight = Math.min(height, containerHeight);\n\tif (fittingWidth > fittingHeight * aspect) return {\n\t\twidth: fittingHeight * aspect,\n\t\theight: fittingHeight\n\t};\n\treturn {\n\t\twidth: fittingWidth,\n\t\theight: fittingWidth / aspect\n\t};\n}\n/**\n* Compute media zoom.\n* We fit the media into the container with \"max-width: 100%; max-height: 100%;\"\n*/\nfunction getMediaZoom(mediaSize) {\n\treturn mediaSize.width > mediaSize.height ? mediaSize.width / mediaSize.naturalWidth : mediaSize.height / mediaSize.naturalHeight;\n}\n/**\n* Ensure a new media position stays in the crop area.\n*/\nfunction restrictPosition(position, mediaSize, cropSize, zoom, rotation = 0) {\n\tconst { width, height } = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\treturn {\n\t\tx: restrictPositionCoord(position.x, width, cropSize.width, zoom),\n\t\ty: restrictPositionCoord(position.y, height, cropSize.height, zoom)\n\t};\n}\nfunction restrictPositionCoord(position, mediaSize, cropSize, zoom) {\n\tconst maxPosition = Math.abs(mediaSize * zoom / 2 - cropSize / 2);\n\treturn clamp(position, -maxPosition, maxPosition);\n}\nfunction getDistanceBetweenPoints(pointA, pointB) {\n\treturn Math.sqrt(Math.pow(pointA.y - pointB.y, 2) + Math.pow(pointA.x - pointB.x, 2));\n}\nfunction getRotationBetweenPoints(pointA, pointB) {\n\treturn Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180 / Math.PI;\n}\n/**\n* Compute the output cropped area of the media in percentages and pixels.\n* x/y are the top-left coordinates on the src media\n*/\nfunction computeCroppedArea(crop, mediaSize, cropSize, aspect, zoom, rotation = 0, restrictPosition = true) {\n\tconst limitAreaFn = restrictPosition ? limitArea : noOp;\n\tconst mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\tconst mediaNaturalBBoxSize = rotateSize(mediaSize.naturalWidth, mediaSize.naturalHeight, rotation);\n\tconst croppedAreaPercentages = {\n\t\tx: limitAreaFn(100, ((mediaBBoxSize.width - cropSize.width / zoom) / 2 - crop.x / zoom) / mediaBBoxSize.width * 100),\n\t\ty: limitAreaFn(100, ((mediaBBoxSize.height - cropSize.height / zoom) / 2 - crop.y / zoom) / mediaBBoxSize.height * 100),\n\t\twidth: limitAreaFn(100, cropSize.width / mediaBBoxSize.width * 100 / zoom),\n\t\theight: limitAreaFn(100, cropSize.height / mediaBBoxSize.height * 100 / zoom)\n\t};\n\tconst widthInPixels = Math.round(limitAreaFn(mediaNaturalBBoxSize.width, croppedAreaPercentages.width * mediaNaturalBBoxSize.width / 100));\n\tconst heightInPixels = Math.round(limitAreaFn(mediaNaturalBBoxSize.height, croppedAreaPercentages.height * mediaNaturalBBoxSize.height / 100));\n\tconst sizePixels = mediaNaturalBBoxSize.width >= mediaNaturalBBoxSize.height * aspect ? {\n\t\twidth: Math.round(heightInPixels * aspect),\n\t\theight: heightInPixels\n\t} : {\n\t\twidth: widthInPixels,\n\t\theight: Math.round(widthInPixels / aspect)\n\t};\n\treturn {\n\t\tcroppedAreaPercentages,\n\t\tcroppedAreaPixels: _objectSpread2(_objectSpread2({}, sizePixels), {}, {\n\t\t\tx: Math.round(limitAreaFn(mediaNaturalBBoxSize.width - sizePixels.width, croppedAreaPercentages.x * mediaNaturalBBoxSize.width / 100)),\n\t\t\ty: Math.round(limitAreaFn(mediaNaturalBBoxSize.height - sizePixels.height, croppedAreaPercentages.y * mediaNaturalBBoxSize.height / 100))\n\t\t})\n\t};\n}\n/**\n* Ensure the returned value is between 0 and max\n*/\nfunction limitArea(max, value) {\n\treturn Math.min(max, Math.max(0, value));\n}\nfunction noOp(_max, value) {\n\treturn value;\n}\n/**\n* Compute crop and zoom from the croppedAreaPercentages.\n*/\nfunction getInitialCropFromCroppedAreaPercentages(croppedAreaPercentages, mediaSize, rotation, cropSize, minZoom, maxZoom) {\n\tconst mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\tconst zoom = clamp(cropSize.width / mediaBBoxSize.width * (100 / croppedAreaPercentages.width), minZoom, maxZoom);\n\treturn {\n\t\tcrop: {\n\t\t\tx: zoom * mediaBBoxSize.width / 2 - cropSize.width / 2 - mediaBBoxSize.width * zoom * (croppedAreaPercentages.x / 100),\n\t\t\ty: zoom * mediaBBoxSize.height / 2 - cropSize.height / 2 - mediaBBoxSize.height * zoom * (croppedAreaPercentages.y / 100)\n\t\t},\n\t\tzoom\n\t};\n}\n/**\n* Compute zoom from the croppedAreaPixels\n*/\nfunction getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize) {\n\tconst mediaZoom = getMediaZoom(mediaSize);\n\treturn cropSize.height > cropSize.width ? cropSize.height / (croppedAreaPixels.height * mediaZoom) : cropSize.width / (croppedAreaPixels.width * mediaZoom);\n}\n/**\n* Compute crop and zoom from the croppedAreaPixels\n*/\nfunction getInitialCropFromCroppedAreaPixels(croppedAreaPixels, mediaSize, rotation = 0, cropSize, minZoom, maxZoom) {\n\tconst mediaNaturalBBoxSize = rotateSize(mediaSize.naturalWidth, mediaSize.naturalHeight, rotation);\n\tconst zoom = clamp(getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize), minZoom, maxZoom);\n\tconst cropZoom = cropSize.height > cropSize.width ? cropSize.height / croppedAreaPixels.height : cropSize.width / croppedAreaPixels.width;\n\treturn {\n\t\tcrop: {\n\t\t\tx: ((mediaNaturalBBoxSize.width - croppedAreaPixels.width) / 2 - croppedAreaPixels.x) * cropZoom,\n\t\t\ty: ((mediaNaturalBBoxSize.height - croppedAreaPixels.height) / 2 - croppedAreaPixels.y) * cropZoom\n\t\t},\n\t\tzoom\n\t};\n}\n/**\n* Return the point that is the center of point a and b\n*/\nfunction getCenter(a, b) {\n\treturn {\n\t\tx: (b.x + a.x) / 2,\n\t\ty: (b.y + a.y) / 2\n\t};\n}\nfunction getRadianAngle(degreeValue) {\n\treturn degreeValue * Math.PI / 180;\n}\n/**\n* Returns the new bounding area of a rotated rectangle.\n*/\nfunction rotateSize(width, height, rotation) {\n\tconst rotRad = getRadianAngle(rotation);\n\treturn {\n\t\twidth: Math.abs(Math.cos(rotRad) * width) + Math.abs(Math.sin(rotRad) * height),\n\t\theight: Math.abs(Math.sin(rotRad) * width) + Math.abs(Math.cos(rotRad) * height)\n\t};\n}\n/**\n* Clamp value between min and max\n*/\nfunction clamp(value, min, max) {\n\treturn Math.min(Math.max(value, min), max);\n}\n/**\n* Combine multiple class names into a single string.\n*/\nfunction classNames(...args) {\n\treturn args.filter((value) => {\n\t\tif (typeof value === \"string\" && value.length > 0) return true;\n\t\treturn false;\n\t}).join(\" \").trim();\n}\n//#endregion\n//#region src/styles.css?raw\nvar styles_default = \".reactEasyCrop_Container {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n overflow: hidden;\\n user-select: none;\\n touch-action: none;\\n cursor: move;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.reactEasyCrop_Image,\\n.reactEasyCrop_Video {\\n will-change: transform; /* this improves performances and prevent painting issues on iOS Chrome */\\n max-width: unset; /* prevent global img/video reset rules from constraining the cropper media */\\n}\\n\\n.reactEasyCrop_Contain {\\n max-width: 100%;\\n max-height: 100%;\\n margin: auto;\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n}\\n.reactEasyCrop_Cover_Horizontal {\\n width: 100%;\\n height: auto;\\n}\\n.reactEasyCrop_Cover_Vertical {\\n width: auto;\\n height: 100%;\\n}\\n\\n.reactEasyCrop_CropArea {\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n transform: translate(-50%, -50%);\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n box-sizing: border-box;\\n box-shadow: 0 0 0 9999em;\\n color: rgba(0, 0, 0, 0.5);\\n overflow: hidden;\\n}\\n\\n.reactEasyCrop_CropAreaRound {\\n border-radius: 50%;\\n}\\n\\n.reactEasyCrop_CropAreaGrid::before {\\n content: ' ';\\n box-sizing: border-box;\\n position: absolute;\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n top: 0;\\n bottom: 0;\\n left: 33.33%;\\n right: 33.33%;\\n border-top: 0;\\n border-bottom: 0;\\n}\\n\\n.reactEasyCrop_CropAreaGrid::after {\\n content: ' ';\\n box-sizing: border-box;\\n position: absolute;\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n top: 33.33%;\\n bottom: 33.33%;\\n left: 0;\\n right: 0;\\n border-left: 0;\\n border-right: 0;\\n}\\n\";\n//#endregion\n//#region src/Cropper.tsx\nconst RESIZE_EMIT_DEBOUNCE_TIME = 250;\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 3;\nconst KEYBOARD_STEP = 1;\nvar Cropper = class Cropper extends React.Component {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis.cropperRef = React.createRef();\n\t\tthis.imageRef = React.createRef();\n\t\tthis.videoRef = React.createRef();\n\t\tthis.containerPosition = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.containerRef = null;\n\t\tthis.styleRef = null;\n\t\tthis.containerRect = null;\n\t\tthis.mediaSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tnaturalWidth: 0,\n\t\t\tnaturalHeight: 0\n\t\t};\n\t\tthis.dragStartPosition = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.dragStartCrop = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.gestureZoomStart = 0;\n\t\tthis.gestureRotationStart = 0;\n\t\tthis.isTouching = false;\n\t\tthis.lastPinchDistance = 0;\n\t\tthis.lastPinchRotation = 0;\n\t\tthis.rafDragTimeout = null;\n\t\tthis.rafPinchTimeout = null;\n\t\tthis.wheelTimer = null;\n\t\tthis.resizeEmitTimer = null;\n\t\tthis.currentDoc = typeof document !== \"undefined\" ? document : null;\n\t\tthis.currentWindow = typeof window !== \"undefined\" ? window : null;\n\t\tthis.resizeObserver = null;\n\t\tthis.previousCropSize = null;\n\t\tthis.isInitialized = false;\n\t\tthis.dragInteractionSource = null;\n\t\tthis.state = {\n\t\t\tcropSize: null,\n\t\t\thasWheelJustStarted: false,\n\t\t\tmediaObjectFit: void 0\n\t\t};\n\t\tthis.initResizeObserver = () => {\n\t\t\tif (typeof window.ResizeObserver === \"undefined\" || !this.containerRef) return;\n\t\t\tlet isFirstResize = true;\n\t\t\tthis.resizeObserver = new window.ResizeObserver((entries) => {\n\t\t\t\tif (isFirstResize) {\n\t\t\t\t\tisFirstResize = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.computeSizes({ isResizeTriggered: true });\n\t\t\t});\n\t\t\tthis.resizeObserver.observe(this.containerRef);\n\t\t};\n\t\tthis.onWindowResize = () => {\n\t\t\tthis.computeSizes({ isResizeTriggered: true });\n\t\t};\n\t\tthis.preventZoomSafari = (e) => e.preventDefault();\n\t\tthis.cleanEvents = () => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\tthis.currentDoc.removeEventListener(\"mousemove\", this.onMouseMove);\n\t\t\tthis.currentDoc.removeEventListener(\"mouseup\", this.onDragStopped);\n\t\t\tthis.currentDoc.removeEventListener(\"touchmove\", this.onTouchMove);\n\t\t\tthis.currentDoc.removeEventListener(\"touchend\", this.onDragStopped);\n\t\t\tthis.currentDoc.removeEventListener(\"gesturechange\", this.onGestureChange);\n\t\t\tthis.currentDoc.removeEventListener(\"gestureend\", this.onGestureEnd);\n\t\t\tthis.currentDoc.removeEventListener(\"scroll\", this.onScroll);\n\t\t};\n\t\tthis.clearScrollEvent = () => {\n\t\t\tif (this.containerRef) this.containerRef.removeEventListener(\"wheel\", this.onWheel);\n\t\t\tif (this.wheelTimer) clearTimeout(this.wheelTimer);\n\t\t};\n\t\tthis.onMediaLoad = () => {\n\t\t\tconst cropSize = this.computeSizes();\n\t\t\tif (cropSize) {\n\t\t\t\tthis.previousCropSize = cropSize;\n\t\t\t\tthis.emitCropData();\n\t\t\t\tthis.setInitialCrop(cropSize);\n\t\t\t\tthis.isInitialized = true;\n\t\t\t}\n\t\t\tif (this.props.onMediaLoaded) this.props.onMediaLoaded(this.mediaSize);\n\t\t};\n\t\tthis.setInitialCrop = (cropSize) => {\n\t\t\tif (this.props.initialCroppedAreaPercentages) {\n\t\t\t\tconst { crop, zoom } = getInitialCropFromCroppedAreaPercentages(this.props.initialCroppedAreaPercentages, this.mediaSize, this.props.rotation, cropSize, this.props.minZoom, this.props.maxZoom);\n\t\t\t\tthis.props.onCropChange(crop);\n\t\t\t\tthis.props.onZoomChange && this.props.onZoomChange(zoom);\n\t\t\t} else if (this.props.initialCroppedAreaPixels) {\n\t\t\t\tconst { crop, zoom } = getInitialCropFromCroppedAreaPixels(this.props.initialCroppedAreaPixels, this.mediaSize, this.props.rotation, cropSize, this.props.minZoom, this.props.maxZoom);\n\t\t\t\tthis.props.onCropChange(crop);\n\t\t\t\tthis.props.onZoomChange && this.props.onZoomChange(zoom);\n\t\t\t}\n\t\t};\n\t\tthis.computeSizes = ({ isResizeTriggered = false } = {}) => {\n\t\t\tconst mediaRef = this.imageRef.current || this.videoRef.current;\n\t\t\tif (mediaRef && this.containerRef) {\n\t\t\t\tvar _this$imageRef$curren, _this$videoRef$curren, _this$imageRef$curren2, _this$videoRef$curren2, _this$state$cropSize, _this$state$cropSize2;\n\t\t\t\tthis.containerRect = this.containerRef.getBoundingClientRect();\n\t\t\t\tthis.saveContainerPosition();\n\t\t\t\tconst containerAspect = this.containerRect.width / this.containerRect.height;\n\t\t\t\tconst naturalWidth = ((_this$imageRef$curren = this.imageRef.current) === null || _this$imageRef$curren === void 0 ? void 0 : _this$imageRef$curren.naturalWidth) || ((_this$videoRef$curren = this.videoRef.current) === null || _this$videoRef$curren === void 0 ? void 0 : _this$videoRef$curren.videoWidth) || 0;\n\t\t\t\tconst naturalHeight = ((_this$imageRef$curren2 = this.imageRef.current) === null || _this$imageRef$curren2 === void 0 ? void 0 : _this$imageRef$curren2.naturalHeight) || ((_this$videoRef$curren2 = this.videoRef.current) === null || _this$videoRef$curren2 === void 0 ? void 0 : _this$videoRef$curren2.videoHeight) || 0;\n\t\t\t\tconst isMediaScaledDown = mediaRef.offsetWidth < naturalWidth || mediaRef.offsetHeight < naturalHeight;\n\t\t\t\tconst mediaAspect = naturalWidth / naturalHeight;\n\t\t\t\tlet renderedMediaSize;\n\t\t\t\tif (isMediaScaledDown) {\n\t\t\t\t\tvar _this$state$mediaObje;\n\t\t\t\t\tswitch ((_this$state$mediaObje = this.state.mediaObjectFit) !== null && _this$state$mediaObje !== void 0 ? _this$state$mediaObje : this.getObjectFit()) {\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\tcase \"contain\":\n\t\t\t\t\t\t\trenderedMediaSize = containerAspect > mediaAspect ? {\n\t\t\t\t\t\t\t\twidth: this.containerRect.height * mediaAspect,\n\t\t\t\t\t\t\t\theight: this.containerRect.height\n\t\t\t\t\t\t\t} : {\n\t\t\t\t\t\t\t\twidth: this.containerRect.width,\n\t\t\t\t\t\t\t\theight: this.containerRect.width / mediaAspect\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"horizontal-cover\":\n\t\t\t\t\t\t\trenderedMediaSize = {\n\t\t\t\t\t\t\t\twidth: this.containerRect.width,\n\t\t\t\t\t\t\t\theight: this.containerRect.width / mediaAspect\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"vertical-cover\":\n\t\t\t\t\t\t\trenderedMediaSize = {\n\t\t\t\t\t\t\t\twidth: this.containerRect.height * mediaAspect,\n\t\t\t\t\t\t\t\theight: this.containerRect.height\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else renderedMediaSize = {\n\t\t\t\t\twidth: mediaRef.offsetWidth,\n\t\t\t\t\theight: mediaRef.offsetHeight\n\t\t\t\t};\n\t\t\t\tthis.mediaSize = _objectSpread2(_objectSpread2({}, renderedMediaSize), {}, {\n\t\t\t\t\tnaturalWidth,\n\t\t\t\t\tnaturalHeight\n\t\t\t\t});\n\t\t\t\tif (this.props.setMediaSize) this.props.setMediaSize(this.mediaSize);\n\t\t\t\tconst cropSize = this.props.cropSize ? this.props.cropSize : getCropSize(this.mediaSize.width, this.mediaSize.height, this.containerRect.width, this.containerRect.height, this.props.aspect, this.props.rotation);\n\t\t\t\tif (((_this$state$cropSize = this.state.cropSize) === null || _this$state$cropSize === void 0 ? void 0 : _this$state$cropSize.height) !== cropSize.height || ((_this$state$cropSize2 = this.state.cropSize) === null || _this$state$cropSize2 === void 0 ? void 0 : _this$state$cropSize2.width) !== cropSize.width) this.props.onCropSizeChange && this.props.onCropSizeChange(cropSize);\n\t\t\t\tthis.setState({ cropSize }, () => this.recomputeCropPosition({ isResizeTriggered }));\n\t\t\t\tif (this.props.setCropSize) this.props.setCropSize(cropSize);\n\t\t\t\treturn cropSize;\n\t\t\t}\n\t\t};\n\t\tthis.saveContainerPosition = () => {\n\t\t\tif (this.containerRef) {\n\t\t\t\tconst bounds = this.containerRef.getBoundingClientRect();\n\t\t\t\tthis.containerPosition = {\n\t\t\t\t\tx: bounds.left,\n\t\t\t\t\ty: bounds.top\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tthis.onMouseDown = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.currentDoc.addEventListener(\"mousemove\", this.onMouseMove);\n\t\t\tthis.currentDoc.addEventListener(\"mouseup\", this.onDragStopped);\n\t\t\tthis.saveContainerPosition();\n\t\t\tthis.onDragStart(Cropper.getMousePoint(e), \"mouse\");\n\t\t};\n\t\tthis.onMouseMove = (e) => this.onDrag(Cropper.getMousePoint(e));\n\t\tthis.onScroll = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.saveContainerPosition();\n\t\t};\n\t\tthis.onTouchStart = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\tthis.isTouching = true;\n\t\t\tif (this.props.onTouchRequest && !this.props.onTouchRequest(e)) return;\n\t\t\tthis.currentDoc.addEventListener(\"touchmove\", this.onTouchMove, { passive: false });\n\t\t\tthis.currentDoc.addEventListener(\"touchend\", this.onDragStopped);\n\t\t\tthis.saveContainerPosition();\n\t\t\tif (e.touches.length === 2) this.onPinchStart(e);\n\t\t\telse if (e.touches.length === 1) this.onDragStart(Cropper.getTouchPoint(e.touches[0]), \"touch\");\n\t\t};\n\t\tthis.onTouchMove = (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (e.touches.length === 2) this.onPinchMove(e);\n\t\t\telse if (e.touches.length === 1) this.onDrag(Cropper.getTouchPoint(e.touches[0]));\n\t\t};\n\t\tthis.onGestureStart = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.currentDoc.addEventListener(\"gesturechange\", this.onGestureChange);\n\t\t\tthis.currentDoc.addEventListener(\"gestureend\", this.onGestureEnd);\n\t\t\tthis.gestureZoomStart = this.props.zoom;\n\t\t\tthis.gestureRotationStart = this.props.rotation;\n\t\t};\n\t\tthis.onGestureChange = (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this.isTouching) return;\n\t\t\tconst point = Cropper.getMousePoint(e);\n\t\t\tconst newZoom = this.gestureZoomStart - 1 + e.scale;\n\t\t\tthis.setNewZoom(newZoom, point, { shouldUpdatePosition: true });\n\t\t\tif (this.props.onRotationChange) {\n\t\t\t\tconst newRotation = this.gestureRotationStart + e.rotation;\n\t\t\t\tthis.props.onRotationChange(newRotation);\n\t\t\t}\n\t\t};\n\t\tthis.onGestureEnd = (e) => {\n\t\t\tthis.cleanEvents();\n\t\t};\n\t\tthis.onDragStart = ({ x, y }, source) => {\n\t\t\tvar _this$props$onInterac, _this$props;\n\t\t\tthis.dragStartPosition = {\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t};\n\t\t\tthis.dragStartCrop = _objectSpread2({}, this.props.crop);\n\t\t\tthis.dragInteractionSource = source;\n\t\t\t(_this$props$onInterac = (_this$props = this.props).onInteractionStart) === null || _this$props$onInterac === void 0 || _this$props$onInterac.call(_this$props, { source });\n\t\t};\n\t\tthis.onDrag = ({ x, y }) => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.rafDragTimeout) this.currentWindow.cancelAnimationFrame(this.rafDragTimeout);\n\t\t\tthis.rafDragTimeout = this.currentWindow.requestAnimationFrame(() => {\n\t\t\t\tif (!this.state.cropSize) return;\n\t\t\t\tif (x === void 0 || y === void 0) return;\n\t\t\t\tconst offsetX = x - this.dragStartPosition.x;\n\t\t\t\tconst offsetY = y - this.dragStartPosition.y;\n\t\t\t\tconst requestedPosition = {\n\t\t\t\t\tx: this.dragStartCrop.x + offsetX,\n\t\t\t\t\ty: this.dragStartCrop.y + offsetY\n\t\t\t\t};\n\t\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(requestedPosition, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : requestedPosition;\n\t\t\t\tthis.props.onCropChange(newPosition);\n\t\t\t});\n\t\t};\n\t\tthis.onDragStopped = () => {\n\t\t\tvar _this$props$onInterac2, _this$props2, _this$dragInteraction;\n\t\t\tthis.isTouching = false;\n\t\t\tthis.cleanEvents();\n\t\t\tthis.emitCropData();\n\t\t\t(_this$props$onInterac2 = (_this$props2 = this.props).onInteractionEnd) === null || _this$props$onInterac2 === void 0 || _this$props$onInterac2.call(_this$props2, { source: (_this$dragInteraction = this.dragInteractionSource) !== null && _this$dragInteraction !== void 0 ? _this$dragInteraction : \"mouse\" });\n\t\t\tthis.dragInteractionSource = null;\n\t\t};\n\t\tthis.onWheel = (e) => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.props.onWheelRequest && !this.props.onWheelRequest(e)) return;\n\t\t\te.preventDefault();\n\t\t\tconst point = Cropper.getMousePoint(e);\n\t\t\tconst { pixelY } = normalizeWheel(e);\n\t\t\tconst newZoom = this.props.zoom - pixelY * this.props.zoomSpeed / 200;\n\t\t\tthis.setNewZoom(newZoom, point, { shouldUpdatePosition: true });\n\t\t\tif (!this.state.hasWheelJustStarted) this.setState({ hasWheelJustStarted: true }, () => {\n\t\t\t\tvar _this$props$onInterac3, _this$props3;\n\t\t\t\treturn (_this$props$onInterac3 = (_this$props3 = this.props).onInteractionStart) === null || _this$props$onInterac3 === void 0 ? void 0 : _this$props$onInterac3.call(_this$props3, { source: \"wheel\" });\n\t\t\t});\n\t\t\tif (this.wheelTimer) clearTimeout(this.wheelTimer);\n\t\t\tthis.wheelTimer = this.currentWindow.setTimeout(() => this.setState({ hasWheelJustStarted: false }, () => {\n\t\t\t\tvar _this$props$onInterac4, _this$props4;\n\t\t\t\treturn (_this$props$onInterac4 = (_this$props4 = this.props).onInteractionEnd) === null || _this$props$onInterac4 === void 0 ? void 0 : _this$props$onInterac4.call(_this$props4, { source: \"wheel\" });\n\t\t\t}), 250);\n\t\t};\n\t\tthis.getPointOnContainer = ({ x, y }, containerTopLeft) => {\n\t\t\tif (!this.containerRect) throw new Error(\"The Cropper is not mounted\");\n\t\t\treturn {\n\t\t\t\tx: this.containerRect.width / 2 - (x - containerTopLeft.x),\n\t\t\t\ty: this.containerRect.height / 2 - (y - containerTopLeft.y)\n\t\t\t};\n\t\t};\n\t\tthis.getPointOnMedia = ({ x, y }) => {\n\t\t\tconst { crop, zoom } = this.props;\n\t\t\treturn {\n\t\t\t\tx: (x + crop.x) / zoom,\n\t\t\t\ty: (y + crop.y) / zoom\n\t\t\t};\n\t\t};\n\t\tthis.setNewZoom = (zoom, point, { shouldUpdatePosition = true } = {}) => {\n\t\t\tif (!this.state.cropSize || !this.props.onZoomChange) return;\n\t\t\tconst newZoom = clamp(zoom, this.props.minZoom, this.props.maxZoom);\n\t\t\tif (shouldUpdatePosition) {\n\t\t\t\tconst zoomPoint = this.getPointOnContainer(point, this.containerPosition);\n\t\t\t\tconst zoomTarget = this.getPointOnMedia(zoomPoint);\n\t\t\t\tconst requestedPosition = {\n\t\t\t\t\tx: zoomTarget.x * newZoom - zoomPoint.x,\n\t\t\t\t\ty: zoomTarget.y * newZoom - zoomPoint.y\n\t\t\t\t};\n\t\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(requestedPosition, this.mediaSize, this.state.cropSize, newZoom, this.props.rotation) : requestedPosition;\n\t\t\t\tthis.props.onCropChange(newPosition);\n\t\t\t}\n\t\t\tthis.props.onZoomChange(newZoom);\n\t\t};\n\t\tthis.getCropData = () => {\n\t\t\tif (!this.state.cropSize) return null;\n\t\t\treturn computeCroppedArea(this.props.restrictPosition ? restrictPosition(this.props.crop, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : this.props.crop, this.mediaSize, this.state.cropSize, this.getAspect(), this.props.zoom, this.props.rotation, this.props.restrictPosition);\n\t\t};\n\t\tthis.emitCropData = () => {\n\t\t\tif (this.resizeEmitTimer) {\n\t\t\t\tclearTimeout(this.resizeEmitTimer);\n\t\t\t\tthis.resizeEmitTimer = null;\n\t\t\t}\n\t\t\tconst cropData = this.getCropData();\n\t\t\tif (!cropData) return;\n\t\t\tconst { croppedAreaPercentages, croppedAreaPixels } = cropData;\n\t\t\tif (this.props.onCropComplete) this.props.onCropComplete(croppedAreaPercentages, croppedAreaPixels);\n\t\t\tif (this.props.onCropAreaChange) this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n\t\t};\n\t\tthis.emitCropAreaChange = () => {\n\t\t\tconst cropData = this.getCropData();\n\t\t\tif (!cropData) return;\n\t\t\tconst { croppedAreaPercentages, croppedAreaPixels } = cropData;\n\t\t\tif (this.props.onCropAreaChange) this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n\t\t};\n\t\tthis.recomputeCropPosition = ({ isResizeTriggered = false } = {}) => {\n\t\t\tvar _this$previousCropSiz, _this$previousCropSiz2;\n\t\t\tif (!this.state.cropSize) return;\n\t\t\tlet adjustedCrop = this.props.crop;\n\t\t\tif (this.isInitialized && ((_this$previousCropSiz = this.previousCropSize) === null || _this$previousCropSiz === void 0 ? void 0 : _this$previousCropSiz.width) && ((_this$previousCropSiz2 = this.previousCropSize) === null || _this$previousCropSiz2 === void 0 ? void 0 : _this$previousCropSiz2.height)) {\n\t\t\t\tif (Math.abs(this.previousCropSize.width - this.state.cropSize.width) > 1e-6 || Math.abs(this.previousCropSize.height - this.state.cropSize.height) > 1e-6) {\n\t\t\t\t\tconst scaleX = this.state.cropSize.width / this.previousCropSize.width;\n\t\t\t\t\tconst scaleY = this.state.cropSize.height / this.previousCropSize.height;\n\t\t\t\t\tadjustedCrop = {\n\t\t\t\t\t\tx: this.props.crop.x * scaleX,\n\t\t\t\t\t\ty: this.props.crop.y * scaleY\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(adjustedCrop, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : adjustedCrop;\n\t\t\tthis.previousCropSize = this.state.cropSize;\n\t\t\tthis.props.onCropChange(newPosition);\n\t\t\tif (isResizeTriggered) this.debouncedEmitCropData();\n\t\t\telse this.emitCropData();\n\t\t};\n\t\tthis.debouncedEmitCropData = () => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.resizeEmitTimer) clearTimeout(this.resizeEmitTimer);\n\t\t\tthis.resizeEmitTimer = this.currentWindow.setTimeout(() => {\n\t\t\t\tthis.emitCropData();\n\t\t\t}, RESIZE_EMIT_DEBOUNCE_TIME);\n\t\t};\n\t\tthis.onKeyDown = (event) => {\n\t\t\tconst { crop, onCropChange, keyboardStep, zoom, rotation } = this.props;\n\t\t\tlet step = keyboardStep;\n\t\t\tif (!this.state.cropSize) return;\n\t\t\tif (event.shiftKey) step *= .2;\n\t\t\tlet newCrop = _objectSpread2({}, crop);\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tnewCrop.y -= step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tnewCrop.y += step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\tnewCrop.x -= step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tnewCrop.x += step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: return;\n\t\t\t}\n\t\t\tif (this.props.restrictPosition) newCrop = restrictPosition(newCrop, this.mediaSize, this.state.cropSize, zoom, rotation);\n\t\t\tif (!event.repeat) {\n\t\t\t\tvar _this$props$onInterac5, _this$props5;\n\t\t\t\t(_this$props$onInterac5 = (_this$props5 = this.props).onInteractionStart) === null || _this$props$onInterac5 === void 0 || _this$props$onInterac5.call(_this$props5, { source: \"keyboard\" });\n\t\t\t}\n\t\t\tonCropChange(newCrop);\n\t\t};\n\t\tthis.onKeyUp = (event) => {\n\t\t\tvar _this$props$onInterac6, _this$props6;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: return;\n\t\t\t}\n\t\t\tthis.emitCropData();\n\t\t\t(_this$props$onInterac6 = (_this$props6 = this.props).onInteractionEnd) === null || _this$props$onInterac6 === void 0 || _this$props$onInterac6.call(_this$props6, { source: \"keyboard\" });\n\t\t};\n\t}\n\tcomponentDidMount() {\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tif (this.containerRef) {\n\t\t\tif (this.containerRef.ownerDocument) this.currentDoc = this.containerRef.ownerDocument;\n\t\t\tif (this.currentDoc.defaultView) this.currentWindow = this.currentDoc.defaultView;\n\t\t\tthis.initResizeObserver();\n\t\t\tif (typeof window.ResizeObserver === \"undefined\") this.currentWindow.addEventListener(\"resize\", this.onWindowResize);\n\t\t\tthis.props.zoomWithScroll && this.containerRef.addEventListener(\"wheel\", this.onWheel, { passive: false });\n\t\t\tthis.containerRef.addEventListener(\"gesturestart\", this.onGestureStart);\n\t\t}\n\t\tthis.currentDoc.addEventListener(\"scroll\", this.onScroll);\n\t\tif (!this.props.disableAutomaticStylesInjection) {\n\t\t\tthis.styleRef = this.currentDoc.createElement(\"style\");\n\t\t\tthis.styleRef.setAttribute(\"type\", \"text/css\");\n\t\t\tif (this.props.nonce) this.styleRef.setAttribute(\"nonce\", this.props.nonce);\n\t\t\tthis.styleRef.innerHTML = styles_default;\n\t\t\tthis.currentDoc.head.appendChild(this.styleRef);\n\t\t}\n\t\tif (this.imageRef.current && this.imageRef.current.complete) this.onMediaLoad();\n\t\tif (this.props.setImageRef) this.props.setImageRef(this.imageRef);\n\t\tif (this.props.setVideoRef) this.props.setVideoRef(this.videoRef);\n\t\tif (this.props.setCropperRef) this.props.setCropperRef(this.cropperRef);\n\t}\n\tcomponentWillUnmount() {\n\t\tvar _this$resizeObserver;\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tif (typeof window.ResizeObserver === \"undefined\") this.currentWindow.removeEventListener(\"resize\", this.onWindowResize);\n\t\t(_this$resizeObserver = this.resizeObserver) === null || _this$resizeObserver === void 0 || _this$resizeObserver.disconnect();\n\t\tif (this.resizeEmitTimer) clearTimeout(this.resizeEmitTimer);\n\t\tif (this.containerRef) this.containerRef.removeEventListener(\"gesturestart\", this.preventZoomSafari);\n\t\tif (this.styleRef) {\n\t\t\tvar _this$styleRef$parent;\n\t\t\t(_this$styleRef$parent = this.styleRef.parentNode) === null || _this$styleRef$parent === void 0 || _this$styleRef$parent.removeChild(this.styleRef);\n\t\t}\n\t\tthis.cleanEvents();\n\t\tthis.props.zoomWithScroll && this.clearScrollEvent();\n\t}\n\tcomponentDidUpdate(prevProps) {\n\t\tvar _prevProps$cropSize, _this$props$cropSize, _prevProps$cropSize2, _this$props$cropSize2, _prevProps$crop, _this$props$crop, _prevProps$crop2, _this$props$crop2;\n\t\tif (prevProps.rotation !== this.props.rotation) {\n\t\t\tthis.computeSizes();\n\t\t\tthis.recomputeCropPosition();\n\t\t} else if (prevProps.aspect !== this.props.aspect) this.computeSizes();\n\t\telse if (prevProps.objectFit !== this.props.objectFit) this.computeSizes();\n\t\telse if (prevProps.zoom !== this.props.zoom) this.recomputeCropPosition();\n\t\telse if (((_prevProps$cropSize = prevProps.cropSize) === null || _prevProps$cropSize === void 0 ? void 0 : _prevProps$cropSize.height) !== ((_this$props$cropSize = this.props.cropSize) === null || _this$props$cropSize === void 0 ? void 0 : _this$props$cropSize.height) || ((_prevProps$cropSize2 = prevProps.cropSize) === null || _prevProps$cropSize2 === void 0 ? void 0 : _prevProps$cropSize2.width) !== ((_this$props$cropSize2 = this.props.cropSize) === null || _this$props$cropSize2 === void 0 ? void 0 : _this$props$cropSize2.width)) this.computeSizes();\n\t\telse if (((_prevProps$crop = prevProps.crop) === null || _prevProps$crop === void 0 ? void 0 : _prevProps$crop.x) !== ((_this$props$crop = this.props.crop) === null || _this$props$crop === void 0 ? void 0 : _this$props$crop.x) || ((_prevProps$crop2 = prevProps.crop) === null || _prevProps$crop2 === void 0 ? void 0 : _prevProps$crop2.y) !== ((_this$props$crop2 = this.props.crop) === null || _this$props$crop2 === void 0 ? void 0 : _this$props$crop2.y)) this.emitCropAreaChange();\n\t\tif (prevProps.zoomWithScroll !== this.props.zoomWithScroll && this.containerRef) this.props.zoomWithScroll ? this.containerRef.addEventListener(\"wheel\", this.onWheel, { passive: false }) : this.clearScrollEvent();\n\t\tif (prevProps.video !== this.props.video) {\n\t\t\tvar _this$videoRef$curren3;\n\t\t\t(_this$videoRef$curren3 = this.videoRef.current) === null || _this$videoRef$curren3 === void 0 || _this$videoRef$curren3.load();\n\t\t}\n\t\tconst objectFit = this.getObjectFit();\n\t\tif (objectFit !== this.state.mediaObjectFit) this.setState({ mediaObjectFit: objectFit }, this.computeSizes);\n\t}\n\tgetAspect() {\n\t\tconst { cropSize, aspect } = this.props;\n\t\tif (cropSize) return cropSize.width / cropSize.height;\n\t\treturn aspect;\n\t}\n\tgetObjectFit() {\n\t\tif (this.props.objectFit === \"cover\") {\n\t\t\tif ((this.imageRef.current || this.videoRef.current) && this.containerRef) {\n\t\t\t\tvar _this$imageRef$curren3, _this$videoRef$curren4, _this$imageRef$curren4, _this$videoRef$curren5;\n\t\t\t\tthis.containerRect = this.containerRef.getBoundingClientRect();\n\t\t\t\tconst containerAspect = this.containerRect.width / this.containerRect.height;\n\t\t\t\treturn (((_this$imageRef$curren3 = this.imageRef.current) === null || _this$imageRef$curren3 === void 0 ? void 0 : _this$imageRef$curren3.naturalWidth) || ((_this$videoRef$curren4 = this.videoRef.current) === null || _this$videoRef$curren4 === void 0 ? void 0 : _this$videoRef$curren4.videoWidth) || 0) / (((_this$imageRef$curren4 = this.imageRef.current) === null || _this$imageRef$curren4 === void 0 ? void 0 : _this$imageRef$curren4.naturalHeight) || ((_this$videoRef$curren5 = this.videoRef.current) === null || _this$videoRef$curren5 === void 0 ? void 0 : _this$videoRef$curren5.videoHeight) || 0) < containerAspect ? \"horizontal-cover\" : \"vertical-cover\";\n\t\t\t}\n\t\t\treturn \"horizontal-cover\";\n\t\t}\n\t\treturn this.props.objectFit;\n\t}\n\tonPinchStart(e) {\n\t\tconst pointA = Cropper.getTouchPoint(e.touches[0]);\n\t\tconst pointB = Cropper.getTouchPoint(e.touches[1]);\n\t\tthis.lastPinchDistance = getDistanceBetweenPoints(pointA, pointB);\n\t\tthis.lastPinchRotation = getRotationBetweenPoints(pointA, pointB);\n\t\tthis.onDragStart(getCenter(pointA, pointB), \"touch\");\n\t}\n\tonPinchMove(e) {\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tconst pointA = Cropper.getTouchPoint(e.touches[0]);\n\t\tconst pointB = Cropper.getTouchPoint(e.touches[1]);\n\t\tconst center = getCenter(pointA, pointB);\n\t\tthis.onDrag(center);\n\t\tif (this.rafPinchTimeout) this.currentWindow.cancelAnimationFrame(this.rafPinchTimeout);\n\t\tthis.rafPinchTimeout = this.currentWindow.requestAnimationFrame(() => {\n\t\t\tconst distance = getDistanceBetweenPoints(pointA, pointB);\n\t\t\tconst newZoom = this.props.zoom * (distance / this.lastPinchDistance);\n\t\t\tthis.setNewZoom(newZoom, center, { shouldUpdatePosition: false });\n\t\t\tthis.lastPinchDistance = distance;\n\t\t\tconst rotation = getRotationBetweenPoints(pointA, pointB);\n\t\t\tconst newRotation = this.props.rotation + (rotation - this.lastPinchRotation);\n\t\t\tthis.props.onRotationChange && this.props.onRotationChange(newRotation);\n\t\t\tthis.lastPinchRotation = rotation;\n\t\t});\n\t}\n\trender() {\n\t\tvar _this$state$mediaObje2;\n\t\tconst { image, video, mediaProps, cropperProps, transform, crop: { x, y }, rotation, zoom, cropShape, showGrid, roundCropAreaPixels, style: { containerStyle, cropAreaStyle, mediaStyle }, classes: { containerClassName, cropAreaClassName, mediaClassName } } = this.props;\n\t\tconst objectFit = (_this$state$mediaObje2 = this.state.mediaObjectFit) !== null && _this$state$mediaObje2 !== void 0 ? _this$state$mediaObje2 : this.getObjectFit();\n\t\treturn /* @__PURE__ */ React.createElement(\"div\", {\n\t\t\tonMouseDown: this.onMouseDown,\n\t\t\tonTouchStart: this.onTouchStart,\n\t\t\tref: (el) => this.containerRef = el,\n\t\t\t\"data-testid\": \"container\",\n\t\t\tstyle: containerStyle,\n\t\t\tclassName: classNames(\"reactEasyCrop_Container\", containerClassName)\n\t\t}, image ? /* @__PURE__ */ React.createElement(\"img\", _objectSpread2(_objectSpread2({\n\t\t\talt: \"\",\n\t\t\tclassName: classNames(\"reactEasyCrop_Image\", objectFit === \"contain\" && \"reactEasyCrop_Contain\", objectFit === \"horizontal-cover\" && \"reactEasyCrop_Cover_Horizontal\", objectFit === \"vertical-cover\" && \"reactEasyCrop_Cover_Vertical\", mediaClassName)\n\t\t}, mediaProps), {}, {\n\t\t\tsrc: image,\n\t\t\tref: this.imageRef,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, mediaStyle), {}, { transform: transform || `translate(${x}px, ${y}px) rotate(${rotation}deg) scale(${zoom})` }),\n\t\t\tonLoad: this.onMediaLoad\n\t\t})) : video && /* @__PURE__ */ React.createElement(\"video\", _objectSpread2(_objectSpread2({\n\t\t\tautoPlay: true,\n\t\t\tplaysInline: true,\n\t\t\tloop: true,\n\t\t\tmuted: true,\n\t\t\tclassName: classNames(\"reactEasyCrop_Video\", objectFit === \"contain\" && \"reactEasyCrop_Contain\", objectFit === \"horizontal-cover\" && \"reactEasyCrop_Cover_Horizontal\", objectFit === \"vertical-cover\" && \"reactEasyCrop_Cover_Vertical\", mediaClassName)\n\t\t}, mediaProps), {}, {\n\t\t\tref: this.videoRef,\n\t\t\tonLoadedMetadata: this.onMediaLoad,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, mediaStyle), {}, { transform: transform || `translate(${x}px, ${y}px) rotate(${rotation}deg) scale(${zoom})` }),\n\t\t\tcontrols: false\n\t\t}), (Array.isArray(video) ? video : [{ src: video }]).map((item) => /* @__PURE__ */ React.createElement(\"source\", _objectSpread2({ key: item.src }, item)))), this.state.cropSize && /* @__PURE__ */ React.createElement(\"div\", _objectSpread2({\n\t\t\tref: this.cropperRef,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, cropAreaStyle), {}, {\n\t\t\t\twidth: roundCropAreaPixels ? Math.round(this.state.cropSize.width) : this.state.cropSize.width,\n\t\t\t\theight: roundCropAreaPixels ? Math.round(this.state.cropSize.height) : this.state.cropSize.height\n\t\t\t}),\n\t\t\ttabIndex: 0,\n\t\t\tonKeyDown: this.onKeyDown,\n\t\t\tonKeyUp: this.onKeyUp,\n\t\t\t\"data-testid\": \"cropper\",\n\t\t\tclassName: classNames(\"reactEasyCrop_CropArea\", cropShape === \"round\" && \"reactEasyCrop_CropAreaRound\", showGrid && \"reactEasyCrop_CropAreaGrid\", cropAreaClassName)\n\t\t}, cropperProps)));\n\t}\n};\nCropper.defaultProps = {\n\tzoom: 1,\n\trotation: 0,\n\taspect: 4 / 3,\n\tmaxZoom: MAX_ZOOM,\n\tminZoom: MIN_ZOOM,\n\tcropShape: \"rect\",\n\tobjectFit: \"contain\",\n\tshowGrid: true,\n\tstyle: {},\n\tclasses: {},\n\tmediaProps: {},\n\tcropperProps: {},\n\tzoomSpeed: 1,\n\trestrictPosition: true,\n\tzoomWithScroll: true,\n\tkeyboardStep: KEYBOARD_STEP\n};\nCropper.getMousePoint = (e) => ({\n\tx: Number(e.clientX),\n\ty: Number(e.clientY)\n});\nCropper.getTouchPoint = (touch) => ({\n\tx: Number(touch.clientX),\n\ty: Number(touch.clientY)\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Cropper;\n//#endregion\nexport { src_default as default, getInitialCropFromCroppedAreaPercentages, getInitialCropFromCroppedAreaPixels };\n\n//# sourceMappingURL=index.module.mjs.map","import type { Area } from \"react-easy-crop\";\n\nexport async function getCroppedFile(\n imageSrc: string,\n pixelCrop: Area,\n originalFileName: string,\n): Promise<File> {\n const image = await loadImage(imageSrc);\n const canvas = document.createElement(\"canvas\");\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Could not get 2d canvas context\");\n\n ctx.drawImage(\n image,\n pixelCrop.x,\n pixelCrop.y,\n pixelCrop.width,\n pixelCrop.height,\n 0,\n 0,\n pixelCrop.width,\n pixelCrop.height,\n );\n\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error(\"canvas.toBlob produced no output\"));\n return;\n }\n const ext =\n originalFileName.substring(originalFileName.lastIndexOf(\".\")) || \".jpg\";\n resolve(new File([blob], `cropped${ext}`, { type: \"image/jpeg\" }));\n }, \"image/jpeg\");\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.addEventListener(\"load\", () => resolve(img));\n img.addEventListener(\"error\", reject);\n img.src = src;\n });\n}\n","import React, { useCallback, useState } from \"react\";\n// react-easy-crop's .d.ts uses `export type *` which Node moduleResolution\n// can't resolve as a value. Cast to any here — we own all props passed below.\nimport EasyCrop from \"react-easy-crop\";\nimport type { Area, Point } from \"react-easy-crop\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Cropper = EasyCrop as unknown as React.ComponentType<any>;\n\nimport { Modal } from \"../Modal/Modal\";\nimport { getCroppedFile } from \"./cropImage\";\n\nexport interface ImageCropModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Object URL of the image to crop (created with URL.createObjectURL) */\n imageSrc: string;\n /** Original file name — used to derive the extension of the cropped file */\n originalFileName: string;\n /**\n * Locked aspect ratio for the crop area.\n * Pass 1 for 1:1 (profile photos), 3 for 3:1 (banners), 4/3, etc.\n * Defaults to 1 (square).\n */\n aspectRatio?: number;\n /** Called when the user cancels or closes the modal */\n onClose: () => void;\n /**\n * Called with the cropped File after the user confirms.\n * The File is a JPEG produced from the selected crop region.\n */\n onCropComplete: (croppedFile: File) => void;\n // ── Label props (pass translated strings from the consuming app) ──\n title?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n zoomLabel?: string;\n}\n\nexport const ImageCropModal: React.FC<ImageCropModalProps> = ({\n isOpen,\n imageSrc,\n originalFileName,\n aspectRatio = 1,\n onClose,\n onCropComplete,\n title = \"Crop image\",\n confirmLabel = \"Crop & Upload\",\n cancelLabel = \"Cancel\",\n zoomLabel = \"Zoom\",\n}) => {\n const [crop, setCrop] = useState<Point>({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n const [isCropping, setIsCropping] = useState(false);\n\n const handleCropComplete = useCallback((_: Area, pixels: Area) => {\n setCroppedAreaPixels(pixels);\n }, []);\n\n const handleConfirm = async () => {\n if (!croppedAreaPixels) return;\n setIsCropping(true);\n try {\n const file = await getCroppedFile(imageSrc, croppedAreaPixels, originalFileName);\n onCropComplete(file);\n } finally {\n setIsCropping(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size=\"lg\"\n primaryAction={confirmLabel}\n secondaryAction={cancelLabel}\n onPrimaryAction={handleConfirm}\n onSecondaryAction={onClose}\n isLoading={isCropping}\n closeOnOverlayClick={false}\n >\n <div className=\"relative h-80 w-full bg-gray-900\">\n <Cropper\n image={imageSrc}\n crop={crop}\n zoom={zoom}\n aspect={aspectRatio}\n onCropChange={setCrop}\n onZoomChange={setZoom}\n onCropComplete={handleCropComplete}\n />\n </div>\n <div className=\"mt-4 px-1\">\n <label className=\"mb-1 block text-sm text-gray-500\">{zoomLabel}</label>\n <input\n type=\"range\"\n min={1}\n max={3}\n step={0.05}\n value={zoom}\n onChange={(e) => setZoom(Number(e.target.value))}\n className=\"w-full accent-ews-primary\"\n />\n </div>\n </Modal>\n );\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { Control, Controller, FieldValues, Path } from \"react-hook-form\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input\";\n\nexport interface DropdownMultiSelectProps<T extends FieldValues, TValue> {\n options: { value: TValue; label: string }[];\n name: Path<T>;\n control?: Control<T>;\n placeholder?: string;\n onChange?: (value: TValue[]) => void;\n value?: TValue[];\n defaultValue?: TValue[];\n onValidate?: (value: TValue[]) => boolean;\n disabled?: boolean;\n error?: string;\n label?: string;\n className?: string;\n searchPlaceholder?: string;\n}\n\nconst DropdownMultiSelect = <\n T extends FieldValues,\n TValue extends string | number | object\n>({\n options,\n name,\n control,\n placeholder = \"Select options\",\n searchPlaceholder = \"Search...\",\n onChange,\n value: controlledValue,\n defaultValue,\n onValidate,\n disabled = false,\n error,\n label,\n className,\n}: DropdownMultiSelectProps<T, TValue>) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [uncontrolledValue, setUncontrolledValue] = useState<\n TValue[] | undefined\n >(defaultValue);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm(\"\");\n }\n };\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const removeAccents = (str: string) =>\n str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/ç/g, \"c\")\n .replace(/é|è|ê|ë/g, \"e\")\n .replace(/à|á|â|ã|ä/g, \"a\")\n .replace(/î|ï/g, \"i\")\n .replace(/ô|ö/g, \"o\")\n .replace(/ù|ú|û|ü/g, \"u\");\n\n const getDisplayValue = (value: TValue) => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n return options.find((opt) => opt.value === value)?.label || \"\";\n };\n\n const filteredOptions = options.filter((option) =>\n removeAccents(option.label.toLowerCase()).includes(\n removeAccents(searchTerm.toLowerCase())\n )\n );\n\n const renderDropdown = ({\n value = [] as TValue[],\n onChange: fieldOnChange,\n }: {\n value: TValue[] | undefined;\n onChange: (value: TValue[]) => void;\n }) => (\n <div className={cn(\"relative\", className)} ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={name}\n disabled={disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md border border-ews-gray-300 bg-white px-3 py-2 text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-0 disabled:bg-ews-gray-50 disabled:text-ews-gray-500\",\n isOpen ? \"rounded-b-none border-b-0\" : \"rounded-md\",\n error && \"border-ews-error focus:ring-ews-error\"\n )}\n >\n <span className={cn(\"truncate\", !value?.length && \"text-ews-gray-500\")}>\n {value?.length > 0\n ? value.map((v) => getDisplayValue(v)).join(\", \")\n : placeholder}\n </span>\n <span\n className={cn(\n \"ml-2 w-4 h-4 transition-transform transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </button>\n\n {isOpen && (\n <div className=\"absolute z-50 w-full bg-white rounded-b-md border border-t-0 shadow-lg border-ews-gray-300\">\n {/* Search Input */}\n <div className=\"p-2 border-b border-ews-gray-200\">\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"p-0 border-0 shadow-none focus:ring-0\"\n size=\"sm\"\n />\n </div>\n\n {/* Scrollable Options List */}\n <div className=\"overflow-y-auto max-h-48\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <div\n key={getDisplayValue(option.value)}\n className=\"flex items-center p-2 cursor-pointer hover:bg-ews-gray-100\"\n onClick={() => {\n const currentValue = value ?? [];\n const isSelected = currentValue.some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n );\n const newValue = isSelected\n ? currentValue.filter(\n (item: TValue) =>\n JSON.stringify(item) !==\n JSON.stringify(option.value)\n )\n : [...currentValue, option.value];\n\n if (onValidate && !onValidate(newValue)) {\n return;\n }\n fieldOnChange(newValue);\n onChange?.(newValue);\n }}\n >\n <input\n type=\"checkbox\"\n checked={(value ?? []).some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n )}\n onChange={(e) => {\n e.stopPropagation();\n const currentValue = value ?? [];\n const isSelected = currentValue.some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n );\n const newValue = isSelected\n ? currentValue.filter(\n (item: TValue) =>\n JSON.stringify(item) !==\n JSON.stringify(option.value)\n )\n : [...currentValue, option.value];\n\n if (onValidate && !onValidate(newValue)) {\n return;\n }\n fieldOnChange(newValue);\n onChange?.(newValue);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"mr-3 w-4 h-4 rounded border-ews-gray-300 text-ews-primary focus:ring-ews-primary\"\n />\n <label className=\"text-sm cursor-pointer text-ews-gray-700\">\n {option.label}\n </label>\n </div>\n ))\n ) : (\n <div className=\"p-2 text-sm text-ews-gray-500\">\n No options found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n\n // Render controlled version with react-hook-form\n if (control) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field: { value, onChange } }) => (\n <div>\n {label && (\n <label className=\"block mb-1 text-sm font-medium text-ews-gray-700\">\n {label}\n </label>\n )}\n {renderDropdown({ value, onChange })}\n {error && <p className=\"mt-1 text-sm text-ews-error\">{error}</p>}\n </div>\n )}\n />\n );\n }\n\n // Render uncontrolled version\n return (\n <div>\n {label && (\n <label className=\"block mb-1 text-sm font-medium text-ews-gray-700\">\n {label}\n </label>\n )}\n {renderDropdown({\n value: controlledValue ?? uncontrolledValue,\n onChange: (newValue) => {\n if (controlledValue === undefined) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n })}\n {error && <p className=\"mt-1 text-sm text-ews-error\">{error}</p>}\n </div>\n );\n};\n\nexport { DropdownMultiSelect };\n","import React, { MutableRefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n COUNTRY_CODES,\n extractCountryCodeFromPhoneNumber,\n} from \"../../utils/phone\";\nimport { formatNumeric } from \"../../utils\";\nimport { Input } from \"../Input/Input\";\nimport type { InputProps } from \"../Input/Input\";\n\nconst DEFAULT_COUNTRY_CODE = \"+221\";\n\nexport interface PhoneInputProps\n extends Omit<InputProps, \"countryCodeSelect\" | \"leftIcon\" | \"type\"> {\n /** Currently selected country code (controlled). Defaults to +221 if omitted. */\n countryCode?: string;\n /** Called when the user changes the country code dropdown. */\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone number input with integrated country code selector.\n *\n * The component stores the **full** phone number (e.g. \"+22177123456\") as its\n * form value so that the country code prefix is always preserved on save.\n * The text field displays only the local part (\"77123456\") for a clean UX.\n *\n * Works with React Hook Form via `Controller` — no extra setup needed.\n */\nexport const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode, onCountryCodeChange, onChange, value, ...props }, ref) => {\n // internalCode tracks user's explicit dropdown selection when no countryCode\n // prop is provided and value doesn't carry a recognised prefix.\n const [internalCode, setInternalCode] = useState(DEFAULT_COUNTRY_CODE);\n const nativeRef = useRef<HTMLInputElement>(null);\n\n // Derive the country code directly from value on every render — no state\n // sync needed. Falls back to internalCode when value is empty or unrecognised.\n const codeFromValue = (value as string)\n ? COUNTRY_CODES.find(({ code }) =>\n (value as string).startsWith(code)\n )?.code ?? null\n : null;\n\n const activeCode = countryCode ?? codeFromValue ?? internalCode;\n\n const handleCodeChange = (newCode: string) => {\n // Update internal or external country code state.\n if (onCountryCodeChange) {\n onCountryCodeChange(newCode);\n } else {\n setInternalCode(newCode);\n }\n // Re-emit the current phone value with the new country code so that\n // RHF (Controller) and any other onChange listeners stay in sync even\n // when the user changes the dropdown without retyping the number.\n const el = nativeRef.current;\n if (el && onChange) {\n let numeric = formatNumeric(el.value);\n // Strip new country code digits if already present at the start\n // (e.g. local part \"221778384499\" when switching to +221).\n const newCodeDigits = formatNumeric(newCode);\n if (newCodeDigits && numeric.startsWith(newCodeDigits)) {\n numeric = numeric.slice(newCodeDigits.length);\n el.value = numeric;\n }\n const fullValue = numeric ? `${newCode}${numeric}` : \"\";\n // Pass the value string directly — RHF's Controller field.onChange\n // accepts raw values, avoiding unreliable fake-event parsing.\n (onChange as unknown as (value: string) => void)(fullValue);\n }\n };\n\n const toLocalPart = (v: unknown) =>\n extractCountryCodeFromPhoneNumber((v as string) || \"\").cleanedPhoneNumber;\n\n // When value prop changes (Controller / direct value prop usage),\n // update the DOM input directly so the display stays in sync.\n useEffect(() => {\n const el = nativeRef.current;\n if (el && value !== undefined) {\n el.value = toLocalPart(value);\n }\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n // Enforce digits-only in the displayed field.\n let numeric = formatNumeric(e.target.value);\n // Strip country code digits if user typed or pasted the full number\n // (e.g. typed \"+221778384499\" → formatNumeric gives \"221778384499\"\n // which would produce \"+221221778384499\" without this guard).\n const codeDigits = formatNumeric(activeCode);\n if (codeDigits && numeric.startsWith(codeDigits)) {\n numeric = numeric.slice(codeDigits.length);\n }\n if (e.target.value !== numeric) {\n e.target.value = numeric;\n }\n // Always emit the full phone number (country code + local part) to the form.\n const fullValue = numeric ? `${activeCode}${numeric}` : \"\";\n const syntheticEvent = {\n ...e,\n target: { ...e.target, value: fullValue, name: e.target.name },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n // Merge the forwarded ref (used by RHF register) with our internal ref.\n const composedRef = useCallback(\n (node: HTMLInputElement | null) => {\n (nativeRef as MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLInputElement | null>).current = node;\n },\n [ref]\n );\n\n // Initial display: strip country code so only the local part is shown.\n const initialDisplay =\n value !== undefined ? toLocalPart(value) : undefined;\n\n return (\n <Input\n ref={composedRef}\n type=\"tel\"\n // Use defaultValue (uncontrolled) so React never resets what the user types.\n // Updates from the value prop are applied imperatively via the useEffect above.\n defaultValue={initialDisplay}\n countryCodeSelect={{\n options: COUNTRY_CODES,\n value: activeCode,\n onChange: handleCodeChange,\n }}\n onChange={handleChange}\n {...props}\n />\n );\n }\n);\n\nPhoneInput.displayName = \"PhoneInput\";\n","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIcAAACACAMAAAAWPIqAAAAAb1BMVEVMaXEfqJ8eppwfp54fp54ZiIgblZEGhIIfp54fWWwdpJwfp54fp54fpp0fp54fp50eV2sfWWsdVmkgWW0fp50epp0fWGwepp0eWGseV2ofWWweWGofWGsfWWwfWGsgWm0gqJ8hXXEisKchraQgqqGPBCwLAAAAH3RSTlMA6zvb+Q0ZAv38KrjKa5OmTL8l8IFLrVt6NtBkjd+c9z6ozQAAAAlwSFlzAAAM6wAADOsB5dZE0gAACLZJREFUeNrtW+ly4yAM9gmObztOnNsO8P7PuBLYgJO0221j+meZ6UyStuaLjk8SSJ73f/1fay76iztTuea36o1jPGZ/L45jEsevfuMGBCVB35VZludhGOZ5VpVdnxKq/sAFBtiEpkWV+6PgjDHOueD4gnGR+HnZp3R9qeDj46DMI87EmCQRrEQt9XLkjPt5F8RrQpGSCMpQMD7KTZ8X4EEsIu/StZxIiqLIE8ZfYDASkS8SzqKsj9dAAk8kXcg5fuEFAolKgIlMSyiFJZyHRfxuk4XHkc5nIooetSAYE0kEHlNVVQk/WR7KD0Fq4t1IkJ/6EFAkSxDgLyLMyiJIY7MbjVNw6CqPwIoEz3fvUw7sEeR8iQIEA56RdQF5IFRNb2lfhREIqyRvAkK9uIu4jSJB7UdVkZr9LXnMb+H/duhcfv8O3cAj0pzZ1ilR5AXRrqzoNaavWDfeVT6r4h+LBB7W+2yJAnxyZ/aXux0P5/YDX/fSMvKDHwIBAy15YugCXoJCAgMCSaW+nfb1R18Z/4KUfvFT06iWwuAiS3UkQz86Xq5Dc6R/IUBSlT/QDZBGvoCRsHCnwymqpt5v76f6bxEWf7srvg0EYVh+AsKISsNLIIu6Ge7bA/2KO4Bkv+u/4CjhAgYLg5mUUCP1abjfm+MXnfLbrgvSWMAQ3LgfPLTd34fN5mvC+KGJWkpJEhEVtkoO2/tm2Narp17gkRkzQS3iSAFaJ21z32zup+P6GSD1SstTIp6nlk7qLcJoyPrZObCopZSI5XpP0MkFDGNz38cuYKT+aMHIjIV6BHXiBoaHNjqT+QOM9gQG6ggG9Tpjowm3ldJeJYzGDYwgMtIQ4TOME3FSQFJgjlkaYxQ8whi2rQsY1Cu0y0JM6S0TRdsAHLWbcpr4YvaViHV6Txo3Esb94kYpyGBaGhk1ZH5TMBonJb1NHcnoGxr1zsAbaBxH9+JghYFx3G6kOA6OzlrILA5bKxB9T5NWYkfi0BQGBZvlsheEAYGldiWOcHaWiJWWVhAF8rkbGDLOaiMlpnpQLjtsjq5wZDMOizqkr7gVh3baBOOKThGvg7IOZ+Io2CtxHNyKA1bFk2frIJM4XAUWizwWzjKJYzg5QkG93eS0FncghSlxOKNSQ2KQoBtx1FIcgzOnRa/VOKzIsp+stHF2dk5CZR4LK223ShoO1RKMKi9NWPZopU7V0s9q0QF/pnSw1Gvszkz5HOOMt7STNNyRGAUWiyZO10npFFocmocMcso8ePXoLQ7JFEwhVDhs81B5GCw3RYuqaqccKBHGPI6z156oaxxWmq7JFFjM3V3klHxAZR17D+zhqnqyk6DIZrH9L7iLxlGaYlLFWsBxdo+Dd8ZdrsNkp/Uv4DBuS7bOcehCPxl3xm03v4BD+63BUW827vUSKz5NhIVj2LiXxxRffhvHHG9f4zg7xNF9guPgEIeq5pZ2OvvLxSGO4BO/vTnEocq5ROiiYU7W3cZbqg5wE4vXDZ86S5P1GZ2Jc1THOaf5GBQOaCCL6qWZq5fBJZGlERgI5EEmXb/d3Tsu7IuMusgLdTUH9Ys7GLLgh9oyeCYyq55zcDsYoGLsumF2XAAy17eEOBAIXIhBIlTpe2t6ejIQWqx+DQTUDgyScKuuvGgcjapg4NSoXB8HUipI5KmAsQ4eoP4s1geCVGYdB2lGNYrBRDbwqIM7wog9F9qqtJzBaoF5ax6hLs6lzloxhlLjMFzZVuXhFFhqb4e6x6MYMFXrqn3Fo/5FaTlTu3W+jma0MhAQCDZI2SX/8CIZinMWpisDAZcxx/xAZY22EB38Aa3Pw+CtFE9f1HVwnR7rLbWlWgJBxhuj/n1A6NMpsSTVhBePB+zLQ1QQG4eK/F2nRNhMGbw637YPYyyBNKZj3YMeN5aRt4gEHtF19FXlb3OqyQ6tegrkBHCZv3sDEGzcK+nr60K0kMcrB0xD2iUQMZY/FQn8986vXj1E+ox9M7Y3mjHnygqIbPb7/lUE/iepTCB5kSH6qWddOmyGp0RV9UFGQlTpd9t/sTOv8K22iuduOmEfKx9MlLE6DbAvFJtkmQ/K+YZ2sG20zxn/OI+QtjqaJhRqaeZqGB22LgS2cTO/w0/pPxIG7XPxuamj7XDrDre9Gs00dn+2twvBSCJ4XBl8fbRBoiBFDo3v+efxAYHYeQiEGWOrdNHanmFPOcgEmviJGoz5QvMljihA1734a4csxhC7A8SYiOR3SyJoaThQgE385S5+ydJL+qZpl0UQGJSv/T30+iwwLac3C8jFBoKeJ+TcQzIy4Vdy9sTqKTdLxa+gw4mRCLonu/hrXbRpaBIAO/AugUyt9jj8oAY+YA6mCEj8/ECS7roM+uthFiFiEbj7F60JmCo0+ottIIvWPmX6agwDsIw4cOHnMHNQ9LtArr4oygog4G9wDoMlVfB1+oM/K3OTARgg2Pi5OImQSDLBcDRmlMYyChwSGuVACng2VyND8i04l+o+/xe+KyoDhNgSuS4bYRFJUPlcbp3IZnc9LjQNyMhPwIRCnNP5N9pD1fcm4sX7u3bfYXNY0rlsVS8yX0yyNx3484AOKEyE1S7+HvmauTRQ6MUAASN5iLVy4IGgLcL0Es7kKAQIBwwDfCnrdjH9Zlikyzfn7YwEgFzPj19t9s2izEIfDWMUOKfiy0kZ8rZzC3jI8bQQSfv0ZP11SZoGu74Hn0kJffegH+jpNgxGJNtL+/x0Sl9/9M5KA1u2r9il/ICEvqbxt+9vA4kv2xnJRiI5uh2uNEjam4UEBi6ac0tfK2RtJEdAMmgo9/t2P00FvYxua46dtpfr/T4YoYBULucjeSpE2njtqU9yhlEcKZXNBOW+uTa3w7muW1zH+ny5Hep4deXAnQRAgf2lwcol3yDvI6ptszoKTUuU1IfmBHKRS3ozvtie9oeaOBvfngwxbo/nw2Xf4NrvL4fzUVmFU/f5YDPqnlE+zEb/r//rTesP07sXWlzQCRsAAAAASUVORK5CYII=\";\n export default img;","var img = \"data:image/png;base64,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\";\n export default img;","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXgAAADACAMAAAA5rYg4AAAAmVBMVEVMaXH+/v7////6/Pz+/v7////////2+PjC0NDy9/j////////////////Y6enA29z7/f3////////7/f39/v7+/v7+///////////////////////////x+Pj////////+///l8fHH4OG72dr+///0+fnc7O3Q5ub////Z7Ovg7u/v9vbs9fXq9PTl8fHo8vL+///////+//+UCyKNAAAAMXRSTlMA+vwT/f76AgEEvhzZ4woR8JNYJfYyPofQschsT92odn9NMyIr6m9CYl+Bz7+xkqKe/GcyzAAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNrtfQefqkjzNSihMQAqZh1zToPf/8O9p7oJTSOOM9e7z/+dS+/+dh0lHorqqlOhNa0c5ShHOcpRjnKUoxzlKEc5MJhtO5lhsxKUvw05wfzgBxvPwmYl/n8HczuC3F0td4vDYUvjcFj0dksv3gjPpUT/jcMWeDJ3eRjfztPNxg+M+z3EuOuBv9lMT5frdrFy+ZN5/E6U4/uyzkF3O4vjZapztDEqumHRMAzDFN/c78H0fF1w6bdLrf/nss40pq0O1/MmBMKmYem6UakYphD48A7kjYph6HgG/Av/dD2s+OMq5f7nw3GA4Gp72ejA3LJ0wwiLx72iW7qFpxNsLhz7Evqfqxi2Olx8iLoBOY91ytMB2dcr2MG/LTxSOSWMP9Ex7uK2AZi6rpuvgC6GaZqQfDyr6XVZapzvw47p9HCChuH65QXY7/e7LPhQO6HpnxdONDeX41Uls9pOQ7NiPZF1E8INgDGt4l/MueIDzb3Y527eSd/fT9sqXIAS+pdhP05hMepGEexmBbrcKtT6eGCWDttHN+7hdOtxvVWOry0Z77i5myTsZsEEClzpA3yn0/nWP3IPllzZ43HeOp/gXvEdyQzSdSj7rV1aOF+LO3Q7lMxjHYPvgDoJur453Y6LnffoEO5ysb2epz6UvqnTzByed9A3JbjPCBmm7c6GqRfAbhCK5n1zOS46rsbVByN+xo6GRKGxVRdeF5miph6EwW1V2pZPxd27+iFE+gHuQJ1mS/903FUdoZOK+OD4ATB3dbhNAzJIw83W0ZwS4sd42druFBoP5sw7CXslDDfn45K9xkISg8xF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\";\n export default img;","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYEAAADACAMAAADV9C9rAAAAhFBMVEVMaXH8/Pz///////+w19Qfp577+/v////////L5eP+/v7////////////////J5uT////////////////////////////+/v7////////////////////////////////+/v4fp54dpZz///8cpJsepZwepp0epp0fp57a7u3///8hr6ahFaQbAAAAKnRSTlMABvfvAf0E/vwCD2Xc5VIMNqUru9OIQFwXx31xJK+TSR3rTpwmeZq10VG02FS/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR42u1diXKjuhJl0bBjMGYzi3HibEX+//9ed0uABDhxcp2pehNUc+9MjMFOH/W+SNO2ta1tbWtb29rWtra1rX9wMVjwv40Qf53ulmW5lot/gPwuLvgZf9qI8+PLReJ/fHWD4cfWSHzLOzdJnHe7ovBrvyh2XR7HzdmzOIvA+zYU7i95BPX1c9L52eVwDEyjn5Zjhunhkvld3HguZwZ3I9p9dz9Sv8n9Uxs4nOi2Y0zLsQUS4XFfFXHJJsy29d/JrwP5WZnXl6PZA6UHyjuODYv+78DiryE0fdhWXaPDTbq1ke8/Sx8dKKmVXdWGQFra90jyfnXZHAh4Q28eT0WsI3wbI/xH6a9pUV4dQiCvIYj74UIeQRic3rbTS3EGlbBh8H3LUwebpvHbACiLQgeF/ScATMxAEsk8VLmLz9mI+V36x9mRS37nQ9LbQhfQsklK2Six4O9gvwP6b0r5G/IfiJZfwPBxjCubH18ZNDDXzKSQnfEnAqEHvVxE8LwNgy/aP0j/0B7ov9z0XNKovGE7sotAlx0ujAADS9/I+gUBpGvxHukPa7H7bVuQly4YwbG9ZBV6xruu2+12hV9ll/YYkMPGGQLeddht6uArDKCdsxDJZy/obwuHAC+Yx0u9i5Nz6c22t+WVTZLvqv3RECgAH7Q5PHiLVtxEf6YXR6cn22dJf1vY+4esiM8ek8OlYo0C3/WauMgOJjel+vB01jY2uIkBktbonaXfZdskfOCv4LRLSn2IhvIgNZOC1y6FqjkSepkUpxTdCcdOdxsEn5tAWlSHtrMEgNMf1Gpw6s4Rvdf9OCGASHAUonMHICDnnEptM4o+VsFaciAGcFZsH1C95n7H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\";\n export default img;","/**\n * MED-1629: the Medecine360 logos ship with the package (inlined as data URIs by\n * @rollup/plugin-image), so consuming apps need no `/image/logo*.png` in their public folder.\n * Sized to 2x the largest rendered height (Logo xl = 96px, icon xl = 64px).\n */\nimport logoIcon from \"../../assets/logo/logoIcon.png\";\nimport logo from \"../../assets/logo/logo.png\";\nimport logoFullWhite from \"../../assets/logo/logoFullWhite.png\";\nimport logoWhite from \"../../assets/logo/logoWhite.png\";\n\nexport const logoAssets = {\n normal: logo,\n white: logoWhite,\n fullWhite: logoFullWhite,\n favicon: logoIcon,\n} as const;\n","import type { SyntheticEvent } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { LogoProps } from \"./Logo.types\";\nimport { logoAssets } from \"./logoAssets\";\n\nconst Logo = ({\n size = \"md\",\n showTagline: _showTagline = true,\n iconOnly = false,\n variant = \"normal\",\n className,\n onClick,\n customSrc,\n alt = \"MEDECINE 360 Logo\",\n clickable = false,\n}: LogoProps) => {\n const sizes = {\n sm: \"h-8\",\n md: \"h-12\",\n lg: \"h-16\",\n xl: \"h-24\",\n };\n\n const iconSizes = {\n sm: \"h-6 w-6\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n };\n\n // Bundled logo per variant (MED-1629); customSrc wins. iconOnly always uses the icon.\n const logoSrc = customSrc || (iconOnly ? logoAssets.favicon : logoAssets[variant]);\n const fallbackSrc = iconOnly ? logoAssets.favicon : logoAssets.normal;\n\n // On a load error, fall back to the bundled logo once, then hide the image (keeps layout).\n const handleError = (e: SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n if (img.getAttribute(\"src\") !== fallbackSrc) {\n img.src = fallbackSrc;\n } else {\n img.style.visibility = \"hidden\";\n }\n };\n\n const isClickable = clickable || !!onClick;\n\n if (iconOnly) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n iconSizes[size],\n isClickable && \"cursor-pointer\",\n className\n )}\n onClick={onClick}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n >\n <img\n src={logoSrc}\n alt={alt}\n className=\"object-contain w-full h-full\"\n onError={handleError}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center\",\n sizes[size],\n isClickable && \"cursor-pointer\",\n className\n )}\n onClick={onClick}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n >\n {/* Logo Image */}\n <img\n src={logoSrc}\n alt={alt}\n className=\"object-contain w-auto h-full\"\n onError={handleError}\n />\n </div>\n );\n};\n\nexport type { LogoProps, LogoSize, LogoVariant } from \"./Logo.types\";\nexport { Logo };\n","import { ThemeConfig } from \"../types/theme\";\n\nexport const PROMED_THEME: ThemeConfig = {\n name: \"PROMED\",\n colors: {\n primary: \"#21596C\",\n secondary: \"#3BA1A1\",\n primaryHover: \"#1a4756\",\n secondaryHover: \"#308181\",\n primaryLight: \"#c0d0d4\",\n success: \"#059669\",\n successHover: \"#047857\",\n warning: \"#d97706\",\n warningHover: \"#b45309\",\n error: \"#dc2626\",\n errorHover: \"#b91c1c\",\n },\n};\n\nexport const MED_THEME: ThemeConfig = {\n name: \"MED\",\n colors: {\n primary: \"#3BA1A1\", // Teal for patients (calming, trustworthy)\n secondary: \"#6B73FF\", // Soft purple-blue (suggested secondary for MED)\n primaryHover: \"#308181\",\n secondaryHover: \"#5a61e6\",\n primaryLight: \"#a8d5d5\",\n success: \"#059669\",\n successHover: \"#047857\",\n warning: \"#d97706\",\n warningHover: \"#b45309\",\n error: \"#dc2626\",\n errorHover: \"#b91c1c\",\n },\n};\n\nexport const THEMES = {\n PROMED: PROMED_THEME,\n MED: MED_THEME,\n} as const;\n","import React, {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { Theme, ThemeContextType } from \"../types/theme\";\nimport { THEMES } from \"./themeConfig\";\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = \"PROMED\",\n}) => {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n const [themeConfig, setThemeConfig] = useState(THEMES[defaultTheme]);\n\n // Update theme config when theme changes\n useEffect(() => {\n setThemeConfig(THEMES[theme]);\n\n // Update data-theme attribute for CSS variable switching\n const root = document.documentElement;\n root.setAttribute(\"data-theme\", theme);\n\n // Also update CSS custom properties for backward compatibility\n const colors = THEMES[theme].colors;\n root.style.setProperty(\"--ews-primary\", colors.primary);\n root.style.setProperty(\"--ews-primary-hover\", colors.primaryHover);\n root.style.setProperty(\"--ews-primary-light\", colors.primaryLight);\n root.style.setProperty(\"--ews-secondary\", colors.secondary);\n root.style.setProperty(\"--ews-secondary-hover\", colors.secondaryHover);\n root.style.setProperty(\"--ews-success\", colors.success);\n root.style.setProperty(\"--ews-success-hover\", colors.successHover);\n root.style.setProperty(\"--ews-warning\", colors.warning);\n root.style.setProperty(\"--ews-warning-hover\", colors.warningHover);\n root.style.setProperty(\"--ews-error\", colors.error);\n root.style.setProperty(\"--ews-error-hover\", colors.errorHover);\n }, [theme]);\n\n const handleSetTheme = (newTheme: Theme) => {\n setTheme(newTheme);\n };\n\n const value: ThemeContextType = {\n theme,\n setTheme: handleSetTheme,\n themeConfig,\n };\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\n","import React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { Theme } from \"../../types/theme\";\n\nexport interface ThemeToggleProps {\n className?: string;\n}\n\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className }) => {\n const { theme, setTheme } = useTheme();\n\n const handleThemeChange = (newTheme: Theme) => {\n setTheme(newTheme);\n };\n\n return (\n <div className={`flex items-center space-x-2 ${className || \"\"}`}>\n <span className=\"text-sm font-medium text-gray-700\">Theme:</span>\n <div className=\"flex bg-gray-100 rounded-lg p-1\">\n <button\n onClick={() => handleThemeChange(\"PROMED\")}\n className={`px-3 py-1 text-xs font-medium rounded-md transition-colors ${\n theme === \"PROMED\"\n ? \"bg-ews-primary text-white\"\n : \"text-gray-600 hover:text-gray-900\"\n }`}\n >\n PROMED\n </button>\n <button\n onClick={() => handleThemeChange(\"MED\")}\n className={`px-3 py-1 text-xs font-medium rounded-md transition-colors ${\n theme === \"MED\"\n ? \"bg-ews-primary text-white\"\n : \"text-gray-600 hover:text-gray-900\"\n }`}\n >\n MED\n </button>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\n\nexport interface ThemeDebuggerProps {\n className?: string;\n}\n\nexport const ThemeDebugger: React.FC<ThemeDebuggerProps> = ({\n className = \"\",\n}) => {\n const { theme, themeConfig, setTheme } = useTheme();\n\n const getComputedStyleValue = (property: string) => {\n if (typeof window !== \"undefined\") {\n return getComputedStyle(document.documentElement).getPropertyValue(\n property\n );\n }\n return \"N/A\";\n };\n\n return (\n <div className={`p-4 border rounded-lg bg-gray-50 ${className}`}>\n <h3 className=\"text-lg font-semibold mb-4\">Theme Debugger</h3>\n\n <div className=\"space-y-3\">\n <div>\n <strong>Current Theme:</strong> {theme}\n </div>\n\n <div>\n <strong>Theme Config:</strong>\n <pre className=\"text-xs bg-gray-100 p-2 rounded mt-1\">\n {JSON.stringify(themeConfig, null, 2)}\n </pre>\n </div>\n\n <div>\n <strong>CSS Variables:</strong>\n <div className=\"text-xs space-y-1 mt-1\">\n <div>--ews-primary: {getComputedStyleValue(\"--ews-primary\")}</div>\n <div>\n --ews-secondary: {getComputedStyleValue(\"--ews-secondary\")}\n </div>\n <div>\n --ews-primary-hover:{\" \"}\n {getComputedStyleValue(\"--ews-primary-hover\")}\n </div>\n <div>\n --ews-secondary-hover:{\" \"}\n {getComputedStyleValue(\"--ews-secondary-hover\")}\n </div>\n </div>\n </div>\n\n <div>\n <strong>Data Theme Attribute:</strong>{\" \"}\n {document.documentElement.getAttribute(\"data-theme\")}\n </div>\n\n <div className=\"flex space-x-2\">\n <button\n onClick={() => setTheme(\"PROMED\")}\n className={`px-3 py-1 text-xs rounded ${\n theme === \"PROMED\"\n ? \"bg-ews-primary text-white\"\n : \"bg-gray-200 text-gray-700\"\n }`}\n >\n PROMED\n </button>\n <button\n onClick={() => setTheme(\"MED\")}\n className={`px-3 py-1 text-xs rounded ${\n theme === \"MED\"\n ? \"bg-ews-primary text-white\"\n : \"bg-gray-200 text-gray-700\"\n }`}\n >\n MED\n </button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2 mt-4\">\n <div className=\"bg-ews-primary text-white p-2 rounded text-center\">\n Primary\n </div>\n <div className=\"bg-ews-secondary text-white p-2 rounded text-center\">\n Secondary\n </div>\n <div className=\"bg-ews-success text-white p-2 rounded text-center\">\n Success\n </div>\n <div className=\"bg-ews-warning text-white p-2 rounded text-center\">\n Warning\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { Select } from \"../Select\";\nimport { getRegionOptions, SupportedCountry } from \"../../utils/locations\";\n\nexport interface RegionSelectProps {\n /** ISO country key (e.g. \"SENEGAL\", \"CHAD\") — case-insensitive */\n country?: string;\n value?: string;\n onChange?: (value: string) => void;\n label?: string;\n placeholder?: string;\n error?: string;\n isError?: boolean;\n disabled?: boolean;\n required?: boolean;\n containerClassName?: string;\n}\n\nexport function RegionSelect({\n country = SupportedCountry.SENEGAL,\n value,\n onChange,\n label,\n placeholder = \"Select a region\",\n error,\n isError,\n disabled,\n required,\n containerClassName,\n}: RegionSelectProps) {\n const options = getRegionOptions(country);\n\n return (\n <Select\n options={options}\n value={value}\n onChange={(val) => onChange?.(val as string)}\n label={label}\n placeholder={placeholder}\n error={error}\n isError={isError}\n disabled={disabled}\n required={required}\n searchable\n containerClassName={containerClassName}\n />\n );\n}\n","import React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface TagProps {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"plain\";\n className?: string;\n}\n\nexport const Tag: React.FC<TagProps> = ({\n label,\n variant = \"plain\",\n className,\n}) => {\n const variantClass =\n variant === \"primary\"\n ? \"bg-ews-primary text-white\"\n : variant === \"secondary\"\n ? \"bg-ews-secondary text-white\"\n : \"bg-gray-200 text-gray-800\";\n\n return (\n <span\n className={cn(\n \"inline-block rounded-md px-2.5 py-1 text-sm font-medium\",\n variantClass,\n className\n )}\n >\n {label}\n </span>\n );\n};\n","import React, { useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Tag, TagProps } from \"../Tag/Tag\";\n\nexport interface TagListProps {\n items: string[];\n maxVisible?: number;\n showMoreLabel: string;\n showLessLabel: string;\n variant?: TagProps[\"variant\"];\n className?: string;\n /** Custom renderer for each tag. Overrides the default Tag component. */\n renderTag?: (label: string, index: number) => React.ReactNode;\n}\n\nconst DEFAULT_MAX = 3;\n\nexport const TagList: React.FC<TagListProps> = ({\n items,\n maxVisible = DEFAULT_MAX,\n showMoreLabel,\n showLessLabel,\n variant = \"secondary\",\n className,\n renderTag,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const hasMore = items.length > maxVisible;\n const visible = expanded ? items : items.slice(0, maxVisible);\n\n const handleToggle = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setExpanded(prev => !prev);\n };\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2\", className)}>\n {visible.map((label, i) =>\n renderTag ? (\n renderTag(label, i)\n ) : (\n <Tag key={i} label={label} variant={variant} />\n )\n )}\n {hasMore && !expanded && (\n <span className=\"text-sm text-gray-400\">...</span>\n )}\n {hasMore && (\n <button\n onClick={handleToggle}\n className=\"text-xs text-ews-primary hover:underline\"\n >\n {expanded ? showLessLabel : showMoreLabel}\n </button>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { AlertTriangle, X } from \"lucide-react\";\n\n/**\n * The banner is purely presentational: the caller decides when to render it\n * (e.g. due date within 7 days or overdue) and provides already-translated\n * labels.\n */\nexport interface PaymentDueBannerProps {\n title: string;\n subtitle?: string;\n /** Extra warning line shown under the subtitle (e.g. discount loss). */\n warning?: string;\n ctaLabel: string;\n onCtaClick: () => void;\n /** When omitted, the dismiss button is not rendered. */\n onDismiss?: () => void;\n dismissLabel?: string;\n}\n\n/**\n * Full-width payment reminder banner (red gradient) used above the app\n * content when a licence payment is due soon or overdue.\n */\nconst PaymentDueBanner: React.FC<PaymentDueBannerProps> = ({\n title,\n subtitle,\n warning,\n ctaLabel,\n onCtaClick,\n onDismiss,\n dismissLabel = \"Close\",\n}) => (\n <div\n data-testid=\"payment-banner\"\n className=\"overflow-hidden bg-gradient-to-r from-red-600 to-red-700 shadow-lg\"\n >\n <div className=\"px-6 py-8 sm:px-8\">\n <div className=\"flex flex-col space-y-6 sm:flex-row sm:items-center sm:justify-between sm:space-y-0\">\n {/* Left: icon + text */}\n <div className=\"flex items-center space-x-4\">\n <AlertTriangle className=\"w-8 h-8 text-white shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-2xl font-bold text-white\">{title}</h3>\n {subtitle && (\n <p className=\"mt-2 text-base text-red-100\">{subtitle}</p>\n )}\n {warning && (\n <p className=\"mt-1 text-sm font-medium text-red-200\">{warning}</p>\n )}\n </div>\n </div>\n\n {/* Right: actions */}\n <div className=\"flex flex-col flex-shrink-0 gap-3 sm:flex-row sm:gap-4 sm:items-center\">\n <button\n onClick={onCtaClick}\n className=\"w-full px-8 py-3 text-base font-semibold text-red-600 bg-white rounded-lg shadow-sm transition-all duration-200 sm:w-auto hover:bg-red-50 hover:shadow-md\"\n >\n {ctaLabel}\n </button>\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"self-start p-2 rounded-full transition-colors bg-white/10 hover:bg-white/20 sm:self-auto\"\n aria-label={dismissLabel}\n >\n <X className=\"w-5 h-5 text-white\" />\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n);\n\nexport { PaymentDueBanner };\n","import React from \"react\";\nimport { Lock } from \"lucide-react\";\n\n/**\n * The loader is purely presentational: the caller decides when to render it\n * (while the session is validated, fetched or terminated) and provides\n * already-translated labels.\n */\nexport interface SecureLoaderProps {\n label: string;\n /** Extra line shown under the label. */\n description?: string;\n}\n\n/**\n * Full-screen loader (lock icon with a spinner) shown while the user's\n * session is being checked.\n */\nconst SecureLoader: React.FC<SecureLoaderProps> = ({ label, description }) => (\n <div\n data-testid=\"secure-loader\"\n className=\"flex min-h-screen items-center justify-center bg-gray-100\"\n >\n <div className=\"flex flex-col items-center rounded-lg bg-white p-6 shadow-lg\">\n <div className=\"relative\">\n <Lock className=\"h-16 w-16 text-gray-500\" />\n <div className=\"absolute bottom-2 right-1 h-6 w-6 animate-spin rounded-full border-4 border-gray-300 border-t-green-500\"></div>\n </div>\n <p className=\"mt-4 text-lg text-gray-600\">{label}</p>\n {description && (\n <p className=\"mt-2 text-sm text-gray-500\">{description}</p>\n )}\n </div>\n </div>\n);\n\nexport default SecureLoader;\n","import { Delete } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { PinPadProps } from \"./PinPad.types\";\n\nconst DIGIT_ROWS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"];\n\nconst keyClass =\n \"flex h-16 w-16 items-center justify-center justify-self-center rounded-full text-3xl font-light text-ews-gray-900 \" +\n \"transition-colors hover:bg-ews-gray-100 active:bg-ews-gray-200 \" +\n \"focus-visible:ring-2 focus-visible:ring-ews-primary disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent\";\n\n/**\n * iOS-style PIN entry: a row of dots filled as digits are typed and a 3x4\n * keypad. Texts are provided by the caller (already translated).\n */\nconst PinPad = ({\n length = 4,\n onComplete,\n onChange,\n disabled = false,\n invalid = false,\n resetKey,\n captureKeyboard = true,\n eraseLabel,\n progressLabel,\n keypadLabel,\n className,\n}: PinPadProps) => {\n const [value, setValue] = useState(\"\");\n const valueRef = useRef(\"\");\n\n const update = useCallback(\n (next: string) => {\n valueRef.current = next;\n setValue(next);\n onChange?.(next);\n if (next.length === length) onComplete(next);\n },\n [length, onChange, onComplete],\n );\n\n // Clear the typed digits when the caller asks for it.\n useEffect(() => {\n valueRef.current = \"\";\n setValue(\"\");\n }, [resetKey]);\n\n const press = useCallback(\n (digit: string) => {\n if (disabled || valueRef.current.length >= length) return;\n update(valueRef.current + digit);\n },\n [disabled, length, update],\n );\n\n const erase = useCallback(() => {\n if (disabled || valueRef.current.length === 0) return;\n update(valueRef.current.slice(0, -1));\n }, [disabled, update]);\n\n useEffect(() => {\n if (!captureKeyboard) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n const target = event.target as HTMLElement | null;\n if (target && (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\")) return;\n if (/^[0-9]$/.test(event.key)) {\n event.preventDefault();\n press(event.key);\n } else if (event.key === \"Backspace\") {\n event.preventDefault();\n erase();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [captureKeyboard, press, erase]);\n\n return (\n <div className={cn(\"flex flex-col items-center gap-10\", className)}>\n {/* Keypads stay left-to-right in RTL locales, like phone keypads. */}\n <div\n dir=\"ltr\"\n aria-hidden=\"true\"\n data-testid=\"pin-dots\"\n className={cn(\"flex gap-5\", invalid && \"animate-pin-shake\")}\n >\n {Array.from({ length }, (_, index) => (\n <span\n key={index}\n data-filled={index < value.length}\n className={cn(\n \"h-3.5 w-3.5 rounded-full transition-colors\",\n invalid\n ? \"bg-ews-error\"\n : index < value.length\n ? \"bg-ews-primary\"\n : \"bg-ews-primary-light\",\n disabled && index < value.length && \"animate-pulse\",\n )}\n />\n ))}\n </div>\n <p className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {progressLabel(value.length, length)}\n </p>\n\n <div\n dir=\"ltr\"\n role=\"group\"\n aria-label={keypadLabel}\n className=\"grid grid-cols-3 gap-x-8 gap-y-4\"\n >\n {DIGIT_ROWS.map((digit) => (\n <button\n key={digit}\n type=\"button\"\n className={keyClass}\n disabled={disabled}\n onClick={() => press(digit)}\n >\n {digit}\n </button>\n ))}\n <span aria-hidden=\"true\" />\n <button\n type=\"button\"\n className={keyClass}\n disabled={disabled}\n onClick={() => press(\"0\")}\n >\n 0\n </button>\n <button\n type=\"button\"\n className={cn(keyClass, \"text-ews-gray-700\")}\n disabled={disabled || value.length === 0}\n aria-label={eraseLabel}\n onClick={erase}\n >\n <Delete className=\"h-7 w-7\" strokeWidth={1.5} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n );\n};\n\nexport type { PinPadProps } from \"./PinPad.types\";\nexport { PinPad };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { PinCodeInputProps } from \"./PinCodeInput.types\";\n\nconst MASK = \"•\";\nconst onlyDigits = (text: string) => text.replace(/\\D/g, \"\");\n\n/**\n * Row of one-digit boxes for a PIN or a one-time code (desktop keyboards):\n * typing moves to the next box, Backspace goes back, arrows move, pasting a\n * code fills the boxes and `onComplete` fires once every box is filled.\n */\nconst PinCodeInput = ({\n length = 4,\n onComplete,\n onChange,\n masked = true,\n autoComplete = \"off\",\n autoFocus = true,\n disabled = false,\n invalid = false,\n resetKey,\n digitLabel,\n groupLabel,\n className,\n}: PinCodeInputProps) => {\n const empty = useCallback(() => Array.from({ length }, () => \"\"), [length]);\n const [digits, setDigits] = useState<string[]>(empty);\n const digitsRef = useRef<string[]>(digits);\n const inputs = useRef<Array<HTMLInputElement | null>>([]);\n\n const focusBox = (index: number) => {\n const input = inputs.current[Math.max(0, Math.min(index, length - 1))];\n input?.focus();\n input?.select();\n };\n\n const update = (next: string[]) => {\n digitsRef.current = next;\n setDigits(next);\n const value = next.join(\"\");\n onChange?.(value);\n if (value.length === length && next.every(Boolean)) onComplete(value);\n };\n\n /** Writes `chars` from box `start` on and focuses the box after them. */\n const fill = (start: number, chars: string) => {\n const next = [...digitsRef.current];\n const written = chars.slice(0, length - start).split(\"\");\n written.forEach((char, offset) => {\n next[start + offset] = char;\n });\n focusBox(start + written.length);\n update(next);\n };\n\n // Clear the boxes when the caller asks for it.\n useEffect(() => {\n const cleared = empty();\n digitsRef.current = cleared;\n setDigits(cleared);\n }, [resetKey, empty]);\n\n // Focus the first empty box on mount, after a reset and once re-enabled.\n useEffect(() => {\n if (!autoFocus || disabled) return;\n const firstEmpty = digitsRef.current.findIndex((digit) => !digit);\n focusBox(firstEmpty === -1 ? length - 1 : firstEmpty);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoFocus, disabled, resetKey, length]);\n\n const handleChange = (index: number, event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n const { value, selectionStart } = event.target;\n const typed = onlyDigits(value);\n if (!typed) {\n const next = [...digitsRef.current];\n next[index] = \"\";\n update(next);\n return;\n }\n // A digit typed next to the one already in the box: keep the new one.\n if (digitsRef.current[index] && value.length === 2) {\n const inserted = value.charAt((selectionStart ?? value.length) - 1);\n if (/\\d/.test(inserted)) {\n fill(index, inserted);\n return;\n }\n }\n // One digit, or a whole code (browser autofill of the one-time code).\n fill(typed.length >= length ? 0 : index, typed);\n };\n\n const handleKeyDown = (index: number, event: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n switch (event.key) {\n case \"Backspace\": {\n event.preventDefault();\n const next = [...digitsRef.current];\n const target = next[index] ? index : Math.max(0, index - 1);\n next[target] = \"\";\n focusBox(target);\n update(next);\n return;\n }\n case \"Delete\": {\n event.preventDefault();\n const next = [...digitsRef.current];\n next[index] = \"\";\n update(next);\n return;\n }\n case \"ArrowLeft\":\n event.preventDefault();\n focusBox(index - 1);\n return;\n case \"ArrowRight\":\n event.preventDefault();\n focusBox(index + 1);\n return;\n case \"Home\":\n event.preventDefault();\n focusBox(0);\n return;\n case \"End\":\n event.preventDefault();\n focusBox(length - 1);\n return;\n }\n };\n\n const handlePaste = (index: number, event: React.ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault();\n if (disabled) return;\n const pasted = onlyDigits(event.clipboardData.getData(\"text\"));\n if (!pasted) return;\n fill(pasted.length >= length ? 0 : index, pasted);\n };\n\n return (\n // Codes stay left-to-right in RTL locales.\n <div\n dir=\"ltr\"\n role=\"group\"\n aria-label={groupLabel}\n data-testid=\"pin-code-input\"\n className={cn(\"flex justify-center gap-3\", invalid && \"animate-pin-shake\", className)}\n >\n {digits.map((digit, index) => (\n <input\n key={index}\n ref={(element) => {\n inputs.current[index] = element;\n }}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n autoComplete={index === 0 ? autoComplete : \"off\"}\n autoCorrect=\"off\"\n spellCheck={false}\n value={digit && masked ? MASK : digit}\n disabled={disabled}\n aria-label={digitLabel(index + 1, length)}\n aria-invalid={invalid || undefined}\n data-filled={!!digit}\n onChange={(event) => handleChange(index, event)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={(event) => handlePaste(index, event)}\n onFocus={(event) => event.target.select()}\n className={cn(\n \"h-14 w-12 rounded-lg border bg-white text-center text-2xl font-medium text-ews-gray-900 outline-none\",\n \"transition-colors focus:border-ews-primary focus:ring-2 focus:ring-ews-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n invalid ? \"border-ews-error\" : digit ? \"border-ews-primary\" : \"border-ews-gray-300\",\n disabled && digit && \"animate-pulse\",\n )}\n />\n ))}\n </div>\n );\n};\n\nexport type { PinCodeInputProps } from \"./PinCodeInput.types\";\nexport { PinCodeInput };\n","import { Mic, SendHorizontal } from \"lucide-react\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { useSpeechRecognition } from \"../../hooks/useSpeechRecognition\";\nimport { cn } from \"../../utils\";\nimport type { AssistantLanguage } from \"./AssistantChat.types\";\n\nexport interface AssistantComposerProps {\n language: AssistantLanguage;\n onSend: (content: string) => void;\n disabled?: boolean;\n /** Mic button; hidden anyway where the browser has no speech API. */\n voice?: boolean;\n texts: {\n placeholder: string;\n hint: string;\n send: string;\n holdToTalk: string;\n listening: string;\n };\n className?: string;\n}\n\nexport const MAX_MESSAGE_LENGTH = 2000;\n\n/**\n * The composer of the mockup: textarea, hint, push-to-talk mic (hold to\n * record, release to send) and a send button. Enter sends, Shift+Enter breaks.\n */\nexport const AssistantComposer: React.FC<AssistantComposerProps> = ({\n language,\n onSend,\n disabled = false,\n voice = true,\n texts,\n className,\n}) => {\n const [value, setValue] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const submit = useCallback(\n (content: string) => {\n const trimmed = content.trim();\n if (!trimmed || disabled) return;\n onSend(trimmed.slice(0, MAX_MESSAGE_LENGTH));\n setValue(\"\");\n },\n [disabled, onSend]\n );\n\n const speech = useSpeechRecognition({\n language,\n onInterim: (text) => setValue(text),\n onResult: (text) => submit(text),\n });\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit(value);\n }\n };\n\n const showMic = voice && speech.supported;\n\n // A plain div rather than a <form>: Enter and the send button submit, and a\n // form followed by a sibling trips React hydration under happy-dom (the apps'\n // server-rendering tests) although browsers are fine.\n return (\n <div className={cn(\"w-full\", className)}>\n <div\n className={cn(\n \"flex items-end gap-2 rounded-2xl border border-ews-gray-200 bg-white px-3 py-2 shadow-sm\",\n \"focus-within:border-ews-primary focus-within:ring-2 focus-within:ring-ews-primary/20\"\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n maxLength={MAX_MESSAGE_LENGTH}\n placeholder={speech.listening ? texts.listening : texts.placeholder}\n aria-label={texts.placeholder}\n disabled={disabled}\n className=\"max-h-40 min-h-[2.5rem] flex-1 resize-none bg-transparent py-2 text-base text-ews-gray-900 placeholder:text-ews-gray-400 focus:outline-none disabled:opacity-60\"\n />\n {showMic && (\n <button\n type=\"button\"\n aria-label={texts.holdToTalk}\n aria-pressed={speech.listening}\n title={texts.holdToTalk}\n disabled={disabled}\n onMouseDown={speech.start}\n onMouseUp={speech.stop}\n onMouseLeave={speech.listening ? speech.stop : undefined}\n onTouchStart={speech.start}\n onTouchEnd={speech.stop}\n onKeyDown={(event) => {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n if (speech.listening) speech.stop();\n else speech.start();\n }\n }}\n className={cn(\n \"rounded-full p-2 transition-colors focus:outline-none focus:ring-2 focus:ring-ews-primary\",\n speech.listening\n ? \"bg-ews-error text-white animate-pulse\"\n : \"text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-primary\",\n \"disabled:opacity-50\"\n )}\n data-testid=\"assistant-mic\"\n >\n <Mic className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => submit(value)}\n aria-label={texts.send}\n title={texts.send}\n disabled={disabled || value.trim().length === 0}\n className=\"rounded-full bg-ews-primary p-2 text-white transition-colors hover:bg-ews-primary-hover focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1 disabled:opacity-40\"\n data-testid=\"assistant-send\"\n >\n <SendHorizontal className=\"h-5 w-5 rtl:-scale-x-100\" aria-hidden=\"true\" />\n </button>\n </div>\n <p className=\"mt-1.5 px-2 text-xs text-ews-gray-400\">{texts.hint}</p>\n </div>\n );\n};\n","import { ShieldCheck } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\nimport type { AssistantConfirmation } from \"./AssistantChat.types\";\n\nexport interface AssistantConfirmationCardProps {\n confirmation: AssistantConfirmation;\n onConfirm: (confirmation: AssistantConfirmation) => void;\n onCancel: (confirmation: AssistantConfirmation) => void;\n texts: { confirm: string; cancel: string };\n busy?: boolean;\n className?: string;\n}\n\n/**\n * Reserved for phase 2 (MED-1779): the card the assistant shows before a\n * write (booking, cancellation). Title, details, confirm and cancel wired to\n * the app, so phase 2 needs no component change.\n */\nexport const AssistantConfirmationCard: React.FC<AssistantConfirmationCardProps> = ({\n confirmation,\n onConfirm,\n onCancel,\n texts,\n busy = false,\n className,\n}) => (\n <section\n aria-label={confirmation.title}\n className={cn(\n \"rounded-xl border border-ews-primary/30 bg-ews-primary-light/30 p-4\",\n className\n )}\n data-testid=\"assistant-confirmation\"\n >\n <h3 className=\"flex items-center gap-2 font-semibold text-ews-gray-900\">\n <ShieldCheck className=\"h-5 w-5 text-ews-primary\" aria-hidden=\"true\" />\n {confirmation.title}\n </h3>\n <dl className=\"mt-3 grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n {confirmation.details.map((detail) => (\n <React.Fragment key={detail.label}>\n <dt className=\"text-ews-gray-500\">{detail.label}</dt>\n <dd className=\"font-medium text-ews-gray-900\">{detail.value}</dd>\n </React.Fragment>\n ))}\n </dl>\n <div className=\"mt-4 flex gap-2\">\n <Button size=\"sm\" loading={busy} onClick={() => onConfirm(confirmation)}>\n {texts.confirm}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={() => onCancel(confirmation)}>\n {texts.cancel}\n </Button>\n </div>\n </section>\n);\n","import { MessageSquare, SquarePen, UserRound } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantConversationSummary } from \"./AssistantChat.types\";\n\nexport interface AssistantConversationListProps {\n conversations: AssistantConversationSummary[];\n activeConversationId?: string | null;\n onSelect?: (conversationId: string) => void;\n onNew?: () => void;\n texts: {\n newConversation: string;\n recentConversations: string;\n signIn: string;\n signInHint: string;\n };\n signInHref?: string;\n className?: string;\n}\n\n/** Left column of the mockup: new discussion, recent ones, sign-in prompt at the bottom. */\nexport const AssistantConversationList: React.FC<AssistantConversationListProps> = ({\n conversations,\n activeConversationId,\n onSelect,\n onNew,\n texts,\n signInHref,\n className,\n}) => (\n <nav\n aria-label={texts.recentConversations}\n className={cn(\"flex h-full flex-col gap-4 bg-ews-gray-50 p-3\", className)}\n >\n <button\n type=\"button\"\n onClick={onNew}\n className=\"flex items-center gap-2 rounded-lg border border-ews-gray-200 bg-white px-3 py-2 text-sm font-medium text-ews-gray-800 hover:border-ews-primary hover:text-ews-primary\"\n >\n <SquarePen className=\"h-4 w-4\" aria-hidden=\"true\" />\n {texts.newConversation}\n </button>\n\n {conversations.length > 0 && (\n <ul className=\"flex-1 space-y-1 overflow-y-auto\" data-testid=\"assistant-conversation-list\">\n {conversations.map((conversation) => {\n const active = conversation.id === activeConversationId;\n return (\n <li key={conversation.id}>\n <button\n type=\"button\"\n onClick={() => onSelect?.(conversation.id)}\n aria-current={active ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center gap-2 truncate rounded-md px-2 py-1.5 text-start text-sm\",\n active\n ? \"bg-white font-medium text-ews-primary shadow-sm\"\n : \"text-ews-gray-700 hover:bg-white\"\n )}\n >\n <MessageSquare className=\"h-3.5 w-3.5 shrink-0 text-ews-gray-400\" aria-hidden=\"true\" />\n <span className=\"truncate\">{conversation.title}</span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {signInHref && (\n <a\n href={signInHref}\n className=\"mt-auto flex items-start gap-2 rounded-lg px-2 py-2 text-sm hover:bg-white\"\n >\n <span className=\"rounded-full bg-ews-primary-light p-1.5 text-ews-primary\" aria-hidden=\"true\">\n <UserRound className=\"h-4 w-4\" />\n </span>\n <span>\n <span className=\"block font-medium text-ews-gray-900\">{texts.signIn}</span>\n <span className=\"block text-xs text-ews-gray-500\">{texts.signInHint}</span>\n </span>\n </a>\n )}\n </nav>\n);\n","import React from \"react\";\n\n/**\n * The tiny markdown subset the assistant contract allows: paragraphs, bullet\n * lists, **bold** and [links](url). Everything else is plain text, so a\n * payload can never inject markup. Links to the current origin open in the\n * same tab (the host app may route them itself through `onLinkClick`);\n * links to other sites open in a new tab.\n */\nconst INLINE = /(\\*\\*[^*]+\\*\\*|\\[[^\\]]+\\]\\((?:https?:\\/\\/|\\/)[^)\\s]+\\))/g;\n\nexport interface AssistantMarkdownOptions {\n /**\n * Called when a link is clicked, before the browser follows it. Call\n * `event.preventDefault()` to navigate otherwise (e.g. the host router).\n */\n onLinkClick?: (href: string, event: React.MouseEvent<HTMLAnchorElement>) => void;\n /** Whether a link leaves the current site; such links open in a new tab. */\n isExternal?: (href: string) => boolean;\n}\n\n/** Absolute URL on another origin. Without a window (server rendering) every absolute URL counts as external. */\nexport function isExternalLink(href: string): boolean {\n if (!/^https?:\\/\\//i.test(href)) return false;\n if (typeof window === \"undefined\" || !window.location?.origin) return true;\n try {\n return new URL(href).origin !== window.location.origin;\n } catch {\n return true;\n }\n}\n\nfunction renderInline(text: string, keyPrefix: string, options: AssistantMarkdownOptions): React.ReactNode[] {\n const nodes: React.ReactNode[] = [];\n const isExternal = options.isExternal ?? isExternalLink;\n let last = 0;\n let index = 0;\n for (const match of text.matchAll(INLINE)) {\n const start = match.index ?? 0;\n if (start > last) nodes.push(text.slice(last, start));\n const token = match[0];\n if (token.startsWith(\"**\")) {\n nodes.push(\n <strong key={`${keyPrefix}-b${index}`}>{token.slice(2, -2)}</strong>\n );\n } else {\n const close = token.indexOf(\"](\");\n const label = token.slice(1, close);\n const href = token.slice(close + 2, -1);\n const external = isExternal(href);\n nodes.push(\n <a\n key={`${keyPrefix}-a${index}`}\n href={href}\n className=\"font-medium text-ews-primary underline underline-offset-2 hover:text-ews-primary-hover\"\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n onClick={options.onLinkClick ? (event) => options.onLinkClick?.(href, event) : undefined}\n >\n {label}\n </a>\n );\n }\n last = start + token.length;\n index++;\n }\n if (last < text.length) nodes.push(text.slice(last));\n return nodes;\n}\n\nexport function renderAssistantMarkdown(\n content: string,\n options: AssistantMarkdownOptions = {}\n): React.ReactNode[] {\n const blocks = content.replace(/\\r\\n/g, \"\\n\").split(/\\n{2,}/);\n const out: React.ReactNode[] = [];\n blocks.forEach((block, blockIndex) => {\n const lines = block.split(\"\\n\").filter((line) => line.trim().length > 0);\n if (lines.length === 0) return;\n const isList = lines.every((line) => /^\\s*[-*•]\\s+/.test(line));\n if (isList) {\n out.push(\n <ul key={`l${blockIndex}`} className=\"my-2 list-disc space-y-1 ps-5\">\n {lines.map((line, lineIndex) => (\n <li key={lineIndex}>\n {renderInline(line.replace(/^\\s*[-*•]\\s+/, \"\"), `l${blockIndex}-${lineIndex}`, options)}\n </li>\n ))}\n </ul>\n );\n } else {\n out.push(\n <p key={`p${blockIndex}`} className=\"my-2 first:mt-0 last:mb-0\">\n {lines.map((line, lineIndex) => (\n <React.Fragment key={lineIndex}>\n {lineIndex > 0 && <br />}\n {renderInline(line, `p${blockIndex}-${lineIndex}`, options)}\n </React.Fragment>\n ))}\n </p>\n );\n }\n });\n return out;\n}\n","import { AlertCircle, Loader2, RotateCcw } from \"lucide-react\";\nimport React, { useEffect, useRef } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantMessage } from \"./AssistantChat.types\";\nimport { renderAssistantMarkdown } from \"./assistantMarkdown\";\nimport type { AssistantMarkdownOptions } from \"./assistantMarkdown\";\n\nexport interface AssistantMessagesProps {\n messages: AssistantMessage[];\n /** The tool activity line shown under the streaming answer, e.g. \"Recherche de médecins…\". */\n activity?: string | null;\n onRetry?: (message: AssistantMessage) => void;\n texts: { thinking: string; retry: string; sources: string; brandName: string };\n /** Link handling of the answers (same-tab navigation through the host router). */\n linkOptions?: AssistantMarkdownOptions;\n className?: string;\n}\n\n/** The thread: user bubbles on the end side, assistant answers on the start side, auto-scrolled. */\nexport const AssistantMessages: React.FC<AssistantMessagesProps> = ({\n messages,\n activity,\n onRetry,\n texts,\n linkOptions,\n className,\n}) => {\n const endRef = useRef<HTMLDivElement>(null);\n const last = messages[messages.length - 1];\n\n useEffect(() => {\n endRef.current?.scrollIntoView?.({ block: \"end\" });\n }, [messages.length, last?.content, activity]);\n\n return (\n <div\n className={cn(\"flex flex-col gap-4\", className)}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n data-testid=\"assistant-messages\"\n >\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n return (\n <div\n key={message.id}\n className={cn(\"flex\", isUser ? \"justify-end\" : \"justify-start\")}\n data-testid={`assistant-message-${message.role}`}\n >\n <div\n className={cn(\n \"max-w-[85%] rounded-2xl px-4 py-3 text-base leading-relaxed\",\n isUser\n ? \"rounded-ee-md bg-ews-primary text-white\"\n : \"rounded-es-md bg-ews-gray-100 text-ews-gray-900\"\n )}\n >\n {isUser ? (\n <p className=\"whitespace-pre-wrap\">{message.content}</p>\n ) : (\n <>\n {message.content.length > 0 && renderAssistantMarkdown(message.content, linkOptions)}\n {message.status === \"streaming\" && message.content.length === 0 && (\n <span className=\"flex items-center gap-2 text-ews-gray-500\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {texts.thinking}\n </span>\n )}\n {message.status === \"streaming\" && activity && (\n <p className=\"mt-2 flex items-center gap-2 text-sm text-ews-gray-500\" data-testid=\"assistant-activity\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden=\"true\" />\n {activity}\n </p>\n )}\n {message.citations && message.citations.length > 0 && (\n <p className=\"mt-3 border-t border-ews-gray-200 pt-2 text-xs text-ews-gray-500\">\n <span className=\"font-medium\">{texts.sources}: </span>\n {message.citations.map((citation, index) => (\n <React.Fragment key={`${citation.url}-${index}`}>\n {index > 0 && \", \"}\n <a\n href={citation.url}\n className=\"underline underline-offset-2 hover:text-ews-primary\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {citation.title}\n </a>\n </React.Fragment>\n ))}\n </p>\n )}\n {message.status === \"error\" && message.error && (\n <div\n role=\"alert\"\n className=\"mt-2 flex flex-wrap items-center gap-2 text-sm text-ews-error\"\n data-testid=\"assistant-error\"\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span>{message.error.message}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={() => onRetry(message)}\n className=\"inline-flex items-center gap-1 rounded-md border border-ews-error/40 px-2 py-0.5 font-medium hover:bg-ews-error/10\"\n >\n <RotateCcw className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {texts.retry}\n </button>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n })}\n <div ref={endRef} />\n </div>\n );\n};\n","import { ArrowRight, Sparkles } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantSuggestion } from \"./AssistantChat.types\";\n\nexport interface AssistantSuggestionCardProps {\n suggestion: AssistantSuggestion;\n onSelect: (suggestion: AssistantSuggestion) => void;\n exampleLabel: string;\n disabled?: boolean;\n className?: string;\n}\n\n/** One of the cards under the hero (mockup med1): title, description, sent as a prompt on click. */\nexport const AssistantSuggestionCard: React.FC<AssistantSuggestionCardProps> = ({\n suggestion,\n onSelect,\n exampleLabel,\n disabled = false,\n className,\n}) => {\n const isExample = suggestion.kind === \"example\";\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(suggestion)}\n className={cn(\n \"flex h-full w-full flex-col items-start gap-2 rounded-xl border border-ews-gray-200 bg-white p-4 text-start shadow-sm transition-colors\",\n \"hover:border-ews-primary hover:bg-ews-gray-50 focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n className\n )}\n data-testid={`assistant-suggestion-${suggestion.id}`}\n >\n <span className=\"text-ews-gray-400\" aria-hidden=\"true\">\n {suggestion.icon ?? (isExample ? <Sparkles className=\"h-4 w-4\" /> : <ArrowRight className=\"h-4 w-4\" />)}\n </span>\n <span className=\"font-semibold text-ews-gray-900\">{suggestion.title}</span>\n {suggestion.description && (\n <span className=\"text-sm text-ews-gray-600\">{suggestion.description}</span>\n )}\n {isExample && (\n <span className=\"mt-auto text-xs uppercase tracking-wide text-ews-gray-400\">{exampleLabel}</span>\n )}\n </button>\n );\n};\n","import { History, SquarePen } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn, generateId } from \"../../utils\";\nimport type {\n AssistantChatProps,\n AssistantConversationSummary,\n AssistantEvent,\n AssistantMessage,\n} from \"./AssistantChat.types\";\nimport { AssistantComposer } from \"./AssistantComposer\";\nimport { AssistantConfirmationCard } from \"./AssistantConfirmationCard\";\nimport { AssistantConversationList } from \"./AssistantConversationList\";\nimport { AssistantMessages } from \"./AssistantMessages\";\nimport { AssistantSuggestionCard } from \"./AssistantSuggestionCard\";\n\nconst DIRECTION: Record<AssistantChatProps[\"language\"], \"ltr\" | \"rtl\"> = {\n fr: \"ltr\",\n en: \"ltr\",\n ar: \"rtl\",\n};\n\n/** A conversation title is its first message, cut like the mockup's sidebar. */\nexport function conversationTitle(firstMessage: string, max = 60): string {\n const oneLine = firstMessage.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}…` : oneLine;\n}\n\n/**\n * The chat home of the Medecine360 assistant (MED-1783, mockup med1):\n * conversation list, header with brand badge, hero with suggestion cards,\n * streamed thread, composer with push-to-talk. UI only: the app provides the\n * transport, the texts, the conversation memory and the links.\n *\n * Server-rendering safe: nothing touches `window` at render time, the\n * speech API is detected after mount.\n */\nexport const AssistantChat: React.FC<AssistantChatProps> = ({\n transport,\n language,\n texts,\n suggestions,\n conversations = [],\n activeConversationId = null,\n initialMessages,\n onConversationCreated,\n onSelectConversation,\n onNewConversation,\n signInHref,\n headerAction,\n disclaimer,\n heroBackground,\n voice = true,\n pendingConfirmation = null,\n onConfirm,\n onCancelConfirmation,\n layout = \"page\",\n queuedPrompt = null,\n onNavigate,\n historyOpen = false,\n onHistoryOpenChange,\n className,\n}) => {\n const [messages, setMessages] = useState<AssistantMessage[]>(initialMessages ?? []);\n const [activity, setActivity] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const conversationIdRef = useRef<string | null>(activeConversationId);\n const abortRef = useRef<AbortController | null>(null);\n\n // The app switched conversation: show its messages and talk to it from now on.\n // Not when the app merely echoes the id this component just created (send()\n // already set the ref): the thread in progress must stay on screen.\n useEffect(() => {\n if (conversationIdRef.current === activeConversationId) return;\n conversationIdRef.current = activeConversationId;\n setMessages(initialMessages ?? []);\n setActivity(null);\n }, [activeConversationId, initialMessages]);\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const patchMessage = useCallback((id: string, patch: (message: AssistantMessage) => AssistantMessage) => {\n setMessages((current) => current.map((message) => (message.id === id ? patch(message) : message)));\n }, []);\n\n const applyEvent = useCallback(\n (assistantId: string, event: AssistantEvent) => {\n switch (event.type) {\n case \"message_start\":\n patchMessage(assistantId, (message) => ({ ...message, id: event.messageId || message.id }));\n return event.messageId || assistantId;\n case \"text_delta\":\n patchMessage(assistantId, (message) => ({ ...message, content: message.content + event.text }));\n return assistantId;\n case \"tool_call\":\n setActivity(event.status === \"started\" ? event.label : null);\n return assistantId;\n case \"citation\":\n patchMessage(assistantId, (message) => ({\n ...message,\n citations: [...(message.citations ?? []), { title: event.title, url: event.url }],\n }));\n return assistantId;\n case \"message_end\":\n setActivity(null);\n patchMessage(assistantId, (message) => ({ ...message, status: \"done\" }));\n return assistantId;\n case \"error\":\n setActivity(null);\n patchMessage(assistantId, (message) => ({\n ...message,\n status: \"error\",\n error: {\n message:\n event.code === \"RATE_LIMITED\" && event.retryAfterSeconds\n ? texts.rateLimited(event.retryAfterSeconds)\n : event.message || texts.genericError,\n retryAfterSeconds: event.retryAfterSeconds,\n },\n }));\n return assistantId;\n default:\n return assistantId;\n }\n },\n [patchMessage, texts]\n );\n\n const send = useCallback(\n async (content: string) => {\n if (busy) return false;\n setBusy(true);\n const userMessage: AssistantMessage = { id: generateId(\"u\"), role: \"user\", content };\n let assistantId = generateId(\"a\");\n setMessages((current) => [\n ...current,\n userMessage,\n { id: assistantId, role: \"assistant\", content: \"\", status: \"streaming\" },\n ]);\n const controller = new AbortController();\n abortRef.current = controller;\n try {\n if (!conversationIdRef.current) {\n const created = await transport.startConversation(language);\n conversationIdRef.current = created.id;\n const summary: AssistantConversationSummary = {\n id: created.id,\n title: conversationTitle(content),\n createdAt: new Date().toISOString(),\n };\n onConversationCreated?.(summary);\n }\n for await (const event of transport.sendMessage(conversationIdRef.current, content, {\n signal: controller.signal,\n })) {\n assistantId = applyEvent(assistantId, event);\n }\n } catch (error) {\n setActivity(null);\n patchMessage(assistantId, (message) => ({\n ...message,\n status: \"error\",\n error: { message: error instanceof Error && error.message ? error.message : texts.genericError },\n }));\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n return true;\n },\n [applyEvent, busy, language, onConversationCreated, patchMessage, texts.genericError, transport]\n );\n\n // A prompt queued from outside (the launcher bar) is sent once, as soon as\n // the component is free.\n const handledPromptRef = useRef<string | null>(null);\n useEffect(() => {\n if (!queuedPrompt || queuedPrompt.id === handledPromptRef.current || busy) return;\n handledPromptRef.current = queuedPrompt.id;\n void send(queuedPrompt.content);\n }, [busy, queuedPrompt, send]);\n\n /** Retry re-sends the user message that preceded the failed answer. */\n const retry = useCallback(\n (failed: AssistantMessage) => {\n const index = messages.findIndex((message) => message.id === failed.id);\n const previous = index > 0 ? messages[index - 1] : undefined;\n if (!previous || previous.role !== \"user\") return;\n setMessages((current) => current.filter((message) => message.id !== failed.id && message.id !== previous.id));\n void send(previous.content);\n },\n [messages, send]\n );\n\n const startNewConversation = useCallback(() => {\n abortRef.current?.abort();\n conversationIdRef.current = null;\n setMessages([]);\n setActivity(null);\n onNewConversation?.();\n }, [onNewConversation]);\n\n const empty = messages.length === 0;\n const dir = DIRECTION[language];\n // panel: one compact column; wide: the slide-over expanded, list beside the thread.\n const compact = layout === \"panel\";\n const withList = layout !== \"panel\";\n const historyLabel = texts.history ?? texts.recentConversations;\n\n return (\n <div\n dir={dir}\n lang={language}\n className={cn(\n \"overflow-hidden bg-white\",\n layout === \"page\" && \"grid min-h-[36rem] grid-cols-1 rounded-2xl border border-ews-gray-200 shadow-sm md:grid-cols-[16rem_1fr]\",\n layout === \"wide\" && \"grid h-full min-h-0 grid-cols-1 md:grid-cols-[16rem_1fr]\",\n compact && \"relative flex h-full min-h-0 flex-col\",\n className\n )}\n data-layout={layout}\n data-testid=\"assistant-chat\"\n >\n {withList && (\n <AssistantConversationList\n conversations={conversations}\n activeConversationId={activeConversationId}\n onSelect={onSelectConversation}\n onNew={startNewConversation}\n texts={texts}\n signInHref={signInHref}\n className=\"hidden border-e border-ews-gray-200 md:flex\"\n />\n )}\n\n {compact && historyOpen && (\n <div className=\"absolute inset-0 z-10 flex\" data-testid=\"assistant-history\">\n <AssistantConversationList\n conversations={conversations}\n activeConversationId={activeConversationId}\n onSelect={(id) => {\n onSelectConversation?.(id);\n onHistoryOpenChange?.(false);\n }}\n onNew={() => {\n startNewConversation();\n onHistoryOpenChange?.(false);\n }}\n texts={texts}\n signInHref={signInHref}\n className=\"w-72 max-w-full border-e border-ews-gray-200 shadow-xl\"\n />\n <div\n className=\"flex-1 bg-black/20\"\n onClick={() => onHistoryOpenChange?.(false)}\n data-testid=\"assistant-history-overlay\"\n />\n </div>\n )}\n\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <header className=\"flex items-center justify-between gap-3 border-b border-ews-gray-200 px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-ews-primary text-sm font-bold text-white\" aria-hidden=\"true\">\n {texts.brandName.charAt(0)}\n </span>\n <span className=\"truncate font-semibold text-ews-gray-900\">{texts.brandName}</span>\n <span className=\"rounded-full bg-ews-gray-100 px-2 py-0.5 text-xs font-medium text-ews-gray-600\">AI</span>\n <span className=\"flex items-center gap-1 text-xs text-ews-gray-500\">\n <span className=\"h-2 w-2 rounded-full bg-ews-success\" aria-hidden=\"true\" />\n {texts.online}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {compact && onHistoryOpenChange && (\n <button\n type=\"button\"\n onClick={() => onHistoryOpenChange(!historyOpen)}\n aria-label={historyLabel}\n aria-pressed={historyOpen}\n title={historyLabel}\n className={cn(\n \"rounded-full p-2 hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary\",\n historyOpen ? \"bg-ews-gray-100 text-ews-primary\" : \"text-ews-gray-500\"\n )}\n data-testid=\"assistant-history-toggle\"\n >\n <History className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n )}\n {!withList && !empty && (\n <button\n type=\"button\"\n onClick={startNewConversation}\n aria-label={texts.newConversation}\n title={texts.newConversation}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-new-conversation\"\n >\n <SquarePen className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n )}\n {headerAction}\n </div>\n </header>\n\n <div className=\"flex flex-1 flex-col overflow-y-auto\">\n {empty ? (\n <>\n <section\n className={cn(\n \"relative overflow-hidden bg-ews-primary-light text-center\",\n compact ? \"px-4 py-6\" : \"px-6 py-10\"\n )}\n >\n {heroBackground && <div className=\"absolute inset-0\" aria-hidden=\"true\">{heroBackground}</div>}\n <div className=\"relative\">\n <h2 className={cn(\"font-bold text-ews-gray-900\", compact ? \"text-xl\" : \"text-2xl sm:text-3xl\")}>\n {texts.heroTitle}\n </h2>\n <p className={cn(\"mx-auto mt-2 max-w-xl text-ews-gray-700\", compact && \"text-sm\")}>\n {texts.heroSubtitle}\n </p>\n </div>\n </section>\n <div\n className={cn(\"grid gap-3 px-4 py-5\", compact ? \"grid-cols-1\" : \"sm:grid-cols-2 lg:grid-cols-4\")}\n data-testid=\"assistant-suggestions\"\n >\n {suggestions.map((suggestion) => (\n <AssistantSuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n onSelect={(selected) => void send(selected.prompt)}\n exampleLabel={texts.exampleLabel}\n disabled={busy}\n />\n ))}\n </div>\n </>\n ) : (\n <div className=\"flex-1 px-4 py-5\">\n <AssistantMessages\n messages={messages}\n activity={activity}\n onRetry={retry}\n texts={texts}\n linkOptions={\n onNavigate\n ? {\n onLinkClick: (href, event) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey) return;\n if (onNavigate(href) === true) event.preventDefault();\n },\n }\n : undefined\n }\n />\n {pendingConfirmation && onConfirm && onCancelConfirmation && (\n <AssistantConfirmationCard\n confirmation={pendingConfirmation}\n onConfirm={onConfirm}\n onCancel={onCancelConfirmation}\n texts={texts}\n className=\"mt-4\"\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-ews-gray-200 px-4 pb-3 pt-3\">\n <AssistantComposer\n language={language}\n onSend={(content) => void send(content)}\n disabled={busy}\n voice={voice}\n texts={{\n placeholder: texts.composerPlaceholder,\n hint: texts.composerHint,\n send: texts.send,\n holdToTalk: texts.holdToTalk,\n listening: texts.listening,\n }}\n />\n {disclaimer && <div className=\"mt-2 px-2 text-xs text-ews-gray-500\">{disclaimer}</div>}\n </div>\n </div>\n </div>\n );\n};\n","import type { AssistantConversationSummary } from \"../components/AssistantChat/AssistantChat.types\";\n\n/**\n * Anonymous memory of the assistant, in the browser only (MED-1784, shared by\n * every app since MED-1787): a stable client id and the conversations started\n * here, newest first. Nothing is sent to a server to list them; signing in\n * (phase 2) will attach them to the account.\n */\nexport const ASSISTANT_CLIENT_ID_KEY = \"assistant.clientId\";\nexport const ASSISTANT_CONVERSATIONS_KEY = \"assistant.conversations\";\nexport const ASSISTANT_MAX_CONVERSATIONS = 20;\n\nexport type AssistantStorage = Pick<Storage, \"getItem\" | \"setItem\">;\n\nfunction storage(): AssistantStorage | null {\n try {\n return typeof window !== \"undefined\" ? window.localStorage : null;\n } catch {\n return null;\n }\n}\n\nfunction randomId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `c-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** The browser's client id, created on first use. A fresh id per page when storage is unavailable. */\nexport function getAssistantClientId(store: AssistantStorage | null = storage()): string {\n const existing = store?.getItem(ASSISTANT_CLIENT_ID_KEY);\n if (existing) return existing;\n const id = randomId();\n try {\n store?.setItem(ASSISTANT_CLIENT_ID_KEY, id);\n } catch {\n // private mode: the id lasts for this page only\n }\n return id;\n}\n\nexport function listAssistantConversations(\n store: AssistantStorage | null = storage()\n): AssistantConversationSummary[] {\n try {\n const raw = store?.getItem(ASSISTANT_CONVERSATIONS_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (entry): entry is AssistantConversationSummary =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { id?: unknown }).id === \"string\"\n );\n } catch {\n return [];\n }\n}\n\n/** Adds or refreshes a conversation at the top of the list, capped at ASSISTANT_MAX_CONVERSATIONS. */\nexport function saveAssistantConversation(\n conversation: AssistantConversationSummary,\n store: AssistantStorage | null = storage()\n): AssistantConversationSummary[] {\n const next = [\n conversation,\n ...listAssistantConversations(store).filter((entry) => entry.id !== conversation.id),\n ].slice(0, ASSISTANT_MAX_CONVERSATIONS);\n try {\n store?.setItem(ASSISTANT_CONVERSATIONS_KEY, JSON.stringify(next));\n } catch {\n // private mode: the list lasts for this page only\n }\n return next;\n}\n","import { ArrowUp, AudioLines, Maximize2, Mic, Minimize2, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { listAssistantConversations, saveAssistantConversation } from \"../../assistant/store\";\nimport { useSpeechRecognition } from \"../../hooks/useSpeechRecognition\";\nimport { cn, generateId } from \"../../utils\";\nimport { AssistantChat } from \"../AssistantChat/AssistantChat\";\nimport type {\n AssistantChatProps,\n AssistantConversationSummary,\n AssistantMessage,\n} from \"../AssistantChat/AssistantChat.types\";\nimport { MAX_MESSAGE_LENGTH } from \"../AssistantChat/AssistantComposer\";\n\nexport interface AssistantLauncherTexts {\n /** Placeholder of the bar (\"Posez une question…\"); also the dialog's accessible name. */\n open: string;\n /** The close button of the panel. */\n close: string;\n /** The voice button of the bar; falls back to `open`. */\n voice?: string;\n /** The expand / collapse button of the panel; fall back to `open` / `close`. */\n expand?: string;\n collapse?: string;\n /** The history button of the panel; falls back to `texts.recentConversations`. */\n history?: string;\n}\n\nexport interface AssistantLauncherProps\n extends Omit<AssistantChatProps, \"className\" | \"layout\" | \"queuedPrompt\" | \"historyOpen\" | \"onHistoryOpenChange\"> {\n launcherTexts: AssistantLauncherTexts;\n /** Controlled open state; the launcher manages it when absent. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Controlled expanded (wide) state; the launcher manages it when absent. */\n expanded?: boolean;\n defaultExpanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n /**\n * Pixels between the bar and the bottom of the viewport, so the bar sits\n * above a host bottom navigation. Default 16.\n */\n bottomOffset?: number;\n /** Renders nothing at all (e.g. a feature toggle off). */\n hidden?: boolean;\n /** Extra classes on the bar. */\n className?: string;\n /** Extra classes on the panel (e.g. a wider max width). */\n panelClassName?: string;\n}\n\nconst DIRECTION: Record<AssistantChatProps[\"language\"], \"ltr\" | \"rtl\"> = {\n fr: \"ltr\",\n en: \"ltr\",\n ar: \"rtl\",\n};\n\n/**\n * MED-1787: the in-app entry to the assistant for Medecine360-ui and the\n * dashboard. A floating bar at the bottom of the page (brand badge, a text\n * field \"Posez une question…\", push-to-talk mic, voice button, send) opens a\n * slide-over panel hosting AssistantChat in its `panel` layout; clicking the\n * field opens the panel too, a spoken question is sent as it opens. From\n * tablets up the panel can be expanded to a dashboard reaching the middle of\n * the screen, with the conversation list beside the thread; in the narrow\n * layout a history button shows that list over the thread.\n *\n * Conversation history is managed here with the shared browser store unless\n * the host passes `conversations` itself: new conversations are remembered,\n * selecting one loads it through `transport.getConversation`.\n *\n * The chat stays mounted while the panel is closed, so the conversation in\n * progress survives open/close. Escape and the overlay close the panel; focus\n * goes to the composer on open and back to the bar on close. In Arabic the\n * panel slides from the left (`end-0` follows `dir`).\n */\nexport const AssistantLauncher: React.FC<AssistantLauncherProps> = ({\n launcherTexts,\n open,\n defaultOpen = false,\n onOpenChange,\n expanded,\n defaultExpanded = false,\n onExpandedChange,\n bottomOffset = 16,\n hidden = false,\n className,\n panelClassName,\n headerAction,\n voice = true,\n conversations: hostConversations,\n activeConversationId: hostActiveId,\n initialMessages: hostInitialMessages,\n onConversationCreated,\n onSelectConversation,\n onNewConversation,\n ...chatProps\n}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultExpanded);\n const isExpanded = expanded ?? uncontrolledExpanded;\n const [historyOpen, setHistoryOpen] = useState(false);\n const [draft, setDraft] = useState(\"\");\n const [queuedPrompt, setQueuedPrompt] = useState<{ id: string; content: string } | null>(null);\n const panelId = useId();\n const barRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLElement>(null);\n const wasOpenRef = useRef(isOpen);\n\n // Managed history (browser store) unless the host provides the list.\n const hostManaged = hostConversations !== undefined;\n const [storedConversations, setStoredConversations] = useState<AssistantConversationSummary[]>([]);\n const [managedActiveId, setManagedActiveId] = useState<string | null>(null);\n const [managedMessages, setManagedMessages] = useState<AssistantMessage[] | undefined>(undefined);\n useEffect(() => {\n if (!hostManaged) setStoredConversations(listAssistantConversations());\n }, [hostManaged]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (open === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange, open]\n );\n\n const setExpanded = useCallback(\n (next: boolean) => {\n if (expanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(next);\n if (next) setHistoryOpen(false);\n },\n [expanded, onExpandedChange]\n );\n\n /** Opens the panel; a non-empty text is sent as the first message. */\n const submitFromBar = useCallback(\n (content: string) => {\n const trimmed = content.trim();\n if (trimmed) {\n setQueuedPrompt({ id: generateId(\"q\"), content: trimmed.slice(0, MAX_MESSAGE_LENGTH) });\n }\n setDraft(\"\");\n setOpen(true);\n },\n [setOpen]\n );\n\n const speech = useSpeechRecognition({\n language: chatProps.language,\n onInterim: (text) => setDraft(text),\n onResult: (text) => submitFromBar(text),\n });\n\n const handleConversationCreated = useCallback(\n (conversation: AssistantConversationSummary) => {\n if (!hostManaged) {\n setStoredConversations(saveAssistantConversation(conversation));\n setManagedActiveId(conversation.id);\n }\n onConversationCreated?.(conversation);\n },\n [hostManaged, onConversationCreated]\n );\n\n const handleSelectConversation = useCallback(\n (conversationId: string) => {\n onSelectConversation?.(conversationId);\n if (hostManaged || conversationId === managedActiveId) return;\n const load = async () => {\n try {\n const loaded = await chatProps.transport.getConversation?.(conversationId);\n setManagedMessages(loaded?.messages ?? []);\n } catch {\n setManagedMessages([]);\n }\n setManagedActiveId(conversationId);\n };\n void load();\n },\n [chatProps.transport, hostManaged, managedActiveId, onSelectConversation]\n );\n\n const handleNewConversation = useCallback(() => {\n if (!hostManaged) {\n setManagedActiveId(null);\n setManagedMessages(undefined);\n }\n onNewConversation?.();\n }, [hostManaged, onNewConversation]);\n\n // Escape closes; the page behind does not scroll while the panel is open.\n useEffect(() => {\n if (!isOpen || hidden) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", onKeyDown);\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.body.style.overflow = previousOverflow;\n };\n }, [hidden, isOpen, setOpen]);\n\n // Focus: into the composer on open, back to the bar on close.\n useEffect(() => {\n if (isOpen) {\n panelRef.current?.querySelector(\"textarea\")?.focus();\n } else if (wasOpenRef.current) {\n barRef.current?.focus();\n }\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n if (hidden) return null;\n\n const dir = DIRECTION[chatProps.language];\n const showMic = voice && speech.supported;\n const expandLabel = launcherTexts.expand ?? launcherTexts.open;\n const collapseLabel = launcherTexts.collapse ?? launcherTexts.close;\n const texts = launcherTexts.history ? { ...chatProps.texts, history: launcherTexts.history } : chatProps.texts;\n\n return (\n <>\n {!isOpen && (\n <div\n dir={dir}\n className=\"pointer-events-none fixed inset-x-0 z-40 flex justify-center px-4\"\n style={{ bottom: bottomOffset }}\n data-testid=\"assistant-launcher-bar\"\n >\n <div\n role=\"group\"\n aria-label={launcherTexts.open}\n className={cn(\n \"pointer-events-auto flex w-full max-w-2xl items-center gap-2 rounded-2xl border border-ews-gray-100 bg-white py-2 pe-2 ps-3\",\n \"shadow-[0_8px_30px_rgba(15,23,42,0.14)]\",\n className\n )}\n >\n <button\n ref={barRef}\n type=\"button\"\n onClick={() => setOpen(true)}\n aria-label={launcherTexts.open}\n aria-haspopup=\"dialog\"\n aria-expanded={false}\n aria-controls={panelId}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-ews-primary to-ews-primary-hover text-base font-bold text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-ews-primary/40\"\n data-testid=\"assistant-launcher\"\n >\n {chatProps.texts.brandName.charAt(0)}\n </button>\n {/* The field opens the panel: typing happens in the panel composer, which gets the focus. */}\n <input\n type=\"text\"\n readOnly\n value={draft}\n onMouseDown={(event) => {\n event.preventDefault();\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen(true);\n }\n }}\n placeholder={speech.listening ? chatProps.texts.listening : launcherTexts.open}\n aria-label={launcherTexts.open}\n aria-haspopup=\"dialog\"\n aria-controls={panelId}\n className=\"min-w-0 flex-1 cursor-text bg-transparent py-2 text-lg text-ews-gray-800 placeholder:text-ews-gray-400 focus:outline-none\"\n data-testid=\"assistant-launcher-input\"\n />\n {showMic && (\n <button\n type=\"button\"\n aria-label={chatProps.texts.holdToTalk}\n aria-pressed={speech.listening}\n title={chatProps.texts.holdToTalk}\n onMouseDown={speech.start}\n onMouseUp={speech.stop}\n onMouseLeave={speech.listening ? speech.stop : undefined}\n onTouchStart={speech.start}\n onTouchEnd={speech.stop}\n onKeyDown={(event) => {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n if (speech.listening) speech.stop();\n else speech.start();\n }\n }}\n className={cn(\n \"flex h-10 w-10 shrink-0 items-center justify-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-ews-primary\",\n speech.listening\n ? \"bg-ews-error text-white animate-pulse\"\n : \"text-ews-gray-600 hover:bg-ews-gray-100 hover:text-ews-primary\"\n )}\n data-testid=\"assistant-launcher-mic\"\n >\n <Mic className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n aria-label={launcherTexts.voice ?? launcherTexts.open}\n title={launcherTexts.voice ?? launcherTexts.open}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-ews-gray-100 text-ews-gray-700 transition-colors hover:bg-ews-gray-200 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-voice\"\n >\n <AudioLines className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={() => submitFromBar(draft)}\n aria-label={chatProps.texts.send}\n title={chatProps.texts.send}\n className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-ews-primary text-white shadow-sm transition-colors hover:bg-ews-primary-hover focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1\"\n data-testid=\"assistant-launcher-send\"\n >\n <ArrowUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )}\n\n <div\n dir={dir}\n className={cn(\"fixed inset-0 z-[90]\", !isOpen && \"hidden\")}\n aria-hidden={!isOpen}\n data-testid=\"assistant-launcher-panel\"\n >\n <div\n className=\"absolute inset-0 bg-black/40\"\n onClick={() => setOpen(false)}\n data-testid=\"assistant-launcher-overlay\"\n />\n <section\n ref={panelRef}\n id={panelId}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={launcherTexts.open}\n data-expanded={isExpanded}\n className={cn(\n \"absolute inset-y-0 end-0 flex w-full flex-col bg-white shadow-2xl transition-[width,max-width] duration-200\",\n // Expanded: a dashboard reaching the middle of the screen (never full width), tablets and up.\n isExpanded ? \"sm:max-w-md md:w-[max(50vw,40rem)] md:max-w-none\" : \"sm:max-w-md\",\n panelClassName\n )}\n >\n <AssistantChat\n {...chatProps}\n texts={texts}\n voice={voice}\n layout={isExpanded ? \"wide\" : \"panel\"}\n queuedPrompt={queuedPrompt}\n conversations={hostManaged ? hostConversations : storedConversations}\n activeConversationId={hostManaged ? hostActiveId : managedActiveId}\n initialMessages={hostManaged ? hostInitialMessages : managedMessages}\n onConversationCreated={handleConversationCreated}\n onSelectConversation={handleSelectConversation}\n onNewConversation={handleNewConversation}\n historyOpen={historyOpen}\n onHistoryOpenChange={setHistoryOpen}\n className=\"flex-1\"\n headerAction={\n <>\n {headerAction}\n <button\n type=\"button\"\n onClick={() => setExpanded(!isExpanded)}\n aria-label={isExpanded ? collapseLabel : expandLabel}\n aria-pressed={isExpanded}\n title={isExpanded ? collapseLabel : expandLabel}\n className=\"hidden rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary md:inline-flex\"\n data-testid=\"assistant-launcher-expand\"\n >\n {isExpanded ? (\n <Minimize2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n ) : (\n <Maximize2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label={launcherTexts.close}\n title={launcherTexts.close}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-close\"\n >\n <X className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </>\n }\n />\n </section>\n </div>\n </>\n );\n};\n","import type {\n AssistantEvent,\n AssistantLanguage,\n AssistantMessage,\n AssistantTransport,\n} from \"../components/AssistantChat/AssistantChat.types\";\n\n/**\n * The assistant BFF client shared by every app (MED-1787; contract in\n * projects/medecine360-mcp/docs/assistant-api-contract.md). Fetch rather than\n * EventSource: the message endpoint is a POST. Requests carry the platform\n * session cookie (`credentials: \"include\"`) so the assistant BFF can derive\n * the persona server-side once it supports it.\n */\nexport interface AssistantTransportOptions {\n /** Base URL up to and including /api/v1 (createEnvConfig().assistantBffUrl). */\n baseUrl: string;\n /** Stable browser identifier, for rate limiting and conversation listing. */\n clientId: string;\n language: AssistantLanguage;\n fetchImpl?: typeof fetch;\n}\n\ninterface ErrorBody {\n code?: string;\n message?: string;\n retryAfterSeconds?: number;\n}\n\n/** Turns one SSE text stream into assistant events; frames may arrive split across chunks. */\nexport async function* parseAssistantEventStream(\n body: ReadableStream<Uint8Array>\n): AsyncGenerator<AssistantEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n let separator = buffer.indexOf(\"\\n\\n\");\n while (separator >= 0) {\n const frame = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n const event = parseFrame(frame);\n if (event) yield event;\n separator = buffer.indexOf(\"\\n\\n\");\n }\n }\n const tail = parseFrame(buffer);\n if (tail) yield tail;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseFrame(frame: string): AssistantEvent | null {\n let type = \"\";\n const dataLines: string[] = [];\n for (const rawLine of frame.split(\"\\n\")) {\n const line = rawLine.replace(/\\r$/, \"\");\n if (line.startsWith(\"event:\")) type = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).trimStart());\n }\n if (!type || dataLines.length === 0) return null;\n try {\n const data = JSON.parse(dataLines.join(\"\\n\")) as Record<string, unknown>;\n return { type, ...data } as AssistantEvent;\n } catch {\n return null;\n }\n}\n\nasync function errorEvent(response: Response): Promise<AssistantEvent> {\n let body: ErrorBody = {};\n try {\n body = (await response.json()) as ErrorBody;\n } catch {\n // no JSON body: keep the status\n }\n const retryAfterHeader = Number(response.headers.get(\"retry-after\"));\n const code =\n body.code ??\n (response.status === 429\n ? \"RATE_LIMITED\"\n : response.status === 404\n ? \"CONVERSATION_NOT_FOUND\"\n : \"MODEL_UNAVAILABLE\");\n return {\n type: \"error\",\n code,\n message: body.message ?? `HTTP ${response.status}`,\n retryAfterSeconds:\n body.retryAfterSeconds ??\n (Number.isFinite(retryAfterHeader) && retryAfterHeader > 0 ? retryAfterHeader : undefined),\n };\n}\n\nexport function createAssistantTransport({\n baseUrl,\n clientId,\n language,\n fetchImpl,\n}: AssistantTransportOptions): AssistantTransport {\n const base = `${baseUrl.replace(/\\/+$/, \"\")}/assistant`;\n const doFetch: typeof fetch = (input, init) =>\n (fetchImpl ?? fetch)(input, { credentials: \"include\", ...init });\n const headers = { \"Content-Type\": \"application/json\", \"Accept-Language\": language };\n\n return {\n async startConversation(conversationLanguage) {\n const response = await doFetch(`${base}/conversations`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ language: conversationLanguage, persona: \"visitor\", clientId }),\n });\n if (!response.ok) {\n const error = await errorEvent(response);\n throw new Error(error.type === \"error\" ? error.message : `HTTP ${response.status}`);\n }\n const created = (await response.json()) as { id: string };\n return { id: created.id };\n },\n\n async *sendMessage(conversationId, content, options) {\n const response = await doFetch(\n `${base}/conversations/${encodeURIComponent(conversationId)}/messages`,\n {\n method: \"POST\",\n headers: { ...headers, Accept: \"text/event-stream\" },\n body: JSON.stringify({ content }),\n signal: options?.signal,\n }\n );\n if (!response.ok) {\n yield await errorEvent(response);\n return;\n }\n if (!response.body) {\n yield { type: \"error\", code: \"NETWORK\", message: \"Empty response\" };\n return;\n }\n yield* parseAssistantEventStream(response.body);\n },\n\n async getConversation(conversationId) {\n const response = await doFetch(`${base}/conversations/${encodeURIComponent(conversationId)}`, {\n headers,\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const data = (await response.json()) as { id: string; messages: AssistantMessage[] };\n return {\n id: data.id,\n messages: data.messages.map((message) => ({ ...message, status: \"done\" as const })),\n };\n },\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\nimport { Logo } from \"../Logo\";\nimport { PinCodeInput } from \"../PinCodeInput\";\nimport { PinPad } from \"../PinPad\";\nimport type {\n LockScreenMode,\n LockScreenProps,\n LockScreenTexts,\n} from \"./LockScreen.types\";\n\ntype Step = \"unlock\" | \"current\" | \"otp\" | \"new\" | \"confirm\";\n\nconst FIRST_STEP: Record<LockScreenMode, Step> = {\n create: \"new\",\n unlock: \"unlock\",\n change: \"current\",\n reset: \"otp\",\n};\n\nconst titleOf = (mode: LockScreenMode, step: Step, texts: LockScreenTexts) => {\n switch (step) {\n case \"unlock\":\n return texts.unlockTitle;\n case \"current\":\n return texts.currentTitle;\n case \"otp\":\n return texts.otpTitle;\n case \"new\":\n return mode === \"create\" ? texts.createTitle : texts.newTitle;\n case \"confirm\":\n return texts.confirmTitle;\n }\n};\n\n/** Same breakpoint as Tailwind's `sm`. */\nconst DESKTOP_QUERY = \"(min-width: 640px)\";\n\n/** Open lock screens, oldest first; only the last one traps focus. */\nconst trapStack: object[] = [];\n\nconst FOCUSABLE =\n 'button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Blocking PIN screen: creates, checks, changes or resets (with a one-time\n * code) the user's secret code. Below 640px: full screen with an on-screen\n * keypad. From 640px: compact dialog on a grey backdrop with one box per digit,\n * typed on the keyboard. Submit handlers return promises: a rejection clears\n * the code and goes back to the first step, the app shows its message in `error`.\n */\nconst LockScreen = ({\n mode,\n texts,\n error,\n busy = false,\n onCreate,\n onUnlock,\n onChangePin,\n onReset,\n onForgot,\n onCancel,\n onSignOut,\n subtitle,\n pinLength = 4,\n otpLength = 6,\n logo,\n className,\n}: LockScreenProps) => {\n const [step, setStep] = useState<Step>(FIRST_STEP[mode]);\n const [firstValue, setFirstValue] = useState(\"\"); // current PIN or one-time code\n const [newPin, setNewPin] = useState(\"\");\n const [otp, setOtp] = useState(\"\");\n const [localError, setLocalError] = useState<string | null>(null);\n const [invalid, setInvalid] = useState(false);\n const [pending, setPending] = useState(false);\n const [resetKey, setResetKey] = useState(0);\n const panelRef = useRef<HTMLDivElement>(null);\n const mounted = useRef(true);\n const isDesktop = useMediaQuery(DESKTOP_QUERY);\n\n const restart = useCallback(\n (failed: boolean) => {\n setStep(FIRST_STEP[mode]);\n setFirstValue(\"\");\n setNewPin(\"\");\n setOtp(\"\");\n setInvalid(failed);\n setResetKey((key) => key + 1);\n },\n [mode],\n );\n\n useEffect(() => {\n restart(false);\n setLocalError(null);\n }, [restart]);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n // Block page scroll and keep focus inside the screen. Only the most recently\n // mounted lock screen traps focus: two traps pulling focus back to their own\n // panel would loop forever (e.g. a Storybook docs page rendering every story).\n useEffect(() => {\n const token = {};\n trapStack.push(token);\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const previousFocus = document.activeElement as HTMLElement | null;\n // The desktop code boxes focus themselves first.\n if (!panelRef.current?.contains(document.activeElement)) panelRef.current?.focus();\n const keepFocus = (event: FocusEvent) => {\n if (trapStack[trapStack.length - 1] !== token) return;\n const panel = panelRef.current;\n if (panel && !panel.contains(event.target as Node)) panel.focus();\n };\n document.addEventListener(\"focusin\", keepFocus);\n return () => {\n const wasTop = trapStack[trapStack.length - 1] === token;\n trapStack.splice(trapStack.indexOf(token), 1);\n document.body.style.overflow = previousOverflow;\n document.removeEventListener(\"focusin\", keepFocus);\n if (wasTop) previousFocus?.focus?.();\n };\n }, []);\n\n const trapTab = (event: React.KeyboardEvent) => {\n if (event.key !== \"Tab\" || !panelRef.current) return;\n const items = Array.from(\n panelRef.current.querySelectorAll<HTMLElement>(FOCUSABLE),\n );\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panelRef.current)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n const submit = async (call: (() => Promise<unknown>) | undefined) => {\n if (!call) return;\n setPending(true);\n try {\n await call();\n if (mounted.current) restart(false);\n } catch {\n if (mounted.current) restart(true);\n } finally {\n if (mounted.current) setPending(false);\n }\n };\n\n const handlePin = (pin: string) => {\n setLocalError(null);\n switch (step) {\n case \"unlock\":\n void submit(onUnlock && (() => onUnlock(pin)));\n return;\n case \"current\":\n setFirstValue(pin);\n setStep(\"new\");\n return;\n case \"new\":\n setNewPin(pin);\n setStep(\"confirm\");\n return;\n case \"confirm\":\n if (pin !== newPin) {\n setLocalError(texts.mismatchError);\n setInvalid(true);\n setNewPin(\"\");\n setStep(\"new\");\n setResetKey((key) => key + 1);\n return;\n }\n if (mode === \"create\") void submit(onCreate && (() => onCreate(pin)));\n else if (mode === \"change\")\n void submit(onChangePin && (() => onChangePin(firstValue, pin)));\n else if (mode === \"reset\")\n void submit(onReset && (() => onReset(firstValue, pin)));\n return;\n }\n };\n\n const submitOtp = (event: React.FormEvent) => {\n event.preventDefault();\n if (otp.length !== otpLength) return;\n setFirstValue(otp);\n setInvalid(false);\n setStep(\"new\");\n };\n\n const completeOtp = (code: string) => {\n setLocalError(null);\n setFirstValue(code);\n setInvalid(false);\n setStep(\"new\");\n };\n\n const isBusy = busy || pending;\n const shownError = localError ?? error;\n const showForgot =\n !!onForgot &&\n !!texts.forgot &&\n (step === \"unlock\" || step === \"current\");\n const title = titleOf(mode, step, texts);\n\n const digitLabel = texts.digit ?? texts.progress;\n\n const desktopContent = (\n <>\n <div className=\"pb-5\">{logo ?? <Logo size=\"sm\" variant=\"normal\" />}</div>\n\n {title && (\n <h2 className=\"text-center text-xl font-semibold text-ews-gray-900\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"mt-1 text-center text-sm text-ews-gray-600\">{subtitle}</p>\n )}\n {step === \"otp\" && texts.otpDescription && (\n <p className=\"mt-2 text-center text-sm text-ews-gray-600\">{texts.otpDescription}</p>\n )}\n\n <div className=\"mt-6\">\n {step === \"otp\" ? (\n <PinCodeInput\n key={step}\n length={otpLength}\n masked={false}\n autoComplete=\"one-time-code\"\n onComplete={completeOtp}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n digitLabel={digitLabel}\n groupLabel={texts.otpLabel ?? title}\n />\n ) : (\n <PinCodeInput\n key={step}\n length={pinLength}\n onComplete={handlePin}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n digitLabel={digitLabel}\n groupLabel={title}\n />\n )}\n </div>\n\n <p role=\"alert\" className=\"mt-3 min-h-[1.25rem] text-center text-sm text-ews-error\">\n {shownError}\n </p>\n\n {(showForgot || (onCancel && texts.cancel) || (onSignOut && texts.signOut)) && (\n <div className=\"mt-4 flex w-full flex-col items-center gap-2 border-t border-ews-gray-200 pt-4\">\n {showForgot && (\n <button\n type=\"button\"\n onClick={onForgot}\n disabled={isBusy}\n className=\"text-sm font-medium text-ews-primary hover:underline focus-visible:underline\"\n >\n {texts.forgot}\n </button>\n )}\n {onCancel && texts.cancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.cancel}\n </button>\n )}\n {onSignOut && texts.signOut && (\n <button\n type=\"button\"\n onClick={onSignOut}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.signOut}\n </button>\n )}\n </div>\n )}\n </>\n );\n\n return (\n <div\n className={cn(\n \"fixed inset-0 z-[1000] flex justify-center overflow-y-auto bg-white\",\n \"sm:items-center sm:bg-ews-gray-900/50 sm:backdrop-blur-sm\",\n isDesktop && \"p-4\",\n className,\n )}\n data-testid=\"lock-screen\"\n data-layout={isDesktop ? \"desktop\" : \"mobile\"}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={texts.dialogLabel}\n aria-busy={isBusy}\n tabIndex={-1}\n onKeyDown={trapTab}\n className={\n isDesktop\n ? \"flex w-full max-w-[400px] flex-col items-center rounded-2xl bg-white px-8 py-8 shadow-xl outline-none\"\n : cn(\n \"flex min-h-full w-full flex-col items-center px-6 pb-8 outline-none\",\n \"sm:min-h-0 sm:w-auto sm:min-w-[22rem] sm:rounded-2xl sm:bg-white sm:px-10 sm:py-10 sm:shadow-xl\",\n )\n }\n >\n {isDesktop ? (\n desktopContent\n ) : (\n <>\n <div className=\"flex min-h-[33vh] shrink-0 items-center justify-center sm:min-h-0 sm:pb-8\">\n {logo ?? <Logo size=\"lg\" variant=\"normal\" />}\n </div>\n\n {title && (\n <h2 className=\"mb-8 text-center text-lg font-normal text-ews-gray-900\">\n {title}\n </h2>\n )}\n\n {step === \"otp\" ? (\n <form\n onSubmit={submitOtp}\n className=\"flex w-full max-w-xs flex-col items-center gap-4\"\n >\n {texts.otpDescription && (\n <p className=\"text-center text-sm text-ews-gray-600\">\n {texts.otpDescription}\n </p>\n )}\n <label className=\"sr-only\" htmlFor=\"lock-screen-otp\">\n {texts.otpLabel}\n </label>\n <input\n id=\"lock-screen-otp\"\n dir=\"ltr\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={otpLength}\n value={otp}\n disabled={isBusy}\n aria-label={texts.otpLabel}\n aria-invalid={invalid || undefined}\n onChange={(event) => {\n setOtp(event.target.value.replace(/\\D/g, \"\").slice(0, otpLength));\n setInvalid(false);\n }}\n className={cn(\n \"w-full rounded-lg border bg-white px-4 py-3 text-center text-2xl tracking-[0.5em]\",\n \"focus:border-ews-primary focus:ring-2 focus:ring-ews-primary\",\n invalid ? \"border-ews-error\" : \"border-ews-gray-300\",\n )}\n />\n <Button\n type=\"submit\"\n variant=\"ews-primary\"\n fullWidth\n disabled={otp.length !== otpLength || isBusy}\n >\n {texts.otpSubmit}\n </Button>\n </form>\n ) : (\n <PinPad\n key={step}\n length={pinLength}\n onComplete={handlePin}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n eraseLabel={texts.erase}\n progressLabel={texts.progress}\n keypadLabel={texts.keypad}\n />\n )}\n\n <p\n role=\"alert\"\n className=\"mt-6 min-h-[1.25rem] text-center text-sm text-ews-error\"\n >\n {shownError}\n </p>\n\n <div className=\"mt-auto flex flex-col items-center gap-3 pt-6 sm:mt-4\">\n {showForgot && (\n <button\n type=\"button\"\n onClick={onForgot}\n disabled={isBusy}\n className=\"text-base font-medium text-ews-primary hover:underline focus-visible:underline\"\n >\n {texts.forgot}\n </button>\n )}\n {onCancel && texts.cancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.cancel}\n </button>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport type {\n LockScreenMode,\n LockScreenProps,\n LockScreenTexts,\n} from \"./LockScreen.types\";\nexport { LockScreen };\n","import { Stethoscope, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { MultiSearchAutocomplete } from \"../../components/MultiSearchAutocomplete\";\nimport { cn } from \"../../utils\";\n\nexport interface Specialty {\n id: string;\n code: string;\n label: string;\n [key: string]: string | number | boolean | undefined;\n}\n\nexport interface SpecialtySearchAutocompleteProps {\n selectedSpecialties: Specialty[];\n onSpecialtiesChange: (specialties: Specialty[]) => void;\n specialties: Specialty[];\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n maxSelections?: number;\n showSelectedCount?: boolean;\n title?: string;\n label?: string;\n getSelectedCountText?: (count: number) => React.ReactNode;\n /**\n * MED-1499: accessible label / tooltip of the button that removes a\n * selected specialty from its chip. Defaults to the English\n * \"Remove specialty\".\n */\n removeSpecialtyLabel?: string;\n}\n\nexport const SpecialtySearchAutocomplete: React.FC<\n SpecialtySearchAutocompleteProps\n> = ({\n selectedSpecialties = [],\n onSpecialtiesChange,\n specialties: availableSpecialties,\n placeholder = \"Search and select medical specialties...\",\n className = \"\",\n disabled = false,\n maxSelections,\n showSelectedCount = true,\n title = \"Medical Specialties\",\n label = \"Select Specialties\",\n getSelectedCountText,\n removeSpecialtyLabel = \"Remove specialty\",\n}) => {\n const [filteredSpecialties, setFilteredSpecialties] = useState<Specialty[]>(\n []\n );\n const [isLoading, setIsLoading] = useState(false);\n\n // Filter specialties based on search term\n const fetchSpecialties = useCallback(\n async (searchTerm: string) => {\n setIsLoading(true);\n try {\n // Filter based on search term\n const filtered = availableSpecialties.filter(\n (specialty) =>\n specialty.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\n specialty.code.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n setFilteredSpecialties(filtered);\n } catch (error) {\n console.error(\"Error filtering specialties:\", error);\n setFilteredSpecialties([]);\n } finally {\n setIsLoading(false);\n }\n },\n [availableSpecialties]\n );\n\n // Initial load\n useEffect(() => {\n fetchSpecialties(\"\");\n }, [fetchSpecialties]);\n\n const handleSelectionChange = useCallback(\n (items: Specialty[]) => {\n // Check max selections limit\n if (maxSelections && items.length > maxSelections) {\n return; // Don't update if exceeding max selections\n }\n onSpecialtiesChange(items);\n },\n [onSpecialtiesChange, maxSelections]\n );\n\n // MED-1499: a selected specialty must be removable from its chip, not only\n // by toggling it off again in the dropdown list.\n const handleRemoveSpecialty = useCallback(\n (specialtyToRemove: Specialty) => {\n onSpecialtiesChange(\n selectedSpecialties.filter(\n (specialty) => specialty.id !== specialtyToRemove.id\n )\n );\n },\n [onSpecialtiesChange, selectedSpecialties]\n );\n\n const getEntityById = useCallback(\n async (id: string): Promise<Specialty | undefined> => {\n return availableSpecialties.find((specialty) => specialty.id === id);\n },\n [availableSpecialties]\n );\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Header with title and icon */}\n <div className=\"flex items-center space-x-2\">\n <div className=\"flex justify-center items-center w-8 h-8 rounded-lg bg-secondary-100\">\n <Stethoscope className=\"w-4 h-4 text-secondary-600\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {title || \"Medical Specialties\"}\n </h3>\n </div>\n\n {/* Label */}\n <div>\n <label className=\"block mb-2 text-sm font-medium text-gray-700\">\n {label || \"Select Specialties\"}\n </label>\n </div>\n\n {/* MultiSearchAutocomplete component */}\n <MultiSearchAutocomplete<Specialty>\n items={filteredSpecialties}\n selectedItems={selectedSpecialties}\n onSelectionChange={handleSelectionChange}\n onSearch={fetchSpecialties}\n getEntityById={getEntityById}\n getPrimaryText={(specialty) => specialty.label}\n getSecondaryText={(specialty) => specialty.code}\n placeholder={placeholder}\n disabled={disabled}\n loading={isLoading}\n multiple={true}\n keepOpenOnSelect={true}\n className=\"w-full\"\n renderSelectedItem={(specialty) => (\n <span className=\"inline-flex items-center px-3 py-1 text-sm font-medium rounded-full border bg-ews-primary/10 text-ews-primary border-ews-primary/20\">\n {specialty.label}\n <button\n type=\"button\"\n onClick={() => handleRemoveSpecialty(specialty)}\n className=\"ml-2 text-ews-primary/60 hover:text-ews-primary\"\n disabled={disabled}\n title={removeSpecialtyLabel}\n aria-label={removeSpecialtyLabel}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n )}\n renderListItem={(specialty, isSelected) => (\n <div className=\"flex items-center space-x-3\">\n <div\n className={cn(\n \"flex justify-center items-center w-5 h-5 rounded border-2\",\n isSelected\n ? \"bg-ews-primary border-ews-primary\"\n : \"border-ews-gray-300\"\n )}\n >\n {isSelected && (\n <svg\n className=\"w-3 h-3 text-white\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </div>\n <span\n className={cn(\n \"font-medium\",\n isSelected ? \"text-ews-primary\" : \"text-gray-900\"\n )}\n >\n {specialty.label}\n </span>\n </div>\n )}\n />\n\n {/* Selected count display */}\n {showSelectedCount && selectedSpecialties.length > 0 && (\n <div className=\"flex justify-between items-center text-sm text-gray-600\">\n <span>\n {getSelectedCountText\n ? getSelectedCountText(selectedSpecialties.length)\n : `${selectedSpecialties.length} specialty${\n selectedSpecialties.length !== 1 ? \"ies\" : \"\"\n } selected`}\n </span>\n {maxSelections && (\n <span className=\"text-gray-400\">\n {selectedSpecialties.length}/{maxSelections}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["React","_jsxs","_jsx","_Fragment","UserAgent_DEPRECATED","ExecutionEnvironment","require$$0","isEventSupported","require$$1","normalizeWheel","Cropper","EasyCrop","img","logo","logoWhite","logoFullWhite","logoIcon","DIRECTION"],"mappings":"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,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AAC3E,EAAA;;AAEA,EAAE,OAAO,WAAW;AACpB;;AAEA,IAAA,kBAAc,GAAGA,kBAAgB;;;;;;;;;;;;;;AChDjC,IAAI,oBAAoB,GAAGD,sBAAiC;;AAE5D,IAAI,gBAAgB,GAAGE,kBAA6B;;;AAGpD;AACA,IAAI,UAAU,IAAI,EAAE;AACpB,IAAI,WAAW,GAAG,EAAE;AACpB,IAAI,WAAW,GAAG,GAAG;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAc,YAAY,KAAK,aAAa;AACrD,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;AACpB,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;AAErB;AACA,EAAE,IAAI,QAAQ,SAAS,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;AAClD,EAAE,IAAI,YAAY,KAAK,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAA;AAC7D,EAAE,IAAI,aAAa,IAAI,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAA;AAC9D,EAA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","x_google_ignoreList":[0,21,22,23,24,25,26]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/utils/env-config.ts","../src/utils/locations.ts","../src/utils/phone.ts","../src/utils/index.ts","../src/components/Button/Button.tsx","../src/icons/Icon.tsx","../src/icons/DoctorIcon.tsx","../src/icons/PatientIcon.tsx","../src/icons/UserIcon.tsx","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/hooks/useDebounce.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useIdleLock.ts","../src/hooks/useSelectField.ts","../src/hooks/useSpeechRecognition.ts","../src/components/SearchAutocomplete/SearchAutocomplete.tsx","../src/components/MultiSearchAutocomplete/MultiSearchAutocomplete.tsx","../src/components/Modal/Modal.tsx","../src/components/ProfileImageUpload/ProfileImageUpload.tsx","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/UserAgent_DEPRECATED.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/ExecutionEnvironment.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/isEventSupported.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/src/normalizeWheel.js","../node_modules/.pnpm/normalize-wheel@1.0.1/node_modules/normalize-wheel/index.js","../node_modules/.pnpm/react-easy-crop@6.2.4_react-dom@18.3.1_react@18.3.1/node_modules/react-easy-crop/index.module.mjs","../src/components/ImageCropModal/cropImage.ts","../src/components/ImageCropModal/ImageCropModal.tsx","../src/components/DropdownMultiSelect/DropdownMultiSelect.tsx","../src/components/PhoneInput/PhoneInput.tsx","../src/assets/logo/logoIcon.png","../src/assets/logo/logo.png","../src/assets/logo/logoFullWhite.png","../src/assets/logo/logoWhite.png","../src/components/Logo/logoAssets.ts","../src/components/Logo/Logo.tsx","../src/theme/themeConfig.ts","../src/theme/ThemeProvider.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/ThemeDebugger/ThemeDebugger.tsx","../src/components/RegionSelect/RegionSelect.tsx","../src/components/Tag/Tag.tsx","../src/components/TagList/TagList.tsx","../src/components/PaymentDueBanner/PaymentDueBanner.tsx","../src/components/SecureLoader/SecureLoader.tsx","../src/components/PinPad/PinPad.tsx","../src/components/PinCodeInput/PinCodeInput.tsx","../src/components/AssistantChat/ActionTooltip.tsx","../src/components/AssistantChat/AssistantDictationBar.tsx","../src/components/AssistantChat/AssistantComposer.tsx","../src/components/AssistantChat/AssistantConfirmationCard.tsx","../src/components/AssistantChat/AssistantConversationList.tsx","../src/components/AssistantChat/assistantMarkdown.tsx","../src/components/AssistantChat/AssistantMessages.tsx","../src/components/AssistantChat/AssistantSuggestionCard.tsx","../src/components/AssistantChat/AssistantVoiceMode.tsx","../src/components/AssistantChat/AssistantChat.tsx","../src/assistant/store.ts","../src/components/AssistantLauncher/AssistantLauncher.tsx","../src/assistant/transport.ts","../src/components/LockScreen/LockScreen.tsx","../src/molecules/SpecialtySearchAutocomplete/SpecialtySearchAutocomplete.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","export type Environment = \"local\" | \"dev\" | \"qa\" | \"prod\";\n\nexport interface EnvConfigOverrides {\n bffUrl?: string;\n loginBffUrl?: string;\n assistantBffUrl?: string;\n appUrl?: string;\n loginUrl?: string;\n dashboardUrl?: string;\n adminUrl?: string;\n}\n\nexport interface EnvConfig {\n env: Environment;\n bffUrl: string;\n loginBffUrl: string;\n /** MED-1783: the assistant BFF (medecine360-assistant-bff), base path included. */\n assistantBffUrl: string;\n appUrl: string;\n loginUrl: string;\n dashboardUrl: string;\n adminUrl: string;\n}\n\nconst LOCAL_PORTS = {\n bff: 8082,\n loginBff: 8080,\n assistantBff: 8083,\n app: 3000,\n login: 3001,\n dashboard: 3002,\n admin: 3008,\n} as const;\n\nfunction buildUrls(environment: Environment): Omit<EnvConfig, \"env\"> {\n if (environment === \"local\") {\n const domain = \"medecine360local.com\";\n // APIs run at api.medecine360local.com (no \"local.\" prefix)\n // Frontend apps run at local.{app}.medecine360local.com\n return {\n bffUrl: `http://api.${domain}:${LOCAL_PORTS.bff}/api/v1`,\n loginBffUrl: `http://api.${domain}:${LOCAL_PORTS.loginBff}/api/v1`,\n assistantBffUrl: `http://api.${domain}:${LOCAL_PORTS.assistantBff}/api/v1`,\n appUrl: `http://local.app.${domain}:${LOCAL_PORTS.app}`,\n loginUrl: `http://local.login.${domain}:${LOCAL_PORTS.login}`,\n dashboardUrl: `http://local.dashboard.${domain}:${LOCAL_PORTS.dashboard}`,\n adminUrl: `http://local.admin.${domain}:${LOCAL_PORTS.admin}`,\n };\n }\n\n const prefix = environment === \"prod\" ? \"\" : `${environment}.`;\n const domain = \"medecine360.com\";\n\n return {\n bffUrl: `https://${prefix}api.${domain}/bff/api/v1`,\n loginBffUrl: `https://${prefix}api.${domain}/login-bff/api/v1`,\n assistantBffUrl: `https://${prefix}api.${domain}/assistant/api/v1`,\n appUrl: environment === \"prod\" ? `https://${prefix}${domain}` : `https://${prefix}app.${domain}`,\n loginUrl: `https://${prefix}login.${domain}`,\n dashboardUrl: `https://${prefix}dashboard.${domain}`,\n adminUrl: `https://${prefix}admin.${domain}`,\n };\n}\n\n/**\n * Derives the environment from the host the app is served from, for builds\n * that did not set VITE_ENV. Hosts actually served (Traefik rules in\n * infrastructure/medecine360-hetzner/deployment/docker-stack.*.yml):\n * - local: localhost, 127.0.0.1, *.medecine360local.com (local.app., api., ...)\n * - dev: dev.{app,login,dashboard,admin,api}.medecine360.com\n * - qa: qa.{app,login,dashboard,admin,api}.medecine360.com\n * - prod: medecine360.com, {login,dashboard,admin,api}.medecine360.com\n * Any other host (or no window, e.g. SSR or tests) falls back to local.\n */\nfunction environmentFromHost(): Environment {\n const hostname =\n typeof window !== \"undefined\" ? window.location?.hostname?.toLowerCase() : undefined;\n if (!hostname) return \"local\";\n if (hostname === \"medecine360.com\" || hostname.endsWith(\".medecine360.com\")) {\n if (hostname.startsWith(\"dev.\")) return \"dev\";\n if (hostname.startsWith(\"qa.\")) return \"qa\";\n return \"prod\";\n }\n return \"local\";\n}\n\n/**\n * Creates an environment configuration with all derived URLs.\n *\n * For deployed environments (dev, qa, prod), only the environment name is needed\n * — all URLs follow a predictable convention.\n *\n * For local development, sensible defaults are provided but can be overridden\n * (e.g. to point BFF URL at a mock server).\n *\n * When env is empty (build without VITE_ENV), the environment is derived from\n * the current host instead of always assuming local, so a deployed build never\n * links to http://local.*.medecine360local.com. A console warning names the\n * derived environment so the misconfigured build stays visible.\n *\n * @param env - The environment name (VITE_ENV value)\n * @param overrides - Optional URL overrides (e.g. for local mock servers)\n */\nexport function createEnvConfig(\n env: string,\n overrides?: EnvConfigOverrides,\n): EnvConfig {\n let environment = env as Environment;\n if (!environment) {\n environment = environmentFromHost();\n console.warn(\n `[env-config] VITE_ENV is not set; using \"${environment}\" derived from the current host.`,\n );\n }\n const derived = buildUrls(environment);\n\n return {\n env: environment,\n ...derived,\n ...overrides,\n };\n}\n","export enum SupportedCountry {\n SENEGAL = \"SENEGAL\",\n CHAD = \"CHAD\",\n}\n\nconst REGIONS_BY_COUNTRY: Record<string, string[]> = {\n[SupportedCountry.SENEGAL]: [\n \"Dakar\",\n \"Diourbel\",\n \"Fatick\",\n \"Kaffrine\", // missing in your list\n \"Kaolack\", // missing in your list (spelling variant of Kaolac)\n \"Kédougou\",\n \"Kolda\",\n \"Louga\",\n \"Matam\",\n \"Saint-Louis\",\n \"Sédhiou\",\n \"Tambacounda\",\n \"Thiès\",\n \"Ziguinchor\",\n],\n [SupportedCountry.CHAD]: [\n \"N'Djamena\",\n \"Moundou\",\n \"Sarh\",\n \"Abéché\",\n \"Doba\",\n \"Pala\",\n \"Am Timan\",\n \"Mongo\",\n \"Faya-Largeau\",\n ],\n};\n\n/**\n * Returns the list of regions for a given country.\n * Matching is case-insensitive; defaults to Senegal when country is unknown.\n */\nexport function getRegionsByCountry(country: string): string[] {\n const key = country?.toUpperCase();\n return REGIONS_BY_COUNTRY[key] ?? REGIONS_BY_COUNTRY[SupportedCountry.SENEGAL];\n}\n\n/**\n * Returns regions as SelectOption-compatible objects { value, label }.\n */\nexport function getRegionOptions(country: string): { value: string; label: string }[] {\n return getRegionsByCountry(country).map((region) => ({\n value: region,\n label: region,\n }));\n}\n","/**\n * Country code option for phone number selection\n */\nexport interface CountryCodeOption {\n code: string;\n country: string;\n}\n\n/**\n * Props for country code select component\n */\nexport interface CountryCodeSelectProps {\n options: CountryCodeOption[];\n value: string;\n onChange: (code: string) => void;\n}\n\n/**\n * Available country codes supported by the platform\n */\nexport const COUNTRY_CODES: CountryCodeOption[] = [\n { code: \"+221\", country: \"SN\" }, // Senegal\n { code: \"+235\", country: \"TD\" }, // Chad\n];\n\n/**\n * Determines the default country code based on phone number prefix or country ISO code.\n * Falls back to \"+221\" (Senegal) when no match is found.\n */\nexport function getDefaultCountryCode(\n phoneNumber?: string,\n country?: string\n): string {\n if (phoneNumber) {\n const match = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code)\n );\n if (match) return match.code;\n }\n\n if (country) {\n const match = COUNTRY_CODES.find(\n ({ country: c }) => c.toUpperCase() === country.toUpperCase()\n );\n if (match) return match.code;\n }\n\n return \"+221\";\n}\n\n/**\n * Extracts the country code prefix from a phone number and returns both\n * the detected country code and the local number without the prefix.\n *\n * @example\n * extractCountryCodeFromPhoneNumber(\"+22177123456\") // { countryCode: \"+221\", cleanedPhoneNumber: \"77123456\" }\n * extractCountryCodeFromPhoneNumber(\"77123456\") // { countryCode: \"+221\", cleanedPhoneNumber: \"77123456\" }\n */\nexport function extractCountryCodeFromPhoneNumber(\n phoneNumber: string,\n country?: string\n): { countryCode: string; cleanedPhoneNumber: string } {\n const matched = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code)\n );\n\n if (matched) {\n const cleaned = phoneNumber\n .replace(new RegExp(`^\\\\${matched.code}\\\\s*`), \"\")\n .trim();\n return { countryCode: matched.code, cleanedPhoneNumber: cleaned };\n }\n\n // Same dial code, but without the leading \"+\" — e.g. the backend's canonical\n // digits-only storage format (\"221770000010\" instead of \"+221770000010\").\n // Without this check the caller below would treat the whole string (dial\n // code digits included) as the local part.\n const bareMatch = COUNTRY_CODES.find(({ code }) =>\n phoneNumber.startsWith(code.slice(1))\n );\n\n if (bareMatch) {\n const cleaned = phoneNumber\n .replace(new RegExp(`^${bareMatch.code.slice(1)}\\\\s*`), \"\")\n .trim();\n return { countryCode: bareMatch.code, cleanedPhoneNumber: cleaned };\n }\n\n return {\n countryCode: getDefaultCountryCode(phoneNumber, country),\n cleanedPhoneNumber: phoneNumber.trim(),\n };\n}\n\n/**\n * Formats a phone number by prepending the country code if not already present.\n * If the number already starts with a known country code (with or without the\n * leading \"+\") it is returned unchanged except for the \"+\" being added when\n * missing. Leading zeros, spaces and dashes are stripped from the local part\n * before formatting.\n *\n * @example\n * formatPhoneNumberWithCountryCode(\"77123456\", \"+221\") // \"+22177123456\"\n * formatPhoneNumberWithCountryCode(\"+22177123456\", \"+221\") // \"+22177123456\" (unchanged)\n * formatPhoneNumberWithCountryCode(\"077123456\", \"+221\") // \"+22177123456\" (leading 0 stripped)\n * formatPhoneNumberWithCountryCode(\"22177123456\") // \"+22177123456\" (backend's\n * // canonical digits-only\n * // storage format — just add \"+\",\n * // don't re-prepend the dial code)\n */\nexport function formatPhoneNumberWithCountryCode(\n phoneNumber: string,\n countryCode: string = \"+221\"\n): string {\n const trimmed = phoneNumber?.trim() || \"\";\n\n if (!trimmed) return \"\";\n\n // Already has a known country code — return as-is\n if (COUNTRY_CODES.some(({ code }) => trimmed.startsWith(code))) {\n return trimmed;\n }\n\n // Same dial code, but without the leading \"+\" (e.g. \"221770000010\", the\n // backend's canonical digits-only storage format). Just add the \"+\" —\n // re-prepending countryCode here would double the dial-code digits\n // (\"+221221770000010\").\n const bareMatch = COUNTRY_CODES.find(({ code }) =>\n trimmed.startsWith(code.slice(1))\n );\n if (bareMatch) {\n return `+${trimmed}`;\n }\n\n // Strip leading zeros, spaces, dashes and + signs from the local part\n const cleaned = trimmed.replace(/^[\\s+0-]*/, \"\").trim();\n\n if (!cleaned) return \"\";\n\n return `${countryCode}${cleaned}`;\n}\n\n/**\n * National digit groups used to display a phone number, per country code:\n * Senegal numbers have 9 national digits (77 123 45 67, 33 823 45 67), Chad\n * numbers 8 (66 12 34 56).\n */\nconst DISPLAY_DIGIT_GROUPS: Record<string, number[]> = {\n \"+221\": [2, 3, 2, 2],\n \"+235\": [2, 2, 2, 2],\n};\n\n/**\n * Formats a phone number for display only: the country code, then the\n * national digits in their usual groups. Do not use it for values sent to the\n * API, form values or tel: links; formatPhoneNumberWithCountryCode gives the\n * unspaced value for those. A number from another country, or of an\n * unexpected length, is returned as formatPhoneNumberWithCountryCode returns it.\n *\n * @example\n * formatPhoneNumberForDisplay(\"221771234567\") // \"+221 77 123 45 67\" (backend's storage format)\n * formatPhoneNumberForDisplay(\"771234567\") // \"+221 77 123 45 67\"\n * formatPhoneNumberForDisplay(\"+23566123456\") // \"+235 66 12 34 56\"\n * formatPhoneNumberForDisplay(\"+22177123\") // \"+22177123\" (unexpected length, unchanged)\n */\nexport function formatPhoneNumberForDisplay(\n phoneNumber: string,\n countryCode: string = \"+221\"\n): string {\n const canonical = formatPhoneNumberWithCountryCode(phoneNumber, countryCode);\n const code = COUNTRY_CODES.find(({ code: c }) => canonical.startsWith(c))?.code;\n const groups = code ? DISPLAY_DIGIT_GROUPS[code] : undefined;\n if (!code || !groups) return canonical;\n\n const national = canonical.slice(code.length).replace(/[\\s-]/g, \"\");\n const expectedLength = groups.reduce((sum, size) => sum + size, 0);\n if (!/^\\d+$/.test(national) || national.length !== expectedLength) return canonical;\n\n const parts: string[] = [];\n let start = 0;\n for (const size of groups) {\n parts.push(national.slice(start, start + size));\n start += size;\n }\n return `${code} ${parts.join(\" \")}`;\n}\n","import { clsx, type ClassValue } from \"clsx\";\n\nexport { createEnvConfig } from \"./env-config\";\nexport {\n SupportedCountry,\n getRegionsByCountry,\n getRegionOptions,\n} from \"./locations\";\nexport type {} from \"./locations\";\nexport {\n COUNTRY_CODES,\n extractCountryCodeFromPhoneNumber,\n formatPhoneNumberForDisplay,\n formatPhoneNumberWithCountryCode,\n getDefaultCountryCode,\n} from \"./phone\";\nexport type { CountryCodeOption, CountryCodeSelectProps } from \"./phone\";\nexport type {\n EnvConfig,\n EnvConfigOverrides,\n Environment,\n} from \"./env-config\";\n\n/**\n * Default currency for price formatting\n */\nexport const CURRENCY = \"XOF\";\n\n/**\n * Utility function to merge class names\n * @param inputs - Class values to merge\n * @returns Merged class string\n */\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n\n/**\n * Utility function to format currency\n * @param amount - Amount to format\n * @param currency - Currency code (default: CURRENCY constant)\n * @returns Formatted currency string\n */\nexport function formatCurrency(amount: number, currency = CURRENCY): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n }).format(amount);\n}\n\nexport interface FormatDateOptions extends Intl.DateTimeFormatOptions {\n locale?: string | string[];\n}\n\n/**\n * Parses a date value the way every date coming from these platforms'\n * Java/Kotlin backends actually shows up, without the classic off-by-one\n * timezone bug.\n *\n * A bare \"YYYY-MM-DD\" string is parsed by `new Date(...)` as UTC midnight\n * (per the ECMAScript spec), which then shifts a day earlier once formatted\n * in any timezone behind UTC. This function parses date-only strings (and\n * Jackson's `[year, month, day, ...]` LocalDate/LocalDateTime array\n * serialization) as local calendar components instead. Full ISO datetime\n * strings (with a time and/or timezone), Date objects, and numeric\n * timestamps are unaffected and still go through the normal `new Date(...)`\n * parse.\n */\nexport function parseDateSafe(\n date: Date | string | number | number[]\n): Date {\n if (Array.isArray(date)) {\n const [y, m, d, h = 0, min = 0, s = 0] = date;\n return new Date(y, m - 1, d, h, min, s);\n }\n if (typeof date === \"string\") {\n const dateOnlyMatch = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (dateOnlyMatch) {\n return new Date(\n Number(dateOnlyMatch[1]),\n Number(dateOnlyMatch[2]) - 1,\n Number(dateOnlyMatch[3])\n );\n }\n }\n return new Date(date);\n}\n\nexport function formatDate(\n date: Date | string | number | number[],\n options?: FormatDateOptions\n): string {\n const { locale = \"en-US\", ...intlOptions } = options ?? {};\n const dateObj = parseDateSafe(date);\n return new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n ...intlOptions,\n }).format(dateObj);\n}\n\n/**\n * Utility function to debounce function calls\n * @param func - Function to debounce\n * @param wait - Wait time in milliseconds\n * @returns Debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Utility function to generate unique ID\n * @param prefix - Optional prefix for the ID\n * @returns Unique ID string\n */\nexport function generateId(prefix = \"ews\"): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Utility function to format numeric input by removing non-digit characters\n * @param value - String value to format\n * @returns String with only numeric characters\n */\nexport const formatNumeric = (value: string): string => {\n return value.replace(/\\D/g, \"\");\n};\n\n/**\n * Utility function to validate phone numbers\n * Validates phone numbers with 1-17 digits, optionally starting with + symbol\n * @param value - Phone number string to validate\n * @returns Boolean indicating if the phone number is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n const trimmedValue = value.trim();\n // Allow + at the beginning, followed by 1-17 digits\n // Or just 1-17 digits without +\n const phoneRegex = /^(\\+\\d{1,17}|\\d{1,17})$/;\n return phoneRegex.test(trimmedValue);\n}\n\n/**\n * Blood type enum matching backend BloodTypeEnum values\n */\nexport enum BloodType {\n A_POSITIVE = \"A+\",\n A_NEGATIVE = \"A-\",\n B_POSITIVE = \"B+\",\n B_NEGATIVE = \"B-\",\n AB_POSITIVE = \"AB+\",\n AB_NEGATIVE = \"AB-\",\n O_POSITIVE = \"O+\",\n O_NEGATIVE = \"O-\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Ordered list of all blood type values.\n * Use this to build select/dropdown options.\n */\nexport const BLOOD_TYPES: BloodType[] = [\n BloodType.A_POSITIVE,\n BloodType.A_NEGATIVE,\n BloodType.B_POSITIVE,\n BloodType.B_NEGATIVE,\n BloodType.AB_POSITIVE,\n BloodType.AB_NEGATIVE,\n BloodType.O_POSITIVE,\n BloodType.O_NEGATIVE,\n BloodType.UNKNOWN,\n];\n","import React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Button variant\n */\n variant?:\n | \"ews-primary\"\n | \"ews-secondary\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"outline\"\n | \"ghost\";\n /**\n * Button size\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Whether the button is in a loading state\n */\n loading?: boolean;\n /**\n * Whether the button should take full width\n */\n fullWidth?: boolean;\n /**\n * Icon to display before the button text\n */\n leftIcon?: React.ReactNode;\n /**\n * Icon to display after the button text\n */\n rightIcon?: React.ReactNode;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"ews-primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n leftIcon,\n rightIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center font-medium rounded-md transition-colors focus:outline-none disabled:opacity-50 disabled:pointer-events-none\";\n\n const variants = {\n \"ews-primary\": \"bg-ews-primary text-white hover:bg-ews-primary-hover\",\n \"ews-secondary\":\n \"bg-ews-secondary text-white hover:bg-ews-secondary-hover\",\n success: \"bg-ews-success text-white hover:bg-ews-success-hover\",\n warning: \"bg-ews-warning text-white hover:bg-ews-warning-hover\",\n error: \"bg-ews-error text-white hover:bg-ews-error-hover\",\n outline:\n \"bg-transparent text-sm font-medium text-ews-primary hover:text-ews-primary/80\",\n ghost:\n \"border border-ews-primary text-ews-primary hover:bg-ews-primary hover:text-white disabled:border-gray-400 disabled:text-gray-400 focus:ring-2 focus:ring-offset-2 focus:ring-ews-primary\",\n };\n\n const sizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n };\n\n const iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n };\n\n return (\n <button\n className={cn(\n baseStyles,\n variants[variant],\n sizes[size],\n fullWidth && \"w-full\",\n className\n )}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <svg\n className=\"mr-2 -ml-1 w-4 h-4 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {!loading && leftIcon && (\n <span className={cn(\"flex items-center mr-2\", iconSizes[size])}>\n {leftIcon}\n </span>\n )}\n {children}\n {!loading && rightIcon && (\n <span className={cn(\"flex items-center ml-2\", iconSizes[size])}>\n {rightIcon}\n </span>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { LucideProps } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface IconProps extends Omit<LucideProps, \"size\"> {\n /**\n * Icon size\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n /**\n * The Lucide icon component to render\n */\n icon: React.ComponentType<LucideProps>;\n}\n\n// Simple icon props for individual icon components\nexport interface SimpleIconProps {\n /**\n * Icon size in pixels\n */\n size?: number;\n /**\n * Icon color (can be hex, rgb, or Tailwind class)\n */\n color?: string;\n /**\n * Additional CSS classes (supports Tailwind classes)\n */\n className?: string;\n /**\n * Other props passed to the underlying icon\n */\n [key: string]: unknown;\n}\n\nconst Icon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ size = \"md\", icon: IconComponent, className, ...props }, ref) => {\n const sizes = {\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n };\n\n const iconSize = typeof size === \"number\" ? size : sizes[size];\n\n return (\n <IconComponent\n ref={ref}\n size={iconSize}\n className={cn(\"shrink-0\", className)}\n {...props}\n />\n );\n }\n);\n\nIcon.displayName = \"Icon\";\n\nexport { Icon };\n","import { Stethoscope } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const DoctorIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return (\n <Stethoscope size={size} color={color} className={className} {...props} />\n );\n};\n","import { Heart } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const PatientIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return <Heart size={size} color={color} className={className} {...props} />;\n};\n","import { User } from \"lucide-react\";\nimport React from \"react\";\nimport { SimpleIconProps } from \"./Icon\";\n\nexport const UserIcon: React.FC<SimpleIconProps> = ({\n size = 24,\n color = \"currentColor\",\n className = \"\",\n ...props\n}) => {\n return <User size={size} color={color} className={className} {...props} />;\n};\n","import { ChevronDown } from \"lucide-react\";\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { Eye, EyeOff } from \"../../icons\";\nimport { cn } from \"../../utils\";\n\nexport interface CountryCodeOption {\n code: string;\n country: string;\n}\n\nexport interface CountryCodeSelectProps {\n /**\n * Array of country code options\n */\n options: CountryCodeOption[];\n /**\n * Currently selected country code\n */\n value: string;\n /**\n * Handler for when country code changes\n */\n onChange: (code: string) => void;\n}\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n /**\n * Input variant\n */\n variant?: \"default\" | \"error\" | \"success\";\n /**\n * Input size\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Label for the input\n */\n label?: string;\n /**\n * Helper text to display below the input\n */\n helperText?: string;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Icon to display before the input\n */\n leftIcon?: React.ReactNode;\n /**\n * Icon to display after the input\n */\n rightIcon?: React.ReactNode;\n /**\n * Text or node to display as a left addon (e.g., currency \"FCFA\")\n */\n leftAddon?: React.ReactNode;\n /**\n * Text or node to display as a right addon inside the input (e.g., currency \"FCFA\")\n */\n rightAddon?: React.ReactNode;\n /**\n * Whether the input should take full width\n */\n fullWidth?: boolean;\n /**\n * Whether to show password toggle for password inputs\n */\n showPasswordToggle?: boolean;\n /**\n * Whether the input is required (shows red asterisk)\n */\n required?: boolean;\n /**\n * Country code dropdown configuration for phone inputs\n */\n countryCodeSelect?: CountryCodeSelectProps;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n label,\n helperText,\n error,\n leftIcon,\n rightIcon,\n fullWidth = false,\n showPasswordToggle = false,\n required = false,\n countryCodeSelect,\n leftAddon,\n rightAddon,\n id,\n type = \"text\",\n onChange,\n onBlur,\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const inputId = id || `input-${generatedId.replace(/:/g, \"\")}`;\n const hasError = Boolean(error);\n const actualVariant = hasError ? \"error\" : variant;\n\n // Password visibility state\n const [showPassword, setShowPassword] = useState(false);\n const isPasswordInput = type === \"password\";\n const shouldShowPasswordToggle = showPasswordToggle && isPasswordInput;\n const actualType = isPasswordInput && showPassword ? \"text\" : type;\n\n // Normalize spaces for text-like inputs\n const shouldNormalize = type !== \"password\" && type !== \"number\" && type !== \"checkbox\";\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (shouldNormalize) {\n e.target.value = e.target.value.replace(/^\\s+/, \"\").replace(/\\s{2,}/g, \" \");\n }\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (shouldNormalize && onChange) {\n const trimmed = e.target.value.replace(/\\s+$/, \"\");\n if (trimmed !== e.target.value) {\n e.target.value = trimmed;\n onChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }\n onBlur?.(e);\n };\n\n // Country code dropdown state\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const baseStyles =\n \"block w-full rounded-md border transition-colors focus:outline-none focus:ring-2 focus:ring-offset-0 hover:border-ews-primary\";\n\n const variants = {\n default:\n \"border-ews-gray-300 focus:border-ews-primary focus:ring-ews-primary\",\n error: \"border-ews-error focus:border-ews-error focus:ring-ews-error\",\n success:\n \"border-ews-success focus:border-ews-success focus:ring-ews-success\",\n };\n\n const sizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-base\",\n lg: \"px-4 py-3 text-lg\",\n };\n\n const iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n };\n\n const isCheckbox = type === \"checkbox\";\n\n // For checkboxes, render with or without label based on label prop\n if (isCheckbox) {\n if (label) {\n // Render checkbox with built-in label\n return (\n <div className={cn(\"space-y-1\", fullWidth ? \"w-full\" : \"w-auto\")}>\n <div className=\"flex items-start space-x-3\">\n <input\n id={inputId}\n type={actualType}\n className={cn(\n \"mt-0.5\", // Slight top margin to align with first line of text\n className\n )}\n ref={ref}\n onChange={onChange}\n onBlur={onBlur}\n {...props}\n />\n <div className=\"flex-1\">\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium cursor-pointer text-ews-gray-700\"\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-sm\",\n error ? \"text-ews-error\" : \"text-ews-gray-500\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n } else {\n // Render just the checkbox for external label usage\n return (\n <input\n id={inputId}\n type={actualType}\n className={cn(className)}\n ref={ref}\n onChange={onChange}\n onBlur={onBlur}\n {...props}\n />\n );\n }\n }\n\n // Default rendering for non-checkbox inputs\n return (\n <div className={cn(\"space-y-1\", fullWidth ? \"w-full\" : \"w-auto\")}>\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-ews-gray-700\"\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n )}\n <div className=\"relative\">\n {countryCodeSelect && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-1 z-10\" ref={dropdownRef}>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsDropdownOpen(!isDropdownOpen)}\n className={cn(\n \"flex items-center gap-1 px-2 py-1 rounded text-ews-gray-700\",\n \"hover:bg-ews-gray-50 transition-colors cursor-pointer\",\n \"focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-0\",\n \"border-0 bg-transparent text-base\"\n )}\n >\n <span className=\"font-medium\">{countryCodeSelect.value}</span>\n <ChevronDown\n className={cn(\n \"w-4 h-4 text-ews-gray-400 transition-transform\",\n isDropdownOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isDropdownOpen && (\n <div\n className={cn(\n \"absolute top-full left-0 mt-1 bg-white rounded-md border shadow-lg\",\n \"border-ews-gray-300 min-w-[120px] z-50\"\n )}\n style={{ maxHeight: \"200px\", overflowY: \"auto\" }}\n >\n {countryCodeSelect.options.map((item) => {\n const isSelected = item.code === countryCodeSelect.value;\n return (\n <div\n key={item.code}\n onClick={() => {\n countryCodeSelect.onChange(item.code);\n setIsDropdownOpen(false);\n }}\n className={cn(\n \"px-3 py-2 text-sm cursor-pointer transition-colors\",\n isSelected && \"bg-ews-primary text-white\",\n !isSelected && \"hover:bg-ews-gray-50\"\n )}\n >\n <span className=\"font-medium\">{item.code}</span>\n {item.country && (\n <span className={cn(\n \"ml-2 text-xs\",\n isSelected ? \"text-white/80\" : \"text-ews-gray-500\"\n )}>\n {item.country}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n )}\n {leftIcon && !countryCodeSelect && !leftAddon && (\n <div className=\"flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none\">\n <span className={cn(\"text-ews-gray-400\", iconSizes[size])}>\n {leftIcon}\n </span>\n </div>\n )}\n {leftAddon && !countryCodeSelect && !leftIcon && (\n <div className=\"flex absolute inset-y-0 left-0 items-center pointer-events-none overflow-hidden rounded-l-md\">\n <span className=\"flex items-center h-full px-3 text-sm font-medium whitespace-nowrap bg-ews-gray-50 border-r border-ews-gray-300 text-ews-gray-600\">\n {leftAddon}\n </span>\n </div>\n )}\n <input\n id={inputId}\n type={actualType}\n className={cn(\n baseStyles,\n variants[actualVariant],\n sizes[size],\n countryCodeSelect && \"pl-24\",\n leftIcon && !countryCodeSelect && !leftAddon && \"pl-10\",\n leftAddon && !countryCodeSelect && !leftIcon && \"pl-16\",\n (rightIcon || shouldShowPasswordToggle) && \"pr-10\",\n rightAddon && !rightIcon && !shouldShowPasswordToggle && \"pr-16\",\n className\n )}\n ref={ref}\n onChange={handleChange}\n onBlur={handleBlur}\n {...props}\n />\n {rightAddon && !rightIcon && !shouldShowPasswordToggle && (\n <div className=\"flex absolute inset-y-0 right-0 items-center pr-3 pointer-events-none\">\n <span className=\"text-sm font-medium text-ews-gray-500\">\n {rightAddon}\n </span>\n </div>\n )}\n {rightIcon && !shouldShowPasswordToggle && (\n <div className=\"flex absolute inset-y-0 right-0 items-center pr-3 pointer-events-none\">\n <span className={cn(\"text-ews-gray-400\", iconSizes[size])}>\n {rightIcon}\n </span>\n </div>\n )}\n {shouldShowPasswordToggle && (\n <button\n type=\"button\"\n className=\"flex absolute inset-y-0 right-0 items-center pr-3\"\n onClick={() => setShowPassword(!showPassword)}\n tabIndex={-1}\n >\n <span\n className={cn(\n \"transition-colors text-ews-gray-400 hover:text-ews-gray-600\",\n iconSizes[size]\n )}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </span>\n </button>\n )}\n </div>\n {(error || helperText) && (\n <p\n className={cn(\n \"text-sm\",\n error ? \"text-ews-error\" : \"text-ews-gray-500\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n\n","import { ChevronDown, Search, X } from \"lucide-react\";\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input\";\n\nexport interface SelectOption<T = unknown> {\n value: T;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps<T = unknown> {\n /**\n * Array of options to display\n */\n options: SelectOption<T>[];\n /**\n * Current selected value\n */\n value?: T;\n /**\n * Callback when selection changes\n */\n onChange?: (value: T, option: SelectOption<T>) => void;\n /**\n * Placeholder text when no option is selected\n */\n placeholder?: string;\n /**\n * Label for the select\n */\n label?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Whether the select is in an error state\n */\n isError?: boolean;\n /**\n * Size variant\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Whether the select is disabled\n */\n disabled?: boolean;\n /**\n * Whether the select is required\n */\n required?: boolean;\n /**\n * Whether the select is searchable\n */\n searchable?: boolean;\n /**\n * Whether the select allows multiple selections\n */\n multiple?: boolean;\n /**\n * Custom class name for the select element\n */\n selectClassName?: string;\n /**\n * Custom class name for the container\n */\n containerClassName?: string;\n /**\n * Custom class name for the dropdown\n */\n dropdownClassName?: string;\n /**\n * Maximum height of the dropdown\n */\n maxHeight?: number;\n /**\n * Whether to show clear button\n */\n clearable?: boolean;\n /**\n * Custom render function for options\n */\n renderOption?: (\n option: SelectOption<T>,\n isSelected: boolean\n ) => React.ReactNode;\n /**\n * Custom render function for selected value\n */\n renderValue?: (option: SelectOption<T> | null) => React.ReactNode;\n /**\n * Custom render function for the trigger button content.\n * When provided, replaces the selected-value/placeholder area and hides\n * the built-in chevron so the trigger can render its own UI (e.g. a user\n * avatar menu).\n */\n renderTrigger?: () => React.ReactNode;\n /**\n * MED-1501: placeholder of the in-dropdown search input, so the caller can\n * translate it. Defaults to the English \"Search options...\".\n */\n searchPlaceholder?: string;\n /**\n * MED-1501: text shown when a search matches no option, so the caller can\n * translate it. Defaults to the English \"No options found\".\n */\n noOptionsFoundText?: string;\n /**\n * MED-1501: text shown when there is no option at all, so the caller can\n * translate it. Defaults to the English \"No options available\".\n */\n noOptionsAvailableText?: string;\n}\n\nconst Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n value,\n onChange,\n placeholder = \"Select an option...\",\n label,\n helperText,\n error,\n isError = false,\n size = \"md\",\n disabled = false,\n required = false,\n searchable = false,\n multiple: _multiple = false,\n selectClassName,\n containerClassName,\n dropdownClassName,\n maxHeight = 200,\n clearable = false,\n renderOption,\n renderValue,\n renderTrigger,\n searchPlaceholder = \"Search options...\",\n noOptionsFoundText = \"No options found\",\n noOptionsAvailableText = \"No options available\",\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const selectId = `select-${generatedId}`;\n const hasError = isError || !!error;\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const [dropdownPosition, setDropdownPosition] = useState<\"bottom\" | \"top\">(\n \"bottom\"\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Find selected option\n const selectedOption = options.find((option) => option.value === value);\n\n // Filter options based on search term\n const filteredOptions = searchable\n ? options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n )\n : options;\n\n // Calculate dropdown position based on available space\n const calculateDropdownPosition = useCallback(() => {\n if (!containerRef.current) return;\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n // More accurate height calculation\n const optionHeight = 40; // Approximate height per option\n const searchHeight = searchable ? 60 : 0;\n const padding = 16; // py-1 = 8px top + 8px bottom\n const dropdownHeight = Math.min(\n maxHeight,\n filteredOptions.length * optionHeight + searchHeight + padding\n );\n\n const spaceBelow = viewportHeight - containerRect.bottom;\n const spaceAbove = containerRect.top;\n\n // Add some buffer (20px) to prevent edge cases\n const buffer = 20;\n\n // If there's not enough space below but enough space above, position on top\n if (\n spaceBelow < dropdownHeight + buffer &&\n spaceAbove > dropdownHeight + buffer\n ) {\n setDropdownPosition(\"top\");\n } else {\n setDropdownPosition(\"bottom\");\n }\n }, [filteredOptions.length, searchable, maxHeight]);\n\n // Alternative calculation using actual dropdown element when available\n const calculateDropdownPositionWithElement = () => {\n if (!containerRef.current || !dropdownRef.current) return;\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const dropdownRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n const spaceBelow = viewportHeight - containerRect.bottom;\n const spaceAbove = containerRect.top;\n const actualDropdownHeight = dropdownRect.height;\n\n // If there's not enough space below but enough space above, position on top\n if (\n spaceBelow < actualDropdownHeight &&\n spaceAbove > actualDropdownHeight\n ) {\n setDropdownPosition(\"top\");\n } else {\n setDropdownPosition(\"bottom\");\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Calculate position when dropdown opens\n useEffect(() => {\n if (isOpen) {\n // First calculation based on estimated height\n calculateDropdownPosition();\n\n // Second calculation after dropdown is rendered with actual height\n requestAnimationFrame(() => {\n calculateDropdownPositionWithElement();\n });\n }\n }, [\n isOpen,\n filteredOptions.length,\n searchable,\n maxHeight,\n calculateDropdownPosition,\n ]);\n\n // Recalculate position on window resize\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) {\n calculateDropdownPosition();\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleResize);\n };\n }, [isOpen, calculateDropdownPosition]);\n\n // Handle keyboard navigation\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n setFocusedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1\n );\n }\n break;\n case \"Enter\":\n event.preventDefault();\n if (\n isOpen &&\n focusedIndex >= 0 &&\n focusedIndex < filteredOptions.length\n ) {\n handleSelect(filteredOptions[focusedIndex]);\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n break;\n case \"Tab\":\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n break;\n }\n };\n\n // Handle option selection\n const handleSelect = (option: SelectOption) => {\n if (option.disabled) return;\n\n onChange?.(option.value, option);\n setIsOpen(false);\n setSearchTerm(\"\");\n setFocusedIndex(-1);\n };\n\n // Handle clear\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation();\n onChange?.(undefined as unknown, {} as SelectOption);\n };\n\n // Handle toggle\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n if (!isOpen && searchable) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n };\n\n // Scroll focused option into view\n useEffect(() => {\n if (focusedIndex >= 0 && optionRefs.current[focusedIndex]) {\n optionRefs.current[focusedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [focusedIndex]);\n\n const sizeClasses = {\n sm: \"text-sm px-3 py-1.5\",\n md: \"text-sm px-3 py-2\",\n lg: \"text-base px-4 py-2.5\",\n };\n\n const iconSizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n };\n\n return (\n <div className={cn(\"w-full\", containerClassName)} ref={containerRef}>\n {label && (\n <label\n htmlFor={selectId}\n className={cn(\n \"block text-sm font-medium mb-1\",\n \"text-ews-gray-700\",\n disabled && \"text-ews-gray-400\"\n )}\n >\n {label}\n {required && <span className=\"ml-1 text-ews-error\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {/* Custom select trigger */}\n <div\n ref={ref as React.RefObject<HTMLDivElement>}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-labelledby={label ? selectId : undefined}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleToggle}\n className={cn(\n // Base styles\n \"ews-select-trigger w-full bg-white border rounded-md shadow-sm transition-colors cursor-pointer\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-0\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-ews-gray-50\",\n\n // Size\n sizeClasses[size],\n\n // Border and focus states\n hasError\n ? \"border-ews-error focus:border-ews-error focus:ring-ews-error/20\"\n : \"border-ews-gray-300 focus:border-ews-primary focus:ring-ews-primary/20\",\n\n // Hover state\n !disabled && !hasError && \"hover:border-ews-gray-400\",\n\n // Text color\n \"text-ews-gray-900\",\n\n // Padding for icons\n \"pr-10\",\n\n selectClassName\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center\">\n {renderTrigger ? (\n renderTrigger()\n ) : (\n <>\n <div className=\"flex-1 min-w-0\">\n {selectedOption ? (\n renderValue ? (\n renderValue(selectedOption)\n ) : (\n <span className=\"truncate\">{selectedOption.label}</span>\n )\n ) : (\n <span className=\"text-ews-gray-500\">{placeholder}</span>\n )}\n </div>\n\n <div className=\"flex items-center ml-2 space-x-1\">\n {clearable && selectedOption && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"p-1 rounded hover:bg-ews-gray-100\"\n >\n <X\n className={cn(\n iconSizeClasses[size],\n \"text-ews-gray-400\"\n )}\n />\n </button>\n )}\n <ChevronDown\n className={cn(\n iconSizeClasses[size],\n hasError ? \"text-ews-error\" : \"text-ews-gray-400\",\n disabled && \"text-ews-gray-300\",\n isOpen && \"rotate-180 transition-transform\"\n )}\n />\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Custom dropdown */}\n {isOpen && (\n <div\n ref={dropdownRef}\n role=\"listbox\"\n className={cn(\n \"absolute z-50 w-full bg-white rounded-md border shadow-lg border-ews-gray-300\",\n \"focus:outline-none\",\n dropdownPosition === \"top\"\n ? \"bottom-full mb-1\"\n : \"top-full mt-1\",\n dropdownClassName\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n {/* Search input */}\n {searchable && (\n <div className=\"p-2 border-b border-ews-gray-200\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 w-4 h-4 transform -translate-y-1/2 text-ews-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={searchPlaceholder}\n leftIcon={\n <Search className=\"w-4 h-4 text-ews-gray-400\" />\n }\n />\n </div>\n </div>\n )}\n\n {/* Options list */}\n <div\n className=\"overflow-auto py-1\"\n style={{ maxHeight: `${maxHeight - (searchable ? 60 : 0)}px` }}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-ews-gray-500\">\n {searchTerm ? noOptionsFoundText : noOptionsAvailableText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = option.value === value;\n const isFocused = index === focusedIndex;\n\n return (\n <div\n key={`${String(option.value)}-${index}`}\n ref={(el) => (optionRefs.current[index] = el)}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleSelect(option)}\n className={cn(\n \"px-3 py-2 text-sm cursor-pointer transition-colors\",\n isSelected && \"bg-ews-primary text-white\",\n !isSelected && isFocused && \"bg-ews-gray-100\",\n !isSelected && !isFocused && \"hover:bg-ews-gray-50\",\n option.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {renderOption ? (\n renderOption(option, isSelected)\n ) : (\n <span className=\"truncate\">{option.label}</span>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Helper text or error message */}\n {(helperText || error) && (\n <div className=\"mt-1\">\n {error ? (\n <p className=\"text-sm text-ews-error\">{error}</p>\n ) : (\n <p className=\"text-sm text-ews-gray-500\">{helperText}</p>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\n\nexport { Select };\n","import { useEffect, useState } from \"react\";\n\nconst DEFAULT_DELAY = 500;\n\n/**\n * A custom hook that debounces a value\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (optional, defaults to 300ms)\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n const actualDelay = delay ?? DEFAULT_DELAY;\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, actualDelay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, actualDelay]);\n\n return debouncedValue;\n}\n\n/**\n * A custom hook that provides a debounced callback function\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (optional, defaults to 300ms)\n * @returns A debounced version of the callback\n */\nexport function useDebouncedCallback<T extends (...args: unknown[]) => unknown>(\n callback: T,\n delay?: number\n): T {\n const [debounceTimer, setDebounceTimer] = useState<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n const debouncedCallback = ((...args: Parameters<T>) => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n const actualDelay = delay ?? DEFAULT_DELAY;\n const newTimer = setTimeout(() => {\n callback(...args);\n }, actualDelay);\n\n setDebounceTimer(newTimer);\n }) as T;\n\n useEffect(() => {\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n };\n }, [debounceTimer]);\n\n return debouncedCallback;\n}\n","import { useEffect, useState } from \"react\";\n\nconst matches = (query: string, fallback: boolean) =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(query).matches\n : fallback;\n\n/**\n * Whether a CSS media query matches, updated when it changes. Returns\n * `defaultValue` where `matchMedia` does not exist (server rendering, old\n * test environments).\n */\nexport const useMediaQuery = (query: string, defaultValue = false): boolean => {\n const [value, setValue] = useState(() => matches(query, defaultValue));\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const list = window.matchMedia(query);\n const onChange = () => setValue(list.matches);\n onChange();\n // Safari < 14 only has addListener.\n if (list.addEventListener) {\n list.addEventListener(\"change\", onChange);\n return () => list.removeEventListener(\"change\", onChange);\n }\n list.addListener(onChange);\n return () => list.removeListener(onChange);\n }, [query]);\n\n return value;\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseIdleLockOptions {\n /** Inactivity delay before locking. Default 15 minutes. */\n timeoutMs?: number;\n /** Called each time the screen becomes locked (idle, `lock()` or another tab). */\n onLock?: () => void;\n /** localStorage key of the locked flag, also the BroadcastChannel name. */\n storageKey?: string;\n /** Turns the inactivity timer off (e.g. until the session is loaded). Default true. */\n enabled?: boolean;\n}\n\nexport interface UseIdleLockResult {\n locked: boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 900_000;\nconst DEFAULT_STORAGE_KEY = \"ews-idle-lock\";\nconst ACTIVITY_WRITE_INTERVAL_MS = 5_000;\nconst ACTIVITY_EVENTS = [\n \"pointerdown\",\n \"pointermove\",\n \"keydown\",\n \"wheel\",\n \"scroll\",\n \"touchstart\",\n] as const;\n\nconst readStorage = (key: string): string | null => {\n try {\n return typeof window === \"undefined\" ? null : window.localStorage.getItem(key);\n } catch {\n return null;\n }\n};\n\nconst writeStorage = (key: string, value: string | null) => {\n try {\n if (typeof window === \"undefined\") return;\n if (value === null) window.localStorage.removeItem(key);\n else window.localStorage.setItem(key, value);\n } catch {\n // Storage unavailable (private mode, quota): the lock still works in this tab.\n }\n};\n\n/**\n * Locks the screen after `timeoutMs` without user activity. The locked flag is\n * kept in localStorage (it survives a reload) and shared between tabs through\n * a BroadcastChannel, or the `storage` event where BroadcastChannel is missing:\n * locking or unlocking one tab does the same in every tab. Activity in any tab\n * keeps every tab unlocked.\n */\nexport function useIdleLock({\n timeoutMs = DEFAULT_TIMEOUT_MS,\n onLock,\n storageKey = DEFAULT_STORAGE_KEY,\n enabled = true,\n}: UseIdleLockOptions = {}): UseIdleLockResult {\n const activityKey = `${storageKey}:activity`;\n const [locked, setLocked] = useState(() => readStorage(storageKey) === \"1\");\n const lockedRef = useRef(locked);\n const onLockRef = useRef(onLock);\n const lastActivity = useRef(Date.now());\n const lastActivityWrite = useRef(0);\n const channelRef = useRef<{ postMessage: (message: string) => void } | null>(\n null,\n );\n\n useEffect(() => {\n onLockRef.current = onLock;\n }, [onLock]);\n\n const markActivity = useCallback(\n (now: number) => {\n lastActivity.current = now;\n if (now - lastActivityWrite.current >= ACTIVITY_WRITE_INTERVAL_MS) {\n lastActivityWrite.current = now;\n writeStorage(activityKey, String(now));\n }\n },\n [activityKey],\n );\n\n const applyLocked = useCallback((next: boolean) => {\n if (lockedRef.current === next) return;\n lockedRef.current = next;\n setLocked(next);\n if (next) onLockRef.current?.();\n }, []);\n\n const lock = useCallback(() => {\n if (lockedRef.current) return;\n writeStorage(storageKey, \"1\");\n channelRef.current?.postMessage(\"lock\");\n applyLocked(true);\n }, [storageKey, applyLocked]);\n\n const unlock = useCallback(() => {\n lastActivityWrite.current = 0;\n markActivity(Date.now());\n writeStorage(storageKey, null);\n channelRef.current?.postMessage(\"unlock\");\n applyLocked(false);\n }, [storageKey, applyLocked, markActivity]);\n\n // Cross-tab sync.\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onRemote = (nextLocked: boolean) => {\n if (!nextLocked) lastActivity.current = Date.now();\n applyLocked(nextLocked);\n };\n\n if (typeof window.BroadcastChannel === \"function\") {\n const channel = new window.BroadcastChannel(storageKey);\n channelRef.current = channel;\n channel.onmessage = (event: MessageEvent) => {\n if (event.data === \"lock\") onRemote(true);\n else if (event.data === \"unlock\") onRemote(false);\n };\n return () => {\n channelRef.current = null;\n channel.close();\n };\n }\n\n const onStorage = (event: StorageEvent) => {\n if (event.key !== storageKey) return;\n onRemote(event.newValue === \"1\");\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [storageKey, applyLocked]);\n\n // Inactivity timer.\n useEffect(() => {\n if (!enabled || locked || typeof window === \"undefined\") return;\n lastActivity.current = Date.now();\n let timer: ReturnType<typeof setTimeout>;\n\n const idleFor = () => {\n const shared = Number(readStorage(activityKey)) || 0;\n return Date.now() - Math.max(lastActivity.current, shared);\n };\n\n const check = () => {\n const idle = idleFor();\n if (idle >= timeoutMs) lock();\n else timer = setTimeout(check, timeoutMs - idle);\n };\n\n const onActivity = () => markActivity(Date.now());\n\n // Timers are throttled in background tabs: check the delay on return.\n const onVisibility = () => {\n if (document.visibilityState !== \"visible\") return;\n if (idleFor() >= timeoutMs) lock();\n else onActivity();\n };\n\n timer = setTimeout(check, timeoutMs);\n ACTIVITY_EVENTS.forEach((name) =>\n document.addEventListener(name, onActivity, { capture: true, passive: true }),\n );\n document.addEventListener(\"visibilitychange\", onVisibility);\n\n return () => {\n clearTimeout(timer);\n ACTIVITY_EVENTS.forEach((name) =>\n document.removeEventListener(name, onActivity, { capture: true }),\n );\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [enabled, locked, timeoutMs, activityKey, lock, markActivity]);\n\n return { locked, lock, unlock };\n}\n","import {\n Control,\n FieldPath,\n FieldPathValue,\n FieldValues,\n RegisterOptions,\n useController,\n} from \"react-hook-form\";\nimport { SelectOption, SelectProps } from \"../components/Select\";\n\nexport interface UseSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> {\n name: TName;\n control: Control<TFieldValues>;\n options: SelectOption[];\n rules?: Omit<\n RegisterOptions<TFieldValues, TName>,\n \"disabled\" | \"valueAsNumber\" | \"valueAsDate\" | \"setValueAs\"\n >;\n defaultValue?: FieldPathValue<TFieldValues, TName>;\n}\n\nexport function useSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n>({\n name,\n control,\n options: _options,\n rules,\n defaultValue,\n}: UseSelectFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error, invalid },\n } = useController({\n name,\n control,\n rules,\n defaultValue,\n });\n\n const selectProps: Omit<SelectProps, \"options\"> = {\n value: field.value,\n onChange: (value) => field.onChange(value),\n isError: invalid,\n error: error?.message,\n };\n\n return {\n selectProps,\n field,\n error,\n invalid,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** The subset of the Web Speech API the hook uses; browsers expose it unprefixed or as webkit*. */\ninterface SpeechRecognitionLike {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: { results: ArrayLike<ArrayLike<{ transcript: string }>> }) => void) | null;\n onerror: ((event: { error?: string }) => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\n\nconst BCP47: Record<string, string> = { fr: \"fr-FR\", en: \"en-US\", ar: \"ar-SA\" };\n\nexport function getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n if (typeof window === \"undefined\") return undefined;\n const w = window as unknown as {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n };\n return w.SpeechRecognition ?? w.webkitSpeechRecognition;\n}\n\n/** True once mounted in a browser that has the speech recognition API (false on the server). */\nexport function useSpeechSupported(): boolean {\n const [supported, setSupported] = useState(false);\n useEffect(() => {\n setSupported(getSpeechRecognition() !== undefined);\n }, []);\n return supported;\n}\n\nexport interface UseSpeechRecognitionOptions {\n /** `fr`, `en`, `ar` or a BCP 47 tag. */\n language: string;\n /** Called with the final transcript when recognition stops. */\n onResult: (transcript: string) => void;\n /** Called with interim text while the user speaks. */\n onInterim?: (transcript: string) => void;\n}\n\n/**\n * Push-to-talk on the browser speech API (MED-1783). `supported` is false on\n * the server and in browsers without the API, so the app can hide the mic.\n */\nexport function useSpeechRecognition({\n language,\n onResult,\n onInterim,\n}: UseSpeechRecognitionOptions) {\n const [supported, setSupported] = useState(false);\n const [listening, setListening] = useState(false);\n const recognitionRef = useRef<SpeechRecognitionLike | null>(null);\n const transcriptRef = useRef(\"\");\n const callbacks = useRef({ onResult, onInterim });\n callbacks.current = { onResult, onInterim };\n\n // Detected after mount: the server never has the API, and the markup must match.\n useEffect(() => {\n setSupported(getSpeechRecognition() !== undefined);\n }, []);\n\n const stop = useCallback(() => {\n recognitionRef.current?.stop();\n }, []);\n\n const start = useCallback(() => {\n const Ctor = getSpeechRecognition();\n if (!Ctor || recognitionRef.current) return;\n const recognition = new Ctor();\n recognition.lang = BCP47[language] ?? language;\n recognition.interimResults = true;\n recognition.continuous = true;\n transcriptRef.current = \"\";\n recognition.onresult = (event) => {\n let text = \"\";\n for (let i = 0; i < event.results.length; i++) {\n text += event.results[i][0]?.transcript ?? \"\";\n }\n transcriptRef.current = text.trim();\n callbacks.current.onInterim?.(transcriptRef.current);\n };\n recognition.onerror = () => {\n recognition.stop();\n };\n recognition.onend = () => {\n recognitionRef.current = null;\n setListening(false);\n if (transcriptRef.current) callbacks.current.onResult(transcriptRef.current);\n };\n recognitionRef.current = recognition;\n setListening(true);\n recognition.start();\n }, [language]);\n\n useEffect(() => () => recognitionRef.current?.abort(), []);\n\n return { supported, listening, start, stop };\n}\n","import { LucideIcon, Search, X } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useDebounce } from \"../../hooks\";\nimport { Input } from \"../Input/Input\";\n\n// Generic interface for searchable entities\nexport interface SearchableEntity {\n id: string;\n [key: string]: unknown;\n}\n\ninterface SearchAutocompleteProps<T extends SearchableEntity> {\n onSelect: (id: string, entity?: T) => void;\n selectedId: string;\n searchFunction: (keyword: string) => Promise<T[]>;\n getEntityById?: (id: string) => Promise<T | undefined>;\n getDisplayValue: (entity: T) => string;\n getSecondaryText?: (entity: T) => string | null;\n placeholder: string;\n icon?: LucideIcon;\n disabled?: boolean;\n minSearchLength?: number;\n debounceTime?: number;\n error?: string;\n /**\n * MED-1501: builds the hint appended to the placeholder while the search\n * term is still too short. Return `null` (or an empty string) to suppress\n * the hint entirely. Defaults to the English \"(min. N characters)\", so\n * callers that do not pass it keep today's placeholder.\n */\n getMinCharactersHint?: (minSearchLength: number) => string | null;\n /**\n * MED-1690: message shown when the search returns nothing. Defaults to the English\n * \"No results found. Try a different search term.\", so callers that do not pass it are unchanged.\n */\n noResultsText?: string;\n}\n\nexport function SearchAutocomplete<T extends SearchableEntity>({\n onSelect,\n selectedId,\n searchFunction,\n getEntityById,\n getDisplayValue,\n getSecondaryText,\n placeholder,\n icon = Search,\n disabled = false,\n minSearchLength = 2,\n debounceTime = 300,\n error,\n getMinCharactersHint = (min) => `(min. ${min} characters)`,\n noResultsText = \"No results found. Try a different search term.\",\n}: SearchAutocompleteProps<T>) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [entities, setEntities] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [selectedEntity, setSelectedEntity] = useState<T | null>(null);\n const [initialLoadDone, setInitialLoadDone] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const debouncedSearchTerm = useDebounce(searchTerm, debounceTime);\n\n // Track if this is an initial load or a user-initiated search\n const isUserSearch = useRef(false);\n\n // Only fetch the selected entity by ID once on initial load\n useEffect(() => {\n const fetchSelectedEntity = async () => {\n // Only fetch if we have a selectedId, getEntityById function, and haven't loaded yet\n if (!selectedId || !getEntityById || initialLoadDone) return;\n\n setIsLoading(true);\n try {\n const entity = await getEntityById(selectedId);\n if (entity) {\n setSelectedEntity(entity);\n setSearchTerm(getDisplayValue(entity));\n }\n } catch (error) {\n console.error(\"Error fetching selected entity:\", error);\n } finally {\n setIsLoading(false);\n setInitialLoadDone(true);\n }\n };\n\n fetchSelectedEntity();\n }, [selectedId, getEntityById, getDisplayValue, initialLoadDone]);\n\n // Handle search term changes - only for user-initiated searches\n useEffect(() => {\n // Skip if this is just setting the initial value\n if (!isUserSearch.current) return;\n\n // Clear entities if search term is too short\n if (searchTerm.trim().length < minSearchLength) {\n setEntities([]);\n setSearchError(null);\n }\n }, [searchTerm, minSearchLength]);\n\n // Fetch entities when debounced search term changes - only for user searches\n useEffect(() => {\n const fetchEntities = async () => {\n if (\n !debouncedSearchTerm ||\n debouncedSearchTerm.length < minSearchLength\n ) {\n return;\n }\n\n setIsLoading(true);\n setSearchError(null);\n try {\n const results = await searchFunction(debouncedSearchTerm);\n setEntities(results);\n } catch (error) {\n console.error(\"Error fetching search results:\", error);\n setSearchError(\n error instanceof Error ? error.message : \"Search failed\"\n );\n } finally {\n setIsLoading(false);\n }\n };\n\n // Only fetch if this is a user-initiated search\n if (isUserSearch.current) {\n fetchEntities();\n }\n }, [debouncedSearchTerm, searchFunction, minSearchLength]);\n\n // Handle click outside to close dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setShowDropdown(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n // Mark this as a user-initiated search\n isUserSearch.current = true;\n\n setSearchTerm(value);\n\n if (selectedEntity) {\n setSelectedEntity(null);\n onSelect(\"\");\n }\n\n setShowDropdown(value.trim().length >= minSearchLength);\n };\n\n const handleEntitySelect = (entity: T) => {\n // This is a user selection, not an API fetch\n isUserSearch.current = false;\n\n console.log(`Selected entity with ID: ${entity.id}`);\n setSelectedEntity(entity);\n setSearchTerm(getDisplayValue(entity));\n onSelect(entity.id, entity);\n setShowDropdown(false);\n };\n\n const handleClearSelection = () => {\n // This is a user action, but not a search\n isUserSearch.current = false;\n\n setSelectedEntity(null);\n setSearchTerm(\"\");\n onSelect(\"\");\n };\n\n const minCharactersHint = getMinCharactersHint(minSearchLength);\n const inputPlaceholder = minCharactersHint\n ? `${placeholder} ${minCharactersHint}`\n : placeholder;\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder={inputPlaceholder}\n value={selectedEntity ? \"\" : searchTerm}\n onChange={handleSearchChange}\n onFocus={() =>\n searchTerm.length >= minSearchLength &&\n isUserSearch.current &&\n setShowDropdown(true)\n }\n disabled={disabled}\n autoComplete=\"off\"\n name=\"search-autocomplete\"\n leftIcon={React.createElement(icon, { size: 16 })}\n />\n\n {selectedEntity && (\n <button\n type=\"button\"\n className=\"flex absolute inset-y-0 right-0 items-center pr-3\"\n onClick={handleClearSelection}\n disabled={disabled}\n >\n <X className=\"w-5 h-5 text-gray-400 hover:text-gray-500\" />\n </button>\n )}\n </div>\n\n {/* Selected Entity Display */}\n {selectedEntity && (\n <div className=\"p-4 mt-3 rounded-lg border bg-neutral-50 border-neutral-200\">\n <div className=\"flex justify-between items-center\">\n <div className=\"flex items-center\">\n {(selectedEntity as { photoUrl?: string }).photoUrl ? (\n <img\n src={(selectedEntity as { photoUrl?: string }).photoUrl!}\n alt={getDisplayValue(selectedEntity)}\n className=\"object-cover mr-3 w-10 h-10 rounded-full\"\n />\n ) : (\n React.createElement(icon, {\n className: \"w-10 h-10 text-neutral-400 mr-3\",\n })\n )}\n <div>\n <div className=\"font-medium text-neutral-900\">\n {getDisplayValue(selectedEntity)}\n </div>\n {getSecondaryText && getSecondaryText(selectedEntity) && (\n <div className=\"text-sm text-neutral-500\">\n {getSecondaryText(selectedEntity)}\n </div>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleClearSelection}\n className=\"transition-colors text-neutral-400 hover:text-neutral-600\"\n disabled={disabled}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n )}\n\n {showDropdown && entities?.length > 0 && (\n <div className=\"overflow-auto absolute z-10 mt-1 w-full max-h-60 bg-white rounded-md shadow-lg\">\n <ul className=\"py-1\">\n {entities.map((entity) => (\n <li\n key={entity.id}\n className=\"px-4 py-2 cursor-pointer hover:bg-gray-100\"\n onClick={() => handleEntitySelect(entity)}\n >\n <div className=\"flex items-center\">\n {React.createElement(icon, {\n className: \"w-4 h-4 text-gray-400\",\n })}\n <div className=\"ml-2\">\n <div className=\"font-medium\">{getDisplayValue(entity)}</div>\n {getSecondaryText && getSecondaryText(entity) && (\n <div className=\"text-xs text-gray-500\">\n {getSecondaryText(entity)}\n </div>\n )}\n </div>\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {showDropdown && searchError && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-red-600 bg-white rounded-md border border-red-200 shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n Error: {searchError}\n </div>\n </div>\n )}\n\n {showDropdown && error && !searchError && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-red-600 bg-white rounded-md border border-red-200 shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n {error}\n </div>\n </div>\n )}\n\n {showDropdown &&\n debouncedSearchTerm &&\n entities?.length === 0 &&\n !isLoading &&\n !searchError &&\n !error && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-gray-500 bg-white rounded-md shadow-lg\">\n {debouncedSearchTerm.length < minSearchLength\n ? `Type at least ${minSearchLength} characters to search`\n : noResultsText}\n </div>\n )}\n\n {isLoading && showDropdown && (\n <div className=\"absolute z-10 p-4 mt-1 w-full text-center text-gray-500 bg-white rounded-md shadow-lg\">\n <div className=\"flex justify-center items-center\">\n <div className=\"mr-2 w-4 h-4 rounded-full border-b-2 animate-spin border-ews-primary\"></div>\n Loading...\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { Check, Search, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useDebounce } from \"../../hooks\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input/Input\";\nimport { SearchableEntity } from \"../SearchAutocomplete/SearchAutocomplete\";\n\ninterface MultiSearchAutocompleteProps<T extends SearchableEntity> {\n items: T[];\n selectedItems: T[];\n onSelectionChange: (items: T[]) => void;\n onSearch: (searchTerm: string) => Promise<void>;\n getEntityById?: (id: string) => Promise<T | undefined>;\n getPrimaryText: (entity: T) => string;\n getSecondaryText?: (entity: T) => string | null;\n placeholder: string;\n disabled?: boolean;\n loading?: boolean;\n multiple?: boolean;\n className?: string;\n renderSelectedItem?: (entity: T) => React.ReactNode;\n renderListItem?: (entity: T, isSelected: boolean) => React.ReactNode;\n keepOpenOnSelect?: boolean;\n error?: string;\n minSearchLength?: number;\n debounceTime?: number;\n}\n\nexport function MultiSearchAutocomplete<T extends SearchableEntity>({\n items,\n selectedItems,\n onSelectionChange,\n onSearch,\n getEntityById: _getEntityById,\n getPrimaryText,\n getSecondaryText,\n placeholder,\n disabled = false,\n loading = false,\n multiple = true,\n className,\n renderSelectedItem,\n renderListItem,\n keepOpenOnSelect = true,\n error,\n minSearchLength = 2,\n debounceTime = 300,\n}: MultiSearchAutocompleteProps<T>) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const [filteredItems, setFilteredItems] = useState<T[]>(items);\n const [isSearching, setIsSearching] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const debouncedSearchTerm = useDebounce(searchTerm, debounceTime);\n\n // Handle search term changes\n useEffect(() => {\n // If search term is empty, show all items\n if (!searchTerm.trim()) {\n setFilteredItems(items);\n setSearchError(null);\n return;\n }\n\n // If search term is too short, don't search\n if (searchTerm.length < minSearchLength) {\n setFilteredItems([]);\n setSearchError(null);\n return;\n }\n }, [searchTerm, items, minSearchLength]);\n\n // Debounced search with API calls\n useEffect(() => {\n // If debounced search term is empty or too short, don't search\n if (\n !debouncedSearchTerm.trim() ||\n debouncedSearchTerm.length < minSearchLength\n ) {\n return;\n }\n\n const performSearch = async () => {\n try {\n setIsSearching(true);\n setSearchError(null);\n await onSearch(debouncedSearchTerm);\n } catch (err) {\n setSearchError(err instanceof Error ? err.message : \"Search failed\");\n } finally {\n setIsSearching(false);\n }\n };\n\n performSearch();\n }, [debouncedSearchTerm, onSearch, minSearchLength]);\n\n // Update filtered items when items prop changes\n useEffect(() => {\n setFilteredItems(items);\n }, [items]);\n\n const handleItemToggle = useCallback(\n (item: T) => {\n if (multiple) {\n const isSelected = selectedItems.some(\n (selected) => selected.id === item.id\n );\n\n if (isSelected) {\n onSelectionChange(\n selectedItems.filter((selected) => selected.id !== item.id)\n );\n } else {\n onSelectionChange([...selectedItems, item]);\n }\n // Keep dropdown open for multiple selection\n if (keepOpenOnSelect) {\n setIsOpen(true);\n }\n } else {\n onSelectionChange([item]);\n setIsOpen(false);\n }\n },\n [selectedItems, onSelectionChange, multiple, keepOpenOnSelect]\n );\n\n const handleRemoveItem = useCallback(\n (itemToRemove: T) => {\n onSelectionChange(\n selectedItems.filter((item) => item.id !== itemToRemove.id)\n );\n },\n [selectedItems, onSelectionChange]\n );\n\n const handleInputFocus = () => {\n if (!disabled) {\n setIsOpen(true);\n }\n };\n\n const handleInputBlur = () => {\n // Don't close immediately to allow for clicks on dropdown items\n // Only close if keepOpenOnSelect is false\n if (!keepOpenOnSelect) {\n setTimeout(() => setIsOpen(false), 150);\n }\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscapeKey);\n };\n }, [isOpen]);\n\n // Default render functions\n const defaultRenderSelectedItem = (entity: T) => (\n <span className=\"inline-flex items-center px-3 py-1 text-sm font-medium rounded-full border bg-ews-primary/10 text-ews-primary border-ews-primary/20\">\n {getPrimaryText(entity)}\n <button\n type=\"button\"\n onClick={() => handleRemoveItem(entity)}\n className=\"ml-2 text-ews-primary/60 hover:text-ews-primary\"\n disabled={disabled}\n title=\"Remove item\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n );\n\n const defaultRenderListItem = (entity: T, isSelected: boolean) => (\n <div className=\"flex items-center space-x-3\">\n <div\n className={cn(\n \"flex justify-center items-center w-5 h-5 rounded border-2\",\n isSelected\n ? \"bg-ews-primary border-ews-primary\"\n : \"border-ews-gray-300\"\n )}\n >\n {isSelected && <Check className=\"w-3 h-3 text-white\" />}\n </div>\n <div className=\"flex flex-col\">\n <span\n className={cn(\n \"font-medium\",\n isSelected ? \"text-ews-primary\" : \"text-gray-900\"\n )}\n >\n {getPrimaryText(entity)}\n </span>\n {getSecondaryText && (\n <span\n className={cn(\n \"text-sm\",\n isSelected ? \"text-ews-primary/70\" : \"text-gray-500\"\n )}\n >\n {getSecondaryText(entity)}\n </span>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={cn(\"relative\", className)} ref={dropdownRef}>\n {/* Selected items display */}\n {selectedItems.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {selectedItems.map((item) => (\n <div key={item.id}>\n {renderSelectedItem\n ? renderSelectedItem(item)\n : defaultRenderSelectedItem(item)}\n </div>\n ))}\n </div>\n )}\n\n {/* Search input */}\n <Input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n disabled={disabled}\n leftIcon={<Search className=\"w-4 h-4\" />}\n className=\"w-full\"\n />\n\n {/* Dropdown */}\n {isOpen && !disabled && (\n <div className=\"overflow-auto absolute z-10 mt-1 w-full max-h-60 bg-white rounded-lg border border-gray-200 shadow-lg\">\n {loading || isSearching ? (\n <div className=\"flex items-center px-4 py-3 text-sm text-gray-500\">\n <div className=\"mr-2 w-4 h-4 rounded-full border-b-2 animate-spin border-ews-primary\"></div>\n {isSearching ? \"Searching...\" : \"Loading...\"}\n </div>\n ) : searchError ? (\n <div className=\"px-4 py-3 text-sm text-red-600\">\n <div className=\"flex items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n Error: {searchError}\n </div>\n </div>\n ) : error ? (\n <div className=\"px-4 py-3 text-sm text-red-600\">\n <div className=\"flex items-center\">\n <X className=\"mr-2 w-4 h-4\" />\n {error}\n </div>\n </div>\n ) : filteredItems.length === 0 ? (\n <div className=\"px-4 py-3 text-sm text-gray-500\">\n {searchTerm.length < minSearchLength\n ? `Type at least ${minSearchLength} characters to search`\n : \"No items found\"}\n </div>\n ) : (\n <div className=\"py-1\">\n {filteredItems.map((item) => {\n const isSelected = selectedItems.some(\n (selected) => selected.id === item.id\n );\n\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleItemToggle(item)}\n className={cn(\n \"flex items-center px-4 py-3 w-full text-left transition-colors\",\n isSelected\n ? \"border-l-4 bg-ews-primary/10 text-ews-primary border-ews-primary\"\n : \"text-gray-900 hover:bg-ews-primary/5\"\n )}\n >\n {renderListItem\n ? renderListItem(item, isSelected)\n : defaultRenderListItem(item, isSelected)}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { AlertCircle, AlertTriangle, CheckCircle, X } from \"lucide-react\";\nimport React, { useEffect } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ErrorField {\n name: string;\n message: string;\n path?: string;\n}\n\nexport interface ErrorObject {\n code: string;\n message: string;\n fields?: ErrorField[];\n}\n\nexport interface ModalProps {\n /**\n * Whether the modal is open\n */\n isOpen: boolean;\n /**\n * Function to call when modal should be closed\n */\n onClose: () => void;\n /**\n * Modal title\n */\n title: string;\n /**\n * Modal content/description\n */\n children?: React.ReactNode;\n /**\n * Modal variant\n */\n variant?: \"error\" | \"warning\" | \"confirmation\" | \"info\";\n /**\n * Modal size/width\n */\n size?:\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"5xl\"\n | \"6xl\"\n | \"7xl\"\n | \"8xl\"\n | \"9xl\"\n | \"10xl\"\n | \"full\";\n /**\n * Primary action button text\n */\n primaryAction?: string;\n /**\n * Secondary action button text\n */\n secondaryAction?: string;\n /**\n * Function to call when primary action is clicked\n */\n onPrimaryAction?: () => void;\n /**\n * Function to call when secondary action is clicked\n */\n onSecondaryAction?: () => void;\n /**\n * Whether the primary action button is loading\n */\n isLoading?: boolean;\n /**\n * Whether the modal can be closed by clicking outside or pressing escape\n */\n closeOnOverlayClick?: boolean;\n /**\n * Custom className for the modal\n */\n className?: string;\n /**\n * Custom className for the content\n */\n contentClassName?: string;\n /**\n * Error object for error modals\n */\n error?: ErrorObject;\n}\n\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n variant = \"info\",\n size = \"md\",\n primaryAction,\n secondaryAction,\n onPrimaryAction,\n onSecondaryAction,\n isLoading = false,\n closeOnOverlayClick = true,\n className,\n contentClassName,\n error,\n}: ModalProps) => {\n // Handle escape key press\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n // Prevent body scroll when modal is open\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"unset\";\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const getVariantStyles = () => {\n switch (variant) {\n case \"error\":\n return {\n icon: <AlertCircle className=\"w-6 h-6 text-ews-error\" />,\n iconBg: \"bg-ews-error/10\",\n titleColor: \"text-ews-error\",\n borderColor: \"border-ews-error/20\",\n };\n case \"warning\":\n return {\n icon: <AlertTriangle className=\"w-6 h-6 text-ews-warning\" />,\n iconBg: \"bg-ews-warning/10\",\n titleColor: \"text-ews-warning\",\n borderColor: \"border-ews-warning/20\",\n };\n case \"confirmation\":\n return {\n icon: <CheckCircle className=\"w-6 h-6 text-ews-success\" />,\n iconBg: \"bg-ews-success/10\",\n titleColor: \"text-ews-success\",\n borderColor: \"border-ews-success/20\",\n };\n default:\n return {\n icon: <AlertCircle className=\"w-6 h-6 text-ews-primary\" />,\n iconBg: \"bg-ews-primary/10\",\n titleColor: \"text-ews-primary\",\n borderColor: \"border-ews-primary/20\",\n };\n }\n };\n\n const variantStyles = getVariantStyles();\n\n const getSizeClasses = () => {\n const sizeMap = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n \"2xl\": \"max-w-2xl\",\n \"3xl\": \"max-w-3xl\",\n \"4xl\": \"max-w-4xl\",\n \"5xl\": \"max-w-5xl\",\n \"6xl\": \"max-w-6xl\",\n \"7xl\": \"max-w-7xl\",\n \"8xl\": \"max-w-8xl\",\n \"9xl\": \"max-w-9xl\",\n \"10xl\": \"max-w-10xl\",\n full: \"max-w-full\",\n };\n return sizeMap[size] || sizeMap.md;\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && closeOnOverlayClick) {\n onClose();\n }\n };\n\n return (\n <div className=\"flex fixed inset-0 z-50 justify-center items-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 backdrop-blur-sm bg-black/50\"\n onClick={handleOverlayClick}\n />\n\n {/* Modal */}\n <div\n className={cn(\n \"relative w-full bg-white rounded-lg shadow-xl transition-all transform\",\n \"duration-200 animate-in fade-in-0 zoom-in-95\",\n getSizeClasses(),\n \"mx-4\",\n className,\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"modal-title\"\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center justify-between p-6 border-b\",\n variantStyles.borderColor,\n )}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={cn(\"p-2 rounded-full\", variantStyles.iconBg)}>\n {variantStyles.icon}\n </div>\n <h2\n id=\"modal-title\"\n className={cn(\"text-lg font-semibold\", variantStyles.titleColor)}\n >\n {title}\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 text-gray-400 transition-colors hover:text-gray-600\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className={cn(\"p-6\", contentClassName)}>\n <div className=\"leading-relaxed text-gray-700\">\n {error && variant === \"error\" ? (\n <div className=\"space-y-3\">\n <p>{error.message}</p>\n {error.fields && error.fields.length > 0 && (\n <div>\n <p className=\"font-semibold text-gray-900\">\n Erreurs de champ:\n </p>\n <ul className=\"mt-2 space-y-1\">\n {error.fields.map((field, index) => (\n <li key={index} className=\"text-ews-error\">\n • {field.path}: {field.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ) : (\n children\n )}\n </div>\n </div>\n\n {/* Actions */}\n {(primaryAction || secondaryAction) && (\n <div className=\"flex justify-end items-center p-6 pt-0 space-x-3\">\n {secondaryAction && (\n <Button\n variant=\"outline\"\n onClick={onSecondaryAction || onClose}\n disabled={isLoading}\n >\n {secondaryAction}\n </Button>\n )}\n {primaryAction && (\n <Button\n variant={variant === \"error\" ? \"error\" : \"ews-primary\"}\n onClick={onPrimaryAction}\n loading={isLoading}\n >\n {primaryAction}\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { Modal };\n","import { Pencil, Trash } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"../../utils\";\nimport { Modal } from \"../Modal/Modal\";\n\nconst ACCEPTED_MIME_TYPES = [\"image/jpeg\", \"image/png\", \"image/webp\"] as const;\nexport type AcceptedImageMimeType = (typeof ACCEPTED_MIME_TYPES)[number];\n\nexport interface ProfileImageUploadProps {\n /** Current image URL — pass your default placeholder URL when no custom image is set */\n imageUrl: string;\n /** Alt text for accessibility */\n altText: string;\n /** Disable editing */\n readOnly?: boolean;\n /** Avatar diameter */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Upload progress 0–100.\n * Progress bar is hidden when 0; auto-hides 1 s after reaching 100.\n */\n uploadProgress?: number;\n /**\n * When true the progress bar stays visible in an indeterminate (pulsing)\n * state for phases with no measurable progress (pre-upload / post-upload).\n * The bar auto-hides 1 s after both `isLoading` is false and progress reached 100.\n */\n isLoading?: boolean;\n /**\n * Whether to show the delete button.\n * Pass `false` when `imageUrl` is a default/fallback image.\n */\n showDeleteButton?: boolean;\n /**\n * Accepted MIME types (default: JPEG, PNG, WEBP).\n * Used for both the file-input `accept` attribute and client-side validation.\n */\n acceptedFormats?: AcceptedImageMimeType[];\n /** Max allowed file size in MB (default: 5) */\n maxFileSizeMB?: number;\n /**\n * Optional aspect-ratio hint shown below the avatar (e.g. \"1:1\", \"4:3\").\n * Pure informational — no cropping is enforced client-side.\n */\n aspectRatioHint?: string;\n /** Called with the validated File once the user picks an acceptable file */\n onFileSelect: (file: File) => void;\n /** Called when the selected file exceeds `maxFileSizeMB` */\n onFileSizeExceeded?: () => void;\n /** Called when the selected file's MIME type is not in `acceptedFormats` */\n onInvalidFormat?: () => void;\n /** Called when the user confirms deletion in the modal */\n onDeleteConfirm: () => void;\n /** Deletion confirmation modal — title text */\n deleteConfirmTitle: string;\n /** Deletion confirmation modal — body text */\n deleteConfirmMessage: string;\n /** Deletion confirmation modal — primary button label */\n deleteConfirmLabel: string;\n /** Deletion confirmation modal — secondary / cancel label */\n cancelLabel: string;\n}\n\nconst SIZE_CLASSES: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: \"h-10 w-10\",\n md: \"h-16 w-16\",\n lg: \"h-32 w-32\",\n};\n\nconst INDICATOR_CLASSES: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: \"h-2 w-2\",\n md: \"h-4 w-4\",\n lg: \"h-8 w-8\",\n};\n\nfunction UploadProgressBar({\n progress,\n isLoading,\n}: {\n progress: number;\n isLoading?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (isLoading) {\n setVisible(true);\n return;\n }\n // isLoading just turned false\n if (progress >= 100) {\n setVisible(true);\n const t = setTimeout(() => setVisible(false), 1000);\n return () => clearTimeout(t);\n }\n // Legacy path (no isLoading prop): driven purely by progress\n if (progress > 0 && progress < 100) {\n setVisible(true);\n return;\n }\n setVisible(false);\n }, [progress, isLoading]);\n\n if (!visible) return null;\n\n const indeterminate = isLoading && progress === 0;\n\n return (\n <div className=\"mt-2 h-1.5 w-32 rounded-full bg-gray-200\">\n <div\n className={cn(\n \"h-full rounded-full bg-ews-primary transition-all duration-300\",\n indeterminate && \"animate-pulse\"\n )}\n style={{ width: indeterminate ? \"35%\" : `${progress}%` }}\n />\n </div>\n );\n}\n\nexport const ProfileImageUpload: React.FC<ProfileImageUploadProps> = ({\n imageUrl,\n altText,\n readOnly = false,\n size = \"lg\",\n uploadProgress = 0,\n isLoading = false,\n showDeleteButton = true,\n acceptedFormats = [...ACCEPTED_MIME_TYPES],\n maxFileSizeMB = 5,\n aspectRatioHint,\n onFileSelect,\n onFileSizeExceeded,\n onInvalidFormat,\n onDeleteConfirm,\n deleteConfirmTitle,\n deleteConfirmMessage,\n deleteConfirmLabel,\n cancelLabel,\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isHovered, setIsHovered] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const acceptAttr = acceptedFormats.join(\",\");\n\n const handleEditClick = () => fileInputRef.current?.click();\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (acceptedFormats.indexOf(file.type as AcceptedImageMimeType) === -1) {\n onInvalidFormat?.();\n e.target.value = \"\";\n return;\n }\n\n if (file.size > maxFileSizeMB * 1024 * 1024) {\n onFileSizeExceeded?.();\n e.target.value = \"\";\n return;\n }\n\n onFileSelect(file);\n e.target.value = \"\";\n };\n\n const handleConfirmDelete = () => {\n setShowConfirm(false);\n onDeleteConfirm();\n };\n\n return (\n <>\n <div className=\"inline-flex flex-col items-center\">\n <div\n className=\"relative\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <img\n src={imageUrl}\n alt={altText}\n className={cn(\n \"rounded-full border-4 border-white object-cover\",\n SIZE_CLASSES[size]\n )}\n />\n\n {/* Online status dot */}\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-4 border-white bg-green-400\",\n INDICATOR_CLASSES[size]\n )}\n />\n\n <input\n type=\"file\"\n ref={fileInputRef}\n accept={acceptAttr}\n className=\"hidden\"\n onChange={handleFileChange}\n />\n\n {isHovered && !readOnly && !isLoading && (\n <>\n {/* Edit / upload button */}\n <button\n type=\"button\"\n onClick={handleEditClick}\n className=\"absolute left-0 top-0 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-ews-primary transition-colors hover:bg-ews-secondary\"\n aria-label=\"Edit profile image\"\n >\n <Pencil className=\"h-4 w-4 text-white\" />\n </button>\n\n {/* Delete button — only when not a fallback/default image */}\n {showDeleteButton && (\n <button\n type=\"button\"\n onClick={() => setShowConfirm(true)}\n className=\"absolute left-0 top-10 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-red-600 transition-colors hover:bg-red-700\"\n aria-label=\"Delete profile image\"\n >\n <Trash className=\"h-4 w-4 text-white\" />\n </button>\n )}\n </>\n )}\n </div>\n\n <UploadProgressBar progress={uploadProgress} isLoading={isLoading} />\n\n {aspectRatioHint && (\n <p className=\"mt-1 text-xs text-gray-400\">Ratio: {aspectRatioHint}</p>\n )}\n </div>\n\n {/* Delete confirmation */}\n <Modal\n isOpen={showConfirm}\n onClose={() => setShowConfirm(false)}\n title={deleteConfirmTitle}\n variant=\"error\"\n size=\"sm\"\n primaryAction={deleteConfirmLabel}\n secondaryAction={cancelLabel}\n onPrimaryAction={handleConfirmDelete}\n onSecondaryAction={() => setShowConfirm(false)}\n >\n <p>{deleteConfirmMessage}</p>\n </Modal>\n </>\n );\n};\n","/**\n * Copyright 2004-present Facebook. All Rights Reserved.\n *\n * @providesModule UserAgent_DEPRECATED\n */\n\n/**\n * Provides entirely client-side User Agent and OS detection. You should prefer\n * the non-deprecated UserAgent module when possible, which exposes our\n * authoritative server-side PHP-based detection to the client.\n *\n * Usage is straightforward:\n *\n * if (UserAgent_DEPRECATED.ie()) {\n * // IE\n * }\n *\n * You can also do version checks:\n *\n * if (UserAgent_DEPRECATED.ie() >= 7) {\n * // IE7 or better\n * }\n *\n * The browser functions will return NaN if the browser does not match, so\n * you can also do version compares the other way:\n *\n * if (UserAgent_DEPRECATED.ie() < 7) {\n * // IE6 or worse\n * }\n *\n * Note that the version is a float and may include a minor version number,\n * so you should always use range operators to perform comparisons, not\n * strict equality.\n *\n * **Note:** You should **strongly** prefer capability detection to browser\n * version detection where it's reasonable:\n *\n * http://www.quirksmode.org/js/support.html\n *\n * Further, we have a large number of mature wrapper functions and classes\n * which abstract away many browser irregularities. Check the documentation,\n * grep for things, or ask on javascript@lists.facebook.com before writing yet\n * another copy of \"event || window.event\".\n *\n */\n\nvar _populated = false;\n\n// Browsers\nvar _ie, _firefox, _opera, _webkit, _chrome;\n\n// Actual IE browser for compatibility mode\nvar _ie_real_version;\n\n// Platforms\nvar _osx, _windows, _linux, _android;\n\n// Architectures\nvar _win64;\n\n// Devices\nvar _iphone, _ipad, _native;\n\nvar _mobile;\n\nfunction _populate() {\n if (_populated) {\n return;\n }\n\n _populated = true;\n\n // To work around buggy JS libraries that can't handle multi-digit\n // version numbers, Opera 10's user agent string claims it's Opera\n // 9, then later includes a Version/X.Y field:\n //\n // Opera/9.80 (foo) Presto/2.2.15 Version/10.10\n var uas = navigator.userAgent;\n var agent = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))|(?:Trident\\/\\d+\\.\\d+.*rv:(\\d+\\.\\d+))/.exec(uas);\n var os = /(Mac OS X)|(Windows)|(Linux)/.exec(uas);\n\n _iphone = /\\b(iPhone|iP[ao]d)/.exec(uas);\n _ipad = /\\b(iP[ao]d)/.exec(uas);\n _android = /Android/i.exec(uas);\n _native = /FBAN\\/\\w+;/i.exec(uas);\n _mobile = /Mobile/i.exec(uas);\n\n // Note that the IE team blog would have you believe you should be checking\n // for 'Win64; x64'. But MSDN then reveals that you can actually be coming\n // from either x64 or ia64; so ultimately, you should just check for Win64\n // as in indicator of whether you're in 64-bit IE. 32-bit IE on 64-bit\n // Windows will send 'WOW64' instead.\n _win64 = !!(/Win64/.exec(uas));\n\n if (agent) {\n _ie = agent[1] ? parseFloat(agent[1]) : (\n agent[5] ? parseFloat(agent[5]) : NaN);\n // IE compatibility mode\n if (_ie && document && document.documentMode) {\n _ie = document.documentMode;\n }\n // grab the \"true\" ie version from the trident token if available\n var trident = /(?:Trident\\/(\\d+.\\d+))/.exec(uas);\n _ie_real_version = trident ? parseFloat(trident[1]) + 4 : _ie;\n\n _firefox = agent[2] ? parseFloat(agent[2]) : NaN;\n _opera = agent[3] ? parseFloat(agent[3]) : NaN;\n _webkit = agent[4] ? parseFloat(agent[4]) : NaN;\n if (_webkit) {\n // We do not add the regexp to the above test, because it will always\n // match 'safari' only since 'AppleWebKit' appears before 'Chrome' in\n // the userAgent string.\n agent = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(uas);\n _chrome = agent && agent[1] ? parseFloat(agent[1]) : NaN;\n } else {\n _chrome = NaN;\n }\n } else {\n _ie = _firefox = _opera = _chrome = _webkit = NaN;\n }\n\n if (os) {\n if (os[1]) {\n // Detect OS X version. If no version number matches, set _osx to true.\n // Version examples: 10, 10_6_1, 10.7\n // Parses version number as a float, taking only first two sets of\n // digits. If only one set of digits is found, returns just the major\n // version number.\n var ver = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(uas);\n\n _osx = ver ? parseFloat(ver[1].replace('_', '.')) : true;\n } else {\n _osx = false;\n }\n _windows = !!os[2];\n _linux = !!os[3];\n } else {\n _osx = _windows = _linux = false;\n }\n}\n\nvar UserAgent_DEPRECATED = {\n\n /**\n * Check if the UA is Internet Explorer.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n ie: function() {\n return _populate() || _ie;\n },\n\n /**\n * Check if we're in Internet Explorer compatibility mode.\n *\n * @return bool true if in compatibility mode, false if\n * not compatibility mode or not ie\n */\n ieCompatibilityMode: function() {\n return _populate() || (_ie_real_version > _ie);\n },\n\n\n /**\n * Whether the browser is 64-bit IE. Really, this is kind of weak sauce; we\n * only need this because Skype can't handle 64-bit IE yet. We need to remove\n * this when we don't need it -- tracked by #601957.\n */\n ie64: function() {\n return UserAgent_DEPRECATED.ie() && _win64;\n },\n\n /**\n * Check if the UA is Firefox.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n firefox: function() {\n return _populate() || _firefox;\n },\n\n\n /**\n * Check if the UA is Opera.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n opera: function() {\n return _populate() || _opera;\n },\n\n\n /**\n * Check if the UA is WebKit.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n webkit: function() {\n return _populate() || _webkit;\n },\n\n /**\n * For Push\n * WILL BE REMOVED VERY SOON. Use UserAgent_DEPRECATED.webkit\n */\n safari: function() {\n return UserAgent_DEPRECATED.webkit();\n },\n\n /**\n * Check if the UA is a Chrome browser.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n chrome : function() {\n return _populate() || _chrome;\n },\n\n\n /**\n * Check if the user is running Windows.\n *\n * @return bool `true' if the user's OS is Windows.\n */\n windows: function() {\n return _populate() || _windows;\n },\n\n\n /**\n * Check if the user is running Mac OS X.\n *\n * @return float|bool Returns a float if a version number is detected,\n * otherwise true/false.\n */\n osx: function() {\n return _populate() || _osx;\n },\n\n /**\n * Check if the user is running Linux.\n *\n * @return bool `true' if the user's OS is some flavor of Linux.\n */\n linux: function() {\n return _populate() || _linux;\n },\n\n /**\n * Check if the user is running on an iPhone or iPod platform.\n *\n * @return bool `true' if the user is running some flavor of the\n * iPhone OS.\n */\n iphone: function() {\n return _populate() || _iphone;\n },\n\n mobile: function() {\n return _populate() || (_iphone || _ipad || _android || _mobile);\n },\n\n nativeApp: function() {\n // webviews inside of the native apps\n return _populate() || _native;\n },\n\n android: function() {\n return _populate() || _android;\n },\n\n ipad: function() {\n return _populate() || _ipad;\n }\n};\n\nmodule.exports = UserAgent_DEPRECATED;\n","/**\n * Copyright (c) 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ExecutionEnvironment\n */\n\n/*jslint evil: true */\n\n'use strict';\n\nvar canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n canUseDOM: canUseDOM,\n\n canUseWorkers: typeof Worker !== 'undefined',\n\n canUseEventListeners:\n canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n canUseViewport: canUseDOM && !!window.screen,\n\n isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isEventSupported\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n useHasFeature =\n document.implementation &&\n document.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n if (!ExecutionEnvironment.canUseDOM ||\n capture && !('addEventListener' in document)) {\n return false;\n }\n\n var eventName = 'on' + eventNameSuffix;\n var isSupported = eventName in document;\n\n if (!isSupported) {\n var element = document.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\n\nmodule.exports = isEventSupported;\n","/**\n * Copyright (c) 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule normalizeWheel\n * @typechecks\n */\n\n'use strict';\n\nvar UserAgent_DEPRECATED = require('./UserAgent_DEPRECATED');\n\nvar isEventSupported = require('./isEventSupported');\n\n\n// Reasonable defaults\nvar PIXEL_STEP = 10;\nvar LINE_HEIGHT = 40;\nvar PAGE_HEIGHT = 800;\n\n/**\n * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is\n * complicated, thus this doc is long and (hopefully) detailed enough to answer\n * your questions.\n *\n * If you need to react to the mouse wheel in a predictable way, this code is\n * like your bestest friend. * hugs *\n *\n * As of today, there are 4 DOM event types you can listen to:\n *\n * 'wheel' -- Chrome(31+), FF(17+), IE(9+)\n * 'mousewheel' -- Chrome, IE(6+), Opera, Safari\n * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother!\n * 'DOMMouseScroll' -- FF(0.9.7+) since 2003\n *\n * So what to do? The is the best:\n *\n * normalizeWheel.getEventType();\n *\n * In your event callback, use this code to get sane interpretation of the\n * deltas. This code will return an object with properties:\n *\n * spinX -- normalized spin speed (use for zoom) - x plane\n * spinY -- \" - y plane\n * pixelX -- normalized distance (to pixels) - x plane\n * pixelY -- \" - y plane\n *\n * Wheel values are provided by the browser assuming you are using the wheel to\n * scroll a web page by a number of lines or pixels (or pages). Values can vary\n * significantly on different platforms and browsers, forgetting that you can\n * scroll at different speeds. Some devices (like trackpads) emit more events\n * at smaller increments with fine granularity, and some emit massive jumps with\n * linear speed or acceleration.\n *\n * This code does its best to normalize the deltas for you:\n *\n * - spin is trying to normalize how far the wheel was spun (or trackpad\n * dragged). This is super useful for zoom support where you want to\n * throw away the chunky scroll steps on the PC and make those equal to\n * the slow and smooth tiny steps on the Mac. Key data: This code tries to\n * resolve a single slow step on a wheel to 1.\n *\n * - pixel is normalizing the desired scroll delta in pixel units. You'll\n * get the crazy differences between browsers, but at least it'll be in\n * pixels!\n *\n * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This\n * should translate to positive value zooming IN, negative zooming OUT.\n * This matches the newer 'wheel' event.\n *\n * Why are there spinX, spinY (or pixels)?\n *\n * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn\n * with a mouse. It results in side-scrolling in the browser by default.\n *\n * - spinY is what you expect -- it's the classic axis of a mouse wheel.\n *\n * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and\n * probably is by browsers in conjunction with fancy 3D controllers .. but\n * you know.\n *\n * Implementation info:\n *\n * Examples of 'wheel' event if you scroll slowly (down) by one step with an\n * average mouse:\n *\n * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)\n * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)\n * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)\n * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)\n * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)\n *\n * On the trackpad:\n *\n * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)\n * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)\n *\n * On other/older browsers.. it's more complicated as there can be multiple and\n * also missing delta values.\n *\n * The 'wheel' event is more standard:\n *\n * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n *\n * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and\n * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain\n * backward compatibility with older events. Those other values help us\n * better normalize spin speed. Example of what the browsers provide:\n *\n * | event.wheelDelta | event.detail\n * ------------------+------------------+--------------\n * Safari v5/OS X | -120 | 0\n * Safari v5/Win7 | -120 | 0\n * Chrome v17/OS X | -120 | 0\n * Chrome v17/Win7 | -120 | 0\n * IE9/Win7 | -120 | undefined\n * Firefox v4/OS X | undefined | 1\n * Firefox v4/Win7 | undefined | 3\n *\n */\nfunction normalizeWheel(/*object*/ event) /*object*/ {\n var sX = 0, sY = 0, // spinX, spinY\n pX = 0, pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in event) { sY = event.detail; }\n if ('wheelDelta' in event) { sY = -event.wheelDelta / 120; }\n if ('wheelDeltaY' in event) { sY = -event.wheelDeltaY / 120; }\n if ('wheelDeltaX' in event) { sX = -event.wheelDeltaX / 120; }\n\n // side scrolling on FF with DOMMouseScroll\n if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in event) { pY = event.deltaY; }\n if ('deltaX' in event) { pX = event.deltaX; }\n\n if ((pX || pY) && event.deltaMode) {\n if (event.deltaMode == 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) { sX = (pX < 1) ? -1 : 1; }\n if (pY && !sY) { sY = (pY < 1) ? -1 : 1; }\n\n return { spinX : sX,\n spinY : sY,\n pixelX : pX,\n pixelY : pY };\n}\n\n\n/**\n * The best combination if you prefer spinX + spinY normalization. It favors\n * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with\n * 'wheel' event, making spin speed determination impossible.\n */\nnormalizeWheel.getEventType = function() /*string*/ {\n return (UserAgent_DEPRECATED.firefox())\n ? 'DOMMouseScroll'\n : (isEventSupported('wheel'))\n ? 'wheel'\n : 'mousewheel';\n};\n\nmodule.exports = normalizeWheel;\n","module.exports = require('./src/normalizeWheel.js');\n","import * as React from \"react\";\nimport normalizeWheel from \"normalize-wheel\";\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/typeof.js\nfunction _typeof(o) {\n\t\"@babel/helpers - typeof\";\n\treturn _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(o) {\n\t\treturn typeof o;\n\t} : function(o) {\n\t\treturn o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n\t}, _typeof(o);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/toPrimitive.js\nfunction toPrimitive(t, r) {\n\tif (\"object\" != _typeof(t) || !t) return t;\n\tvar e = t[Symbol.toPrimitive];\n\tif (void 0 !== e) {\n\t\tvar i = e.call(t, r || \"default\");\n\t\tif (\"object\" != _typeof(i)) return i;\n\t\tthrow new TypeError(\"@@toPrimitive must return a primitive value.\");\n\t}\n\treturn (\"string\" === r ? String : Number)(t);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/toPropertyKey.js\nfunction toPropertyKey(t) {\n\tvar i = toPrimitive(t, \"string\");\n\treturn \"symbol\" == _typeof(i) ? i : i + \"\";\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/defineProperty.js\nfunction _defineProperty(e, r, t) {\n\treturn (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n\t\tvalue: t,\n\t\tenumerable: !0,\n\t\tconfigurable: !0,\n\t\twritable: !0\n\t}) : e[r] = t, e;\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.134.0/helpers/esm/objectSpread2.js\nfunction ownKeys(e, r) {\n\tvar t = Object.keys(e);\n\tif (Object.getOwnPropertySymbols) {\n\t\tvar o = Object.getOwnPropertySymbols(e);\n\t\tr && (o = o.filter(function(r) {\n\t\t\treturn Object.getOwnPropertyDescriptor(e, r).enumerable;\n\t\t})), t.push.apply(t, o);\n\t}\n\treturn t;\n}\nfunction _objectSpread2(e) {\n\tfor (var r = 1; r < arguments.length; r++) {\n\t\tvar t = null != arguments[r] ? arguments[r] : {};\n\t\tr % 2 ? ownKeys(Object(t), !0).forEach(function(r) {\n\t\t\t_defineProperty(e, r, t[r]);\n\t\t}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {\n\t\t\tObject.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n\t\t});\n\t}\n\treturn e;\n}\n//#endregion\n//#region src/helpers.ts\n/**\n* Compute the dimension of the crop area based on media size,\n* aspect ratio and optionally rotation\n*/\nfunction getCropSize(mediaWidth, mediaHeight, containerWidth, containerHeight, aspect, rotation = 0) {\n\tconst { width, height } = rotateSize(mediaWidth, mediaHeight, rotation);\n\tconst fittingWidth = Math.min(width, containerWidth);\n\tconst fittingHeight = Math.min(height, containerHeight);\n\tif (fittingWidth > fittingHeight * aspect) return {\n\t\twidth: fittingHeight * aspect,\n\t\theight: fittingHeight\n\t};\n\treturn {\n\t\twidth: fittingWidth,\n\t\theight: fittingWidth / aspect\n\t};\n}\n/**\n* Compute media zoom.\n* We fit the media into the container with \"max-width: 100%; max-height: 100%;\"\n*/\nfunction getMediaZoom(mediaSize) {\n\treturn mediaSize.width > mediaSize.height ? mediaSize.width / mediaSize.naturalWidth : mediaSize.height / mediaSize.naturalHeight;\n}\n/**\n* Ensure a new media position stays in the crop area.\n*/\nfunction restrictPosition(position, mediaSize, cropSize, zoom, rotation = 0) {\n\tconst { width, height } = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\treturn {\n\t\tx: restrictPositionCoord(position.x, width, cropSize.width, zoom),\n\t\ty: restrictPositionCoord(position.y, height, cropSize.height, zoom)\n\t};\n}\nfunction restrictPositionCoord(position, mediaSize, cropSize, zoom) {\n\tconst maxPosition = Math.abs(mediaSize * zoom / 2 - cropSize / 2);\n\treturn clamp(position, -maxPosition, maxPosition);\n}\nfunction getDistanceBetweenPoints(pointA, pointB) {\n\treturn Math.sqrt(Math.pow(pointA.y - pointB.y, 2) + Math.pow(pointA.x - pointB.x, 2));\n}\nfunction getRotationBetweenPoints(pointA, pointB) {\n\treturn Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180 / Math.PI;\n}\n/**\n* Compute the output cropped area of the media in percentages and pixels.\n* x/y are the top-left coordinates on the src media\n*/\nfunction computeCroppedArea(crop, mediaSize, cropSize, aspect, zoom, rotation = 0, restrictPosition = true) {\n\tconst limitAreaFn = restrictPosition ? limitArea : noOp;\n\tconst mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\tconst mediaNaturalBBoxSize = rotateSize(mediaSize.naturalWidth, mediaSize.naturalHeight, rotation);\n\tconst croppedAreaPercentages = {\n\t\tx: limitAreaFn(100, ((mediaBBoxSize.width - cropSize.width / zoom) / 2 - crop.x / zoom) / mediaBBoxSize.width * 100),\n\t\ty: limitAreaFn(100, ((mediaBBoxSize.height - cropSize.height / zoom) / 2 - crop.y / zoom) / mediaBBoxSize.height * 100),\n\t\twidth: limitAreaFn(100, cropSize.width / mediaBBoxSize.width * 100 / zoom),\n\t\theight: limitAreaFn(100, cropSize.height / mediaBBoxSize.height * 100 / zoom)\n\t};\n\tconst widthInPixels = Math.round(limitAreaFn(mediaNaturalBBoxSize.width, croppedAreaPercentages.width * mediaNaturalBBoxSize.width / 100));\n\tconst heightInPixels = Math.round(limitAreaFn(mediaNaturalBBoxSize.height, croppedAreaPercentages.height * mediaNaturalBBoxSize.height / 100));\n\tconst sizePixels = mediaNaturalBBoxSize.width >= mediaNaturalBBoxSize.height * aspect ? {\n\t\twidth: Math.round(heightInPixels * aspect),\n\t\theight: heightInPixels\n\t} : {\n\t\twidth: widthInPixels,\n\t\theight: Math.round(widthInPixels / aspect)\n\t};\n\treturn {\n\t\tcroppedAreaPercentages,\n\t\tcroppedAreaPixels: _objectSpread2(_objectSpread2({}, sizePixels), {}, {\n\t\t\tx: Math.round(limitAreaFn(mediaNaturalBBoxSize.width - sizePixels.width, croppedAreaPercentages.x * mediaNaturalBBoxSize.width / 100)),\n\t\t\ty: Math.round(limitAreaFn(mediaNaturalBBoxSize.height - sizePixels.height, croppedAreaPercentages.y * mediaNaturalBBoxSize.height / 100))\n\t\t})\n\t};\n}\n/**\n* Ensure the returned value is between 0 and max\n*/\nfunction limitArea(max, value) {\n\treturn Math.min(max, Math.max(0, value));\n}\nfunction noOp(_max, value) {\n\treturn value;\n}\n/**\n* Compute crop and zoom from the croppedAreaPercentages.\n*/\nfunction getInitialCropFromCroppedAreaPercentages(croppedAreaPercentages, mediaSize, rotation, cropSize, minZoom, maxZoom) {\n\tconst mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n\tconst zoom = clamp(cropSize.width / mediaBBoxSize.width * (100 / croppedAreaPercentages.width), minZoom, maxZoom);\n\treturn {\n\t\tcrop: {\n\t\t\tx: zoom * mediaBBoxSize.width / 2 - cropSize.width / 2 - mediaBBoxSize.width * zoom * (croppedAreaPercentages.x / 100),\n\t\t\ty: zoom * mediaBBoxSize.height / 2 - cropSize.height / 2 - mediaBBoxSize.height * zoom * (croppedAreaPercentages.y / 100)\n\t\t},\n\t\tzoom\n\t};\n}\n/**\n* Compute zoom from the croppedAreaPixels\n*/\nfunction getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize) {\n\tconst mediaZoom = getMediaZoom(mediaSize);\n\treturn cropSize.height > cropSize.width ? cropSize.height / (croppedAreaPixels.height * mediaZoom) : cropSize.width / (croppedAreaPixels.width * mediaZoom);\n}\n/**\n* Compute crop and zoom from the croppedAreaPixels\n*/\nfunction getInitialCropFromCroppedAreaPixels(croppedAreaPixels, mediaSize, rotation = 0, cropSize, minZoom, maxZoom) {\n\tconst mediaNaturalBBoxSize = rotateSize(mediaSize.naturalWidth, mediaSize.naturalHeight, rotation);\n\tconst zoom = clamp(getZoomFromCroppedAreaPixels(croppedAreaPixels, mediaSize, cropSize), minZoom, maxZoom);\n\tconst cropZoom = cropSize.height > cropSize.width ? cropSize.height / croppedAreaPixels.height : cropSize.width / croppedAreaPixels.width;\n\treturn {\n\t\tcrop: {\n\t\t\tx: ((mediaNaturalBBoxSize.width - croppedAreaPixels.width) / 2 - croppedAreaPixels.x) * cropZoom,\n\t\t\ty: ((mediaNaturalBBoxSize.height - croppedAreaPixels.height) / 2 - croppedAreaPixels.y) * cropZoom\n\t\t},\n\t\tzoom\n\t};\n}\n/**\n* Return the point that is the center of point a and b\n*/\nfunction getCenter(a, b) {\n\treturn {\n\t\tx: (b.x + a.x) / 2,\n\t\ty: (b.y + a.y) / 2\n\t};\n}\nfunction getRadianAngle(degreeValue) {\n\treturn degreeValue * Math.PI / 180;\n}\n/**\n* Returns the new bounding area of a rotated rectangle.\n*/\nfunction rotateSize(width, height, rotation) {\n\tconst rotRad = getRadianAngle(rotation);\n\treturn {\n\t\twidth: Math.abs(Math.cos(rotRad) * width) + Math.abs(Math.sin(rotRad) * height),\n\t\theight: Math.abs(Math.sin(rotRad) * width) + Math.abs(Math.cos(rotRad) * height)\n\t};\n}\n/**\n* Clamp value between min and max\n*/\nfunction clamp(value, min, max) {\n\treturn Math.min(Math.max(value, min), max);\n}\n/**\n* Combine multiple class names into a single string.\n*/\nfunction classNames(...args) {\n\treturn args.filter((value) => {\n\t\tif (typeof value === \"string\" && value.length > 0) return true;\n\t\treturn false;\n\t}).join(\" \").trim();\n}\n//#endregion\n//#region src/styles.css?raw\nvar styles_default = \".reactEasyCrop_Container {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n overflow: hidden;\\n user-select: none;\\n touch-action: none;\\n cursor: move;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.reactEasyCrop_Image,\\n.reactEasyCrop_Video {\\n will-change: transform; /* this improves performances and prevent painting issues on iOS Chrome */\\n max-width: unset; /* prevent global img/video reset rules from constraining the cropper media */\\n}\\n\\n.reactEasyCrop_Contain {\\n max-width: 100%;\\n max-height: 100%;\\n margin: auto;\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n}\\n.reactEasyCrop_Cover_Horizontal {\\n width: 100%;\\n height: auto;\\n}\\n.reactEasyCrop_Cover_Vertical {\\n width: auto;\\n height: 100%;\\n}\\n\\n.reactEasyCrop_CropArea {\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n transform: translate(-50%, -50%);\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n box-sizing: border-box;\\n box-shadow: 0 0 0 9999em;\\n color: rgba(0, 0, 0, 0.5);\\n overflow: hidden;\\n}\\n\\n.reactEasyCrop_CropAreaRound {\\n border-radius: 50%;\\n}\\n\\n.reactEasyCrop_CropAreaGrid::before {\\n content: ' ';\\n box-sizing: border-box;\\n position: absolute;\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n top: 0;\\n bottom: 0;\\n left: 33.33%;\\n right: 33.33%;\\n border-top: 0;\\n border-bottom: 0;\\n}\\n\\n.reactEasyCrop_CropAreaGrid::after {\\n content: ' ';\\n box-sizing: border-box;\\n position: absolute;\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n top: 33.33%;\\n bottom: 33.33%;\\n left: 0;\\n right: 0;\\n border-left: 0;\\n border-right: 0;\\n}\\n\";\n//#endregion\n//#region src/Cropper.tsx\nconst RESIZE_EMIT_DEBOUNCE_TIME = 250;\nconst MIN_ZOOM = 1;\nconst MAX_ZOOM = 3;\nconst KEYBOARD_STEP = 1;\nvar Cropper = class Cropper extends React.Component {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis.cropperRef = React.createRef();\n\t\tthis.imageRef = React.createRef();\n\t\tthis.videoRef = React.createRef();\n\t\tthis.containerPosition = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.containerRef = null;\n\t\tthis.styleRef = null;\n\t\tthis.containerRect = null;\n\t\tthis.mediaSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tnaturalWidth: 0,\n\t\t\tnaturalHeight: 0\n\t\t};\n\t\tthis.dragStartPosition = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.dragStartCrop = {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tthis.gestureZoomStart = 0;\n\t\tthis.gestureRotationStart = 0;\n\t\tthis.isTouching = false;\n\t\tthis.lastPinchDistance = 0;\n\t\tthis.lastPinchRotation = 0;\n\t\tthis.rafDragTimeout = null;\n\t\tthis.rafPinchTimeout = null;\n\t\tthis.wheelTimer = null;\n\t\tthis.resizeEmitTimer = null;\n\t\tthis.currentDoc = typeof document !== \"undefined\" ? document : null;\n\t\tthis.currentWindow = typeof window !== \"undefined\" ? window : null;\n\t\tthis.resizeObserver = null;\n\t\tthis.previousCropSize = null;\n\t\tthis.isInitialized = false;\n\t\tthis.dragInteractionSource = null;\n\t\tthis.state = {\n\t\t\tcropSize: null,\n\t\t\thasWheelJustStarted: false,\n\t\t\tmediaObjectFit: void 0\n\t\t};\n\t\tthis.initResizeObserver = () => {\n\t\t\tif (typeof window.ResizeObserver === \"undefined\" || !this.containerRef) return;\n\t\t\tlet isFirstResize = true;\n\t\t\tthis.resizeObserver = new window.ResizeObserver((entries) => {\n\t\t\t\tif (isFirstResize) {\n\t\t\t\t\tisFirstResize = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.computeSizes({ isResizeTriggered: true });\n\t\t\t});\n\t\t\tthis.resizeObserver.observe(this.containerRef);\n\t\t};\n\t\tthis.onWindowResize = () => {\n\t\t\tthis.computeSizes({ isResizeTriggered: true });\n\t\t};\n\t\tthis.preventZoomSafari = (e) => e.preventDefault();\n\t\tthis.cleanEvents = () => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\tthis.currentDoc.removeEventListener(\"mousemove\", this.onMouseMove);\n\t\t\tthis.currentDoc.removeEventListener(\"mouseup\", this.onDragStopped);\n\t\t\tthis.currentDoc.removeEventListener(\"touchmove\", this.onTouchMove);\n\t\t\tthis.currentDoc.removeEventListener(\"touchend\", this.onDragStopped);\n\t\t\tthis.currentDoc.removeEventListener(\"gesturechange\", this.onGestureChange);\n\t\t\tthis.currentDoc.removeEventListener(\"gestureend\", this.onGestureEnd);\n\t\t\tthis.currentDoc.removeEventListener(\"scroll\", this.onScroll);\n\t\t};\n\t\tthis.clearScrollEvent = () => {\n\t\t\tif (this.containerRef) this.containerRef.removeEventListener(\"wheel\", this.onWheel);\n\t\t\tif (this.wheelTimer) clearTimeout(this.wheelTimer);\n\t\t};\n\t\tthis.onMediaLoad = () => {\n\t\t\tconst cropSize = this.computeSizes();\n\t\t\tif (cropSize) {\n\t\t\t\tthis.previousCropSize = cropSize;\n\t\t\t\tthis.emitCropData();\n\t\t\t\tthis.setInitialCrop(cropSize);\n\t\t\t\tthis.isInitialized = true;\n\t\t\t}\n\t\t\tif (this.props.onMediaLoaded) this.props.onMediaLoaded(this.mediaSize);\n\t\t};\n\t\tthis.setInitialCrop = (cropSize) => {\n\t\t\tif (this.props.initialCroppedAreaPercentages) {\n\t\t\t\tconst { crop, zoom } = getInitialCropFromCroppedAreaPercentages(this.props.initialCroppedAreaPercentages, this.mediaSize, this.props.rotation, cropSize, this.props.minZoom, this.props.maxZoom);\n\t\t\t\tthis.props.onCropChange(crop);\n\t\t\t\tthis.props.onZoomChange && this.props.onZoomChange(zoom);\n\t\t\t} else if (this.props.initialCroppedAreaPixels) {\n\t\t\t\tconst { crop, zoom } = getInitialCropFromCroppedAreaPixels(this.props.initialCroppedAreaPixels, this.mediaSize, this.props.rotation, cropSize, this.props.minZoom, this.props.maxZoom);\n\t\t\t\tthis.props.onCropChange(crop);\n\t\t\t\tthis.props.onZoomChange && this.props.onZoomChange(zoom);\n\t\t\t}\n\t\t};\n\t\tthis.computeSizes = ({ isResizeTriggered = false } = {}) => {\n\t\t\tconst mediaRef = this.imageRef.current || this.videoRef.current;\n\t\t\tif (mediaRef && this.containerRef) {\n\t\t\t\tvar _this$imageRef$curren, _this$videoRef$curren, _this$imageRef$curren2, _this$videoRef$curren2, _this$state$cropSize, _this$state$cropSize2;\n\t\t\t\tthis.containerRect = this.containerRef.getBoundingClientRect();\n\t\t\t\tthis.saveContainerPosition();\n\t\t\t\tconst containerAspect = this.containerRect.width / this.containerRect.height;\n\t\t\t\tconst naturalWidth = ((_this$imageRef$curren = this.imageRef.current) === null || _this$imageRef$curren === void 0 ? void 0 : _this$imageRef$curren.naturalWidth) || ((_this$videoRef$curren = this.videoRef.current) === null || _this$videoRef$curren === void 0 ? void 0 : _this$videoRef$curren.videoWidth) || 0;\n\t\t\t\tconst naturalHeight = ((_this$imageRef$curren2 = this.imageRef.current) === null || _this$imageRef$curren2 === void 0 ? void 0 : _this$imageRef$curren2.naturalHeight) || ((_this$videoRef$curren2 = this.videoRef.current) === null || _this$videoRef$curren2 === void 0 ? void 0 : _this$videoRef$curren2.videoHeight) || 0;\n\t\t\t\tconst isMediaScaledDown = mediaRef.offsetWidth < naturalWidth || mediaRef.offsetHeight < naturalHeight;\n\t\t\t\tconst mediaAspect = naturalWidth / naturalHeight;\n\t\t\t\tlet renderedMediaSize;\n\t\t\t\tif (isMediaScaledDown) {\n\t\t\t\t\tvar _this$state$mediaObje;\n\t\t\t\t\tswitch ((_this$state$mediaObje = this.state.mediaObjectFit) !== null && _this$state$mediaObje !== void 0 ? _this$state$mediaObje : this.getObjectFit()) {\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\tcase \"contain\":\n\t\t\t\t\t\t\trenderedMediaSize = containerAspect > mediaAspect ? {\n\t\t\t\t\t\t\t\twidth: this.containerRect.height * mediaAspect,\n\t\t\t\t\t\t\t\theight: this.containerRect.height\n\t\t\t\t\t\t\t} : {\n\t\t\t\t\t\t\t\twidth: this.containerRect.width,\n\t\t\t\t\t\t\t\theight: this.containerRect.width / mediaAspect\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"horizontal-cover\":\n\t\t\t\t\t\t\trenderedMediaSize = {\n\t\t\t\t\t\t\t\twidth: this.containerRect.width,\n\t\t\t\t\t\t\t\theight: this.containerRect.width / mediaAspect\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"vertical-cover\":\n\t\t\t\t\t\t\trenderedMediaSize = {\n\t\t\t\t\t\t\t\twidth: this.containerRect.height * mediaAspect,\n\t\t\t\t\t\t\t\theight: this.containerRect.height\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else renderedMediaSize = {\n\t\t\t\t\twidth: mediaRef.offsetWidth,\n\t\t\t\t\theight: mediaRef.offsetHeight\n\t\t\t\t};\n\t\t\t\tthis.mediaSize = _objectSpread2(_objectSpread2({}, renderedMediaSize), {}, {\n\t\t\t\t\tnaturalWidth,\n\t\t\t\t\tnaturalHeight\n\t\t\t\t});\n\t\t\t\tif (this.props.setMediaSize) this.props.setMediaSize(this.mediaSize);\n\t\t\t\tconst cropSize = this.props.cropSize ? this.props.cropSize : getCropSize(this.mediaSize.width, this.mediaSize.height, this.containerRect.width, this.containerRect.height, this.props.aspect, this.props.rotation);\n\t\t\t\tif (((_this$state$cropSize = this.state.cropSize) === null || _this$state$cropSize === void 0 ? void 0 : _this$state$cropSize.height) !== cropSize.height || ((_this$state$cropSize2 = this.state.cropSize) === null || _this$state$cropSize2 === void 0 ? void 0 : _this$state$cropSize2.width) !== cropSize.width) this.props.onCropSizeChange && this.props.onCropSizeChange(cropSize);\n\t\t\t\tthis.setState({ cropSize }, () => this.recomputeCropPosition({ isResizeTriggered }));\n\t\t\t\tif (this.props.setCropSize) this.props.setCropSize(cropSize);\n\t\t\t\treturn cropSize;\n\t\t\t}\n\t\t};\n\t\tthis.saveContainerPosition = () => {\n\t\t\tif (this.containerRef) {\n\t\t\t\tconst bounds = this.containerRef.getBoundingClientRect();\n\t\t\t\tthis.containerPosition = {\n\t\t\t\t\tx: bounds.left,\n\t\t\t\t\ty: bounds.top\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tthis.onMouseDown = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.currentDoc.addEventListener(\"mousemove\", this.onMouseMove);\n\t\t\tthis.currentDoc.addEventListener(\"mouseup\", this.onDragStopped);\n\t\t\tthis.saveContainerPosition();\n\t\t\tthis.onDragStart(Cropper.getMousePoint(e), \"mouse\");\n\t\t};\n\t\tthis.onMouseMove = (e) => this.onDrag(Cropper.getMousePoint(e));\n\t\tthis.onScroll = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.saveContainerPosition();\n\t\t};\n\t\tthis.onTouchStart = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\tthis.isTouching = true;\n\t\t\tif (this.props.onTouchRequest && !this.props.onTouchRequest(e)) return;\n\t\t\tthis.currentDoc.addEventListener(\"touchmove\", this.onTouchMove, { passive: false });\n\t\t\tthis.currentDoc.addEventListener(\"touchend\", this.onDragStopped);\n\t\t\tthis.saveContainerPosition();\n\t\t\tif (e.touches.length === 2) this.onPinchStart(e);\n\t\t\telse if (e.touches.length === 1) this.onDragStart(Cropper.getTouchPoint(e.touches[0]), \"touch\");\n\t\t};\n\t\tthis.onTouchMove = (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (e.touches.length === 2) this.onPinchMove(e);\n\t\t\telse if (e.touches.length === 1) this.onDrag(Cropper.getTouchPoint(e.touches[0]));\n\t\t};\n\t\tthis.onGestureStart = (e) => {\n\t\t\tif (!this.currentDoc) return;\n\t\t\te.preventDefault();\n\t\t\tthis.currentDoc.addEventListener(\"gesturechange\", this.onGestureChange);\n\t\t\tthis.currentDoc.addEventListener(\"gestureend\", this.onGestureEnd);\n\t\t\tthis.gestureZoomStart = this.props.zoom;\n\t\t\tthis.gestureRotationStart = this.props.rotation;\n\t\t};\n\t\tthis.onGestureChange = (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this.isTouching) return;\n\t\t\tconst point = Cropper.getMousePoint(e);\n\t\t\tconst newZoom = this.gestureZoomStart - 1 + e.scale;\n\t\t\tthis.setNewZoom(newZoom, point, { shouldUpdatePosition: true });\n\t\t\tif (this.props.onRotationChange) {\n\t\t\t\tconst newRotation = this.gestureRotationStart + e.rotation;\n\t\t\t\tthis.props.onRotationChange(newRotation);\n\t\t\t}\n\t\t};\n\t\tthis.onGestureEnd = (e) => {\n\t\t\tthis.cleanEvents();\n\t\t};\n\t\tthis.onDragStart = ({ x, y }, source) => {\n\t\t\tvar _this$props$onInterac, _this$props;\n\t\t\tthis.dragStartPosition = {\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t};\n\t\t\tthis.dragStartCrop = _objectSpread2({}, this.props.crop);\n\t\t\tthis.dragInteractionSource = source;\n\t\t\t(_this$props$onInterac = (_this$props = this.props).onInteractionStart) === null || _this$props$onInterac === void 0 || _this$props$onInterac.call(_this$props, { source });\n\t\t};\n\t\tthis.onDrag = ({ x, y }) => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.rafDragTimeout) this.currentWindow.cancelAnimationFrame(this.rafDragTimeout);\n\t\t\tthis.rafDragTimeout = this.currentWindow.requestAnimationFrame(() => {\n\t\t\t\tif (!this.state.cropSize) return;\n\t\t\t\tif (x === void 0 || y === void 0) return;\n\t\t\t\tconst offsetX = x - this.dragStartPosition.x;\n\t\t\t\tconst offsetY = y - this.dragStartPosition.y;\n\t\t\t\tconst requestedPosition = {\n\t\t\t\t\tx: this.dragStartCrop.x + offsetX,\n\t\t\t\t\ty: this.dragStartCrop.y + offsetY\n\t\t\t\t};\n\t\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(requestedPosition, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : requestedPosition;\n\t\t\t\tthis.props.onCropChange(newPosition);\n\t\t\t});\n\t\t};\n\t\tthis.onDragStopped = () => {\n\t\t\tvar _this$props$onInterac2, _this$props2, _this$dragInteraction;\n\t\t\tthis.isTouching = false;\n\t\t\tthis.cleanEvents();\n\t\t\tthis.emitCropData();\n\t\t\t(_this$props$onInterac2 = (_this$props2 = this.props).onInteractionEnd) === null || _this$props$onInterac2 === void 0 || _this$props$onInterac2.call(_this$props2, { source: (_this$dragInteraction = this.dragInteractionSource) !== null && _this$dragInteraction !== void 0 ? _this$dragInteraction : \"mouse\" });\n\t\t\tthis.dragInteractionSource = null;\n\t\t};\n\t\tthis.onWheel = (e) => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.props.onWheelRequest && !this.props.onWheelRequest(e)) return;\n\t\t\te.preventDefault();\n\t\t\tconst point = Cropper.getMousePoint(e);\n\t\t\tconst { pixelY } = normalizeWheel(e);\n\t\t\tconst newZoom = this.props.zoom - pixelY * this.props.zoomSpeed / 200;\n\t\t\tthis.setNewZoom(newZoom, point, { shouldUpdatePosition: true });\n\t\t\tif (!this.state.hasWheelJustStarted) this.setState({ hasWheelJustStarted: true }, () => {\n\t\t\t\tvar _this$props$onInterac3, _this$props3;\n\t\t\t\treturn (_this$props$onInterac3 = (_this$props3 = this.props).onInteractionStart) === null || _this$props$onInterac3 === void 0 ? void 0 : _this$props$onInterac3.call(_this$props3, { source: \"wheel\" });\n\t\t\t});\n\t\t\tif (this.wheelTimer) clearTimeout(this.wheelTimer);\n\t\t\tthis.wheelTimer = this.currentWindow.setTimeout(() => this.setState({ hasWheelJustStarted: false }, () => {\n\t\t\t\tvar _this$props$onInterac4, _this$props4;\n\t\t\t\treturn (_this$props$onInterac4 = (_this$props4 = this.props).onInteractionEnd) === null || _this$props$onInterac4 === void 0 ? void 0 : _this$props$onInterac4.call(_this$props4, { source: \"wheel\" });\n\t\t\t}), 250);\n\t\t};\n\t\tthis.getPointOnContainer = ({ x, y }, containerTopLeft) => {\n\t\t\tif (!this.containerRect) throw new Error(\"The Cropper is not mounted\");\n\t\t\treturn {\n\t\t\t\tx: this.containerRect.width / 2 - (x - containerTopLeft.x),\n\t\t\t\ty: this.containerRect.height / 2 - (y - containerTopLeft.y)\n\t\t\t};\n\t\t};\n\t\tthis.getPointOnMedia = ({ x, y }) => {\n\t\t\tconst { crop, zoom } = this.props;\n\t\t\treturn {\n\t\t\t\tx: (x + crop.x) / zoom,\n\t\t\t\ty: (y + crop.y) / zoom\n\t\t\t};\n\t\t};\n\t\tthis.setNewZoom = (zoom, point, { shouldUpdatePosition = true } = {}) => {\n\t\t\tif (!this.state.cropSize || !this.props.onZoomChange) return;\n\t\t\tconst newZoom = clamp(zoom, this.props.minZoom, this.props.maxZoom);\n\t\t\tif (shouldUpdatePosition) {\n\t\t\t\tconst zoomPoint = this.getPointOnContainer(point, this.containerPosition);\n\t\t\t\tconst zoomTarget = this.getPointOnMedia(zoomPoint);\n\t\t\t\tconst requestedPosition = {\n\t\t\t\t\tx: zoomTarget.x * newZoom - zoomPoint.x,\n\t\t\t\t\ty: zoomTarget.y * newZoom - zoomPoint.y\n\t\t\t\t};\n\t\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(requestedPosition, this.mediaSize, this.state.cropSize, newZoom, this.props.rotation) : requestedPosition;\n\t\t\t\tthis.props.onCropChange(newPosition);\n\t\t\t}\n\t\t\tthis.props.onZoomChange(newZoom);\n\t\t};\n\t\tthis.getCropData = () => {\n\t\t\tif (!this.state.cropSize) return null;\n\t\t\treturn computeCroppedArea(this.props.restrictPosition ? restrictPosition(this.props.crop, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : this.props.crop, this.mediaSize, this.state.cropSize, this.getAspect(), this.props.zoom, this.props.rotation, this.props.restrictPosition);\n\t\t};\n\t\tthis.emitCropData = () => {\n\t\t\tif (this.resizeEmitTimer) {\n\t\t\t\tclearTimeout(this.resizeEmitTimer);\n\t\t\t\tthis.resizeEmitTimer = null;\n\t\t\t}\n\t\t\tconst cropData = this.getCropData();\n\t\t\tif (!cropData) return;\n\t\t\tconst { croppedAreaPercentages, croppedAreaPixels } = cropData;\n\t\t\tif (this.props.onCropComplete) this.props.onCropComplete(croppedAreaPercentages, croppedAreaPixels);\n\t\t\tif (this.props.onCropAreaChange) this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n\t\t};\n\t\tthis.emitCropAreaChange = () => {\n\t\t\tconst cropData = this.getCropData();\n\t\t\tif (!cropData) return;\n\t\t\tconst { croppedAreaPercentages, croppedAreaPixels } = cropData;\n\t\t\tif (this.props.onCropAreaChange) this.props.onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n\t\t};\n\t\tthis.recomputeCropPosition = ({ isResizeTriggered = false } = {}) => {\n\t\t\tvar _this$previousCropSiz, _this$previousCropSiz2;\n\t\t\tif (!this.state.cropSize) return;\n\t\t\tlet adjustedCrop = this.props.crop;\n\t\t\tif (this.isInitialized && ((_this$previousCropSiz = this.previousCropSize) === null || _this$previousCropSiz === void 0 ? void 0 : _this$previousCropSiz.width) && ((_this$previousCropSiz2 = this.previousCropSize) === null || _this$previousCropSiz2 === void 0 ? void 0 : _this$previousCropSiz2.height)) {\n\t\t\t\tif (Math.abs(this.previousCropSize.width - this.state.cropSize.width) > 1e-6 || Math.abs(this.previousCropSize.height - this.state.cropSize.height) > 1e-6) {\n\t\t\t\t\tconst scaleX = this.state.cropSize.width / this.previousCropSize.width;\n\t\t\t\t\tconst scaleY = this.state.cropSize.height / this.previousCropSize.height;\n\t\t\t\t\tadjustedCrop = {\n\t\t\t\t\t\tx: this.props.crop.x * scaleX,\n\t\t\t\t\t\ty: this.props.crop.y * scaleY\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst newPosition = this.props.restrictPosition ? restrictPosition(adjustedCrop, this.mediaSize, this.state.cropSize, this.props.zoom, this.props.rotation) : adjustedCrop;\n\t\t\tthis.previousCropSize = this.state.cropSize;\n\t\t\tthis.props.onCropChange(newPosition);\n\t\t\tif (isResizeTriggered) this.debouncedEmitCropData();\n\t\t\telse this.emitCropData();\n\t\t};\n\t\tthis.debouncedEmitCropData = () => {\n\t\t\tif (!this.currentWindow) return;\n\t\t\tif (this.resizeEmitTimer) clearTimeout(this.resizeEmitTimer);\n\t\t\tthis.resizeEmitTimer = this.currentWindow.setTimeout(() => {\n\t\t\t\tthis.emitCropData();\n\t\t\t}, RESIZE_EMIT_DEBOUNCE_TIME);\n\t\t};\n\t\tthis.onKeyDown = (event) => {\n\t\t\tconst { crop, onCropChange, keyboardStep, zoom, rotation } = this.props;\n\t\t\tlet step = keyboardStep;\n\t\t\tif (!this.state.cropSize) return;\n\t\t\tif (event.shiftKey) step *= .2;\n\t\t\tlet newCrop = _objectSpread2({}, crop);\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tnewCrop.y -= step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tnewCrop.y += step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\tnewCrop.x -= step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tnewCrop.x += step;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: return;\n\t\t\t}\n\t\t\tif (this.props.restrictPosition) newCrop = restrictPosition(newCrop, this.mediaSize, this.state.cropSize, zoom, rotation);\n\t\t\tif (!event.repeat) {\n\t\t\t\tvar _this$props$onInterac5, _this$props5;\n\t\t\t\t(_this$props$onInterac5 = (_this$props5 = this.props).onInteractionStart) === null || _this$props$onInterac5 === void 0 || _this$props$onInterac5.call(_this$props5, { source: \"keyboard\" });\n\t\t\t}\n\t\t\tonCropChange(newCrop);\n\t\t};\n\t\tthis.onKeyUp = (event) => {\n\t\t\tvar _this$props$onInterac6, _this$props6;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: return;\n\t\t\t}\n\t\t\tthis.emitCropData();\n\t\t\t(_this$props$onInterac6 = (_this$props6 = this.props).onInteractionEnd) === null || _this$props$onInterac6 === void 0 || _this$props$onInterac6.call(_this$props6, { source: \"keyboard\" });\n\t\t};\n\t}\n\tcomponentDidMount() {\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tif (this.containerRef) {\n\t\t\tif (this.containerRef.ownerDocument) this.currentDoc = this.containerRef.ownerDocument;\n\t\t\tif (this.currentDoc.defaultView) this.currentWindow = this.currentDoc.defaultView;\n\t\t\tthis.initResizeObserver();\n\t\t\tif (typeof window.ResizeObserver === \"undefined\") this.currentWindow.addEventListener(\"resize\", this.onWindowResize);\n\t\t\tthis.props.zoomWithScroll && this.containerRef.addEventListener(\"wheel\", this.onWheel, { passive: false });\n\t\t\tthis.containerRef.addEventListener(\"gesturestart\", this.onGestureStart);\n\t\t}\n\t\tthis.currentDoc.addEventListener(\"scroll\", this.onScroll);\n\t\tif (!this.props.disableAutomaticStylesInjection) {\n\t\t\tthis.styleRef = this.currentDoc.createElement(\"style\");\n\t\t\tthis.styleRef.setAttribute(\"type\", \"text/css\");\n\t\t\tif (this.props.nonce) this.styleRef.setAttribute(\"nonce\", this.props.nonce);\n\t\t\tthis.styleRef.innerHTML = styles_default;\n\t\t\tthis.currentDoc.head.appendChild(this.styleRef);\n\t\t}\n\t\tif (this.imageRef.current && this.imageRef.current.complete) this.onMediaLoad();\n\t\tif (this.props.setImageRef) this.props.setImageRef(this.imageRef);\n\t\tif (this.props.setVideoRef) this.props.setVideoRef(this.videoRef);\n\t\tif (this.props.setCropperRef) this.props.setCropperRef(this.cropperRef);\n\t}\n\tcomponentWillUnmount() {\n\t\tvar _this$resizeObserver;\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tif (typeof window.ResizeObserver === \"undefined\") this.currentWindow.removeEventListener(\"resize\", this.onWindowResize);\n\t\t(_this$resizeObserver = this.resizeObserver) === null || _this$resizeObserver === void 0 || _this$resizeObserver.disconnect();\n\t\tif (this.resizeEmitTimer) clearTimeout(this.resizeEmitTimer);\n\t\tif (this.containerRef) this.containerRef.removeEventListener(\"gesturestart\", this.preventZoomSafari);\n\t\tif (this.styleRef) {\n\t\t\tvar _this$styleRef$parent;\n\t\t\t(_this$styleRef$parent = this.styleRef.parentNode) === null || _this$styleRef$parent === void 0 || _this$styleRef$parent.removeChild(this.styleRef);\n\t\t}\n\t\tthis.cleanEvents();\n\t\tthis.props.zoomWithScroll && this.clearScrollEvent();\n\t}\n\tcomponentDidUpdate(prevProps) {\n\t\tvar _prevProps$cropSize, _this$props$cropSize, _prevProps$cropSize2, _this$props$cropSize2, _prevProps$crop, _this$props$crop, _prevProps$crop2, _this$props$crop2;\n\t\tif (prevProps.rotation !== this.props.rotation) {\n\t\t\tthis.computeSizes();\n\t\t\tthis.recomputeCropPosition();\n\t\t} else if (prevProps.aspect !== this.props.aspect) this.computeSizes();\n\t\telse if (prevProps.objectFit !== this.props.objectFit) this.computeSizes();\n\t\telse if (prevProps.zoom !== this.props.zoom) this.recomputeCropPosition();\n\t\telse if (((_prevProps$cropSize = prevProps.cropSize) === null || _prevProps$cropSize === void 0 ? void 0 : _prevProps$cropSize.height) !== ((_this$props$cropSize = this.props.cropSize) === null || _this$props$cropSize === void 0 ? void 0 : _this$props$cropSize.height) || ((_prevProps$cropSize2 = prevProps.cropSize) === null || _prevProps$cropSize2 === void 0 ? void 0 : _prevProps$cropSize2.width) !== ((_this$props$cropSize2 = this.props.cropSize) === null || _this$props$cropSize2 === void 0 ? void 0 : _this$props$cropSize2.width)) this.computeSizes();\n\t\telse if (((_prevProps$crop = prevProps.crop) === null || _prevProps$crop === void 0 ? void 0 : _prevProps$crop.x) !== ((_this$props$crop = this.props.crop) === null || _this$props$crop === void 0 ? void 0 : _this$props$crop.x) || ((_prevProps$crop2 = prevProps.crop) === null || _prevProps$crop2 === void 0 ? void 0 : _prevProps$crop2.y) !== ((_this$props$crop2 = this.props.crop) === null || _this$props$crop2 === void 0 ? void 0 : _this$props$crop2.y)) this.emitCropAreaChange();\n\t\tif (prevProps.zoomWithScroll !== this.props.zoomWithScroll && this.containerRef) this.props.zoomWithScroll ? this.containerRef.addEventListener(\"wheel\", this.onWheel, { passive: false }) : this.clearScrollEvent();\n\t\tif (prevProps.video !== this.props.video) {\n\t\t\tvar _this$videoRef$curren3;\n\t\t\t(_this$videoRef$curren3 = this.videoRef.current) === null || _this$videoRef$curren3 === void 0 || _this$videoRef$curren3.load();\n\t\t}\n\t\tconst objectFit = this.getObjectFit();\n\t\tif (objectFit !== this.state.mediaObjectFit) this.setState({ mediaObjectFit: objectFit }, this.computeSizes);\n\t}\n\tgetAspect() {\n\t\tconst { cropSize, aspect } = this.props;\n\t\tif (cropSize) return cropSize.width / cropSize.height;\n\t\treturn aspect;\n\t}\n\tgetObjectFit() {\n\t\tif (this.props.objectFit === \"cover\") {\n\t\t\tif ((this.imageRef.current || this.videoRef.current) && this.containerRef) {\n\t\t\t\tvar _this$imageRef$curren3, _this$videoRef$curren4, _this$imageRef$curren4, _this$videoRef$curren5;\n\t\t\t\tthis.containerRect = this.containerRef.getBoundingClientRect();\n\t\t\t\tconst containerAspect = this.containerRect.width / this.containerRect.height;\n\t\t\t\treturn (((_this$imageRef$curren3 = this.imageRef.current) === null || _this$imageRef$curren3 === void 0 ? void 0 : _this$imageRef$curren3.naturalWidth) || ((_this$videoRef$curren4 = this.videoRef.current) === null || _this$videoRef$curren4 === void 0 ? void 0 : _this$videoRef$curren4.videoWidth) || 0) / (((_this$imageRef$curren4 = this.imageRef.current) === null || _this$imageRef$curren4 === void 0 ? void 0 : _this$imageRef$curren4.naturalHeight) || ((_this$videoRef$curren5 = this.videoRef.current) === null || _this$videoRef$curren5 === void 0 ? void 0 : _this$videoRef$curren5.videoHeight) || 0) < containerAspect ? \"horizontal-cover\" : \"vertical-cover\";\n\t\t\t}\n\t\t\treturn \"horizontal-cover\";\n\t\t}\n\t\treturn this.props.objectFit;\n\t}\n\tonPinchStart(e) {\n\t\tconst pointA = Cropper.getTouchPoint(e.touches[0]);\n\t\tconst pointB = Cropper.getTouchPoint(e.touches[1]);\n\t\tthis.lastPinchDistance = getDistanceBetweenPoints(pointA, pointB);\n\t\tthis.lastPinchRotation = getRotationBetweenPoints(pointA, pointB);\n\t\tthis.onDragStart(getCenter(pointA, pointB), \"touch\");\n\t}\n\tonPinchMove(e) {\n\t\tif (!this.currentDoc || !this.currentWindow) return;\n\t\tconst pointA = Cropper.getTouchPoint(e.touches[0]);\n\t\tconst pointB = Cropper.getTouchPoint(e.touches[1]);\n\t\tconst center = getCenter(pointA, pointB);\n\t\tthis.onDrag(center);\n\t\tif (this.rafPinchTimeout) this.currentWindow.cancelAnimationFrame(this.rafPinchTimeout);\n\t\tthis.rafPinchTimeout = this.currentWindow.requestAnimationFrame(() => {\n\t\t\tconst distance = getDistanceBetweenPoints(pointA, pointB);\n\t\t\tconst newZoom = this.props.zoom * (distance / this.lastPinchDistance);\n\t\t\tthis.setNewZoom(newZoom, center, { shouldUpdatePosition: false });\n\t\t\tthis.lastPinchDistance = distance;\n\t\t\tconst rotation = getRotationBetweenPoints(pointA, pointB);\n\t\t\tconst newRotation = this.props.rotation + (rotation - this.lastPinchRotation);\n\t\t\tthis.props.onRotationChange && this.props.onRotationChange(newRotation);\n\t\t\tthis.lastPinchRotation = rotation;\n\t\t});\n\t}\n\trender() {\n\t\tvar _this$state$mediaObje2;\n\t\tconst { image, video, mediaProps, cropperProps, transform, crop: { x, y }, rotation, zoom, cropShape, showGrid, roundCropAreaPixels, style: { containerStyle, cropAreaStyle, mediaStyle }, classes: { containerClassName, cropAreaClassName, mediaClassName } } = this.props;\n\t\tconst objectFit = (_this$state$mediaObje2 = this.state.mediaObjectFit) !== null && _this$state$mediaObje2 !== void 0 ? _this$state$mediaObje2 : this.getObjectFit();\n\t\treturn /* @__PURE__ */ React.createElement(\"div\", {\n\t\t\tonMouseDown: this.onMouseDown,\n\t\t\tonTouchStart: this.onTouchStart,\n\t\t\tref: (el) => this.containerRef = el,\n\t\t\t\"data-testid\": \"container\",\n\t\t\tstyle: containerStyle,\n\t\t\tclassName: classNames(\"reactEasyCrop_Container\", containerClassName)\n\t\t}, image ? /* @__PURE__ */ React.createElement(\"img\", _objectSpread2(_objectSpread2({\n\t\t\talt: \"\",\n\t\t\tclassName: classNames(\"reactEasyCrop_Image\", objectFit === \"contain\" && \"reactEasyCrop_Contain\", objectFit === \"horizontal-cover\" && \"reactEasyCrop_Cover_Horizontal\", objectFit === \"vertical-cover\" && \"reactEasyCrop_Cover_Vertical\", mediaClassName)\n\t\t}, mediaProps), {}, {\n\t\t\tsrc: image,\n\t\t\tref: this.imageRef,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, mediaStyle), {}, { transform: transform || `translate(${x}px, ${y}px) rotate(${rotation}deg) scale(${zoom})` }),\n\t\t\tonLoad: this.onMediaLoad\n\t\t})) : video && /* @__PURE__ */ React.createElement(\"video\", _objectSpread2(_objectSpread2({\n\t\t\tautoPlay: true,\n\t\t\tplaysInline: true,\n\t\t\tloop: true,\n\t\t\tmuted: true,\n\t\t\tclassName: classNames(\"reactEasyCrop_Video\", objectFit === \"contain\" && \"reactEasyCrop_Contain\", objectFit === \"horizontal-cover\" && \"reactEasyCrop_Cover_Horizontal\", objectFit === \"vertical-cover\" && \"reactEasyCrop_Cover_Vertical\", mediaClassName)\n\t\t}, mediaProps), {}, {\n\t\t\tref: this.videoRef,\n\t\t\tonLoadedMetadata: this.onMediaLoad,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, mediaStyle), {}, { transform: transform || `translate(${x}px, ${y}px) rotate(${rotation}deg) scale(${zoom})` }),\n\t\t\tcontrols: false\n\t\t}), (Array.isArray(video) ? video : [{ src: video }]).map((item) => /* @__PURE__ */ React.createElement(\"source\", _objectSpread2({ key: item.src }, item)))), this.state.cropSize && /* @__PURE__ */ React.createElement(\"div\", _objectSpread2({\n\t\t\tref: this.cropperRef,\n\t\t\tstyle: _objectSpread2(_objectSpread2({}, cropAreaStyle), {}, {\n\t\t\t\twidth: roundCropAreaPixels ? Math.round(this.state.cropSize.width) : this.state.cropSize.width,\n\t\t\t\theight: roundCropAreaPixels ? Math.round(this.state.cropSize.height) : this.state.cropSize.height\n\t\t\t}),\n\t\t\ttabIndex: 0,\n\t\t\tonKeyDown: this.onKeyDown,\n\t\t\tonKeyUp: this.onKeyUp,\n\t\t\t\"data-testid\": \"cropper\",\n\t\t\tclassName: classNames(\"reactEasyCrop_CropArea\", cropShape === \"round\" && \"reactEasyCrop_CropAreaRound\", showGrid && \"reactEasyCrop_CropAreaGrid\", cropAreaClassName)\n\t\t}, cropperProps)));\n\t}\n};\nCropper.defaultProps = {\n\tzoom: 1,\n\trotation: 0,\n\taspect: 4 / 3,\n\tmaxZoom: MAX_ZOOM,\n\tminZoom: MIN_ZOOM,\n\tcropShape: \"rect\",\n\tobjectFit: \"contain\",\n\tshowGrid: true,\n\tstyle: {},\n\tclasses: {},\n\tmediaProps: {},\n\tcropperProps: {},\n\tzoomSpeed: 1,\n\trestrictPosition: true,\n\tzoomWithScroll: true,\n\tkeyboardStep: KEYBOARD_STEP\n};\nCropper.getMousePoint = (e) => ({\n\tx: Number(e.clientX),\n\ty: Number(e.clientY)\n});\nCropper.getTouchPoint = (touch) => ({\n\tx: Number(touch.clientX),\n\ty: Number(touch.clientY)\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Cropper;\n//#endregion\nexport { src_default as default, getInitialCropFromCroppedAreaPercentages, getInitialCropFromCroppedAreaPixels };\n\n//# sourceMappingURL=index.module.mjs.map","import type { Area } from \"react-easy-crop\";\n\nexport async function getCroppedFile(\n imageSrc: string,\n pixelCrop: Area,\n originalFileName: string,\n): Promise<File> {\n const image = await loadImage(imageSrc);\n const canvas = document.createElement(\"canvas\");\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Could not get 2d canvas context\");\n\n ctx.drawImage(\n image,\n pixelCrop.x,\n pixelCrop.y,\n pixelCrop.width,\n pixelCrop.height,\n 0,\n 0,\n pixelCrop.width,\n pixelCrop.height,\n );\n\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error(\"canvas.toBlob produced no output\"));\n return;\n }\n const ext =\n originalFileName.substring(originalFileName.lastIndexOf(\".\")) || \".jpg\";\n resolve(new File([blob], `cropped${ext}`, { type: \"image/jpeg\" }));\n }, \"image/jpeg\");\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.addEventListener(\"load\", () => resolve(img));\n img.addEventListener(\"error\", reject);\n img.src = src;\n });\n}\n","import React, { useCallback, useState } from \"react\";\n// react-easy-crop's .d.ts uses `export type *` which Node moduleResolution\n// can't resolve as a value. Cast to any here — we own all props passed below.\nimport EasyCrop from \"react-easy-crop\";\nimport type { Area, Point } from \"react-easy-crop\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Cropper = EasyCrop as unknown as React.ComponentType<any>;\n\nimport { Modal } from \"../Modal/Modal\";\nimport { getCroppedFile } from \"./cropImage\";\n\nexport interface ImageCropModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Object URL of the image to crop (created with URL.createObjectURL) */\n imageSrc: string;\n /** Original file name — used to derive the extension of the cropped file */\n originalFileName: string;\n /**\n * Locked aspect ratio for the crop area.\n * Pass 1 for 1:1 (profile photos), 3 for 3:1 (banners), 4/3, etc.\n * Defaults to 1 (square).\n */\n aspectRatio?: number;\n /** Called when the user cancels or closes the modal */\n onClose: () => void;\n /**\n * Called with the cropped File after the user confirms.\n * The File is a JPEG produced from the selected crop region.\n */\n onCropComplete: (croppedFile: File) => void;\n // ── Label props (pass translated strings from the consuming app) ──\n title?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n zoomLabel?: string;\n}\n\nexport const ImageCropModal: React.FC<ImageCropModalProps> = ({\n isOpen,\n imageSrc,\n originalFileName,\n aspectRatio = 1,\n onClose,\n onCropComplete,\n title = \"Crop image\",\n confirmLabel = \"Crop & Upload\",\n cancelLabel = \"Cancel\",\n zoomLabel = \"Zoom\",\n}) => {\n const [crop, setCrop] = useState<Point>({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n const [isCropping, setIsCropping] = useState(false);\n\n const handleCropComplete = useCallback((_: Area, pixels: Area) => {\n setCroppedAreaPixels(pixels);\n }, []);\n\n const handleConfirm = async () => {\n if (!croppedAreaPixels) return;\n setIsCropping(true);\n try {\n const file = await getCroppedFile(imageSrc, croppedAreaPixels, originalFileName);\n onCropComplete(file);\n } finally {\n setIsCropping(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size=\"lg\"\n primaryAction={confirmLabel}\n secondaryAction={cancelLabel}\n onPrimaryAction={handleConfirm}\n onSecondaryAction={onClose}\n isLoading={isCropping}\n closeOnOverlayClick={false}\n >\n <div className=\"relative h-80 w-full bg-gray-900\">\n <Cropper\n image={imageSrc}\n crop={crop}\n zoom={zoom}\n aspect={aspectRatio}\n onCropChange={setCrop}\n onZoomChange={setZoom}\n onCropComplete={handleCropComplete}\n />\n </div>\n <div className=\"mt-4 px-1\">\n <label className=\"mb-1 block text-sm text-gray-500\">{zoomLabel}</label>\n <input\n type=\"range\"\n min={1}\n max={3}\n step={0.05}\n value={zoom}\n onChange={(e) => setZoom(Number(e.target.value))}\n className=\"w-full accent-ews-primary\"\n />\n </div>\n </Modal>\n );\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { Control, Controller, FieldValues, Path } from \"react-hook-form\";\nimport { cn } from \"../../utils\";\nimport { Input } from \"../Input\";\n\nexport interface DropdownMultiSelectProps<T extends FieldValues, TValue> {\n options: { value: TValue; label: string }[];\n name: Path<T>;\n control?: Control<T>;\n placeholder?: string;\n onChange?: (value: TValue[]) => void;\n value?: TValue[];\n defaultValue?: TValue[];\n onValidate?: (value: TValue[]) => boolean;\n disabled?: boolean;\n error?: string;\n label?: string;\n className?: string;\n searchPlaceholder?: string;\n}\n\nconst DropdownMultiSelect = <\n T extends FieldValues,\n TValue extends string | number | object\n>({\n options,\n name,\n control,\n placeholder = \"Select options\",\n searchPlaceholder = \"Search...\",\n onChange,\n value: controlledValue,\n defaultValue,\n onValidate,\n disabled = false,\n error,\n label,\n className,\n}: DropdownMultiSelectProps<T, TValue>) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [uncontrolledValue, setUncontrolledValue] = useState<\n TValue[] | undefined\n >(defaultValue);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm(\"\");\n }\n };\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const removeAccents = (str: string) =>\n str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/ç/g, \"c\")\n .replace(/é|è|ê|ë/g, \"e\")\n .replace(/à|á|â|ã|ä/g, \"a\")\n .replace(/î|ï/g, \"i\")\n .replace(/ô|ö/g, \"o\")\n .replace(/ù|ú|û|ü/g, \"u\");\n\n const getDisplayValue = (value: TValue) => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n return options.find((opt) => opt.value === value)?.label || \"\";\n };\n\n const filteredOptions = options.filter((option) =>\n removeAccents(option.label.toLowerCase()).includes(\n removeAccents(searchTerm.toLowerCase())\n )\n );\n\n const renderDropdown = ({\n value = [] as TValue[],\n onChange: fieldOnChange,\n }: {\n value: TValue[] | undefined;\n onChange: (value: TValue[]) => void;\n }) => (\n <div className={cn(\"relative\", className)} ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={name}\n disabled={disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md border border-ews-gray-300 bg-white px-3 py-2 text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-0 disabled:bg-ews-gray-50 disabled:text-ews-gray-500\",\n isOpen ? \"rounded-b-none border-b-0\" : \"rounded-md\",\n error && \"border-ews-error focus:ring-ews-error\"\n )}\n >\n <span className={cn(\"truncate\", !value?.length && \"text-ews-gray-500\")}>\n {value?.length > 0\n ? value.map((v) => getDisplayValue(v)).join(\", \")\n : placeholder}\n </span>\n <span\n className={cn(\n \"ml-2 w-4 h-4 transition-transform transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </button>\n\n {isOpen && (\n <div className=\"absolute z-50 w-full bg-white rounded-b-md border border-t-0 shadow-lg border-ews-gray-300\">\n {/* Search Input */}\n <div className=\"p-2 border-b border-ews-gray-200\">\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"p-0 border-0 shadow-none focus:ring-0\"\n size=\"sm\"\n />\n </div>\n\n {/* Scrollable Options List */}\n <div className=\"overflow-y-auto max-h-48\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <div\n key={getDisplayValue(option.value)}\n className=\"flex items-center p-2 cursor-pointer hover:bg-ews-gray-100\"\n onClick={() => {\n const currentValue = value ?? [];\n const isSelected = currentValue.some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n );\n const newValue = isSelected\n ? currentValue.filter(\n (item: TValue) =>\n JSON.stringify(item) !==\n JSON.stringify(option.value)\n )\n : [...currentValue, option.value];\n\n if (onValidate && !onValidate(newValue)) {\n return;\n }\n fieldOnChange(newValue);\n onChange?.(newValue);\n }}\n >\n <input\n type=\"checkbox\"\n checked={(value ?? []).some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n )}\n onChange={(e) => {\n e.stopPropagation();\n const currentValue = value ?? [];\n const isSelected = currentValue.some(\n (item: TValue) =>\n JSON.stringify(item) === JSON.stringify(option.value)\n );\n const newValue = isSelected\n ? currentValue.filter(\n (item: TValue) =>\n JSON.stringify(item) !==\n JSON.stringify(option.value)\n )\n : [...currentValue, option.value];\n\n if (onValidate && !onValidate(newValue)) {\n return;\n }\n fieldOnChange(newValue);\n onChange?.(newValue);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"mr-3 w-4 h-4 rounded border-ews-gray-300 text-ews-primary focus:ring-ews-primary\"\n />\n <label className=\"text-sm cursor-pointer text-ews-gray-700\">\n {option.label}\n </label>\n </div>\n ))\n ) : (\n <div className=\"p-2 text-sm text-ews-gray-500\">\n No options found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n\n // Render controlled version with react-hook-form\n if (control) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field: { value, onChange } }) => (\n <div>\n {label && (\n <label className=\"block mb-1 text-sm font-medium text-ews-gray-700\">\n {label}\n </label>\n )}\n {renderDropdown({ value, onChange })}\n {error && <p className=\"mt-1 text-sm text-ews-error\">{error}</p>}\n </div>\n )}\n />\n );\n }\n\n // Render uncontrolled version\n return (\n <div>\n {label && (\n <label className=\"block mb-1 text-sm font-medium text-ews-gray-700\">\n {label}\n </label>\n )}\n {renderDropdown({\n value: controlledValue ?? uncontrolledValue,\n onChange: (newValue) => {\n if (controlledValue === undefined) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n })}\n {error && <p className=\"mt-1 text-sm text-ews-error\">{error}</p>}\n </div>\n );\n};\n\nexport { DropdownMultiSelect };\n","import React, { MutableRefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n COUNTRY_CODES,\n extractCountryCodeFromPhoneNumber,\n} from \"../../utils/phone\";\nimport { formatNumeric } from \"../../utils\";\nimport { Input } from \"../Input/Input\";\nimport type { InputProps } from \"../Input/Input\";\n\nconst DEFAULT_COUNTRY_CODE = \"+221\";\n\nexport interface PhoneInputProps\n extends Omit<InputProps, \"countryCodeSelect\" | \"leftIcon\" | \"type\"> {\n /** Currently selected country code (controlled). Defaults to +221 if omitted. */\n countryCode?: string;\n /** Called when the user changes the country code dropdown. */\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone number input with integrated country code selector.\n *\n * The component stores the **full** phone number (e.g. \"+22177123456\") as its\n * form value so that the country code prefix is always preserved on save.\n * The text field displays only the local part (\"77123456\") for a clean UX.\n *\n * Works with React Hook Form via `Controller` — no extra setup needed.\n */\nexport const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode, onCountryCodeChange, onChange, value, ...props }, ref) => {\n // internalCode tracks user's explicit dropdown selection when no countryCode\n // prop is provided and value doesn't carry a recognised prefix.\n const [internalCode, setInternalCode] = useState(DEFAULT_COUNTRY_CODE);\n const nativeRef = useRef<HTMLInputElement>(null);\n\n // Derive the country code directly from value on every render — no state\n // sync needed. Falls back to internalCode when value is empty or unrecognised.\n const codeFromValue = (value as string)\n ? COUNTRY_CODES.find(({ code }) =>\n (value as string).startsWith(code)\n )?.code ?? null\n : null;\n\n const activeCode = countryCode ?? codeFromValue ?? internalCode;\n\n const handleCodeChange = (newCode: string) => {\n // Update internal or external country code state.\n if (onCountryCodeChange) {\n onCountryCodeChange(newCode);\n } else {\n setInternalCode(newCode);\n }\n // Re-emit the current phone value with the new country code so that\n // RHF (Controller) and any other onChange listeners stay in sync even\n // when the user changes the dropdown without retyping the number.\n const el = nativeRef.current;\n if (el && onChange) {\n let numeric = formatNumeric(el.value);\n // Strip new country code digits if already present at the start\n // (e.g. local part \"221778384499\" when switching to +221).\n const newCodeDigits = formatNumeric(newCode);\n if (newCodeDigits && numeric.startsWith(newCodeDigits)) {\n numeric = numeric.slice(newCodeDigits.length);\n el.value = numeric;\n }\n const fullValue = numeric ? `${newCode}${numeric}` : \"\";\n // Pass the value string directly — RHF's Controller field.onChange\n // accepts raw values, avoiding unreliable fake-event parsing.\n (onChange as unknown as (value: string) => void)(fullValue);\n }\n };\n\n const toLocalPart = (v: unknown) =>\n extractCountryCodeFromPhoneNumber((v as string) || \"\").cleanedPhoneNumber;\n\n // When value prop changes (Controller / direct value prop usage),\n // update the DOM input directly so the display stays in sync.\n useEffect(() => {\n const el = nativeRef.current;\n if (el && value !== undefined) {\n el.value = toLocalPart(value);\n }\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n // Enforce digits-only in the displayed field.\n let numeric = formatNumeric(e.target.value);\n // Strip country code digits if user typed or pasted the full number\n // (e.g. typed \"+221778384499\" → formatNumeric gives \"221778384499\"\n // which would produce \"+221221778384499\" without this guard).\n const codeDigits = formatNumeric(activeCode);\n if (codeDigits && numeric.startsWith(codeDigits)) {\n numeric = numeric.slice(codeDigits.length);\n }\n if (e.target.value !== numeric) {\n e.target.value = numeric;\n }\n // Always emit the full phone number (country code + local part) to the form.\n const fullValue = numeric ? `${activeCode}${numeric}` : \"\";\n const syntheticEvent = {\n ...e,\n target: { ...e.target, value: fullValue, name: e.target.name },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n // Merge the forwarded ref (used by RHF register) with our internal ref.\n const composedRef = useCallback(\n (node: HTMLInputElement | null) => {\n (nativeRef as MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLInputElement | null>).current = node;\n },\n [ref]\n );\n\n // Initial display: strip country code so only the local part is shown.\n const initialDisplay =\n value !== undefined ? toLocalPart(value) : undefined;\n\n return (\n <Input\n ref={composedRef}\n type=\"tel\"\n // Use defaultValue (uncontrolled) so React never resets what the user types.\n // Updates from the value prop are applied imperatively via the useEffect above.\n defaultValue={initialDisplay}\n countryCodeSelect={{\n options: COUNTRY_CODES,\n value: activeCode,\n onChange: handleCodeChange,\n }}\n onChange={handleChange}\n {...props}\n />\n );\n }\n);\n\nPhoneInput.displayName = \"PhoneInput\";\n","var img = \"data:image/png;base64,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\";\n export default img;","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXcAAADACAMAAADIptO1AAAAzFBMVEVMaXEvdXYfp545cncfp54fWGsfp54iam0VT1EfWGseWGsgWWweV2ofWWxPZGwcV2ocVWkfWGwcV2pwcHAdVmocpZsdVmofp54fp54cpZsdpZxycnIfWGtwcHAeV2ofp54epp0eV2sdpZwdpZwepp1ycnIfWWwfp54epp0ep50epZ1wcHBycnJycnIepp1wcHBycnJwcHAeWGtxcXFwcHBxcXFwcHBZgn8wXW1DZnFmbnAgWm0hqJ8hXG8hraMhXXEisah4eHgiX3R/f38DlNiCAAAAO3RSTlMAB/gN/vr8AwH9vvRk0BciLd5UQkkXOu3iJjb5rCZ4w6KNWkmStOjUeLJpaOXFhTPVeJyAVpuKd9DqwFmF40cAAAAJcEhZcwAADOsAAAzrAeXWRNIAACAASURBVHja7X1pW+pK03VCgG5GAWVGZplUVNT9BRIG//9/equqM3R3AqKy9/28nvR1rrORjKxUVo1dbRjxiEc84hGPeMQjHvGIRzz+04Mzd5im+JfHmPzlcQRl8SRieP6CjPMAcbPabLaGw+ECxnDYajarPHgsPBb+S0o5ocms1nDW703r9XoikUjjgH/r9UZv3l8MW5bpyX4M2QVANxF0Vm0Ol/NGcrNxnI2z2WySScI9Cd/AV/DlJl3vjYfNqhlDfxFRB9BBzMe9xA7ATQqstZEWjwAewC4xHYPgAy2Zsbb9PqmbDEGfzeu7HUAO1ALYooCHRxJfACCd5Ga3q89nAD28KDHy3zMXucFayx6CnhCYfzqSSdgRoe8tW/DMYpn/DuhGddGrOwj6WZj72IPcJ3dOvbew8Dwxll9DnTeXjaSzcZn7UzlPJpMS8jA2TrKxbHLxBONxnj8KBDOuE+jJ5CnJRkoXQ/mYFObOxkmMgW5i4+ZMEwZRT+ySaVWKQ2RC/OPsxHD8D2BRuuAD9Lv6uAWeVoz857Bzo9Wv79IJgDwZzSgg2wJxpz7tzcfj5XI2Wyxms+VyPJ6DW7VB9JP0siQA+X4rFvkzhL06roMujSR1AXoSHaVEr78cjlrkJ8kDggit0XDZnybQl8JHtNnVl9XYtPkEdWPYAFAjDXWXszcbsBJHPuB+dFKOTXKAfwQmKLhSwDobZzrkMfKnYG/ON060MgVGTztOGjGvMh9wjkh7sTDOMXzG/egYq47GvXraAeQ3/WZMNse8U8Nc1An1ZBTqYJM35osmdw3NIPAYGRnmrv3ImzNwApz0pr6A88ciH2E9Gq25QD0ZigEQS89nCDpXIvCcnbJVxL7o9ALbO/NmbNhEccyisUuEKAatGmD1XWPcMik4qaU74J9i8dN4JhBOY7drDFnsv2roGNX+ZpMIUwwqU9CLi2YE6PhPqdutFD/PCyLfNHbO2DRi4BVqb02dsLAT6s5mOqyi18m0QIJh3gzKhW7J4ue5wFV4oabN2K6RqX1Y36QjOAZQT0+HzI3Dy6zNrJvVxM4NimcnCjGQP6vXR7Fd49sjbAaob8LMDtpwCmaIGtrCuLpVGxS2hwmg/oVqAjyNNW7MeMw1QqNa411I2NEzTQhPk+kJqKt8NoeoXxlfrOHg5CEsIR8Vw84Mqx+2YxB2cHZaEcq0BKJuZ+xOTeSjvpqtNczhohoDD4bMPKRRkxhL3E1HWgwXieJqNdnaKXuSN7/J0xgBqsbSTrCHhD2dgNC5RjHIKcVBzrZTqXXnyxSjBoFi2C3wUXXYSdhbGrIAl9Ul1LeTvGe9f9N+imGPhh2YXYvcgqlpVgrbdQpgL9Rimf2hAWn2nRC1JxNOXbf1UJ12QNYzKTu3sgwzxu5nNUnjXSIM+66h+zYQfcyXD8DrpFBZDPsPgwOznRaRQfPR6WlxQ9jxqmOvUxmAvVyLY4o/HKYxDKfzIDDQN1Vqhz8qky2gDiSTLcbhlR/r1BbEZJKh2ONYqzUC3TsgYQfYO3E48QKG+9RRYzLooiY0jYockz1kAHWAHTRqDPuPyb2/S2vcDsn/hWY+mkatDByTEbDHWYufk/vMCcG+AdhNDfZKzk6t16hSV2Zstf8c9lY9qeBOpTELzZDhRhejApkY9ks5TNWeHpUBcZ9phoxhDATHoEplMbdfIL+0VB0m8lKXauQE0iEDCAygTs3Z2VilXsKWGanV1QT7mKmwM4A9g6gDyRSuYth/Lu4GsIxG7glnbvEQ7GC1wwAvtRSHZC4h7jMnsVFh3/Wq3FSpqIvcvkalmruJYb8E7E01KoMxmUZLhdY08tscwb5Orbsx7BfBXQ3+UgZ7pMN+sxYkg6ZMHJO5jFLVxT3hzLRwu1HKrVGjErkXY516ERuyp4l7ejdXBZoZxbJNsIPlnrqJYb+IuC/U6gHwlxpNQ01gsw4EB4jcc9tuDPtlUnvoqSossxnqIUiwIF1p32ZjlrmMuA83ssuEJmRfrcODWFiKLEjAPRObkJcrIFDEPbGZaixjXJWFLQMm5HYV2zIXMmY2CVWpbhYqy3Czs/XE3S7H8YHLRAhMqIVUYHd6WrWvUbFd2NcZOx+zzIVyqjgVUrZlEi1V3I2rCdntBHw2DrlfCPelo8Qh085YlWhmrIQtQzQTm+4XGlZjo4p7XS2JxryeR+5YPhDDfjEjUtaqeoAAWkIWthlBM5nUuhaL+4XUKlShykVKm4Yu7t21EHeAfbsy5YnYRxoUypt4xNA2HD1DxFHBXAcoDdTKvqWdIk97+qb4vw4A1yV6R5dpoZvukrgHgRm39cDRTp7uJq1TQdCwQPlbb/h27CC5x5k/r0ppFMr1j0bEdv7J+f0X/XTn19DPFweY5zAx1G4kZVc17aguk5vrcGE/dMwzymX4d3tofWHXYummclMqikz73yipD+4n8tYimpFKyHxq8sG+c9maCbO7UZqsXZYBds+7G5lxU8hms4V85M8eZHHg9A+jVsiGRwfiO/lgQ2fVrZnybZuDiKPgWq6wGsVutjzJ5XLlQifvFWfCe4k74fvIWbcgLqL8kBs8C5Xp17JRNyW7g3jO1mLc748X2IGRRT0Ts9lqmcqX1dFy3B/PRtVPnznQTEOmGV3c4XP34Iv7tlD0cc8ftlv7UAhHyDBOD9u22xL+xBv8ZKvjgKnZwUHakMoVulYgJVb2EHGUCILCXIduObO1SefY21Q5z9zva7mtvUWnDrzrg709rJRbw2TZ9rCt4FUq2/BdHSalYH845bBXT2A/0nRiOlPrJvApWNBUpFFPgCpk/vmbfTgCDkkm6uPPZkKbxiKpGjOq7U4uU8p1mVK2n9xjlPKDUFlY4CFyCZjAJoE7fHCP90aKIg0DO+dvgAkjtl2u+HxpZT1NLh0lcAdhz+IMExtgA+jwg6jQRNzhPC7uePJcRf4pDCN7qcwNzh6s4J7a+bcS7pxav2BhNDZ6gY4Ash+Jc+BmDd8EYb5ZCL3XsMsXNPRyHJwJfZpm5BgB2u5qTlVid4gQBLeG8p4iwtf1DuNefkTgjlUfk7I6kIIwrJxy/4b3AyrQoNbSBd7K2sFGb+AEKtLyNgjAupxdDVadMk2tgopkTrhnAtzh+K3yMoK8A9jrG5J3yBJntJuaBGUpQALTXQK6jSQaDegImyBUWKCdhw3q4whNvepN//0fQicHBLwBDV7g2MRJ4BlVb8hada68IDCXuuxFCAD3rH8uD/f1RLfnYQuVk3m442tSuSop48rE8icsBaFRu+lmD2sE0J08TLgXStooUug0i0iXu1d0sasuFMimtgPDDOMO1x1IlZ0h3LvaTZXMoKQFYIdZdMthqzWaQYV0wpl6gg2wLzcOPZTpfN53bxitQpwm0FuM4IgezLje1JsngGdUEikX/w41dq+sM65WhQ95HfcMvf3aXDMKXSq4h30txgfb3LrstcUyivkJkDwA6Mu7nWVR9ztAnLMl6nGD1idWJq8nhKaOO4SspZiGhnsUQwaBE4QdOuNwegh9gBnq5lzcMaoC7Y6m0NXLsphcFpDGziKIRXUMfQd34xO6FRJ8cuQdCEudrs6MrB2I+6TobyTcM+tw1Rj8fFII8Ktl3E3NVHZxt7hvvpfKtoDFw71g6ga2e/ItXNJEMw7aN5mE4bYTibuSGIvAXbtAwAF10HO9qvAiTKQEX+CBTyiIuKy6Nbqe+DY2id2cXDmcfY75jETzKPAgnOOdgvtYBzG39hQc1W4YirwXEIWKZu4PYEN5YmfOkXdLmioP1QoINrXoINxZxO2uDrm1rC/huA4KPNauabiTATY4hTs7FjhB1TjyOApMD9CwdSpqIfMPyHvoul5cLvqqe3UvUFiNLTUWR4mG6D0hh8RGmu01sD2bA2laxT1nd+D3oVZTvVsgjAES9FdwF3Ye2SPsKO7kS6BwS04qwZkj81HF3S6XkSL9S38Bd5h84QRpfdMY1TcJgaJpjAEvIGNT7etlzHfwhvg+uoB1fgL3pkTvgmYUcCw/RIBlBAHNeLjf4OzVkvQ+oW2M4lf4Mu5kIAIzoLo4ijuSW0ozD8HQzR1WTMMdbw6MUbtgfQP3+rTelyxElPEdupOCT9DU1kpcmtAgCVSAKZdWOw3zGNFwY+QEKQ803rkeAA5sbDtrqhBAIXaxsEargUn2D7z29uoKraCv4Y7xN48xonEHOl8dUrKWEZcsIMgW03HPmrB3xmeas3EHaW21Wk1JxKqI+xLLLnCSqUNGuxybErPxcIJGoDZ3iRMWDW336T2NpKbS++Dguxeu3yKLnl1AZ1ZGD348/Ha7RvmpL+N+I4Bjx3A3igW0c3QpKt3UbkosjLtw+XLuxc+3ZyKmwQiegRtDFRt4lsw33iHGJXk+WH6XDtU5ysGdsUTveq0So98Z0HtNx31dBmUIL0RFMi/RLC/g1yfsmWjchWrAYgXPnuFqtJAoRXm95OhXhLwbebT1s2Iu0Gf2jBa45Mqsr8SmQf2MW3U3CVptjUYYnCF+ANxRrbYkGNA8B+17LBENrQgC3KFoRmEkAC0XiPtaKSMQPFO24M3PSe4UulkpUHI1Hfcz5B0MsOw2d+h4uGfDgZ+rHMUqWETUOQp3KHGDefxucZvuN6U+lXfvgSB57+YGRmIBX6dhWBi7gdFwm0uTNS4L7Se4o2O2keg9FHnvSjTjO5MSzwDVVtaSz8pQwtaTK6OWknFfd28q0qihVx/GHT2uA4gnTHUgf7VcUQY+9do6Cvdj8o59K8ri9sywvK9Xyk3dHK2RaPV2rjALdTlvYi0pmJoYA1ua9MiB9kO4JyTCD+FeD3AHQlLKCISOjKZ3l2cAdzRC/Fcf3azUYYAApTJ+fGad2crjUDACv0n3dHMUVCHc1+pRGJKrYUAsfzbuqKptjCGhxITiBLZyek1bUyPjJiwFNlqCUnUS6MZzQQ89bO6Ije0xRkMNBI7gnpwdxR0mGwS4a0ViwlqOtN493HNFhpMqvQAUuVn40wy0L4O4GIQGpYG0dAT31TZn+7hn5INy67yL+/oLuENeCs6Uo0cV4nflplJlDXeQut50Om1sAF6nQdETQQ+wzAY0J5mPl30IoKcpgPBV3BmakcmA3ucmV+i9Iom7FgDzcBf+fUaUMgFwNhIFRt0VeVcD3YXzcF/LB31P3kXNPtznFTq2mryr55+Eca9jr3qgcephHNAygD1uou9aHVM/dbRavor7MIjOpMlE1UPAQcxcjcN4uMOZ4TduO0KzQQQ4Ra7jDR7p8XtmverKI3+c3yXc7bJyULdE/P5F3MWPQBc3xDPrTl65KVPnAsIdnfgkLs4gQmQN9P8xSsApz4chMgeiMl/GXYqKAeGosUgRjfXVqjpZVcIdjR56GeCXZSinAf7WIbX+qj2j6dUoe6aW+ZJeFfBlt0ROX7bfrX5v3uvBEg2gP4nf0XFFdbigqBzHtBNo2HQauiT/APc0maiKl1JeB7gfBkq8V+CeukLKAH8Rt8LIHnJgf8PzD+F+jv0Ox8t2ZIEZ6kGCNMK4c9e6j8Ld1Tn25Erkm47a78dChxasawIMn6AwGQbZnZ6fjySeTjuLr+M+Dvg9HcT2PbXqhyIxstfVSIji7yWqNxAsRP4m1cazb8k7uWkQaTkeJ4j2mwx2CndO4QeMpX7ZXxV1HxBLqXtx4CY6rjMpHVjFcE2fC8/qbDuSovW+ObObc6arVU/c4QHko3HH/pE5igZD8BLEnYyVb+JOkfvuCdwpTtAJnyzab/JsW2SaNcCcx0zvV+MEGOJfYOtMFF4Nd4MmDmzm0X5TInHcfldw7+vBmYDeQ9OEA9zhLCsKTJGbT7/me7iLuBhd5xjuJireMtPiYlD0URhYx3DH93BCufRKJvOd+Ay0SiaH1WQk3gruaNA7PfOLcQIZd0it6uZMR8ZdOH1RuMMPtql6wPWk+PdwF3JJUZnjcWAMw+U0g7Y4OWwPWC17BHeRRQAFdZP6Fu5wPKELGSbCXYKJM0gbOVNqypZUcD8ZF1PkPZnQ8yNZDXd2TN4JpgHAlhPk+y3cTZzbQKnoE3kPLNWwV2r8HeypiLyHhDtYWhjfy3VyZ+JumkqpHaNkBziVIuM3D8k7wKyKdyhQdkLek/prYZb91Cp4PuXSMdy9mDDGZDKUA/kG7tiyDGdQTa5O5psouq80pDDRV8vkaidwN0QVjyh4+xR3XCNs3p8P5RzPGBUrrnlE4i1pQeR3p6/nPdxATuNYa3Wm4F5XXgtQYpOzccfwU6pse6mRL+OOevEqu/WtpiO441XXZJuYAYeUJpRr5Md5hnQATc86E3dYSmbXD0xLn2dMSlcElTEU36JIgQl5vp1fAsPF8+gdqxkjO9JvAFzXzfecXzkTVTYQ4M7d/EjGy3F/Zr9L9QSuEcih3BKsvUNWRCqi4u9kK6KJD1ca+KY9xOVskZU9hbvIJGR0eTcj64Fx7jpEv4I8H8PZvRhEIccJ5NtL8yGdgP2O8rp0Q/RB+lRRBMdn2CRDSY+rlIT7tlA8ijtxLP0o8FX5F+QdTRP646rSyWGKwnu4J+pnULzXqdWV+0UtS/VOZLwexx3vMKPinjmRX11iCdLQ9UqBAYcJUa4ryi8wTkCbQG9MQc82qpT6hjD62P0ecYUJkq0TaT4/7ZHW6Ag5UcHdOoE7N1EMyaeN4JnMOlTdWxJ1ejm30neSwlKCg/9OUYQip9cDD5iYv4zqd7LKQ9C8mxWPq2gct9+DCpCUgjtU+mmj5t19E0oGsCpDqo0RsVr3syvYpB4x4c25eEf8oq8R5qrn7JyqJXBX9WikVBkahTvWpZb83CX85FTOv/PKFgwPry41pdWlwrihulR3g21jeHebCzqAAu45/ajMNitinpXcNpVb2+JQQNKlQHS7UrkA93VWnz2B50wFdanaLdkpb34oiSt2K4WCMMuChY6w8HHmvtkzDL7XF1XY0OphWIwISRiOcEgVj5glNkQ/x8s4hidwz3+CO9gw65IHdBHK5Q4dN01J8m57ddiIq/4bEXfYxduwPdgTWBrEV0NQh73WD3JxR3yzOaimpKg5JC8mA8sP/ttr26vDzmxVvUxNL6FuW9Rhw62HbsrHnVO9VyIJq4HP5z1a/xR9Su7X8cLfDYiYYf2p42pFelZQvteAWBrVBTvL4xN35Ph7BO5BVCyK3yvlQsEnBtCs5UK54gvMDW4siXkHUQMw7paDP7OrfIlLkyTMTjl8THnlnd3KQyHw9gA18rnCoOY/7BLuRfdg4t10mNYLFr4slIlnbiJvyq/LAXukj6C69e8QkRx7iWeGJjsVA2NoHsjZNQKBasbiezpi44xPrM+DM4a9fFMS7dLjuIeb51lXMEzlzyArHmykT6EBexalPykPJ6vBYtRBRff+sJ6idAPR83ylVpTmtJjiVAhCsYS76wH1T24qQIpj6trZbWg9353TGzIpFsZghTVHbEn3m0Gtkonfb2g12l1jYbFT83+qdRl3dgL3T5oS8B/NJ+LsSwuyyFUX5x/4lQl7wCe4TOy00Zj2xiNlLRm4eHPYxy3zZcsM+t7BjVSHfThk2usPqydnOIkEis8zJ+Q95De5UVI9GBveeN58viMlFIwd2YsfK3thXCrtiDrpmfP5MKnBTatatUxm6AsnwatFW7gy8YlSBKBVqTr7pDSQAkmfw++Z8PwC4/cvuHFsOp/3GHho9qe8wuzJc/v1Yp/oVT0e+R8Zx7np6Dxjfl6zTq8+8rQdCXmkSjw//pIdfwLcG1riupIJgM9k7HyM+wV7E7S8wqVwfEaOE+jlYvH48Xoem4QXjxyp8cgrFfcfNBUL5qRIxoy8GjeXLAqprFw5itaF9ioLtG+YfD5ZLfJgGwsfpHwdUo0R179siysX94Qef8/JuG+/3+zdrxI/Qw4uvi671jjgSAuCf71aYKBY01oaVs17/KTbOwRvru9f3m7x49M1jFv6FxOx4BfC3ybsgOOJwor4tzCypZ1pFA369GQYt+4319zyPl1b4qZhM5V23b5h4wLz6f7l/smie/DGk3s4fe2f/Em0HBBXx/t6Cl3/iV+y6Y/bW0ysKKFsy0q4f9+AZ8b14/5j//FwD/g+frTbH3eG9bhvv1Jq9m3ffijC/3G0n18so/j8fOsGOR9w53fDuqOt+48XdoffPBvGu/vN3rz+EB/a+yc639P+EZ8eN+8+rqFpx3sbrry/g2d+jzu227Dvg/kqLvdId+Se6tGiGMBz+5rO8/LxaujXf7Yu2X1m6ri478bH6wlC9cBfuMLtw/7P09P988ebAeL38PD2hLjvH9E4Zu+E+/XH3dvb/Z/njxcJd/Z0336E18S6a7/cw3gBCXx7br89MeP94889DVakf97e9w+irtR8bL8hvTw9wBfFu4+766fr9z2c8hbO8Wf/jHsbrx/vb/f37w/7N8D9gU5+fy2iin/2fyjBe7e/NrTr379dkOAZm3tE48U6o+pnvm/QMJC0V//FN26fn1EaH9sPDyigxYeHB8L9BUn4+uGBBbjDIe07eOutu4dbL/4Dn/Es7x9PEgNzlNprN9N1//EHccd/EF+cCmO87u9ox1v4F4X5Fd4F3Kf9CBLwrMxShPcFF6R6asNrg9e38Prt24vzPQbyBdGknZ5Wp5dXcIcOV9+5OkLwgmFS7gr/M+TCAPc/+xdQJ2/798c24v7KoXTCemybxYcA9yf43Uz63RBnfHRxJ5i5ME1MIJVXNz4OWCHRmCivdCqcQm0+AwuZCOodmSWv+OqZ8E48G3RCHnj8JhKNSbJiIu4QA3Wvzy/aI5Ymxaajpx3UbDnzsf6eYkXZab/eFmlahMCd5P0aZBkAfHgTuJO8Pz2ruPvy9mQVixacwghwN+Ebz056/bhz5/FywRACfWAvehqmgQ+ZIfnfcUyS+vJ+hye8xZP7r84L3ArD+xO4S9fnF2+FTbmPdKiQI2jWSQSf0SuXzrVV3x4+9s/v90WE1sN9X3wHorEAHoH7OxoNd6DFNJ6h371/xvFwb/jyTt88XItinbf9czGY5Eu09oY0cy+4Gr9rE/kEuL+DunD5vY2negzesT1c81awjXL9x6eLmrl+TTAVFKvTmwoqwWuRgrPj3sbt/fszmAPXhoz728c9IPbHeiZ7pk1WyV0xGvdHHM9vgbzvn/GLJ6oJvH0gG8R/vR7ANLmDrwD31yO4w7U+9g93oCgBdzz33a2f2gXpNl72xFvK9e8ujftILGNDdQjqrPvVVsbdlhoRQCl49dzbQGJkxad3lMoA91v4UcZ7+7qIuF/vH19eX97AojYieebWxAwzk3kGIt345gP9P+7vpT4RSO23+B7Bewavj0lvxEv7VeWZV7idO+xZgzxjilP578u9gTTDZJ5j0i4Xc1ldSxJKc8JTOhQLXtL8vDo703Em6w5Ns0e0qBF3Trhz+DnPD2DgePaM27KNcMcoKw/ZE1zCneZIcfr8zs2g/SMAt7+/BoYB2xzRZ1g/gJyv8AwQzDM9LnFCzoOiJVDmoB3wO/n6jLML9173i8b0CR80510meLkzMNhBy/Pqx43rOxIe4cmAHenKO+Bz1373cH/1oiGEO9fl3XsSlmLPCJTvtMnOtw+Pd8Q84BzcExO9tZ+ZMBID3I3rNigY7tozshjePby7Tt1ftCPdyZTY2i2tdUER89ZlolnJuDeno3MyIfi6P18Xi8XX/SMUtl8DfVvo3dyi9QLw3D56uIufBvx+fYujyCyweWBnyX63nh4fnizE/Y32gZMAuRfpo+Vn4e7abXypiPlf4MpvqAC4hrsJlgugCri7l/MF/mXfJt+Ci+sj7u4lLo28u9qBNqEPbnF1kHCHHKsluxizxjkUD2J63/54eH74ADVILjcIOXAO/Ii7D5D922ewZ94k+xu8c9wJzIpn+AAKEQ5ycWfv+M0jxAk+SBHv2+a992n/4lda3O8//ohKputnuvLDm0shH49IKYQ7w1DCO0UuxOXMQDF/PJKh5F/f3eWCcQI3RiMWGcbl+NRXNr9VCD6lNP6xer2zPCn4JS93d2RHmvevLy+vIGz3LyBfT69APNb9C4D/59r3SHGXF9xL7AyE8fYibovzN/zmHjjC3eeFPb2+uJ+fAu/15eXW9V7Bknq8e7l1y+qKr2+kCK7/3CLd3768WKZ/OeY3W7kXd8Pc65tv7i735qVXRJzSWuZgwesTtstybjsjEw2uPA8dQc4AnvLvJjsajf2ruWnI8JtHAr6cH797/o+WRKQYDViSQ5VosJ+FnOuTi2ioudPsnGQIF6kKLjVspr9EjoLyHlLRktTFzc07BB76qbwHNyK681KNN2OGmhThfjVHKO/hp2KkvAu/eN4jaOREAk9TF9TWrmu5bWlGWQyRugxpa28fF5//1QI4/8NLn0EEoqserXSgVpuX5Rg8JJ1kuaLZJMOzgI/HkTpJEvgkVturVeNZVbMqsylBCU6d+jBe3eYnAk8rmqeh957a2C2fkqs5tOw2Lg29qQ/jQoMfCjwgX9di8JZMNGtqd8e0jq7UniLG8Jth+DGtA5rczLTpwQNbFfiBinu1t8H54PGSTt8upMH0R2ilMtCschWNP8FUtmkgMT4z4sWFvr0CqyOIRou6sKwcoyGBVzXAAucCLbEb8f/irn8B1WAPJ1wAVDEMmWgVJheoKgLPqWMuGP7WvzdrODP4byhRRZMm3P3HUgR+rQYLRJwGge81/7X04TRe9gsqvWlVylDWSXR3k4IFWj8Mt8YSWsyN/q12BdgXo1/B8E3ALxnRrDYrMQ0ue5s1tEVCsX8utIJaGOyfrYeLze3HS/aLVnsWHbcV38lWfFatETjVgiRoHhv07v5Hdg11j+2bxm/wGzj1ndjQiiBcaQKflfPbmcxWr6SBJwbHwRODFBT/ByIP+VQ2TPRNzn5PNTz0pdT6SOJMZzksKVZv4OoTW8DMTWw7t6z+fZZnuEQV9JD+Nc4aMHUCF7XRMga8NAAABpVJREFUGsabVKEqqVZv+ZMw8Old72+rV2yDATN0f420e14QzOB29A5vpZytCDw2NeW6cYHAQ5+EBK7Q8NfIBs/cnDu78e/g9uBn9dGK1zqSYVtpNVxgr7g+ixgq6TfkADiNhfmXkMecjzlLAOzsdwVBRYemdLA0ix8tUFQrNMfQF5XnjJZ9SWI5iNMbmcrKqBdEfTjFruvst8WeRYuydCgsWZPj8JQB0efN4zoYDXxZoGWCs+u32IVtSsyGmqM5truY/cL4p0DPUaMF1FY6l5G9Jzu8AiiYGT0KrkFPv1193DIuCQ/msEfzBPbhHf3K6KdYJsrRe8FbnUNKKcuGDqmh5WBhLTtcEpBWz9zV+yNqOH4RWeco6/UdPNBe65dmdCl7p6/1YYr++rIxuR2ElCfQ7gwb05PIQ/du5PmfelKiINRc9BLQVQpqZ6u/NpGOAQNoNtQKeU/KWrS0FKUOAbwBLSgvFmSDvYemsyo7o0HFJ7U3zWVjQ82j6jP2i7O5nPrd9izO9UW0ZO+JFm4yw16NNU47CUIeF0x3gG6qoj6If2OaNy7nMJxDpyl6gZBjfi/souGbo6/4jMsrycAj19yEsx2A1XAKRIy4I1pJx4G1SqtiTgD7QjAANSmuFD7d4QuEqnppGYwbv7mww8TVop2FEV5qUpF4vTu5Fz6pjhOIFc4jQRXr7BK98ZCSFOd0tPL24c3huJfA5XrAkyNh579Z2F3goct/XTcmaWEh2ZrElX7Dag44eNRzSL8C9AAaCD2sVT1HsfcqEznXO+dQp1GvERUK+hwXt07T4uLgBA+t/0LynKMdv5vqAbKb3Fo1amhdCR7BNeaw4ZCCFZPB0+hMbRINlHtLhjoY0nKQi3GvAStYowGTJv2cGFf/K7UiWBuzUwviRUhYU66iJ3JEqwsLFrvH5V6SGx964Hr40Oj1F8NWlXqmMRd0mPwLrdKao+Fs3mukcQU2PACNIrRHoV0g/8+U6KBlokW5ubsiq6xcaYEZFtlkpLqknqKIPP6XpIXT8Q0Apb1J1AH//tgbfWgBWE84uGUjICf3C6SeVk/6L1WkAdkusGkB0ysm1WB85jCwuBlteldnPYcoepN0xZ4Me/gmLeDHde5wEOAENPq74iGRRsY1H/l/rByNIcmPdeAx+6RK/KFzFelEYkgSre/dRoZedBnCwGVCHRRh8JcbgScDnUoXl43y/P8DfHWu1nW4y8OoHG9jw19mRCNvtWBJR8cljwB6aZDBGfxFbAQvQx07lf7DGoX/WyTPFgulLgsopVbeKuXZAHwuHz2LiCIEzBqNG4CkUK7pzfEhdoAlHzf1+bDK/quoC/XYbBpaFrtUOKSU7pKw4uSqeIQQOK0jYY6WsEivgx2NNUpxhRxZH9mIzE3ssMv/SW3C/2WR5+GOYR1cbFCJGdjlinnMjXcVI/qf0zqoUgq36OSOkDvpxrQ/G1mG8R8HPbpZK0AyWGPMICPbkzlYdeO4DhSZQ7M5WizBREfRV4ZDduUM7HqaO/qfB/1o9ic/walPHvLkQW3LeXYCec5cZ4BVW63RYrZcotkOY7ycLYajVtNyWz7GM9VOWTql7FZLusKKJ7A4CT/l5CCqcr9yU14bjDMWC/rnEm92c9uMol9TmW2uU6LVeD/vnypW2eTy3zHm5yFfK9h2Si1azQDNl7CK45yWEXpMLB7nVsx1geUDkc/Q2KZWNcuIxfevinxplSPkff26RgWb6+SxjVusIP9i+f9NdisEXeL51CFX6OLalLHQ/z2RtyqFrb2WkEejMrOFpbDyRWGMs5jB/wLLQ+grX0jhYm9qKsq2M5NORayYJFkvunJl8aTjb+tXg910JluwKlNK7CADa8Tlst3alSXZj8HqmybzSgzi1+Hb0TOjNijktmvNuoHnYOPie4NKrXRlRtbqFGu1UtzS4ycTAor5DqwxrkBPShYWmzxsc+VCZzXoVio3tVKpCAvBlWo3N5XuqtNZVUox0/wMebOUX01cJRsoWoSeBP9wsFO5yaRMqx6WJ7kMBBa6N8UYu59alVhBelVZlWGSgk1xg2Ck3IEPAxeTPOBikkLr8ljcf54Kx4ZeKPZZEGcAeGu7wUpX+vGbTC5XzgLmXtO0GLeLROu9zqe1fLeTRTrJ0dLWuFAtcAwsttrNl4qhhSXjcZlJMd4CAleoPvMwKjcwaldMfjPi8Tc4xzSjV+M0zRjzv046Lvz0L+Y44pBBPOIRj3jEIx7xiEc84vEVh+b/AX1eWwPgQ2/6AAAAAElFTkSuQmCC\";\n export default img;","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXgAAADACAMAAAA5rYg4AAAAmVBMVEVMaXH+/v7////6/Pz+/v7////////2+PjC0NDy9/j////////////////Y6enA29z7/f3////////7/f39/v7+/v7+///////////////////////////x+Pj////////+///l8fHH4OG72dr+///0+fnc7O3Q5ub////Z7Ovg7u/v9vbs9fXq9PTl8fHo8vL+///////+//+UCyKNAAAAMXRSTlMA+vwT/f76AgEEvhzZ4woR8JNYJfYyPofQschsT92odn9NMyIr6m9CYl+Bz7+xkqKe/GcyzAAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNrtfQefqkjzNSihMQAqZh1zToPf/8O9p7oJTSOOM9e7z/+dS+/+dh0lHorqqlOhNa0c5ShHOcpRjnKUoxzlKEc5MJhtO5lhsxKUvw05wfzgBxvPwmYl/n8HczuC3F0td4vDYUvjcFj0dksv3gjPpUT/jcMWeDJ3eRjfztPNxg+M+z3EuOuBv9lMT5frdrFy+ZN5/E6U4/uyzkF3O4vjZapztDEqumHRMAzDFN/c78H0fF1w6bdLrf/nss40pq0O1/MmBMKmYem6UakYphD48A7kjYph6HgG/Av/dD2s+OMq5f7nw3GA4Gp72ejA3LJ0wwiLx72iW7qFpxNsLhz7Evqfqxi2Olx8iLoBOY91ytMB2dcr2MG/LTxSOSWMP9Ex7uK2AZi6rpuvgC6GaZqQfDyr6XVZapzvw47p9HCChuH65QXY7/e7LPhQO6HpnxdONDeX41Uls9pOQ7NiPZF1E8INgDGt4l/MueIDzb3Y527eSd/fT9sqXIAS+pdhP05hMepGEexmBbrcKtT6eGCWDttHN+7hdOtxvVWOry0Z77i5myTsZsEEClzpA3yn0/nWP3IPllzZ43HeOp/gXvEdyQzSdSj7rV1aOF+LO3Q7lMxjHYPvgDoJur453Y6LnffoEO5ysb2epz6UvqnTzByed9A3JbjPCBmm7c6GqRfAbhCK5n1zOS46rsbVByN+xo6GRKGxVRdeF5miph6EwW1V2pZPxd27+iFE+gHuQJ1mS/903FUdoZOK+OD4ATB3dbhNAzJIw83W0ZwS4sd42druFBoP5sw7CXslDDfn45K9xkISg8xF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\";\n export default img;","var img = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYEAAADACAMAAADV9C9rAAAAhFBMVEVMaXH8/Pz///////+w19Qfp577+/v////////L5eP+/v7////////////////J5uT////////////////////////////+/v7////////////////////////////////+/v4fp54dpZz///8cpJsepZwepp0epp0fp57a7u3///8hr6ahFaQbAAAAKnRSTlMABvfvAf0E/vwCD2Xc5VIMNqUru9OIQFwXx31xJK+TSR3rTpwmeZq10VG02FS/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR42u1diXKjuhJl0bBjMGYzi3HibEX+//9ed0uABDhxcp2pehNUc+9MjMFOH/W+SNO2ta1tbWtb29rWtra1rX9wMVjwv40Qf53ulmW5lot/gPwuLvgZf9qI8+PLReJ/fHWD4cfWSHzLOzdJnHe7ovBrvyh2XR7HzdmzOIvA+zYU7i95BPX1c9L52eVwDEyjn5Zjhunhkvld3HguZwZ3I9p9dz9Sv8n9Uxs4nOi2Y0zLsQUS4XFfFXHJJsy29d/JrwP5WZnXl6PZA6UHyjuODYv+78DiryE0fdhWXaPDTbq1ke8/Sx8dKKmVXdWGQFra90jyfnXZHAh4Q28eT0WsI3wbI/xH6a9pUV4dQiCvIYj74UIeQRic3rbTS3EGlbBh8H3LUwebpvHbACiLQgeF/ScATMxAEsk8VLmLz9mI+V36x9mRS37nQ9LbQhfQsklK2Six4O9gvwP6b0r5G/IfiJZfwPBxjCubH18ZNDDXzKSQnfEnAqEHvVxE8LwNgy/aP0j/0B7ov9z0XNKovGE7sotAlx0ujAADS9/I+gUBpGvxHukPa7H7bVuQly4YwbG9ZBV6xruu2+12hV9ll/YYkMPGGQLeddht6uArDKCdsxDJZy/obwuHAC+Yx0u9i5Nz6c22t+WVTZLvqv3RECgAH7Q5PHiLVtxEf6YXR6cn22dJf1vY+4esiM8ek8OlYo0C3/WauMgOJjel+vB01jY2uIkBktbonaXfZdskfOCv4LRLSn2IhvIgNZOC1y6FqjkSepkUpxTdCcdOdxsEn5tAWlSHtrMEgNMf1Gpw6s4Rvdf9OCGASHAUonMHICDnnEptM4o+VsFaciAGcFZsH1C95n7H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\";\n export default img;","/**\n * MED-1629: the Medecine360 logos ship with the package (inlined as data URIs by\n * @rollup/plugin-image), so consuming apps need no `/image/logo*.png` in their public folder.\n * Sized to 2x the largest rendered height (Logo xl = 96px, icon xl = 64px).\n */\nimport logoIcon from \"../../assets/logo/logoIcon.png\";\nimport logo from \"../../assets/logo/logo.png\";\nimport logoFullWhite from \"../../assets/logo/logoFullWhite.png\";\nimport logoWhite from \"../../assets/logo/logoWhite.png\";\n\nexport const logoAssets = {\n normal: logo,\n white: logoWhite,\n fullWhite: logoFullWhite,\n favicon: logoIcon,\n} as const;\n","import type { SyntheticEvent } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { LogoProps } from \"./Logo.types\";\nimport { logoAssets } from \"./logoAssets\";\n\nconst Logo = ({\n size = \"md\",\n showTagline: _showTagline = true,\n iconOnly = false,\n variant = \"normal\",\n className,\n onClick,\n customSrc,\n alt = \"MEDECINE 360 Logo\",\n clickable = false,\n}: LogoProps) => {\n const sizes = {\n sm: \"h-8\",\n md: \"h-12\",\n lg: \"h-16\",\n xl: \"h-24\",\n };\n\n const iconSizes = {\n sm: \"h-6 w-6\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n };\n\n // Bundled logo per variant (MED-1629); customSrc wins. iconOnly always uses the icon.\n const logoSrc = customSrc || (iconOnly ? logoAssets.favicon : logoAssets[variant]);\n const fallbackSrc = iconOnly ? logoAssets.favicon : logoAssets.normal;\n\n // On a load error, fall back to the bundled logo once, then hide the image (keeps layout).\n const handleError = (e: SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n if (img.getAttribute(\"src\") !== fallbackSrc) {\n img.src = fallbackSrc;\n } else {\n img.style.visibility = \"hidden\";\n }\n };\n\n const isClickable = clickable || !!onClick;\n\n if (iconOnly) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n iconSizes[size],\n isClickable && \"cursor-pointer\",\n className\n )}\n onClick={onClick}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n >\n <img\n src={logoSrc}\n alt={alt}\n className=\"object-contain w-full h-full\"\n onError={handleError}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center\",\n sizes[size],\n isClickable && \"cursor-pointer\",\n className\n )}\n onClick={onClick}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n >\n {/* Logo Image */}\n <img\n src={logoSrc}\n alt={alt}\n className=\"object-contain w-auto h-full\"\n onError={handleError}\n />\n </div>\n );\n};\n\nexport type { LogoProps, LogoSize, LogoVariant } from \"./Logo.types\";\nexport { Logo };\n","import { ThemeConfig } from \"../types/theme\";\n\nexport const PROMED_THEME: ThemeConfig = {\n name: \"PROMED\",\n colors: {\n primary: \"#21596C\",\n secondary: \"#3BA1A1\",\n primaryHover: \"#1a4756\",\n secondaryHover: \"#308181\",\n primaryLight: \"#c0d0d4\",\n success: \"#059669\",\n successHover: \"#047857\",\n warning: \"#d97706\",\n warningHover: \"#b45309\",\n error: \"#dc2626\",\n errorHover: \"#b91c1c\",\n },\n};\n\nexport const MED_THEME: ThemeConfig = {\n name: \"MED\",\n colors: {\n primary: \"#3BA1A1\", // Teal for patients (calming, trustworthy)\n secondary: \"#6B73FF\", // Soft purple-blue (suggested secondary for MED)\n primaryHover: \"#308181\",\n secondaryHover: \"#5a61e6\",\n primaryLight: \"#a8d5d5\",\n success: \"#059669\",\n successHover: \"#047857\",\n warning: \"#d97706\",\n warningHover: \"#b45309\",\n error: \"#dc2626\",\n errorHover: \"#b91c1c\",\n },\n};\n\nexport const THEMES = {\n PROMED: PROMED_THEME,\n MED: MED_THEME,\n} as const;\n","import React, {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { Theme, ThemeContextType } from \"../types/theme\";\nimport { THEMES } from \"./themeConfig\";\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = \"PROMED\",\n}) => {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n const [themeConfig, setThemeConfig] = useState(THEMES[defaultTheme]);\n\n // Update theme config when theme changes\n useEffect(() => {\n setThemeConfig(THEMES[theme]);\n\n // Update data-theme attribute for CSS variable switching\n const root = document.documentElement;\n root.setAttribute(\"data-theme\", theme);\n\n // Also update CSS custom properties for backward compatibility\n const colors = THEMES[theme].colors;\n root.style.setProperty(\"--ews-primary\", colors.primary);\n root.style.setProperty(\"--ews-primary-hover\", colors.primaryHover);\n root.style.setProperty(\"--ews-primary-light\", colors.primaryLight);\n root.style.setProperty(\"--ews-secondary\", colors.secondary);\n root.style.setProperty(\"--ews-secondary-hover\", colors.secondaryHover);\n root.style.setProperty(\"--ews-success\", colors.success);\n root.style.setProperty(\"--ews-success-hover\", colors.successHover);\n root.style.setProperty(\"--ews-warning\", colors.warning);\n root.style.setProperty(\"--ews-warning-hover\", colors.warningHover);\n root.style.setProperty(\"--ews-error\", colors.error);\n root.style.setProperty(\"--ews-error-hover\", colors.errorHover);\n }, [theme]);\n\n const handleSetTheme = (newTheme: Theme) => {\n setTheme(newTheme);\n };\n\n const value: ThemeContextType = {\n theme,\n setTheme: handleSetTheme,\n themeConfig,\n };\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\n","import React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { Theme } from \"../../types/theme\";\n\nexport interface ThemeToggleProps {\n className?: string;\n}\n\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className }) => {\n const { theme, setTheme } = useTheme();\n\n const handleThemeChange = (newTheme: Theme) => {\n setTheme(newTheme);\n };\n\n return (\n <div className={`flex items-center space-x-2 ${className || \"\"}`}>\n <span className=\"text-sm font-medium text-gray-700\">Theme:</span>\n <div className=\"flex bg-gray-100 rounded-lg p-1\">\n <button\n onClick={() => handleThemeChange(\"PROMED\")}\n className={`px-3 py-1 text-xs font-medium rounded-md transition-colors ${\n theme === \"PROMED\"\n ? \"bg-ews-primary text-white\"\n : \"text-gray-600 hover:text-gray-900\"\n }`}\n >\n PROMED\n </button>\n <button\n onClick={() => handleThemeChange(\"MED\")}\n className={`px-3 py-1 text-xs font-medium rounded-md transition-colors ${\n theme === \"MED\"\n ? \"bg-ews-primary text-white\"\n : \"text-gray-600 hover:text-gray-900\"\n }`}\n >\n MED\n </button>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\n\nexport interface ThemeDebuggerProps {\n className?: string;\n}\n\nexport const ThemeDebugger: React.FC<ThemeDebuggerProps> = ({\n className = \"\",\n}) => {\n const { theme, themeConfig, setTheme } = useTheme();\n\n const getComputedStyleValue = (property: string) => {\n if (typeof window !== \"undefined\") {\n return getComputedStyle(document.documentElement).getPropertyValue(\n property\n );\n }\n return \"N/A\";\n };\n\n return (\n <div className={`p-4 border rounded-lg bg-gray-50 ${className}`}>\n <h3 className=\"text-lg font-semibold mb-4\">Theme Debugger</h3>\n\n <div className=\"space-y-3\">\n <div>\n <strong>Current Theme:</strong> {theme}\n </div>\n\n <div>\n <strong>Theme Config:</strong>\n <pre className=\"text-xs bg-gray-100 p-2 rounded mt-1\">\n {JSON.stringify(themeConfig, null, 2)}\n </pre>\n </div>\n\n <div>\n <strong>CSS Variables:</strong>\n <div className=\"text-xs space-y-1 mt-1\">\n <div>--ews-primary: {getComputedStyleValue(\"--ews-primary\")}</div>\n <div>\n --ews-secondary: {getComputedStyleValue(\"--ews-secondary\")}\n </div>\n <div>\n --ews-primary-hover:{\" \"}\n {getComputedStyleValue(\"--ews-primary-hover\")}\n </div>\n <div>\n --ews-secondary-hover:{\" \"}\n {getComputedStyleValue(\"--ews-secondary-hover\")}\n </div>\n </div>\n </div>\n\n <div>\n <strong>Data Theme Attribute:</strong>{\" \"}\n {document.documentElement.getAttribute(\"data-theme\")}\n </div>\n\n <div className=\"flex space-x-2\">\n <button\n onClick={() => setTheme(\"PROMED\")}\n className={`px-3 py-1 text-xs rounded ${\n theme === \"PROMED\"\n ? \"bg-ews-primary text-white\"\n : \"bg-gray-200 text-gray-700\"\n }`}\n >\n PROMED\n </button>\n <button\n onClick={() => setTheme(\"MED\")}\n className={`px-3 py-1 text-xs rounded ${\n theme === \"MED\"\n ? \"bg-ews-primary text-white\"\n : \"bg-gray-200 text-gray-700\"\n }`}\n >\n MED\n </button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2 mt-4\">\n <div className=\"bg-ews-primary text-white p-2 rounded text-center\">\n Primary\n </div>\n <div className=\"bg-ews-secondary text-white p-2 rounded text-center\">\n Secondary\n </div>\n <div className=\"bg-ews-success text-white p-2 rounded text-center\">\n Success\n </div>\n <div className=\"bg-ews-warning text-white p-2 rounded text-center\">\n Warning\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { Select } from \"../Select\";\nimport { getRegionOptions, SupportedCountry } from \"../../utils/locations\";\n\nexport interface RegionSelectProps {\n /** ISO country key (e.g. \"SENEGAL\", \"CHAD\") — case-insensitive */\n country?: string;\n value?: string;\n onChange?: (value: string) => void;\n label?: string;\n placeholder?: string;\n error?: string;\n isError?: boolean;\n disabled?: boolean;\n required?: boolean;\n containerClassName?: string;\n}\n\nexport function RegionSelect({\n country = SupportedCountry.SENEGAL,\n value,\n onChange,\n label,\n placeholder = \"Select a region\",\n error,\n isError,\n disabled,\n required,\n containerClassName,\n}: RegionSelectProps) {\n const options = getRegionOptions(country);\n\n return (\n <Select\n options={options}\n value={value}\n onChange={(val) => onChange?.(val as string)}\n label={label}\n placeholder={placeholder}\n error={error}\n isError={isError}\n disabled={disabled}\n required={required}\n searchable\n containerClassName={containerClassName}\n />\n );\n}\n","import React from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface TagProps {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"plain\";\n className?: string;\n}\n\nexport const Tag: React.FC<TagProps> = ({\n label,\n variant = \"plain\",\n className,\n}) => {\n const variantClass =\n variant === \"primary\"\n ? \"bg-ews-primary text-white\"\n : variant === \"secondary\"\n ? \"bg-ews-secondary text-white\"\n : \"bg-gray-200 text-gray-800\";\n\n return (\n <span\n className={cn(\n \"inline-block rounded-md px-2.5 py-1 text-sm font-medium\",\n variantClass,\n className\n )}\n >\n {label}\n </span>\n );\n};\n","import React, { useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Tag, TagProps } from \"../Tag/Tag\";\n\nexport interface TagListProps {\n items: string[];\n maxVisible?: number;\n showMoreLabel: string;\n showLessLabel: string;\n variant?: TagProps[\"variant\"];\n className?: string;\n /** Custom renderer for each tag. Overrides the default Tag component. */\n renderTag?: (label: string, index: number) => React.ReactNode;\n}\n\nconst DEFAULT_MAX = 3;\n\nexport const TagList: React.FC<TagListProps> = ({\n items,\n maxVisible = DEFAULT_MAX,\n showMoreLabel,\n showLessLabel,\n variant = \"secondary\",\n className,\n renderTag,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const hasMore = items.length > maxVisible;\n const visible = expanded ? items : items.slice(0, maxVisible);\n\n const handleToggle = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setExpanded(prev => !prev);\n };\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2\", className)}>\n {visible.map((label, i) =>\n renderTag ? (\n renderTag(label, i)\n ) : (\n <Tag key={i} label={label} variant={variant} />\n )\n )}\n {hasMore && !expanded && (\n <span className=\"text-sm text-gray-400\">...</span>\n )}\n {hasMore && (\n <button\n onClick={handleToggle}\n className=\"text-xs text-ews-primary hover:underline\"\n >\n {expanded ? showLessLabel : showMoreLabel}\n </button>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { AlertTriangle, X } from \"lucide-react\";\n\n/**\n * The banner is purely presentational: the caller decides when to render it\n * (e.g. due date within 7 days or overdue) and provides already-translated\n * labels.\n */\nexport interface PaymentDueBannerProps {\n title: string;\n subtitle?: string;\n /** Extra warning line shown under the subtitle (e.g. discount loss). */\n warning?: string;\n ctaLabel: string;\n onCtaClick: () => void;\n /** When omitted, the dismiss button is not rendered. */\n onDismiss?: () => void;\n dismissLabel?: string;\n}\n\n/**\n * Full-width payment reminder banner (red gradient) used above the app\n * content when a licence payment is due soon or overdue.\n */\nconst PaymentDueBanner: React.FC<PaymentDueBannerProps> = ({\n title,\n subtitle,\n warning,\n ctaLabel,\n onCtaClick,\n onDismiss,\n dismissLabel = \"Close\",\n}) => (\n <div\n data-testid=\"payment-banner\"\n className=\"overflow-hidden bg-gradient-to-r from-red-600 to-red-700 shadow-lg\"\n >\n <div className=\"px-6 py-8 sm:px-8\">\n <div className=\"flex flex-col space-y-6 sm:flex-row sm:items-center sm:justify-between sm:space-y-0\">\n {/* Left: icon + text */}\n <div className=\"flex items-center space-x-4\">\n <AlertTriangle className=\"w-8 h-8 text-white shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-2xl font-bold text-white\">{title}</h3>\n {subtitle && (\n <p className=\"mt-2 text-base text-red-100\">{subtitle}</p>\n )}\n {warning && (\n <p className=\"mt-1 text-sm font-medium text-red-200\">{warning}</p>\n )}\n </div>\n </div>\n\n {/* Right: actions */}\n <div className=\"flex flex-col flex-shrink-0 gap-3 sm:flex-row sm:gap-4 sm:items-center\">\n <button\n onClick={onCtaClick}\n className=\"w-full px-8 py-3 text-base font-semibold text-red-600 bg-white rounded-lg shadow-sm transition-all duration-200 sm:w-auto hover:bg-red-50 hover:shadow-md\"\n >\n {ctaLabel}\n </button>\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"self-start p-2 rounded-full transition-colors bg-white/10 hover:bg-white/20 sm:self-auto\"\n aria-label={dismissLabel}\n >\n <X className=\"w-5 h-5 text-white\" />\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n);\n\nexport { PaymentDueBanner };\n","import React from \"react\";\nimport { Lock } from \"lucide-react\";\n\n/**\n * The loader is purely presentational: the caller decides when to render it\n * (while the session is validated, fetched or terminated) and provides\n * already-translated labels.\n */\nexport interface SecureLoaderProps {\n label: string;\n /** Extra line shown under the label. */\n description?: string;\n}\n\n/**\n * Full-screen loader (lock icon with a spinner) shown while the user's\n * session is being checked.\n */\nconst SecureLoader: React.FC<SecureLoaderProps> = ({ label, description }) => (\n <div\n data-testid=\"secure-loader\"\n className=\"flex min-h-screen items-center justify-center bg-gray-100\"\n >\n <div className=\"flex flex-col items-center rounded-lg bg-white p-6 shadow-lg\">\n <div className=\"relative\">\n <Lock className=\"h-16 w-16 text-gray-500\" />\n <div className=\"absolute bottom-2 right-1 h-6 w-6 animate-spin rounded-full border-4 border-gray-300 border-t-green-500\"></div>\n </div>\n <p className=\"mt-4 text-lg text-gray-600\">{label}</p>\n {description && (\n <p className=\"mt-2 text-sm text-gray-500\">{description}</p>\n )}\n </div>\n </div>\n);\n\nexport default SecureLoader;\n","import { Delete } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { PinPadProps } from \"./PinPad.types\";\n\nconst DIGIT_ROWS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"];\n\nconst keyClass =\n \"flex h-16 w-16 items-center justify-center justify-self-center rounded-full text-3xl font-light text-ews-gray-900 \" +\n \"transition-colors hover:bg-ews-gray-100 active:bg-ews-gray-200 \" +\n \"focus-visible:ring-2 focus-visible:ring-ews-primary disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent\";\n\n/**\n * iOS-style PIN entry: a row of dots filled as digits are typed and a 3x4\n * keypad. Texts are provided by the caller (already translated).\n */\nconst PinPad = ({\n length = 4,\n onComplete,\n onChange,\n disabled = false,\n invalid = false,\n resetKey,\n captureKeyboard = true,\n eraseLabel,\n progressLabel,\n keypadLabel,\n className,\n}: PinPadProps) => {\n const [value, setValue] = useState(\"\");\n const valueRef = useRef(\"\");\n\n const update = useCallback(\n (next: string) => {\n valueRef.current = next;\n setValue(next);\n onChange?.(next);\n if (next.length === length) onComplete(next);\n },\n [length, onChange, onComplete],\n );\n\n // Clear the typed digits when the caller asks for it.\n useEffect(() => {\n valueRef.current = \"\";\n setValue(\"\");\n }, [resetKey]);\n\n const press = useCallback(\n (digit: string) => {\n if (disabled || valueRef.current.length >= length) return;\n update(valueRef.current + digit);\n },\n [disabled, length, update],\n );\n\n const erase = useCallback(() => {\n if (disabled || valueRef.current.length === 0) return;\n update(valueRef.current.slice(0, -1));\n }, [disabled, update]);\n\n useEffect(() => {\n if (!captureKeyboard) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n const target = event.target as HTMLElement | null;\n if (target && (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\")) return;\n if (/^[0-9]$/.test(event.key)) {\n event.preventDefault();\n press(event.key);\n } else if (event.key === \"Backspace\") {\n event.preventDefault();\n erase();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [captureKeyboard, press, erase]);\n\n return (\n <div className={cn(\"flex flex-col items-center gap-10\", className)}>\n {/* Keypads stay left-to-right in RTL locales, like phone keypads. */}\n <div\n dir=\"ltr\"\n aria-hidden=\"true\"\n data-testid=\"pin-dots\"\n className={cn(\"flex gap-5\", invalid && \"animate-pin-shake\")}\n >\n {Array.from({ length }, (_, index) => (\n <span\n key={index}\n data-filled={index < value.length}\n className={cn(\n \"h-3.5 w-3.5 rounded-full transition-colors\",\n invalid\n ? \"bg-ews-error\"\n : index < value.length\n ? \"bg-ews-primary\"\n : \"bg-ews-primary-light\",\n disabled && index < value.length && \"animate-pulse\",\n )}\n />\n ))}\n </div>\n <p className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {progressLabel(value.length, length)}\n </p>\n\n <div\n dir=\"ltr\"\n role=\"group\"\n aria-label={keypadLabel}\n className=\"grid grid-cols-3 gap-x-8 gap-y-4\"\n >\n {DIGIT_ROWS.map((digit) => (\n <button\n key={digit}\n type=\"button\"\n className={keyClass}\n disabled={disabled}\n onClick={() => press(digit)}\n >\n {digit}\n </button>\n ))}\n <span aria-hidden=\"true\" />\n <button\n type=\"button\"\n className={keyClass}\n disabled={disabled}\n onClick={() => press(\"0\")}\n >\n 0\n </button>\n <button\n type=\"button\"\n className={cn(keyClass, \"text-ews-gray-700\")}\n disabled={disabled || value.length === 0}\n aria-label={eraseLabel}\n onClick={erase}\n >\n <Delete className=\"h-7 w-7\" strokeWidth={1.5} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n );\n};\n\nexport type { PinPadProps } from \"./PinPad.types\";\nexport { PinPad };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { PinCodeInputProps } from \"./PinCodeInput.types\";\n\nconst MASK = \"•\";\nconst onlyDigits = (text: string) => text.replace(/\\D/g, \"\");\n\n/**\n * Row of one-digit boxes for a PIN or a one-time code (desktop keyboards):\n * typing moves to the next box, Backspace goes back, arrows move, pasting a\n * code fills the boxes and `onComplete` fires once every box is filled.\n */\nconst PinCodeInput = ({\n length = 4,\n onComplete,\n onChange,\n masked = true,\n autoComplete = \"off\",\n autoFocus = true,\n disabled = false,\n invalid = false,\n resetKey,\n digitLabel,\n groupLabel,\n className,\n}: PinCodeInputProps) => {\n const empty = useCallback(() => Array.from({ length }, () => \"\"), [length]);\n const [digits, setDigits] = useState<string[]>(empty);\n const digitsRef = useRef<string[]>(digits);\n const inputs = useRef<Array<HTMLInputElement | null>>([]);\n\n const focusBox = (index: number) => {\n const input = inputs.current[Math.max(0, Math.min(index, length - 1))];\n input?.focus();\n input?.select();\n };\n\n const update = (next: string[]) => {\n digitsRef.current = next;\n setDigits(next);\n const value = next.join(\"\");\n onChange?.(value);\n if (value.length === length && next.every(Boolean)) onComplete(value);\n };\n\n /** Writes `chars` from box `start` on and focuses the box after them. */\n const fill = (start: number, chars: string) => {\n const next = [...digitsRef.current];\n const written = chars.slice(0, length - start).split(\"\");\n written.forEach((char, offset) => {\n next[start + offset] = char;\n });\n focusBox(start + written.length);\n update(next);\n };\n\n // Clear the boxes when the caller asks for it.\n useEffect(() => {\n const cleared = empty();\n digitsRef.current = cleared;\n setDigits(cleared);\n }, [resetKey, empty]);\n\n // Focus the first empty box on mount, after a reset and once re-enabled.\n useEffect(() => {\n if (!autoFocus || disabled) return;\n const firstEmpty = digitsRef.current.findIndex((digit) => !digit);\n focusBox(firstEmpty === -1 ? length - 1 : firstEmpty);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoFocus, disabled, resetKey, length]);\n\n const handleChange = (index: number, event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n const { value, selectionStart } = event.target;\n const typed = onlyDigits(value);\n if (!typed) {\n const next = [...digitsRef.current];\n next[index] = \"\";\n update(next);\n return;\n }\n // A digit typed next to the one already in the box: keep the new one.\n if (digitsRef.current[index] && value.length === 2) {\n const inserted = value.charAt((selectionStart ?? value.length) - 1);\n if (/\\d/.test(inserted)) {\n fill(index, inserted);\n return;\n }\n }\n // One digit, or a whole code (browser autofill of the one-time code).\n fill(typed.length >= length ? 0 : index, typed);\n };\n\n const handleKeyDown = (index: number, event: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n switch (event.key) {\n case \"Backspace\": {\n event.preventDefault();\n const next = [...digitsRef.current];\n const target = next[index] ? index : Math.max(0, index - 1);\n next[target] = \"\";\n focusBox(target);\n update(next);\n return;\n }\n case \"Delete\": {\n event.preventDefault();\n const next = [...digitsRef.current];\n next[index] = \"\";\n update(next);\n return;\n }\n case \"ArrowLeft\":\n event.preventDefault();\n focusBox(index - 1);\n return;\n case \"ArrowRight\":\n event.preventDefault();\n focusBox(index + 1);\n return;\n case \"Home\":\n event.preventDefault();\n focusBox(0);\n return;\n case \"End\":\n event.preventDefault();\n focusBox(length - 1);\n return;\n }\n };\n\n const handlePaste = (index: number, event: React.ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault();\n if (disabled) return;\n const pasted = onlyDigits(event.clipboardData.getData(\"text\"));\n if (!pasted) return;\n fill(pasted.length >= length ? 0 : index, pasted);\n };\n\n return (\n // Codes stay left-to-right in RTL locales.\n <div\n dir=\"ltr\"\n role=\"group\"\n aria-label={groupLabel}\n data-testid=\"pin-code-input\"\n className={cn(\"flex justify-center gap-3\", invalid && \"animate-pin-shake\", className)}\n >\n {digits.map((digit, index) => (\n <input\n key={index}\n ref={(element) => {\n inputs.current[index] = element;\n }}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n autoComplete={index === 0 ? autoComplete : \"off\"}\n autoCorrect=\"off\"\n spellCheck={false}\n value={digit && masked ? MASK : digit}\n disabled={disabled}\n aria-label={digitLabel(index + 1, length)}\n aria-invalid={invalid || undefined}\n data-filled={!!digit}\n onChange={(event) => handleChange(index, event)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={(event) => handlePaste(index, event)}\n onFocus={(event) => event.target.select()}\n className={cn(\n \"h-14 w-12 rounded-lg border bg-white text-center text-2xl font-medium text-ews-gray-900 outline-none\",\n \"transition-colors focus:border-ews-primary focus:ring-2 focus:ring-ews-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n invalid ? \"border-ews-error\" : digit ? \"border-ews-primary\" : \"border-ews-gray-300\",\n disabled && digit && \"animate-pulse\",\n )}\n />\n ))}\n </div>\n );\n};\n\nexport type { PinCodeInputProps } from \"./PinCodeInput.types\";\nexport { PinCodeInput };\n","import React, { useId } from \"react\";\nimport { cn } from \"../../utils\";\n\n/**\n * A visible tooltip for an icon button (hover and keyboard focus), so users\n * know what the mic and the dictation buttons do. The button keeps its own\n * aria-label; the tooltip is tied to it with aria-describedby.\n */\nexport const ActionTooltip: React.FC<{\n label: string;\n children: (describedBy: string) => React.ReactNode;\n className?: string;\n}> = ({ label, children, className }) => {\n const id = useId();\n return (\n <span className={cn(\"group relative inline-flex\", className)}>\n {children(id)}\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n \"pointer-events-none absolute bottom-full start-1/2 z-50 mb-2 -translate-x-1/2 whitespace-nowrap rounded-md\",\n \"bg-ews-gray-900 px-2 py-1 text-xs font-medium text-white opacity-0 shadow transition-opacity duration-150\",\n \"group-hover:opacity-100 group-focus-within:opacity-100 rtl:translate-x-1/2\"\n )}\n >\n {label}\n </span>\n </span>\n );\n};\n","import { ArrowUp, Check, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getSpeechRecognition } from \"../../hooks/useSpeechRecognition\";\nimport { cn } from \"../../utils\";\nimport type { AssistantLanguage } from \"./AssistantChat.types\";\n\n/** Texts of the dictation bar; French defaults. */\nexport interface AssistantDictationTexts {\n cancel?: string;\n done?: string;\n send?: string;\n unavailable?: string;\n}\n\nconst DEFAULT_TEXTS: Required<AssistantDictationTexts> = {\n cancel: \"Annuler la dictée\",\n done: \"Terminer et modifier le texte\",\n send: \"Envoyer\",\n unavailable: \"Micro indisponible : autorisez-le (page https requise).\",\n};\n\nconst BCP47: Record<AssistantLanguage, string> = { fr: \"fr-FR\", en: \"en-US\", ar: \"ar-SA\" };\nconst BARS = 28;\nconst BLOCKING_ERRORS = new Set([\"not-allowed\", \"service-not-allowed\", \"audio-capture\"]);\n\ninterface DictationRecognition {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult: ((event: { results: ArrayLike<ArrayLike<{ transcript: string }>> }) => void) | null;\n onerror: ((event: { error?: string }) => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\nexport interface AssistantDictationBarProps {\n language: AssistantLanguage;\n /** ✕: nothing is kept. */\n onCancel: () => void;\n /** ✓: the transcript goes into the field to be edited. */\n onDone: (transcript: string) => void;\n /** ↑: the transcript is sent at once. */\n onSend: (transcript: string) => void;\n texts?: AssistantDictationTexts;\n className?: string;\n}\n\nconst formatElapsed = (seconds: number) => `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, \"0\")}`;\n\n/**\n * The recording bar of the mockup (audio3): cancel, a live waveform, the\n * elapsed time, done and send. Recording starts as soon as it shows. The\n * waveform follows the mic level when the browser gives it, and moves while\n * words come in otherwise.\n */\nexport const AssistantDictationBar: React.FC<AssistantDictationBarProps> = ({\n language,\n onCancel,\n onDone,\n onSend,\n texts,\n className,\n}) => {\n const t = { ...DEFAULT_TEXTS, ...texts };\n const [levels, setLevels] = useState<number[]>(() => Array(BARS).fill(0.15));\n const [elapsed, setElapsed] = useState(0);\n const [unavailable, setUnavailable] = useState(\n () => typeof window !== \"undefined\" && window.isSecureContext === false\n );\n const transcriptRef = useRef(\"\");\n const recognitionRef = useRef<DictationRecognition | null>(null);\n const actionRef = useRef<\"done\" | \"send\" | \"cancel\" | null>(null);\n const callbacks = useRef({ onCancel, onDone, onSend });\n callbacks.current = { onCancel, onDone, onSend };\n\n const pushLevel = useCallback((level: number) => {\n setLevels((current) => [...current.slice(1), Math.max(0.12, Math.min(1, level))]);\n }, []);\n\n const finish = useCallback(() => {\n const text = transcriptRef.current.trim();\n const action = actionRef.current;\n if (action === \"send\" && text) callbacks.current.onSend(text);\n else if (action === \"done\") callbacks.current.onDone(text);\n else callbacks.current.onCancel();\n }, []);\n\n // Speech recognition, from the first render.\n useEffect(() => {\n if (unavailable) return;\n const Ctor = getSpeechRecognition() as unknown as (new () => DictationRecognition) | undefined;\n if (!Ctor) {\n setUnavailable(true);\n return;\n }\n const recognition = new Ctor();\n recognition.lang = BCP47[language] ?? language;\n recognition.interimResults = true;\n recognition.continuous = true;\n recognition.onresult = (event) => {\n let text = \"\";\n for (let i = 0; i < event.results.length; i++) text += event.results[i][0]?.transcript ?? \"\";\n if (text.length !== transcriptRef.current.length) pushLevel(0.4 + Math.random() * 0.6);\n transcriptRef.current = text;\n };\n recognition.onerror = (event) => {\n if (event.error && BLOCKING_ERRORS.has(event.error)) {\n recognition.onend = null;\n recognitionRef.current = null;\n setUnavailable(true);\n }\n };\n recognition.onend = () => {\n if (recognitionRef.current !== recognition) return;\n recognitionRef.current = null;\n if (actionRef.current) finish();\n else {\n // The browser stopped after a silence: keep recording.\n try {\n recognition.start();\n recognitionRef.current = recognition;\n } catch {\n /* ignore: the user can still press done */\n }\n }\n };\n recognitionRef.current = recognition;\n recognition.start();\n return () => {\n recognition.onend = null;\n recognitionRef.current = null;\n recognition.abort();\n };\n }, [finish, language, pushLevel, unavailable]);\n\n // Live mic level for the waveform, where the browser allows it.\n useEffect(() => {\n if (unavailable || typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) return;\n const w = window as unknown as { AudioContext?: typeof AudioContext; webkitAudioContext?: typeof AudioContext };\n const AudioCtx = w.AudioContext ?? w.webkitAudioContext;\n if (!AudioCtx) return;\n let stream: MediaStream | null = null;\n let context: AudioContext | null = null;\n let frame = 0;\n let cancelled = false;\n navigator.mediaDevices\n .getUserMedia({ audio: true })\n .then((media) => {\n if (cancelled) {\n media.getTracks().forEach((track) => track.stop());\n return;\n }\n stream = media;\n context = new AudioCtx();\n const analyser = context.createAnalyser();\n analyser.fftSize = 256;\n context.createMediaStreamSource(media).connect(analyser);\n const data = new Uint8Array(analyser.frequencyBinCount);\n let last = 0;\n const tick = (now: number) => {\n if (now - last > 80) {\n analyser.getByteTimeDomainData(data);\n let peak = 0;\n for (const value of data) peak = Math.max(peak, Math.abs(value - 128));\n pushLevel(peak / 64);\n last = now;\n }\n frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return undefined;\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n cancelAnimationFrame(frame);\n stream?.getTracks().forEach((track) => track.stop());\n void context?.close();\n };\n }, [pushLevel, unavailable]);\n\n // Elapsed time.\n useEffect(() => {\n if (unavailable) return;\n const timer = setInterval(() => setElapsed((value) => value + 1), 1000);\n return () => clearInterval(timer);\n }, [unavailable]);\n\n const end = (action: \"done\" | \"send\" | \"cancel\") => {\n actionRef.current = action;\n const recognition = recognitionRef.current;\n if (!recognition || action === \"cancel\") {\n if (recognition) {\n recognition.onend = null;\n recognitionRef.current = null;\n recognition.abort();\n }\n finish();\n return;\n }\n // stop() delivers the last words, then onend calls finish().\n recognition.stop();\n };\n\n return (\n <div\n className={cn(\"flex w-full items-center gap-2 rounded-full bg-ews-gray-100 px-3 py-1.5\", className)}\n data-testid=\"assistant-dictation\"\n >\n <button\n type=\"button\"\n onClick={() => end(\"cancel\")}\n aria-label={t.cancel}\n title={t.cancel}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-ews-gray-600 hover:bg-ews-gray-200 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-dictation-cancel\"\n >\n <X className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n\n {unavailable ? (\n <p className=\"flex-1 truncate text-sm text-ews-error\" role=\"alert\" data-testid=\"assistant-dictation-unavailable\">\n {t.unavailable}\n </p>\n ) : (\n <>\n <div className=\"flex h-8 flex-1 items-center justify-center gap-[3px]\" aria-hidden=\"true\" data-testid=\"assistant-dictation-wave\">\n {levels.map((level, index) => (\n <span\n key={index}\n className=\"w-[3px] rounded-full bg-ews-gray-700 transition-[height] duration-100\"\n style={{ height: `${Math.round(level * 100)}%` }}\n />\n ))}\n </div>\n <span className=\"w-10 shrink-0 text-end text-sm tabular-nums text-ews-gray-600\" data-testid=\"assistant-dictation-time\">\n {formatElapsed(elapsed)}\n </span>\n </>\n )}\n\n <button\n type=\"button\"\n onClick={() => end(\"done\")}\n disabled={unavailable}\n aria-label={t.done}\n title={t.done}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-ews-gray-700 hover:bg-ews-gray-200 focus:outline-none focus:ring-2 focus:ring-ews-primary disabled:opacity-40\"\n data-testid=\"assistant-dictation-done\"\n >\n <Check className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={() => end(\"send\")}\n disabled={unavailable}\n aria-label={t.send}\n title={t.send}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-ews-primary text-white shadow-sm hover:bg-ews-primary-hover focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1 disabled:opacity-40\"\n data-testid=\"assistant-dictation-send\"\n >\n <ArrowUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </div>\n );\n};\n","import { AudioLines, Mic, SendHorizontal } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSpeechSupported } from \"../../hooks/useSpeechRecognition\";\nimport { cn } from \"../../utils\";\nimport { ActionTooltip } from \"./ActionTooltip\";\nimport { AssistantDictationBar, type AssistantDictationTexts } from \"./AssistantDictationBar\";\nimport type { AssistantLanguage } from \"./AssistantChat.types\";\n\nexport interface AssistantComposerProps {\n language: AssistantLanguage;\n onSend: (content: string) => void;\n disabled?: boolean;\n /** Mic and dictation buttons; hidden anyway where the browser has no speech API. */\n voice?: boolean;\n /** Mic click: opens the voice conversation. Without it the mic is not shown. */\n onVoice?: () => void;\n /** A text to put in the field from outside (e.g. a dictation done in the launcher bar). Each id once. */\n draft?: { id: string; content: string } | null;\n texts: {\n placeholder: string;\n hint: string;\n send: string;\n /** Mic: voice conversation (label and tooltip). */\n holdToTalk: string;\n listening: string;\n /** Waveform button: dictation (label and tooltip). French default. */\n dictate?: string;\n dictation?: AssistantDictationTexts;\n };\n className?: string;\n}\n\nexport const MAX_MESSAGE_LENGTH = 2000;\n\n/**\n * The composer of the mockup: textarea, hint, a dictation button (waveform:\n * a recording bar transcribes into the field), a mic (the voice conversation)\n * and send. Both voice buttons show a tooltip. Enter sends, Shift+Enter breaks.\n */\nexport const AssistantComposer: React.FC<AssistantComposerProps> = ({\n language,\n onSend,\n disabled = false,\n voice = true,\n onVoice,\n draft = null,\n texts,\n className,\n}) => {\n const [value, setValue] = useState(\"\");\n const [dictating, setDictating] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const speechSupported = useSpeechSupported();\n\n const submit = useCallback(\n (content: string) => {\n const trimmed = content.trim();\n if (!trimmed || disabled) return;\n onSend(trimmed.slice(0, MAX_MESSAGE_LENGTH));\n setValue(\"\");\n },\n [disabled, onSend]\n );\n\n const handledDraftRef = useRef<string | null>(null);\n useEffect(() => {\n if (!draft || draft.id === handledDraftRef.current) return;\n handledDraftRef.current = draft.id;\n setValue(draft.content.slice(0, MAX_MESSAGE_LENGTH));\n textareaRef.current?.focus();\n }, [draft]);\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit(value);\n }\n };\n\n const showVoice = voice && speechSupported;\n const dictateLabel = texts.dictate ?? \"Dicter un message\";\n\n // A plain div rather than a <form>: Enter and the send button submit, and a\n // form followed by a sibling trips React hydration under happy-dom (the apps'\n // server-rendering tests) although browsers are fine.\n return (\n <div className={cn(\"w-full\", className)}>\n {dictating ? (\n <AssistantDictationBar\n language={language}\n texts={texts.dictation}\n onCancel={() => setDictating(false)}\n onDone={(text) => {\n setDictating(false);\n if (text) setValue((current) => (current ? `${current} ${text}` : text).slice(0, MAX_MESSAGE_LENGTH));\n setTimeout(() => textareaRef.current?.focus(), 0);\n }}\n onSend={(text) => {\n setDictating(false);\n submit(value ? `${value} ${text}` : text);\n }}\n />\n ) : (\n <div\n className={cn(\n \"flex items-end gap-2 rounded-2xl border border-ews-gray-200 bg-white px-3 py-2 shadow-sm\",\n \"focus-within:border-ews-primary focus-within:ring-2 focus-within:ring-ews-primary/20\"\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n maxLength={MAX_MESSAGE_LENGTH}\n placeholder={texts.placeholder}\n aria-label={texts.placeholder}\n disabled={disabled}\n className=\"max-h-40 min-h-[2.5rem] flex-1 resize-none bg-transparent py-2 text-base text-ews-gray-900 placeholder:text-ews-gray-400 focus:outline-none disabled:opacity-60\"\n />\n {showVoice && (\n <ActionTooltip label={dictateLabel}>\n {(describedBy) => (\n <button\n type=\"button\"\n aria-label={dictateLabel}\n aria-describedby={describedBy}\n disabled={disabled}\n onClick={() => setDictating(true)}\n className=\"rounded-full p-2 text-ews-gray-500 transition-colors hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary disabled:opacity-50\"\n data-testid=\"assistant-dictate\"\n >\n <AudioLines className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n </ActionTooltip>\n )}\n {showVoice && onVoice && (\n <ActionTooltip label={texts.holdToTalk}>\n {(describedBy) => (\n <button\n type=\"button\"\n aria-label={texts.holdToTalk}\n aria-describedby={describedBy}\n disabled={disabled}\n onClick={onVoice}\n className=\"rounded-full p-2 text-ews-gray-500 transition-colors hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary disabled:opacity-50\"\n data-testid=\"assistant-mic\"\n >\n <Mic className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n </ActionTooltip>\n )}\n <button\n type=\"button\"\n onClick={() => submit(value)}\n aria-label={texts.send}\n title={texts.send}\n disabled={disabled || value.trim().length === 0}\n className=\"rounded-full bg-ews-primary p-2 text-white transition-colors hover:bg-ews-primary-hover focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1 disabled:opacity-40\"\n data-testid=\"assistant-send\"\n >\n <SendHorizontal className=\"h-5 w-5 rtl:-scale-x-100\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n <p className=\"mt-1.5 px-2 text-xs text-ews-gray-400\">{texts.hint}</p>\n </div>\n );\n};\n","import { ShieldCheck } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\nimport type { AssistantConfirmation } from \"./AssistantChat.types\";\n\nexport interface AssistantConfirmationCardProps {\n confirmation: AssistantConfirmation;\n onConfirm: (confirmation: AssistantConfirmation) => void;\n onCancel: (confirmation: AssistantConfirmation) => void;\n texts: { confirm: string; cancel: string };\n busy?: boolean;\n className?: string;\n}\n\n/**\n * Reserved for phase 2 (MED-1779): the card the assistant shows before a\n * write (booking, cancellation). Title, details, confirm and cancel wired to\n * the app, so phase 2 needs no component change.\n */\nexport const AssistantConfirmationCard: React.FC<AssistantConfirmationCardProps> = ({\n confirmation,\n onConfirm,\n onCancel,\n texts,\n busy = false,\n className,\n}) => (\n <section\n aria-label={confirmation.title}\n className={cn(\n \"rounded-xl border border-ews-primary/30 bg-ews-primary-light/30 p-4\",\n className\n )}\n data-testid=\"assistant-confirmation\"\n >\n <h3 className=\"flex items-center gap-2 font-semibold text-ews-gray-900\">\n <ShieldCheck className=\"h-5 w-5 text-ews-primary\" aria-hidden=\"true\" />\n {confirmation.title}\n </h3>\n <dl className=\"mt-3 grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n {confirmation.details.map((detail) => (\n <React.Fragment key={detail.label}>\n <dt className=\"text-ews-gray-500\">{detail.label}</dt>\n <dd className=\"font-medium text-ews-gray-900\">{detail.value}</dd>\n </React.Fragment>\n ))}\n </dl>\n <div className=\"mt-4 flex gap-2\">\n <Button size=\"sm\" loading={busy} onClick={() => onConfirm(confirmation)}>\n {texts.confirm}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={() => onCancel(confirmation)}>\n {texts.cancel}\n </Button>\n </div>\n </section>\n);\n","import { MessageSquare, SquarePen, UserRound } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantConversationSummary } from \"./AssistantChat.types\";\n\nexport interface AssistantConversationListProps {\n conversations: AssistantConversationSummary[];\n activeConversationId?: string | null;\n onSelect?: (conversationId: string) => void;\n onNew?: () => void;\n texts: {\n newConversation: string;\n recentConversations: string;\n signIn: string;\n signInHint: string;\n };\n signInHref?: string;\n className?: string;\n}\n\n/** Left column of the mockup: new discussion, recent ones, sign-in prompt at the bottom. */\nexport const AssistantConversationList: React.FC<AssistantConversationListProps> = ({\n conversations,\n activeConversationId,\n onSelect,\n onNew,\n texts,\n signInHref,\n className,\n}) => (\n <nav\n aria-label={texts.recentConversations}\n className={cn(\"flex h-full flex-col gap-4 bg-ews-gray-50 p-3\", className)}\n >\n <button\n type=\"button\"\n onClick={onNew}\n className=\"flex items-center gap-2 rounded-lg border border-ews-gray-200 bg-white px-3 py-2 text-sm font-medium text-ews-gray-800 hover:border-ews-primary hover:text-ews-primary\"\n >\n <SquarePen className=\"h-4 w-4\" aria-hidden=\"true\" />\n {texts.newConversation}\n </button>\n\n {conversations.length > 0 && (\n <ul className=\"flex-1 space-y-1 overflow-y-auto\" data-testid=\"assistant-conversation-list\">\n {conversations.map((conversation) => {\n const active = conversation.id === activeConversationId;\n return (\n <li key={conversation.id}>\n <button\n type=\"button\"\n onClick={() => onSelect?.(conversation.id)}\n aria-current={active ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center gap-2 truncate rounded-md px-2 py-1.5 text-start text-sm\",\n active\n ? \"bg-white font-medium text-ews-primary shadow-sm\"\n : \"text-ews-gray-700 hover:bg-white\"\n )}\n >\n <MessageSquare className=\"h-3.5 w-3.5 shrink-0 text-ews-gray-400\" aria-hidden=\"true\" />\n <span className=\"truncate\">{conversation.title}</span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {signInHref && (\n <a\n href={signInHref}\n className=\"mt-auto flex items-start gap-2 rounded-lg px-2 py-2 text-sm hover:bg-white\"\n >\n <span className=\"rounded-full bg-ews-primary-light p-1.5 text-ews-primary\" aria-hidden=\"true\">\n <UserRound className=\"h-4 w-4\" />\n </span>\n <span>\n <span className=\"block font-medium text-ews-gray-900\">{texts.signIn}</span>\n <span className=\"block text-xs text-ews-gray-500\">{texts.signInHint}</span>\n </span>\n </a>\n )}\n </nav>\n);\n","import React from \"react\";\n\n/**\n * The tiny markdown subset the assistant contract allows: paragraphs, bullet\n * lists, **bold** and [links](url). Everything else is plain text, so a\n * payload can never inject markup. Links to the current origin open in the\n * same tab (the host app may route them itself through `onLinkClick`);\n * links to other sites open in a new tab.\n */\nconst INLINE = /(\\*\\*[^*]+\\*\\*|\\[[^\\]]+\\]\\((?:https?:\\/\\/|\\/)[^)\\s]+\\))/g;\n\nexport interface AssistantMarkdownOptions {\n /**\n * Called when a link is clicked, before the browser follows it. Call\n * `event.preventDefault()` to navigate otherwise (e.g. the host router).\n */\n onLinkClick?: (href: string, event: React.MouseEvent<HTMLAnchorElement>) => void;\n /** Whether a link leaves the current site; such links open in a new tab. */\n isExternal?: (href: string) => boolean;\n}\n\n/** Absolute URL on another origin. Without a window (server rendering) every absolute URL counts as external. */\nexport function isExternalLink(href: string): boolean {\n if (!/^https?:\\/\\//i.test(href)) return false;\n if (typeof window === \"undefined\" || !window.location?.origin) return true;\n try {\n return new URL(href).origin !== window.location.origin;\n } catch {\n return true;\n }\n}\n\nfunction renderInline(text: string, keyPrefix: string, options: AssistantMarkdownOptions): React.ReactNode[] {\n const nodes: React.ReactNode[] = [];\n const isExternal = options.isExternal ?? isExternalLink;\n let last = 0;\n let index = 0;\n for (const match of text.matchAll(INLINE)) {\n const start = match.index ?? 0;\n if (start > last) nodes.push(text.slice(last, start));\n const token = match[0];\n if (token.startsWith(\"**\")) {\n // MED-1801: a bold run can hold a link, e.g. **[Dr Ba](/doctors/8)**.\n nodes.push(\n <strong key={`${keyPrefix}-b${index}`}>\n {renderInline(token.slice(2, -2), `${keyPrefix}-b${index}`, options)}\n </strong>\n );\n } else {\n const close = token.indexOf(\"](\");\n const label = token.slice(1, close);\n const href = token.slice(close + 2, -1);\n const external = isExternal(href);\n nodes.push(\n <a\n key={`${keyPrefix}-a${index}`}\n href={href}\n className=\"font-medium text-ews-primary underline underline-offset-2 hover:text-ews-primary-hover\"\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n onClick={options.onLinkClick ? (event) => options.onLinkClick?.(href, event) : undefined}\n >\n {label}\n </a>\n );\n }\n last = start + token.length;\n index++;\n }\n if (last < text.length) nodes.push(text.slice(last));\n return nodes;\n}\n\nexport function renderAssistantMarkdown(\n content: string,\n options: AssistantMarkdownOptions = {}\n): React.ReactNode[] {\n const blocks = content.replace(/\\r\\n/g, \"\\n\").split(/\\n{2,}/);\n const out: React.ReactNode[] = [];\n blocks.forEach((block, blockIndex) => {\n const lines = block.split(\"\\n\").filter((line) => line.trim().length > 0);\n if (lines.length === 0) return;\n const isList = lines.every((line) => /^\\s*[-*•]\\s+/.test(line));\n if (isList) {\n out.push(\n <ul key={`l${blockIndex}`} className=\"my-2 list-disc space-y-1 ps-5\">\n {lines.map((line, lineIndex) => (\n <li key={lineIndex}>\n {renderInline(line.replace(/^\\s*[-*•]\\s+/, \"\"), `l${blockIndex}-${lineIndex}`, options)}\n </li>\n ))}\n </ul>\n );\n } else {\n out.push(\n <p key={`p${blockIndex}`} className=\"my-2 first:mt-0 last:mb-0\">\n {lines.map((line, lineIndex) => (\n <React.Fragment key={lineIndex}>\n {lineIndex > 0 && <br />}\n {renderInline(line, `p${blockIndex}-${lineIndex}`, options)}\n </React.Fragment>\n ))}\n </p>\n );\n }\n });\n return out;\n}\n","import { AlertCircle, Loader2, RotateCcw } from \"lucide-react\";\nimport React, { useEffect, useRef } from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantMessage } from \"./AssistantChat.types\";\nimport { renderAssistantMarkdown } from \"./assistantMarkdown\";\nimport type { AssistantMarkdownOptions } from \"./assistantMarkdown\";\n\nexport interface AssistantMessagesProps {\n messages: AssistantMessage[];\n /** The tool activity line shown under the streaming answer, e.g. \"Recherche de médecins…\". */\n activity?: string | null;\n onRetry?: (message: AssistantMessage) => void;\n texts: { thinking: string; retry: string; sources: string; brandName: string };\n /** Link handling of the answers (same-tab navigation through the host router). */\n linkOptions?: AssistantMarkdownOptions;\n className?: string;\n}\n\n/** The thread: user bubbles on the end side, assistant answers on the start side, auto-scrolled. */\nexport const AssistantMessages: React.FC<AssistantMessagesProps> = ({\n messages,\n activity,\n onRetry,\n texts,\n linkOptions,\n className,\n}) => {\n const endRef = useRef<HTMLDivElement>(null);\n const last = messages[messages.length - 1];\n\n useEffect(() => {\n endRef.current?.scrollIntoView?.({ block: \"end\" });\n }, [messages.length, last?.content, activity]);\n\n return (\n <div\n className={cn(\"flex flex-col gap-4\", className)}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n data-testid=\"assistant-messages\"\n >\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n return (\n <div\n key={message.id}\n className={cn(\"flex\", isUser ? \"justify-end\" : \"justify-start\")}\n data-testid={`assistant-message-${message.role}`}\n >\n <div\n className={cn(\n \"max-w-[85%] rounded-2xl px-4 py-3 text-base leading-relaxed\",\n isUser\n ? \"rounded-ee-md bg-ews-primary text-white\"\n : \"rounded-es-md bg-ews-gray-100 text-ews-gray-900\"\n )}\n >\n {isUser ? (\n <p className=\"whitespace-pre-wrap\">{message.content}</p>\n ) : (\n <>\n {message.content.length > 0 && renderAssistantMarkdown(message.content, linkOptions)}\n {message.status === \"streaming\" && message.content.length === 0 && (\n <span className=\"flex items-center gap-2 text-ews-gray-500\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {texts.thinking}\n </span>\n )}\n {message.status === \"streaming\" && activity && (\n <p className=\"mt-2 flex items-center gap-2 text-sm text-ews-gray-500\" data-testid=\"assistant-activity\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden=\"true\" />\n {activity}\n </p>\n )}\n {message.citations && message.citations.length > 0 && (\n <p className=\"mt-3 border-t border-ews-gray-200 pt-2 text-xs text-ews-gray-500\">\n <span className=\"font-medium\">{texts.sources}: </span>\n {message.citations.map((citation, index) => (\n <React.Fragment key={`${citation.url}-${index}`}>\n {index > 0 && \", \"}\n <a\n href={citation.url}\n className=\"underline underline-offset-2 hover:text-ews-primary\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {citation.title}\n </a>\n </React.Fragment>\n ))}\n </p>\n )}\n {message.status === \"error\" && message.error && (\n <div\n role=\"alert\"\n className=\"mt-2 flex flex-wrap items-center gap-2 text-sm text-ews-error\"\n data-testid=\"assistant-error\"\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span>{message.error.message}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={() => onRetry(message)}\n className=\"inline-flex items-center gap-1 rounded-md border border-ews-error/40 px-2 py-0.5 font-medium hover:bg-ews-error/10\"\n >\n <RotateCcw className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {texts.retry}\n </button>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n })}\n <div ref={endRef} />\n </div>\n );\n};\n","import { ArrowRight, Sparkles } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../../utils\";\nimport type { AssistantSuggestion } from \"./AssistantChat.types\";\n\nexport interface AssistantSuggestionCardProps {\n suggestion: AssistantSuggestion;\n onSelect: (suggestion: AssistantSuggestion) => void;\n exampleLabel: string;\n disabled?: boolean;\n className?: string;\n}\n\n/** One of the cards under the hero (mockups med1 and tools): icon, title, description, sent as a prompt on click. */\nexport const AssistantSuggestionCard: React.FC<AssistantSuggestionCardProps> = ({\n suggestion,\n onSelect,\n exampleLabel,\n disabled = false,\n className,\n}) => {\n const isExample = suggestion.kind === \"example\";\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(suggestion)}\n className={cn(\n // A soft grey card without border (mockup tools); it lifts with a shadow on hover.\n \"flex h-full w-full flex-col items-start gap-2 rounded-2xl bg-ews-gray-100 p-4 text-start transition-[background-color,box-shadow]\",\n \"hover:bg-ews-gray-50 hover:shadow-lg focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n className\n )}\n data-testid={`assistant-suggestion-${suggestion.id}`}\n >\n <span className=\"mb-2 text-ews-gray-600\" aria-hidden=\"true\">\n {suggestion.icon ?? (isExample ? <Sparkles className=\"h-4 w-4\" /> : <ArrowRight className=\"h-4 w-4\" />)}\n </span>\n <span className=\"font-semibold leading-snug text-ews-gray-900\">{suggestion.title}</span>\n {suggestion.description && (\n <span className=\"text-sm leading-snug text-ews-gray-400\">{suggestion.description}</span>\n )}\n {isExample && (\n <span className=\"mt-auto text-xs uppercase tracking-wide text-ews-gray-400\">{exampleLabel}</span>\n )}\n </button>\n );\n};\n","import { Mic, MicOff } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getSpeechRecognition } from \"../../hooks/useSpeechRecognition\";\nimport { cn } from \"../../utils\";\nimport type { AssistantLanguage, AssistantMessage } from \"./AssistantChat.types\";\n\n/** Texts of the voice mode; every field has a French default. */\nexport interface AssistantVoiceModeTexts {\n title?: string;\n listening?: string;\n thinking?: string;\n speaking?: string;\n muted?: string;\n mute?: string;\n unmute?: string;\n end?: string;\n /** Shown when the browser refuses the mic (permission denied, or the page is not https). */\n unavailable?: string;\n}\n\nconst DEFAULT_TEXTS: Required<AssistantVoiceModeTexts> = {\n title: \"Conversation vocale avec Medecine360\",\n listening: \"À l'écoute…\",\n thinking: \"Réflexion…\",\n speaking: \"Réponse…\",\n muted: \"Micro coupé\",\n mute: \"Couper le micro\",\n unmute: \"Réactiver le micro\",\n end: \"Terminer\",\n unavailable:\n \"Le micro n'est pas accessible. Autorisez-le dans le navigateur ; il ne fonctionne que sur une page sécurisée (https).\",\n};\n\n/** Errors after which listening again cannot work until the user acts. */\nconst BLOCKING_ERRORS = new Set([\"not-allowed\", \"service-not-allowed\", \"audio-capture\"]);\n\nconst BCP47: Record<AssistantLanguage, string> = { fr: \"fr-FR\", en: \"en-US\", ar: \"ar-SA\" };\n\n/** The recognition events the voice mode reads (final vs interim results). */\ninterface VoiceRecognition {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n onresult:\n | ((event: { resultIndex?: number; results: ArrayLike<ArrayLike<{ transcript: string }> & { isFinal?: boolean }> }) => void)\n | null;\n onerror: ((event: { error?: string }) => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\n/** Markdown and links read aloud as plain words. */\nexport function toSpokenText(markdown: string): string {\n return markdown\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/https?:\\/\\/\\S+/g, \"\")\n .replace(/\\*\\*/g, \"\")\n .replace(/^\\s*[-*•]\\s+/gm, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport interface AssistantVoiceModeProps {\n language: AssistantLanguage;\n /** The conversation: the screen shows the turns spoken since it opened. */\n messages: AssistantMessage[];\n /** True while the assistant is answering: the mic waits. */\n busy: boolean;\n onSend: (content: string) => void;\n onClose: () => void;\n texts?: AssistantVoiceModeTexts;\n /** Read answers aloud with the browser speech synthesis. Default true where available. */\n speak?: boolean;\n}\n\ntype Phase = \"listening\" | \"thinking\" | \"speaking\" | \"muted\" | \"unavailable\";\n\n/**\n * MED-1801 (voice): the voice conversation screen of the mockup. Listening\n * starts as soon as it opens; a finished sentence is sent to the same\n * conversation; the mic pauses while the assistant answers (read aloud when\n * the browser can) and resumes after. Mute stops the mic; Terminer closes.\n */\nexport const AssistantVoiceMode: React.FC<AssistantVoiceModeProps> = ({\n language,\n messages,\n busy,\n onSend,\n onClose,\n texts,\n speak = true,\n}) => {\n const t = { ...DEFAULT_TEXTS, ...texts };\n const [muted, setMuted] = useState(false);\n const [speaking, setSpeaking] = useState(false);\n const [interim, setInterim] = useState(\"\");\n // The mic cannot work: insecure page (http) or permission refused.\n const [unavailable, setUnavailable] = useState(\n () => typeof window !== \"undefined\" && window.isSecureContext === false\n );\n const recognitionRef = useRef<VoiceRecognition | null>(null);\n const restartTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const sentRef = useRef(false);\n // Only the turns of this voice session are shown.\n const [firstIndex] = useState(messages.length);\n const spokenRef = useRef<string | null>(null);\n const callbacks = useRef({ onSend });\n callbacks.current = { onSend };\n\n const stopListening = useCallback(() => {\n if (restartTimerRef.current) clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n const recognition = recognitionRef.current;\n recognitionRef.current = null;\n if (recognition) {\n recognition.onend = null;\n recognition.abort();\n }\n }, []);\n\n const startListening = useCallback(() => {\n const Ctor = getSpeechRecognition() as unknown as (new () => VoiceRecognition) | undefined;\n if (!Ctor || recognitionRef.current) return;\n const recognition = new Ctor();\n recognition.lang = BCP47[language] ?? language;\n recognition.interimResults = true;\n recognition.continuous = true;\n sentRef.current = false;\n recognition.onresult = (event) => {\n let text = \"\";\n let final = false;\n for (let i = 0; i < event.results.length; i++) {\n text += event.results[i][0]?.transcript ?? \"\";\n if (event.results[i].isFinal) final = true;\n }\n const trimmed = text.trim();\n setInterim(trimmed);\n if (final && trimmed && !sentRef.current) {\n sentRef.current = true;\n setInterim(\"\");\n recognitionRef.current = null;\n recognition.onend = null;\n recognition.stop();\n callbacks.current.onSend(trimmed);\n }\n };\n recognition.onerror = (event) => {\n // Permission refused or no mic: stop here and say so, never retry in a loop.\n if (event.error && BLOCKING_ERRORS.has(event.error)) {\n recognitionRef.current = null;\n recognition.onend = null;\n setUnavailable(true);\n }\n /* other errors (no-speech, network): onend follows and listens again */\n };\n recognition.onend = () => {\n // The browser ends recognition after a silence: listen again, a moment later.\n if (recognitionRef.current === recognition) {\n recognitionRef.current = null;\n restartTimerRef.current = setTimeout(() => startListeningRef.current(), 250);\n }\n };\n recognitionRef.current = recognition;\n recognition.start();\n }, [language]);\n const startListeningRef = useRef(startListening);\n startListeningRef.current = startListening;\n\n const last = messages[messages.length - 1];\n const canSpeak = speak && typeof window !== \"undefined\" && \"speechSynthesis\" in window;\n\n // Read the finished answer aloud, once.\n useEffect(() => {\n if (busy || !last || last.role !== \"assistant\" || last.status === \"streaming\") return;\n if (messages.length <= firstIndex || spokenRef.current === last.id) return;\n spokenRef.current = last.id;\n const text = toSpokenText(last.content);\n if (!canSpeak || !text) return;\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.lang = BCP47[language] ?? language;\n utterance.onend = () => setSpeaking(false);\n utterance.onerror = () => setSpeaking(false);\n setSpeaking(true);\n window.speechSynthesis.speak(utterance);\n }, [busy, canSpeak, firstIndex, language, last, messages.length]);\n\n // Listen whenever nobody else is talking.\n const shouldListen = !muted && !busy && !speaking && !unavailable;\n useEffect(() => {\n if (shouldListen) startListening();\n else stopListening();\n }, [shouldListen, startListening, stopListening]);\n\n useEffect(\n () => () => {\n stopListening();\n if (typeof window !== \"undefined\" && \"speechSynthesis\" in window) window.speechSynthesis.cancel();\n },\n [stopListening]\n );\n\n const phase: Phase = unavailable\n ? \"unavailable\"\n : muted\n ? \"muted\"\n : busy\n ? \"thinking\"\n : speaking\n ? \"speaking\"\n : \"listening\";\n const status = {\n listening: t.listening,\n thinking: t.thinking,\n speaking: t.speaking,\n muted: t.muted,\n unavailable: t.unavailable,\n }[phase];\n const turns = messages.slice(firstIndex).filter((message) => message.content.trim().length > 0);\n\n return (\n <div\n dir={language === \"ar\" ? \"rtl\" : \"ltr\"}\n className=\"absolute inset-0 z-30 flex flex-col bg-white\"\n role=\"dialog\"\n aria-label={t.title}\n data-phase={phase}\n data-testid=\"assistant-voice-mode\"\n >\n <div className=\"flex items-center gap-2 px-5 pt-4 text-sm text-ews-gray-600\">\n <span className=\"h-2 w-2 rounded-full bg-emerald-500\" aria-hidden=\"true\" />\n {t.title}\n </div>\n\n <div className=\"flex flex-col items-center gap-3 pt-8\">\n <div\n className={cn(\n \"h-32 w-32 rounded-full shadow-[0_0_60px_rgba(33,89,108,0.35)] transition-transform duration-700\",\n \"bg-[radial-gradient(circle_at_30%_25%,#ffffff_0%,#c0d0d4_35%,#21596c_75%,#1a4756_100%)]\",\n phase === \"listening\" && \"animate-pulse\",\n phase === \"speaking\" && \"scale-110\",\n (phase === \"muted\" || phase === \"unavailable\") && \"opacity-50\"\n )}\n aria-hidden=\"true\"\n data-testid=\"assistant-voice-orb\"\n />\n <p\n className={cn(\"max-w-xs px-4 text-center text-sm\", phase === \"unavailable\" ? \"text-ews-error\" : \"text-ews-gray-500\")}\n role={phase === \"unavailable\" ? \"alert\" : undefined}\n aria-live=\"polite\"\n data-testid=\"assistant-voice-status\"\n >\n {status}\n </p>\n </div>\n\n <div className=\"flex-1 space-y-3 overflow-y-auto px-5 py-6\" data-testid=\"assistant-voice-transcript\">\n {turns.map((message) => (\n <div key={message.id} className={cn(\"flex\", message.role === \"user\" ? \"justify-end\" : \"justify-start\")}>\n <p\n className={cn(\n \"max-w-[85%] rounded-2xl px-4 py-2 text-sm\",\n message.role === \"user\" ? \"bg-ews-gray-100 text-ews-gray-800\" : \"bg-ews-primary-light/40 text-ews-gray-900\"\n )}\n >\n {message.role === \"assistant\" ? toSpokenText(message.content) : message.content}\n </p>\n </div>\n ))}\n {interim && (\n <div className=\"flex justify-end\">\n <p className=\"max-w-[85%] rounded-2xl bg-ews-gray-100 px-4 py-2 text-sm italic text-ews-gray-500\" data-testid=\"assistant-voice-interim\">\n {interim}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-center gap-3 pb-6\">\n <button\n type=\"button\"\n disabled={unavailable}\n onClick={() => setMuted((value) => !value)}\n aria-pressed={muted}\n aria-label={muted ? t.unmute : t.mute}\n title={muted ? t.unmute : t.mute}\n className=\"flex h-11 w-11 items-center justify-center rounded-full border border-ews-gray-200 text-ews-gray-600 hover:bg-ews-gray-50 disabled:opacity-40\"\n data-testid=\"assistant-voice-mute\"\n >\n {muted ? <MicOff className=\"h-5 w-5\" aria-hidden=\"true\" /> : <Mic className=\"h-5 w-5\" aria-hidden=\"true\" />}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-full bg-red-600 px-6 py-2.5 text-sm font-semibold text-white shadow hover:bg-red-700\"\n data-testid=\"assistant-voice-end\"\n >\n {t.end}\n </button>\n </div>\n </div>\n );\n};\n","import { History, SquarePen } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn, generateId } from \"../../utils\";\nimport type {\n AssistantChatProps,\n AssistantConversationSummary,\n AssistantEvent,\n AssistantMessage,\n} from \"./AssistantChat.types\";\nimport { AssistantComposer } from \"./AssistantComposer\";\nimport { AssistantConfirmationCard } from \"./AssistantConfirmationCard\";\nimport { AssistantConversationList } from \"./AssistantConversationList\";\nimport { AssistantMessages } from \"./AssistantMessages\";\nimport { AssistantSuggestionCard } from \"./AssistantSuggestionCard\";\nimport { AssistantVoiceMode } from \"./AssistantVoiceMode\";\n\nconst DIRECTION: Record<AssistantChatProps[\"language\"], \"ltr\" | \"rtl\"> = {\n fr: \"ltr\",\n en: \"ltr\",\n ar: \"rtl\",\n};\n\n/** A conversation title is its first message, cut like the mockup's sidebar. */\nexport function conversationTitle(firstMessage: string, max = 60): string {\n const oneLine = firstMessage.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}…` : oneLine;\n}\n\n/**\n * The chat home of the Medecine360 assistant (MED-1783, mockup med1):\n * conversation list, header with brand badge, hero with suggestion cards,\n * streamed thread, composer with push-to-talk. UI only: the app provides the\n * transport, the texts, the conversation memory and the links.\n *\n * Server-rendering safe: nothing touches `window` at render time, the\n * speech API is detected after mount.\n */\nexport const AssistantChat: React.FC<AssistantChatProps> = ({\n transport,\n language,\n texts,\n suggestions,\n conversations = [],\n activeConversationId = null,\n initialMessages,\n onConversationCreated,\n onSelectConversation,\n onNewConversation,\n signInHref,\n headerAction,\n disclaimer,\n heroBackground,\n heroLogo,\n voice = true,\n pendingConfirmation = null,\n onConfirm,\n onCancelConfirmation,\n layout = \"page\",\n queuedPrompt = null,\n voiceRequest = null,\n composerDraft = null,\n onNavigate,\n historyOpen = false,\n onHistoryOpenChange,\n className,\n}) => {\n const [messages, setMessages] = useState<AssistantMessage[]>(initialMessages ?? []);\n const [activity, setActivity] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const conversationIdRef = useRef<string | null>(activeConversationId);\n const abortRef = useRef<AbortController | null>(null);\n\n // The app switched conversation: show its messages and talk to it from now on.\n // Not when the app merely echoes the id this component just created (send()\n // already set the ref): the thread in progress must stay on screen.\n useEffect(() => {\n if (conversationIdRef.current === activeConversationId) return;\n conversationIdRef.current = activeConversationId;\n setMessages(initialMessages ?? []);\n setActivity(null);\n }, [activeConversationId, initialMessages]);\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const patchMessage = useCallback((id: string, patch: (message: AssistantMessage) => AssistantMessage) => {\n setMessages((current) => current.map((message) => (message.id === id ? patch(message) : message)));\n }, []);\n\n const applyEvent = useCallback(\n (assistantId: string, event: AssistantEvent) => {\n switch (event.type) {\n case \"message_start\":\n patchMessage(assistantId, (message) => ({ ...message, id: event.messageId || message.id }));\n return event.messageId || assistantId;\n case \"text_delta\":\n patchMessage(assistantId, (message) => ({ ...message, content: message.content + event.text }));\n return assistantId;\n case \"tool_call\":\n setActivity(event.status === \"started\" ? event.label : null);\n return assistantId;\n case \"citation\":\n patchMessage(assistantId, (message) => ({\n ...message,\n citations: [...(message.citations ?? []), { title: event.title, url: event.url }],\n }));\n return assistantId;\n case \"message_end\":\n setActivity(null);\n patchMessage(assistantId, (message) => ({ ...message, status: \"done\" }));\n return assistantId;\n case \"error\":\n setActivity(null);\n patchMessage(assistantId, (message) => ({\n ...message,\n status: \"error\",\n error: {\n message:\n event.code === \"RATE_LIMITED\" && event.retryAfterSeconds\n ? texts.rateLimited(event.retryAfterSeconds)\n : event.message || texts.genericError,\n retryAfterSeconds: event.retryAfterSeconds,\n },\n }));\n return assistantId;\n default:\n return assistantId;\n }\n },\n [patchMessage, texts]\n );\n\n const send = useCallback(\n async (content: string) => {\n if (busy) return false;\n setBusy(true);\n const userMessage: AssistantMessage = { id: generateId(\"u\"), role: \"user\", content };\n let assistantId = generateId(\"a\");\n setMessages((current) => [\n ...current,\n userMessage,\n { id: assistantId, role: \"assistant\", content: \"\", status: \"streaming\" },\n ]);\n const controller = new AbortController();\n abortRef.current = controller;\n try {\n if (!conversationIdRef.current) {\n const created = await transport.startConversation(language);\n conversationIdRef.current = created.id;\n const summary: AssistantConversationSummary = {\n id: created.id,\n title: conversationTitle(content),\n createdAt: new Date().toISOString(),\n };\n onConversationCreated?.(summary);\n }\n for await (const event of transport.sendMessage(conversationIdRef.current, content, {\n signal: controller.signal,\n })) {\n assistantId = applyEvent(assistantId, event);\n }\n } catch (error) {\n setActivity(null);\n patchMessage(assistantId, (message) => ({\n ...message,\n status: \"error\",\n error: { message: error instanceof Error && error.message ? error.message : texts.genericError },\n }));\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n return true;\n },\n [applyEvent, busy, language, onConversationCreated, patchMessage, texts.genericError, transport]\n );\n\n // A prompt queued from outside (the launcher bar) is sent once, as soon as\n // the component is free.\n const handledPromptRef = useRef<string | null>(null);\n useEffect(() => {\n if (!queuedPrompt || queuedPrompt.id === handledPromptRef.current || busy) return;\n handledPromptRef.current = queuedPrompt.id;\n void send(queuedPrompt.content);\n }, [busy, queuedPrompt, send]);\n\n // Voice conversation screen, opened by the mic (here or in the launcher bar).\n const [voiceOpen, setVoiceOpen] = useState(false);\n const handledVoiceRef = useRef<string | null>(null);\n useEffect(() => {\n if (!voiceRequest || voiceRequest.id === handledVoiceRef.current) return;\n handledVoiceRef.current = voiceRequest.id;\n setVoiceOpen(true);\n }, [voiceRequest]);\n\n /** Retry re-sends the user message that preceded the failed answer. */\n const retry = useCallback(\n (failed: AssistantMessage) => {\n const index = messages.findIndex((message) => message.id === failed.id);\n const previous = index > 0 ? messages[index - 1] : undefined;\n if (!previous || previous.role !== \"user\") return;\n setMessages((current) => current.filter((message) => message.id !== failed.id && message.id !== previous.id));\n void send(previous.content);\n },\n [messages, send]\n );\n\n const startNewConversation = useCallback(() => {\n abortRef.current?.abort();\n conversationIdRef.current = null;\n setMessages([]);\n setActivity(null);\n onNewConversation?.();\n }, [onNewConversation]);\n\n const empty = messages.length === 0;\n const dir = DIRECTION[language];\n // panel: one compact column; wide: the slide-over expanded, list beside the thread.\n const compact = layout === \"panel\";\n const withList = layout !== \"panel\";\n const historyLabel = texts.history ?? texts.recentConversations;\n\n return (\n <div\n dir={dir}\n lang={language}\n className={cn(\n \"relative overflow-hidden bg-white\",\n layout === \"page\" && \"grid min-h-[36rem] grid-cols-1 rounded-2xl border border-ews-gray-200 shadow-sm md:grid-cols-[16rem_1fr]\",\n layout === \"wide\" && \"grid h-full min-h-0 grid-cols-1 md:grid-cols-[16rem_1fr]\",\n compact && \"relative flex h-full min-h-0 flex-col\",\n className\n )}\n data-layout={layout}\n data-testid=\"assistant-chat\"\n >\n {withList && (\n <AssistantConversationList\n conversations={conversations}\n activeConversationId={activeConversationId}\n onSelect={onSelectConversation}\n onNew={startNewConversation}\n texts={texts}\n signInHref={signInHref}\n className=\"hidden border-e border-ews-gray-200 md:flex\"\n />\n )}\n\n {compact && historyOpen && (\n <div className=\"absolute inset-0 z-10 flex\" data-testid=\"assistant-history\">\n <AssistantConversationList\n conversations={conversations}\n activeConversationId={activeConversationId}\n onSelect={(id) => {\n onSelectConversation?.(id);\n onHistoryOpenChange?.(false);\n }}\n onNew={() => {\n startNewConversation();\n onHistoryOpenChange?.(false);\n }}\n texts={texts}\n signInHref={signInHref}\n className=\"w-72 max-w-full border-e border-ews-gray-200 shadow-xl\"\n />\n <div\n className=\"flex-1 bg-black/20\"\n onClick={() => onHistoryOpenChange?.(false)}\n data-testid=\"assistant-history-overlay\"\n />\n </div>\n )}\n\n <div className=\"relative flex min-h-0 min-w-0 flex-1 flex-col\">\n <header className=\"flex items-center justify-between gap-3 border-b border-ews-gray-200 px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-ews-primary text-sm font-bold text-white\" aria-hidden=\"true\">\n {texts.brandName.charAt(0)}\n </span>\n <span className=\"truncate font-semibold text-ews-gray-900\">{texts.brandName}</span>\n <span className=\"rounded-full bg-ews-gray-100 px-2 py-0.5 text-xs font-medium text-ews-gray-600\">AI</span>\n <span className=\"flex items-center gap-1 text-xs text-ews-gray-500\">\n <span className=\"h-2 w-2 rounded-full bg-ews-success\" aria-hidden=\"true\" />\n {texts.online}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {compact && onHistoryOpenChange && (\n <button\n type=\"button\"\n onClick={() => onHistoryOpenChange(!historyOpen)}\n aria-label={historyLabel}\n aria-pressed={historyOpen}\n title={historyLabel}\n className={cn(\n \"rounded-full p-2 hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary\",\n historyOpen ? \"bg-ews-gray-100 text-ews-primary\" : \"text-ews-gray-500\"\n )}\n data-testid=\"assistant-history-toggle\"\n >\n <History className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n )}\n {!withList && !empty && (\n <button\n type=\"button\"\n onClick={startNewConversation}\n aria-label={texts.newConversation}\n title={texts.newConversation}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-new-conversation\"\n >\n <SquarePen className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n )}\n {headerAction}\n </div>\n </header>\n\n <div className=\"flex flex-1 flex-col overflow-y-auto\">\n {empty ? (\n <>\n <section\n className={cn(\n \"relative overflow-hidden bg-ews-primary-light text-center\",\n // Extra bottom room: the white sheet of cards overlaps the hero (mockup tools).\n compact ? \"px-4 pb-20 pt-10\" : \"px-6 pb-24 pt-14\"\n )}\n >\n {heroBackground && <div className=\"absolute inset-0\" aria-hidden=\"true\">{heroBackground}</div>}\n <div className=\"relative\">\n {heroLogo && (\n <div className=\"mb-4 flex justify-center\" data-testid=\"assistant-hero-logo\">\n {heroLogo}\n </div>\n )}\n <h2 className={cn(\"font-bold text-ews-gray-900\", compact ? \"text-xl\" : \"text-2xl sm:text-3xl\")}>\n {texts.heroTitle}\n </h2>\n <p className={cn(\"mx-auto mt-4 max-w-xl text-ews-gray-700\", compact && \"text-sm\")}>\n {texts.heroSubtitle}\n </p>\n </div>\n </section>\n <div\n // A white sheet rounded on top, slid over the bottom of the hero, holding the cards.\n className={cn(\n \"relative -mt-6 grid flex-1 content-start gap-3 rounded-t-3xl bg-white px-4 py-5\",\n compact ? \"grid-cols-2\" : \"grid-cols-2 lg:grid-cols-4\"\n )}\n data-testid=\"assistant-suggestions\"\n >\n {suggestions.map((suggestion) => (\n <AssistantSuggestionCard\n key={suggestion.id}\n suggestion={suggestion}\n onSelect={(selected) => void send(selected.prompt)}\n exampleLabel={texts.exampleLabel}\n disabled={busy}\n />\n ))}\n </div>\n </>\n ) : (\n <div className=\"flex-1 px-4 py-5\">\n <AssistantMessages\n messages={messages}\n activity={activity}\n onRetry={retry}\n texts={texts}\n linkOptions={\n onNavigate\n ? {\n onLinkClick: (href, event) => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey) return;\n if (onNavigate(href) === true) event.preventDefault();\n },\n }\n : undefined\n }\n />\n {pendingConfirmation && onConfirm && onCancelConfirmation && (\n <AssistantConfirmationCard\n confirmation={pendingConfirmation}\n onConfirm={onConfirm}\n onCancel={onCancelConfirmation}\n texts={texts}\n className=\"mt-4\"\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-ews-gray-200 px-4 pb-3 pt-3\">\n <AssistantComposer\n language={language}\n onSend={(content) => void send(content)}\n disabled={busy}\n voice={voice}\n onVoice={() => setVoiceOpen(true)}\n draft={composerDraft}\n texts={{\n dictate: texts.dictate,\n dictation: texts.dictation,\n placeholder: texts.composerPlaceholder,\n hint: texts.composerHint,\n send: texts.send,\n holdToTalk: texts.holdToTalk,\n listening: texts.listening,\n }}\n />\n {disclaimer && <div className=\"mt-2 px-2 text-xs text-ews-gray-500\">{disclaimer}</div>}\n </div>\n {/* In the thread column, so the conversation list stays visible beside it in the wide layouts. */}\n {voiceOpen && (\n <AssistantVoiceMode\n language={language}\n messages={messages}\n busy={busy}\n onSend={(content) => void send(content)}\n onClose={() => setVoiceOpen(false)}\n texts={texts.voiceMode}\n />\n )}\n </div>\n </div>\n );\n};\n","import type { AssistantConversationSummary } from \"../components/AssistantChat/AssistantChat.types\";\n\n/**\n * Anonymous memory of the assistant, in the browser only (MED-1784, shared by\n * every app since MED-1787): a stable client id and the conversations started\n * here, newest first. Nothing is sent to a server to list them; signing in\n * (phase 2) will attach them to the account.\n */\nexport const ASSISTANT_CLIENT_ID_KEY = \"assistant.clientId\";\nexport const ASSISTANT_CONVERSATIONS_KEY = \"assistant.conversations\";\nexport const ASSISTANT_MAX_CONVERSATIONS = 20;\n\nexport type AssistantStorage = Pick<Storage, \"getItem\" | \"setItem\">;\n\nfunction storage(): AssistantStorage | null {\n try {\n return typeof window !== \"undefined\" ? window.localStorage : null;\n } catch {\n return null;\n }\n}\n\nfunction randomId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `c-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** The browser's client id, created on first use. A fresh id per page when storage is unavailable. */\nexport function getAssistantClientId(store: AssistantStorage | null = storage()): string {\n const existing = store?.getItem(ASSISTANT_CLIENT_ID_KEY);\n if (existing) return existing;\n const id = randomId();\n try {\n store?.setItem(ASSISTANT_CLIENT_ID_KEY, id);\n } catch {\n // private mode: the id lasts for this page only\n }\n return id;\n}\n\nexport function listAssistantConversations(\n store: AssistantStorage | null = storage()\n): AssistantConversationSummary[] {\n try {\n const raw = store?.getItem(ASSISTANT_CONVERSATIONS_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (entry): entry is AssistantConversationSummary =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { id?: unknown }).id === \"string\"\n );\n } catch {\n return [];\n }\n}\n\n/** Adds or refreshes a conversation at the top of the list, capped at ASSISTANT_MAX_CONVERSATIONS. */\nexport function saveAssistantConversation(\n conversation: AssistantConversationSummary,\n store: AssistantStorage | null = storage()\n): AssistantConversationSummary[] {\n const next = [\n conversation,\n ...listAssistantConversations(store).filter((entry) => entry.id !== conversation.id),\n ].slice(0, ASSISTANT_MAX_CONVERSATIONS);\n try {\n store?.setItem(ASSISTANT_CONVERSATIONS_KEY, JSON.stringify(next));\n } catch {\n // private mode: the list lasts for this page only\n }\n return next;\n}\n","import { ArrowLeft, ArrowUp, AudioLines, Maximize2, Mic, Minimize2, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { listAssistantConversations, saveAssistantConversation } from \"../../assistant/store\";\nimport { useSpeechSupported } from \"../../hooks/useSpeechRecognition\";\nimport { ActionTooltip } from \"../AssistantChat/ActionTooltip\";\nimport { AssistantDictationBar } from \"../AssistantChat/AssistantDictationBar\";\nimport { cn, generateId } from \"../../utils\";\nimport { AssistantChat } from \"../AssistantChat/AssistantChat\";\nimport type {\n AssistantChatProps,\n AssistantConversationSummary,\n AssistantMessage,\n} from \"../AssistantChat/AssistantChat.types\";\nimport { MAX_MESSAGE_LENGTH } from \"../AssistantChat/AssistantComposer\";\n\nexport interface AssistantLauncherTexts {\n /** Placeholder of the bar (\"Posez une question…\"); also the dialog's accessible name. */\n open: string;\n /** The close button of the panel. */\n close: string;\n /** The voice button of the bar; falls back to `open`. */\n voice?: string;\n /** The expand / collapse button of the panel; fall back to `open` / `close`. */\n expand?: string;\n collapse?: string;\n /** The history button of the panel; falls back to `texts.recentConversations`. */\n history?: string;\n /** The back button of an embedded page (`embed`); falls back to `close`. */\n backToConversation?: string;\n}\n\n/** A page shown in the panel in place of the conversation, e.g. a booking calendar. */\nexport interface AssistantEmbeddedPage {\n url: string;\n /** Header title and accessible name of the frame. */\n title: string;\n}\n\nexport interface AssistantLauncherProps\n extends Omit<AssistantChatProps, \"className\" | \"layout\" | \"queuedPrompt\" | \"historyOpen\" | \"onHistoryOpenChange\"> {\n launcherTexts: AssistantLauncherTexts;\n /** Controlled open state; the launcher manages it when absent. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Controlled expanded (wide) state; the launcher manages it when absent. */\n expanded?: boolean;\n defaultExpanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n /**\n * Pixels between the bar and the bottom of the viewport, so the bar sits\n * above a host bottom navigation. Default 16.\n */\n bottomOffset?: number;\n /** Renders nothing at all (e.g. a feature toggle off). */\n hidden?: boolean;\n /** Extra classes on the bar. */\n className?: string;\n /** Extra classes on the panel (e.g. a wider max width). */\n panelClassName?: string;\n /**\n * A page (iframe) shown in the panel over the conversation, which stays\n * mounted underneath; the back button calls `onEmbedClose`. Null or absent\n * shows the conversation.\n */\n embed?: AssistantEmbeddedPage | null;\n onEmbedClose?: () => void;\n}\n\nconst DIRECTION: Record<AssistantChatProps[\"language\"], \"ltr\" | \"rtl\"> = {\n fr: \"ltr\",\n en: \"ltr\",\n ar: \"rtl\",\n};\n\n/**\n * MED-1787: the in-app entry to the assistant for Medecine360-ui and the\n * dashboard. A floating bar at the bottom of the page (brand badge, a text\n * field \"Posez une question…\", push-to-talk mic, voice button, send) opens a\n * slide-over panel hosting AssistantChat in its `panel` layout; clicking the\n * field opens the panel too, a spoken question is sent as it opens. From\n * tablets up the panel can be expanded to a dashboard reaching the middle of\n * the screen, with the conversation list beside the thread; in the narrow\n * layout a history button shows that list over the thread.\n *\n * Conversation history is managed here with the shared browser store unless\n * the host passes `conversations` itself: new conversations are remembered,\n * selecting one loads it through `transport.getConversation`.\n *\n * The chat stays mounted while the panel is closed, so the conversation in\n * progress survives open/close. Escape and the overlay close the panel; focus\n * goes to the composer on open and back to the bar on close. In Arabic the\n * panel slides from the left (`end-0` follows `dir`).\n */\nexport const AssistantLauncher: React.FC<AssistantLauncherProps> = ({\n launcherTexts,\n open,\n defaultOpen = false,\n onOpenChange,\n expanded,\n defaultExpanded = false,\n onExpandedChange,\n bottomOffset = 16,\n hidden = false,\n className,\n panelClassName,\n embed,\n onEmbedClose,\n headerAction,\n voice = true,\n conversations: hostConversations,\n activeConversationId: hostActiveId,\n initialMessages: hostInitialMessages,\n onConversationCreated,\n onSelectConversation,\n onNewConversation,\n ...chatProps\n}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultExpanded);\n const isExpanded = expanded ?? uncontrolledExpanded;\n const [historyOpen, setHistoryOpen] = useState(false);\n const [draft, setDraft] = useState(\"\");\n const [queuedPrompt, setQueuedPrompt] = useState<{ id: string; content: string } | null>(null);\n const panelId = useId();\n const barRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLElement>(null);\n const wasOpenRef = useRef(isOpen);\n\n // Managed history (browser store) unless the host provides the list.\n const hostManaged = hostConversations !== undefined;\n const [storedConversations, setStoredConversations] = useState<AssistantConversationSummary[]>([]);\n const [managedActiveId, setManagedActiveId] = useState<string | null>(null);\n const [managedMessages, setManagedMessages] = useState<AssistantMessage[] | undefined>(undefined);\n useEffect(() => {\n if (!hostManaged) setStoredConversations(listAssistantConversations());\n }, [hostManaged]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (open === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange, open]\n );\n\n const setExpanded = useCallback(\n (next: boolean) => {\n if (expanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(next);\n if (next) setHistoryOpen(false);\n },\n [expanded, onExpandedChange]\n );\n\n /** Opens the panel; a non-empty text is sent as the first message. */\n const submitFromBar = useCallback(\n (content: string) => {\n const trimmed = content.trim();\n if (trimmed) {\n setQueuedPrompt({ id: generateId(\"q\"), content: trimmed.slice(0, MAX_MESSAGE_LENGTH) });\n }\n setDraft(\"\");\n setOpen(true);\n },\n [setOpen]\n );\n\n // One click on the bar mic (or the voice button) opens the panel straight in\n // the voice conversation, listening at once.\n const [voiceRequest, setVoiceRequest] = useState<{ id: string } | null>(null);\n const openVoice = useCallback(() => {\n setVoiceRequest({ id: generateId(\"v\") });\n setOpen(true);\n }, [setOpen]);\n const speechSupported = useSpeechSupported();\n // The waveform button records a dictation in the bar itself (recording bar).\n const [dictating, setDictating] = useState(false);\n const [composerDraft, setComposerDraft] = useState<{ id: string; content: string } | null>(null);\n const dictateLabel = chatProps.texts.dictate ?? launcherTexts.voice ?? \"Dicter un message\";\n\n const handleConversationCreated = useCallback(\n (conversation: AssistantConversationSummary) => {\n if (!hostManaged) {\n setStoredConversations(saveAssistantConversation(conversation));\n setManagedActiveId(conversation.id);\n }\n onConversationCreated?.(conversation);\n },\n [hostManaged, onConversationCreated]\n );\n\n const handleSelectConversation = useCallback(\n (conversationId: string) => {\n onSelectConversation?.(conversationId);\n if (hostManaged || conversationId === managedActiveId) return;\n const load = async () => {\n try {\n const loaded = await chatProps.transport.getConversation?.(conversationId);\n setManagedMessages(loaded?.messages ?? []);\n } catch {\n setManagedMessages([]);\n }\n setManagedActiveId(conversationId);\n };\n void load();\n },\n [chatProps.transport, hostManaged, managedActiveId, onSelectConversation]\n );\n\n const handleNewConversation = useCallback(() => {\n if (!hostManaged) {\n setManagedActiveId(null);\n setManagedMessages(undefined);\n }\n onNewConversation?.();\n }, [hostManaged, onNewConversation]);\n\n // Escape closes; the page behind does not scroll while the panel is open.\n useEffect(() => {\n if (!isOpen || hidden) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", onKeyDown);\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.body.style.overflow = previousOverflow;\n };\n }, [hidden, isOpen, setOpen]);\n\n // Focus: into the composer on open, back to the bar on close.\n useEffect(() => {\n if (isOpen) {\n panelRef.current?.querySelector(\"textarea\")?.focus();\n } else if (wasOpenRef.current) {\n barRef.current?.focus();\n }\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n if (hidden) return null;\n\n const dir = DIRECTION[chatProps.language];\n const showMic = voice && speechSupported;\n const expandLabel = launcherTexts.expand ?? launcherTexts.open;\n const collapseLabel = launcherTexts.collapse ?? launcherTexts.close;\n const texts = launcherTexts.history ? { ...chatProps.texts, history: launcherTexts.history } : chatProps.texts;\n\n return (\n <>\n {!isOpen && (\n <div\n dir={dir}\n className=\"pointer-events-none fixed inset-x-0 z-40 flex justify-center px-4\"\n style={{ bottom: bottomOffset }}\n data-testid=\"assistant-launcher-bar\"\n >\n <div\n role=\"group\"\n aria-label={launcherTexts.open}\n className={cn(\n \"pointer-events-auto flex w-full max-w-2xl items-center gap-2 rounded-2xl border border-ews-gray-100 bg-white py-2 pe-2 ps-3\",\n \"shadow-[0_8px_30px_rgba(15,23,42,0.14)]\",\n className\n )}\n >\n <button\n ref={barRef}\n type=\"button\"\n onClick={() => setOpen(true)}\n aria-label={launcherTexts.open}\n aria-haspopup=\"dialog\"\n aria-expanded={false}\n aria-controls={panelId}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-ews-primary to-ews-primary-hover text-base font-bold text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-ews-primary/40\"\n data-testid=\"assistant-launcher\"\n >\n {chatProps.texts.brandName.charAt(0)}\n </button>\n {dictating ? (\n <AssistantDictationBar\n language={chatProps.language}\n texts={chatProps.texts.dictation}\n className=\"min-w-0 flex-1\"\n onCancel={() => setDictating(false)}\n onDone={(text) => {\n setDictating(false);\n if (text) setComposerDraft({ id: generateId(\"d\"), content: text });\n setOpen(true);\n }}\n onSend={(text) => {\n setDictating(false);\n submitFromBar(text);\n }}\n />\n ) : (\n <>\n {/* The field opens the panel: typing happens in the panel composer, which gets the focus. */}\n <input\n type=\"text\"\n readOnly\n value={draft}\n onMouseDown={(event) => {\n event.preventDefault();\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen(true);\n }\n }}\n placeholder={launcherTexts.open}\n aria-label={launcherTexts.open}\n aria-haspopup=\"dialog\"\n aria-controls={panelId}\n className=\"min-w-0 flex-1 cursor-text bg-transparent py-2 text-lg text-ews-gray-800 placeholder:text-ews-gray-400 focus:outline-none\"\n data-testid=\"assistant-launcher-input\"\n />\n {showMic && (\n <ActionTooltip label={chatProps.texts.holdToTalk}>\n {(describedBy) => (\n <button\n type=\"button\"\n aria-label={chatProps.texts.holdToTalk}\n aria-describedby={describedBy}\n onClick={openVoice}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full text-ews-gray-600 transition-colors hover:bg-ews-gray-100 hover:text-ews-primary focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-mic\"\n >\n <Mic className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n </ActionTooltip>\n )}\n <ActionTooltip label={dictateLabel}>\n {(describedBy) => (\n <button\n type=\"button\"\n onClick={speechSupported ? () => setDictating(true) : () => setOpen(true)}\n aria-label={dictateLabel}\n aria-describedby={describedBy}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-ews-gray-100 text-ews-gray-700 transition-colors hover:bg-ews-gray-200 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-voice\"\n >\n <AudioLines className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n )}\n </ActionTooltip>\n <button\n type=\"button\"\n onClick={() => submitFromBar(draft)}\n aria-label={chatProps.texts.send}\n title={chatProps.texts.send}\n className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-ews-primary text-white shadow-sm transition-colors hover:bg-ews-primary-hover focus:outline-none focus:ring-2 focus:ring-ews-primary focus:ring-offset-1\"\n data-testid=\"assistant-launcher-send\"\n >\n <ArrowUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </>\n )}\n </div>\n </div>\n )}\n\n <div\n dir={dir}\n className={cn(\"fixed inset-0 z-[90]\", !isOpen && \"hidden\")}\n aria-hidden={!isOpen}\n data-testid=\"assistant-launcher-panel\"\n >\n <div\n // Mobile: a dimmed page under a full-screen panel. From tablets up the panel floats over the\n // page, which stays visible (no dimming); a click outside still closes it.\n className=\"absolute inset-0 bg-black/40 sm:bg-transparent\"\n onClick={() => setOpen(false)}\n data-testid=\"assistant-launcher-overlay\"\n />\n <section\n ref={panelRef}\n id={panelId}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={launcherTexts.open}\n data-expanded={isExpanded}\n className={cn(\n \"absolute inset-y-0 end-0 flex w-full flex-col bg-white shadow-2xl\",\n // From tablets up: a floating card (MED-1801, like the Notiwa widget), clear of the top,\n // the bottom and the side of the screen, rounded, with a soft border and shadow.\n \"sm:inset-y-auto sm:bottom-6 sm:end-6 sm:overflow-hidden sm:rounded-3xl sm:border sm:border-ews-gray-100\",\n \"sm:shadow-[0_24px_60px_rgba(15,23,42,0.22)]\",\n // Only fixed widths and heights, so expanding animates from one size to the other (a\n // max-width switching to none jumped to full width first).\n \"sm:max-w-[calc(100vw-3rem)] sm:transition-[width,height] sm:duration-300 sm:ease-out\",\n isExpanded ? \"sm:h-[calc(100vh-3rem)]\" : \"sm:h-[calc(100vh-6rem)]\",\n // Expanded: a dashboard reaching the middle of the screen (never full width), tablets and up.\n isExpanded ? \"sm:w-[32rem] md:w-[max(50vw,40rem)]\" : \"sm:w-[32rem]\",\n panelClassName\n )}\n >\n {embed && (\n <div className=\"absolute inset-0 z-20 flex flex-col bg-white\" data-testid=\"assistant-launcher-embed\">\n <div className=\"flex items-center gap-2 border-b border-ews-gray-100 px-3 py-2\">\n <button\n type=\"button\"\n onClick={onEmbedClose}\n aria-label={launcherTexts.backToConversation ?? launcherTexts.close}\n title={launcherTexts.backToConversation ?? launcherTexts.close}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-embed-back\"\n >\n <ArrowLeft className=\"h-5 w-5 rtl:rotate-180\" aria-hidden=\"true\" />\n </button>\n <h2 className=\"min-w-0 flex-1 truncate text-base font-semibold text-ews-gray-900\">{embed.title}</h2>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label={launcherTexts.close}\n title={launcherTexts.close}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n >\n <X className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </div>\n <iframe title={embed.title} src={embed.url} className=\"block w-full flex-1 border-0\" />\n </div>\n )}\n <AssistantChat\n {...chatProps}\n texts={texts}\n voice={voice}\n layout={isExpanded ? \"wide\" : \"panel\"}\n queuedPrompt={queuedPrompt}\n voiceRequest={voiceRequest}\n composerDraft={composerDraft}\n conversations={hostManaged ? hostConversations : storedConversations}\n activeConversationId={hostManaged ? hostActiveId : managedActiveId}\n initialMessages={hostManaged ? hostInitialMessages : managedMessages}\n onConversationCreated={handleConversationCreated}\n onSelectConversation={handleSelectConversation}\n onNewConversation={handleNewConversation}\n historyOpen={historyOpen}\n onHistoryOpenChange={setHistoryOpen}\n className=\"flex-1\"\n headerAction={\n <>\n {headerAction}\n <button\n type=\"button\"\n onClick={() => setExpanded(!isExpanded)}\n aria-label={isExpanded ? collapseLabel : expandLabel}\n aria-pressed={isExpanded}\n title={isExpanded ? collapseLabel : expandLabel}\n className=\"hidden rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary md:inline-flex\"\n data-testid=\"assistant-launcher-expand\"\n >\n {isExpanded ? (\n <Minimize2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n ) : (\n <Maximize2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label={launcherTexts.close}\n title={launcherTexts.close}\n className=\"rounded-full p-2 text-ews-gray-500 hover:bg-ews-gray-100 hover:text-ews-gray-900 focus:outline-none focus:ring-2 focus:ring-ews-primary\"\n data-testid=\"assistant-launcher-close\"\n >\n <X className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </>\n }\n />\n </section>\n </div>\n </>\n );\n};\n","import type {\n AssistantEvent,\n AssistantLanguage,\n AssistantMessage,\n AssistantTransport,\n} from \"../components/AssistantChat/AssistantChat.types\";\n\n/**\n * The assistant BFF client shared by every app (MED-1787; contract in\n * projects/medecine360-mcp/docs/assistant-api-contract.md). Fetch rather than\n * EventSource: the message endpoint is a POST. Requests carry the platform\n * session cookie (`credentials: \"include\"`) so the assistant BFF can derive\n * the persona server-side once it supports it.\n */\nexport interface AssistantTransportOptions {\n /** Base URL up to and including /api/v1 (createEnvConfig().assistantBffUrl). */\n baseUrl: string;\n /** Stable browser identifier, for rate limiting and conversation listing. */\n clientId: string;\n language: AssistantLanguage;\n fetchImpl?: typeof fetch;\n}\n\ninterface ErrorBody {\n code?: string;\n message?: string;\n retryAfterSeconds?: number;\n}\n\n/** Turns one SSE text stream into assistant events; frames may arrive split across chunks. */\nexport async function* parseAssistantEventStream(\n body: ReadableStream<Uint8Array>\n): AsyncGenerator<AssistantEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n let separator = buffer.indexOf(\"\\n\\n\");\n while (separator >= 0) {\n const frame = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n const event = parseFrame(frame);\n if (event) yield event;\n separator = buffer.indexOf(\"\\n\\n\");\n }\n }\n const tail = parseFrame(buffer);\n if (tail) yield tail;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseFrame(frame: string): AssistantEvent | null {\n let type = \"\";\n const dataLines: string[] = [];\n for (const rawLine of frame.split(\"\\n\")) {\n const line = rawLine.replace(/\\r$/, \"\");\n if (line.startsWith(\"event:\")) type = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).trimStart());\n }\n if (!type || dataLines.length === 0) return null;\n try {\n const data = JSON.parse(dataLines.join(\"\\n\")) as Record<string, unknown>;\n return { type, ...data } as AssistantEvent;\n } catch {\n return null;\n }\n}\n\nasync function errorEvent(response: Response): Promise<AssistantEvent> {\n let body: ErrorBody = {};\n try {\n body = (await response.json()) as ErrorBody;\n } catch {\n // no JSON body: keep the status\n }\n const retryAfterHeader = Number(response.headers.get(\"retry-after\"));\n const code =\n body.code ??\n (response.status === 429\n ? \"RATE_LIMITED\"\n : response.status === 404\n ? \"CONVERSATION_NOT_FOUND\"\n : \"MODEL_UNAVAILABLE\");\n return {\n type: \"error\",\n code,\n message: body.message ?? `HTTP ${response.status}`,\n retryAfterSeconds:\n body.retryAfterSeconds ??\n (Number.isFinite(retryAfterHeader) && retryAfterHeader > 0 ? retryAfterHeader : undefined),\n };\n}\n\nexport function createAssistantTransport({\n baseUrl,\n clientId,\n language,\n fetchImpl,\n}: AssistantTransportOptions): AssistantTransport {\n const base = `${baseUrl.replace(/\\/+$/, \"\")}/assistant`;\n const doFetch: typeof fetch = (input, init) =>\n (fetchImpl ?? fetch)(input, { credentials: \"include\", ...init });\n const headers = { \"Content-Type\": \"application/json\", \"Accept-Language\": language };\n\n return {\n async startConversation(conversationLanguage) {\n const response = await doFetch(`${base}/conversations`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ language: conversationLanguage, persona: \"visitor\", clientId }),\n });\n if (!response.ok) {\n const error = await errorEvent(response);\n throw new Error(error.type === \"error\" ? error.message : `HTTP ${response.status}`);\n }\n const created = (await response.json()) as { id: string };\n return { id: created.id };\n },\n\n async *sendMessage(conversationId, content, options) {\n const response = await doFetch(\n `${base}/conversations/${encodeURIComponent(conversationId)}/messages`,\n {\n method: \"POST\",\n headers: { ...headers, Accept: \"text/event-stream\" },\n body: JSON.stringify({ content }),\n signal: options?.signal,\n }\n );\n if (!response.ok) {\n yield await errorEvent(response);\n return;\n }\n if (!response.body) {\n yield { type: \"error\", code: \"NETWORK\", message: \"Empty response\" };\n return;\n }\n yield* parseAssistantEventStream(response.body);\n },\n\n async getConversation(conversationId) {\n const response = await doFetch(`${base}/conversations/${encodeURIComponent(conversationId)}`, {\n headers,\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const data = (await response.json()) as { id: string; messages: AssistantMessage[] };\n return {\n id: data.id,\n messages: data.messages.map((message) => ({ ...message, status: \"done\" as const })),\n };\n },\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { cn } from \"../../utils\";\nimport { Button } from \"../Button/Button\";\nimport { Logo } from \"../Logo\";\nimport { PinCodeInput } from \"../PinCodeInput\";\nimport { PinPad } from \"../PinPad\";\nimport type {\n LockScreenMode,\n LockScreenProps,\n LockScreenTexts,\n} from \"./LockScreen.types\";\n\ntype Step = \"unlock\" | \"current\" | \"otp\" | \"new\" | \"confirm\";\n\nconst FIRST_STEP: Record<LockScreenMode, Step> = {\n create: \"new\",\n unlock: \"unlock\",\n change: \"current\",\n reset: \"otp\",\n};\n\nconst titleOf = (mode: LockScreenMode, step: Step, texts: LockScreenTexts) => {\n switch (step) {\n case \"unlock\":\n return texts.unlockTitle;\n case \"current\":\n return texts.currentTitle;\n case \"otp\":\n return texts.otpTitle;\n case \"new\":\n return mode === \"create\" ? texts.createTitle : texts.newTitle;\n case \"confirm\":\n return texts.confirmTitle;\n }\n};\n\n/** Same breakpoint as Tailwind's `sm`. */\nconst DESKTOP_QUERY = \"(min-width: 640px)\";\n\n/** Open lock screens, oldest first; only the last one traps focus. */\nconst trapStack: object[] = [];\n\nconst FOCUSABLE =\n 'button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Blocking PIN screen: creates, checks, changes or resets (with a one-time\n * code) the user's secret code. Below 640px: full screen with an on-screen\n * keypad. From 640px: compact dialog on a grey backdrop with one box per digit,\n * typed on the keyboard. Submit handlers return promises: a rejection clears\n * the code and goes back to the first step, the app shows its message in `error`.\n */\nconst LockScreen = ({\n mode,\n texts,\n error,\n busy = false,\n onCreate,\n onUnlock,\n onChangePin,\n onReset,\n onForgot,\n onCancel,\n onSignOut,\n subtitle,\n pinLength = 4,\n otpLength = 6,\n logo,\n className,\n}: LockScreenProps) => {\n const [step, setStep] = useState<Step>(FIRST_STEP[mode]);\n const [firstValue, setFirstValue] = useState(\"\"); // current PIN or one-time code\n const [newPin, setNewPin] = useState(\"\");\n const [otp, setOtp] = useState(\"\");\n const [localError, setLocalError] = useState<string | null>(null);\n const [invalid, setInvalid] = useState(false);\n const [pending, setPending] = useState(false);\n const [resetKey, setResetKey] = useState(0);\n const panelRef = useRef<HTMLDivElement>(null);\n const mounted = useRef(true);\n const isDesktop = useMediaQuery(DESKTOP_QUERY);\n\n const restart = useCallback(\n (failed: boolean) => {\n setStep(FIRST_STEP[mode]);\n setFirstValue(\"\");\n setNewPin(\"\");\n setOtp(\"\");\n setInvalid(failed);\n setResetKey((key) => key + 1);\n },\n [mode],\n );\n\n useEffect(() => {\n restart(false);\n setLocalError(null);\n }, [restart]);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n // Block page scroll and keep focus inside the screen. Only the most recently\n // mounted lock screen traps focus: two traps pulling focus back to their own\n // panel would loop forever (e.g. a Storybook docs page rendering every story).\n useEffect(() => {\n const token = {};\n trapStack.push(token);\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const previousFocus = document.activeElement as HTMLElement | null;\n // The desktop code boxes focus themselves first.\n if (!panelRef.current?.contains(document.activeElement)) panelRef.current?.focus();\n const keepFocus = (event: FocusEvent) => {\n if (trapStack[trapStack.length - 1] !== token) return;\n const panel = panelRef.current;\n if (panel && !panel.contains(event.target as Node)) panel.focus();\n };\n document.addEventListener(\"focusin\", keepFocus);\n return () => {\n const wasTop = trapStack[trapStack.length - 1] === token;\n trapStack.splice(trapStack.indexOf(token), 1);\n document.body.style.overflow = previousOverflow;\n document.removeEventListener(\"focusin\", keepFocus);\n if (wasTop) previousFocus?.focus?.();\n };\n }, []);\n\n const trapTab = (event: React.KeyboardEvent) => {\n if (event.key !== \"Tab\" || !panelRef.current) return;\n const items = Array.from(\n panelRef.current.querySelectorAll<HTMLElement>(FOCUSABLE),\n );\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panelRef.current)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n const submit = async (call: (() => Promise<unknown>) | undefined) => {\n if (!call) return;\n setPending(true);\n try {\n await call();\n if (mounted.current) restart(false);\n } catch {\n if (mounted.current) restart(true);\n } finally {\n if (mounted.current) setPending(false);\n }\n };\n\n const handlePin = (pin: string) => {\n setLocalError(null);\n switch (step) {\n case \"unlock\":\n void submit(onUnlock && (() => onUnlock(pin)));\n return;\n case \"current\":\n setFirstValue(pin);\n setStep(\"new\");\n return;\n case \"new\":\n setNewPin(pin);\n setStep(\"confirm\");\n return;\n case \"confirm\":\n if (pin !== newPin) {\n setLocalError(texts.mismatchError);\n setInvalid(true);\n setNewPin(\"\");\n setStep(\"new\");\n setResetKey((key) => key + 1);\n return;\n }\n if (mode === \"create\") void submit(onCreate && (() => onCreate(pin)));\n else if (mode === \"change\")\n void submit(onChangePin && (() => onChangePin(firstValue, pin)));\n else if (mode === \"reset\")\n void submit(onReset && (() => onReset(firstValue, pin)));\n return;\n }\n };\n\n const submitOtp = (event: React.FormEvent) => {\n event.preventDefault();\n if (otp.length !== otpLength) return;\n setFirstValue(otp);\n setInvalid(false);\n setStep(\"new\");\n };\n\n const completeOtp = (code: string) => {\n setLocalError(null);\n setFirstValue(code);\n setInvalid(false);\n setStep(\"new\");\n };\n\n const isBusy = busy || pending;\n const shownError = localError ?? error;\n const showForgot =\n !!onForgot &&\n !!texts.forgot &&\n (step === \"unlock\" || step === \"current\");\n const title = titleOf(mode, step, texts);\n\n const digitLabel = texts.digit ?? texts.progress;\n\n const desktopContent = (\n <>\n <div className=\"pb-5\">{logo ?? <Logo size=\"sm\" variant=\"normal\" />}</div>\n\n {title && (\n <h2 className=\"text-center text-xl font-semibold text-ews-gray-900\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"mt-1 text-center text-sm text-ews-gray-600\">{subtitle}</p>\n )}\n {step === \"otp\" && texts.otpDescription && (\n <p className=\"mt-2 text-center text-sm text-ews-gray-600\">{texts.otpDescription}</p>\n )}\n\n <div className=\"mt-6\">\n {step === \"otp\" ? (\n <PinCodeInput\n key={step}\n length={otpLength}\n masked={false}\n autoComplete=\"one-time-code\"\n onComplete={completeOtp}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n digitLabel={digitLabel}\n groupLabel={texts.otpLabel ?? title}\n />\n ) : (\n <PinCodeInput\n key={step}\n length={pinLength}\n onComplete={handlePin}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n digitLabel={digitLabel}\n groupLabel={title}\n />\n )}\n </div>\n\n <p role=\"alert\" className=\"mt-3 min-h-[1.25rem] text-center text-sm text-ews-error\">\n {shownError}\n </p>\n\n {(showForgot || (onCancel && texts.cancel) || (onSignOut && texts.signOut)) && (\n <div className=\"mt-4 flex w-full flex-col items-center gap-2 border-t border-ews-gray-200 pt-4\">\n {showForgot && (\n <button\n type=\"button\"\n onClick={onForgot}\n disabled={isBusy}\n className=\"text-sm font-medium text-ews-primary hover:underline focus-visible:underline\"\n >\n {texts.forgot}\n </button>\n )}\n {onCancel && texts.cancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.cancel}\n </button>\n )}\n {onSignOut && texts.signOut && (\n <button\n type=\"button\"\n onClick={onSignOut}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.signOut}\n </button>\n )}\n </div>\n )}\n </>\n );\n\n return (\n <div\n className={cn(\n \"fixed inset-0 z-[1000] flex justify-center overflow-y-auto bg-white\",\n \"sm:items-center sm:bg-ews-gray-900/50 sm:backdrop-blur-sm\",\n isDesktop && \"p-4\",\n className,\n )}\n data-testid=\"lock-screen\"\n data-layout={isDesktop ? \"desktop\" : \"mobile\"}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={texts.dialogLabel}\n aria-busy={isBusy}\n tabIndex={-1}\n onKeyDown={trapTab}\n className={\n isDesktop\n ? \"flex w-full max-w-[400px] flex-col items-center rounded-2xl bg-white px-8 py-8 shadow-xl outline-none\"\n : cn(\n \"flex min-h-full w-full flex-col items-center px-6 pb-8 outline-none\",\n \"sm:min-h-0 sm:w-auto sm:min-w-[22rem] sm:rounded-2xl sm:bg-white sm:px-10 sm:py-10 sm:shadow-xl\",\n )\n }\n >\n {isDesktop ? (\n desktopContent\n ) : (\n <>\n <div className=\"flex min-h-[33vh] shrink-0 items-center justify-center sm:min-h-0 sm:pb-8\">\n {logo ?? <Logo size=\"lg\" variant=\"normal\" />}\n </div>\n\n {title && (\n <h2 className=\"mb-8 text-center text-lg font-normal text-ews-gray-900\">\n {title}\n </h2>\n )}\n\n {step === \"otp\" ? (\n <form\n onSubmit={submitOtp}\n className=\"flex w-full max-w-xs flex-col items-center gap-4\"\n >\n {texts.otpDescription && (\n <p className=\"text-center text-sm text-ews-gray-600\">\n {texts.otpDescription}\n </p>\n )}\n <label className=\"sr-only\" htmlFor=\"lock-screen-otp\">\n {texts.otpLabel}\n </label>\n <input\n id=\"lock-screen-otp\"\n dir=\"ltr\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={otpLength}\n value={otp}\n disabled={isBusy}\n aria-label={texts.otpLabel}\n aria-invalid={invalid || undefined}\n onChange={(event) => {\n setOtp(event.target.value.replace(/\\D/g, \"\").slice(0, otpLength));\n setInvalid(false);\n }}\n className={cn(\n \"w-full rounded-lg border bg-white px-4 py-3 text-center text-2xl tracking-[0.5em]\",\n \"focus:border-ews-primary focus:ring-2 focus:ring-ews-primary\",\n invalid ? \"border-ews-error\" : \"border-ews-gray-300\",\n )}\n />\n <Button\n type=\"submit\"\n variant=\"ews-primary\"\n fullWidth\n disabled={otp.length !== otpLength || isBusy}\n >\n {texts.otpSubmit}\n </Button>\n </form>\n ) : (\n <PinPad\n key={step}\n length={pinLength}\n onComplete={handlePin}\n onChange={() => setInvalid(false)}\n disabled={isBusy}\n invalid={invalid}\n resetKey={resetKey}\n eraseLabel={texts.erase}\n progressLabel={texts.progress}\n keypadLabel={texts.keypad}\n />\n )}\n\n <p\n role=\"alert\"\n className=\"mt-6 min-h-[1.25rem] text-center text-sm text-ews-error\"\n >\n {shownError}\n </p>\n\n <div className=\"mt-auto flex flex-col items-center gap-3 pt-6 sm:mt-4\">\n {showForgot && (\n <button\n type=\"button\"\n onClick={onForgot}\n disabled={isBusy}\n className=\"text-base font-medium text-ews-primary hover:underline focus-visible:underline\"\n >\n {texts.forgot}\n </button>\n )}\n {onCancel && texts.cancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isBusy}\n className=\"text-sm text-ews-gray-600 hover:underline focus-visible:underline\"\n >\n {texts.cancel}\n </button>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport type {\n LockScreenMode,\n LockScreenProps,\n LockScreenTexts,\n} from \"./LockScreen.types\";\nexport { LockScreen };\n","import { Stethoscope, X } from \"lucide-react\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { MultiSearchAutocomplete } from \"../../components/MultiSearchAutocomplete\";\nimport { cn } from \"../../utils\";\n\nexport interface Specialty {\n id: string;\n code: string;\n label: string;\n [key: string]: string | number | boolean | undefined;\n}\n\nexport interface SpecialtySearchAutocompleteProps {\n selectedSpecialties: Specialty[];\n onSpecialtiesChange: (specialties: Specialty[]) => void;\n specialties: Specialty[];\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n maxSelections?: number;\n showSelectedCount?: boolean;\n title?: string;\n label?: string;\n getSelectedCountText?: (count: number) => React.ReactNode;\n /**\n * MED-1499: accessible label / tooltip of the button that removes a\n * selected specialty from its chip. Defaults to the English\n * \"Remove specialty\".\n */\n removeSpecialtyLabel?: string;\n}\n\nexport const SpecialtySearchAutocomplete: React.FC<\n SpecialtySearchAutocompleteProps\n> = ({\n selectedSpecialties = [],\n onSpecialtiesChange,\n specialties: availableSpecialties,\n placeholder = \"Search and select medical specialties...\",\n className = \"\",\n disabled = false,\n maxSelections,\n showSelectedCount = true,\n title = \"Medical Specialties\",\n label = \"Select Specialties\",\n getSelectedCountText,\n removeSpecialtyLabel = \"Remove specialty\",\n}) => {\n const [filteredSpecialties, setFilteredSpecialties] = useState<Specialty[]>(\n []\n );\n const [isLoading, setIsLoading] = useState(false);\n\n // Filter specialties based on search term\n const fetchSpecialties = useCallback(\n async (searchTerm: string) => {\n setIsLoading(true);\n try {\n // Filter based on search term\n const filtered = availableSpecialties.filter(\n (specialty) =>\n specialty.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\n specialty.code.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n setFilteredSpecialties(filtered);\n } catch (error) {\n console.error(\"Error filtering specialties:\", error);\n setFilteredSpecialties([]);\n } finally {\n setIsLoading(false);\n }\n },\n [availableSpecialties]\n );\n\n // Initial load\n useEffect(() => {\n fetchSpecialties(\"\");\n }, [fetchSpecialties]);\n\n const handleSelectionChange = useCallback(\n (items: Specialty[]) => {\n // Check max selections limit\n if (maxSelections && items.length > maxSelections) {\n return; // Don't update if exceeding max selections\n }\n onSpecialtiesChange(items);\n },\n [onSpecialtiesChange, maxSelections]\n );\n\n // MED-1499: a selected specialty must be removable from its chip, not only\n // by toggling it off again in the dropdown list.\n const handleRemoveSpecialty = useCallback(\n (specialtyToRemove: Specialty) => {\n onSpecialtiesChange(\n selectedSpecialties.filter(\n (specialty) => specialty.id !== specialtyToRemove.id\n )\n );\n },\n [onSpecialtiesChange, selectedSpecialties]\n );\n\n const getEntityById = useCallback(\n async (id: string): Promise<Specialty | undefined> => {\n return availableSpecialties.find((specialty) => specialty.id === id);\n },\n [availableSpecialties]\n );\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Header with title and icon */}\n <div className=\"flex items-center space-x-2\">\n <div className=\"flex justify-center items-center w-8 h-8 rounded-lg bg-secondary-100\">\n <Stethoscope className=\"w-4 h-4 text-secondary-600\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {title || \"Medical Specialties\"}\n </h3>\n </div>\n\n {/* Label */}\n <div>\n <label className=\"block mb-2 text-sm font-medium text-gray-700\">\n {label || \"Select Specialties\"}\n </label>\n </div>\n\n {/* MultiSearchAutocomplete component */}\n <MultiSearchAutocomplete<Specialty>\n items={filteredSpecialties}\n selectedItems={selectedSpecialties}\n onSelectionChange={handleSelectionChange}\n onSearch={fetchSpecialties}\n getEntityById={getEntityById}\n getPrimaryText={(specialty) => specialty.label}\n getSecondaryText={(specialty) => specialty.code}\n placeholder={placeholder}\n disabled={disabled}\n loading={isLoading}\n multiple={true}\n keepOpenOnSelect={true}\n className=\"w-full\"\n renderSelectedItem={(specialty) => (\n <span className=\"inline-flex items-center px-3 py-1 text-sm font-medium rounded-full border bg-ews-primary/10 text-ews-primary border-ews-primary/20\">\n {specialty.label}\n <button\n type=\"button\"\n onClick={() => handleRemoveSpecialty(specialty)}\n className=\"ml-2 text-ews-primary/60 hover:text-ews-primary\"\n disabled={disabled}\n title={removeSpecialtyLabel}\n aria-label={removeSpecialtyLabel}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n )}\n renderListItem={(specialty, isSelected) => (\n <div className=\"flex items-center space-x-3\">\n <div\n className={cn(\n \"flex justify-center items-center w-5 h-5 rounded border-2\",\n isSelected\n ? \"bg-ews-primary border-ews-primary\"\n : \"border-ews-gray-300\"\n )}\n >\n {isSelected && (\n <svg\n className=\"w-3 h-3 text-white\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </div>\n <span\n className={cn(\n \"font-medium\",\n isSelected ? \"text-ews-primary\" : \"text-gray-900\"\n )}\n >\n {specialty.label}\n </span>\n </div>\n )}\n />\n\n {/* Selected count display */}\n {showSelectedCount && selectedSpecialties.length > 0 && (\n <div className=\"flex justify-between items-center text-sm text-gray-600\">\n <span>\n {getSelectedCountText\n ? getSelectedCountText(selectedSpecialties.length)\n : `${selectedSpecialties.length} specialty${\n selectedSpecialties.length !== 1 ? \"ies\" : \"\"\n } selected`}\n </span>\n {maxSelections && (\n <span className=\"text-gray-400\">\n {selectedSpecialties.length}/{maxSelections}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["React","_jsxs","_jsx","_Fragment","BCP47","UserAgent_DEPRECATED","ExecutionEnvironment","require$$0","isEventSupported","require$$1","normalizeWheel","Cropper","EasyCrop","img","logo","logoWhite","logoFullWhite","logoIcon","DEFAULT_TEXTS","BLOCKING_ERRORS","DIRECTION"],"mappings":"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C,KAAK,CAAC;AAC/C,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC;AAC9C,IAAI,WAAW,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU;AAC1D,EAAA;;AAEA,EAAE,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,eAAe,KAAK,OAAO,EAAE;AACpE;AACA,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;AAC3E,EAAA;;AAEA,EAAE,OAAO,WAAW;AACpB;;AAEA,IAAA,kBAAc,GAAGA,kBAAgB;;;;;;;;;;;;;;AChDjC,IAAI,oBAAoB,GAAGD,sBAAiC;;AAE5D,IAAI,gBAAgB,GAAGE,kBAA6B;;;AAGpD;AACA,IAAI,UAAU,IAAI,EAAE;AACpB,IAAI,WAAW,GAAG,EAAE;AACpB,IAAI,WAAW,GAAG,GAAG;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAc,YAAY,KAAK,aAAa;AACrD,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;AACpB,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;AAErB;AACA,EAAE,IAAI,QAAQ,SAAS,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,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","x_google_ignoreList":[0,21,22,23,24,25,26]}