se-design 1.0.75 → 1.0.76-dev2

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 (484) hide show
  1. package/dist/assets/style.css +1 -1
  2. package/dist/components/AccessibleDiv/index.d.ts +24 -0
  3. package/dist/components/Checkbox/index.d.ts +12 -0
  4. package/dist/components/CustomAccordion/index.d.ts +1 -0
  5. package/dist/components/CustomModal/index.d.ts +15 -12
  6. package/dist/components/DatePicker/useDatePickerA11y.d.ts +50 -0
  7. package/dist/components/Dropdown/index.d.ts +15 -0
  8. package/dist/components/DropdownWithInputTags/index.d.ts +1 -0
  9. package/dist/components/Icon/index.d.ts +8 -2
  10. package/dist/components/InputWithIcon/index.d.ts +9 -1
  11. package/dist/components/LabelChip/index.d.ts +1 -0
  12. package/dist/components/Modal/index.d.ts +1 -0
  13. package/dist/components/PhoneInput/index.d.ts +13 -5
  14. package/dist/components/Popover/index.d.ts +2 -0
  15. package/dist/components/SidebarOverlay/index.d.ts +8 -0
  16. package/dist/components/index.d.ts +1 -0
  17. package/dist/index.js +144 -133
  18. package/dist/index.js.map +1 -1
  19. package/dist/index10.js +23 -59
  20. package/dist/index10.js.map +1 -1
  21. package/dist/index100.js +1 -1
  22. package/dist/index100.js.map +1 -1
  23. package/dist/index101.js +1 -1
  24. package/dist/index101.js.map +1 -1
  25. package/dist/index102.js +2 -2
  26. package/dist/index102.js.map +1 -1
  27. package/dist/index103.js +2 -2
  28. package/dist/index103.js.map +1 -1
  29. package/dist/index104.js +1 -1
  30. package/dist/index104.js.map +1 -1
  31. package/dist/index105.js +1 -1
  32. package/dist/index105.js.map +1 -1
  33. package/dist/index106.js +1 -1
  34. package/dist/index106.js.map +1 -1
  35. package/dist/index107.js +2 -2
  36. package/dist/index107.js.map +1 -1
  37. package/dist/index108.js +2 -2
  38. package/dist/index108.js.map +1 -1
  39. package/dist/index109.js +2 -2
  40. package/dist/index109.js.map +1 -1
  41. package/dist/index11.js +70 -63
  42. package/dist/index11.js.map +1 -1
  43. package/dist/index110.js +2 -2
  44. package/dist/index110.js.map +1 -1
  45. package/dist/index111.js +1 -1
  46. package/dist/index111.js.map +1 -1
  47. package/dist/index112.js +1 -1
  48. package/dist/index112.js.map +1 -1
  49. package/dist/index113.js +2 -2
  50. package/dist/index113.js.map +1 -1
  51. package/dist/index114.js +2 -2
  52. package/dist/index114.js.map +1 -1
  53. package/dist/index115.js +1 -1
  54. package/dist/index115.js.map +1 -1
  55. package/dist/index116.js +1 -1
  56. package/dist/index116.js.map +1 -1
  57. package/dist/index117.js +1 -1
  58. package/dist/index117.js.map +1 -1
  59. package/dist/index118.js +2 -2
  60. package/dist/index118.js.map +1 -1
  61. package/dist/index119.js +1 -1
  62. package/dist/index119.js.map +1 -1
  63. package/dist/index12.js +68 -33
  64. package/dist/index12.js.map +1 -1
  65. package/dist/index120.js +2 -2
  66. package/dist/index120.js.map +1 -1
  67. package/dist/index121.js +2 -2
  68. package/dist/index121.js.map +1 -1
  69. package/dist/index122.js +2 -2
  70. package/dist/index122.js.map +1 -1
  71. package/dist/index123.js +2 -2
  72. package/dist/index123.js.map +1 -1
  73. package/dist/index124.js +2 -2
  74. package/dist/index124.js.map +1 -1
  75. package/dist/index125.js +2 -2
  76. package/dist/index125.js.map +1 -1
  77. package/dist/index126.js +1 -1
  78. package/dist/index126.js.map +1 -1
  79. package/dist/index127.js +1 -1
  80. package/dist/index127.js.map +1 -1
  81. package/dist/index128.js +1 -1
  82. package/dist/index128.js.map +1 -1
  83. package/dist/index129.js +1 -1
  84. package/dist/index129.js.map +1 -1
  85. package/dist/index13.js +48 -14
  86. package/dist/index13.js.map +1 -1
  87. package/dist/index130.js +2 -2
  88. package/dist/index130.js.map +1 -1
  89. package/dist/index131.js +2 -2
  90. package/dist/index131.js.map +1 -1
  91. package/dist/index132.js +1 -1
  92. package/dist/index132.js.map +1 -1
  93. package/dist/index133.js +1 -1
  94. package/dist/index133.js.map +1 -1
  95. package/dist/index134.js +2 -2
  96. package/dist/index134.js.map +1 -1
  97. package/dist/index135.js +1 -1
  98. package/dist/index135.js.map +1 -1
  99. package/dist/index136.js +1 -1
  100. package/dist/index136.js.map +1 -1
  101. package/dist/index137.js +1 -1
  102. package/dist/index137.js.map +1 -1
  103. package/dist/index138.js +1 -1
  104. package/dist/index138.js.map +1 -1
  105. package/dist/index139.js +1 -1
  106. package/dist/index139.js.map +1 -1
  107. package/dist/index14.js +15 -9
  108. package/dist/index14.js.map +1 -1
  109. package/dist/index140.js +1 -1
  110. package/dist/index140.js.map +1 -1
  111. package/dist/index141.js +2 -2
  112. package/dist/index141.js.map +1 -1
  113. package/dist/index142.js +1 -1
  114. package/dist/index142.js.map +1 -1
  115. package/dist/index143.js +2 -2
  116. package/dist/index143.js.map +1 -1
  117. package/dist/index144.js +2 -2
  118. package/dist/index144.js.map +1 -1
  119. package/dist/index145.js +1 -1
  120. package/dist/index145.js.map +1 -1
  121. package/dist/index146.js +2 -2
  122. package/dist/index146.js.map +1 -1
  123. package/dist/index147.js +2 -2
  124. package/dist/index147.js.map +1 -1
  125. package/dist/index148.js +1 -1
  126. package/dist/index148.js.map +1 -1
  127. package/dist/index149.js +1 -1
  128. package/dist/index149.js.map +1 -1
  129. package/dist/index15.js +10 -218
  130. package/dist/index15.js.map +1 -1
  131. package/dist/index150.js +2 -2
  132. package/dist/index150.js.map +1 -1
  133. package/dist/index151.js +2 -2
  134. package/dist/index151.js.map +1 -1
  135. package/dist/index152.js +1 -1
  136. package/dist/index152.js.map +1 -1
  137. package/dist/index153.js +2 -2
  138. package/dist/index153.js.map +1 -1
  139. package/dist/index154.js +2 -2
  140. package/dist/index154.js.map +1 -1
  141. package/dist/index155.js +1 -1
  142. package/dist/index155.js.map +1 -1
  143. package/dist/index156.js +1 -1
  144. package/dist/index156.js.map +1 -1
  145. package/dist/index157.js +1 -1
  146. package/dist/index157.js.map +1 -1
  147. package/dist/index158.js +1 -1
  148. package/dist/index158.js.map +1 -1
  149. package/dist/index159.js +1 -1
  150. package/dist/index159.js.map +1 -1
  151. package/dist/index16.js +220 -60
  152. package/dist/index16.js.map +1 -1
  153. package/dist/index160.js +1 -1
  154. package/dist/index160.js.map +1 -1
  155. package/dist/index161.js +1 -1
  156. package/dist/index161.js.map +1 -1
  157. package/dist/index162.js +1 -1
  158. package/dist/index162.js.map +1 -1
  159. package/dist/index163.js +1 -1
  160. package/dist/index163.js.map +1 -1
  161. package/dist/index164.js +1 -1
  162. package/dist/index164.js.map +1 -1
  163. package/dist/index165.js +1 -1
  164. package/dist/index165.js.map +1 -1
  165. package/dist/index166.js +1 -1
  166. package/dist/index166.js.map +1 -1
  167. package/dist/index167.js +1 -1
  168. package/dist/index167.js.map +1 -1
  169. package/dist/index168.js +1 -1
  170. package/dist/index168.js.map +1 -1
  171. package/dist/index169.js +1 -1
  172. package/dist/index169.js.map +1 -1
  173. package/dist/index17.js +60 -99
  174. package/dist/index17.js.map +1 -1
  175. package/dist/index170.js +1 -1
  176. package/dist/index170.js.map +1 -1
  177. package/dist/index171.js +1 -1
  178. package/dist/index171.js.map +1 -1
  179. package/dist/index172.js +1 -1
  180. package/dist/index172.js.map +1 -1
  181. package/dist/index173.js +2 -2
  182. package/dist/index173.js.map +1 -1
  183. package/dist/index174.js +1 -1
  184. package/dist/index174.js.map +1 -1
  185. package/dist/index175.js +1 -1
  186. package/dist/index175.js.map +1 -1
  187. package/dist/index176.js +1 -1
  188. package/dist/index176.js.map +1 -1
  189. package/dist/index177.js +2 -2
  190. package/dist/index177.js.map +1 -1
  191. package/dist/index178.js +1 -1
  192. package/dist/index178.js.map +1 -1
  193. package/dist/index179.js +1 -1
  194. package/dist/index179.js.map +1 -1
  195. package/dist/index18.js +95 -282
  196. package/dist/index18.js.map +1 -1
  197. package/dist/index180.js +2 -2
  198. package/dist/index180.js.map +1 -1
  199. package/dist/index181.js +1 -1
  200. package/dist/index181.js.map +1 -1
  201. package/dist/index182.js +1 -1
  202. package/dist/index182.js.map +1 -1
  203. package/dist/index183.js +1 -1
  204. package/dist/index183.js.map +1 -1
  205. package/dist/index184.js +2 -2
  206. package/dist/index184.js.map +1 -1
  207. package/dist/index185.js +1 -1
  208. package/dist/index185.js.map +1 -1
  209. package/dist/index186.js +1 -1
  210. package/dist/index186.js.map +1 -1
  211. package/dist/index187.js +2 -2
  212. package/dist/index187.js.map +1 -1
  213. package/dist/index188.js +1 -1
  214. package/dist/index188.js.map +1 -1
  215. package/dist/index189.js +2 -2
  216. package/dist/index189.js.map +1 -1
  217. package/dist/index19.js +323 -16
  218. package/dist/index19.js.map +1 -1
  219. package/dist/index190.js +2 -149
  220. package/dist/index190.js.map +1 -1
  221. package/dist/index191.js +2 -9
  222. package/dist/index191.js.map +1 -1
  223. package/dist/index192.js +2 -6
  224. package/dist/index192.js.map +1 -1
  225. package/dist/index193.js +2 -5
  226. package/dist/index193.js.map +1 -1
  227. package/dist/index194.js +2 -40
  228. package/dist/index194.js.map +1 -1
  229. package/dist/index195.js +2 -59
  230. package/dist/index195.js.map +1 -1
  231. package/dist/index196.js +2 -23
  232. package/dist/index196.js.map +1 -1
  233. package/dist/index197.js +152 -0
  234. package/dist/index197.js.map +1 -0
  235. package/dist/index198.js +12 -0
  236. package/dist/index198.js.map +1 -0
  237. package/dist/index199.js +5 -23
  238. package/dist/index199.js.map +1 -1
  239. package/dist/index20.js +15 -31
  240. package/dist/index20.js.map +1 -1
  241. package/dist/index200.js +8 -0
  242. package/dist/index200.js.map +1 -0
  243. package/dist/index201.js +36 -80
  244. package/dist/index201.js.map +1 -1
  245. package/dist/index206.js +26 -0
  246. package/dist/index206.js.map +1 -0
  247. package/dist/index207.js +71 -0
  248. package/dist/index207.js.map +1 -0
  249. package/dist/index21.js +33 -61
  250. package/dist/index21.js.map +1 -1
  251. package/dist/{index210.js → index215.js} +1 -1
  252. package/dist/{index210.js.map → index215.js.map} +1 -1
  253. package/dist/index22.js +57 -76
  254. package/dist/index22.js.map +1 -1
  255. package/dist/{index218.js → index223.js} +1 -1
  256. package/dist/{index218.js.map → index223.js.map} +1 -1
  257. package/dist/{index221.js → index226.js} +2 -2
  258. package/dist/{index221.js.map → index226.js.map} +1 -1
  259. package/dist/index23.js +83 -21
  260. package/dist/index23.js.map +1 -1
  261. package/dist/index235.js +171 -8
  262. package/dist/index235.js.map +1 -1
  263. package/dist/index236.js +3 -9
  264. package/dist/index236.js.map +1 -1
  265. package/dist/index238.js +18 -169
  266. package/dist/index238.js.map +1 -1
  267. package/dist/index239.js +10 -11
  268. package/dist/index239.js.map +1 -1
  269. package/dist/index24.js +20 -222
  270. package/dist/index24.js.map +1 -1
  271. package/dist/index240.js +8 -4
  272. package/dist/index240.js.map +1 -1
  273. package/dist/index241.js +4 -5
  274. package/dist/index241.js.map +1 -1
  275. package/dist/index242.js +168 -36
  276. package/dist/index242.js.map +1 -1
  277. package/dist/index243.js +11 -2
  278. package/dist/index243.js.map +1 -1
  279. package/dist/index244.js +5 -7
  280. package/dist/index244.js.map +1 -1
  281. package/dist/index245.js +5 -326
  282. package/dist/index245.js.map +1 -1
  283. package/dist/index246.js +36 -48
  284. package/dist/index246.js.map +1 -1
  285. package/dist/index247.js +2 -2
  286. package/dist/index248.js +7 -75
  287. package/dist/index248.js.map +1 -1
  288. package/dist/index249.js +308 -74
  289. package/dist/index249.js.map +1 -1
  290. package/dist/index25.js +299 -43
  291. package/dist/index25.js.map +1 -1
  292. package/dist/index250.js +45 -47
  293. package/dist/index250.js.map +1 -1
  294. package/dist/index251.js +2 -8
  295. package/dist/index251.js.map +1 -1
  296. package/dist/index252.js +75 -4
  297. package/dist/index252.js.map +1 -1
  298. package/dist/index253.js +89 -48
  299. package/dist/index253.js.map +1 -1
  300. package/dist/index254.js +52 -2
  301. package/dist/index254.js.map +1 -1
  302. package/dist/index255.js +8 -2
  303. package/dist/index255.js.map +1 -1
  304. package/dist/index256.js +8 -0
  305. package/dist/index256.js.map +1 -0
  306. package/dist/index257.js +55 -0
  307. package/dist/index257.js.map +1 -0
  308. package/dist/index258.js +5 -0
  309. package/dist/index258.js.map +1 -0
  310. package/dist/index259.js +5 -0
  311. package/dist/index259.js.map +1 -0
  312. package/dist/index26.js +48 -23
  313. package/dist/index26.js.map +1 -1
  314. package/dist/index27.js +21 -81
  315. package/dist/index27.js.map +1 -1
  316. package/dist/index28.js +101 -138
  317. package/dist/index28.js.map +1 -1
  318. package/dist/index29.js +139 -128
  319. package/dist/index29.js.map +1 -1
  320. package/dist/index3.js +57 -98
  321. package/dist/index3.js.map +1 -1
  322. package/dist/index30.js +133 -69
  323. package/dist/index30.js.map +1 -1
  324. package/dist/index31.js +67 -96
  325. package/dist/index31.js.map +1 -1
  326. package/dist/index32.js +96 -71
  327. package/dist/index32.js.map +1 -1
  328. package/dist/index33.js +70 -38
  329. package/dist/index33.js.map +1 -1
  330. package/dist/index34.js +40 -71
  331. package/dist/index34.js.map +1 -1
  332. package/dist/index35.js +67 -82
  333. package/dist/index35.js.map +1 -1
  334. package/dist/index36.js +99 -54
  335. package/dist/index36.js.map +1 -1
  336. package/dist/index37.js +53 -280
  337. package/dist/index37.js.map +1 -1
  338. package/dist/index38.js +283 -70
  339. package/dist/index38.js.map +1 -1
  340. package/dist/index39.js +69 -80
  341. package/dist/index39.js.map +1 -1
  342. package/dist/index4.js +102 -42
  343. package/dist/index4.js.map +1 -1
  344. package/dist/index40.js +82 -32
  345. package/dist/index40.js.map +1 -1
  346. package/dist/index41.js +26 -44
  347. package/dist/index41.js.map +1 -1
  348. package/dist/index42.js +45 -67
  349. package/dist/index42.js.map +1 -1
  350. package/dist/index43.js +65 -49
  351. package/dist/index43.js.map +1 -1
  352. package/dist/index44.js +53 -139
  353. package/dist/index44.js.map +1 -1
  354. package/dist/index45.js +132 -179
  355. package/dist/index45.js.map +1 -1
  356. package/dist/index46.js +194 -35
  357. package/dist/index46.js.map +1 -1
  358. package/dist/index47.js +34 -29
  359. package/dist/index47.js.map +1 -1
  360. package/dist/index48.js +31 -145
  361. package/dist/index48.js.map +1 -1
  362. package/dist/index49.js +131 -70
  363. package/dist/index49.js.map +1 -1
  364. package/dist/index5.js +40 -315
  365. package/dist/index5.js.map +1 -1
  366. package/dist/index50.js +80 -371
  367. package/dist/index50.js.map +1 -1
  368. package/dist/index51.js +451 -91
  369. package/dist/index51.js.map +1 -1
  370. package/dist/index52.js +98 -38
  371. package/dist/index52.js.map +1 -1
  372. package/dist/index53.js +35 -35
  373. package/dist/index53.js.map +1 -1
  374. package/dist/index54.js +35 -90
  375. package/dist/index54.js.map +1 -1
  376. package/dist/index55.js +89 -159
  377. package/dist/index55.js.map +1 -1
  378. package/dist/index56.js +157 -143
  379. package/dist/index56.js.map +1 -1
  380. package/dist/index57.js +149 -33
  381. package/dist/index57.js.map +1 -1
  382. package/dist/index58.js +33 -86
  383. package/dist/index58.js.map +1 -1
  384. package/dist/index59.js +80 -113
  385. package/dist/index59.js.map +1 -1
  386. package/dist/index6.js +323 -43
  387. package/dist/index6.js.map +1 -1
  388. package/dist/index60.js +114 -62
  389. package/dist/index60.js.map +1 -1
  390. package/dist/index61.js +62 -147
  391. package/dist/index61.js.map +1 -1
  392. package/dist/index62.js +146 -312
  393. package/dist/index62.js.map +1 -1
  394. package/dist/index63.js +317 -44
  395. package/dist/index63.js.map +1 -1
  396. package/dist/index64.js +44 -143
  397. package/dist/index64.js.map +1 -1
  398. package/dist/index65.js +145 -12
  399. package/dist/index65.js.map +1 -1
  400. package/dist/index66.js +10 -44
  401. package/dist/index66.js.map +1 -1
  402. package/dist/index67.js +42 -15
  403. package/dist/index67.js.map +1 -1
  404. package/dist/index68.js +76 -48
  405. package/dist/index68.js.map +1 -1
  406. package/dist/index69.js +18 -58
  407. package/dist/index69.js.map +1 -1
  408. package/dist/index7.js +44 -51
  409. package/dist/index7.js.map +1 -1
  410. package/dist/index70.js +66 -5
  411. package/dist/index70.js.map +1 -1
  412. package/dist/index71.js +25 -7
  413. package/dist/index71.js.map +1 -1
  414. package/dist/index72.js +105 -0
  415. package/dist/index72.js.map +1 -0
  416. package/dist/index73.js +62 -2
  417. package/dist/index73.js.map +1 -1
  418. package/dist/index74.js +21 -2
  419. package/dist/index74.js.map +1 -1
  420. package/dist/index75.js +5 -2
  421. package/dist/index75.js.map +1 -1
  422. package/dist/index76.js +54 -2
  423. package/dist/index76.js.map +1 -1
  424. package/dist/index77.js +24 -2
  425. package/dist/index77.js.map +1 -1
  426. package/dist/index78.js +9 -2
  427. package/dist/index78.js.map +1 -1
  428. package/dist/index8.js +48 -85
  429. package/dist/index8.js.map +1 -1
  430. package/dist/index80.js +2 -2
  431. package/dist/index80.js.map +1 -1
  432. package/dist/index81.js +2 -2
  433. package/dist/index81.js.map +1 -1
  434. package/dist/index82.js +1 -1
  435. package/dist/index82.js.map +1 -1
  436. package/dist/index83.js +2 -2
  437. package/dist/index83.js.map +1 -1
  438. package/dist/index84.js +1 -1
  439. package/dist/index84.js.map +1 -1
  440. package/dist/index85.js +1 -1
  441. package/dist/index85.js.map +1 -1
  442. package/dist/index86.js +1 -1
  443. package/dist/index86.js.map +1 -1
  444. package/dist/index87.js +1 -1
  445. package/dist/index87.js.map +1 -1
  446. package/dist/index88.js +1 -1
  447. package/dist/index88.js.map +1 -1
  448. package/dist/index89.js +1 -1
  449. package/dist/index89.js.map +1 -1
  450. package/dist/index9.js +91 -27
  451. package/dist/index9.js.map +1 -1
  452. package/dist/index90.js +1 -1
  453. package/dist/index90.js.map +1 -1
  454. package/dist/index91.js +1 -1
  455. package/dist/index91.js.map +1 -1
  456. package/dist/index92.js +1 -1
  457. package/dist/index92.js.map +1 -1
  458. package/dist/index93.js +1 -1
  459. package/dist/index93.js.map +1 -1
  460. package/dist/index94.js +1 -1
  461. package/dist/index94.js.map +1 -1
  462. package/dist/index95.js +1 -1
  463. package/dist/index95.js.map +1 -1
  464. package/dist/index96.js +1 -1
  465. package/dist/index96.js.map +1 -1
  466. package/dist/index97.js +1 -1
  467. package/dist/index97.js.map +1 -1
  468. package/dist/index98.js +1 -1
  469. package/dist/index98.js.map +1 -1
  470. package/dist/index99.js +1 -1
  471. package/dist/index99.js.map +1 -1
  472. package/package.json +1 -1
  473. package/dist/index230.js +0 -7
  474. package/dist/index230.js.map +0 -1
  475. package/dist/index232.js +0 -25
  476. package/dist/index232.js.map +0 -1
  477. package/dist/index233.js +0 -57
  478. package/dist/index233.js.map +0 -1
  479. package/dist/index234.js +0 -22
  480. package/dist/index234.js.map +0 -1
  481. package/dist/index237.js +0 -8
  482. package/dist/index237.js.map +0 -1
  483. package/dist/index79.js +0 -5
  484. package/dist/index79.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import { useRef as h, useLayoutEffect as a } from "react";
