se-design 1.0.80 → 1.0.81-dev1

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 (437) hide show
  1. package/dist/assets/icons/envelope.svg +4 -0
  2. package/dist/assets/icons/views.svg +7 -0
  3. package/dist/assets/style.css +1 -1
  4. package/dist/components/Checkbox/index.d.ts +4 -0
  5. package/dist/components/DatePicker/useDatePickerA11y.d.ts +1 -4
  6. package/dist/components/Dropdown/index.d.ts +4 -0
  7. package/dist/components/LabelChip/index.d.ts +1 -0
  8. package/dist/components/Popover/index.d.ts +9 -1
  9. package/dist/components/Radio/index.d.ts +4 -0
  10. package/dist/components/Toggle/index.d.ts +4 -0
  11. package/dist/index10.js.map +1 -1
  12. package/dist/index100.js +1 -1
  13. package/dist/index100.js.map +1 -1
  14. package/dist/index101.js +1 -1
  15. package/dist/index101.js.map +1 -1
  16. package/dist/index102.js +1 -1
  17. package/dist/index102.js.map +1 -1
  18. package/dist/index103.js +1 -1
  19. package/dist/index103.js.map +1 -1
  20. package/dist/index104.js +1 -1
  21. package/dist/index104.js.map +1 -1
  22. package/dist/index105.js +1 -1
  23. package/dist/index105.js.map +1 -1
  24. package/dist/index106.js +1 -1
  25. package/dist/index106.js.map +1 -1
  26. package/dist/index107.js +1 -1
  27. package/dist/index107.js.map +1 -1
  28. package/dist/index108.js +1 -1
  29. package/dist/index108.js.map +1 -1
  30. package/dist/index109.js +2 -2
  31. package/dist/index109.js.map +1 -1
  32. package/dist/index11.js +44 -43
  33. package/dist/index11.js.map +1 -1
  34. package/dist/index110.js +2 -2
  35. package/dist/index110.js.map +1 -1
  36. package/dist/index111.js +1 -1
  37. package/dist/index111.js.map +1 -1
  38. package/dist/index112.js +1 -1
  39. package/dist/index112.js.map +1 -1
  40. package/dist/index113.js +1 -1
  41. package/dist/index113.js.map +1 -1
  42. package/dist/index114.js +2 -2
  43. package/dist/index114.js.map +1 -1
  44. package/dist/index115.js +2 -2
  45. package/dist/index115.js.map +1 -1
  46. package/dist/index116.js +2 -2
  47. package/dist/index116.js.map +1 -1
  48. package/dist/index117.js +2 -2
  49. package/dist/index117.js.map +1 -1
  50. package/dist/index118.js +1 -1
  51. package/dist/index118.js.map +1 -1
  52. package/dist/index119.js +1 -1
  53. package/dist/index119.js.map +1 -1
  54. package/dist/index12.js +38 -31
  55. package/dist/index12.js.map +1 -1
  56. package/dist/index120.js +2 -2
  57. package/dist/index120.js.map +1 -1
  58. package/dist/index121.js +2 -2
  59. package/dist/index121.js.map +1 -1
  60. package/dist/index122.js +1 -1
  61. package/dist/index122.js.map +1 -1
  62. package/dist/index123.js +1 -1
  63. package/dist/index123.js.map +1 -1
  64. package/dist/index124.js +1 -1
  65. package/dist/index124.js.map +1 -1
  66. package/dist/index125.js +2 -2
  67. package/dist/index125.js.map +1 -1
  68. package/dist/index126.js +1 -1
  69. package/dist/index126.js.map +1 -1
  70. package/dist/index127.js +1 -1
  71. package/dist/index127.js.map +1 -1
  72. package/dist/index128.js +2 -2
  73. package/dist/index128.js.map +1 -1
  74. package/dist/index129.js +2 -2
  75. package/dist/index129.js.map +1 -1
  76. package/dist/index13.js +20 -19
  77. package/dist/index13.js.map +1 -1
  78. package/dist/index130.js +2 -2
  79. package/dist/index130.js.map +1 -1
  80. package/dist/index131.js +2 -2
  81. package/dist/index131.js.map +1 -1
  82. package/dist/index132.js +1 -1
  83. package/dist/index132.js.map +1 -1
  84. package/dist/index133.js +2 -2
  85. package/dist/index133.js.map +1 -1
  86. package/dist/index134.js +1 -1
  87. package/dist/index134.js.map +1 -1
  88. package/dist/index135.js +1 -1
  89. package/dist/index135.js.map +1 -1
  90. package/dist/index136.js +1 -1
  91. package/dist/index136.js.map +1 -1
  92. package/dist/index137.js +1 -1
  93. package/dist/index137.js.map +1 -1
  94. package/dist/index138.js +2 -2
  95. package/dist/index138.js.map +1 -1
  96. package/dist/index139.js +2 -2
  97. package/dist/index139.js.map +1 -1
  98. package/dist/index14.js.map +1 -1
  99. package/dist/index140.js +1 -1
  100. package/dist/index140.js.map +1 -1
  101. package/dist/index141.js +2 -2
  102. package/dist/index141.js.map +1 -1
  103. package/dist/index142.js +1 -1
  104. package/dist/index142.js.map +1 -1
  105. package/dist/index143.js +1 -1
  106. package/dist/index143.js.map +1 -1
  107. package/dist/index144.js +1 -1
  108. package/dist/index144.js.map +1 -1
  109. package/dist/index145.js +1 -1
  110. package/dist/index145.js.map +1 -1
  111. package/dist/index146.js +1 -1
  112. package/dist/index146.js.map +1 -1
  113. package/dist/index147.js +1 -1
  114. package/dist/index147.js.map +1 -1
  115. package/dist/index148.js +1 -1
  116. package/dist/index148.js.map +1 -1
  117. package/dist/index149.js +2 -2
  118. package/dist/index149.js.map +1 -1
  119. package/dist/index150.js +2 -2
  120. package/dist/index150.js.map +1 -1
  121. package/dist/index151.js +2 -2
  122. package/dist/index151.js.map +1 -1
  123. package/dist/index152.js +1 -1
  124. package/dist/index152.js.map +1 -1
  125. package/dist/index153.js +2 -2
  126. package/dist/index153.js.map +1 -1
  127. package/dist/index154.js +2 -2
  128. package/dist/index154.js.map +1 -1
  129. package/dist/index155.js +1 -1
  130. package/dist/index155.js.map +1 -1
  131. package/dist/index156.js +1 -1
  132. package/dist/index156.js.map +1 -1
  133. package/dist/index157.js +1 -1
  134. package/dist/index157.js.map +1 -1
  135. package/dist/index158.js +2 -2
  136. package/dist/index158.js.map +1 -1
  137. package/dist/index159.js +2 -2
  138. package/dist/index159.js.map +1 -1
  139. package/dist/index16.js +1 -1
  140. package/dist/index16.js.map +1 -1
  141. package/dist/index160.js +1 -1
  142. package/dist/index160.js.map +1 -1
  143. package/dist/index161.js +2 -2
  144. package/dist/index161.js.map +1 -1
  145. package/dist/index162.js +2 -2
  146. package/dist/index162.js.map +1 -1
  147. package/dist/index163.js +1 -1
  148. package/dist/index163.js.map +1 -1
  149. package/dist/index164.js +1 -1
  150. package/dist/index164.js.map +1 -1
  151. package/dist/index165.js +1 -1
  152. package/dist/index165.js.map +1 -1
  153. package/dist/index166.js +1 -1
  154. package/dist/index166.js.map +1 -1
  155. package/dist/index167.js +1 -1
  156. package/dist/index167.js.map +1 -1
  157. package/dist/index168.js +1 -1
  158. package/dist/index168.js.map +1 -1
  159. package/dist/index169.js +1 -1
  160. package/dist/index169.js.map +1 -1
  161. package/dist/index17.js.map +1 -1
  162. package/dist/index170.js +1 -1
  163. package/dist/index170.js.map +1 -1
  164. package/dist/index171.js +1 -1
  165. package/dist/index171.js.map +1 -1
  166. package/dist/index172.js +1 -1
  167. package/dist/index172.js.map +1 -1
  168. package/dist/index173.js +1 -1
  169. package/dist/index173.js.map +1 -1
  170. package/dist/index174.js +1 -1
  171. package/dist/index174.js.map +1 -1
  172. package/dist/index175.js +1 -1
  173. package/dist/index175.js.map +1 -1
  174. package/dist/index176.js +1 -1
  175. package/dist/index176.js.map +1 -1
  176. package/dist/index177.js +1 -1
  177. package/dist/index177.js.map +1 -1
  178. package/dist/index178.js +1 -1
  179. package/dist/index178.js.map +1 -1
  180. package/dist/index179.js +1 -1
  181. package/dist/index179.js.map +1 -1
  182. package/dist/index18.js.map +1 -1
  183. package/dist/index180.js +2 -2
  184. package/dist/index180.js.map +1 -1
  185. package/dist/index181.js +1 -1
  186. package/dist/index181.js.map +1 -1
  187. package/dist/index182.js +1 -1
  188. package/dist/index182.js.map +1 -1
  189. package/dist/index183.js +1 -1
  190. package/dist/index183.js.map +1 -1
  191. package/dist/index184.js +2 -2
  192. package/dist/index184.js.map +1 -1
  193. package/dist/index185.js +1 -1
  194. package/dist/index185.js.map +1 -1
  195. package/dist/index186.js +1 -1
  196. package/dist/index186.js.map +1 -1
  197. package/dist/index187.js +1 -1
  198. package/dist/index187.js.map +1 -1
  199. package/dist/index188.js +2 -2
  200. package/dist/index188.js.map +1 -1
  201. package/dist/index189.js +1 -1
  202. package/dist/index189.js.map +1 -1
  203. package/dist/index19.js +185 -163
  204. package/dist/index19.js.map +1 -1
  205. package/dist/index190.js +1 -1
  206. package/dist/index190.js.map +1 -1
  207. package/dist/index191.js +1 -1
  208. package/dist/index191.js.map +1 -1
  209. package/dist/index192.js +2 -2
  210. package/dist/index192.js.map +1 -1
  211. package/dist/index193.js +1 -1
  212. package/dist/index193.js.map +1 -1
  213. package/dist/index194.js +2 -2
  214. package/dist/index194.js.map +1 -1
  215. package/dist/index195.js +1 -1
  216. package/dist/index195.js.map +1 -1
  217. package/dist/index196.js +2 -2
  218. package/dist/index196.js.map +1 -1
  219. package/dist/index197.js +2 -149
  220. package/dist/index197.js.map +1 -1
  221. package/dist/index198.js +2 -9
  222. package/dist/index198.js.map +1 -1
  223. package/dist/index199.js +2 -6
  224. package/dist/index199.js.map +1 -1
  225. package/dist/index20.js.map +1 -1
  226. package/dist/index200.js +2 -5
  227. package/dist/index200.js.map +1 -1
  228. package/dist/index201.js +2 -40
  229. package/dist/index201.js.map +1 -1
  230. package/dist/index202.js +5 -0
  231. package/dist/index202.js.map +1 -0
  232. package/dist/index203.js +5 -0
  233. package/dist/index203.js.map +1 -0
  234. package/dist/index204.js +5 -0
  235. package/dist/index204.js.map +1 -0
  236. package/dist/index205.js +5 -0
  237. package/dist/index205.js.map +1 -0
  238. package/dist/index206.js +152 -0
  239. package/dist/index206.js.map +1 -0
  240. package/dist/index207.js +8 -0
  241. package/dist/index207.js.map +1 -0
  242. package/dist/index21.js.map +1 -1
  243. package/dist/index22.js.map +1 -1
  244. package/dist/{index217.js → index221.js} +1 -1
  245. package/dist/{index217.js.map → index221.js.map} +1 -1
  246. package/dist/{index225.js → index229.js} +1 -1
  247. package/dist/{index225.js.map → index229.js.map} +1 -1
  248. package/dist/index23.js +30 -28
  249. package/dist/index23.js.map +1 -1
  250. package/dist/{index228.js → index232.js} +1 -1
  251. package/dist/{index228.js.map → index232.js.map} +1 -1
  252. package/dist/index24.js.map +1 -1
  253. package/dist/index241.js +168 -8
  254. package/dist/index241.js.map +1 -1
  255. package/dist/index242.js +3 -9
  256. package/dist/index242.js.map +1 -1
  257. package/dist/index244.js +9 -169
  258. package/dist/index244.js.map +1 -1
  259. package/dist/index245.js +10 -11
  260. package/dist/index245.js.map +1 -1
  261. package/dist/index246.js +4 -5
  262. package/dist/index246.js.map +1 -1
  263. package/dist/index247.js +170 -6
  264. package/dist/index247.js.map +1 -1
  265. package/dist/index248.js +11 -38
  266. package/dist/index248.js.map +1 -1
  267. package/dist/index249.js +6 -2
  268. package/dist/index249.js.map +1 -1
  269. package/dist/index25.js +259 -236
  270. package/dist/index25.js.map +1 -1
  271. package/dist/index250.js +5 -7
  272. package/dist/index250.js.map +1 -1
  273. package/dist/index251.js +36 -325
  274. package/dist/index251.js.map +1 -1
  275. package/dist/index252.js +2 -50
  276. package/dist/index252.js.map +1 -1
  277. package/dist/index253.js +8 -2
  278. package/dist/index253.js.map +1 -1
  279. package/dist/index254.js +323 -72
  280. package/dist/index254.js.map +1 -1
  281. package/dist/index255.js +47 -90
  282. package/dist/index255.js.map +1 -1
  283. package/dist/index256.js +2 -52
  284. package/dist/index256.js.map +1 -1
  285. package/dist/index257.js +75 -7
  286. package/dist/index257.js.map +1 -1
  287. package/dist/index258.js +92 -4
  288. package/dist/index258.js.map +1 -1
  289. package/dist/index259.js +48 -48
  290. package/dist/index259.js.map +1 -1
  291. package/dist/index26.js.map +1 -1
  292. package/dist/index260.js +8 -2
  293. package/dist/index260.js.map +1 -1
  294. package/dist/index261.js +5 -2
  295. package/dist/index261.js.map +1 -1
  296. package/dist/index262.js +55 -0
  297. package/dist/index262.js.map +1 -0
  298. package/dist/index263.js +5 -0
  299. package/dist/index263.js.map +1 -0
  300. package/dist/index264.js +5 -0
  301. package/dist/index264.js.map +1 -0
  302. package/dist/index27.js.map +1 -1
  303. package/dist/index28.js +3 -3
  304. package/dist/index28.js.map +1 -1
  305. package/dist/index29.js +43 -41
  306. package/dist/index29.js.map +1 -1
  307. package/dist/index3.js.map +1 -1
  308. package/dist/index30.js +81 -79
  309. package/dist/index30.js.map +1 -1
  310. package/dist/index31.js.map +1 -1
  311. package/dist/index32.js.map +1 -1
  312. package/dist/index33.js +18 -16
  313. package/dist/index33.js.map +1 -1
  314. package/dist/index34.js.map +1 -1
  315. package/dist/index35.js +1 -1
  316. package/dist/index35.js.map +1 -1
  317. package/dist/index36.js +1 -1
  318. package/dist/index36.js.map +1 -1
  319. package/dist/index37.js.map +1 -1
  320. package/dist/index38.js +1 -1
  321. package/dist/index38.js.map +1 -1
  322. package/dist/index39.js +2 -2
  323. package/dist/index39.js.map +1 -1
  324. package/dist/index4.js.map +1 -1
  325. package/dist/index40.js +1 -1
  326. package/dist/index40.js.map +1 -1
  327. package/dist/index41.js.map +1 -1
  328. package/dist/index42.js.map +1 -1
  329. package/dist/index43.js.map +1 -1
  330. package/dist/index44.js +3 -3
  331. package/dist/index44.js.map +1 -1
  332. package/dist/index45.js +1 -1
  333. package/dist/index45.js.map +1 -1
  334. package/dist/index46.js +2 -2
  335. package/dist/index46.js.map +1 -1
  336. package/dist/index47.js.map +1 -1
  337. package/dist/index48.js.map +1 -1
  338. package/dist/index49.js +1 -1
  339. package/dist/index49.js.map +1 -1
  340. package/dist/index5.js.map +1 -1
  341. package/dist/index50.js.map +1 -1
  342. package/dist/index51.js +183 -175
  343. package/dist/index51.js.map +1 -1
  344. package/dist/index52.js +1 -1
  345. package/dist/index52.js.map +1 -1
  346. package/dist/index53.js +1 -1
  347. package/dist/index53.js.map +1 -1
  348. package/dist/index54.js.map +1 -1
  349. package/dist/index55.js.map +1 -1
  350. package/dist/index56.js.map +1 -1
  351. package/dist/index57.js +1 -1
  352. package/dist/index57.js.map +1 -1
  353. package/dist/index58.js.map +1 -1
  354. package/dist/index59.js.map +1 -1
  355. package/dist/index6.js +230 -226
  356. package/dist/index6.js.map +1 -1
  357. package/dist/index60.js.map +1 -1
  358. package/dist/index61.js.map +1 -1
  359. package/dist/index62.js.map +1 -1
  360. package/dist/index63.js +1 -1
  361. package/dist/index63.js.map +1 -1
  362. package/dist/index64.js.map +1 -1
  363. package/dist/index65.js +1 -1
  364. package/dist/index65.js.map +1 -1
  365. package/dist/index67.js.map +1 -1
  366. package/dist/index68.js.map +1 -1
  367. package/dist/index69.js.map +1 -1
  368. package/dist/index7.js +1 -1
  369. package/dist/index7.js.map +1 -1
  370. package/dist/index70.js.map +1 -1
  371. package/dist/index71.js.map +1 -1
  372. package/dist/index72.js +34 -33
  373. package/dist/index72.js.map +1 -1
  374. package/dist/index73.js.map +1 -1
  375. package/dist/index74.js.map +1 -1
  376. package/dist/index75.js.map +1 -1
  377. package/dist/index76.js +28 -25
  378. package/dist/index76.js.map +1 -1
  379. package/dist/index77.js.map +1 -1
  380. package/dist/index78.js.map +1 -1
  381. package/dist/{index208.js → index79.js} +1 -1
  382. package/dist/index79.js.map +1 -0
  383. package/dist/index8.js.map +1 -1
  384. package/dist/index80.js +19 -2
  385. package/dist/index80.js.map +1 -1
  386. package/dist/index81.js +9 -2
  387. package/dist/index81.js.map +1 -1
  388. package/dist/index82.js +42 -2
  389. package/dist/index82.js.map +1 -1
  390. package/dist/index83.js +6 -2
  391. package/dist/index83.js.map +1 -1
  392. package/dist/index84.js +68 -2
  393. package/dist/index84.js.map +1 -1
  394. package/dist/index85.js +21 -2
  395. package/dist/index85.js.map +1 -1
  396. package/dist/index87.js +2 -2
  397. package/dist/index87.js.map +1 -1
  398. package/dist/index88.js +2 -2
  399. package/dist/index88.js.map +1 -1
  400. package/dist/index89.js +1 -1
  401. package/dist/index89.js.map +1 -1
  402. package/dist/index9.js +28 -26
  403. package/dist/index9.js.map +1 -1
  404. package/dist/index90.js +2 -2
  405. package/dist/index90.js.map +1 -1
  406. package/dist/index91.js +1 -1
  407. package/dist/index91.js.map +1 -1
  408. package/dist/index92.js +1 -1
  409. package/dist/index92.js.map +1 -1
  410. package/dist/index93.js +1 -1
  411. package/dist/index93.js.map +1 -1
  412. package/dist/index94.js +1 -1
  413. package/dist/index94.js.map +1 -1
  414. package/dist/index95.js +1 -1
  415. package/dist/index95.js.map +1 -1
  416. package/dist/index96.js +1 -1
  417. package/dist/index96.js.map +1 -1
  418. package/dist/index97.js +1 -1
  419. package/dist/index97.js.map +1 -1
  420. package/dist/index98.js +1 -1
  421. package/dist/index98.js.map +1 -1
  422. package/dist/index99.js +1 -1
  423. package/dist/index99.js.map +1 -1
  424. package/package.json +1 -1
  425. package/dist/index208.js.map +0 -1
  426. package/dist/index209.js +0 -71
  427. package/dist/index209.js.map +0 -1
  428. package/dist/index237.js +0 -176
  429. package/dist/index237.js.map +0 -1
  430. package/dist/index238.js +0 -7
  431. package/dist/index238.js.map +0 -1
  432. package/dist/index240.js +0 -22
  433. package/dist/index240.js.map +0 -1
  434. package/dist/index243.js +0 -8
  435. package/dist/index243.js.map +0 -1
  436. package/dist/index86.js +0 -5
  437. package/dist/index86.js.map +0 -1
package/dist/index76.js CHANGED
@@ -1,53 +1,56 @@
1
- import { useState as m, useEffect as w, useCallback as b } from "react";
2
- import { useScrollActiveIntoView as x } from "./index240.js";
1
+ import { useState as v, useEffect as w, useCallback as h } from "react";
2
+ import { useScrollActiveIntoView as x } from "./index80.js";
3
3
  function E({
4
4
  items: u,
5
5
  isOpen: t,
6
6
  onSelect: o,
7
- onClose: c,
8
- onOpen: l,
9
- loop: i = !0,
10
- disabled: h = !1,
7
+ onClose: i,
8
+ onOpen: n,
9
+ loop: l = !0,
10
+ disabled: b = !1,
11
11
  listboxRef: k,
12
- optionSelector: g = '[role="option"]'
12
+ optionSelector: D = '[role="option"]'
13
13
  }) {
14
- const [f, a] = m(-1);
14
+ const [e, r] = v(-1);
15
15
  w(() => {
16
- t || a(-1);
16
+ t || r(-1);
17
17
  }, [t]), x({
18
18
  containerRef: k,
19
- activeIndex: f,
20
- itemSelector: g,
19
+ activeIndex: e,
20
+ itemSelector: D,
21
21
  enabled: t
22
22
  });
23
- const D = b((r) => {
24
- if (h) {
25
- r.key === "Escape" && t && (r.preventDefault(), c());
23
+ const g = h((a) => {
24
+ if (b) {
25
+ a.key === "Escape" && t && (a.preventDefault(), i());
26
26
  return;
27
27
  }
28
- const e = u.length;
29
- switch (r.key) {
28
+ const f = u.length;
29
+ switch (a.key) {
30
30
  case "ArrowDown":
31
- r.preventDefault(), !t && e > 0 ? (l?.(), a(0)) : t && e > 0 && a((n) => i ? (n + 1) % e : Math.min(n + 1, e - 1));
31
+ a.preventDefault(), !t && f > 0 ? (n?.(), r(0)) : t && f > 0 && r((c) => l ? (c + 1) % f : Math.min(c + 1, f - 1));
32
32
  break;
33
33
  case "ArrowUp":
34
- r.preventDefault(), t && e > 0 && a((n) => n === -1 ? e - 1 : i ? (n - 1 + e) % e : Math.max(n - 1, 0));
34
+ a.preventDefault(), t && f > 0 && r((c) => c === -1 ? f - 1 : l ? (c - 1 + f) % f : Math.max(c - 1, 0));
35
35
  break;
36
36
  case "Enter":
37
- t && f >= 0 && u[f] && (r.preventDefault(), o(u[f], f), a(-1));
37
+ a.preventDefault(), t ? e >= 0 && u[e] && (o(u[e], e), r(-1)) : (n?.(), r(0));
38
+ break;
39
+ case " ":
40
+ a.preventDefault(), t ? e >= 0 && u[e] && (o(u[e], e), r(-1)) : (n?.(), r(0));
38
41
  break;
39
42
  case "Escape":
40
- t && (r.preventDefault(), c(), a(-1));
43
+ t && (a.preventDefault(), i(), r(-1));
41
44
  break;
42
45
  case "Tab":
43
- t && (c(), a(-1));
46
+ t && (i(), r(-1));
44
47
  break;
45
48
  }
46
- }, [h, u, t, f, o, c, l, i]), d = b((r, e) => `${r}-option-${e}`, []);
49
+ }, [b, u, t, e, o, i, n, l]), d = h((a, f) => `${a}-option-${f}`, []);
47
50
  return {
48
- highlightedIndex: f,
49
- setHighlightedIndex: a,
50
- handleKeyDown: D,
51
+ highlightedIndex: e,
52
+ setHighlightedIndex: r,
53
+ handleKeyDown: g,
51
54
  getOptionId: d
52
55
  };
53
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index76.js","sources":["../src/utils/a11y/useComboboxNavigation.ts"],"sourcesContent":["import { useCallback, useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\nimport { useScrollActiveIntoView } from './useScrollActiveIntoView';\n\nexport interface UseComboboxNavigationOptions<T = any> {\n /**\n * Array of items to navigate through\n */\n items: T[];\n \n /**\n * Whether the dropdown is currently open\n */\n isOpen: boolean;\n \n /**\n * Callback when an item is selected (Enter key)\n */\n onSelect: (item: T, index: number) => void;\n \n /**\n * Callback to close the dropdown\n */\n onClose: () => void;\n \n /**\n * Optional: Callback to open the dropdown\n */\n onOpen?: () => void;\n \n /**\n * Whether to wrap around at the ends of the list.\n * Default: true\n */\n loop?: boolean;\n \n /**\n * Whether keyboard navigation is disabled\n * (e.g., for custom rendered content)\n */\n disabled?: boolean;\n \n /**\n * Ref to the listbox container for scroll management\n */\n listboxRef?: RefObject<HTMLElement | null>;\n \n /**\n * CSS selector for option elements (default: '[role=\"option\"]')\n */\n optionSelector?: string;\n}\n\nexport interface UseComboboxNavigationReturn {\n /**\n * Currently highlighted index (-1 if none)\n */\n highlightedIndex: number;\n \n /**\n * Set the highlighted index manually\n */\n setHighlightedIndex: (index: number | ((prev: number) => number)) => void;\n \n /**\n * Keyboard event handler for the combobox input\n */\n handleKeyDown: (e: React.KeyboardEvent) => void;\n \n /**\n * Generate stable ID for an option\n */\n getOptionId: (listboxId: string, index: number) => string;\n \n}\n\n/**\n * Hook for managing combobox keyboard navigation with aria-activedescendant.\n * \n * Implements WAI-ARIA 1.2 Combobox pattern:\n * - Arrow Up/Down to navigate options\n * - Enter to select highlighted option\n * - Escape to close dropdown\n * - Tab to close and move focus\n * - Auto-scrolls highlighted option into view\n * \n * @example\n * ```tsx\n * const { \n * highlightedIndex, \n * handleKeyDown, \n * getOptionId \n * } = useComboboxNavigation({\n * items: suggestions,\n * isOpen: isDropdownOpen,\n * onSelect: (item, idx) => handleSelect(item),\n * onClose: () => setIsOpen(false),\n * listboxRef\n * });\n * \n * <input\n * role=\"combobox\"\n * onKeyDown={handleKeyDown}\n * aria-activedescendant={highlightedIndex >= 0 ? getOptionId(listboxId, highlightedIndex) : undefined}\n * />\n * ```\n */\nexport function useComboboxNavigation<T = any>({\n items,\n isOpen,\n onSelect,\n onClose,\n onOpen,\n loop = true,\n disabled = false,\n listboxRef,\n optionSelector = '[role=\"option\"]'\n}: UseComboboxNavigationOptions<T>): UseComboboxNavigationReturn {\n const [highlightedIndex, setHighlightedIndex] = useState<number>(-1);\n \n // Reset highlighted index when dropdown closes\n useEffect(() => {\n if (!isOpen) {\n setHighlightedIndex(-1);\n }\n }, [isOpen]);\n \n // Auto-scroll highlighted item into view\n useScrollActiveIntoView({\n containerRef: listboxRef,\n activeIndex: highlightedIndex,\n itemSelector: optionSelector,\n enabled: isOpen\n });\n \n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) {\n // For disabled navigation, still handle Escape\n if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n onClose();\n }\n return;\n }\n \n const itemCount = items.length;\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen && itemCount > 0) {\n // Open dropdown and highlight first item\n onOpen?.();\n setHighlightedIndex(0);\n } else if (isOpen && itemCount > 0) {\n // Navigate down\n setHighlightedIndex((prev) => {\n if (loop) {\n return (prev + 1) % itemCount;\n }\n return Math.min(prev + 1, itemCount - 1);\n });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (isOpen && itemCount > 0) {\n // Navigate up\n setHighlightedIndex((prev) => {\n // If nothing highlighted, go to last item\n if (prev === -1) {\n return itemCount - 1;\n }\n if (loop) {\n return (prev - 1 + itemCount) % itemCount;\n }\n return Math.max(prev - 1, 0);\n });\n }\n break;\n \n case 'Enter':\n if (isOpen && highlightedIndex >= 0 && items[highlightedIndex]) {\n e.preventDefault();\n onSelect(items[highlightedIndex], highlightedIndex);\n setHighlightedIndex(-1);\n }\n break;\n \n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n onClose();\n setHighlightedIndex(-1);\n }\n break;\n \n case 'Tab':\n // Close dropdown on Tab (don't preventDefault - let focus move naturally)\n if (isOpen) {\n onClose();\n setHighlightedIndex(-1);\n }\n break;\n }\n },\n [disabled, items, isOpen, highlightedIndex, onSelect, onClose, onOpen, loop]\n );\n \n const getOptionId = useCallback(\n (listboxId: string, index: number) => `${listboxId}-option-${index}`,\n []\n );\n \n return {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n getOptionId\n };\n}\n"],"names":["useState","useEffect","useCallback","useScrollActiveIntoView","useComboboxNavigation","items","isOpen","onSelect","onClose","onOpen","loop","disabled","listboxRef","optionSelector","highlightedIndex","setHighlightedIndex","containerRef","activeIndex","itemSelector","enabled","handleKeyDown","e","key","preventDefault","itemCount","length","prev","Math","min","max","getOptionId","listboxId","index"],"mappings":"AA2GO,SAAA,YAAAA,GAAA,aAAAC,GAAA,eAAAC,SAAA;AAAA,SAAA,2BAAAC,SAAA;AAAA,SAASC,EAA+B;AAAA,EAC7CC,OAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,MAAAA,IAAO;AAAA,EACPC,UAAAA,IAAW;AAAA,EACXC,YAAAA;AAAAA,EACAC,gBAAAA,IAAiB;AACc,GAAgC;AAC/D,QAAM,CAACC,GAAkBC,CAAmB,IAAIf,EAAiB,EAAE;AAGnEC,EAAAA,EAAU,MAAM;AACd,IAAKK,KACHS,EAAoB,EAAE;AAAA,EACxB,GACC,CAACT,CAAM,CAAC,GAGaH,EAAA;AAAA,IACtBa,cAAcJ;AAAAA,IACdK,aAAaH;AAAAA,IACbI,cAAcL;AAAAA,IACdM,SAASb;AAAAA,EAAAA,CACV;AAEKc,QAAAA,IAAgBlB,EACpB,CAACmB,MAA2B;AAC1B,QAAIV,GAAU;AAERU,MAAAA,EAAEC,QAAQ,YAAYhB,MACxBe,EAAEE,eAAe,GACTf;AAEV;AAAA,IACF;AAEA,UAAMgB,IAAYnB,EAAMoB;AAExB,YAAQJ,EAAEC,KAAG;AAAA,MACX,KAAK;AACHD,QAAAA,EAAEE,eAAe,GACb,CAACjB,KAAUkB,IAAY,KAEhBf,OACTM,EAAoB,CAAC,KACZT,KAAUkB,IAAY,KAE/BT,EAAqBW,CAASA,MACxBhB,KACMgB,IAAO,KAAKF,IAEfG,KAAKC,IAAIF,IAAO,GAAGF,IAAY,CAAC,CACxC;AAEH;AAAA,MAEF,KAAK;AACHH,QAAAA,EAAEE,eAAe,GACbjB,KAAUkB,IAAY,KAExBT,EAAqBW,CAASA,MAExBA,MAAS,KACJF,IAAY,IAEjBd,KACMgB,IAAO,IAAIF,KAAaA,IAE3BG,KAAKE,IAAIH,IAAO,GAAG,CAAC,CAC5B;AAEH;AAAA,MAEF,KAAK;AACH,QAAIpB,KAAUQ,KAAoB,KAAKT,EAAMS,CAAgB,MAC3DO,EAAEE,eAAe,GACRlB,EAAAA,EAAMS,CAAgB,GAAGA,CAAgB,GAClDC,EAAoB,EAAE;AAExB;AAAA,MAEF,KAAK;AACH,QAAIT,MACFe,EAAEE,eAAe,GACTf,KACRO,EAAoB,EAAE;AAExB;AAAA,MAEF,KAAK;AAEH,QAAIT,MACME,KACRO,EAAoB,EAAE;AAExB;AAAA,IACJ;AAAA,EAAA,GAEF,CAACJ,GAAUN,GAAOC,GAAQQ,GAAkBP,GAAUC,GAASC,GAAQC,CAAI,CAC7E,GAEMoB,IAAc5B,EAClB,CAAC6B,GAAmBC,MAAkB,GAAGD,CAAS,WAAWC,CAAK,IAClE,CACF,CAAA;AAEO,SAAA;AAAA,IACLlB,kBAAAA;AAAAA,IACAC,qBAAAA;AAAAA,IACAK,eAAAA;AAAAA,IACAU,aAAAA;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"index76.js","sources":["../src/utils/a11y/useComboboxNavigation.ts"],"sourcesContent":["import { useCallback, useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\nimport { useScrollActiveIntoView } from './useScrollActiveIntoView';\n\nexport interface UseComboboxNavigationOptions<T = any> {\n /**\n * Array of items to navigate through\n */\n items: T[];\n \n /**\n * Whether the dropdown is currently open\n */\n isOpen: boolean;\n \n /**\n * Callback when an item is selected (Enter key)\n */\n onSelect: (item: T, index: number) => void;\n \n /**\n * Callback to close the dropdown\n */\n onClose: () => void;\n \n /**\n * Optional: Callback to open the dropdown\n */\n onOpen?: () => void;\n \n /**\n * Whether to wrap around at the ends of the list.\n * Default: true\n */\n loop?: boolean;\n \n /**\n * Whether keyboard navigation is disabled\n * (e.g., for custom rendered content)\n */\n disabled?: boolean;\n \n /**\n * Ref to the listbox container for scroll management\n */\n listboxRef?: RefObject<HTMLElement | null>;\n \n /**\n * CSS selector for option elements (default: '[role=\"option\"]')\n */\n optionSelector?: string;\n}\n\nexport interface UseComboboxNavigationReturn {\n /**\n * Currently highlighted index (-1 if none)\n */\n highlightedIndex: number;\n \n /**\n * Set the highlighted index manually\n */\n setHighlightedIndex: (index: number | ((prev: number) => number)) => void;\n \n /**\n * Keyboard event handler for the combobox input\n */\n handleKeyDown: (e: React.KeyboardEvent) => void;\n \n /**\n * Generate stable ID for an option\n */\n getOptionId: (listboxId: string, index: number) => string;\n \n}\n\n/**\n * Hook for managing combobox keyboard navigation with aria-activedescendant.\n * \n * Implements WAI-ARIA 1.2 Combobox pattern:\n * - Arrow Up/Down to navigate options\n * - Enter to select highlighted option\n * - Escape to close dropdown\n * - Tab to close and move focus\n * - Auto-scrolls highlighted option into view\n * \n * @example\n * ```tsx\n * const { \n * highlightedIndex, \n * handleKeyDown, \n * getOptionId \n * } = useComboboxNavigation({\n * items: suggestions,\n * isOpen: isDropdownOpen,\n * onSelect: (item, idx) => handleSelect(item),\n * onClose: () => setIsOpen(false),\n * listboxRef\n * });\n * \n * <input\n * role=\"combobox\"\n * onKeyDown={handleKeyDown}\n * aria-activedescendant={highlightedIndex >= 0 ? getOptionId(listboxId, highlightedIndex) : undefined}\n * />\n * ```\n */\nexport function useComboboxNavigation<T = any>({\n items,\n isOpen,\n onSelect,\n onClose,\n onOpen,\n loop = true,\n disabled = false,\n listboxRef,\n optionSelector = '[role=\"option\"]'\n}: UseComboboxNavigationOptions<T>): UseComboboxNavigationReturn {\n const [highlightedIndex, setHighlightedIndex] = useState<number>(-1);\n \n // Reset highlighted index when dropdown closes\n useEffect(() => {\n if (!isOpen) {\n setHighlightedIndex(-1);\n }\n }, [isOpen]);\n \n // Auto-scroll highlighted item into view\n useScrollActiveIntoView({\n containerRef: listboxRef,\n activeIndex: highlightedIndex,\n itemSelector: optionSelector,\n enabled: isOpen\n });\n \n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) {\n // For disabled navigation, still handle Escape\n if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n onClose();\n }\n return;\n }\n \n const itemCount = items.length;\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen && itemCount > 0) {\n // Open dropdown and highlight first item\n onOpen?.();\n setHighlightedIndex(0);\n } else if (isOpen && itemCount > 0) {\n // Navigate down\n setHighlightedIndex((prev) => {\n if (loop) {\n return (prev + 1) % itemCount;\n }\n return Math.min(prev + 1, itemCount - 1);\n });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (isOpen && itemCount > 0) {\n // Navigate up\n setHighlightedIndex((prev) => {\n // If nothing highlighted, go to last item\n if (prev === -1) {\n return itemCount - 1;\n }\n if (loop) {\n return (prev - 1 + itemCount) % itemCount;\n }\n return Math.max(prev - 1, 0);\n });\n }\n break;\n \n case 'Enter':\n e.preventDefault();\n if (!isOpen) {\n onOpen?.();\n setHighlightedIndex(0);\n } else if (highlightedIndex >= 0 && items[highlightedIndex]) {\n onSelect(items[highlightedIndex], highlightedIndex);\n setHighlightedIndex(-1);\n }\n break;\n\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n onOpen?.();\n setHighlightedIndex(0);\n } else if (highlightedIndex >= 0 && items[highlightedIndex]) {\n onSelect(items[highlightedIndex], highlightedIndex);\n setHighlightedIndex(-1);\n }\n break;\n \n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n onClose();\n setHighlightedIndex(-1);\n }\n break;\n \n case 'Tab':\n // Close dropdown on Tab (don't preventDefault - let focus move naturally)\n if (isOpen) {\n onClose();\n setHighlightedIndex(-1);\n }\n break;\n }\n },\n [disabled, items, isOpen, highlightedIndex, onSelect, onClose, onOpen, loop]\n );\n \n const getOptionId = useCallback(\n (listboxId: string, index: number) => `${listboxId}-option-${index}`,\n []\n );\n \n return {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n getOptionId\n };\n}\n"],"names":["useState","useEffect","useCallback","useScrollActiveIntoView","useComboboxNavigation","items","isOpen","onSelect","onClose","onOpen","loop","disabled","listboxRef","optionSelector","highlightedIndex","setHighlightedIndex","containerRef","activeIndex","itemSelector","enabled","handleKeyDown","e","key","preventDefault","itemCount","length","prev","Math","min","max","getOptionId","listboxId","index"],"mappings":"AA2GO,SAAA,YAAAA,GAAA,aAAAC,GAAA,eAAAC,SAAA;AAAA,SAAA,2BAAAC,SAAA;AAAA,SAASC,EAA+B;AAAA,EAC7CC,OAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,MAAAA,IAAO;AAAA,EACPC,UAAAA,IAAW;AAAA,EACXC,YAAAA;AAAAA,EACAC,gBAAAA,IAAiB;AACc,GAAgC;AAC/D,QAAM,CAACC,GAAkBC,CAAmB,IAAIf,EAAiB,EAAE;AAGnEC,EAAAA,EAAU,MAAM;AACd,IAAKK,KACHS,EAAoB,EAAE;AAAA,EAE1B,GAAG,CAACT,CAAM,CAAC,GAGXH,EAAwB;AAAA,IACtBa,cAAcJ;AAAAA,IACdK,aAAaH;AAAAA,IACbI,cAAcL;AAAAA,IACdM,SAASb;AAAAA,EAAAA,CACV;AAED,QAAMc,IAAgBlB,EACpB,CAACmB,MAA2B;AAC1B,QAAIV,GAAU;AAEZ,MAAIU,EAAEC,QAAQ,YAAYhB,MACxBe,EAAEE,eAAAA,GACFf,EAAAA;AAEF;AAAA,IACF;AAEA,UAAMgB,IAAYnB,EAAMoB;AAExB,YAAQJ,EAAEC,KAAAA;AAAAA,MACR,KAAK;AACHD,QAAAA,EAAEE,eAAAA,GACE,CAACjB,KAAUkB,IAAY,KAEzBf,IAAAA,GACAM,EAAoB,CAAC,KACZT,KAAUkB,IAAY,KAE/BT,EAAqBW,CAAAA,MACfhB,KACMgB,IAAO,KAAKF,IAEfG,KAAKC,IAAIF,IAAO,GAAGF,IAAY,CAAC,CACxC;AAEH;AAAA,MAEF,KAAK;AACHH,QAAAA,EAAEE,eAAAA,GACEjB,KAAUkB,IAAY,KAExBT,EAAqBW,CAAAA,MAEfA,MAAS,KACJF,IAAY,IAEjBd,KACMgB,IAAO,IAAIF,KAAaA,IAE3BG,KAAKE,IAAIH,IAAO,GAAG,CAAC,CAC5B;AAEH;AAAA,MAEF,KAAK;AACHL,QAAAA,EAAEE,eAAAA,GACGjB,IAGMQ,KAAoB,KAAKT,EAAMS,CAAgB,MACxDP,EAASF,EAAMS,CAAgB,GAAGA,CAAgB,GAClDC,EAAoB,EAAE,MAJtBN,IAAAA,GACAM,EAAoB,CAAC;AAKvB;AAAA,MAEF,KAAK;AACHM,QAAAA,EAAEE,eAAAA,GACGjB,IAGMQ,KAAoB,KAAKT,EAAMS,CAAgB,MACxDP,EAASF,EAAMS,CAAgB,GAAGA,CAAgB,GAClDC,EAAoB,EAAE,MAJtBN,IAAAA,GACAM,EAAoB,CAAC;AAKvB;AAAA,MAEF,KAAK;AACH,QAAIT,MACFe,EAAEE,eAAAA,GACFf,EAAAA,GACAO,EAAoB,EAAE;AAExB;AAAA,MAEF,KAAK;AAEH,QAAIT,MACFE,EAAAA,GACAO,EAAoB,EAAE;AAExB;AAAA,IAAA;AAAA,EAEN,GACA,CAACJ,GAAUN,GAAOC,GAAQQ,GAAkBP,GAAUC,GAASC,GAAQC,CAAI,CAC7E,GAEMoB,IAAc5B,EAClB,CAAC6B,GAAmBC,MAAkB,GAAGD,CAAS,WAAWC,CAAK,IAClE,CAAA,CACF;AAEA,SAAO;AAAA,IACLlB,kBAAAA;AAAAA,IACAC,qBAAAA;AAAAA,IACAK,eAAAA;AAAAA,IACAU,aAAAA;AAAAA,EAAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index77.js","sources":["../src/utils/a11y/useDismissOnFocusOut.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type UseDismissOnFocusOutOptions = {\n /**\n * Disable all handlers (no-ops). Useful when a component provides alternate\n * focus/keyboard behavior (e.g., disabled-trigger tooltip wrapper).\n */\n disabled?: boolean;\n /**\n * Called when focus enters anywhere within the target.\n */\n onFocusIn?: () => void;\n /**\n * Called when focus leaves the target (i.e., focus moves to an element\n * outside the currentTarget).\n */\n onFocusOut?: () => void;\n /**\n * Called when Escape is pressed while focus is within the target.\n */\n onEscape?: () => void;\n /**\n * Whether Escape should trigger dismissal. Default: true.\n */\n closeOnEscape?: boolean;\n};\n\nexport type UseDismissOnFocusOutReturn<T extends HTMLElement = HTMLElement> = {\n onFocusCapture: (e: React.FocusEvent<T>) => void;\n onBlurCapture: (e: React.FocusEvent<T>) => void;\n onKeyDownCapture: (e: React.KeyboardEvent<T>) => void;\n};\n\n/**\n * Returns capture-phase handlers to \"show on focus within\" and \"dismiss on focus out\",\n * with optional Escape-to-dismiss.\n *\n * Intended for non-interactive surfaces like tooltips where content should remain\n * visible while focus stays within the wrapper.\n */\nexport function useDismissOnFocusOut<T extends HTMLElement = HTMLElement>({\n disabled = false,\n onFocusIn,\n onFocusOut,\n onEscape,\n closeOnEscape = true\n}: UseDismissOnFocusOutOptions): UseDismissOnFocusOutReturn<T> {\n const onFocusCapture = React.useCallback(\n (_e: React.FocusEvent<T>) => {\n if (disabled) return;\n onFocusIn?.();\n },\n [disabled, onFocusIn]\n );\n\n const onBlurCapture = React.useCallback(\n (e: React.FocusEvent<T>) => {\n if (disabled) return;\n\n const nextFocused = e.relatedTarget as Node | null;\n if (nextFocused && e.currentTarget.contains(nextFocused)) return;\n\n onFocusOut?.();\n },\n [disabled, onFocusOut]\n );\n\n const onKeyDownCapture = React.useCallback(\n (e: React.KeyboardEvent<T>) => {\n if (disabled || !closeOnEscape || e.key !== 'Escape') return;\n\n e.preventDefault();\n onEscape?.();\n },\n [disabled, closeOnEscape, onEscape]\n );\n\n return { onFocusCapture, onBlurCapture, onKeyDownCapture };\n}\n\n"],"names":["React","useDismissOnFocusOut","disabled","onFocusIn","onFocusOut","onEscape","closeOnEscape","onFocusCapture","useCallback","_e","onBlurCapture","e","nextFocused","relatedTarget","currentTarget","contains","onKeyDownCapture","key","preventDefault"],"mappings":"AAwCO,YAAAA,OAAA;AAAA,SAASC,EAA0D;AAAA,EACxEC,UAAAA,IAAW;AAAA,EACXC,WAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,eAAAA,IAAgB;AACW,GAAkC;AAC7D,QAAMC,IAAiBP,EAAMQ,YAC3B,CAACC,MAA4B;AAC3B,IAAIP,KACQC;EAAA,GAEd,CAACD,GAAUC,CAAS,CACtB,GAEMO,IAAgBV,EAAMQ,YAC1B,CAACG,MAA2B;AAC1B,QAAIT,EAAU;AAEd,UAAMU,IAAcD,EAAEE;AACtB,IAAID,KAAeD,EAAEG,cAAcC,SAASH,CAAW,KAE1CR;EAAA,GAEf,CAACF,GAAUE,CAAU,CACvB,GAEMY,IAAmBhB,EAAMQ,YAC7B,CAACG,MAA8B;AAC7B,IAAIT,KAAY,CAACI,KAAiBK,EAAEM,QAAQ,aAE5CN,EAAEO,eAAe,GACNb;EAEb,GAAA,CAACH,GAAUI,GAAeD,CAAQ,CACpC;AAEO,SAAA;AAAA,IAAEE,gBAAAA;AAAAA,IAAgBG,eAAAA;AAAAA,IAAeM,kBAAAA;AAAAA,EAAAA;AAC1C;"}
1
+ {"version":3,"file":"index77.js","sources":["../src/utils/a11y/useDismissOnFocusOut.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type UseDismissOnFocusOutOptions = {\n /**\n * Disable all handlers (no-ops). Useful when a component provides alternate\n * focus/keyboard behavior (e.g., disabled-trigger tooltip wrapper).\n */\n disabled?: boolean;\n /**\n * Called when focus enters anywhere within the target.\n */\n onFocusIn?: () => void;\n /**\n * Called when focus leaves the target (i.e., focus moves to an element\n * outside the currentTarget).\n */\n onFocusOut?: () => void;\n /**\n * Called when Escape is pressed while focus is within the target.\n */\n onEscape?: () => void;\n /**\n * Whether Escape should trigger dismissal. Default: true.\n */\n closeOnEscape?: boolean;\n};\n\nexport type UseDismissOnFocusOutReturn<T extends HTMLElement = HTMLElement> = {\n onFocusCapture: (e: React.FocusEvent<T>) => void;\n onBlurCapture: (e: React.FocusEvent<T>) => void;\n onKeyDownCapture: (e: React.KeyboardEvent<T>) => void;\n};\n\n/**\n * Returns capture-phase handlers to \"show on focus within\" and \"dismiss on focus out\",\n * with optional Escape-to-dismiss.\n *\n * Intended for non-interactive surfaces like tooltips where content should remain\n * visible while focus stays within the wrapper.\n */\nexport function useDismissOnFocusOut<T extends HTMLElement = HTMLElement>({\n disabled = false,\n onFocusIn,\n onFocusOut,\n onEscape,\n closeOnEscape = true\n}: UseDismissOnFocusOutOptions): UseDismissOnFocusOutReturn<T> {\n const onFocusCapture = React.useCallback(\n (_e: React.FocusEvent<T>) => {\n if (disabled) return;\n onFocusIn?.();\n },\n [disabled, onFocusIn]\n );\n\n const onBlurCapture = React.useCallback(\n (e: React.FocusEvent<T>) => {\n if (disabled) return;\n\n const nextFocused = e.relatedTarget as Node | null;\n if (nextFocused && e.currentTarget.contains(nextFocused)) return;\n\n onFocusOut?.();\n },\n [disabled, onFocusOut]\n );\n\n const onKeyDownCapture = React.useCallback(\n (e: React.KeyboardEvent<T>) => {\n if (disabled || !closeOnEscape || e.key !== 'Escape') return;\n\n e.preventDefault();\n onEscape?.();\n },\n [disabled, closeOnEscape, onEscape]\n );\n\n return { onFocusCapture, onBlurCapture, onKeyDownCapture };\n}\n\n"],"names":["React","useDismissOnFocusOut","disabled","onFocusIn","onFocusOut","onEscape","closeOnEscape","onFocusCapture","useCallback","_e","onBlurCapture","e","nextFocused","relatedTarget","currentTarget","contains","onKeyDownCapture","key","preventDefault"],"mappings":"AAwCO,YAAAA,OAAA;AAAA,SAASC,EAA0D;AAAA,EACxEC,UAAAA,IAAW;AAAA,EACXC,WAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,eAAAA,IAAgB;AACW,GAAkC;AAC7D,QAAMC,IAAiBP,EAAMQ,YAC3B,CAACC,MAA4B;AAC3B,IAAIP,KACJC,IAAAA;AAAAA,EACF,GACA,CAACD,GAAUC,CAAS,CACtB,GAEMO,IAAgBV,EAAMQ,YAC1B,CAACG,MAA2B;AAC1B,QAAIT,EAAU;AAEd,UAAMU,IAAcD,EAAEE;AACtB,IAAID,KAAeD,EAAEG,cAAcC,SAASH,CAAW,KAEvDR,IAAAA;AAAAA,EACF,GACA,CAACF,GAAUE,CAAU,CACvB,GAEMY,IAAmBhB,EAAMQ,YAC7B,CAACG,MAA8B;AAC7B,IAAIT,KAAY,CAACI,KAAiBK,EAAEM,QAAQ,aAE5CN,EAAEO,eAAAA,GACFb,IAAAA;AAAAA,EACF,GACA,CAACH,GAAUI,GAAeD,CAAQ,CACpC;AAEA,SAAO;AAAA,IAAEE,gBAAAA;AAAAA,IAAgBG,eAAAA;AAAAA,IAAeM,kBAAAA;AAAAA,EAAAA;AAC1C;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index78.js","sources":["../src/utils/a11y/accessibleName.ts"],"sourcesContent":["/**\n * Accessible name/description utilities following WCAG precedence rules.\n * \n * **When to use:**\n * - `ariaLabelledBy`: visible label exists (preferred - keeps SR and visual text in sync)\n * - `ariaLabel`: no visible label (e.g., icon-only buttons)\n * - `ariaDescribedBy`: additional context needed (warnings, hints, constraints)\n * \n * **Precedence:** ariaLabelledBy > ariaLabel > visible text content\n * \n * @example Icon-only button\n * ```tsx\n * <Button iconProps={{ name: 'close' }} ariaLabel=\"Close dialog\" />\n * ```\n * \n * @example Disambiguate generic labels\n * ```tsx\n * <Button label=\"Edit\" ariaLabel=\"Edit name\" />\n * <Button label=\"Edit\" ariaLabel=\"Edit email\" />\n * ```\n */\n\nexport type AccessibleNameInput = {\n /** Accessible name when no visible label exists (icon-only buttons). */\n ariaLabel?: string;\n /** ID(s) of visible element(s) that label this control. Preferred over ariaLabel. */\n ariaLabelledBy?: string;\n /** ID(s) of element(s) providing additional description (additive). */\n ariaDescribedBy?: string;\n};\n\n/**\n * Returns ARIA attributes with correct precedence.\n * Prefer ariaLabelledBy > ariaLabel. ariaDescribedBy is always additive.\n */\nexport function getA11yNameAttributes({\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy\n}: AccessibleNameInput): Record<string, string> {\n const props: Record<string, string> = {};\n\n if (ariaLabelledBy) props['aria-labelledby'] = ariaLabelledBy;\n else if (ariaLabel) props['aria-label'] = ariaLabel;\n\n if (ariaDescribedBy) props['aria-describedby'] = ariaDescribedBy;\n\n return props;\n}\n"],"names":["getA11yNameAttributes","ariaLabel","ariaLabelledBy","ariaDescribedBy","props"],"mappings":"AAmCO,SAASA,EAAsB;AAAA,EACpCC,WAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,iBAAAA;AACmB,GAA2B;AAC9C,QAAMC,IAAgC,CAAA;AAElCF,SAAAA,IAAsBE,EAAA,iBAAiB,IAAIF,IACtCD,MAAiBG,EAAA,YAAY,IAAIH,IAEtCE,MAAuBC,EAAA,kBAAkB,IAAID,IAE1CC;AACT;"}
1
+ {"version":3,"file":"index78.js","sources":["../src/utils/a11y/accessibleName.ts"],"sourcesContent":["/**\n * Accessible name/description utilities following WCAG precedence rules.\n * \n * **When to use:**\n * - `ariaLabelledBy`: visible label exists (preferred - keeps SR and visual text in sync)\n * - `ariaLabel`: no visible label (e.g., icon-only buttons)\n * - `ariaDescribedBy`: additional context needed (warnings, hints, constraints)\n * \n * **Precedence:** ariaLabelledBy > ariaLabel > visible text content\n * \n * @example Icon-only button\n * ```tsx\n * <Button iconProps={{ name: 'close' }} ariaLabel=\"Close dialog\" />\n * ```\n * \n * @example Disambiguate generic labels\n * ```tsx\n * <Button label=\"Edit\" ariaLabel=\"Edit name\" />\n * <Button label=\"Edit\" ariaLabel=\"Edit email\" />\n * ```\n */\n\nexport type AccessibleNameInput = {\n /** Accessible name when no visible label exists (icon-only buttons). */\n ariaLabel?: string;\n /** ID(s) of visible element(s) that label this control. Preferred over ariaLabel. */\n ariaLabelledBy?: string;\n /** ID(s) of element(s) providing additional description (additive). */\n ariaDescribedBy?: string;\n};\n\n/**\n * Returns ARIA attributes with correct precedence.\n * Prefer ariaLabelledBy > ariaLabel. ariaDescribedBy is always additive.\n */\nexport function getA11yNameAttributes({\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy\n}: AccessibleNameInput): Record<string, string> {\n const props: Record<string, string> = {};\n\n if (ariaLabelledBy) props['aria-labelledby'] = ariaLabelledBy;\n else if (ariaLabel) props['aria-label'] = ariaLabel;\n\n if (ariaDescribedBy) props['aria-describedby'] = ariaDescribedBy;\n\n return props;\n}\n"],"names":["getA11yNameAttributes","ariaLabel","ariaLabelledBy","ariaDescribedBy","props"],"mappings":"AAmCO,SAASA,EAAsB;AAAA,EACpCC,WAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,iBAAAA;AACmB,GAA2B;AAC9C,QAAMC,IAAgC,CAAA;AAEtC,SAAIF,IAAgBE,EAAM,iBAAiB,IAAIF,IACtCD,MAAWG,EAAM,YAAY,IAAIH,IAEtCE,MAAiBC,EAAM,kBAAkB,IAAID,IAE1CC;AACT;"}
@@ -23,4 +23,4 @@ function p({
23
23
  export {
24
24
  p as useDismissOnEscape
25
25
  };
26
- //# sourceMappingURL=index208.js.map
26
+ //# sourceMappingURL=index79.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index79.js","sources":["../src/utils/a11y/useDismissOnEscape.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface UseDismissOnEscapeOptions<T extends HTMLElement = HTMLElement> {\n /**\n * Container element ref to check if focus is within.\n * Escape will only trigger if focus is within this container.\n */\n containerRef: RefObject<T | null>;\n /**\n * Callback when Escape key is pressed and focus is within container.\n */\n onDismiss?: () => void;\n /**\n * Whether the Escape handler is active.\n * Default: true\n */\n enabled?: boolean;\n /**\n * Whether to call preventDefault() when handling Escape.\n * Default: true\n */\n preventDefault?: boolean;\n /**\n * Whether to call stopPropagation() when handling Escape.\n * Default: true\n */\n stopPropagation?: boolean;\n}\n\n/**\n * Hook to handle Escape key dismissal when focus is within a container.\n *\n * This is a UX pattern: if user is interacting with an overlay/sidebar\n * (indicated by focus being within it), Escape should close it.\n *\n * @example\n * ```tsx\n * const MySidebar = ({ isOpen, onClose }) => {\n * const containerRef = useRef<HTMLDivElement>(null);\n *\n * useDismissOnEscape({\n * containerRef,\n * onDismiss: onClose,\n * enabled: isOpen\n * });\n *\n * return <div ref={containerRef}>...</div>;\n * };\n * ```\n */\nexport function useDismissOnEscape<T extends HTMLElement = HTMLElement>({\n containerRef,\n onDismiss,\n enabled = true,\n preventDefault = true,\n stopPropagation = true\n}: UseDismissOnEscapeOptions<T>): void {\n useEffect(() => {\n if (!enabled || !onDismiss) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && container.contains(document.activeElement)) {\n preventDefault && e.preventDefault();\n stopPropagation && e.stopPropagation();\n onDismiss();\n }\n };\n\n document.addEventListener('keydown', handleEscape, { capture: true });\n return () => document.removeEventListener('keydown', handleEscape, { capture: true });\n }, [enabled, onDismiss, containerRef, preventDefault, stopPropagation]);\n}\n"],"names":["useEffect","useDismissOnEscape","containerRef","onDismiss","enabled","preventDefault","stopPropagation","container","current","handleEscape","e","key","contains","document","activeElement","addEventListener","capture","removeEventListener"],"mappings":"AAmDO,SAAA,aAAAA,SAAA;AAAA,SAASC,EAAwD;AAAA,EACtEC,cAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,SAAAA,IAAU;AAAA,EACVC,gBAAAA,IAAiB;AAAA,EACjBC,iBAAAA,IAAkB;AACU,GAAS;AACrCN,EAAAA,EAAU,MAAM;AACd,QAAI,CAACI,KAAW,CAACD,EAAW;AAE5B,UAAMI,IAAYL,EAAaM;AAC/B,QAAI,CAACD,EAAW;AAEhB,UAAME,IAAeA,CAACC,MAAqB;AACzC,MAAIA,EAAEC,QAAQ,YAAYJ,EAAUK,SAASC,SAASC,aAAa,MACjET,KAAkBK,EAAEL,eAAAA,GACpBC,KAAmBI,EAAEJ,gBAAAA,GACrBH,EAAAA;AAAAA,IAEJ;AAEAU,oBAASE,iBAAiB,WAAWN,GAAc;AAAA,MAAEO,SAAS;AAAA,IAAA,CAAM,GAC7D,MAAMH,SAASI,oBAAoB,WAAWR,GAAc;AAAA,MAAEO,SAAS;AAAA,IAAA,CAAM;AAAA,EACtF,GAAG,CAACZ,GAASD,GAAWD,GAAcG,GAAgBC,CAAe,CAAC;AACxE;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index8.js","sources":["../src/components/SplitButton/index.tsx"],"sourcesContent":["import React, { FC, useState } from 'react';\nimport { MenuItemProps } from 'src/components/MenuItem';\nimport { MenuList } from 'src/components/MenuList';\n\nexport interface SplitButtonProps {\n /**\n * Button contents\n */\n label: string;\n /**\n * Optional click handler\n */\n onClick?: () => void;\n /**\n * Optional click handler for dropdown\n */\n onDropdownClick?: () => void;\n menuItems?: MenuItemProps[];\n /**\n * Automation ID for testing\n */\n automationId?: string;\n}\n\nexport const SplitButton: FC<SplitButtonProps> = (props) => {\n const { label, onDropdownClick = () => {}, menuItems = [], automationId = '', ...remainingProps } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n const handleDropdownClick = () => {\n setIsOpen(!isOpen);\n onDropdownClick();\n };\n\n return (\n <div className={'se-design-split-button flex items-center relative'} data-automation-id={automationId}>\n <button\n type=\"button\"\n className=\"px-8 py-2.5 rounded-l text-sm bg-[var(--color-blue-500)] text-[var(--color-white)] border-r border-[var(--color-white)]\"\n {...remainingProps}\n >\n {label}\n </button>\n <button type=\"button\" className=\"bg-[var(--color-blue-500)] rounded-r\" onClick={handleDropdownClick} data-automation-id=\"split-button-dropdown-button\">\n <svg\n className={`${isOpen ? 'rotate-180' : ''} transition-all`}\n width=\"35\"\n height=\"40\"\n viewBox=\"0 0 35 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M0 0H32C33.6569 0 35 1.34315 35 3V37C35 38.6569 33.6569 40 32 40H0V0Z\" fill=\"transparent\" />\n <path d=\"M18 23.5L14 19.5L22 19.5L18 23.5Z\" fill=\"white\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"absolute top-full mt-1 w-max\">\n <MenuList items={menuItems} />\n </div>\n )}\n </div>\n );\n};\n"],"names":["SplitButton","props","label","onDropdownClick","menuItems","automationId","remainingProps","isOpen","setIsOpen","useState","handleDropdownClick","React","createElement","className","_extends","type","onClick","width","height","viewBox","fill","xmlns","d","MenuList","items"],"mappings":";;;;;;;;;;;AAwBO,MAAMA,IAAqCC,CAAUA,MAAA;AACpD,QAAA;AAAA,IAAEC,OAAAA;AAAAA,IAAOC,iBAAAA,IAAkBA,MAAM;AAAA,IAAC;AAAA,IAAGC,WAAAA,IAAY,CAAE;AAAA,IAAEC,cAAAA,IAAe;AAAA,IAAI,GAAGC;AAAAA,EAAmBL,IAAAA,GAC9F,CAACM,GAAQC,CAAS,IAAIC,EAAS,EAAK,GAEpCC,IAAsBA,MAAM;AAChCF,IAAAA,EAAU,CAACD,CAAM,GACDJ;EAAA;AAIhBQ,SAAAA,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAW;AAAA,IAAqD,sBAAoBR;AAAAA,EACvFM,GAAAA,gBAAAA,EAAAC,cAAA,UAAAE,EAAA;AAAA,IACEC,MAAK;AAAA,IACLF,WAAU;AAAA,EAAA,GACNP,CAAc,GAEjBJ,CACK,GACRS,gBAAAA,EAAAC,cAAA,UAAA;AAAA,IAAQG,MAAK;AAAA,IAASF,WAAU;AAAA,IAAuCG,SAASN;AAAAA,IAAqB,sBAAmB;AAAA,EAAA,GACtHE,gBAAAA,EAAAA,cAAA,OAAA;AAAA,IACEC,WAAW,GAAGN,IAAS,eAAe,EAAE;AAAA,IACxCU,OAAM;AAAA,IACNC,QAAO;AAAA,IACPC,SAAQ;AAAA,IACRC,MAAK;AAAA,IACLC,OAAM;AAAA,EAAA,GAENT,gBAAAA,EAAAA,cAAA,QAAA;AAAA,IAAMU,GAAE;AAAA,IAAwEF,MAAK;AAAA,EAAA,CAAe,GACpGR,gBAAAA,EAAAA,cAAA,QAAA;AAAA,IAAMU,GAAE;AAAA,IAAoCF,MAAK;AAAA,EAAS,CAAA,CACvD,CACC,GACPb,KACCI,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAU;AAAA,EAAA,GACbD,gBAAAA,EAAAA,cAACW,GAAQ;AAAA,IAACC,OAAOpB;AAAAA,EAAY,CAAA,CAC1B,CAEJ;AAET;"}
1
+ {"version":3,"file":"index8.js","sources":["../src/components/SplitButton/index.tsx"],"sourcesContent":["import React, { FC, useState } from 'react';\nimport { MenuItemProps } from 'src/components/MenuItem';\nimport { MenuList } from 'src/components/MenuList';\n\nexport interface SplitButtonProps {\n /**\n * Button contents\n */\n label: string;\n /**\n * Optional click handler\n */\n onClick?: () => void;\n /**\n * Optional click handler for dropdown\n */\n onDropdownClick?: () => void;\n menuItems?: MenuItemProps[];\n /**\n * Automation ID for testing\n */\n automationId?: string;\n}\n\nexport const SplitButton: FC<SplitButtonProps> = (props) => {\n const { label, onDropdownClick = () => {}, menuItems = [], automationId = '', ...remainingProps } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n const handleDropdownClick = () => {\n setIsOpen(!isOpen);\n onDropdownClick();\n };\n\n return (\n <div className={'se-design-split-button flex items-center relative'} data-automation-id={automationId}>\n <button\n type=\"button\"\n className=\"px-8 py-2.5 rounded-l text-sm bg-[var(--color-blue-500)] text-[var(--color-white)] border-r border-[var(--color-white)]\"\n {...remainingProps}\n >\n {label}\n </button>\n <button type=\"button\" className=\"bg-[var(--color-blue-500)] rounded-r\" onClick={handleDropdownClick} data-automation-id=\"split-button-dropdown-button\">\n <svg\n className={`${isOpen ? 'rotate-180' : ''} transition-all`}\n width=\"35\"\n height=\"40\"\n viewBox=\"0 0 35 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M0 0H32C33.6569 0 35 1.34315 35 3V37C35 38.6569 33.6569 40 32 40H0V0Z\" fill=\"transparent\" />\n <path d=\"M18 23.5L14 19.5L22 19.5L18 23.5Z\" fill=\"white\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"absolute top-full mt-1 w-max\">\n <MenuList items={menuItems} />\n </div>\n )}\n </div>\n );\n};\n"],"names":["SplitButton","props","label","onDropdownClick","menuItems","automationId","remainingProps","isOpen","setIsOpen","useState","handleDropdownClick","React","createElement","className","_extends","type","onClick","width","height","viewBox","fill","xmlns","d","MenuList","items"],"mappings":";;;;;;;;;;;AAwBO,MAAMA,IAAqCC,CAAAA,MAAU;AAC1D,QAAM;AAAA,IAAEC,OAAAA;AAAAA,IAAOC,iBAAAA,IAAkBA,MAAM;AAAA,IAAC;AAAA,IAAGC,WAAAA,IAAY,CAAA;AAAA,IAAIC,cAAAA,IAAe;AAAA,IAAI,GAAGC;AAAAA,EAAAA,IAAmBL,GAC9F,CAACM,GAAQC,CAAS,IAAIC,EAAS,EAAK,GAEpCC,IAAsBA,MAAM;AAChCF,IAAAA,EAAU,CAACD,CAAM,GACjBJ,EAAAA;AAAAA,EACF;AAEA,SACEQ,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAW;AAAA,IAAqD,sBAAoBR;AAAAA,EAAAA,GACvFM,gBAAAA,EAAAC,cAAA,UAAAE,EAAA;AAAA,IACEC,MAAK;AAAA,IACLF,WAAU;AAAA,EAAA,GACNP,CAAc,GAEjBJ,CACK,GACRS,gBAAAA,EAAAC,cAAA,UAAA;AAAA,IAAQG,MAAK;AAAA,IAASF,WAAU;AAAA,IAAuCG,SAASN;AAAAA,IAAqB,sBAAmB;AAAA,EAAA,GACtHC,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEC,WAAW,GAAGN,IAAS,eAAe,EAAE;AAAA,IACxCU,OAAM;AAAA,IACNC,QAAO;AAAA,IACPC,SAAQ;AAAA,IACRC,MAAK;AAAA,IACLC,OAAM;AAAA,EAAA,GAENV,gBAAAA,EAAAC,cAAA,QAAA;AAAA,IAAMU,GAAE;AAAA,IAAwEF,MAAK;AAAA,EAAA,CAAe,GACpGT,gBAAAA,EAAAC,cAAA,QAAA;AAAA,IAAMU,GAAE;AAAA,IAAoCF,MAAK;AAAA,EAAA,CAAS,CACvD,CACC,GACPb,KACCI,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAU;AAAA,EAAA,GACbF,gBAAAA,EAAAC,cAACW,GAAQ;AAAA,IAACC,OAAOpB;AAAAA,EAAAA,CAAY,CAC1B,CAEJ;AAET;"}
package/dist/index80.js CHANGED
@@ -1,5 +1,22 @@
1
- const L = "data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M11.0179%2013.3597L12.27%2010.855L13.5222%2013.3597C13.9204%2014.1563%2014.5662%2014.8021%2015.3627%2015.2004L17.8682%2016.4531L15.3627%2017.7059C14.5662%2018.1041%2013.9204%2018.75%2013.5222%2019.5465L12.27%2022.0513L11.0179%2019.5465C10.6197%2018.75%209.97387%2018.1041%209.17738%2017.7059L6.67188%2016.4531L9.17738%2015.2004C9.97387%2014.8021%2010.6197%2014.1563%2011.0179%2013.3597Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%207.18859L19.4685%206.2832L19.9211%207.18859C20.3193%207.98511%2020.9651%208.63098%2021.7616%209.02923L22.6674%209.48215L21.7616%209.93506C20.9651%2010.3333%2020.3193%2010.9792%2019.9211%2011.7757L19.4685%2012.6811L19.0159%2011.7757C18.6177%2010.9792%2017.9719%2010.3333%2017.1754%209.93506L16.2695%209.48215L17.1754%209.02923C17.9719%208.63098%2018.6177%207.98511%2019.0159%207.18859Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%2021.3561L19.4685%2020.4507L19.9211%2021.3561C20.3193%2022.1526%2020.9651%2022.7985%2021.7616%2023.1967L22.6674%2023.6496L21.7616%2024.1025C20.9651%2024.5008%2020.3193%2025.1467%2019.9211%2025.9432L19.4685%2026.8486L19.0159%2025.9432C18.6177%2025.1467%2017.9719%2024.5008%2017.1754%2024.1025L16.2695%2023.6496L17.1754%2023.1967C17.9719%2022.7985%2018.6177%2022.1526%2019.0159%2021.3561Z'%20fill='%23415575'/%3e%3c/svg%3e";
1
+ import { useEffect as s } from "react";
2
+ const u = {
3
+ block: "nearest"
4
+ };
5
+ function m({
6
+ containerRef: t,
7
+ activeIndex: o,
8
+ itemSelector: r = '[role="option"]',
9
+ enabled: c = !0,
10
+ scrollOptions: e = u
11
+ }) {
12
+ s(() => {
13
+ if (!c || o < 0 || !t?.current)
14
+ return;
15
+ const n = t.current.querySelectorAll(r)[o];
16
+ n && n.scrollIntoView(e);
17
+ }, [o, t, r, c, e]);
18
+ }
2
19
  export {
3
- L as default
20
+ m as useScrollActiveIntoView
4
21
  };
5
22
  //# sourceMappingURL=index80.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index80.js","sources":["../src/assets/icons/ai-off.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M11.0179%2013.3597L12.27%2010.855L13.5222%2013.3597C13.9204%2014.1563%2014.5662%2014.8021%2015.3627%2015.2004L17.8682%2016.4531L15.3627%2017.7059C14.5662%2018.1041%2013.9204%2018.75%2013.5222%2019.5465L12.27%2022.0513L11.0179%2019.5465C10.6197%2018.75%209.97387%2018.1041%209.17738%2017.7059L6.67188%2016.4531L9.17738%2015.2004C9.97387%2014.8021%2010.6197%2014.1563%2011.0179%2013.3597Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%207.18859L19.4685%206.2832L19.9211%207.18859C20.3193%207.98511%2020.9651%208.63098%2021.7616%209.02923L22.6674%209.48215L21.7616%209.93506C20.9651%2010.3333%2020.3193%2010.9792%2019.9211%2011.7757L19.4685%2012.6811L19.0159%2011.7757C18.6177%2010.9792%2017.9719%2010.3333%2017.1754%209.93506L16.2695%209.48215L17.1754%209.02923C17.9719%208.63098%2018.6177%207.98511%2019.0159%207.18859Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%2021.3561L19.4685%2020.4507L19.9211%2021.3561C20.3193%2022.1526%2020.9651%2022.7985%2021.7616%2023.1967L22.6674%2023.6496L21.7616%2024.1025C20.9651%2024.5008%2020.3193%2025.1467%2019.9211%2025.9432L19.4685%2026.8486L19.0159%2025.9432C18.6177%2025.1467%2017.9719%2024.5008%2017.1754%2024.1025L16.2695%2023.6496L17.1754%2023.1967C17.9719%2022.7985%2018.6177%2022.1526%2019.0159%2021.3561Z'%20fill='%23415575'/%3e%3c/svg%3e\""],"names":["__vite_glob_0_0"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index80.js","sources":["../src/utils/a11y/useScrollActiveIntoView.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nconst DEFAULT_SCROLL_OPTIONS: ScrollIntoViewOptions = { block: 'nearest' };\n\nexport interface UseScrollActiveIntoViewOptions {\n /**\n * Ref to the container element\n */\n containerRef?: RefObject<HTMLElement | null>;\n \n /**\n * Index of the currently active/highlighted item (-1 if none)\n */\n activeIndex: number;\n \n /**\n * CSS selector for item elements\n * Default: '[role=\"option\"]'\n */\n itemSelector?: string;\n \n /**\n * Whether scrolling is enabled\n * Default: true\n */\n enabled?: boolean;\n \n /**\n * ScrollIntoView options\n * Default: { block: 'nearest' }\n */\n scrollOptions?: ScrollIntoViewOptions;\n}\n\n/**\n * Hook to automatically scroll the active item into view.\n * \n * Useful for aria-activedescendant patterns where DOM focus stays\n * on the container (e.g., input field) but we need to visually show\n * which descendant option is logically active.\n * \n * Common use cases:\n * - Combobox dropdown options\n * - Menu items with virtual focus\n * - Grid cells with keyboard navigation\n * - Tree view items\n * - Listbox options\n * \n * @example\n * ```tsx\n * const [highlightedIndex, setHighlightedIndex] = useState(-1);\n * const listboxRef = useRef<HTMLDivElement>(null);\n * \n * useScrollActiveIntoView({\n * containerRef: listboxRef,\n * activeIndex: highlightedIndex,\n * itemSelector: '[role=\"option\"]'\n * });\n * \n * // Now when highlightedIndex changes, the item scrolls into view\n * ```\n * \n * @example Custom scroll behavior\n * ```tsx\n * useScrollActiveIntoView({\n * containerRef: menuRef,\n * activeIndex: activeMenuIndex,\n * itemSelector: '[role=\"menuitem\"]',\n * scrollOptions: { block: 'center', behavior: 'smooth' }\n * });\n * ```\n */\nexport function useScrollActiveIntoView({\n containerRef,\n activeIndex,\n itemSelector = '[role=\"option\"]',\n enabled = true,\n scrollOptions = DEFAULT_SCROLL_OPTIONS\n}: UseScrollActiveIntoViewOptions): void {\n useEffect(() => {\n // Early returns for disabled states\n if (!enabled || activeIndex < 0 || !containerRef?.current) {\n return;\n }\n \n const container = containerRef.current;\n const items = container.querySelectorAll(itemSelector);\n const activeItem = items[activeIndex] as HTMLElement;\n \n if (activeItem) {\n activeItem.scrollIntoView(scrollOptions);\n }\n }, [activeIndex, containerRef, itemSelector, enabled, scrollOptions]);\n}\n"],"names":["useEffect","DEFAULT_SCROLL_OPTIONS","block","useScrollActiveIntoView","containerRef","activeIndex","itemSelector","enabled","scrollOptions","current","activeItem","querySelectorAll","scrollIntoView"],"mappings":"AAGA,SAAA,aAAAA,SAAA;AAAA,MAAMC,IAAgD;AAAA,EAAEC,OAAO;AAAU;AAsElE,SAASC,EAAwB;AAAA,EACtCC,cAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,cAAAA,IAAe;AAAA,EACfC,SAAAA,IAAU;AAAA,EACVC,eAAAA,IAAgBP;AACc,GAAS;AACvCD,EAAAA,EAAU,MAAM;AAEd,QAAI,CAACO,KAAWF,IAAc,KAAK,CAACD,GAAcK;AAChD;AAKF,UAAMC,IAFYN,EAAaK,QACPE,iBAAiBL,CAAY,EAC5BD,CAAW;AAEpC,IAAIK,KACFA,EAAWE,eAAeJ,CAAa;AAAA,EAE3C,GAAG,CAACH,GAAaD,GAAcE,GAAcC,GAASC,CAAa,CAAC;AACtE;"}
package/dist/index81.js CHANGED
@@ -1,5 +1,12 @@
1
- const C = "data:image/svg+xml,%3csvg%20width='67'%20height='67'%20viewBox='0%200%2067%2067'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M19.166%204.53418C25.8215%201.28372%2033.4025%200.455651%2040.6025%202.19336C45.6308%203.40697%2050.254%205.81881%2054.0977%209.18262L56.2627%2011.0771V5.22852C56.2628%204.50782%2056.8467%203.92384%2057.5674%203.92383C58.288%203.92383%2058.872%204.50784%2058.8721%205.22852V14.8369C58.872%2015.5575%2058.288%2016.1416%2057.5674%2016.1416H47.874C47.1533%2016.1416%2046.5684%2015.5576%2046.5684%2014.8369C46.5684%2014.1161%2047.1533%2013.5322%2047.874%2013.5322H55.0752L52.4951%2011.249C48.9439%208.10762%2044.6571%205.85686%2039.9902%204.73047C33.3806%203.13527%2026.4212%203.89496%2020.3115%206.87891C14.2018%209.86288%209.32423%2014.8845%206.51855%2021.0781C3.71296%2027.2719%203.15512%2034.2508%204.94141%2040.8115C5.1304%2041.5068%204.72038%2042.2236%204.02539%2042.4131C3.32995%2042.6024%202.6123%2042.1923%202.42285%2041.4971C0.47701%2034.3503%201.08442%2026.748%204.14062%2020.001C7.19678%2013.2541%2012.5107%207.78477%2019.166%204.53418Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M62.2422%2023.8568C62.9375%2023.6675%2063.6544%2024.0777%2063.8438%2024.7728C65.7896%2031.9196%2065.1823%2039.522%2062.126%2046.2689C59.0697%2053.0158%2053.756%2058.4853%2047.1006%2061.7357C40.445%2064.9863%2032.8642%2065.8144%2025.6641%2064.0765C20.6357%2062.8629%2016.0126%2060.4512%2012.1689%2057.0873L10.0049%2055.1927V60.892C10.0048%2061.6124%209.42064%2062.1965%208.7002%2062.1967C7.97953%2062.1967%207.39465%2061.6126%207.39453%2060.892V51.433C7.39459%2050.7123%207.97949%2050.1283%208.7002%2050.1283H18.2441C18.9647%2050.1284%2019.5488%2050.7124%2019.5488%2051.433C19.5488%2052.1537%2018.9648%2052.7376%2018.2441%2052.7377H11.1914L13.7715%2055.0209C17.3228%2058.1623%2021.6095%2060.413%2026.2764%2061.5394C32.886%2063.1347%2039.8453%2062.3748%2045.9551%2059.391C52.0648%2056.407%2056.9434%2051.3855%2059.749%2045.1918C62.5546%2038.998%2063.1125%2032.0191%2061.3262%2025.4584C61.1488%2024.8064%2061.4978%2024.1351%2062.1152%2023.8978L62.2422%2023.8568Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M32.5%2020.4045C32.6936%2019.8812%2033.4332%2019.881%2033.627%2020.4045C35.7001%2026.0073%2040.1179%2030.425%2045.7207%2032.4983C46.2441%2032.6919%2046.2441%2033.4316%2045.7207%2033.6252C40.1179%2035.6985%2035.7001%2040.1162%2033.627%2045.719C33.4332%2046.2424%2032.6937%2046.2424%2032.5%2045.719C30.4267%2040.1162%2026.0091%2035.6985%2020.4062%2033.6252C19.8829%2033.4316%2019.8829%2032.6919%2020.4062%2032.4983C26.0091%2030.425%2030.4267%2026.0073%2032.5%2020.4045Z'%20stroke='black'%20stroke-width='3.48'/%3e%3c/svg%3e";
1
+ function n(i) {
2
+ if (!i) return !1;
3
+ const t = window.getComputedStyle(i);
4
+ if (t.display === "none" || t.visibility === "hidden")
5
+ return !1;
6
+ const e = i.getBoundingClientRect();
7
+ return e.width > 0 && e.height > 0;
8
+ }
2
9
  export {
3
- C as default
10
+ n as isElementVisible
4
11
  };
5
12
  //# sourceMappingURL=index81.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index81.js","sources":["../src/assets/icons/ai-re-run.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='67'%20height='67'%20viewBox='0%200%2067%2067'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M19.166%204.53418C25.8215%201.28372%2033.4025%200.455651%2040.6025%202.19336C45.6308%203.40697%2050.254%205.81881%2054.0977%209.18262L56.2627%2011.0771V5.22852C56.2628%204.50782%2056.8467%203.92384%2057.5674%203.92383C58.288%203.92383%2058.872%204.50784%2058.8721%205.22852V14.8369C58.872%2015.5575%2058.288%2016.1416%2057.5674%2016.1416H47.874C47.1533%2016.1416%2046.5684%2015.5576%2046.5684%2014.8369C46.5684%2014.1161%2047.1533%2013.5322%2047.874%2013.5322H55.0752L52.4951%2011.249C48.9439%208.10762%2044.6571%205.85686%2039.9902%204.73047C33.3806%203.13527%2026.4212%203.89496%2020.3115%206.87891C14.2018%209.86288%209.32423%2014.8845%206.51855%2021.0781C3.71296%2027.2719%203.15512%2034.2508%204.94141%2040.8115C5.1304%2041.5068%204.72038%2042.2236%204.02539%2042.4131C3.32995%2042.6024%202.6123%2042.1923%202.42285%2041.4971C0.47701%2034.3503%201.08442%2026.748%204.14062%2020.001C7.19678%2013.2541%2012.5107%207.78477%2019.166%204.53418Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M62.2422%2023.8568C62.9375%2023.6675%2063.6544%2024.0777%2063.8438%2024.7728C65.7896%2031.9196%2065.1823%2039.522%2062.126%2046.2689C59.0697%2053.0158%2053.756%2058.4853%2047.1006%2061.7357C40.445%2064.9863%2032.8642%2065.8144%2025.6641%2064.0765C20.6357%2062.8629%2016.0126%2060.4512%2012.1689%2057.0873L10.0049%2055.1927V60.892C10.0048%2061.6124%209.42064%2062.1965%208.7002%2062.1967C7.97953%2062.1967%207.39465%2061.6126%207.39453%2060.892V51.433C7.39459%2050.7123%207.97949%2050.1283%208.7002%2050.1283H18.2441C18.9647%2050.1284%2019.5488%2050.7124%2019.5488%2051.433C19.5488%2052.1537%2018.9648%2052.7376%2018.2441%2052.7377H11.1914L13.7715%2055.0209C17.3228%2058.1623%2021.6095%2060.413%2026.2764%2061.5394C32.886%2063.1347%2039.8453%2062.3748%2045.9551%2059.391C52.0648%2056.407%2056.9434%2051.3855%2059.749%2045.1918C62.5546%2038.998%2063.1125%2032.0191%2061.3262%2025.4584C61.1488%2024.8064%2061.4978%2024.1351%2062.1152%2023.8978L62.2422%2023.8568Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M32.5%2020.4045C32.6936%2019.8812%2033.4332%2019.881%2033.627%2020.4045C35.7001%2026.0073%2040.1179%2030.425%2045.7207%2032.4983C46.2441%2032.6919%2046.2441%2033.4316%2045.7207%2033.6252C40.1179%2035.6985%2035.7001%2040.1162%2033.627%2045.719C33.4332%2046.2424%2032.6937%2046.2424%2032.5%2045.719C30.4267%2040.1162%2026.0091%2035.6985%2020.4062%2033.6252C19.8829%2033.4316%2019.8829%2032.6919%2020.4062%2032.4983C26.0091%2030.425%2030.4267%2026.0073%2032.5%2020.4045Z'%20stroke='black'%20stroke-width='3.48'/%3e%3c/svg%3e\""],"names":["__vite_glob_0_1"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index81.js","sources":["../src/utils/a11y/elementVisibility.ts"],"sourcesContent":["/**\n * Checks if an element is visible in the DOM.\n * \n * An element is considered visible if:\n * - It exists in the DOM\n * - It's not hidden via CSS (display: none, visibility: hidden)\n * - It has actual dimensions (width > 0 and height > 0)\n * \n * @param element - The element to check, or null\n * @returns true if the element is visible, false otherwise\n * \n * @example\n * const element = document.getElementById('my-element');\n * if (isElementVisible(element)) {\n * // Element is visible\n * }\n */\nexport function isElementVisible(element: HTMLElement | null): boolean {\n if (!element) return false;\n\n // Check computed style for display/visibility\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n // Check if element has dimensions\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n"],"names":["isElementVisible","element","style","window","getComputedStyle","display","visibility","rect","getBoundingClientRect","width","height"],"mappings":"AAiBO,SAASA,EAAiBC,GAAsC;AACrE,MAAI,CAACA,EAAS,QAAO;AAGrB,QAAMC,IAAQC,OAAOC,iBAAiBH,CAAO;AAC7C,MAAIC,EAAMG,YAAY,UAAUH,EAAMI,eAAe;AACnD,WAAO;AAIT,QAAMC,IAAON,EAAQO,sBAAAA;AACrB,SAAOD,EAAKE,QAAQ,KAAKF,EAAKG,SAAS;AACzC;"}
package/dist/index82.js CHANGED
@@ -1,5 +1,45 @@
1
- const e = "data:image/svg+xml,%3csvg%20width='21'%20height='20'%20viewBox='0%200%2021%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20opacity='0.8'%3e%3cg%20clip-path='url(%23clip0_11623_94780)'%3e%3cpath%20d='M8.93929%2014.7575C12.1504%2014.7575%2014.7536%2012.1543%2014.7536%208.94319C14.7536%205.73205%2012.1504%203.12891%208.93929%203.12891C5.72814%203.12891%203.125%205.73205%203.125%208.94319C3.125%2012.1543%205.72814%2014.7575%208.93929%2014.7575Z'%20stroke='%23D8E8F6'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M16.8642%2016.872L13.0469%2013.0547'%20stroke='%23D8E8F6'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.4688%201.47559C13.0214%202.58108%2013.918%203.47752%2015.0234%204.03027L15.9619%204.5L15.0234%204.96973C13.918%205.52248%2013.0214%206.41892%2012.4688%207.52441L12%208.46191L11.5313%207.52441C10.9786%206.41892%2010.082%205.52248%208.97656%204.96973L8.03711%204.5L8.97656%204.03027C10.082%203.47752%2010.9786%202.58108%2011.5313%201.47559L12%200.538086L12.4688%201.47559Z'%20fill='white'%20stroke='%233E8BD1'%20stroke-width='1.375'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_11623_94780'%3e%3crect%20width='16'%20height='18'%20fill='white'%20transform='translate(2)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e";
1
+ import { useRef as d } from "react";
2
+ import { useFocusTrap as u } from "./index72.js";
3
+ import { useDismissOnEscape as c } from "./index79.js";
4
+ import { getA11yNameAttributes as f } from "./index78.js";
5
+ import { useStableId as p } from "./index83.js";
6
+ function x({
7
+ isOpen: e,
8
+ onDismiss: s,
9
+ ariaLabel: o,
10
+ ariaLabelledBy: a,
11
+ titleIdPrefix: i = "modal-title",
12
+ initialFocus: m = "first",
13
+ portalContainerRefs: n
14
+ }) {
15
+ const t = d(null), r = p(void 0, i);
16
+ u({
17
+ enabled: e,
18
+ containerRef: t,
19
+ restoreFocus: !0,
20
+ initialFocus: m,
21
+ portalContainerRefs: n
22
+ }), c({
23
+ containerRef: t,
24
+ onDismiss: s,
25
+ enabled: e
26
+ });
27
+ const l = {
28
+ role: "dialog",
29
+ "aria-modal": !0,
30
+ tabIndex: -1,
31
+ ...f({
32
+ ariaLabelledBy: a ?? (o ? void 0 : r),
33
+ ariaLabel: o
34
+ })
35
+ };
36
+ return {
37
+ containerRef: t,
38
+ titleId: r,
39
+ dialogProps: l
40
+ };
41
+ }
2
42
  export {
3
- e as default
43
+ x as useModalA11y
4
44
  };
5
45
  //# sourceMappingURL=index82.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index82.js","sources":["../src/assets/icons/ai-search.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='21'%20height='20'%20viewBox='0%200%2021%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20opacity='0.8'%3e%3cg%20clip-path='url(%23clip0_11623_94780)'%3e%3cpath%20d='M8.93929%2014.7575C12.1504%2014.7575%2014.7536%2012.1543%2014.7536%208.94319C14.7536%205.73205%2012.1504%203.12891%208.93929%203.12891C5.72814%203.12891%203.125%205.73205%203.125%208.94319C3.125%2012.1543%205.72814%2014.7575%208.93929%2014.7575Z'%20stroke='%23D8E8F6'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M16.8642%2016.872L13.0469%2013.0547'%20stroke='%23D8E8F6'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.4688%201.47559C13.0214%202.58108%2013.918%203.47752%2015.0234%204.03027L15.9619%204.5L15.0234%204.96973C13.918%205.52248%2013.0214%206.41892%2012.4688%207.52441L12%208.46191L11.5313%207.52441C10.9786%206.41892%2010.082%205.52248%208.97656%204.96973L8.03711%204.5L8.97656%204.03027C10.082%203.47752%2010.9786%202.58108%2011.5313%201.47559L12%200.538086L12.4688%201.47559Z'%20fill='white'%20stroke='%233E8BD1'%20stroke-width='1.375'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_11623_94780'%3e%3crect%20width='16'%20height='18'%20fill='white'%20transform='translate(2)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\""],"names":["__vite_glob_0_2"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index82.js","sources":["../src/utils/a11y/useModalA11y.ts"],"sourcesContent":["import { useRef } from 'react';\nimport type { MutableRefObject, RefObject } from 'react';\nimport { useFocusTrap } from './useFocusTrap';\nimport { useDismissOnEscape } from './useDismissOnEscape';\nimport { getA11yNameAttributes } from './accessibleName';\nimport { useStableId } from 'src/utils/useStableId';\n\nexport interface UseModalA11yOptions {\n /**\n * Whether the modal is open. Controls focus trap and Escape handler activation.\n */\n isOpen: boolean;\n /**\n * Called when Escape is pressed while focus is within the modal.\n * If undefined, Escape dismissal is disabled.\n */\n onDismiss?: () => void;\n /**\n * aria-label for modals without a visible title heading.\n * Only used when `ariaLabelledBy` is not provided.\n */\n ariaLabel?: string;\n /**\n * ID of an existing visible element (e.g. an h2 inside the modal content) that labels\n * the dialog. Preferred over ariaLabel when a visible heading already exists in the content.\n * Only used when `title` is not provided.\n */\n ariaLabelledBy?: string;\n /**\n * Prefix for the auto-generated title element id. Default: 'modal-title'.\n */\n titleIdPrefix?: string;\n /**\n * Initial focus target when the modal opens. Forwarded to useFocusTrap.\n * - 'first': Focus first focusable element (default)\n * - 'container': Focus the dialog container itself\n * - 'none': Skip — browser handles it (e.g. autofocus attribute on inner element)\n * - CSS selector string: Focus matching element\n * - HTMLElement: Focus specific element\n */\n initialFocus?: 'first' | 'container' | 'none' | string | HTMLElement;\n /**\n * Additional container refs for portal content that is logically part of this modal.\n * Passed through to useFocusTrap and useDismissOnEscape so their safety nets\n * allow focus to move into portal-rendered content (e.g., Dropdown with isWithPortal).\n */\n portalContainerRefs?: MutableRefObject<RefObject<HTMLElement | null>[]>;\n}\n\nexport interface UseModalA11yReturn {\n /**\n * Ref to attach to the dialog container element.\n */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /**\n * Stable ID to set on the visible title element: `<h2 id={titleId}>`.\n * Only relevant when `title` is provided.\n */\n titleId: string;\n /**\n * Spread onto the dialog container element.\n * Includes: role=\"dialog\", aria-modal, tabIndex, aria-labelledby or aria-label.\n */\n dialogProps: {\n role: 'dialog';\n 'aria-modal': true;\n tabIndex: number;\n [key: string]: unknown;\n };\n}\n\n/**\n * Bundles all WCAG dialog semantics into a single hook.\n *\n * Handles:\n * - Stable ID for title element (aria-labelledby association)\n * - Focus trap: moves focus into modal on open, wraps Tab, restores focus on close\n * - Escape dismissal: calls onDismiss when Escape is pressed within the modal\n * - dialogProps: role=\"dialog\", aria-modal, tabIndex, aria-labelledby / aria-label\n *\n * @example Modal with a visible title (most common)\n * ```tsx\n * const MyModal = ({ isOpen, onClose }) => {\n * const { containerRef, titleId, dialogProps } = useModalA11y({\n * isOpen,\n * onDismiss: onClose,\n * });\n *\n * return (\n * <div ref={containerRef} {...dialogProps} className=\"modal-content\">\n * <h2 id={titleId}>My Title</h2>\n * ...\n * </div>\n * );\n * };\n * ```\n *\n * @example Modal without a visible title\n * ```tsx\n * const { containerRef, dialogProps } = useModalA11y({\n * isOpen,\n * onDismiss: onClose,\n * ariaLabel: 'Upload document',\n * });\n * ```\n *\n * @example Custom initial focus (specific button) or skip (autofocus)\n * ```tsx\n * useModalA11y({ isOpen, onDismiss, initialFocus: '.my-cta-btn' });\n * useModalA11y({ isOpen, onDismiss, initialFocus: 'none' }); // autofocus on inner element\n * ```\n */\nexport function useModalA11y({\n isOpen,\n onDismiss,\n ariaLabel,\n ariaLabelledBy,\n titleIdPrefix = 'modal-title',\n initialFocus = 'first',\n portalContainerRefs,\n}: UseModalA11yOptions): UseModalA11yReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const titleId = useStableId(undefined, titleIdPrefix);\n\n useFocusTrap({\n enabled: isOpen,\n containerRef,\n restoreFocus: true,\n initialFocus,\n portalContainerRefs,\n });\n\n useDismissOnEscape({\n containerRef,\n onDismiss,\n enabled: isOpen,\n });\n\n const nameAttrs = getA11yNameAttributes({\n ariaLabelledBy: ariaLabelledBy ?? (ariaLabel ? undefined : titleId),\n ariaLabel: ariaLabel,\n });\n\n const dialogProps = {\n role: 'dialog' as const,\n 'aria-modal': true as const,\n tabIndex: -1,\n ...nameAttrs,\n };\n\n return { containerRef, titleId, dialogProps };\n}\n"],"names":["useRef","useFocusTrap","useDismissOnEscape","getA11yNameAttributes","useStableId","useModalA11y","isOpen","onDismiss","ariaLabel","ariaLabelledBy","titleIdPrefix","initialFocus","portalContainerRefs","containerRef","titleId","undefined","enabled","restoreFocus","dialogProps","role","tabIndex","nameAttrs"],"mappings":"AAgHO,SAAA,UAAAA,SAAA;AAAA,SAAA,gBAAAC,SAAA;AAAA,SAAA,sBAAAC,SAAA;AAAA,SAAA,yBAAAC,SAAA;AAAA,SAAA,eAAAC,SAAA;AAAA,SAASC,EAAa;AAAA,EAC3BC,QAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,eAAAA,IAAgB;AAAA,EAChBC,cAAAA,IAAe;AAAA,EACfC,qBAAAA;AACmB,GAAuB;AAC1C,QAAMC,IAAeb,EAAuB,IAAI,GAC1Cc,IAAUV,EAAYW,QAAWL,CAAa;AAEpDT,EAAAA,EAAa;AAAA,IACXe,SAASV;AAAAA,IACTO,cAAAA;AAAAA,IACAI,cAAc;AAAA,IACdN,cAAAA;AAAAA,IACAC,qBAAAA;AAAAA,EAAAA,CACD,GAEDV,EAAmB;AAAA,IACjBW,cAAAA;AAAAA,IACAN,WAAAA;AAAAA,IACAS,SAASV;AAAAA,EAAAA,CACV;AAOD,QAAMY,IAAc;AAAA,IAClBC,MAAM;AAAA,IACN,cAAc;AAAA,IACdC,UAAU;AAAA,IACV,GATgBjB,EAAsB;AAAA,MACtCM,gBAAgBA,MAAmBD,IAAYO,SAAYD;AAAAA,MAC3DN,WAAAA;AAAAA,IAAAA,CACD;AAAA,EAMIa;AAGL,SAAO;AAAA,IAAER,cAAAA;AAAAA,IAAcC,SAAAA;AAAAA,IAASI,aAAAA;AAAAA,EAAAA;AAClC;"}
package/dist/index83.js CHANGED
@@ -1,5 +1,9 @@
1
- const L = "data:image/svg+xml,%3csvg%20width='16'%20height='17'%20viewBox='0%200%2016%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.4958%207.65801L9.58298%205.83203L8.67016%207.65801C8.37987%208.23869%207.90907%208.70953%207.32841%208.99985L5.50189%209.91312L7.32841%2010.8264C7.90907%2011.1167%208.37987%2011.5876%208.67016%2012.1682L9.58298%2013.9942L10.4958%2012.1682C10.7861%2011.5876%2011.2569%2011.1167%2011.8375%2010.8264L13.6641%209.91312L11.8375%208.99986C11.2569%208.70953%2010.7861%208.23869%2010.4958%207.65801Z'%20fill='%23415575'%20stroke='%23415575'/%3e%3cpath%20d='M4.66587%203.16003L4.33592%202.5L4.00597%203.16003C3.71568%203.7407%203.24488%204.21155%202.66423%204.50187L2.00387%204.83205L2.66422%205.16223C3.24487%205.45255%203.71568%205.9234%204.00597%206.50407L4.33592%207.1641L4.66587%206.50407C4.95615%205.9234%205.42696%205.45255%206.00761%205.16223L6.66797%204.83205L6.00761%204.50187C5.42696%204.21155%204.95615%203.7407%204.66587%203.16003Z'%20fill='%23415575'%20stroke='%23415575'/%3e%3c/svg%3e";
1
+ import { useRef as n } from "react";
2
+ function u(e, t = "se-id") {
3
+ const r = n("");
4
+ return r.current || (r.current = `${t}-${crypto.randomUUID()}`), e || r.current;
5
+ }
2
6
  export {
3
- L as default
7
+ u as useStableId
4
8
  };
5
9
  //# sourceMappingURL=index83.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index83.js","sources":["../src/assets/icons/ai-stars.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='16'%20height='17'%20viewBox='0%200%2016%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.4958%207.65801L9.58298%205.83203L8.67016%207.65801C8.37987%208.23869%207.90907%208.70953%207.32841%208.99985L5.50189%209.91312L7.32841%2010.8264C7.90907%2011.1167%208.37987%2011.5876%208.67016%2012.1682L9.58298%2013.9942L10.4958%2012.1682C10.7861%2011.5876%2011.2569%2011.1167%2011.8375%2010.8264L13.6641%209.91312L11.8375%208.99986C11.2569%208.70953%2010.7861%208.23869%2010.4958%207.65801Z'%20fill='%23415575'%20stroke='%23415575'/%3e%3cpath%20d='M4.66587%203.16003L4.33592%202.5L4.00597%203.16003C3.71568%203.7407%203.24488%204.21155%202.66423%204.50187L2.00387%204.83205L2.66422%205.16223C3.24487%205.45255%203.71568%205.9234%204.00597%206.50407L4.33592%207.1641L4.66587%206.50407C4.95615%205.9234%205.42696%205.45255%206.00761%205.16223L6.66797%204.83205L6.00761%204.50187C5.42696%204.21155%204.95615%203.7407%204.66587%203.16003Z'%20fill='%23415575'%20stroke='%23415575'/%3e%3c/svg%3e\""],"names":["__vite_glob_0_3"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index83.js","sources":["../src/utils/useStableId.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * Generates a stable unique ID for component instances (React 16 compatible).\n * Returns the provided id if given, otherwise generates a stable per-mount id.\n * \n * @param id - Optional explicit id\n * @param prefix - Prefix for auto-generated ids (default: 'se-id')\n * @returns Stable id string\n */\nexport function useStableId(id?: string, prefix: string = 'se-id'): string {\n const autoIdRef = useRef<string>('');\n \n if (!autoIdRef.current) {\n autoIdRef.current = `${prefix}-${crypto.randomUUID()}`;\n }\n \n return id || autoIdRef.current;\n}\n\n\n\n\n\n\n\n"],"names":["useRef","useStableId","id","prefix","autoIdRef","current","crypto","randomUUID"],"mappings":"AAUO,SAAA,UAAAA,SAAA;AAAA,SAASC,EAAYC,GAAaC,IAAiB,SAAiB;AACzE,QAAMC,IAAYJ,EAAe,EAAE;AAEnC,SAAKI,EAAUC,YACbD,EAAUC,UAAU,GAAGF,CAAM,IAAIG,OAAOC,YAAY,KAG/CL,KAAME,EAAUC;AACzB;"}
package/dist/index84.js CHANGED
@@ -1,5 +1,71 @@
1
- const e = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%3e%3crect%20width='24'%20height='24'%20rx='12'%20fill='url(%23paint0_linear_11822_95435)'/%3e%3cpath%20d='M8.2639%2010.0192L9.20301%208.14062L10.1421%2010.0192C10.4408%2010.6166%2010.9251%2011.101%2011.5225%2011.3997L13.4016%2012.3392L11.5225%2013.2788C10.9251%2013.5775%2010.4408%2014.0619%2010.1421%2014.6593L9.20301%2016.5379L8.2639%2014.6593C7.96526%2014.0619%207.48089%2013.5775%206.88352%2013.2788L5.00439%2012.3392L6.88352%2011.3997C7.48089%2011.101%207.96526%2010.6166%208.2639%2010.0192Z'%20fill='%239335F0'/%3e%3cpath%20d='M14.2629%205.39193L14.6023%204.71289L14.9418%205.39193C15.2404%205.98932%2015.7248%206.47373%2016.3222%206.77241L17.0015%207.1121L16.3222%207.45178C15.7248%207.75047%2015.2404%208.23487%2014.9418%208.83227L14.6023%209.51131L14.2629%208.83227C13.9642%208.23487%2013.4799%207.75047%2012.8825%207.45178L12.2031%207.1121L12.8825%206.77241C13.4799%206.47373%2013.9642%205.98932%2014.2629%205.39193Z'%20fill='%239335F0'/%3e%3cpath%20d='M14.2629%2016.0169L14.6023%2015.3379L14.9418%2016.0169C15.2404%2016.6143%2015.7248%2017.0987%2016.3222%2017.3974L17.0015%2017.7371L16.3222%2018.0768C15.7248%2018.3755%2015.2404%2018.8599%2014.9418%2019.4573L14.6023%2020.1363L14.2629%2019.4573C13.9642%2018.8599%2013.4799%2018.3755%2012.8825%2018.0768L12.2031%2017.7371L12.8825%2017.3974C13.4799%2017.0987%2013.9642%2016.6143%2014.2629%2016.0169Z'%20fill='%239335F0'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_11822_95435'%20x1='12'%20y1='3.06538e-07'%20x2='22.2857'%20y2='24'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F2E1FF'/%3e%3cstop%20offset='1'%20stop-color='%23E3BDFE'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e";
1
+ import { useRef as a, useLayoutEffect as m, useEffect as g } from "react";
2
+ import { getFirstFocusableElement as f, getLastFocusableElement as F } from "./index71.js";
3
+ import { consumeFocusAnchor as I, consumeLastInteractedElement as E } from "./index72.js";
4
+ const l = {
5
+ position: "absolute",
6
+ opacity: 0,
7
+ pointerEvents: "none",
8
+ width: 0,
9
+ height: 0
10
+ };
11
+ function T({
12
+ isOpen: o,
13
+ isModal: i,
14
+ containerRef: e,
15
+ returnFocusRef: d
16
+ }) {
17
+ const c = a(null), r = a(null), u = a(null);
18
+ return m(() => {
19
+ if (i || !o) return;
20
+ const t = d?.current ?? I() ?? E() ?? document.activeElement;
21
+ if (!(!t || t === document.body) && t.tagName !== "IFRAME")
22
+ return c.current = t, u.current && (u.current.tabIndex = 0), () => {
23
+ u.current && (u.current.tabIndex = -1);
24
+ };
25
+ }, [o, i]), g(() => {
26
+ if (i || !o || !c.current) return;
27
+ const t = requestAnimationFrame(() => {
28
+ (f({
29
+ container: e.current
30
+ }) ?? e.current)?.focus(), r.current && (r.current.tabIndex = 0);
31
+ });
32
+ return () => {
33
+ cancelAnimationFrame(t), r.current && (r.current.tabIndex = -1);
34
+ const s = c.current;
35
+ c.current = null, s?.isConnected && requestAnimationFrame(() => s.focus());
36
+ };
37
+ }, [o, i]), {
38
+ startSentinelProps: {
39
+ ref: r,
40
+ tabIndex: -1,
41
+ style: l,
42
+ onFocus: (t) => {
43
+ if (e.current?.contains(t.relatedTarget) && t.relatedTarget !== e.current) {
44
+ const n = c.current;
45
+ n?.isConnected && n.focus();
46
+ } else
47
+ r.current && (r.current.tabIndex = -1), (f({
48
+ container: e.current
49
+ }) ?? e.current)?.focus();
50
+ }
51
+ },
52
+ endSentinelProps: {
53
+ ref: u,
54
+ tabIndex: -1,
55
+ style: l,
56
+ onFocus: (t) => {
57
+ if (e.current?.contains(t.relatedTarget) && t.relatedTarget !== e.current) {
58
+ const n = c.current;
59
+ n?.isConnected && n.focus();
60
+ } else
61
+ (F({
62
+ container: e.current
63
+ }) ?? e.current)?.focus();
64
+ }
65
+ }
66
+ };
67
+ }
2
68
  export {
3
- e as default
69
+ T as useFocusSentinel
4
70
  };
5
71
  //# sourceMappingURL=index84.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index84.js","sources":["../src/assets/icons/ai.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%3e%3crect%20width='24'%20height='24'%20rx='12'%20fill='url(%23paint0_linear_11822_95435)'/%3e%3cpath%20d='M8.2639%2010.0192L9.20301%208.14062L10.1421%2010.0192C10.4408%2010.6166%2010.9251%2011.101%2011.5225%2011.3997L13.4016%2012.3392L11.5225%2013.2788C10.9251%2013.5775%2010.4408%2014.0619%2010.1421%2014.6593L9.20301%2016.5379L8.2639%2014.6593C7.96526%2014.0619%207.48089%2013.5775%206.88352%2013.2788L5.00439%2012.3392L6.88352%2011.3997C7.48089%2011.101%207.96526%2010.6166%208.2639%2010.0192Z'%20fill='%239335F0'/%3e%3cpath%20d='M14.2629%205.39193L14.6023%204.71289L14.9418%205.39193C15.2404%205.98932%2015.7248%206.47373%2016.3222%206.77241L17.0015%207.1121L16.3222%207.45178C15.7248%207.75047%2015.2404%208.23487%2014.9418%208.83227L14.6023%209.51131L14.2629%208.83227C13.9642%208.23487%2013.4799%207.75047%2012.8825%207.45178L12.2031%207.1121L12.8825%206.77241C13.4799%206.47373%2013.9642%205.98932%2014.2629%205.39193Z'%20fill='%239335F0'/%3e%3cpath%20d='M14.2629%2016.0169L14.6023%2015.3379L14.9418%2016.0169C15.2404%2016.6143%2015.7248%2017.0987%2016.3222%2017.3974L17.0015%2017.7371L16.3222%2018.0768C15.7248%2018.3755%2015.2404%2018.8599%2014.9418%2019.4573L14.6023%2020.1363L14.2629%2019.4573C13.9642%2018.8599%2013.4799%2018.3755%2012.8825%2018.0768L12.2031%2017.7371L12.8825%2017.3974C13.4799%2017.0987%2013.9642%2016.6143%2014.2629%2016.0169Z'%20fill='%239335F0'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_11822_95435'%20x1='12'%20y1='3.06538e-07'%20x2='22.2857'%20y2='24'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F2E1FF'/%3e%3cstop%20offset='1'%20stop-color='%23E3BDFE'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\""],"names":["__vite_glob_0_4"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index84.js","sources":["../src/utils/a11y/useFocusSentinel.ts"],"sourcesContent":["import { useRef, useEffect, useLayoutEffect } from 'react';\n\nimport { getFirstFocusableElement, getLastFocusableElement } from './focusableElements';\nimport { consumeLastInteractedElement, consumeFocusAnchor } from './useFocusTrap';\n\nconst SENTINEL_STYLE: React.CSSProperties = {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n width: 0,\n height: 0,\n};\n\nexport interface UseFocusSentinelOptions {\n /** Whether the panel is currently open. */\n isOpen: boolean | undefined;\n /**\n * When true the hook is a no-op — dialog mode (focus trap) handles focus management instead.\n */\n isModal: boolean;\n /** Ref to the panel container element. */\n containerRef: React.RefObject<HTMLElement | null>;\n /**\n * Explicit element to restore focus to on close.\n * Overrides the automatic trigger capture.\n */\n returnFocusRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport interface SentinelProps {\n ref: React.RefObject<HTMLDivElement | null>;\n tabIndex: number;\n style: React.CSSProperties;\n onFocus: (e: React.FocusEvent) => void;\n}\n\nexport interface UseFocusSentinelReturn {\n /** Spread onto an invisible div placed before the panel content. */\n startSentinelProps: SentinelProps;\n /** Spread onto an invisible div placed after the panel content. */\n endSentinelProps: SentinelProps;\n}\n\n/**\n * Focus management for complementary (non-modal) side panels.\n *\n * Moves focus into the panel on open, restores it to the trigger on close,\n * and wraps Tab / Shift+Tab back to the trigger when focus reaches either end.\n *\n * Sentinel tabIndex values are mutated imperatively (no state) to avoid\n * re-renders. React does not touch a DOM attribute unless the JSX prop value\n * changes, so the initial tabIndex={-1} in the returned props is safe.\n */\nexport function useFocusSentinel({\n isOpen,\n isModal,\n containerRef,\n returnFocusRef,\n}: UseFocusSentinelOptions): UseFocusSentinelReturn {\n const triggerRef = useRef<HTMLElement | null>(null);\n const startSentinelRef = useRef<HTMLDivElement>(null);\n const endSentinelRef = useRef<HTMLDivElement>(null);\n\n // Capture trigger before React commits (document.activeElement is still the opener).\n // Body focus = page-load open → skip so sentinels stay inert.\n useLayoutEffect(() => {\n if (isModal || !isOpen) return;\n const trigger =\n returnFocusRef?.current ??\n consumeFocusAnchor() ??\n consumeLastInteractedElement() ??\n (document.activeElement as HTMLElement);\n if (!trigger || trigger === document.body) return;\n // iframes manage their own internal focus. The parent doc only sees the\n // <iframe> element. Calling .focus() on any parent-doc element while the\n // user is inside an iframe forcibly blurs the iframe content (kills caret\n // on textareas, cancels native <select> dropdowns). Skip capture so the\n // auto-focus on open and focus-restore on close don't run.\n if (trigger.tagName === 'IFRAME') return;\n triggerRef.current = trigger;\n if (endSentinelRef.current) endSentinelRef.current.tabIndex = 0;\n return () => {\n if (endSentinelRef.current) endSentinelRef.current.tabIndex = -1;\n };\n }, [isOpen, isModal]);\n\n // Move focus into panel on open; restore to trigger on close.\n useEffect(() => {\n if (isModal || !isOpen || !triggerRef.current) return;\n\n const rafId = requestAnimationFrame(() => {\n const first = getFirstFocusableElement({ container: containerRef.current });\n (first ?? containerRef.current)?.focus();\n // Activate start sentinel so Shift+Tab from first content returns to trigger.\n if (startSentinelRef.current) startSentinelRef.current.tabIndex = 0;\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n if (startSentinelRef.current) startSentinelRef.current.tabIndex = -1;\n const trigger = triggerRef.current;\n triggerRef.current = null;\n if (trigger?.isConnected) {\n requestAnimationFrame(() => trigger.focus());\n }\n };\n }, [isOpen, isModal]);\n\n const handleStartFocus = (e: React.FocusEvent) => {\n const fromInside =\n containerRef.current?.contains(e.relatedTarget as Node) &&\n e.relatedTarget !== containerRef.current;\n if (fromInside) {\n // Shift+Tab from first content → restore trigger\n const trigger = triggerRef.current;\n if (trigger?.isConnected) trigger.focus();\n } else {\n // Natural Tab entry from outside → forward to first content,\n // deactivate so next Shift+Tab exits naturally.\n if (startSentinelRef.current) startSentinelRef.current.tabIndex = -1;\n const first = getFirstFocusableElement({ container: containerRef.current });\n (first ?? containerRef.current)?.focus();\n }\n };\n\n const handleEndFocus = (e: React.FocusEvent) => {\n const fromInside =\n containerRef.current?.contains(e.relatedTarget as Node) &&\n e.relatedTarget !== containerRef.current;\n if (fromInside) {\n // Tab from last content → restore trigger\n const trigger = triggerRef.current;\n if (trigger?.isConnected) trigger.focus();\n } else {\n // Shift+Tab entry from outside → back to last content\n const last = getLastFocusableElement({ container: containerRef.current });\n (last ?? containerRef.current)?.focus();\n }\n };\n\n return {\n startSentinelProps: {\n ref: startSentinelRef,\n tabIndex: -1,\n style: SENTINEL_STYLE,\n onFocus: handleStartFocus,\n },\n endSentinelProps: {\n ref: endSentinelRef,\n tabIndex: -1,\n style: SENTINEL_STYLE,\n onFocus: handleEndFocus,\n },\n };\n}\n"],"names":["useRef","useLayoutEffect","useEffect","getFirstFocusableElement","getLastFocusableElement","consumeFocusAnchor","consumeLastInteractedElement","SENTINEL_STYLE","position","opacity","pointerEvents","width","height","useFocusSentinel","isOpen","isModal","containerRef","returnFocusRef","triggerRef","startSentinelRef","endSentinelRef","trigger","current","document","activeElement","body","tagName","tabIndex","rafId","requestAnimationFrame","container","focus","cancelAnimationFrame","isConnected","startSentinelProps","ref","style","onFocus","handleStartFocus","e","contains","relatedTarget","endSentinelProps","handleEndFocus"],"mappings":"AAKA,SAAA,UAAAA,GAAA,mBAAAC,GAAA,aAAAC,SAAA;AAAA,SAAA,4BAAAC,GAAA,2BAAAC,SAAA;AAAA,SAAA,sBAAAC,GAAA,gCAAAC,SAAA;AAAA,MAAMC,IAAsC;AAAA,EAC1CC,UAAU;AAAA,EACVC,SAAS;AAAA,EACTC,eAAe;AAAA,EACfC,OAAO;AAAA,EACPC,QAAQ;AACV;AA0CO,SAASC,EAAiB;AAAA,EAC/BC,QAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,gBAAAA;AACuB,GAA2B;AAClD,QAAMC,IAAalB,EAA2B,IAAI,GAC5CmB,IAAmBnB,EAAuB,IAAI,GAC9CoB,IAAiBpB,EAAuB,IAAI;AAIlDC,SAAAA,EAAgB,MAAM;AACpB,QAAIc,KAAW,CAACD,EAAQ;AACxB,UAAMO,IACJJ,GAAgBK,WAChBjB,OACAC,EAAAA,KACCiB,SAASC;AACZ,QAAI,GAACH,KAAWA,MAAYE,SAASE,SAMjCJ,EAAQK,YAAY;AACxBR,aAAAA,EAAWI,UAAUD,GACjBD,EAAeE,YAASF,EAAeE,QAAQK,WAAW,IACvD,MAAM;AACX,QAAIP,EAAeE,YAASF,EAAeE,QAAQK,WAAW;AAAA,MAChE;AAAA,EACF,GAAG,CAACb,GAAQC,CAAO,CAAC,GAGpBb,EAAU,MAAM;AACd,QAAIa,KAAW,CAACD,KAAU,CAACI,EAAWI,QAAS;AAE/C,UAAMM,IAAQC,sBAAsB,MAAM;AAExC,OADc1B,EAAyB;AAAA,QAAE2B,WAAWd,EAAaM;AAAAA,MAAAA,CAAS,KAChEN,EAAaM,UAAUS,MAAAA,GAE7BZ,EAAiBG,YAASH,EAAiBG,QAAQK,WAAW;AAAA,IACpE,CAAC;AAED,WAAO,MAAM;AACXK,2BAAqBJ,CAAK,GACtBT,EAAiBG,YAASH,EAAiBG,QAAQK,WAAW;AAClE,YAAMN,IAAUH,EAAWI;AAC3BJ,MAAAA,EAAWI,UAAU,MACjBD,GAASY,eACXJ,sBAAsB,MAAMR,EAAQU,OAAO;AAAA,IAE/C;AAAA,EACF,GAAG,CAACjB,GAAQC,CAAO,CAAC,GAkCb;AAAA,IACLmB,oBAAoB;AAAA,MAClBC,KAAKhB;AAAAA,MACLQ,UAAU;AAAA,MACVS,OAAO7B;AAAAA,MACP8B,SArCqBC,CAACC,MAAwB;AAIhD,YAFEvB,EAAaM,SAASkB,SAASD,EAAEE,aAAqB,KACtDF,EAAEE,kBAAkBzB,EAAaM,SACnB;AAEd,gBAAMD,IAAUH,EAAWI;AAC3B,UAAID,GAASY,eAAaZ,EAAQU,MAAAA;AAAAA,QACpC;AAGE,UAAIZ,EAAiBG,YAASH,EAAiBG,QAAQK,WAAW,MACpDxB,EAAyB;AAAA,YAAE2B,WAAWd,EAAaM;AAAAA,UAAAA,CAAS,KAChEN,EAAaM,UAAUS,MAAAA;AAAAA,MAErC;AAAA,IAsBaO;AAAAA,IAEXI,kBAAkB;AAAA,MAChBP,KAAKf;AAAAA,MACLO,UAAU;AAAA,MACVS,OAAO7B;AAAAA,MACP8B,SA1BmBM,CAACJ,MAAwB;AAI9C,YAFEvB,EAAaM,SAASkB,SAASD,EAAEE,aAAqB,KACtDF,EAAEE,kBAAkBzB,EAAaM,SACnB;AAEd,gBAAMD,IAAUH,EAAWI;AAC3B,UAAID,GAASY,eAAaZ,EAAQU,MAAAA;AAAAA,QACpC;AAGE,WADa3B,EAAwB;AAAA,YAAE0B,WAAWd,EAAaM;AAAAA,UAAAA,CAAS,KAC/DN,EAAaM,UAAUS,MAAAA;AAAAA,MAEpC;AAAA,IAaaY;AAAAA,EACX;AAEJ;"}
package/dist/index85.js CHANGED
@@ -1,5 +1,24 @@
1
- const e = "data:image/svg+xml,%3csvg%20width='18'%20height='18'%20viewBox='0%200%2018%2018'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_5121_25308)'%3e%3cpath%20d='M6.77349%2010.3359H1.71958C1.3912%2010.3359%201.125%2010.6021%201.125%2010.9305V15.9844C1.125%2016.3128%201.3912%2016.579%201.71958%2016.579H6.77349C7.10186%2016.579%207.36806%2016.3128%207.36806%2015.9844V10.9305C7.36806%2010.6021%207.10186%2010.3359%206.77349%2010.3359Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M15.9888%2010.3359H10.9349C10.6065%2010.3359%2010.3403%2010.6021%2010.3403%2010.9305V15.9844C10.3403%2016.3128%2010.6065%2016.579%2010.9349%2016.579H15.9888C16.3171%2016.579%2016.5834%2016.3128%2016.5834%2015.9844V10.9305C16.5834%2010.6021%2016.3171%2010.3359%2015.9888%2010.3359Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M11.3921%201.125H6.33823C6.00986%201.125%205.74365%201.3912%205.74365%201.71958V6.77349C5.74365%207.10186%206.00986%207.36806%206.33823%207.36806H11.3921C11.7205%207.36806%2011.9867%207.10186%2011.9867%206.77349V1.71958C11.9867%201.3912%2011.7205%201.125%2011.3921%201.125Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_5121_25308'%3e%3crect%20width='18'%20height='18'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e";
1
+ import { createContext as u, useRef as o, useCallback as s, useContext as c, useEffect as a } from "react";
2
+ const f = /* @__PURE__ */ u(null);
3
+ function l() {
4
+ const r = o(/* @__PURE__ */ new Set()), t = o([]);
5
+ return {
6
+ register: s((n) => (r.current.add(n), t.current = Array.from(r.current), () => {
7
+ r.current.delete(n), t.current = Array.from(r.current);
8
+ }), []),
9
+ portalContainerRefs: t
10
+ };
11
+ }
12
+ function p(r, t) {
13
+ const e = c(f);
14
+ a(() => {
15
+ if (!(!e || !t))
16
+ return e(r);
17
+ }, [e, t, r]);
18
+ }
2
19
  export {
3
- e as default
20
+ f as FocusTrapPortalContext,
21
+ l as useFocusTrapPortalRegistry,
22
+ p as useRegisterPortalWithFocusTrap
4
23
  };
5
24
  //# sourceMappingURL=index85.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index85.js","sources":["../src/assets/icons/all-space.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='18'%20height='18'%20viewBox='0%200%2018%2018'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_5121_25308)'%3e%3cpath%20d='M6.77349%2010.3359H1.71958C1.3912%2010.3359%201.125%2010.6021%201.125%2010.9305V15.9844C1.125%2016.3128%201.3912%2016.579%201.71958%2016.579H6.77349C7.10186%2016.579%207.36806%2016.3128%207.36806%2015.9844V10.9305C7.36806%2010.6021%207.10186%2010.3359%206.77349%2010.3359Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M15.9888%2010.3359H10.9349C10.6065%2010.3359%2010.3403%2010.6021%2010.3403%2010.9305V15.9844C10.3403%2016.3128%2010.6065%2016.579%2010.9349%2016.579H15.9888C16.3171%2016.579%2016.5834%2016.3128%2016.5834%2015.9844V10.9305C16.5834%2010.6021%2016.3171%2010.3359%2015.9888%2010.3359Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M11.3921%201.125H6.33823C6.00986%201.125%205.74365%201.3912%205.74365%201.71958V6.77349C5.74365%207.10186%206.00986%207.36806%206.33823%207.36806H11.3921C11.7205%207.36806%2011.9867%207.10186%2011.9867%206.77349V1.71958C11.9867%201.3912%2011.7205%201.125%2011.3921%201.125Z'%20stroke='black'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_5121_25308'%3e%3crect%20width='18'%20height='18'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\""],"names":["__vite_glob_0_5"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index85.js","sources":["../src/utils/a11y/FocusTrapPortalContext.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useRef } from 'react';\n\ntype RegisterPortal = (ref: React.RefObject<HTMLElement | null>) => () => void;\n\n/**\n * Context for portal content to register with the nearest focus trap.\n * When a Modal (or any focus trap owner) provides this context, portal-rendered\n * content (e.g., Popover with isWithPortal) can register its container ref so\n * the focus trap's safety net allows focus to move into it.\n */\nexport const FocusTrapPortalContext = createContext<RegisterPortal | null>(null);\n\n/**\n * Hook for the focus trap owner (Modal) to create a portal registration function\n * and a stable ref to the current list of portal container refs.\n *\n * Usage in Modal:\n * ```tsx\n * const { register, portalContainerRefs } = useFocusTrapPortalRegistry();\n * // Pass portalContainerRefs.current to useModalA11y\n * // Wrap children with <FocusTrapPortalContext.Provider value={register}>\n * ```\n */\nexport function useFocusTrapPortalRegistry() {\n const portalRefsSet = useRef<Set<React.RefObject<HTMLElement | null>>>(new Set());\n const portalContainerRefs = useRef<React.RefObject<HTMLElement | null>[]>([]);\n\n const register: RegisterPortal = useCallback((ref) => {\n portalRefsSet.current.add(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n return () => {\n portalRefsSet.current.delete(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n };\n }, []);\n\n return { register, portalContainerRefs };\n}\n\n/**\n * Hook for portal content (Popover) to register its container ref with the\n * nearest ancestor focus trap. No-op if there is no focus trap ancestor.\n *\n * @param portalRef - Ref to the portal's root DOM element\n * @param isActive - Whether the portal is currently mounted and should be registered\n */\nexport function useRegisterPortalWithFocusTrap(\n portalRef: React.RefObject<HTMLElement | null>,\n isActive: boolean\n) {\n const register = useContext(FocusTrapPortalContext);\n\n useEffect(() => {\n if (!register || !isActive) return;\n return register(portalRef);\n }, [register, isActive, portalRef]);\n}\n"],"names":["createContext","useRef","useCallback","useContext","useEffect","FocusTrapPortalContext","useFocusTrapPortalRegistry","portalRefsSet","Set","portalContainerRefs","register","ref","current","add","Array","from","delete","useRegisterPortalWithFocusTrap","portalRef","isActive"],"mappings":"AAUO,SAAA,iBAAAA,GAAA,UAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,aAAAC,SAAA;AAAA,MAAMC,sBAA8D,IAAI;AAaxE,SAASC,IAA6B;AAC3C,QAAMC,IAAgBN,EAAiD,oBAAIO,KAAK,GAC1EC,IAAsBR,EAA8C,EAAE;AAW5E,SAAO;AAAA,IAAES,UATwBR,EAAaS,CAAAA,OAC5CJ,EAAcK,QAAQC,IAAIF,CAAG,GAC7BF,EAAoBG,UAAUE,MAAMC,KAAKR,EAAcK,OAAO,GACvD,MAAM;AACXL,MAAAA,EAAcK,QAAQI,OAAOL,CAAG,GAChCF,EAAoBG,UAAUE,MAAMC,KAAKR,EAAcK,OAAO;AAAA,IAChE,IACC,CAAA,CAAE;AAAA,IAEcH,qBAAAA;AAAAA,EAAAA;AACrB;AASO,SAASQ,EACdC,GACAC,GACA;AACA,QAAMT,IAAWP,EAAWE,CAAsB;AAElDD,EAAAA,EAAU,MAAM;AACd,QAAI,GAACM,KAAY,CAACS;AAClB,aAAOT,EAASQ,CAAS;AAAA,EAC3B,GAAG,CAACR,GAAUS,GAAUD,CAAS,CAAC;AACpC;"}
package/dist/index87.js CHANGED
@@ -1,5 +1,5 @@
1
- const e = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='8'%20height='11'%20viewBox='0%200%208%2011'%20fill='none'%3e%3cpath%20d='M5.2%207.9359L5.2%203.32051C5.2%202.75407%204.66274%202.29487%204%202.29487C3.33726%202.29487%202.8%202.75407%202.8%203.32051L2.8%208.70513C2.8%209.69641%203.7402%2010.5%204.9%2010.5C6.0598%2010.5%207%209.69641%207%208.70513L7%203.0641C7%201.64799%205.65685%200.5%204%200.5C2.34315%200.5%201%201.64799%201%203.0641L1%207.9359'%20stroke='%23415575'%20stroke-width='0.8'%20stroke-linecap='round'/%3e%3c/svg%3e";
1
+ const L = "data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M11.0179%2013.3597L12.27%2010.855L13.5222%2013.3597C13.9204%2014.1563%2014.5662%2014.8021%2015.3627%2015.2004L17.8682%2016.4531L15.3627%2017.7059C14.5662%2018.1041%2013.9204%2018.75%2013.5222%2019.5465L12.27%2022.0513L11.0179%2019.5465C10.6197%2018.75%209.97387%2018.1041%209.17738%2017.7059L6.67188%2016.4531L9.17738%2015.2004C9.97387%2014.8021%2010.6197%2014.1563%2011.0179%2013.3597Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%207.18859L19.4685%206.2832L19.9211%207.18859C20.3193%207.98511%2020.9651%208.63098%2021.7616%209.02923L22.6674%209.48215L21.7616%209.93506C20.9651%2010.3333%2020.3193%2010.9792%2019.9211%2011.7757L19.4685%2012.6811L19.0159%2011.7757C18.6177%2010.9792%2017.9719%2010.3333%2017.1754%209.93506L16.2695%209.48215L17.1754%209.02923C17.9719%208.63098%2018.6177%207.98511%2019.0159%207.18859Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%2021.3561L19.4685%2020.4507L19.9211%2021.3561C20.3193%2022.1526%2020.9651%2022.7985%2021.7616%2023.1967L22.6674%2023.6496L21.7616%2024.1025C20.9651%2024.5008%2020.3193%2025.1467%2019.9211%2025.9432L19.4685%2026.8486L19.0159%2025.9432C18.6177%2025.1467%2017.9719%2024.5008%2017.1754%2024.1025L16.2695%2023.6496L17.1754%2023.1967C17.9719%2022.7985%2018.6177%2022.1526%2019.0159%2021.3561Z'%20fill='%23415575'/%3e%3c/svg%3e";
2
2
  export {
3
- e as default
3
+ L as default
4
4
  };
5
5
  //# sourceMappingURL=index87.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index87.js","sources":["../src/assets/icons/attachment.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='8'%20height='11'%20viewBox='0%200%208%2011'%20fill='none'%3e%3cpath%20d='M5.2%207.9359L5.2%203.32051C5.2%202.75407%204.66274%202.29487%204%202.29487C3.33726%202.29487%202.8%202.75407%202.8%203.32051L2.8%208.70513C2.8%209.69641%203.7402%2010.5%204.9%2010.5C6.0598%2010.5%207%209.69641%207%208.70513L7%203.0641C7%201.64799%205.65685%200.5%204%200.5C2.34315%200.5%201%201.64799%201%203.0641L1%207.9359'%20stroke='%23415575'%20stroke-width='0.8'%20stroke-linecap='round'/%3e%3c/svg%3e\""],"names":["__vite_glob_0_7"],"mappings":"AAAA,MAAeA,IAAA;"}
1
+ {"version":3,"file":"index87.js","sources":["../src/assets/icons/ai-off.svg?url"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M11.0179%2013.3597L12.27%2010.855L13.5222%2013.3597C13.9204%2014.1563%2014.5662%2014.8021%2015.3627%2015.2004L17.8682%2016.4531L15.3627%2017.7059C14.5662%2018.1041%2013.9204%2018.75%2013.5222%2019.5465L12.27%2022.0513L11.0179%2019.5465C10.6197%2018.75%209.97387%2018.1041%209.17738%2017.7059L6.67188%2016.4531L9.17738%2015.2004C9.97387%2014.8021%2010.6197%2014.1563%2011.0179%2013.3597Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%207.18859L19.4685%206.2832L19.9211%207.18859C20.3193%207.98511%2020.9651%208.63098%2021.7616%209.02923L22.6674%209.48215L21.7616%209.93506C20.9651%2010.3333%2020.3193%2010.9792%2019.9211%2011.7757L19.4685%2012.6811L19.0159%2011.7757C18.6177%2010.9792%2017.9719%2010.3333%2017.1754%209.93506L16.2695%209.48215L17.1754%209.02923C17.9719%208.63098%2018.6177%207.98511%2019.0159%207.18859Z'%20fill='%23415575'/%3e%3cpath%20d='M19.0159%2021.3561L19.4685%2020.4507L19.9211%2021.3561C20.3193%2022.1526%2020.9651%2022.7985%2021.7616%2023.1967L22.6674%2023.6496L21.7616%2024.1025C20.9651%2024.5008%2020.3193%2025.1467%2019.9211%2025.9432L19.4685%2026.8486L19.0159%2025.9432C18.6177%2025.1467%2017.9719%2024.5008%2017.1754%2024.1025L16.2695%2023.6496L17.1754%2023.1967C17.9719%2022.7985%2018.6177%2022.1526%2019.0159%2021.3561Z'%20fill='%23415575'/%3e%3c/svg%3e\""],"names":["__vite_glob_0_0"],"mappings":"AAAA,MAAAA,IAAe;"}
package/dist/index88.js CHANGED
@@ -1,5 +1,5 @@
1
- const e = "data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M17.2727%2010.0535H2'%20stroke='currentColor'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M6.49198%2014.5454L2%2010.0535L6.49198%205.56149'%20stroke='currentColor'%20stroke-width='1.2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e";
1
+ const C = "data:image/svg+xml,%3csvg%20width='67'%20height='67'%20viewBox='0%200%2067%2067'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M19.166%204.53418C25.8215%201.28372%2033.4025%200.455651%2040.6025%202.19336C45.6308%203.40697%2050.254%205.81881%2054.0977%209.18262L56.2627%2011.0771V5.22852C56.2628%204.50782%2056.8467%203.92384%2057.5674%203.92383C58.288%203.92383%2058.872%204.50784%2058.8721%205.22852V14.8369C58.872%2015.5575%2058.288%2016.1416%2057.5674%2016.1416H47.874C47.1533%2016.1416%2046.5684%2015.5576%2046.5684%2014.8369C46.5684%2014.1161%2047.1533%2013.5322%2047.874%2013.5322H55.0752L52.4951%2011.249C48.9439%208.10762%2044.6571%205.85686%2039.9902%204.73047C33.3806%203.13527%2026.4212%203.89496%2020.3115%206.87891C14.2018%209.86288%209.32423%2014.8845%206.51855%2021.0781C3.71296%2027.2719%203.15512%2034.2508%204.94141%2040.8115C5.1304%2041.5068%204.72038%2042.2236%204.02539%2042.4131C3.32995%2042.6024%202.6123%2042.1923%202.42285%2041.4971C0.47701%2034.3503%201.08442%2026.748%204.14062%2020.001C7.19678%2013.2541%2012.5107%207.78477%2019.166%204.53418Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M62.2422%2023.8568C62.9375%2023.6675%2063.6544%2024.0777%2063.8438%2024.7728C65.7896%2031.9196%2065.1823%2039.522%2062.126%2046.2689C59.0697%2053.0158%2053.756%2058.4853%2047.1006%2061.7357C40.445%2064.9863%2032.8642%2065.8144%2025.6641%2064.0765C20.6357%2062.8629%2016.0126%2060.4512%2012.1689%2057.0873L10.0049%2055.1927V60.892C10.0048%2061.6124%209.42064%2062.1965%208.7002%2062.1967C7.97953%2062.1967%207.39465%2061.6126%207.39453%2060.892V51.433C7.39459%2050.7123%207.97949%2050.1283%208.7002%2050.1283H18.2441C18.9647%2050.1284%2019.5488%2050.7124%2019.5488%2051.433C19.5488%2052.1537%2018.9648%2052.7376%2018.2441%2052.7377H11.1914L13.7715%2055.0209C17.3228%2058.1623%2021.6095%2060.413%2026.2764%2061.5394C32.886%2063.1347%2039.8453%2062.3748%2045.9551%2059.391C52.0648%2056.407%2056.9434%2051.3855%2059.749%2045.1918C62.5546%2038.998%2063.1125%2032.0191%2061.3262%2025.4584C61.1488%2024.8064%2061.4978%2024.1351%2062.1152%2023.8978L62.2422%2023.8568Z'%20stroke='black'%20stroke-width='2.61'/%3e%3cpath%20d='M32.5%2020.4045C32.6936%2019.8812%2033.4332%2019.881%2033.627%2020.4045C35.7001%2026.0073%2040.1179%2030.425%2045.7207%2032.4983C46.2441%2032.6919%2046.2441%2033.4316%2045.7207%2033.6252C40.1179%2035.6985%2035.7001%2040.1162%2033.627%2045.719C33.4332%2046.2424%2032.6937%2046.2424%2032.5%2045.719C30.4267%2040.1162%2026.0091%2035.6985%2020.4062%2033.6252C19.8829%2033.4316%2019.8829%2032.6919%2020.4062%2032.4983C26.0091%2030.425%2030.4267%2026.0073%2032.5%2020.4045Z'%20stroke='black'%20stroke-width='3.48'/%3e%3c/svg%3e";
2
2
  export {
3
- e as default
3
+ C as default
4
4
  };
5
5
  //# sourceMappingURL=index88.js.map