@refraction-ui/react 0.19.1 → 0.20.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 (342) hide show
  1. package/dist/chunk-533MCMSU.js +2355 -0
  2. package/dist/chunk-533MCMSU.js.map +7 -0
  3. package/dist/chunk-AMK4VCBG.js +250 -0
  4. package/dist/chunk-AMK4VCBG.js.map +7 -0
  5. package/dist/chunk-BOLFYVI6.js +90 -0
  6. package/dist/chunk-BOLFYVI6.js.map +7 -0
  7. package/dist/chunk-F7B64KT3.js +187 -0
  8. package/dist/chunk-F7B64KT3.js.map +7 -0
  9. package/dist/chunk-FD37DFCC.js +77 -0
  10. package/dist/chunk-FD37DFCC.js.map +7 -0
  11. package/dist/chunk-H54FLNAF.js +132 -0
  12. package/dist/chunk-H54FLNAF.js.map +7 -0
  13. package/dist/chunk-INP46354.js +664 -0
  14. package/dist/chunk-INP46354.js.map +7 -0
  15. package/dist/chunk-ONACRMG4.js +116 -0
  16. package/dist/chunk-ONACRMG4.js.map +7 -0
  17. package/dist/chunk-SDZ3LROZ.js +7 -0
  18. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  19. package/dist/chunk-TOZBR4GL.js +154 -0
  20. package/dist/chunk-TOZBR4GL.js.map +7 -0
  21. package/dist/chunk-UNEM2TRI.js +225 -0
  22. package/dist/chunk-UNEM2TRI.js.map +7 -0
  23. package/dist/chunk-VK3EQ34F.js +92 -0
  24. package/dist/chunk-VK3EQ34F.js.map +7 -0
  25. package/dist/chunk-WK2IIUFO.js +316 -0
  26. package/dist/chunk-WK2IIUFO.js.map +7 -0
  27. package/dist/chunk-WSPJTQAV.js +59 -0
  28. package/dist/chunk-WSPJTQAV.js.map +7 -0
  29. package/dist/chunk-XWP763SH.js +3 -2
  30. package/dist/chunk-XWP763SH.js.map +7 -1
  31. package/dist/chunk-Y2FNNAIL.js +80 -0
  32. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  33. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  34. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  35. package/dist/form.cjs +5 -11
  36. package/dist/form.cjs.map +1 -1
  37. package/dist/form.js +6 -12
  38. package/dist/form.js.map +1 -1
  39. package/dist/index.cjs +2879 -33936
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +126 -28780
  44. package/dist/internal/react-app-shell/index.d.cts +2 -22
  45. package/dist/internal/react-app-shell/index.d.ts +2 -22
  46. package/dist/internal/react-badge/index.d.cts +5 -0
  47. package/dist/internal/react-badge/index.d.ts +5 -0
  48. package/dist/internal/react-callout/index.d.cts +4 -0
  49. package/dist/internal/react-callout/index.d.ts +4 -0
  50. package/dist/internal/react-card/index.d.cts +8 -1
  51. package/dist/internal/react-card/index.d.ts +8 -1
  52. package/dist/internal/react-collapsible/index.d.cts +0 -3
  53. package/dist/internal/react-collapsible/index.d.ts +0 -3
  54. package/dist/internal/react-combobox/index.d.cts +0 -3
  55. package/dist/internal/react-combobox/index.d.ts +0 -3
  56. package/dist/internal/react-command/index.d.cts +0 -3
  57. package/dist/internal/react-command/index.d.ts +0 -3
  58. package/dist/internal/react-data-table/index.d.cts +0 -3
  59. package/dist/internal/react-data-table/index.d.ts +0 -3
  60. package/dist/internal/react-dialog/index.d.cts +0 -3
  61. package/dist/internal/react-dialog/index.d.ts +0 -3
  62. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  63. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  64. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  65. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  66. package/dist/internal/react-form/index.d.cts +2 -21
  67. package/dist/internal/react-form/index.d.ts +2 -21
  68. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  69. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  70. package/dist/internal/react-link-card/index.d.cts +8 -2
  71. package/dist/internal/react-link-card/index.d.ts +8 -2
  72. package/dist/internal/react-popover/index.d.cts +0 -3
  73. package/dist/internal/react-popover/index.d.ts +0 -3
  74. package/dist/internal/react-sheet/index.d.cts +0 -3
  75. package/dist/internal/react-sheet/index.d.ts +0 -3
  76. package/dist/internal/react-slot/index.d.cts +23 -0
  77. package/dist/internal/react-slot/index.d.ts +23 -0
  78. package/dist/internal/react-toast/index.d.cts +0 -3
  79. package/dist/internal/react-toast/index.d.ts +0 -3
  80. package/dist/internal/react-tooltip/index.d.cts +0 -3
  81. package/dist/internal/react-tooltip/index.d.ts +0 -3
  82. package/dist/react-accordion.js +125 -0
  83. package/dist/react-accordion.js.map +7 -0
  84. package/dist/react-ai.js +257 -0
  85. package/dist/react-ai.js.map +7 -0
  86. package/dist/react-analytics.js +1698 -0
  87. package/dist/react-analytics.js.map +7 -0
  88. package/dist/react-animated-text.js +164 -0
  89. package/dist/react-animated-text.js.map +7 -0
  90. package/dist/react-app-shell.js +631 -0
  91. package/dist/react-app-shell.js.map +7 -0
  92. package/dist/react-audience-feature-card.js +53 -0
  93. package/dist/react-audience-feature-card.js.map +7 -0
  94. package/dist/react-audio-room.js +166 -0
  95. package/dist/react-audio-room.js.map +7 -0
  96. package/dist/react-auth.js +211 -0
  97. package/dist/react-auth.js.map +7 -0
  98. package/dist/react-avatar-group.js +154 -0
  99. package/dist/react-avatar-group.js.map +7 -0
  100. package/dist/react-avatar.js +168 -0
  101. package/dist/react-avatar.js.map +7 -0
  102. package/dist/react-badge.js +86 -0
  103. package/dist/react-badge.js.map +7 -0
  104. package/dist/react-bottom-nav.js +67 -0
  105. package/dist/react-bottom-nav.js.map +7 -0
  106. package/dist/react-brand-network-cell.js +92 -0
  107. package/dist/react-brand-network-cell.js.map +7 -0
  108. package/dist/react-breadcrumbs.js +104 -0
  109. package/dist/react-breadcrumbs.js.map +7 -0
  110. package/dist/react-browser-chrome-mock.js +89 -0
  111. package/dist/react-browser-chrome-mock.js.map +7 -0
  112. package/dist/react-button.js +13 -0
  113. package/dist/react-button.js.map +7 -0
  114. package/dist/react-calendar.js +301 -0
  115. package/dist/react-calendar.js.map +7 -0
  116. package/dist/react-call-controls.js +113 -0
  117. package/dist/react-call-controls.js.map +7 -0
  118. package/dist/react-callout.js +152 -0
  119. package/dist/react-callout.js.map +7 -0
  120. package/dist/react-card-grid.js +34 -0
  121. package/dist/react-card-grid.js.map +7 -0
  122. package/dist/react-card.js +200 -0
  123. package/dist/react-card.js.map +7 -0
  124. package/dist/react-carousel.js +132 -0
  125. package/dist/react-carousel.js.map +7 -0
  126. package/dist/react-charts.js +509 -0
  127. package/dist/react-charts.js.map +7 -0
  128. package/dist/react-checkbox.js +156 -0
  129. package/dist/react-checkbox.js.map +7 -0
  130. package/dist/react-checklist.js +168 -0
  131. package/dist/react-checklist.js.map +7 -0
  132. package/dist/react-code-block.js +78 -0
  133. package/dist/react-code-block.js.map +7 -0
  134. package/dist/react-code-editor.js +184 -0
  135. package/dist/react-code-editor.js.map +7 -0
  136. package/dist/react-collapsible.js +192 -0
  137. package/dist/react-collapsible.js.map +7 -0
  138. package/dist/react-combobox.js +609 -0
  139. package/dist/react-combobox.js.map +7 -0
  140. package/dist/react-command-input.js +202 -0
  141. package/dist/react-command-input.js.map +7 -0
  142. package/dist/react-command.js +364 -0
  143. package/dist/react-command.js.map +7 -0
  144. package/dist/react-composer.js +2036 -0
  145. package/dist/react-composer.js.map +7 -0
  146. package/dist/react-content-protection.js +133 -0
  147. package/dist/react-content-protection.js.map +7 -0
  148. package/dist/react-conversation.js +1226 -0
  149. package/dist/react-conversation.js.map +7 -0
  150. package/dist/react-cookie-consent.js +291 -0
  151. package/dist/react-cookie-consent.js.map +7 -0
  152. package/dist/react-data-table.js +310 -0
  153. package/dist/react-data-table.js.map +7 -0
  154. package/dist/react-date-picker.js +95 -0
  155. package/dist/react-date-picker.js.map +7 -0
  156. package/dist/react-device-frame.js +137 -0
  157. package/dist/react-device-frame.js.map +7 -0
  158. package/dist/react-dialog.js +218 -0
  159. package/dist/react-dialog.js.map +7 -0
  160. package/dist/react-diff-viewer.js +460 -0
  161. package/dist/react-diff-viewer.js.map +7 -0
  162. package/dist/react-dropdown-menu.js +292 -0
  163. package/dist/react-dropdown-menu.js.map +7 -0
  164. package/dist/react-editor-status-bar.js +148 -0
  165. package/dist/react-editor-status-bar.js.map +7 -0
  166. package/dist/react-editor-tabs.js +159 -0
  167. package/dist/react-editor-tabs.js.map +7 -0
  168. package/dist/react-emoji-picker.js +238 -0
  169. package/dist/react-emoji-picker.js.map +7 -0
  170. package/dist/react-empty-state.js +90 -0
  171. package/dist/react-empty-state.js.map +7 -0
  172. package/dist/react-feedback-dialog.js +275 -0
  173. package/dist/react-feedback-dialog.js.map +7 -0
  174. package/dist/react-file-tree.js +376 -0
  175. package/dist/react-file-tree.js.map +7 -0
  176. package/dist/react-file-upload.js +360 -0
  177. package/dist/react-file-upload.js.map +7 -0
  178. package/dist/react-floating-reactions.js +124 -0
  179. package/dist/react-floating-reactions.js.map +7 -0
  180. package/dist/react-flow-editor.js +198 -0
  181. package/dist/react-flow-editor.js.map +7 -0
  182. package/dist/react-footer.js +67 -0
  183. package/dist/react-footer.js.map +7 -0
  184. package/dist/react-graph-view.js +197 -0
  185. package/dist/react-graph-view.js.map +7 -0
  186. package/dist/react-icon-system.js +9 -0
  187. package/dist/react-icon-system.js.map +7 -0
  188. package/dist/react-infinite-canvas.js +8 -0
  189. package/dist/react-infinite-canvas.js.map +7 -0
  190. package/dist/react-inline-editor.js +216 -0
  191. package/dist/react-inline-editor.js.map +7 -0
  192. package/dist/react-input-group.js +150 -0
  193. package/dist/react-input-group.js.map +7 -0
  194. package/dist/react-input.js +10 -0
  195. package/dist/react-input.js.map +7 -0
  196. package/dist/react-install-prompt.js +132 -0
  197. package/dist/react-install-prompt.js.map +7 -0
  198. package/dist/react-kanban-board.js +198 -0
  199. package/dist/react-kanban-board.js.map +7 -0
  200. package/dist/react-keyboard-shortcut.js +36 -0
  201. package/dist/react-keyboard-shortcut.js.map +7 -0
  202. package/dist/react-language-selector.js +311 -0
  203. package/dist/react-language-selector.js.map +7 -0
  204. package/dist/react-link-card.js +48 -0
  205. package/dist/react-link-card.js.map +7 -0
  206. package/dist/react-live-captions.js +92 -0
  207. package/dist/react-live-captions.js.map +7 -0
  208. package/dist/react-live-cursors.js +145 -0
  209. package/dist/react-live-cursors.js.map +7 -0
  210. package/dist/react-live-transcript.js +117 -0
  211. package/dist/react-live-transcript.js.map +7 -0
  212. package/dist/react-location-selector.js +252 -0
  213. package/dist/react-location-selector.js.map +7 -0
  214. package/dist/react-logger.js +415 -0
  215. package/dist/react-logger.js.map +7 -0
  216. package/dist/react-markdown-renderer.js +12 -0
  217. package/dist/react-markdown-renderer.js.map +7 -0
  218. package/dist/react-marquee-strip.js +62 -0
  219. package/dist/react-marquee-strip.js.map +7 -0
  220. package/dist/react-mascot.js +367 -0
  221. package/dist/react-mascot.js.map +7 -0
  222. package/dist/react-mastery-bar.js +97 -0
  223. package/dist/react-mastery-bar.js.map +7 -0
  224. package/dist/react-mini-map.js +207 -0
  225. package/dist/react-mini-map.js.map +7 -0
  226. package/dist/react-mobile-nav.js +216 -0
  227. package/dist/react-mobile-nav.js.map +7 -0
  228. package/dist/react-navbar.js +96 -0
  229. package/dist/react-navbar.js.map +7 -0
  230. package/dist/react-numbered-steps.js +67 -0
  231. package/dist/react-numbered-steps.js.map +7 -0
  232. package/dist/react-otp-input.js +318 -0
  233. package/dist/react-otp-input.js.map +7 -0
  234. package/dist/react-pagination.js +199 -0
  235. package/dist/react-pagination.js.map +7 -0
  236. package/dist/react-password-input.js +104 -0
  237. package/dist/react-password-input.js.map +7 -0
  238. package/dist/react-payment.js +81 -0
  239. package/dist/react-payment.js.map +7 -0
  240. package/dist/react-popover.js +176 -0
  241. package/dist/react-popover.js.map +7 -0
  242. package/dist/react-pre-call-lobby.js +309 -0
  243. package/dist/react-pre-call-lobby.js.map +7 -0
  244. package/dist/react-presence-indicator.js +86 -0
  245. package/dist/react-presence-indicator.js.map +7 -0
  246. package/dist/react-pricing-card.js +142 -0
  247. package/dist/react-pricing-card.js.map +7 -0
  248. package/dist/react-progress-display.js +188 -0
  249. package/dist/react-progress-display.js.map +7 -0
  250. package/dist/react-radial-gauge.js +193 -0
  251. package/dist/react-radial-gauge.js.map +7 -0
  252. package/dist/react-radio.js +169 -0
  253. package/dist/react-radio.js.map +7 -0
  254. package/dist/react-rating-scale.js +171 -0
  255. package/dist/react-rating-scale.js.map +7 -0
  256. package/dist/react-reaction-bar.js +111 -0
  257. package/dist/react-reaction-bar.js.map +7 -0
  258. package/dist/react-resizable-layout.js +298 -0
  259. package/dist/react-resizable-layout.js.map +7 -0
  260. package/dist/react-rich-editor.js +1 -0
  261. package/dist/react-rich-editor.js.map +7 -0
  262. package/dist/react-search-bar.js +285 -0
  263. package/dist/react-search-bar.js.map +7 -0
  264. package/dist/react-section-head.js +65 -0
  265. package/dist/react-section-head.js.map +7 -0
  266. package/dist/react-segmented-control.js +215 -0
  267. package/dist/react-segmented-control.js.map +7 -0
  268. package/dist/react-select.js +389 -0
  269. package/dist/react-select.js.map +7 -0
  270. package/dist/react-separator.js +86 -0
  271. package/dist/react-separator.js.map +7 -0
  272. package/dist/react-sheet.js +310 -0
  273. package/dist/react-sheet.js.map +7 -0
  274. package/dist/react-sidebar.js +100 -0
  275. package/dist/react-sidebar.js.map +7 -0
  276. package/dist/react-skeleton.js +91 -0
  277. package/dist/react-skeleton.js.map +7 -0
  278. package/dist/react-skip-to-content.js +38 -0
  279. package/dist/react-skip-to-content.js.map +7 -0
  280. package/dist/react-slide-viewer.js +264 -0
  281. package/dist/react-slide-viewer.js.map +7 -0
  282. package/dist/react-slider.js +105 -0
  283. package/dist/react-slider.js.map +7 -0
  284. package/dist/react-slot-picker.js +184 -0
  285. package/dist/react-slot-picker.js.map +7 -0
  286. package/dist/react-slot.js +7 -0
  287. package/dist/react-slot.js.map +7 -0
  288. package/dist/react-social-auth-button.js +169 -0
  289. package/dist/react-social-auth-button.js.map +7 -0
  290. package/dist/react-sortable-list.js +204 -0
  291. package/dist/react-sortable-list.js.map +7 -0
  292. package/dist/react-stat-grid.js +69 -0
  293. package/dist/react-stat-grid.js.map +7 -0
  294. package/dist/react-status-indicator.js +117 -0
  295. package/dist/react-status-indicator.js.map +7 -0
  296. package/dist/react-steps.js +167 -0
  297. package/dist/react-steps.js.map +7 -0
  298. package/dist/react-sticky-note.js +131 -0
  299. package/dist/react-sticky-note.js.map +7 -0
  300. package/dist/react-switch.js +139 -0
  301. package/dist/react-switch.js.map +7 -0
  302. package/dist/react-table-of-contents.js +80 -0
  303. package/dist/react-table-of-contents.js.map +7 -0
  304. package/dist/react-tabs.js +230 -0
  305. package/dist/react-tabs.js.map +7 -0
  306. package/dist/react-terminal.js +101 -0
  307. package/dist/react-terminal.js.map +7 -0
  308. package/dist/react-test-results.js +158 -0
  309. package/dist/react-test-results.js.map +7 -0
  310. package/dist/react-textarea.js +89 -0
  311. package/dist/react-textarea.js.map +7 -0
  312. package/dist/react-thread-view.js +139 -0
  313. package/dist/react-thread-view.js.map +7 -0
  314. package/dist/react-timeline.js +153 -0
  315. package/dist/react-timeline.js.map +7 -0
  316. package/dist/react-toast.js +253 -0
  317. package/dist/react-toast.js.map +7 -0
  318. package/dist/react-tooltip.js +221 -0
  319. package/dist/react-tooltip.js.map +7 -0
  320. package/dist/react-version-selector.js +270 -0
  321. package/dist/react-version-selector.js.map +7 -0
  322. package/dist/react-video-grid.js +129 -0
  323. package/dist/react-video-grid.js.map +7 -0
  324. package/dist/react-video-player.js +206 -0
  325. package/dist/react-video-player.js.map +7 -0
  326. package/dist/react-video-tile.js +8 -0
  327. package/dist/react-video-tile.js.map +7 -0
  328. package/dist/react-voice-pill.js +314 -0
  329. package/dist/react-voice-pill.js.map +7 -0
  330. package/dist/react-waveform.js +558 -0
  331. package/dist/react-waveform.js.map +7 -0
  332. package/dist/react-wizard.js +337 -0
  333. package/dist/react-wizard.js.map +7 -0
  334. package/dist/styles.css +7 -0
  335. package/dist/theme.js +1 -1
  336. package/package.json +3 -2
  337. package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
  338. package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
  339. package/dist/chunk-4A4BW3GR.js.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/module-X3HTTRQK.js +0 -6438
  342. package/dist/module-X3HTTRQK.js.map +0 -1