2
+ import { getFirstFocusableElement as p, getFocusableElements as A } from "./index71.js";
3
+ let f = null;
4
+ function L(e) {
5
+ const n = e.composedPath();
6
+ for (const c of n)
7
+ if (c instanceof HTMLElement && c.tabIndex >= 0) {
8
+ f = c;
9
+ return;
10
+ }
11
+ }
12
+ function k(e) {
13
+ (e.key === "Enter" || e.key === " ") && (f = document.activeElement);
14
+ }
15
+ typeof document < "u" && (document.addEventListener("pointerdown", L, !0), document.addEventListener("keydown", k, !0));
16
+ function q() {
17
+ const e = f;
18
+ return f = null, e;
19
+ }
20
+ let i = null, l = null;
21
+ function T(e) {
22
+ l !== null && cancelAnimationFrame(l), i = e, l = requestAnimationFrame(() => {
23
+ i = null, l = null;
24
+ });
25
+ }
26
+ function w() {
27
+ l !== null && (cancelAnimationFrame(l), l = null);
28
+ const e = i;
29
+ return i = null, e;
30
+ }
31
+ function F(e, n) {
32
+ return n === "none" ? null : n === "first" ? p({
33
+ container: e
34
+ }) || e : n === "container" ? e : typeof n == "string" ? e.querySelector(n) : n instanceof HTMLElement ? n : null;
35
+ }
36
+ function _({
37
+ enabled: e,
38
+ containerRef: n,
39
+ restoreFocus: c = !0,
40
+ initialFocus: d = "first",
41
+ returnFocusRef: g
42
+ }) {
43
+ const u = h(null), E = h(null);
44
+ return a(() => {
45
+ if (!e) {
46
+ if (c && u.current) {
47
+ const r = u.current;
48
+ u.current = null, requestAnimationFrame(() => {
49
+ r.isConnected && r.focus();
50
+ });
51
+ }
52
+ return;
53
+ }
54
+ const t = n.current;
55
+ if (t)
56
+ return u.current = g?.current ?? w() ?? f ?? document.activeElement, f = null, t.contains(document.activeElement) || requestAnimationFrame(() => {
57
+ F(t, d)?.focus();
58
+ }), () => {
59
+ if (c && u.current) {
60
+ const r = u.current;
61
+ u.current = null, requestAnimationFrame(() => {
62
+ r.isConnected && r.focus();
63
+ });
64
+ }
65
+ };
66
+ }, [e, n, c, d]), a(() => {
67
+ if (!e) return;
68
+ const t = n.current;
69
+ if (!t) return;
70
+ const r = (o) => {
71
+ if (o.key === "Tab") {
72
+ const s = A({
73
+ container: t
74
+ });
75
+ if (s.length === 0) {
76
+ o.preventDefault(), t.focus();
77
+ return;
78
+ }
79
+ const m = s[0], v = s[s.length - 1], y = document.activeElement;
80
+ o.shiftKey && y === m ? (o.preventDefault(), v.focus()) : !o.shiftKey && y === v && (o.preventDefault(), m.focus());
81
+ }
82
+ };
83
+ return document.addEventListener("keydown", r, !0), () => document.removeEventListener("keydown", r, !0);
84
+ }, [e, n]), a(() => {
85
+ if (!e) return;
86
+ const t = n.current;
87
+ if (!t) return;
88
+ const r = (o) => {
89
+ const s = o.target;
90
+ t.contains(s) ? E.current = s : (E.current || p({
91
+ container: t
92
+ }) || t).focus();
93
+ };
94
+ return document.addEventListener("focusin", r, !0), () => document.removeEventListener("focusin", r, !0);
95
+ }, [e, n]), {
96
+ triggerRef: u
97
+ };
98
+ }
99
+ export {
100
+ w as consumeFocusAnchor,
101
+ q as consumeLastInteractedElement,
102
+ T as setFocusAnchor,
103
+ _ as useFocusTrap
104
+ };
105
+ //# sourceMappingURL=index72.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index72.js","sources":["../src/utils/a11y/useFocusTrap.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react';\nimport { getFocusableElements, getFirstFocusableElement } from './focusableElements';\n\nexport interface UseFocusTrapOptions<T extends HTMLElement = HTMLElement> {\n /**\n * Whether the focus trap is active.\n */\n enabled: boolean;\n /**\n * Container element ref to trap focus within.\n */\n containerRef: React.RefObject<T | null>;\n /**\n * Whether to restore focus to the element that had focus before trap activated.\n * Default: true\n */\n restoreFocus?: boolean;\n /**\n * Initial focus target when trap activates.\n * - 'first': Focus first focusable element (default)\n * - 'container': Focus the container itself\n * - 'none': Skip initial focus — browser handles it (e.g. autofocus attribute)\n * - CSS selector: Focus element matching selector\n * - HTMLElement: Focus this specific element\n */\n initialFocus?: 'first' | 'container' | 'none' | string | HTMLElement;\n /**\n * Explicit element to restore focus to when the trap deactivates.\n * Overrides the automatic trigger capture (_lastInteractedElement / document.activeElement).\n * Use when the opener is known at call-site (e.g. a ref on the toggle button).\n */\n returnFocusRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport interface UseFocusTrapReturn {\n /**\n * Ref to the element that had focus before trap activated.\n * Useful for manual focus restoration if needed.\n */\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n}\n\n// Module-level trigger tracking: React's commit phase is bottom-up, so by the\n// time useFocusTrap's useLayoutEffect runs, document.activeElement may already\n// be the autoFocus element inside the modal rather than the opener button.\n// We capture the last interacted element via pointerdown/keydown listeners\n// (which fire before any React state update commits) to work around this.\nlet _lastInteractedElement: HTMLElement | null = null;\n\nfunction _onPointerDown(e: PointerEvent): void {\n // Walk composedPath to find the nearest focusable element being pressed.\n const path = e.composedPath();\n for (const node of path) {\n if (node instanceof HTMLElement && node.tabIndex >= 0) {\n _lastInteractedElement = node;\n return;\n }\n }\n}\n\nfunction _onKeyDown(e: KeyboardEvent): void {\n // Enter/Space on a focused button will synthesise a click — capture before that.\n if (e.key === 'Enter' || e.key === ' ') {\n _lastInteractedElement = document.activeElement as HTMLElement;\n }\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('pointerdown', _onPointerDown, true);\n document.addEventListener('keydown', _onKeyDown, true);\n}\n\n/**\n * Returns (and clears) the last element interacted with before a React commit.\n * Used by SidebarOverlay complementary mode to seed its trigger ref without\n * relying on document.activeElement timing.\n */\nexport function consumeLastInteractedElement(): HTMLElement | null {\n const el = _lastInteractedElement;\n _lastInteractedElement = null;\n return el;\n}\n\n// Focus anchor — explicit stable return-focus target, higher priority than\n// _lastInteractedElement. Auto-clears via setTimeout(0) to prevent a stale\n// anchor leaking to an unrelated open.\nlet _focusAnchor: HTMLElement | null = null;\nlet _focusAnchorClearFrame: ReturnType<typeof requestAnimationFrame> | null = null;\n\n/**\n * Sets an explicit focus-return anchor element.\n * Call this before dispatching an action that will open a modal or sidebar,\n * when the natural last-interacted element is not the right return target\n * (e.g. a popover menu item that will be unmounted when the popover closes).\n */\nexport function setFocusAnchor(el: HTMLElement | null): void {\n if (_focusAnchorClearFrame !== null) cancelAnimationFrame(_focusAnchorClearFrame);\n _focusAnchor = el;\n // Auto-clear if not consumed — prevents stale anchor leaking to unrelated opens.\n // rAF fires after React has committed and painted, giving useFocusTrap time to\n // consume the anchor before it is discarded.\n _focusAnchorClearFrame = requestAnimationFrame(() => {\n _focusAnchor = null;\n _focusAnchorClearFrame = null;\n });\n}\n\n/**\n * Returns (and clears) the focus anchor if one was set, otherwise null.\n * Used internally by useFocusTrap and SidebarOverlay.\n */\nexport function consumeFocusAnchor(): HTMLElement | null {\n if (_focusAnchorClearFrame !== null) {\n cancelAnimationFrame(_focusAnchorClearFrame);\n _focusAnchorClearFrame = null;\n }\n const el = _focusAnchor;\n _focusAnchor = null;\n return el;\n}\n\n/**\n * Resolve the initial focus target based on the initialFocus option.\n */\nfunction resolveInitialFocusTarget(\n container: HTMLElement,\n initialFocus: 'first' | 'container' | 'none' | string | HTMLElement\n): HTMLElement | null {\n if (initialFocus === 'none') return null;\n if (initialFocus === 'first') {\n return getFirstFocusableElement({ container }) || container;\n }\n if (initialFocus === 'container') {\n return container;\n }\n if (typeof initialFocus === 'string') {\n return container.querySelector<HTMLElement>(initialFocus);\n }\n if (initialFocus instanceof HTMLElement) {\n return initialFocus;\n }\n return null;\n}\n\n/**\n * Hook to trap focus within a container (for modals, dialogs, drawers).\n *\n * Implements WCAG 2.1 focus trap pattern:\n * - Moves focus into container on activation\n * - Wraps Tab/Shift+Tab navigation within container\n * - Restores focus to trigger element on deactivation\n * - Safety net: catches focus escaping via other means\n * - Handles autoFocus content: captures trigger before autoFocus fires\n * - Handles {isOpen && <Modal>} pattern: restores focus on unmount\n *\n * Note: For Escape key handling, use `useDismissOnEscape` hook separately.\n * This keeps focus trap (accessibility) separate from Escape handling (UX).\n *\n * @example\n * ```tsx\n * const MyModal = ({ isOpen, onClose }) => {\n * const containerRef = useRef<HTMLDivElement>(null);\n *\n * // Escape handling (UX)\n * useDismissOnEscape({\n * containerRef,\n * onDismiss: onClose,\n * enabled: isOpen\n * });\n *\n * // Focus trap (accessibility)\n * const { triggerRef } = useFocusTrap({\n * enabled: isOpen,\n * containerRef,\n * restoreFocus: true\n * });\n *\n * return (\n * <div ref={containerRef}>\n * <button>First</button>\n * <button>Second</button>\n * </div>\n * );\n * };\n * ```\n */\nexport function useFocusTrap<T extends HTMLElement = HTMLElement>({\n enabled,\n containerRef,\n restoreFocus = true,\n initialFocus = 'first',\n returnFocusRef,\n}: UseFocusTrapOptions<T>): UseFocusTrapReturn {\n const triggerRef = useRef<HTMLElement | null>(null);\n const lastFocusedInContainer = useRef<HTMLElement | null>(null);\n\n // Focus management: save trigger, move focus into container on activate, restore on deactivate\n useLayoutEffect(() => {\n if (!enabled) {\n // Restore focus to trigger when trap deactivates\n if (restoreFocus && triggerRef.current) {\n const el = triggerRef.current;\n triggerRef.current = null;\n requestAnimationFrame(() => {\n if (el.isConnected) el.focus();\n });\n }\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n // Resolve trigger: explicit returnFocusRef wins, then focusAnchor (explicitly set\n // by caller for two-step flows like popover menu → modal), then the pre-commit\n // interaction record, then document.activeElement as final fallback.\n triggerRef.current = returnFocusRef?.current ?? consumeFocusAnchor() ?? _lastInteractedElement ?? (document.activeElement as HTMLElement);\n _lastInteractedElement = null;\n\n // Only move initial focus if autoFocus hasn't already placed it inside the container.\n if (!container.contains(document.activeElement)) {\n requestAnimationFrame(() => {\n resolveInitialFocusTarget(container, initialFocus)?.focus();\n });\n }\n\n // Restore focus on unmount while enabled (covers {isOpen && <Modal>} pattern\n // where the component unmounts before enabled can transition true → false)\n return () => {\n if (restoreFocus && triggerRef.current) {\n const el = triggerRef.current;\n triggerRef.current = null;\n requestAnimationFrame(() => {\n if (el.isConnected) el.focus();\n });\n }\n };\n }, [enabled, containerRef, restoreFocus, initialFocus]);\n\n // Focus trap: Tab wrapping (only when enabled)\n useLayoutEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Tab wrapping\n if (e.key === 'Tab') {\n const focusables = getFocusableElements({ container });\n\n if (focusables.length === 0) {\n e.preventDefault();\n container.focus();\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const activeElement = document.activeElement;\n\n if (e.shiftKey && activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n return () => document.removeEventListener('keydown', handleKeyDown, true);\n }, [enabled, containerRef]);\n\n // Focus trap safety net: catch focus escaping\n useLayoutEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as Node;\n\n if (container.contains(target)) {\n lastFocusedInContainer.current = target as HTMLElement;\n } else {\n // Focus escaped - redirect back\n const fallback = lastFocusedInContainer.current\n || getFirstFocusableElement({ container })\n || container;\n fallback.focus();\n }\n };\n\n document.addEventListener('focusin', handleFocusIn, true);\n return () => document.removeEventListener('focusin', handleFocusIn, true);\n }, [enabled, containerRef]);\n\n return { triggerRef };\n}\n"],"names":["_lastInteractedElement","_onPointerDown","e","path","composedPath","node","HTMLElement","tabIndex","_onKeyDown","key","document","activeElement","addEventListener","consumeLastInteractedElement","el","_focusAnchor","_focusAnchorClearFrame","setFocusAnchor","cancelAnimationFrame","requestAnimationFrame","consumeFocusAnchor","resolveInitialFocusTarget","container","initialFocus","getFirstFocusableElement","querySelector","useFocusTrap","enabled","containerRef","restoreFocus","returnFocusRef","triggerRef","useRef","lastFocusedInContainer","useLayoutEffect","current","isConnected","focus","contains","handleKeyDown","focusables","getFocusableElements","length","preventDefault","first","last","shiftKey","removeEventListener","handleFocusIn","target"],"mappings":";;AA+CA,IAAIA,IAA6C;AAEjD,SAASC,EAAeC,GAAuB;AAE7C,QAAMC,IAAOD,EAAEE,aAAAA;AACf,aAAWC,KAAQF;AACjB,QAAIE,aAAgBC,eAAeD,EAAKE,YAAY,GAAG;AACrDP,MAAAA,IAAyBK;AACzB;AAAA,IACF;AAEJ;AAEA,SAASG,EAAWN,GAAwB;AAE1C,GAAIA,EAAEO,QAAQ,WAAWP,EAAEO,QAAQ,SACjCT,IAAyBU,SAASC;AAEtC;AAEI,OAAOD,WAAa,QACtBA,SAASE,iBAAiB,eAAeX,GAAgB,EAAI,GAC7DS,SAASE,iBAAiB,WAAWJ,GAAY,EAAI;AAQhD,SAASK,IAAmD;AACjE,QAAMC,IAAKd;AACXA,SAAAA,IAAyB,MAClBc;AACT;AAKA,IAAIC,IAAmC,MACnCC,IAA0E;AAQvE,SAASC,EAAeH,GAA8B;AAC3D,EAAIE,MAA2B,QAAME,qBAAqBF,CAAsB,GAChFD,IAAeD,GAIfE,IAAyBG,sBAAsB,MAAM;AACnDJ,IAAAA,IAAe,MACfC,IAAyB;AAAA,EAC3B,CAAC;AACH;AAMO,SAASI,IAAyC;AACvD,EAAIJ,MAA2B,SAC7BE,qBAAqBF,CAAsB,GAC3CA,IAAyB;AAE3B,QAAMF,IAAKC;AACXA,SAAAA,IAAe,MACRD;AACT;AAKA,SAASO,EACPC,GACAC,GACoB;AACpB,SAAIA,MAAiB,SAAe,OAChCA,MAAiB,UACZC,EAAyB;AAAA,IAAEF,WAAAA;AAAAA,EAAAA,CAAW,KAAKA,IAEhDC,MAAiB,cACZD,IAEL,OAAOC,KAAiB,WACnBD,EAAUG,cAA2BF,CAAY,IAEtDA,aAAwBjB,cACnBiB,IAEF;AACT;AA4CO,SAASG,EAAkD;AAAA,EAChEC,SAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,cAAAA,IAAe;AAAA,EACfN,cAAAA,IAAe;AAAA,EACfO,gBAAAA;AACsB,GAAuB;AAC7C,QAAMC,IAAaC,EAA2B,IAAI,GAC5CC,IAAyBD,EAA2B,IAAI;AAG9DE,SAAAA,EAAgB,MAAM;AACpB,QAAI,CAACP,GAAS;AAEZ,UAAIE,KAAgBE,EAAWI,SAAS;AACtC,cAAMrB,IAAKiB,EAAWI;AACtBJ,QAAAA,EAAWI,UAAU,MACrBhB,sBAAsB,MAAM;AAC1B,UAAIL,EAAGsB,eAAatB,EAAGuB,MAAAA;AAAAA,QACzB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAMf,IAAYM,EAAaO;AAC/B,QAAKb;AAKLS,aAAAA,EAAWI,UAAUL,GAAgBK,WAAWf,OAAwBpB,KAA2BU,SAASC,eAC5GX,IAAyB,MAGpBsB,EAAUgB,SAAS5B,SAASC,aAAa,KAC5CQ,sBAAsB,MAAM;AAC1BE,QAAAA,EAA0BC,GAAWC,CAAY,GAAGc,MAAAA;AAAAA,MACtD,CAAC,GAKI,MAAM;AACX,YAAIR,KAAgBE,EAAWI,SAAS;AACtC,gBAAMrB,IAAKiB,EAAWI;AACtBJ,UAAAA,EAAWI,UAAU,MACrBhB,sBAAsB,MAAM;AAC1B,YAAIL,EAAGsB,eAAatB,EAAGuB,MAAAA;AAAAA,UACzB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,EACF,GAAG,CAACV,GAASC,GAAcC,GAAcN,CAAY,CAAC,GAGtDW,EAAgB,MAAM;AACpB,QAAI,CAACP,EAAS;AAEd,UAAML,IAAYM,EAAaO;AAC/B,QAAI,CAACb,EAAW;AAEhB,UAAMiB,IAAgBA,CAACrC,MAAqB;AAE1C,UAAIA,EAAEO,QAAQ,OAAO;AACnB,cAAM+B,IAAaC,EAAqB;AAAA,UAAEnB,WAAAA;AAAAA,QAAAA,CAAW;AAErD,YAAIkB,EAAWE,WAAW,GAAG;AAC3BxC,UAAAA,EAAEyC,eAAAA,GACFrB,EAAUe,MAAAA;AACV;AAAA,QACF;AAEA,cAAMO,IAAQJ,EAAW,CAAC,GACpBK,IAAOL,EAAWA,EAAWE,SAAS,CAAC,GACvC/B,IAAgBD,SAASC;AAE/B,QAAIT,EAAE4C,YAAYnC,MAAkBiC,KAClC1C,EAAEyC,eAAAA,GACFE,EAAKR,MAAAA,KACI,CAACnC,EAAE4C,YAAYnC,MAAkBkC,MAC1C3C,EAAEyC,eAAAA,GACFC,EAAMP,MAAAA;AAAAA,MAEV;AAAA,IACF;AAEA3B,oBAASE,iBAAiB,WAAW2B,GAAe,EAAI,GACjD,MAAM7B,SAASqC,oBAAoB,WAAWR,GAAe,EAAI;AAAA,EAC1E,GAAG,CAACZ,GAASC,CAAY,CAAC,GAG1BM,EAAgB,MAAM;AACpB,QAAI,CAACP,EAAS;AAEd,UAAML,IAAYM,EAAaO;AAC/B,QAAI,CAACb,EAAW;AAEhB,UAAM0B,IAAgBA,CAAC9C,MAAkB;AACvC,YAAM+C,IAAS/C,EAAE+C;AAEjB,MAAI3B,EAAUgB,SAASW,CAAM,IAC3BhB,EAAuBE,UAAUc,KAGhBhB,EAAuBE,WACnCX,EAAyB;AAAA,QAAEF,WAAAA;AAAAA,MAAAA,CAAW,KACtCA,GACIe,MAAAA;AAAAA,IAEb;AAEA3B,oBAASE,iBAAiB,WAAWoC,GAAe,EAAI,GACjD,MAAMtC,SAASqC,oBAAoB,WAAWC,GAAe,EAAI;AAAA,EAC1E,GAAG,CAACrB,GAASC,CAAY,CAAC,GAEnB;AAAA,IAAEG,YAAAA;AAAAA,EAAAA;AACX;"}
package/dist/index73.js CHANGED
@@ -1,5 +1,65 @@
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 { useCallback as c } from "react";
2
+ import { useRovingFocus as d } from "./index70.js";
3
+ const s = (r, t) => `tab${t ? `-${t}` : ""}-${r}`, l = (r, t) => `panel${t ? `-${t}` : ""}-${r}`, C = (r, t) => ({
4
+ id: l(r, t),
5
+ role: "tabpanel",
6
+ "aria-labelledby": s(r, t)
7
+ });
8
+ function R({
9
+ itemIds: r,
10
+ orientation: t = "horizontal",
11
+ activeItem: n,
12
+ idBase: e = "",
13
+ includePanelLinks: a = !0,
14
+ externalPanelId: u
15
+ }) {
16
+ const {
17
+ setFocusedId: f,
18
+ handleKeyDown: p,
19
+ getRovingItemProps: b,
20
+ getContainerProps: g
21
+ } = d({
22
+ itemIds: r,
23
+ defaultFocusedId: n,
24
+ orientation: t,
25
+ loop: !0,
26
+ role: "tablist"
27
+ }), P = c((o) => {
28
+ const {
29
+ ref: $,
30
+ tabIndex: x,
31
+ onFocus: F
32
+ } = b(o), y = n === o;
33
+ return {
34
+ ref: $,
35
+ tabIndex: x,
36
+ onFocus: F,
37
+ id: s(o, e),
38
+ ...a && {
39
+ "aria-controls": u ?? l(o, e)
40
+ },
41
+ "aria-selected": y,
42
+ role: "tab"
43
+ };
44
+ }, [n, b, e, a, u]), T = c((o) => ({
45
+ id: l(o, e),
46
+ role: "tabpanel",
47
+ "aria-labelledby": s(o, e)
48
+ }), [e]);
49
+ return {
50
+ getTabProps: P,
51
+ getPanelProps: T,
52
+ getTabListProps: g,
53
+ setFocusedTabId: f,
54
+ handleKeyDown: p,
55
+ getPanelId: (o) => l(o, e),
56
+ getTabId: (o) => s(o, e)
57
+ };
58
+ }
2
59
  export {
3
- L as default
60
+ l as getPanelId,
61
+ s as getTabId,
62
+ C as getTabPanelProps,
63
+ R as useTabsA11y
4
64
  };
5
65
  //# sourceMappingURL=index73.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index73.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":"index73.js","sources":["../src/utils/a11y/useTabsA11y.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useRovingFocus } from './useRovingFocus';\n\nexport const getTabId = (itemId: string, idBase: string) => {\n const suffix = idBase ? `-${idBase}` : '';\n return `tab${suffix}-${itemId}`;\n};\n\nexport const getPanelId = (itemId: string, idBase: string) => {\n const suffix = idBase ? `-${idBase}` : '';\n return `panel${suffix}-${itemId}`;\n};\n\nexport const getTabPanelProps = (tabId: string, idBase: string) => ({\n id: getPanelId(tabId, idBase),\n role: 'tabpanel' as const,\n 'aria-labelledby': getTabId(tabId, idBase)\n});\n\ninterface UseTabsA11yProps {\n itemIds: string[];\n orientation?: 'horizontal' | 'vertical';\n activeItem: string;\n idBase?: string;\n includePanelLinks?: boolean; // Set to false when consumer manages their own panels externally\n externalPanelId?: string; // When set, all tabs point aria-controls to this single external panel id\n}\n\ninterface TabA11yProps {\n ref: (el: HTMLElement | null) => void;\n tabIndex: number;\n onFocus: () => void;\n id: string;\n 'aria-controls'?: string;\n 'aria-selected': boolean;\n role: 'tab';\n}\n\ninterface PanelA11yProps {\n id: string;\n role: 'tabpanel';\n 'aria-labelledby': string;\n}\n\n/**\n * Hook for managing Tabs (NavigationBar) focus and ARIA props.\n * Handles roving tabindex pattern and generates tab-specific ARIA attributes.\n * \n * @example\n * const itemIds = useMemo(() => navigationItems.map(item => item.id), [navigationItems]);\n * const { getTabProps, setFocusedTabId, handleKeyDown } = useTabsA11y({\n * itemIds,\n * activeNavigationItem: 'tab-1',\n * orientation: 'horizontal',\n * idBase: 'settings'\n * });\n */\nexport function useTabsA11y({\n itemIds,\n orientation = 'horizontal',\n activeItem,\n idBase = '',\n includePanelLinks = true,\n externalPanelId\n}: UseTabsA11yProps) {\n const {\n setFocusedId: setFocusedTabId,\n handleKeyDown,\n getRovingItemProps,\n getContainerProps\n } = useRovingFocus({\n itemIds,\n defaultFocusedId: activeItem,\n orientation,\n loop: true,\n role: 'tablist'\n });\n\n /**\n * Get all props needed for a tab button.\n * Combines roving focus props (ref, tabIndex) with tab-specific ARIA attributes.\n */\n const getTabProps = useCallback((itemId: string): TabA11yProps => {\n const { ref, tabIndex, onFocus } = getRovingItemProps(itemId);\n const isSelected = activeItem === itemId;\n\n return {\n ref,\n tabIndex,\n onFocus,\n id: getTabId(itemId, idBase),\n ...(includePanelLinks && { 'aria-controls': externalPanelId ?? getPanelId(itemId, idBase) }),\n 'aria-selected': isSelected,\n role: 'tab'\n };\n }, [activeItem, getRovingItemProps, idBase, includePanelLinks, externalPanelId]);\n\n /**\n * Get all props needed for a tab panel.\n * Provides ARIA attributes to associate the panel with its tab.\n */\n const getPanelProps = useCallback((itemId: string): PanelA11yProps => {\n return {\n id: getPanelId(itemId, idBase),\n role: 'tabpanel',\n 'aria-labelledby': getTabId(itemId, idBase)\n };\n }, [idBase]);\n\n return {\n getTabProps,\n getPanelProps,\n getTabListProps: getContainerProps,\n setFocusedTabId,\n handleKeyDown,\n getPanelId: (itemId: string) => getPanelId(itemId, idBase),\n getTabId: (itemId: string) => getTabId(itemId, idBase)\n };\n}\n\n"],"names":["useCallback","useRovingFocus","getTabId","itemId","idBase","getPanelId","getTabPanelProps","tabId","id","role","useTabsA11y","itemIds","orientation","activeItem","includePanelLinks","externalPanelId","setFocusedId","setFocusedTabId","handleKeyDown","getRovingItemProps","getContainerProps","defaultFocusedId","loop","getTabProps","ref","tabIndex","onFocus","isSelected","getPanelProps","getTabListProps"],"mappings":"AAGO,SAAA,eAAAA,SAAA;AAAA,SAAA,kBAAAC,SAAA;AAAA,MAAMC,IAAWA,CAACC,GAAgBC,MAEhC,MADQA,IAAS,IAAIA,CAAM,KAAK,EACpB,IAAID,CAAM,IAGlBE,IAAaA,CAACF,GAAgBC,MAElC,QADQA,IAAS,IAAIA,CAAM,KAAK,EAClB,IAAID,CAAM,IAGpBG,IAAmBA,CAACC,GAAeH,OAAoB;AAAA,EAClEI,IAAIH,EAAWE,GAAOH,CAAM;AAAA,EAC5BK,MAAM;AAAA,EACN,mBAAmBP,EAASK,GAAOH,CAAM;AAC3C;AAwCO,SAASM,EAAY;AAAA,EAC1BC,SAAAA;AAAAA,EACAC,aAAAA,IAAc;AAAA,EACdC,YAAAA;AAAAA,EACAT,QAAAA,IAAS;AAAA,EACTU,mBAAAA,IAAoB;AAAA,EACpBC,iBAAAA;AACgB,GAAG;AACnB,QAAM;AAAA,IACJC,cAAcC;AAAAA,IACdC,eAAAA;AAAAA,IACAC,oBAAAA;AAAAA,IACAC,mBAAAA;AAAAA,EAAAA,IACEnB,EAAe;AAAA,IACjBU,SAAAA;AAAAA,IACAU,kBAAkBR;AAAAA,IAClBD,aAAAA;AAAAA,IACAU,MAAM;AAAA,IACNb,MAAM;AAAA,EAAA,CACP,GAMKc,IAAcvB,EAAY,CAACG,MAAiC;AAChE,UAAM;AAAA,MAAEqB,KAAAA;AAAAA,MAAKC,UAAAA;AAAAA,MAAUC,SAAAA;AAAAA,IAAAA,IAAYP,EAAmBhB,CAAM,GACtDwB,IAAad,MAAeV;AAElC,WAAO;AAAA,MACLqB,KAAAA;AAAAA,MACAC,UAAAA;AAAAA,MACAC,SAAAA;AAAAA,MACAlB,IAAIN,EAASC,GAAQC,CAAM;AAAA,MAC3B,GAAIU,KAAqB;AAAA,QAAE,iBAAiBC,KAAmBV,EAAWF,GAAQC,CAAM;AAAA,MAAA;AAAA,MACxF,iBAAiBuB;AAAAA,MACjBlB,MAAM;AAAA,IAAA;AAAA,EAEV,GAAG,CAACI,GAAYM,GAAoBf,GAAQU,GAAmBC,CAAe,CAAC,GAMzEa,IAAgB5B,EAAY,CAACG,OAC1B;AAAA,IACLK,IAAIH,EAAWF,GAAQC,CAAM;AAAA,IAC7BK,MAAM;AAAA,IACN,mBAAmBP,EAASC,GAAQC,CAAM;AAAA,EAAA,IAE3C,CAACA,CAAM,CAAC;AAEX,SAAO;AAAA,IACLmB,aAAAA;AAAAA,IACAK,eAAAA;AAAAA,IACAC,iBAAiBT;AAAAA,IACjBH,iBAAAA;AAAAA,IACAC,eAAAA;AAAAA,IACAb,YAAYA,CAACF,MAAmBE,EAAWF,GAAQC,CAAM;AAAA,IACzDF,UAAUA,CAACC,MAAmBD,EAASC,GAAQC,CAAM;AAAA,EAAA;AAEzD;"}
package/dist/index74.js CHANGED
@@ -1,5 +1,24 @@
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
+ import { useEffect as u } from "react";
2
+ import { getFirstFocusableElement as f } from "./index71.js";
3
+ function s({
4
+ focusRef: r,
5
+ containerRef: t,
6
+ isReady: e,
7
+ shouldFocus: n
8
+ }) {
9
+ u(() => {
10
+ if (e && !(n && !n())) {
11
+ if (r?.current) {
12
+ r.current.focus();
13
+ return;
14
+ }
15
+ t?.current && f({
16
+ container: t.current
17
+ })?.focus();
18
+ }
19
+ }, [e]);
20
+ }
2
21
  export {
3
- C as default
22
+ s as useFocusOnReady
4
23
  };
5
24
  //# sourceMappingURL=index74.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index74.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":"index74.js","sources":["../src/utils/a11y/useFocusOnReady.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\nimport { getFirstFocusableElement } from './focusableElements';\n\nexport interface UseFocusOnReadyOptions {\n /**\n * Specific element to focus. Takes priority over containerRef.\n */\n focusRef?: RefObject<HTMLElement | null>;\n /**\n * Container to search for first focusable element.\n * Used as fallback when focusRef is not provided or its current is null.\n */\n containerRef?: RefObject<HTMLElement | null>;\n /**\n * When this transitions to true, focus is triggered.\n */\n isReady: boolean;\n /**\n * Optional guard for async content — evaluated at the moment isReady becomes true.\n * Return false to skip focusing (e.g. if the user has tabbed away while content was loading).\n * Not needed for synchronous open/close like modals or dropdowns where focus is immediate.\n */\n shouldFocus?: () => boolean;\n}\n\n/**\n * Moves focus to an element when an async condition becomes ready.\n *\n * When `focusRef` is provided, focuses that element directly.\n * When only `containerRef` is provided, finds and focuses the first focusable child.\n * When both are provided, `focusRef` takes priority; `containerRef` is the fallback.\n *\n * @example Focus first focusable in container after loading\n * ```tsx\n * useFocusOnReady({\n * containerRef: panelRef,\n * isReady: !isLoading,\n * shouldFocus: () => document.activeElement === panelRef.current\n * });\n * ```\n *\n * @example Focus a specific element when modal opens\n * ```tsx\n * useFocusOnReady({\n * focusRef: closeButtonRef,\n * isReady: isOpen\n * });\n * ```\n *\n * @example Specific element with container fallback\n * ```tsx\n * useFocusOnReady({\n * focusRef: preferredRef,\n * containerRef: dialogRef,\n * isReady: isOpen\n * });\n * ```\n */\nexport function useFocusOnReady({\n focusRef,\n containerRef,\n isReady,\n shouldFocus\n}: UseFocusOnReadyOptions): void {\n useEffect(() => {\n if (!isReady) return;\n if (shouldFocus && !shouldFocus()) return;\n\n if (focusRef?.current) {\n focusRef.current.focus();\n return;\n }\n\n if (containerRef?.current) {\n const first = getFirstFocusableElement({ container: containerRef.current });\n first?.focus();\n }\n }, [isReady]);\n}\n"],"names":["useEffect","getFirstFocusableElement","useFocusOnReady","focusRef","containerRef","isReady","shouldFocus","current","focus","container"],"mappings":"AA2DO,SAAA,aAAAA,SAAA;AAAA,SAAA,4BAAAC,SAAA;AAAA,SAASC,EAAgB;AAAA,EAC9BC,UAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,aAAAA;AACsB,GAAS;AAC/BN,EAAAA,EAAU,MAAM;AACd,QAAKK,KACDC,EAAAA,KAAe,CAACA,MAEpB;AAAA,UAAIH,GAAUI,SAAS;AACrBJ,QAAAA,EAASI,QAAQC,MAAAA;AACjB;AAAA,MACF;AAEA,MAAIJ,GAAcG,WACFN,EAAyB;AAAA,QAAEQ,WAAWL,EAAaG;AAAAA,MAAAA,CAAS,GACnEC,MAAAA;AAAAA;AAAAA,EAEX,GAAG,CAACH,CAAO,CAAC;AACd;"}
package/dist/index75.js CHANGED
@@ -1,5 +1,8 @@
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
+ const t = () => typeof navigator < "u" && /Android/i.test(navigator.userAgent), o = (i) => {
2
+ const r = "pointerType" in i ? i.pointerType : void 0;
3
+ return r === "" && i.isTrusted ? !0 : t() && r ? i.type === "click" && i.buttons === 1 : i.detail === 0 && !r;
4
+ };
2
5
  export {
3
- e as default
6
+ o as isVirtualClick
4
7
  };
5
8
  //# sourceMappingURL=index75.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index75.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":"index75.js","sources":["../src/utils/virtualClick.ts"],"sourcesContent":["/**\n * Input/virtual click detection helpers.\n */\n\nconst isAndroid = () =>\n typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\nexport const isVirtualClick = (event: MouseEvent | PointerEvent): boolean => {\n const pointerType = 'pointerType' in event ? event.pointerType : undefined;\n\n // JAWS/NVDA with Firefox.\n if (pointerType === '' && event.isTrusted) {\n return true;\n }\n\n // Android TalkBack's detail value varies depending on listener type.\n if (isAndroid() && pointerType) {\n return event.type === 'click' && event.buttons === 1;\n }\n\n // Most browsers: virtual click has detail === 0 and no pointerType.\n return event.detail === 0 && !pointerType;\n};\n\n\n"],"names":["isAndroid","navigator","test","userAgent","isVirtualClick","event","pointerType","undefined","isTrusted","type","buttons","detail"],"mappings":"AAIA,MAAMA,IAAYA,MAChB,OAAOC,YAAc,OAAe,WAAWC,KAAKD,UAAUE,SAAS,GAE5DC,IAAiBA,CAACC,MAA8C;AAC3E,QAAMC,IAAc,iBAAiBD,IAAQA,EAAMC,cAAcC;AAGjE,SAAID,MAAgB,MAAMD,EAAMG,YACvB,KAILR,EAAAA,KAAeM,IACVD,EAAMI,SAAS,WAAWJ,EAAMK,YAAY,IAI9CL,EAAMM,WAAW,KAAK,CAACL;AAChC;"}
package/dist/index76.js CHANGED
@@ -1,5 +1,57 @@
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 { useState as m, useEffect as w, useCallback as b } from "react";
2
+ import { useScrollActiveIntoView as x } from "./index238.js";
3
+ function E({
4
+ items: u,
5
+ isOpen: t,
6
+ onSelect: o,
7
+ onClose: c,
8
+ onOpen: l,
9
+ loop: i = !0,
10
+ disabled: h = !1,
11
+ listboxRef: k,
12
+ optionSelector: g = '[role="option"]'
13
+ }) {
14
+ const [f, a] = m(-1);
15
+ w(() => {
16
+ t || a(-1);
17
+ }, [t]), x({
18
+ containerRef: k,
19
+ activeIndex: f,
20
+ itemSelector: g,
21
+ enabled: t
22
+ });
23
+ const D = b((r) => {
24
+ if (h) {
25
+ r.key === "Escape" && t && (r.preventDefault(), c());
26
+ return;
27
+ }
28
+ const e = u.length;
29
+ switch (r.key) {
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));
32
+ break;
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));
35
+ break;
36
+ case "Enter":
37
+ t && f >= 0 && u[f] && (r.preventDefault(), o(u[f], f), a(-1));
38
+ break;
39
+ case "Escape":
40
+ t && (r.preventDefault(), c(), a(-1));
41
+ break;
42
+ case "Tab":
43
+ t && (c(), a(-1));
44
+ break;
45
+ }
46
+ }, [h, u, t, f, o, c, l, i]), d = b((r, e) => `${r}-option-${e}`, []);
47
+ return {
48
+ highlightedIndex: f,
49
+ setHighlightedIndex: a,
50
+ handleKeyDown: D,
51
+ getOptionId: d
52
+ };
53
+ }
2
54
  export {
3
- L as default
55
+ E as useComboboxNavigation
4
56
  };
5
57
  //# sourceMappingURL=index76.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index76.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":"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,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;AACH,QAAIpB,KAAUQ,KAAoB,KAAKT,EAAMS,CAAgB,MAC3DO,EAAEE,eAAAA,GACFhB,EAASF,EAAMS,CAAgB,GAAGA,CAAgB,GAClDC,EAAoB,EAAE;AAExB;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;"}
package/dist/index77.js CHANGED
@@ -1,5 +1,27 @@
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 * as e from "react";
2
+ function p({
3
+ disabled: t = !1,
4
+ onFocusIn: u,
5
+ onFocusOut: n,
6
+ onEscape: a,
7
+ closeOnEscape: c = !0
8
+ }) {
9
+ const f = e.useCallback((r) => {
10
+ t || u?.();
11
+ }, [t, u]), s = e.useCallback((r) => {
12
+ if (t) return;
13
+ const o = r.relatedTarget;
14
+ o && r.currentTarget.contains(o) || n?.();
15
+ }, [t, n]), C = e.useCallback((r) => {
16
+ t || !c || r.key !== "Escape" || (r.preventDefault(), a?.());
17
+ }, [t, c, a]);
18
+ return {
19
+ onFocusCapture: f,
20
+ onBlurCapture: s,
21
+ onKeyDownCapture: C
22
+ };
23
+ }
2
24
  export {
3
- e as default
25
+ p as useDismissOnFocusOut
4
26
  };
5
27
  //# sourceMappingURL=index77.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index77.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":"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;"}
package/dist/index78.js CHANGED
@@ -1,5 +1,12 @@
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
+ function f({
2
+ ariaLabel: e,
3
+ ariaLabelledBy: i,
4
+ ariaDescribedBy: r
5
+ }) {
6
+ const t = {};
7
+ return i ? t["aria-labelledby"] = i : e && (t["aria-label"] = e), r && (t["aria-describedby"] = r), t;
8
+ }
2
9
  export {
3
- e as default
10
+ f as getA11yNameAttributes
4
11
  };
5
12
  //# sourceMappingURL=index78.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index78.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":"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;"}
package/dist/index8.js CHANGED
@@ -1,93 +1,56 @@
1
- import o from "react";
2
- import { useStableId as k } from "./index192.js";
3
- import { getA11yNameAttributes as A } from "./index71.js";
4
- import { useAccessiblePress as O } from "./index66.js";
5
- import { mergeIds as C } from "./index193.js";
1
+ import t, { useState as u } from "react";
2
+ import { MenuList as d } from "./index18.js";
6
3
  function l() {
7
- return l = Object.assign ? Object.assign.bind() : function(t) {
8
- for (var a = 1; a < arguments.length; a++) {
9
- var e = arguments[a];
10
- for (var r in e) ({}).hasOwnProperty.call(e, r) && (t[r] = e[r]);
4
+ return l = Object.assign ? Object.assign.bind() : function(o) {
5
+ for (var e = 1; e < arguments.length; e++) {
6
+ var n = arguments[e];
7
+ for (var a in n) ({}).hasOwnProperty.call(n, a) && (o[a] = n[a]);
11
8
  }
12
- return t;
9
+ return o;
13
10
  }, l.apply(null, arguments);
14
11
  }
15
- const P = /* @__PURE__ */ o.forwardRef(({
16
- checked: t = !1,
17
- onToggle: a = () => {
18
- },
19
- disabled: e = !1,
20
- label: r,
21
- labelPosition: c = "left",
22
- labelClickable: n = !0,
23
- automationId: s = "toggle",
24
- ariaLabelledBy: i,
25
- ariaDescribedBy: b,
26
- ariaLabel: g,
27
- tabIndex: v = 0
28
- }, h) => {
29
- const u = k(void 0, "toggle-label"), d = () => {
30
- e || a(!t);
31
- }, {
32
- pressProps: y,
33
- tabIndex: x,
34
- role: $
35
- } = O({
36
- disabled: e,
37
- onClick: d,
38
- stopPropagation: n,
39
- isNative: !1,
40
- role: "switch",
41
- tabIndex: v
42
- }), w = A({
43
- ariaLabelledBy: r && !g ? C(u, i) : i,
44
- ariaLabel: g,
45
- ariaDescribedBy: b
46
- }), m = (p, I = !1) => p ? /* @__PURE__ */ o.createElement("label", {
47
- id: u,
48
- className: `select-none ${E[I ? "disabled" : "enabled"]}`,
49
- "data-automation-id": `${s}-label`
50
- }, p) : null, N = {
51
- enabled: "cursor-pointer",
52
- disabled: "cursor-not-allowed"
53
- }, E = {
54
- enabled: `text-[var(--color-gray-700)] ${n ? "cursor-pointer" : ""}`,
55
- disabled: "text-[var(--color-gray-600)] cursor-not-allowed"
56
- }, f = {
57
- checked: ` ${e ? "bg-[var(--color-green-100)]" : "bg-[var(--color-green-400)] hover:bg-[var(--color-green-500)]"}`,
58
- unchecked: ` ${e ? "bg-[var(--color-gray-400)]" : "bg-[var(--color-gray-600)] hover:bg-[var(--color-gray-650)]"}`,
59
- enabled: " cursor-pointer",
60
- disabled: " cursor-not-allowed"
12
+ const g = (o) => {
13
+ const {
14
+ label: e,
15
+ onDropdownClick: n = () => {
16
+ },
17
+ menuItems: a = [],
18
+ automationId: s = "",
19
+ ...i
20
+ } = o, [r, m] = u(!1), c = () => {
21
+ m(!r), n();
61
22
  };
62
- return /* @__PURE__ */ o.createElement("div", {
63
- className: `se-design-toggle flex items-center gap-1 ${N[e ? "disabled" : "enabled"]}`,
64
- onClick: n ? d : void 0,
65
- "data-automation-id": `${s}-container`
66
- }, r && c === "left" && m(r, e), /* @__PURE__ */ o.createElement("div", l({
67
- ref: h,
68
- role: $,
69
- tabIndex: x,
70
- "aria-checked": t
71
- }, w, y, {
72
- className: `toggle-btn focus-outline block w-8 h-4 p-0.5 rounded-full transition ease-in-out
73
- ${f[t ? "checked" : "unchecked"]}
74
- ${f[e ? "disabled" : "enabled"]}
75
- `,
76
- "data-automation-id": `${s}-button`
77
- }), /* @__PURE__ */ o.createElement("input", {
78
- className: "opacity-0 hidden",
79
- type: "checkbox",
80
- checked: t,
81
- readOnly: !0,
82
- disabled: e,
83
- tabIndex: -1
84
- }), /* @__PURE__ */ o.createElement("span", {
85
- className: `block w-3 h-3 rounded-full bg-[var(--color-white)]
86
- transform transition-transform ${t ? "translate-x-4" : ""}`
87
- })), r && c === "right" && m(r, e));
88
- });
89
- P.displayName = "Toggle";
23
+ return /* @__PURE__ */ t.createElement("div", {
24
+ className: "se-design-split-button flex items-center relative",
25
+ "data-automation-id": s
26
+ }, /* @__PURE__ */ t.createElement("button", l({
27
+ type: "button",
28
+ 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)]"
29
+ }, i), e), /* @__PURE__ */ t.createElement("button", {
30
+ type: "button",
31
+ className: "bg-[var(--color-blue-500)] rounded-r",
32
+ onClick: c,
33
+ "data-automation-id": "split-button-dropdown-button"
34
+ }, /* @__PURE__ */ t.createElement("svg", {
35
+ className: `${r ? "rotate-180" : ""} transition-all`,
36
+ width: "35",
37
+ height: "40",
38
+ viewBox: "0 0 35 40",
39
+ fill: "none",
40
+ xmlns: "http://www.w3.org/2000/svg"
41
+ }, /* @__PURE__ */ t.createElement("path", {
42
+ d: "M0 0H32C33.6569 0 35 1.34315 35 3V37C35 38.6569 33.6569 40 32 40H0V0Z",
43
+ fill: "transparent"
44
+ }), /* @__PURE__ */ t.createElement("path", {
45
+ d: "M18 23.5L14 19.5L22 19.5L18 23.5Z",
46
+ fill: "white"
47
+ }))), r && /* @__PURE__ */ t.createElement("div", {
48
+ className: "absolute top-full mt-1 w-max"
49
+ }, /* @__PURE__ */ t.createElement(d, {
50
+ items: a
51
+ })));
52
+ };
90
53
  export {
91
- P as Toggle
54
+ g as SplitButton
92
55
  };
93
56
  //# sourceMappingURL=index8.js.map