@@ -0,0 +1,252 @@
1
+ import {
2
+ cn,
3
+ generateId
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-location-selector/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../i18n/dist/index.js
10
+ var LANGUAGES = {
11
+ // English variants
12
+ "en": { code: "en", name: "English", nativeName: "English", direction: "ltr", group: "English" },
13
+ "en-US": { code: "en-US", name: "English (US)", nativeName: "English (US)", direction: "ltr", group: "English" },
14
+ "en-GB": { code: "en-GB", name: "English (UK)", nativeName: "English (UK)", direction: "ltr", group: "English" },
15
+ "en-IN": { code: "en-IN", name: "English (India)", nativeName: "English (India)", direction: "ltr", group: "English" },
16
+ // Indian languages
17
+ "hi": { code: "hi", name: "Hindi", nativeName: "\u0939\u093F\u0928\u094D\u0926\u0940", direction: "ltr", group: "Indian" },
18
+ "te": { code: "te", name: "Telugu", nativeName: "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41", direction: "ltr", group: "Indian" },
19
+ "ta": { code: "ta", name: "Tamil", nativeName: "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", direction: "ltr", group: "Indian" },
20
+ "ur": { code: "ur", name: "Urdu", nativeName: "\u0627\u0631\u062F\u0648", direction: "rtl", group: "Indian" },
21
+ "pa": { code: "pa", name: "Punjabi", nativeName: "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40", direction: "ltr", group: "Indian" },
22
+ "bn": { code: "bn", name: "Bengali", nativeName: "\u09AC\u09BE\u0982\u09B2\u09BE", direction: "ltr", group: "Indian" },
23
+ "gu": { code: "gu", name: "Gujarati", nativeName: "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0", direction: "ltr", group: "Indian" },
24
+ "mr": { code: "mr", name: "Marathi", nativeName: "\u092E\u0930\u093E\u0920\u0940", direction: "ltr", group: "Indian" },
25
+ "kn": { code: "kn", name: "Kannada", nativeName: "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1", direction: "ltr", group: "Indian" },
26
+ "ml": { code: "ml", name: "Malayalam", nativeName: "\u0D2E\u0D32\u0D2F\u0D3E\u0D33\u0D02", direction: "ltr", group: "Indian" },
27
+ // Western European
28
+ "fr": { code: "fr", name: "French", nativeName: "Fran\xE7ais", direction: "ltr", group: "European" },
29
+ "es": { code: "es", name: "Spanish", nativeName: "Espa\xF1ol", direction: "ltr", group: "European" },
30
+ "de": { code: "de", name: "German", nativeName: "Deutsch", direction: "ltr", group: "European" },
31
+ "it": { code: "it", name: "Italian", nativeName: "Italiano", direction: "ltr", group: "European" },
32
+ "pt": { code: "pt", name: "Portuguese", nativeName: "Portugu\xEAs", direction: "ltr", group: "European" },
33
+ "pt-BR": { code: "pt-BR", name: "Portuguese (Brazil)", nativeName: "Portugu\xEAs (Brasil)", direction: "ltr", group: "European" },
34
+ "nl": { code: "nl", name: "Dutch", nativeName: "Nederlands", direction: "ltr", group: "European" },
35
+ // Nordic
36
+ "sv": { code: "sv", name: "Swedish", nativeName: "Svenska", direction: "ltr", group: "European" },
37
+ "da": { code: "da", name: "Danish", nativeName: "Dansk", direction: "ltr", group: "European" },
38
+ "no": { code: "no", name: "Norwegian", nativeName: "Norsk", direction: "ltr", group: "European" },
39
+ "fi": { code: "fi", name: "Finnish", nativeName: "Suomi", direction: "ltr", group: "European" },
40
+ // Eastern European
41
+ "pl": { code: "pl", name: "Polish", nativeName: "Polski", direction: "ltr", group: "European" },
42
+ "cs": { code: "cs", name: "Czech", nativeName: "\u010Ce\u0161tina", direction: "ltr", group: "European" },
43
+ "ro": { code: "ro", name: "Romanian", nativeName: "Rom\xE2n\u0103", direction: "ltr", group: "European" },
44
+ "hu": { code: "hu", name: "Hungarian", nativeName: "Magyar", direction: "ltr", group: "European" },
45
+ "bg": { code: "bg", name: "Bulgarian", nativeName: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", direction: "ltr", group: "European" },
46
+ "hr": { code: "hr", name: "Croatian", nativeName: "Hrvatski", direction: "ltr", group: "European" },
47
+ "sk": { code: "sk", name: "Slovak", nativeName: "Sloven\u010Dina", direction: "ltr", group: "European" },
48
+ "sl": { code: "sl", name: "Slovenian", nativeName: "Sloven\u0161\u010Dina", direction: "ltr", group: "European" },
49
+ "sr": { code: "sr", name: "Serbian", nativeName: "Srpski", direction: "ltr", group: "European" },
50
+ "uk": { code: "uk", name: "Ukrainian", nativeName: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430", direction: "ltr", group: "European" },
51
+ "el": { code: "el", name: "Greek", nativeName: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC", direction: "ltr", group: "European" },
52
+ "ru": { code: "ru", name: "Russian", nativeName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", direction: "ltr", group: "European" },
53
+ // East Asian
54
+ "ja": { code: "ja", name: "Japanese", nativeName: "\u65E5\u672C\u8A9E", direction: "ltr", group: "East Asian" },
55
+ "ko": { code: "ko", name: "Korean", nativeName: "\uD55C\uAD6D\uC5B4", direction: "ltr", group: "East Asian" },
56
+ "zh": { code: "zh", name: "Chinese (Simplified)", nativeName: "\u4E2D\u6587\uFF08\u7B80\u4F53\uFF09", direction: "ltr", group: "East Asian" },
57
+ "zh-TW": { code: "zh-TW", name: "Chinese (Traditional)", nativeName: "\u4E2D\u6587\uFF08\u7E41\u9AD4\uFF09", direction: "ltr", group: "East Asian" },
58
+ // Middle Eastern
59
+ "ar": { code: "ar", name: "Arabic", nativeName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", direction: "rtl", group: "Middle Eastern" },
60
+ "he": { code: "he", name: "Hebrew", nativeName: "\u05E2\u05D1\u05E8\u05D9\u05EA", direction: "rtl", group: "Middle Eastern" },
61
+ "tr": { code: "tr", name: "Turkish", nativeName: "T\xFCrk\xE7e", direction: "ltr", group: "Middle Eastern" },
62
+ // Southeast Asian
63
+ "th": { code: "th", name: "Thai", nativeName: "\u0E44\u0E17\u0E22", direction: "ltr", group: "Southeast Asian" },
64
+ "vi": { code: "vi", name: "Vietnamese", nativeName: "Ti\u1EBFng Vi\u1EC7t", direction: "ltr", group: "Southeast Asian" },
65
+ "id": { code: "id", name: "Indonesian", nativeName: "Bahasa Indonesia", direction: "ltr", group: "Southeast Asian" },
66
+ "ms": { code: "ms", name: "Malay", nativeName: "Bahasa Melayu", direction: "ltr", group: "Southeast Asian" }
67
+ };
68
+ var COUNTRIES = {
69
+ // North America
70
+ "US": { code: "US", name: "United States", flag: "\u{1F1FA}\u{1F1F8}", defaultLanguages: ["en"], timezone: "America/New_York" },
71
+ "CA": { code: "CA", name: "Canada", flag: "\u{1F1E8}\u{1F1E6}", defaultLanguages: ["en", "fr"], timezone: "America/Toronto" },
72
+ "MX": { code: "MX", name: "Mexico", flag: "\u{1F1F2}\u{1F1FD}", defaultLanguages: ["es"], timezone: "America/Mexico_City" },
73
+ // UK & Ireland
74
+ "GB": { code: "GB", name: "United Kingdom", flag: "\u{1F1EC}\u{1F1E7}", defaultLanguages: ["en"], timezone: "Europe/London" },
75
+ "IE": { code: "IE", name: "Ireland", flag: "\u{1F1EE}\u{1F1EA}", defaultLanguages: ["en"], timezone: "Europe/Dublin" },
76
+ // Oceania
77
+ "AU": { code: "AU", name: "Australia", flag: "\u{1F1E6}\u{1F1FA}", defaultLanguages: ["en"], timezone: "Australia/Sydney" },
78
+ "NZ": { code: "NZ", name: "New Zealand", flag: "\u{1F1F3}\u{1F1FF}", defaultLanguages: ["en"], timezone: "Pacific/Auckland" },
79
+ // South Asia
80
+ "IN": { code: "IN", name: "India", flag: "\u{1F1EE}\u{1F1F3}", defaultLanguages: ["hi", "en"], timezone: "Asia/Kolkata" },
81
+ "PK": { code: "PK", name: "Pakistan", flag: "\u{1F1F5}\u{1F1F0}", defaultLanguages: ["ur", "en"], timezone: "Asia/Karachi" },
82
+ "BD": { code: "BD", name: "Bangladesh", flag: "\u{1F1E7}\u{1F1E9}", defaultLanguages: ["bn"], timezone: "Asia/Dhaka" },
83
+ "LK": { code: "LK", name: "Sri Lanka", flag: "\u{1F1F1}\u{1F1F0}", defaultLanguages: ["ta", "en"], timezone: "Asia/Colombo" },
84
+ "NP": { code: "NP", name: "Nepal", flag: "\u{1F1F3}\u{1F1F5}", defaultLanguages: ["hi", "en"], timezone: "Asia/Kathmandu" },
85
+ // Western Europe
86
+ "FR": { code: "FR", name: "France", flag: "\u{1F1EB}\u{1F1F7}", defaultLanguages: ["fr"], timezone: "Europe/Paris" },
87
+ "DE": { code: "DE", name: "Germany", flag: "\u{1F1E9}\u{1F1EA}", defaultLanguages: ["de"], timezone: "Europe/Berlin" },
88
+ "ES": { code: "ES", name: "Spain", flag: "\u{1F1EA}\u{1F1F8}", defaultLanguages: ["es"], timezone: "Europe/Madrid" },
89
+ "IT": { code: "IT", name: "Italy", flag: "\u{1F1EE}\u{1F1F9}", defaultLanguages: ["it"], timezone: "Europe/Rome" },
90
+ "PT": { code: "PT", name: "Portugal", flag: "\u{1F1F5}\u{1F1F9}", defaultLanguages: ["pt"], timezone: "Europe/Lisbon" },
91
+ "NL": { code: "NL", name: "Netherlands", flag: "\u{1F1F3}\u{1F1F1}", defaultLanguages: ["nl"], timezone: "Europe/Amsterdam" },
92
+ "BE": { code: "BE", name: "Belgium", flag: "\u{1F1E7}\u{1F1EA}", defaultLanguages: ["nl", "fr", "de"], timezone: "Europe/Brussels" },
93
+ "CH": { code: "CH", name: "Switzerland", flag: "\u{1F1E8}\u{1F1ED}", defaultLanguages: ["de", "fr", "it"], timezone: "Europe/Zurich" },
94
+ "AT": { code: "AT", name: "Austria", flag: "\u{1F1E6}\u{1F1F9}", defaultLanguages: ["de"], timezone: "Europe/Vienna" },
95
+ // Nordic
96
+ "SE": { code: "SE", name: "Sweden", flag: "\u{1F1F8}\u{1F1EA}", defaultLanguages: ["sv"], timezone: "Europe/Stockholm" },
97
+ "NO": { code: "NO", name: "Norway", flag: "\u{1F1F3}\u{1F1F4}", defaultLanguages: ["no"], timezone: "Europe/Oslo" },
98
+ "DK": { code: "DK", name: "Denmark", flag: "\u{1F1E9}\u{1F1F0}", defaultLanguages: ["da"], timezone: "Europe/Copenhagen" },
99
+ "FI": { code: "FI", name: "Finland", flag: "\u{1F1EB}\u{1F1EE}", defaultLanguages: ["fi"], timezone: "Europe/Helsinki" },
100
+ // Eastern Europe
101
+ "PL": { code: "PL", name: "Poland", flag: "\u{1F1F5}\u{1F1F1}", defaultLanguages: ["pl"], timezone: "Europe/Warsaw" },
102
+ "CZ": { code: "CZ", name: "Czech Republic", flag: "\u{1F1E8}\u{1F1FF}", defaultLanguages: ["cs"], timezone: "Europe/Prague" },
103
+ "RO": { code: "RO", name: "Romania", flag: "\u{1F1F7}\u{1F1F4}", defaultLanguages: ["ro"], timezone: "Europe/Bucharest" },
104
+ "HU": { code: "HU", name: "Hungary", flag: "\u{1F1ED}\u{1F1FA}", defaultLanguages: ["hu"], timezone: "Europe/Budapest" },
105
+ "BG": { code: "BG", name: "Bulgaria", flag: "\u{1F1E7}\u{1F1EC}", defaultLanguages: ["bg"], timezone: "Europe/Sofia" },
106
+ "HR": { code: "HR", name: "Croatia", flag: "\u{1F1ED}\u{1F1F7}", defaultLanguages: ["hr"], timezone: "Europe/Zagreb" },
107
+ "SK": { code: "SK", name: "Slovakia", flag: "\u{1F1F8}\u{1F1F0}", defaultLanguages: ["sk"], timezone: "Europe/Bratislava" },
108
+ "SI": { code: "SI", name: "Slovenia", flag: "\u{1F1F8}\u{1F1EE}", defaultLanguages: ["sl"], timezone: "Europe/Ljubljana" },
109
+ "RS": { code: "RS", name: "Serbia", flag: "\u{1F1F7}\u{1F1F8}", defaultLanguages: ["sr"], timezone: "Europe/Belgrade" },
110
+ "UA": { code: "UA", name: "Ukraine", flag: "\u{1F1FA}\u{1F1E6}", defaultLanguages: ["uk"], timezone: "Europe/Kyiv" },
111
+ "RU": { code: "RU", name: "Russia", flag: "\u{1F1F7}\u{1F1FA}", defaultLanguages: ["ru"], timezone: "Europe/Moscow" },
112
+ "TR": { code: "TR", name: "Turkey", flag: "\u{1F1F9}\u{1F1F7}", defaultLanguages: ["tr"], timezone: "Europe/Istanbul" },
113
+ "GR": { code: "GR", name: "Greece", flag: "\u{1F1EC}\u{1F1F7}", defaultLanguages: ["el"], timezone: "Europe/Athens" },
114
+ // East Asia
115
+ "JP": { code: "JP", name: "Japan", flag: "\u{1F1EF}\u{1F1F5}", defaultLanguages: ["ja"], timezone: "Asia/Tokyo" },
116
+ "KR": { code: "KR", name: "South Korea", flag: "\u{1F1F0}\u{1F1F7}", defaultLanguages: ["ko"], timezone: "Asia/Seoul" },
117
+ "CN": { code: "CN", name: "China", flag: "\u{1F1E8}\u{1F1F3}", defaultLanguages: ["zh"], timezone: "Asia/Shanghai" },
118
+ "TW": { code: "TW", name: "Taiwan", flag: "\u{1F1F9}\u{1F1FC}", defaultLanguages: ["zh"], timezone: "Asia/Taipei" },
119
+ // Southeast Asia
120
+ "TH": { code: "TH", name: "Thailand", flag: "\u{1F1F9}\u{1F1ED}", defaultLanguages: ["th"], timezone: "Asia/Bangkok" },
121
+ "VN": { code: "VN", name: "Vietnam", flag: "\u{1F1FB}\u{1F1F3}", defaultLanguages: ["vi"], timezone: "Asia/Ho_Chi_Minh" },
122
+ "ID": { code: "ID", name: "Indonesia", flag: "\u{1F1EE}\u{1F1E9}", defaultLanguages: ["id"], timezone: "Asia/Jakarta" },
123
+ "MY": { code: "MY", name: "Malaysia", flag: "\u{1F1F2}\u{1F1FE}", defaultLanguages: ["ms", "en"], timezone: "Asia/Kuala_Lumpur" },
124
+ "PH": { code: "PH", name: "Philippines", flag: "\u{1F1F5}\u{1F1ED}", defaultLanguages: ["en"], timezone: "Asia/Manila" },
125
+ "SG": { code: "SG", name: "Singapore", flag: "\u{1F1F8}\u{1F1EC}", defaultLanguages: ["en", "ms", "zh"], timezone: "Asia/Singapore" },
126
+ // South America
127
+ "BR": { code: "BR", name: "Brazil", flag: "\u{1F1E7}\u{1F1F7}", defaultLanguages: ["pt"], timezone: "America/Sao_Paulo" },
128
+ "AR": { code: "AR", name: "Argentina", flag: "\u{1F1E6}\u{1F1F7}", defaultLanguages: ["es"], timezone: "America/Argentina/Buenos_Aires" },
129
+ "CO": { code: "CO", name: "Colombia", flag: "\u{1F1E8}\u{1F1F4}", defaultLanguages: ["es"], timezone: "America/Bogota" },
130
+ "CL": { code: "CL", name: "Chile", flag: "\u{1F1E8}\u{1F1F1}", defaultLanguages: ["es"], timezone: "America/Santiago" },
131
+ // Middle East & North Africa
132
+ "SA": { code: "SA", name: "Saudi Arabia", flag: "\u{1F1F8}\u{1F1E6}", defaultLanguages: ["ar"], timezone: "Asia/Riyadh" },
133
+ "AE": { code: "AE", name: "United Arab Emirates", flag: "\u{1F1E6}\u{1F1EA}", defaultLanguages: ["ar", "en"], timezone: "Asia/Dubai" },
134
+ "IL": { code: "IL", name: "Israel", flag: "\u{1F1EE}\u{1F1F1}", defaultLanguages: ["he"], timezone: "Asia/Jerusalem" },
135
+ "EG": { code: "EG", name: "Egypt", flag: "\u{1F1EA}\u{1F1EC}", defaultLanguages: ["ar"], timezone: "Africa/Cairo" }
136
+ };
137
+
138
+ // ../location-selector/dist/index.js
139
+ function createLocationSelector(options = {}) {
140
+ const {
141
+ defaultCountry = "US",
142
+ defaultLanguage = "en",
143
+ onCountryChange,
144
+ onLanguageChange
145
+ } = options;
146
+ const state = {
147
+ country: defaultCountry,
148
+ language: defaultLanguage
149
+ };
150
+ const countryId = generateId("location-sel-country");
151
+ const languageId = generateId("location-sel-language");
152
+ function setCountry(country) {
153
+ state.country = country;
154
+ onCountryChange?.(country);
155
+ }
156
+ function setLanguage(language) {
157
+ state.language = language;
158
+ onLanguageChange?.(language);
159
+ }
160
+ const countries = Array.isArray(COUNTRIES) ? COUNTRIES : Object.values(COUNTRIES);
161
+ const languages = Array.isArray(LANGUAGES) ? LANGUAGES : Object.values(LANGUAGES);
162
+ return {
163
+ state,
164
+ setCountry,
165
+ setLanguage,
166
+ countries,
167
+ languages,
168
+ countryProps: {
169
+ id: countryId,
170
+ name: "country"
171
+ },
172
+ languageProps: {
173
+ id: languageId,
174
+ name: "language"
175
+ }
176
+ };
177
+ }
178
+
179
+ // ../react-location-selector/dist/index.js
180
+ var LocationSelector = React.forwardRef(
181
+ function LocationSelector2({ defaultCountry = "US", defaultLanguage = "en", onCountryChange, onLanguageChange, className }, ref) {
182
+ const [country, setCountry] = React.useState(defaultCountry);
183
+ const [language, setLanguage] = React.useState(defaultLanguage);
184
+ const handleCountryChange = React.useCallback(
185
+ (c) => {
186
+ setCountry(c);
187
+ onCountryChange?.(c);
188
+ },
189
+ [onCountryChange]
190
+ );
191
+ const handleLanguageChange = React.useCallback(
192
+ (l) => {
193
+ setLanguage(l);
194
+ onLanguageChange?.(l);
195
+ },
196
+ [onLanguageChange]
197
+ );
198
+ const api = React.useMemo(
199
+ () => createLocationSelector({
200
+ defaultCountry,
201
+ defaultLanguage,
202
+ onCountryChange: handleCountryChange,
203
+ onLanguageChange: handleLanguageChange
204
+ }),
205
+ [defaultCountry, defaultLanguage, handleCountryChange, handleLanguageChange]
206
+ );
207
+ return React.createElement(
208
+ "div",
209
+ { ref, className: cn("flex flex-col gap-4 sm:flex-row", className) },
210
+ React.createElement(
211
+ "div",
212
+ { className: "flex flex-col gap-1.5 flex-1" },
213
+ React.createElement("label", { htmlFor: api.countryProps.id, className: "text-sm font-medium" }, "Country"),
214
+ React.createElement(
215
+ "select",
216
+ {
217
+ id: api.countryProps.id,
218
+ name: api.countryProps.name,
219
+ value: country,
220
+ onChange: (e) => api.setCountry(e.target.value),
221
+ className: "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
222
+ },
223
+ api.countries.map(
224
+ (c) => React.createElement("option", { key: c.code || c.id || c, value: c.code || c.id || c }, c.name || c.label || c)
225
+ )
226
+ )
227
+ ),
228
+ React.createElement(
229
+ "div",
230
+ { className: "flex flex-col gap-1.5 flex-1" },
231
+ React.createElement("label", { htmlFor: api.languageProps.id, className: "text-sm font-medium" }, "Language"),
232
+ React.createElement(
233
+ "select",
234
+ {
235
+ id: api.languageProps.id,
236
+ name: api.languageProps.name,
237
+ value: language,
238
+ onChange: (e) => api.setLanguage(e.target.value),
239
+ className: "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
240
+ },
241
+ api.languages.map(
242
+ (l) => React.createElement("option", { key: l.code || l.id || l, value: l.code || l.id || l }, l.name || l.label || l)
243
+ )
244
+ )
245
+ )
246
+ );
247
+ }
248
+ );
249
+ export {
250
+ LocationSelector
251
+ };
252
+ //# sourceMappingURL=react-location-selector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../react-location-selector/dist/index.js", "../../i18n/src/languages.ts", "../../i18n/src/countries.ts", "../../i18n/src/detect-region.ts", "../../i18n/src/voice-registry.ts", "../../i18n/src/locale-utils.ts", "../../location-selector/dist/index.js"],
4
+ "sourcesContent": ["// src/location-selector.tsx\nimport * as React from \"react\";\nimport { createLocationSelector } from \"@refraction-ui/location-selector\";\nimport { cn } from \"@refraction-ui/shared\";\nvar LocationSelector = React.forwardRef(\n function LocationSelector2({ defaultCountry = \"US\", defaultLanguage = \"en\", onCountryChange, onLanguageChange, className }, ref) {\n const [country, setCountry] = React.useState(defaultCountry);\n const [language, setLanguage] = React.useState(defaultLanguage);\n const handleCountryChange = React.useCallback(\n (c) => {\n setCountry(c);\n onCountryChange?.(c);\n },\n [onCountryChange]\n );\n const handleLanguageChange = React.useCallback(\n (l) => {\n setLanguage(l);\n onLanguageChange?.(l);\n },\n [onLanguageChange]\n );\n const api = React.useMemo(\n () => createLocationSelector({\n defaultCountry,\n defaultLanguage,\n onCountryChange: handleCountryChange,\n onLanguageChange: handleLanguageChange\n }),\n [defaultCountry, defaultLanguage, handleCountryChange, handleLanguageChange]\n );\n return React.createElement(\n \"div\",\n { ref, className: cn(\"flex flex-col gap-4 sm:flex-row\", className) },\n React.createElement(\n \"div\",\n { className: \"flex flex-col gap-1.5 flex-1\" },\n React.createElement(\"label\", { htmlFor: api.countryProps.id, className: \"text-sm font-medium\" }, \"Country\"),\n React.createElement(\n \"select\",\n {\n id: api.countryProps.id,\n name: api.countryProps.name,\n value: country,\n onChange: (e) => api.setCountry(e.target.value),\n className: \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n },\n api.countries.map(\n (c) => React.createElement(\"option\", { key: c.code || c.id || c, value: c.code || c.id || c }, c.name || c.label || c)\n )\n )\n ),\n React.createElement(\n \"div\",\n { className: \"flex flex-col gap-1.5 flex-1\" },\n React.createElement(\"label\", { htmlFor: api.languageProps.id, className: \"text-sm font-medium\" }, \"Language\"),\n React.createElement(\n \"select\",\n {\n id: api.languageProps.id,\n name: api.languageProps.name,\n value: language,\n onChange: (e) => api.setLanguage(e.target.value),\n className: \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n },\n api.languages.map(\n (l) => React.createElement(\"option\", { key: l.code || l.id || l, value: l.code || l.id || l }, l.name || l.label || l)\n )\n )\n )\n );\n }\n);\nexport {\n LocationSelector\n};\n", "/**\n * Language type and registry for i18n support.\n */\n\nexport interface Language {\n code: string\n name: string\n nativeName: string\n direction: 'ltr' | 'rtl'\n group?: string\n}\n\nexport const LANGUAGES: Record<string, Language> = {\n // English variants\n 'en': { code: 'en', name: 'English', nativeName: 'English', direction: 'ltr', group: 'English' },\n 'en-US': { code: 'en-US', name: 'English (US)', nativeName: 'English (US)', direction: 'ltr', group: 'English' },\n 'en-GB': { code: 'en-GB', name: 'English (UK)', nativeName: 'English (UK)', direction: 'ltr', group: 'English' },\n 'en-IN': { code: 'en-IN', name: 'English (India)', nativeName: 'English (India)',direction: 'ltr', group: 'English' },\n\n // Indian languages\n 'hi': { code: 'hi', name: 'Hindi', nativeName: 'हिन्दी', direction: 'ltr', group: 'Indian' },\n 'te': { code: 'te', name: 'Telugu', nativeName: 'తెలుగు', direction: 'ltr', group: 'Indian' },\n 'ta': { code: 'ta', name: 'Tamil', nativeName: 'தமிழ்', direction: 'ltr', group: 'Indian' },\n 'ur': { code: 'ur', name: 'Urdu', nativeName: 'اردو', direction: 'rtl', group: 'Indian' },\n 'pa': { code: 'pa', name: 'Punjabi', nativeName: 'ਪੰਜਾਬੀ', direction: 'ltr', group: 'Indian' },\n 'bn': { code: 'bn', name: 'Bengali', nativeName: 'বাংলা', direction: 'ltr', group: 'Indian' },\n 'gu': { code: 'gu', name: 'Gujarati', nativeName: 'ગુજરાતી', direction: 'ltr', group: 'Indian' },\n 'mr': { code: 'mr', name: 'Marathi', nativeName: 'मराठी', direction: 'ltr', group: 'Indian' },\n 'kn': { code: 'kn', name: 'Kannada', nativeName: 'ಕನ್ನಡ', direction: 'ltr', group: 'Indian' },\n 'ml': { code: 'ml', name: 'Malayalam', nativeName: 'മലയാളം', direction: 'ltr', group: 'Indian' },\n\n // Western European\n 'fr': { code: 'fr', name: 'French', nativeName: 'Français', direction: 'ltr', group: 'European' },\n 'es': { code: 'es', name: 'Spanish', nativeName: 'Español', direction: 'ltr', group: 'European' },\n 'de': { code: 'de', name: 'German', nativeName: 'Deutsch', direction: 'ltr', group: 'European' },\n 'it': { code: 'it', name: 'Italian', nativeName: 'Italiano', direction: 'ltr', group: 'European' },\n 'pt': { code: 'pt', name: 'Portuguese', nativeName: 'Português', direction: 'ltr', group: 'European' },\n 'pt-BR': { code: 'pt-BR', name: 'Portuguese (Brazil)', nativeName: 'Português (Brasil)', direction: 'ltr', group: 'European' },\n 'nl': { code: 'nl', name: 'Dutch', nativeName: 'Nederlands', direction: 'ltr', group: 'European' },\n\n // Nordic\n 'sv': { code: 'sv', name: 'Swedish', nativeName: 'Svenska', direction: 'ltr', group: 'European' },\n 'da': { code: 'da', name: 'Danish', nativeName: 'Dansk', direction: 'ltr', group: 'European' },\n 'no': { code: 'no', name: 'Norwegian', nativeName: 'Norsk', direction: 'ltr', group: 'European' },\n 'fi': { code: 'fi', name: 'Finnish', nativeName: 'Suomi', direction: 'ltr', group: 'European' },\n\n // Eastern European\n 'pl': { code: 'pl', name: 'Polish', nativeName: 'Polski', direction: 'ltr', group: 'European' },\n 'cs': { code: 'cs', name: 'Czech', nativeName: 'Čeština', direction: 'ltr', group: 'European' },\n 'ro': { code: 'ro', name: 'Romanian', nativeName: 'Română', direction: 'ltr', group: 'European' },\n 'hu': { code: 'hu', name: 'Hungarian', nativeName: 'Magyar', direction: 'ltr', group: 'European' },\n 'bg': { code: 'bg', name: 'Bulgarian', nativeName: 'Български', direction: 'ltr', group: 'European' },\n 'hr': { code: 'hr', name: 'Croatian', nativeName: 'Hrvatski', direction: 'ltr', group: 'European' },\n 'sk': { code: 'sk', name: 'Slovak', nativeName: 'Slovenčina', direction: 'ltr', group: 'European' },\n 'sl': { code: 'sl', name: 'Slovenian', nativeName: 'Slovenščina', direction: 'ltr', group: 'European' },\n 'sr': { code: 'sr', name: 'Serbian', nativeName: 'Srpski', direction: 'ltr', group: 'European' },\n 'uk': { code: 'uk', name: 'Ukrainian', nativeName: 'Українська', direction: 'ltr', group: 'European' },\n 'el': { code: 'el', name: 'Greek', nativeName: 'Ελληνικά', direction: 'ltr', group: 'European' },\n 'ru': { code: 'ru', name: 'Russian', nativeName: 'Русский', direction: 'ltr', group: 'European' },\n\n // East Asian\n 'ja': { code: 'ja', name: 'Japanese', nativeName: '日本語', direction: 'ltr', group: 'East Asian' },\n 'ko': { code: 'ko', name: 'Korean', nativeName: '한국어', direction: 'ltr', group: 'East Asian' },\n 'zh': { code: 'zh', name: 'Chinese (Simplified)', nativeName: '中文(简体)', direction: 'ltr', group: 'East Asian' },\n 'zh-TW': { code: 'zh-TW', name: 'Chinese (Traditional)', nativeName: '中文(繁體)', direction: 'ltr', group: 'East Asian' },\n\n // Middle Eastern\n 'ar': { code: 'ar', name: 'Arabic', nativeName: 'العربية', direction: 'rtl', group: 'Middle Eastern' },\n 'he': { code: 'he', name: 'Hebrew', nativeName: 'עברית', direction: 'rtl', group: 'Middle Eastern' },\n 'tr': { code: 'tr', name: 'Turkish', nativeName: 'Türkçe', direction: 'ltr', group: 'Middle Eastern' },\n\n // Southeast Asian\n 'th': { code: 'th', name: 'Thai', nativeName: 'ไทย', direction: 'ltr', group: 'Southeast Asian' },\n 'vi': { code: 'vi', name: 'Vietnamese', nativeName: 'Tiếng Việt', direction: 'ltr', group: 'Southeast Asian' },\n 'id': { code: 'id', name: 'Indonesian', nativeName: 'Bahasa Indonesia', direction: 'ltr', group: 'Southeast Asian' },\n 'ms': { code: 'ms', name: 'Malay', nativeName: 'Bahasa Melayu', direction: 'ltr', group: 'Southeast Asian' },\n}\n\n/** BCP-47 TTS language tag mappings for base language codes */\nconst TTS_LANG_MAP: Record<string, string> = {\n 'en': 'en-US',\n 'en-US': 'en-US',\n 'en-GB': 'en-GB',\n 'en-IN': 'en-IN',\n 'hi': 'hi-IN',\n 'te': 'te-IN',\n 'ta': 'ta-IN',\n 'ur': 'ur-PK',\n 'pa': 'pa-IN',\n 'bn': 'bn-IN',\n 'gu': 'gu-IN',\n 'mr': 'mr-IN',\n 'kn': 'kn-IN',\n 'ml': 'ml-IN',\n 'fr': 'fr-FR',\n 'es': 'es-ES',\n 'de': 'de-DE',\n 'it': 'it-IT',\n 'pt': 'pt-PT',\n 'pt-BR': 'pt-BR',\n 'nl': 'nl-NL',\n 'sv': 'sv-SE',\n 'da': 'da-DK',\n 'no': 'nb-NO',\n 'fi': 'fi-FI',\n 'pl': 'pl-PL',\n 'cs': 'cs-CZ',\n 'ro': 'ro-RO',\n 'hu': 'hu-HU',\n 'bg': 'bg-BG',\n 'hr': 'hr-HR',\n 'sk': 'sk-SK',\n 'sl': 'sl-SI',\n 'sr': 'sr-RS',\n 'uk': 'uk-UA',\n 'el': 'el-GR',\n 'ru': 'ru-RU',\n 'ja': 'ja-JP',\n 'ko': 'ko-KR',\n 'zh': 'zh-CN',\n 'zh-TW': 'zh-TW',\n 'ar': 'ar-SA',\n 'he': 'he-IL',\n 'tr': 'tr-TR',\n 'th': 'th-TH',\n 'vi': 'vi-VN',\n 'id': 'id-ID',\n 'ms': 'ms-MY',\n}\n\n/**\n * Get a language by its code.\n */\nexport function getLanguage(code: string): Language | undefined {\n return LANGUAGES[code]\n}\n\n/**\n * Get all supported languages as an array.\n */\nexport function getSupportedLanguages(): Language[] {\n return Object.values(LANGUAGES)\n}\n\n/**\n * Get languages grouped by their language family/group.\n */\nexport function getLanguagesByGroup(): Record<string, Language[]> {\n const groups: Record<string, Language[]> = {}\n for (const lang of Object.values(LANGUAGES)) {\n const group = lang.group ?? 'Other'\n if (!groups[group]) {\n groups[group] = []\n }\n groups[group].push(lang)\n }\n return groups\n}\n\n/**\n * Get the display name for a language code.\n * Returns empty string if the code is not found.\n */\nexport function getLanguageName(code: string): string {\n return LANGUAGES[code]?.name ?? ''\n}\n\n/**\n * Check if a language code represents a right-to-left language.\n */\nexport function isRTL(code: string): boolean {\n return LANGUAGES[code]?.direction === 'rtl'\n}\n\n/**\n * Get the BCP-47 language tag suitable for TTS engines.\n * Returns the code itself if no mapping exists.\n */\nexport function getTtsLang(code: string): string {\n return TTS_LANG_MAP[code] ?? code\n}\n", "/**\n * Country type and registry for i18n support.\n */\n\nexport interface Country {\n code: string\n name: string\n flag: string\n defaultLanguages: string[]\n timezone?: string\n}\n\nexport const COUNTRIES: Record<string, Country> = {\n // North America\n 'US': { code: 'US', name: 'United States', flag: '🇺🇸', defaultLanguages: ['en'], timezone: 'America/New_York' },\n 'CA': { code: 'CA', name: 'Canada', flag: '🇨🇦', defaultLanguages: ['en', 'fr'], timezone: 'America/Toronto' },\n 'MX': { code: 'MX', name: 'Mexico', flag: '🇲🇽', defaultLanguages: ['es'], timezone: 'America/Mexico_City' },\n\n // UK & Ireland\n 'GB': { code: 'GB', name: 'United Kingdom', flag: '🇬🇧', defaultLanguages: ['en'], timezone: 'Europe/London' },\n 'IE': { code: 'IE', name: 'Ireland', flag: '🇮🇪', defaultLanguages: ['en'], timezone: 'Europe/Dublin' },\n\n // Oceania\n 'AU': { code: 'AU', name: 'Australia', flag: '🇦🇺', defaultLanguages: ['en'], timezone: 'Australia/Sydney' },\n 'NZ': { code: 'NZ', name: 'New Zealand', flag: '🇳🇿', defaultLanguages: ['en'], timezone: 'Pacific/Auckland' },\n\n // South Asia\n 'IN': { code: 'IN', name: 'India', flag: '🇮🇳', defaultLanguages: ['hi', 'en'], timezone: 'Asia/Kolkata' },\n 'PK': { code: 'PK', name: 'Pakistan', flag: '🇵🇰', defaultLanguages: ['ur', 'en'], timezone: 'Asia/Karachi' },\n 'BD': { code: 'BD', name: 'Bangladesh', flag: '🇧🇩', defaultLanguages: ['bn'], timezone: 'Asia/Dhaka' },\n 'LK': { code: 'LK', name: 'Sri Lanka', flag: '🇱🇰', defaultLanguages: ['ta', 'en'], timezone: 'Asia/Colombo' },\n 'NP': { code: 'NP', name: 'Nepal', flag: '🇳🇵', defaultLanguages: ['hi', 'en'], timezone: 'Asia/Kathmandu' },\n\n // Western Europe\n 'FR': { code: 'FR', name: 'France', flag: '🇫🇷', defaultLanguages: ['fr'], timezone: 'Europe/Paris' },\n 'DE': { code: 'DE', name: 'Germany', flag: '🇩🇪', defaultLanguages: ['de'], timezone: 'Europe/Berlin' },\n 'ES': { code: 'ES', name: 'Spain', flag: '🇪🇸', defaultLanguages: ['es'], timezone: 'Europe/Madrid' },\n 'IT': { code: 'IT', name: 'Italy', flag: '🇮🇹', defaultLanguages: ['it'], timezone: 'Europe/Rome' },\n 'PT': { code: 'PT', name: 'Portugal', flag: '🇵🇹', defaultLanguages: ['pt'], timezone: 'Europe/Lisbon' },\n 'NL': { code: 'NL', name: 'Netherlands', flag: '🇳🇱', defaultLanguages: ['nl'], timezone: 'Europe/Amsterdam' },\n 'BE': { code: 'BE', name: 'Belgium', flag: '🇧🇪', defaultLanguages: ['nl', 'fr', 'de'], timezone: 'Europe/Brussels' },\n 'CH': { code: 'CH', name: 'Switzerland', flag: '🇨🇭', defaultLanguages: ['de', 'fr', 'it'], timezone: 'Europe/Zurich' },\n 'AT': { code: 'AT', name: 'Austria', flag: '🇦🇹', defaultLanguages: ['de'], timezone: 'Europe/Vienna' },\n\n // Nordic\n 'SE': { code: 'SE', name: 'Sweden', flag: '🇸🇪', defaultLanguages: ['sv'], timezone: 'Europe/Stockholm' },\n 'NO': { code: 'NO', name: 'Norway', flag: '🇳🇴', defaultLanguages: ['no'], timezone: 'Europe/Oslo' },\n 'DK': { code: 'DK', name: 'Denmark', flag: '🇩🇰', defaultLanguages: ['da'], timezone: 'Europe/Copenhagen' },\n 'FI': { code: 'FI', name: 'Finland', flag: '🇫🇮', defaultLanguages: ['fi'], timezone: 'Europe/Helsinki' },\n\n // Eastern Europe\n 'PL': { code: 'PL', name: 'Poland', flag: '🇵🇱', defaultLanguages: ['pl'], timezone: 'Europe/Warsaw' },\n 'CZ': { code: 'CZ', name: 'Czech Republic', flag: '🇨🇿', defaultLanguages: ['cs'], timezone: 'Europe/Prague' },\n 'RO': { code: 'RO', name: 'Romania', flag: '🇷🇴', defaultLanguages: ['ro'], timezone: 'Europe/Bucharest' },\n 'HU': { code: 'HU', name: 'Hungary', flag: '🇭🇺', defaultLanguages: ['hu'], timezone: 'Europe/Budapest' },\n 'BG': { code: 'BG', name: 'Bulgaria', flag: '🇧🇬', defaultLanguages: ['bg'], timezone: 'Europe/Sofia' },\n 'HR': { code: 'HR', name: 'Croatia', flag: '🇭🇷', defaultLanguages: ['hr'], timezone: 'Europe/Zagreb' },\n 'SK': { code: 'SK', name: 'Slovakia', flag: '🇸🇰', defaultLanguages: ['sk'], timezone: 'Europe/Bratislava' },\n 'SI': { code: 'SI', name: 'Slovenia', flag: '🇸🇮', defaultLanguages: ['sl'], timezone: 'Europe/Ljubljana' },\n 'RS': { code: 'RS', name: 'Serbia', flag: '🇷🇸', defaultLanguages: ['sr'], timezone: 'Europe/Belgrade' },\n 'UA': { code: 'UA', name: 'Ukraine', flag: '🇺🇦', defaultLanguages: ['uk'], timezone: 'Europe/Kyiv' },\n 'RU': { code: 'RU', name: 'Russia', flag: '🇷🇺', defaultLanguages: ['ru'], timezone: 'Europe/Moscow' },\n 'TR': { code: 'TR', name: 'Turkey', flag: '🇹🇷', defaultLanguages: ['tr'], timezone: 'Europe/Istanbul' },\n 'GR': { code: 'GR', name: 'Greece', flag: '🇬🇷', defaultLanguages: ['el'], timezone: 'Europe/Athens' },\n\n // East Asia\n 'JP': { code: 'JP', name: 'Japan', flag: '🇯🇵', defaultLanguages: ['ja'], timezone: 'Asia/Tokyo' },\n 'KR': { code: 'KR', name: 'South Korea', flag: '🇰🇷', defaultLanguages: ['ko'], timezone: 'Asia/Seoul' },\n 'CN': { code: 'CN', name: 'China', flag: '🇨🇳', defaultLanguages: ['zh'], timezone: 'Asia/Shanghai' },\n 'TW': { code: 'TW', name: 'Taiwan', flag: '🇹🇼', defaultLanguages: ['zh'], timezone: 'Asia/Taipei' },\n\n // Southeast Asia\n 'TH': { code: 'TH', name: 'Thailand', flag: '🇹🇭', defaultLanguages: ['th'], timezone: 'Asia/Bangkok' },\n 'VN': { code: 'VN', name: 'Vietnam', flag: '🇻🇳', defaultLanguages: ['vi'], timezone: 'Asia/Ho_Chi_Minh' },\n 'ID': { code: 'ID', name: 'Indonesia', flag: '🇮🇩', defaultLanguages: ['id'], timezone: 'Asia/Jakarta' },\n 'MY': { code: 'MY', name: 'Malaysia', flag: '🇲🇾', defaultLanguages: ['ms', 'en'], timezone: 'Asia/Kuala_Lumpur' },\n 'PH': { code: 'PH', name: 'Philippines', flag: '🇵🇭', defaultLanguages: ['en'], timezone: 'Asia/Manila' },\n 'SG': { code: 'SG', name: 'Singapore', flag: '🇸🇬', defaultLanguages: ['en', 'ms', 'zh'], timezone: 'Asia/Singapore' },\n\n // South America\n 'BR': { code: 'BR', name: 'Brazil', flag: '🇧🇷', defaultLanguages: ['pt'], timezone: 'America/Sao_Paulo' },\n 'AR': { code: 'AR', name: 'Argentina', flag: '🇦🇷', defaultLanguages: ['es'], timezone: 'America/Argentina/Buenos_Aires' },\n 'CO': { code: 'CO', name: 'Colombia', flag: '🇨🇴', defaultLanguages: ['es'], timezone: 'America/Bogota' },\n 'CL': { code: 'CL', name: 'Chile', flag: '🇨🇱', defaultLanguages: ['es'], timezone: 'America/Santiago' },\n\n // Middle East & North Africa\n 'SA': { code: 'SA', name: 'Saudi Arabia', flag: '🇸🇦', defaultLanguages: ['ar'], timezone: 'Asia/Riyadh' },\n 'AE': { code: 'AE', name: 'United Arab Emirates', flag: '🇦🇪', defaultLanguages: ['ar', 'en'], timezone: 'Asia/Dubai' },\n 'IL': { code: 'IL', name: 'Israel', flag: '🇮🇱', defaultLanguages: ['he'], timezone: 'Asia/Jerusalem' },\n 'EG': { code: 'EG', name: 'Egypt', flag: '🇪🇬', defaultLanguages: ['ar'], timezone: 'Africa/Cairo' },\n}\n\n/**\n * Get a country by its code.\n */\nexport function getCountry(code: string): Country | undefined {\n return COUNTRIES[code]\n}\n\n/**\n * Get the flag emoji for a country code.\n * Returns empty string if the code is not found.\n */\nexport function getCountryFlag(code: string): string {\n return COUNTRIES[code]?.flag ?? ''\n}\n\n/**\n * Get the display name for a country code.\n * Returns empty string if the code is not found.\n */\nexport function getCountryName(code: string): string {\n return COUNTRIES[code]?.name ?? ''\n}\n\n/**\n * Get default languages for a country.\n * Returns empty array if the country is not found.\n */\nexport function getDefaultLanguagesForCountry(code: string): string[] {\n return COUNTRIES[code]?.defaultLanguages ?? []\n}\n", "/**\n * Region detection utilities.\n * Detects user country and language from browser/environment signals.\n */\n\n/** Mapping of IANA timezone identifiers to ISO country codes */\nexport const TIMEZONE_TO_COUNTRY: Record<string, string> = {\n // United States\n 'America/New_York': 'US',\n 'America/Chicago': 'US',\n 'America/Denver': 'US',\n 'America/Los_Angeles': 'US',\n 'America/Phoenix': 'US',\n 'America/Anchorage': 'US',\n 'Pacific/Honolulu': 'US',\n 'America/Detroit': 'US',\n 'America/Indiana/Indianapolis': 'US',\n 'America/Boise': 'US',\n\n // Canada\n 'America/Toronto': 'CA',\n 'America/Vancouver': 'CA',\n 'America/Edmonton': 'CA',\n 'America/Winnipeg': 'CA',\n 'America/Halifax': 'CA',\n 'America/St_Johns': 'CA',\n\n // Mexico\n 'America/Mexico_City': 'MX',\n 'America/Cancun': 'MX',\n 'America/Tijuana': 'MX',\n\n // UK & Ireland\n 'Europe/London': 'GB',\n 'Europe/Dublin': 'IE',\n\n // Western Europe\n 'Europe/Paris': 'FR',\n 'Europe/Berlin': 'DE',\n 'Europe/Madrid': 'ES',\n 'Europe/Rome': 'IT',\n 'Europe/Lisbon': 'PT',\n 'Europe/Amsterdam': 'NL',\n 'Europe/Brussels': 'BE',\n 'Europe/Zurich': 'CH',\n 'Europe/Vienna': 'AT',\n\n // Nordic\n 'Europe/Stockholm': 'SE',\n 'Europe/Oslo': 'NO',\n 'Europe/Copenhagen': 'DK',\n 'Europe/Helsinki': 'FI',\n\n // Eastern Europe\n 'Europe/Warsaw': 'PL',\n 'Europe/Prague': 'CZ',\n 'Europe/Bucharest': 'RO',\n 'Europe/Budapest': 'HU',\n 'Europe/Sofia': 'BG',\n 'Europe/Zagreb': 'HR',\n 'Europe/Bratislava': 'SK',\n 'Europe/Ljubljana': 'SI',\n 'Europe/Belgrade': 'RS',\n 'Europe/Kyiv': 'UA',\n 'Europe/Moscow': 'RU',\n 'Europe/Istanbul': 'TR',\n 'Europe/Athens': 'GR',\n\n // South Asia\n 'Asia/Kolkata': 'IN',\n 'Asia/Calcutta': 'IN',\n 'Asia/Karachi': 'PK',\n 'Asia/Dhaka': 'BD',\n 'Asia/Colombo': 'LK',\n 'Asia/Kathmandu': 'NP',\n\n // East Asia\n 'Asia/Tokyo': 'JP',\n 'Asia/Seoul': 'KR',\n 'Asia/Shanghai': 'CN',\n 'Asia/Hong_Kong': 'CN',\n 'Asia/Taipei': 'TW',\n\n // Southeast Asia\n 'Asia/Bangkok': 'TH',\n 'Asia/Ho_Chi_Minh': 'VN',\n 'Asia/Jakarta': 'ID',\n 'Asia/Kuala_Lumpur': 'MY',\n 'Asia/Manila': 'PH',\n 'Asia/Singapore': 'SG',\n\n // Oceania\n 'Australia/Sydney': 'AU',\n 'Australia/Melbourne': 'AU',\n 'Australia/Brisbane': 'AU',\n 'Australia/Perth': 'AU',\n 'Australia/Adelaide': 'AU',\n 'Pacific/Auckland': 'NZ',\n\n // South America\n 'America/Sao_Paulo': 'BR',\n 'America/Rio_Branco': 'BR',\n 'America/Argentina/Buenos_Aires': 'AR',\n 'America/Bogota': 'CO',\n 'America/Santiago': 'CL',\n\n // Middle East\n 'Asia/Riyadh': 'SA',\n 'Asia/Dubai': 'AE',\n 'Asia/Jerusalem': 'IL',\n 'Africa/Cairo': 'EG',\n}\n\n/** Mapping of BCP-47 locale strings to ISO country codes */\nexport const LOCALE_TO_COUNTRY: Record<string, string> = {\n 'en-US': 'US',\n 'en-GB': 'GB',\n 'en-AU': 'AU',\n 'en-CA': 'CA',\n 'en-NZ': 'NZ',\n 'en-IE': 'IE',\n 'en-IN': 'IN',\n 'en-SG': 'SG',\n 'en-PH': 'PH',\n 'en-MY': 'MY',\n 'en-ZA': 'ZA',\n 'hi-IN': 'IN',\n 'te-IN': 'IN',\n 'ta-IN': 'IN',\n 'ur-PK': 'PK',\n 'pa-IN': 'IN',\n 'bn-IN': 'IN',\n 'bn-BD': 'BD',\n 'gu-IN': 'IN',\n 'mr-IN': 'IN',\n 'kn-IN': 'IN',\n 'ml-IN': 'IN',\n 'fr-FR': 'FR',\n 'fr-CA': 'CA',\n 'fr-BE': 'BE',\n 'fr-CH': 'CH',\n 'es-ES': 'ES',\n 'es-MX': 'MX',\n 'es-AR': 'AR',\n 'es-CO': 'CO',\n 'es-CL': 'CL',\n 'de-DE': 'DE',\n 'de-AT': 'AT',\n 'de-CH': 'CH',\n 'it-IT': 'IT',\n 'it-CH': 'CH',\n 'pt-PT': 'PT',\n 'pt-BR': 'BR',\n 'nl-NL': 'NL',\n 'nl-BE': 'BE',\n 'sv-SE': 'SE',\n 'da-DK': 'DK',\n 'nb-NO': 'NO',\n 'nn-NO': 'NO',\n 'fi-FI': 'FI',\n 'pl-PL': 'PL',\n 'cs-CZ': 'CZ',\n 'ro-RO': 'RO',\n 'hu-HU': 'HU',\n 'bg-BG': 'BG',\n 'hr-HR': 'HR',\n 'sk-SK': 'SK',\n 'sl-SI': 'SI',\n 'sr-RS': 'SR',\n 'uk-UA': 'UA',\n 'el-GR': 'GR',\n 'ru-RU': 'RU',\n 'ja-JP': 'JP',\n 'ko-KR': 'KR',\n 'zh-CN': 'CN',\n 'zh-TW': 'TW',\n 'zh-HK': 'CN',\n 'ar-SA': 'SA',\n 'ar-AE': 'AE',\n 'ar-EG': 'EG',\n 'he-IL': 'IL',\n 'tr-TR': 'TR',\n 'th-TH': 'TH',\n 'vi-VN': 'VN',\n 'id-ID': 'ID',\n 'ms-MY': 'MY',\n}\n\n/**\n * Detect the user's country from environment signals.\n * Strategy: timezone mapping -> navigator.languages locale mapping -> fallback 'US'\n */\nexport function detectCountry(): string {\n // 1. Try timezone mapping\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (tz && TIMEZONE_TO_COUNTRY[tz]) {\n return TIMEZONE_TO_COUNTRY[tz]\n }\n } catch {\n // Intl may not be available\n }\n\n // 2. Try navigator.languages locale mapping\n try {\n if (typeof navigator !== 'undefined') {\n const languages = navigator.languages\n if (languages && languages.length > 0) {\n for (const locale of languages) {\n if (LOCALE_TO_COUNTRY[locale]) {\n return LOCALE_TO_COUNTRY[locale]\n }\n }\n }\n }\n } catch {\n // navigator may not be available\n }\n\n // 3. Fallback\n return 'US'\n}\n\n/**\n * Detect the user's preferred language from navigator.languages.\n * Returns the first language from navigator.languages, or 'en' as fallback.\n */\nexport function detectLanguage(): string {\n try {\n if (typeof navigator !== 'undefined') {\n const languages = (navigator as any).languages\n if (languages && languages.length > 0) {\n return languages[0]\n }\n if ((navigator as any).language) {\n return (navigator as any).language\n }\n }\n } catch {\n // navigator may not be available\n }\n return 'en'\n}\n", "/**\n * Voice registry for TTS providers.\n */\n\nexport interface VoiceOption {\n id: string\n name: string\n language: string\n provider: 'browser' | 'google' | 'elevenlabs' | 'openai'\n gender?: 'male' | 'female'\n}\n\nexport const VOICES: VoiceOption[] = [\n // Browser voices — English\n { id: 'browser-en-us-female', name: 'English (US) Female', language: 'en-US', provider: 'browser', gender: 'female' },\n { id: 'browser-en-us-male', name: 'English (US) Male', language: 'en-US', provider: 'browser', gender: 'male' },\n { id: 'browser-en-gb-female', name: 'English (UK) Female', language: 'en-GB', provider: 'browser', gender: 'female' },\n { id: 'browser-en-gb-male', name: 'English (UK) Male', language: 'en-GB', provider: 'browser', gender: 'male' },\n { id: 'browser-en-in-female', name: 'English (India) Female', language: 'en-IN', provider: 'browser', gender: 'female' },\n\n // Browser voices — European\n { id: 'browser-fr-female', name: 'French Female', language: 'fr', provider: 'browser', gender: 'female' },\n { id: 'browser-de-female', name: 'German Female', language: 'de', provider: 'browser', gender: 'female' },\n { id: 'browser-es-female', name: 'Spanish Female', language: 'es', provider: 'browser', gender: 'female' },\n { id: 'browser-it-female', name: 'Italian Female', language: 'it', provider: 'browser', gender: 'female' },\n { id: 'browser-pt-female', name: 'Portuguese Female', language: 'pt', provider: 'browser', gender: 'female' },\n\n // Browser voices — Asian\n { id: 'browser-ja-female', name: 'Japanese Female', language: 'ja', provider: 'browser', gender: 'female' },\n { id: 'browser-ko-female', name: 'Korean Female', language: 'ko', provider: 'browser', gender: 'female' },\n { id: 'browser-zh-female', name: 'Chinese Female', language: 'zh', provider: 'browser', gender: 'female' },\n { id: 'browser-hi-female', name: 'Hindi Female', language: 'hi', provider: 'browser', gender: 'female' },\n { id: 'browser-ar-male', name: 'Arabic Male', language: 'ar', provider: 'browser', gender: 'male' },\n\n // Google TTS voices\n { id: 'google-en-us-wavenet-d', name: 'Google WaveNet English (US)', language: 'en-US', provider: 'google', gender: 'male' },\n { id: 'google-en-us-wavenet-f', name: 'Google WaveNet English (US) Female', language: 'en-US', provider: 'google', gender: 'female' },\n { id: 'google-en-gb-wavenet-a', name: 'Google WaveNet English (UK)', language: 'en-GB', provider: 'google', gender: 'female' },\n { id: 'google-fr-wavenet-a', name: 'Google WaveNet French', language: 'fr', provider: 'google', gender: 'female' },\n { id: 'google-de-wavenet-a', name: 'Google WaveNet German', language: 'de', provider: 'google', gender: 'female' },\n { id: 'google-es-wavenet-a', name: 'Google WaveNet Spanish', language: 'es', provider: 'google', gender: 'female' },\n { id: 'google-ja-wavenet-a', name: 'Google WaveNet Japanese', language: 'ja', provider: 'google', gender: 'female' },\n { id: 'google-hi-wavenet-a', name: 'Google WaveNet Hindi', language: 'hi', provider: 'google', gender: 'female' },\n { id: 'google-ar-wavenet-a', name: 'Google WaveNet Arabic', language: 'ar', provider: 'google', gender: 'female' },\n\n // ElevenLabs voices\n { id: 'elevenlabs-rachel', name: 'Rachel', language: 'en', provider: 'elevenlabs', gender: 'female' },\n { id: 'elevenlabs-adam', name: 'Adam', language: 'en', provider: 'elevenlabs', gender: 'male' },\n { id: 'elevenlabs-antoni', name: 'Antoni', language: 'en', provider: 'elevenlabs', gender: 'male' },\n { id: 'elevenlabs-bella', name: 'Bella', language: 'es', provider: 'elevenlabs', gender: 'female' },\n { id: 'elevenlabs-elli', name: 'Elli', language: 'de', provider: 'elevenlabs', gender: 'female' },\n\n // OpenAI TTS voices\n { id: 'openai-alloy', name: 'Alloy', language: 'en', provider: 'openai' },\n { id: 'openai-echo', name: 'Echo', language: 'en', provider: 'openai', gender: 'male' },\n { id: 'openai-fable', name: 'Fable', language: 'en', provider: 'openai', gender: 'male' },\n { id: 'openai-onyx', name: 'Onyx', language: 'en', provider: 'openai', gender: 'male' },\n { id: 'openai-nova', name: 'Nova', language: 'en', provider: 'openai', gender: 'female' },\n { id: 'openai-shimmer', name: 'Shimmer', language: 'en', provider: 'openai', gender: 'female' },\n]\n\n/**\n * Get all voices that match a given language code.\n * Matches both exact codes and prefix codes (e.g., 'en' matches 'en', 'en-US', 'en-GB').\n */\nexport function getVoicesForLanguage(langCode: string): VoiceOption[] {\n return VOICES.filter((v) => v.language === langCode || v.language.startsWith(langCode + '-') || langCode.startsWith(v.language + '-') || v.language.split('-')[0] === langCode)\n}\n\n/**\n * Get the best voice for a language, optionally preferring a specific provider.\n * Returns undefined if no voice matches.\n */\nexport function getBestVoice(langCode: string, preferredProvider?: VoiceOption['provider']): VoiceOption | undefined {\n const voices = getVoicesForLanguage(langCode)\n if (voices.length === 0) return undefined\n\n if (preferredProvider) {\n const preferred = voices.find((v) => v.provider === preferredProvider)\n if (preferred) return preferred\n }\n\n // Return first available voice\n return voices[0]\n}\n\n/**\n * Get all voices from a specific provider.\n */\nexport function getVoicesByProvider(provider: VoiceOption['provider']): VoiceOption[] {\n return VOICES.filter((v) => v.provider === provider)\n}\n", "/**\n * Locale utilities for display names, storage, and localized value resolution.\n */\n\n/** Display names for common locale codes (in their native language) */\nexport const LOCALE_DISPLAY_NAMES: Record<string, string> = {\n 'en': 'English',\n 'en-US': 'English (US)',\n 'en-GB': 'English (UK)',\n 'en-IN': 'English (India)',\n 'hi': 'हिन्दी',\n 'te': 'తెలుగు',\n 'ta': 'தமிழ்',\n 'ur': 'اردو',\n 'pa': 'ਪੰਜਾਬੀ',\n 'bn': 'বাংলা',\n 'gu': 'ગુજરાતી',\n 'mr': 'मराठी',\n 'kn': 'ಕನ್ನಡ',\n 'ml': 'മലയാളം',\n 'fr': 'Français',\n 'es': 'Español',\n 'de': 'Deutsch',\n 'it': 'Italiano',\n 'pt': 'Português',\n 'pt-BR': 'Português (Brasil)',\n 'nl': 'Nederlands',\n 'sv': 'Svenska',\n 'da': 'Dansk',\n 'no': 'Norsk',\n 'fi': 'Suomi',\n 'pl': 'Polski',\n 'cs': 'Čeština',\n 'ro': 'Română',\n 'hu': 'Magyar',\n 'bg': 'Български',\n 'hr': 'Hrvatski',\n 'sk': 'Slovenčina',\n 'sl': 'Slovenščina',\n 'sr': 'Srpski',\n 'uk': 'Українська',\n 'el': 'Ελληνικά',\n 'ru': 'Русский',\n 'ja': '日本語',\n 'ko': '한국어',\n 'zh': '中文',\n 'zh-TW': '中文(繁體)',\n 'ar': 'العربية',\n 'he': 'עברית',\n 'tr': 'Türkçe',\n 'th': 'ไทย',\n 'vi': 'Tiếng Việt',\n 'id': 'Bahasa Indonesia',\n 'ms': 'Bahasa Melayu',\n}\n\nconst DEFAULT_STORAGE_KEY = 'refraction-ui-locale'\n\n/**\n * Get the display name for a locale code.\n * Returns the code itself if not found in the display names map.\n */\nexport function getLocaleDisplayName(code: string): string {\n return LOCALE_DISPLAY_NAMES[code] ?? code\n}\n\n/**\n * Get the stored locale from localStorage (or compatible storage).\n * Returns null if not stored or localStorage is not available.\n */\nexport function getStoredLocale(storageKey?: string): string | null {\n try {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem(storageKey ?? DEFAULT_STORAGE_KEY)\n }\n } catch {\n // localStorage may not be available\n }\n return null\n}\n\n/**\n * Store a locale code in localStorage (or compatible storage).\n * Does nothing if localStorage is not available.\n */\nexport function setStoredLocale(code: string, storageKey?: string): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(storageKey ?? DEFAULT_STORAGE_KEY, code)\n }\n } catch {\n // localStorage may not be available\n }\n}\n\n/**\n * Resolve a localized value from a record of locale -> value.\n * Tries exact locale, then base language code (for regional variants like 'en-US' -> 'en'),\n * then the fallback locale.\n */\nexport function getLocalizedValue<T>(\n localized: Record<string, T>,\n locale: string,\n fallbackLocale?: string,\n): T | undefined {\n // 1. Exact match\n if (locale in localized) {\n return localized[locale]\n }\n\n // 2. Try base language code (e.g., 'en-US' -> 'en')\n const baseLang = locale.split('-')[0]\n if (baseLang !== locale && baseLang in localized) {\n return localized[baseLang]\n }\n\n // 3. Fallback locale\n if (fallbackLocale && fallbackLocale in localized) {\n return localized[fallbackLocale]\n }\n\n return undefined\n}\n", "// src/location-selector.ts\nimport { COUNTRIES, LANGUAGES } from \"@refraction-ui/i18n\";\nimport { generateId } from \"@refraction-ui/shared\";\nfunction createLocationSelector(options = {}) {\n const {\n defaultCountry = \"US\",\n defaultLanguage = \"en\",\n onCountryChange,\n onLanguageChange\n } = options;\n const state = {\n country: defaultCountry,\n language: defaultLanguage\n };\n const countryId = generateId(\"location-sel-country\");\n const languageId = generateId(\"location-sel-language\");\n function setCountry(country) {\n state.country = country;\n onCountryChange?.(country);\n }\n function setLanguage(language) {\n state.language = language;\n onLanguageChange?.(language);\n }\n const countries = Array.isArray(COUNTRIES) ? COUNTRIES : Object.values(COUNTRIES);\n const languages = Array.isArray(LANGUAGES) ? LANGUAGES : Object.values(LANGUAGES);\n return {\n state,\n setCountry,\n setLanguage,\n countries,\n languages,\n countryProps: {\n id: countryId,\n name: \"country\"\n },\n languageProps: {\n id: languageId,\n name: \"language\"\n }\n };\n}\nexport {\n createLocationSelector\n};\n"],
5
+ "mappings": ";;;;;;AACA,YAAY,WAAW;;;ACWhB,IAAM,YAAsC;;EAEjD,MAAS,EAAE,MAAM,MAAS,MAAM,WAA2B,YAAY,WAAkB,WAAW,OAAO,OAAO,UAAA;EAClH,SAAS,EAAE,MAAM,SAAS,MAAM,gBAA2B,YAAY,gBAAkB,WAAW,OAAO,OAAO,UAAA;EAClH,SAAS,EAAE,MAAM,SAAS,MAAM,gBAA2B,YAAY,gBAAkB,WAAW,OAAO,OAAO,UAAA;EAClH,SAAS,EAAE,MAAM,SAAS,MAAM,mBAA2B,YAAY,mBAAkB,WAAW,OAAO,OAAO,UAAA;;EAGlH,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,wCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,wCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,kCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,QAAc,YAAY,4BAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,wCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,kCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAc,YAAY,8CAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,kCAAc,WAAW,OAAO,OAAO,SAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,kCAAa,WAAW,OAAO,OAAO,SAAA;EAC1F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAe,YAAY,wCAAa,WAAW,OAAO,OAAO,SAAA;;EAG3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,eAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,cAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,WAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,YAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,cAAc,YAAY,gBAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,SAAS,EAAE,MAAM,SAAS,MAAM,uBAAuB,YAAY,yBAAsB,WAAW,OAAO,OAAO,WAAA;EAClH,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,cAAe,WAAW,OAAO,OAAO,WAAA;;EAG5F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,WAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,SAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAc,YAAY,SAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,SAAc,WAAW,OAAO,OAAO,WAAA;;EAG3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,UAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,qBAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAc,YAAY,kBAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAc,YAAY,UAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAc,YAAY,0DAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAc,YAAY,YAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,mBAAe,WAAW,OAAO,OAAO,WAAA;EAC5F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAc,YAAY,yBAAe,WAAW,OAAO,OAAO,WAAA;EAC5F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,UAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAc,YAAY,gEAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,oDAAc,WAAW,OAAO,OAAO,WAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,8CAAc,WAAW,OAAO,OAAO,WAAA;;EAG3F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAc,YAAY,sBAAW,WAAW,OAAO,OAAO,aAAA;EACxF,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,sBAAW,WAAW,OAAO,OAAO,aAAA;EACxF,MAAM,EAAE,MAAM,MAAM,MAAM,wBAAyB,YAAY,wCAAU,WAAW,OAAO,OAAO,aAAA;EAClG,SAAS,EAAE,MAAM,SAAS,MAAM,yBAAyB,YAAY,wCAAU,WAAW,OAAO,OAAO,aAAA;;EAGxG,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,8CAAc,WAAW,OAAO,OAAO,iBAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAc,YAAY,kCAAc,WAAW,OAAO,OAAO,iBAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAc,YAAY,gBAAc,WAAW,OAAO,OAAO,iBAAA;;EAG3F,MAAM,EAAE,MAAM,MAAM,MAAM,QAAc,YAAY,sBAAc,WAAW,OAAO,OAAO,kBAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,cAAc,YAAY,wBAAc,WAAW,OAAO,OAAO,kBAAA;EAC3F,MAAM,EAAE,MAAM,MAAM,MAAM,cAAc,YAAY,oBAAoB,WAAW,OAAO,OAAO,kBAAA;EACjG,MAAM,EAAE,MAAM,MAAM,MAAM,SAAc,YAAY,iBAAoB,WAAW,OAAO,OAAO,kBAAA;AACnG;AChEO,IAAM,YAAqC;;EAEhD,MAAM,EAAE,MAAM,MAAM,MAAM,iBAAkB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC9F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAkB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,kBAAA;EACpG,MAAM,EAAE,MAAM,MAAM,MAAM,UAAkB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,sBAAA;;EAG9F,MAAM,EAAE,MAAM,MAAM,MAAM,kBAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,eAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,eAAA;EACrG,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,eAAA;EACrG,MAAM,EAAE,MAAM,MAAM,MAAM,cAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,aAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,eAAA;EACrG,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,iBAAA;;EAGrG,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,eAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,eAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,MAAM,IAAI,GAAG,UAAU,kBAAA;EAC3G,MAAM,EAAE,MAAM,MAAM,MAAM,eAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,MAAM,IAAI,GAAG,UAAU,gBAAA;EAC3G,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,oBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,kBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,kBAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,kBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,eAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,oBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,kBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,kBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,aAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,eAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,aAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,gBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,eAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,WAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,eAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,oBAAA;EACrG,MAAM,EAAE,MAAM,MAAM,MAAM,eAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAmB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,MAAM,IAAI,GAAG,UAAU,iBAAA;;EAG3G,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,oBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,aAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,iCAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,YAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,iBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,mBAAA;;EAG/F,MAAM,EAAE,MAAM,MAAM,MAAM,gBAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,cAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,wBAAwB,MAAM,sBAAQ,kBAAkB,CAAC,MAAM,IAAI,GAAG,UAAU,aAAA;EAC1G,MAAM,EAAE,MAAM,MAAM,MAAM,UAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,iBAAA;EAC/F,MAAM,EAAE,MAAM,MAAM,MAAM,SAAmB,MAAM,sBAAQ,kBAAkB,CAAC,IAAI,GAAG,UAAU,eAAA;AACjG;;;AIvFA,SAAS,uBAAuB,UAAU,CAAC,GAAG;AAC5C,QAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACA,QAAM,YAAY,WAAW,sBAAsB;AACnD,QAAM,aAAa,WAAW,uBAAuB;AACrD,WAAS,WAAW,SAAS;AAC3B,UAAM,UAAU;AAChB,sBAAkB,OAAO;AAAA,EAC3B;AACA,WAAS,YAAY,UAAU;AAC7B,UAAM,WAAW;AACjB,uBAAmB,QAAQ;AAAA,EAC7B;AACA,QAAM,YAAY,MAAM,QAAQ,SAAS,IAAI,YAAY,OAAO,OAAO,SAAS;AAChF,QAAM,YAAY,MAAM,QAAQ,SAAS,IAAI,YAAY,OAAO,OAAO,SAAS;AAChF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA,eAAe;AAAA,MACb,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;ANrCA,IAAI,mBAAyB;AAAA,EAC3B,SAAS,kBAAkB,EAAE,iBAAiB,MAAM,kBAAkB,MAAM,iBAAiB,kBAAkB,UAAU,GAAG,KAAK;AAC/H,UAAM,CAAC,SAAS,UAAU,IAAU,eAAS,cAAc;AAC3D,UAAM,CAAC,UAAU,WAAW,IAAU,eAAS,eAAe;AAC9D,UAAM,sBAA4B;AAAA,MAChC,CAAC,MAAM;AACL,mBAAW,CAAC;AACZ,0BAAkB,CAAC;AAAA,MACrB;AAAA,MACA,CAAC,eAAe;AAAA,IAClB;AACA,UAAM,uBAA6B;AAAA,MACjC,CAAC,MAAM;AACL,oBAAY,CAAC;AACb,2BAAmB,CAAC;AAAA,MACtB;AAAA,MACA,CAAC,gBAAgB;AAAA,IACnB;AACA,UAAM,MAAY;AAAA,MAChB,MAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MACpB,CAAC;AAAA,MACD,CAAC,gBAAgB,iBAAiB,qBAAqB,oBAAoB;AAAA,IAC7E;AACA,WAAa;AAAA,MACX;AAAA,MACA,EAAE,KAAK,WAAW,GAAG,mCAAmC,SAAS,EAAE;AAAA,MAC7D;AAAA,QACJ;AAAA,QACA,EAAE,WAAW,+BAA+B;AAAA,QACtC,oBAAc,SAAS,EAAE,SAAS,IAAI,aAAa,IAAI,WAAW,sBAAsB,GAAG,SAAS;AAAA,QACpG;AAAA,UACJ;AAAA,UACA;AAAA,YACE,IAAI,IAAI,aAAa;AAAA,YACrB,MAAM,IAAI,aAAa;AAAA,YACvB,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AAAA,YAC9C,WAAW;AAAA,UACb;AAAA,UACA,IAAI,UAAU;AAAA,YACZ,CAAC,MAAY,oBAAc,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC;AAAA,UACvH;AAAA,QACF;AAAA,MACF;AAAA,MACM;AAAA,QACJ;AAAA,QACA,EAAE,WAAW,+BAA+B;AAAA,QACtC,oBAAc,SAAS,EAAE,SAAS,IAAI,cAAc,IAAI,WAAW,sBAAsB,GAAG,UAAU;AAAA,QACtG;AAAA,UACJ;AAAA,UACA;AAAA,YACE,IAAI,IAAI,cAAc;AAAA,YACtB,MAAM,IAAI,cAAc;AAAA,YACxB,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,YAC/C,WAAW;AAAA,UACb;AAAA,UACA,IAAI,UAAU;AAAA,YACZ,CAAC,MAAY,oBAAc,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC;AAAA,UACvH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }