se-design 1.0.80 → 1.0.81-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 (393) 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.map +1 -1
  13. package/dist/index101.js.map +1 -1
  14. package/dist/index102.js.map +1 -1
  15. package/dist/index103.js.map +1 -1
  16. package/dist/index104.js.map +1 -1
  17. package/dist/index105.js.map +1 -1
  18. package/dist/index106.js.map +1 -1
  19. package/dist/index107.js.map +1 -1
  20. package/dist/index108.js.map +1 -1
  21. package/dist/index109.js.map +1 -1
  22. package/dist/index11.js +44 -43
  23. package/dist/index11.js.map +1 -1
  24. package/dist/index110.js.map +1 -1
  25. package/dist/index111.js.map +1 -1
  26. package/dist/index112.js.map +1 -1
  27. package/dist/index113.js.map +1 -1
  28. package/dist/index114.js.map +1 -1
  29. package/dist/index115.js.map +1 -1
  30. package/dist/index116.js.map +1 -1
  31. package/dist/index117.js.map +1 -1
  32. package/dist/index118.js.map +1 -1
  33. package/dist/index119.js.map +1 -1
  34. package/dist/index12.js +38 -31
  35. package/dist/index12.js.map +1 -1
  36. package/dist/index120.js +2 -2
  37. package/dist/index120.js.map +1 -1
  38. package/dist/index121.js +1 -1
  39. package/dist/index121.js.map +1 -1
  40. package/dist/index122.js +2 -2
  41. package/dist/index122.js.map +1 -1
  42. package/dist/index123.js +2 -2
  43. package/dist/index123.js.map +1 -1
  44. package/dist/index124.js +1 -1
  45. package/dist/index124.js.map +1 -1
  46. package/dist/index125.js +2 -2
  47. package/dist/index125.js.map +1 -1
  48. package/dist/index126.js +2 -2
  49. package/dist/index126.js.map +1 -1
  50. package/dist/index127.js +1 -1
  51. package/dist/index127.js.map +1 -1
  52. package/dist/index128.js +1 -1
  53. package/dist/index128.js.map +1 -1
  54. package/dist/index129.js +1 -1
  55. package/dist/index129.js.map +1 -1
  56. package/dist/index13.js +20 -19
  57. package/dist/index13.js.map +1 -1
  58. package/dist/index130.js +2 -2
  59. package/dist/index130.js.map +1 -1
  60. package/dist/index131.js +2 -2
  61. package/dist/index131.js.map +1 -1
  62. package/dist/index132.js +2 -2
  63. package/dist/index132.js.map +1 -1
  64. package/dist/index133.js +1 -1
  65. package/dist/index133.js.map +1 -1
  66. package/dist/index134.js +1 -1
  67. package/dist/index134.js.map +1 -1
  68. package/dist/index135.js +1 -1
  69. package/dist/index135.js.map +1 -1
  70. package/dist/index136.js +1 -1
  71. package/dist/index136.js.map +1 -1
  72. package/dist/index137.js +1 -1
  73. package/dist/index137.js.map +1 -1
  74. package/dist/index138.js +1 -1
  75. package/dist/index138.js.map +1 -1
  76. package/dist/index139.js +1 -1
  77. package/dist/index139.js.map +1 -1
  78. package/dist/index14.js.map +1 -1
  79. package/dist/index140.js +1 -1
  80. package/dist/index140.js.map +1 -1
  81. package/dist/index141.js +2 -2
  82. package/dist/index141.js.map +1 -1
  83. package/dist/index142.js +2 -2
  84. package/dist/index142.js.map +1 -1
  85. package/dist/index143.js +1 -1
  86. package/dist/index143.js.map +1 -1
  87. package/dist/index144.js +1 -1
  88. package/dist/index144.js.map +1 -1
  89. package/dist/index145.js +1 -1
  90. package/dist/index145.js.map +1 -1
  91. package/dist/index146.js +1 -1
  92. package/dist/index146.js.map +1 -1
  93. package/dist/index147.js +1 -1
  94. package/dist/index147.js.map +1 -1
  95. package/dist/index148.js +1 -1
  96. package/dist/index148.js.map +1 -1
  97. package/dist/index149.js +1 -1
  98. package/dist/index149.js.map +1 -1
  99. package/dist/index150.js +2 -2
  100. package/dist/index150.js.map +1 -1
  101. package/dist/index151.js +1 -1
  102. package/dist/index151.js.map +1 -1
  103. package/dist/index152.js +2 -2
  104. package/dist/index152.js.map +1 -1
  105. package/dist/index153.js +2 -2
  106. package/dist/index153.js.map +1 -1
  107. package/dist/index154.js +2 -2
  108. package/dist/index154.js.map +1 -1
  109. package/dist/index155.js +2 -2
  110. package/dist/index155.js.map +1 -1
  111. package/dist/index156.js +1 -1
  112. package/dist/index156.js.map +1 -1
  113. package/dist/index157.js +1 -1
  114. package/dist/index157.js.map +1 -1
  115. package/dist/index158.js +1 -1
  116. package/dist/index158.js.map +1 -1
  117. package/dist/index159.js +1 -1
  118. package/dist/index159.js.map +1 -1
  119. package/dist/index16.js +1 -1
  120. package/dist/index16.js.map +1 -1
  121. package/dist/index160.js +1 -1
  122. package/dist/index160.js.map +1 -1
  123. package/dist/index161.js +1 -1
  124. package/dist/index161.js.map +1 -1
  125. package/dist/index162.js +1 -1
  126. package/dist/index162.js.map +1 -1
  127. package/dist/index163.js +1 -1
  128. package/dist/index163.js.map +1 -1
  129. package/dist/index164.js +1 -1
  130. package/dist/index164.js.map +1 -1
  131. package/dist/index165.js +1 -1
  132. package/dist/index165.js.map +1 -1
  133. package/dist/index166.js +1 -1
  134. package/dist/index166.js.map +1 -1
  135. package/dist/index167.js +1 -1
  136. package/dist/index167.js.map +1 -1
  137. package/dist/index168.js +1 -1
  138. package/dist/index168.js.map +1 -1
  139. package/dist/index169.js +1 -1
  140. package/dist/index169.js.map +1 -1
  141. package/dist/index17.js.map +1 -1
  142. package/dist/index170.js +1 -1
  143. package/dist/index170.js.map +1 -1
  144. package/dist/index171.js +1 -1
  145. package/dist/index171.js.map +1 -1
  146. package/dist/index172.js +1 -1
  147. package/dist/index172.js.map +1 -1
  148. package/dist/index173.js +1 -1
  149. package/dist/index173.js.map +1 -1
  150. package/dist/index174.js +1 -1
  151. package/dist/index174.js.map +1 -1
  152. package/dist/index175.js +1 -1
  153. package/dist/index175.js.map +1 -1
  154. package/dist/index176.js +1 -1
  155. package/dist/index176.js.map +1 -1
  156. package/dist/index177.js +1 -1
  157. package/dist/index177.js.map +1 -1
  158. package/dist/index178.js +1 -1
  159. package/dist/index178.js.map +1 -1
  160. package/dist/index179.js +1 -1
  161. package/dist/index179.js.map +1 -1
  162. package/dist/index18.js.map +1 -1
  163. package/dist/index180.js +2 -2
  164. package/dist/index180.js.map +1 -1
  165. package/dist/index181.js +2 -2
  166. package/dist/index181.js.map +1 -1
  167. package/dist/index182.js +1 -1
  168. package/dist/index182.js.map +1 -1
  169. package/dist/index183.js +1 -1
  170. package/dist/index183.js.map +1 -1
  171. package/dist/index184.js +2 -2
  172. package/dist/index184.js.map +1 -1
  173. package/dist/index185.js +2 -2
  174. package/dist/index185.js.map +1 -1
  175. package/dist/index186.js +1 -1
  176. package/dist/index186.js.map +1 -1
  177. package/dist/index187.js +1 -1
  178. package/dist/index187.js.map +1 -1
  179. package/dist/index188.js +1 -1
  180. package/dist/index188.js.map +1 -1
  181. package/dist/index189.js +1 -1
  182. package/dist/index189.js.map +1 -1
  183. package/dist/index19.js +185 -163
  184. package/dist/index19.js.map +1 -1
  185. package/dist/index190.js +1 -1
  186. package/dist/index190.js.map +1 -1
  187. package/dist/index191.js +1 -1
  188. package/dist/index191.js.map +1 -1
  189. package/dist/index192.js +1 -1
  190. package/dist/index192.js.map +1 -1
  191. package/dist/index193.js +1 -1
  192. package/dist/index193.js.map +1 -1
  193. package/dist/index194.js +2 -2
  194. package/dist/index194.js.map +1 -1
  195. package/dist/index195.js +1 -1
  196. package/dist/index195.js.map +1 -1
  197. package/dist/index196.js +2 -2
  198. package/dist/index196.js.map +1 -1
  199. package/dist/index197.js +2 -149
  200. package/dist/index197.js.map +1 -1
  201. package/dist/index198.js +2 -9
  202. package/dist/index198.js.map +1 -1
  203. package/dist/index199.js +149 -6
  204. package/dist/index199.js.map +1 -1
  205. package/dist/index20.js.map +1 -1
  206. package/dist/index200.js +8 -4
  207. package/dist/index200.js.map +1 -1
  208. package/dist/index201.js +5 -39
  209. package/dist/index201.js.map +1 -1
  210. package/dist/index202.js +8 -0
  211. package/dist/index202.js.map +1 -0
  212. package/dist/index203.js +45 -0
  213. package/dist/index203.js.map +1 -0
  214. package/dist/index204.js +24 -0
  215. package/dist/index204.js.map +1 -0
  216. package/dist/index21.js.map +1 -1
  217. package/dist/{index208.js → index211.js} +1 -1
  218. package/dist/index211.js.map +1 -0
  219. package/dist/{index209.js → index212.js} +1 -1
  220. package/dist/{index209.js.map → index212.js.map} +1 -1
  221. package/dist/index22.js.map +1 -1
  222. package/dist/{index217.js → index220.js} +1 -1
  223. package/dist/{index217.js.map → index220.js.map} +1 -1
  224. package/dist/index228.js +1233 -43
  225. package/dist/index228.js.map +1 -1
  226. package/dist/index23.js +30 -28
  227. package/dist/index23.js.map +1 -1
  228. package/dist/index231.js +46 -0
  229. package/dist/index231.js.map +1 -0
  230. package/dist/index24.js.map +1 -1
  231. package/dist/index240.js +167 -16
  232. package/dist/index240.js.map +1 -1
  233. package/dist/index241.js +3 -9
  234. package/dist/index241.js.map +1 -1
  235. package/dist/index243.js +18 -4
  236. package/dist/index243.js.map +1 -1
  237. package/dist/index244.js +9 -169
  238. package/dist/index244.js.map +1 -1
  239. package/dist/index245.js +10 -11
  240. package/dist/index245.js.map +1 -1
  241. package/dist/index246.js +4 -5
  242. package/dist/index246.js.map +1 -1
  243. package/dist/index247.js +170 -6
  244. package/dist/index247.js.map +1 -1
  245. package/dist/index248.js +11 -38
  246. package/dist/index248.js.map +1 -1
  247. package/dist/index249.js +6 -2
  248. package/dist/index249.js.map +1 -1
  249. package/dist/index25.js +259 -236
  250. package/dist/index25.js.map +1 -1
  251. package/dist/index250.js +5 -7
  252. package/dist/index250.js.map +1 -1
  253. package/dist/index251.js +36 -325
  254. package/dist/index251.js.map +1 -1
  255. package/dist/index252.js +2 -50
  256. package/dist/index252.js.map +1 -1
  257. package/dist/index253.js +8 -2
  258. package/dist/index253.js.map +1 -1
  259. package/dist/index254.js +323 -72
  260. package/dist/index254.js.map +1 -1
  261. package/dist/index255.js +47 -90
  262. package/dist/index255.js.map +1 -1
  263. package/dist/index256.js +2 -52
  264. package/dist/index256.js.map +1 -1
  265. package/dist/index257.js +75 -7
  266. package/dist/index257.js.map +1 -1
  267. package/dist/index258.js +92 -4
  268. package/dist/index258.js.map +1 -1
  269. package/dist/index259.js +48 -48
  270. package/dist/index259.js.map +1 -1
  271. package/dist/index26.js.map +1 -1
  272. package/dist/index260.js +8 -2
  273. package/dist/index260.js.map +1 -1
  274. package/dist/index261.js +5 -2
  275. package/dist/index261.js.map +1 -1
  276. package/dist/index262.js +55 -0
  277. package/dist/index262.js.map +1 -0
  278. package/dist/index263.js +5 -0
  279. package/dist/index263.js.map +1 -0
  280. package/dist/index264.js +5 -0
  281. package/dist/index264.js.map +1 -0
  282. package/dist/index27.js.map +1 -1
  283. package/dist/index28.js +3 -3
  284. package/dist/index28.js.map +1 -1
  285. package/dist/index29.js +43 -41
  286. package/dist/index29.js.map +1 -1
  287. package/dist/index3.js.map +1 -1
  288. package/dist/index30.js +81 -79
  289. package/dist/index30.js.map +1 -1
  290. package/dist/index31.js.map +1 -1
  291. package/dist/index32.js.map +1 -1
  292. package/dist/index33.js +18 -16
  293. package/dist/index33.js.map +1 -1
  294. package/dist/index34.js.map +1 -1
  295. package/dist/index35.js +1 -1
  296. package/dist/index35.js.map +1 -1
  297. package/dist/index36.js +1 -1
  298. package/dist/index36.js.map +1 -1
  299. package/dist/index37.js.map +1 -1
  300. package/dist/index38.js +1 -1
  301. package/dist/index38.js.map +1 -1
  302. package/dist/index39.js +2 -2
  303. package/dist/index39.js.map +1 -1
  304. package/dist/index4.js.map +1 -1
  305. package/dist/index40.js +1 -1
  306. package/dist/index40.js.map +1 -1
  307. package/dist/index41.js.map +1 -1
  308. package/dist/index42.js.map +1 -1
  309. package/dist/index43.js.map +1 -1
  310. package/dist/index44.js +3 -3
  311. package/dist/index44.js.map +1 -1
  312. package/dist/index45.js +1 -1
  313. package/dist/index45.js.map +1 -1
  314. package/dist/index46.js +2 -2
  315. package/dist/index46.js.map +1 -1
  316. package/dist/index47.js.map +1 -1
  317. package/dist/index48.js.map +1 -1
  318. package/dist/index49.js +1 -1
  319. package/dist/index49.js.map +1 -1
  320. package/dist/index5.js.map +1 -1
  321. package/dist/index50.js.map +1 -1
  322. package/dist/index51.js +183 -175
  323. package/dist/index51.js.map +1 -1
  324. package/dist/index52.js +1 -1
  325. package/dist/index52.js.map +1 -1
  326. package/dist/index53.js +1 -1
  327. package/dist/index53.js.map +1 -1
  328. package/dist/index54.js.map +1 -1
  329. package/dist/index55.js.map +1 -1
  330. package/dist/index56.js.map +1 -1
  331. package/dist/index57.js +1 -1
  332. package/dist/index57.js.map +1 -1
  333. package/dist/index58.js.map +1 -1
  334. package/dist/index59.js.map +1 -1
  335. package/dist/index6.js +148 -144
  336. package/dist/index6.js.map +1 -1
  337. package/dist/index60.js.map +1 -1
  338. package/dist/index61.js.map +1 -1
  339. package/dist/index62.js.map +1 -1
  340. package/dist/index63.js +1 -1
  341. package/dist/index63.js.map +1 -1
  342. package/dist/index64.js.map +1 -1
  343. package/dist/index65.js +1 -1
  344. package/dist/index65.js.map +1 -1
  345. package/dist/index67.js.map +1 -1
  346. package/dist/index68.js.map +1 -1
  347. package/dist/index69.js.map +1 -1
  348. package/dist/index7.js +1 -1
  349. package/dist/index7.js.map +1 -1
  350. package/dist/index70.js.map +1 -1
  351. package/dist/index71.js.map +1 -1
  352. package/dist/index72.js +34 -33
  353. package/dist/index72.js.map +1 -1
  354. package/dist/index73.js.map +1 -1
  355. package/dist/index74.js.map +1 -1
  356. package/dist/index75.js.map +1 -1
  357. package/dist/index76.js +21 -21
  358. package/dist/index76.js.map +1 -1
  359. package/dist/index77.js.map +1 -1
  360. package/dist/index78.js.map +1 -1
  361. package/dist/index8.js.map +1 -1
  362. package/dist/index80.js.map +1 -1
  363. package/dist/index81.js.map +1 -1
  364. package/dist/index82.js.map +1 -1
  365. package/dist/index83.js.map +1 -1
  366. package/dist/index84.js.map +1 -1
  367. package/dist/index85.js.map +1 -1
  368. package/dist/index86.js.map +1 -1
  369. package/dist/index87.js.map +1 -1
  370. package/dist/index88.js.map +1 -1
  371. package/dist/index89.js.map +1 -1
  372. package/dist/index9.js +28 -26
  373. package/dist/index9.js.map +1 -1
  374. package/dist/index90.js.map +1 -1
  375. package/dist/index91.js.map +1 -1
  376. package/dist/index92.js.map +1 -1
  377. package/dist/index93.js.map +1 -1
  378. package/dist/index94.js.map +1 -1
  379. package/dist/index95.js.map +1 -1
  380. package/dist/index96.js.map +1 -1
  381. package/dist/index97.js.map +1 -1
  382. package/dist/index98.js.map +1 -1
  383. package/dist/index99.js.map +1 -1
  384. package/package.json +1 -1
  385. package/dist/index208.js.map +0 -1
  386. package/dist/index225.js +0 -1236
  387. package/dist/index225.js.map +0 -1
  388. package/dist/index237.js +0 -176
  389. package/dist/index237.js.map +0 -1
  390. package/dist/index238.js +0 -7
  391. package/dist/index238.js.map +0 -1
  392. package/dist/index242.js +0 -13
  393. package/dist/index242.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index201.js","sources":["../src/utils/a11y/useModalA11y.ts"],"sourcesContent":["import { useRef } 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\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}: 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 });\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","containerRef","titleId","undefined","enabled","restoreFocus","dialogProps","role","tabIndex","nameAttrs"],"mappings":"AAyGO,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;AACI,GAAuB;AACpCC,QAAAA,IAAeZ,EAAuB,IAAI,GAC1Ca,IAAUT,EAAYU,QAAWJ,CAAa;AAEvC,EAAAT,EAAA;AAAA,IACXc,SAAST;AAAAA,IACTM,cAAAA;AAAAA,IACAI,cAAc;AAAA,IACdL,cAAAA;AAAAA,EAAAA,CACD,GAEkBT,EAAA;AAAA,IACjBU,cAAAA;AAAAA,IACAL,WAAAA;AAAAA,IACAQ,SAAST;AAAAA,EAAAA,CACV;AAOD,QAAMW,IAAc;AAAA,IAClBC,MAAM;AAAA,IACN,cAAc;AAAA,IACdC,UAAU;AAAA,IACV,GATgBhB,EAAsB;AAAA,MACtCM,gBAAgBA,MAAmBD,IAAYM,SAAYD;AAAAA,MAC3DL,WAAAA;AAAAA,IAAAA,CACD;AAAA,EAMIY;AAGE,SAAA;AAAA,IAAER,cAAAA;AAAAA,IAAcC,SAAAA;AAAAA,IAASI,aAAAA;AAAAA,EAAAA;AAClC;"}
1
+ {"version":3,"file":"index201.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;"}
@@ -0,0 +1,8 @@
1
+ function o(...n) {
2
+ const t = [...new Set(n.filter((e) => !!e).flatMap((e) => e.trim().split(/\s+/)).filter(Boolean))];
3
+ return t.length > 0 ? t.join(" ") : void 0;
4
+ }
5
+ export {
6
+ o as mergeIds
7
+ };
8
+ //# sourceMappingURL=index202.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index202.js","sources":["../src/utils/mergeIds.ts"],"sourcesContent":["/**\n * Merges multiple ID strings into a single space-separated string.\n * Filters out falsy values and deduplicates IDs while preserving order.\n * \n * Useful for ARIA attributes (aria-describedby, aria-labelledby) and class names.\n * \n * @param ids - Array of id strings (or undefined/null)\n * @returns Merged space-separated id string, or undefined if no valid ids\n * \n * @example\n * mergeIds('error-1', undefined, 'helper-1', 'error-1')\n * // Returns: 'error-1 helper-1'\n */\nexport function mergeIds(...ids: (string | undefined | null)[]): string | undefined {\n const uniqueIds = [\n ...new Set(\n ids\n .filter((id): id is string => Boolean(id))\n .flatMap(id => id.trim().split(/\\s+/))\n .filter(Boolean)\n )\n ];\n \n return uniqueIds.length > 0 ? uniqueIds.join(' ') : undefined;\n}\n"],"names":["mergeIds","ids","uniqueIds","Set","filter","id","Boolean","flatMap","trim","split","length","join","undefined"],"mappings":"AAaO,SAASA,KAAYC,GAAwD;AAClF,QAAMC,IAAY,CAChB,GAAG,IAAIC,IACLF,EACGG,OAAO,CAACC,MAAqBC,EAAQD,CAAG,EACxCE,QAAQF,CAAAA,MAAMA,EAAGG,OAAOC,MAAM,KAAK,CAAC,EACpCL,OAAOE,OAAO,CACnB,CAAC;AAGH,SAAOJ,EAAUQ,SAAS,IAAIR,EAAUS,KAAK,GAAG,IAAIC;AACtD;"}
@@ -0,0 +1,45 @@
1
+ import { useRef as d } from "react";
2
+ import { useFocusTrap as u } from "./index72.js";
3
+ import { useDismissOnEscape as c } from "./index211.js";
4
+ import { getA11yNameAttributes as f } from "./index78.js";
5
+ import { useStableId as p } from "./index201.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
+ }
42
+ export {
43
+ x as useModalA11y
44
+ };
45
+ //# sourceMappingURL=index203.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index203.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;"}
@@ -0,0 +1,24 @@
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
+ }
19
+ export {
20
+ f as FocusTrapPortalContext,
21
+ l as useFocusTrapPortalRegistry,
22
+ p as useRegisterPortalWithFocusTrap
23
+ };
24
+ //# sourceMappingURL=index204.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index204.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;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index21.js","sources":["../src/components/HamburgerMenu/index.tsx"],"sourcesContent":["import React, { FC } from 'react';\n\nimport { Popover } from 'src/components/Popover';\nimport { Icon } from 'src/components/Icon';\nexport interface HamburgerMenuProps {\n className?: string;\n automationId?: string;\n popoverContentAutomationId?: string;\n menuContent?: (data: any) => React.ReactNode;\n popoverClassName?: string;\n}\n\nconst menuClasses = {\n base: 'se-design-hamburger-menu rounded-[6px] transition-all duration-300 p-[3px] flex items-center',\n active: 'bg-[var(--color-blue-450)]',\n hover: 'hover:bg-[var(--color-blue-450)]'\n};\n\nexport const HamburgerMenu: FC<HamburgerMenuProps> = ({\n className = '',\n automationId = '',\n popoverContentAutomationId = '',\n menuContent,\n popoverClassName = ''\n}) => {\n\n return (\n <Popover\n className={className}\n position='bottom-left'\n automationId={automationId}\n popoverContentAutomationId={popoverContentAutomationId}\n renderPopoverSrcElement={({ displayPopover }) => (\n <div className={`${menuClasses.base} ${displayPopover ? menuClasses.active : ''} ${menuClasses.hover}`}>\n <Icon name='hamburger' stroke={'var(--color-white)'} />\n </div>\n )}\n renderPopoverContents={(data) => (\n <div className={`min-w-[212px] ${popoverClassName}`}>\n {menuContent && <div className='menu-content'>{menuContent(data)}</div>}\n </div>\n )}\n />\n );\n};\n"],"names":["React__default","Popover","Icon","menuClasses","base","active","hover","HamburgerMenu","className","automationId","popoverContentAutomationId","menuContent","popoverClassName","React","createElement","position","renderPopoverSrcElement","displayPopover","name","stroke","renderPopoverContents","data"],"mappings":"AAYA,OAAAA,OAAA;AAAA,SAAA,WAAAC,SAAA;AAAA,SAAA,QAAAC,SAAA;AAAA,MAAMC,IAAc;AAAA,EAClBC,MAAM;AAAA,EACNC,QAAQ;AAAA,EACRC,OAAO;AACT,GAEaC,IAAwCA,CAAC;AAAA,EACpDC,WAAAA,IAAY;AAAA,EACZC,cAAAA,IAAe;AAAA,EACfC,4BAAAA,IAA6B;AAAA,EAC7BC,aAAAA;AAAAA,EACAC,kBAAAA,IAAmB;AACrB,MAGIC,gBAAAA,EAAAC,cAACb,GAAO;AAAA,EACNO,WAAAA;AAAAA,EACAO,UAAS;AAAA,EACTN,cAAAA;AAAAA,EACAC,4BAAAA;AAAAA,EACAM,yBAAyBA,CAAC;AAAA,IAAEC,gBAAAA;AAAAA,EAAAA,MAC1BH,gBAAAA,EAAAA,cAAA,OAAA;AAAA,IAAKN,WAAW,GAAGL,EAAYC,IAAI,IAAIa,IAAiBd,EAAYE,SAAS,EAAE,IAAIF,EAAYG,KAAK;AAAA,EAAA,GAClGQ,gBAAAA,EAAAA,cAACZ,GAAI;AAAA,IAACgB,MAAK;AAAA,IAAYC,QAAQ;AAAA,EAAA,CAAuB,CACnD;AAAA,EAEPC,uBAAwBC,CAAAA,MACtBP,gBAAAA,EAAAA,cAAA,OAAA;AAAA,IAAKN,WAAW,iBAAiBI,CAAgB;AAAA,EAC9CD,GAAAA,KAAeG,gBAAAA,EAAAA,cAAA,OAAA;AAAA,IAAKN,WAAU;AAAA,EAAA,GAAgBG,EAAYU,CAAI,CAAO,CACnE;AAAA,CAER;"}
1
+ {"version":3,"file":"index21.js","sources":["../src/components/HamburgerMenu/index.tsx"],"sourcesContent":["import React, { FC } from 'react';\n\nimport { Popover } from 'src/components/Popover';\nimport { Icon } from 'src/components/Icon';\nexport interface HamburgerMenuProps {\n className?: string;\n automationId?: string;\n popoverContentAutomationId?: string;\n menuContent?: (data: any) => React.ReactNode;\n popoverClassName?: string;\n}\n\nconst menuClasses = {\n base: 'se-design-hamburger-menu rounded-[6px] transition-all duration-300 p-[3px] flex items-center',\n active: 'bg-[var(--color-blue-450)]',\n hover: 'hover:bg-[var(--color-blue-450)]'\n};\n\nexport const HamburgerMenu: FC<HamburgerMenuProps> = ({\n className = '',\n automationId = '',\n popoverContentAutomationId = '',\n menuContent,\n popoverClassName = ''\n}) => {\n\n return (\n <Popover\n className={className}\n position='bottom-left'\n automationId={automationId}\n popoverContentAutomationId={popoverContentAutomationId}\n renderPopoverSrcElement={({ displayPopover }) => (\n <div className={`${menuClasses.base} ${displayPopover ? menuClasses.active : ''} ${menuClasses.hover}`}>\n <Icon name='hamburger' stroke={'var(--color-white)'} />\n </div>\n )}\n renderPopoverContents={(data) => (\n <div className={`min-w-[212px] ${popoverClassName}`}>\n {menuContent && <div className='menu-content'>{menuContent(data)}</div>}\n </div>\n )}\n />\n );\n};\n"],"names":["React__default","Popover","Icon","menuClasses","base","active","hover","HamburgerMenu","className","automationId","popoverContentAutomationId","menuContent","popoverClassName","React","createElement","position","renderPopoverSrcElement","displayPopover","name","stroke","renderPopoverContents","data"],"mappings":"AAYA,OAAAA,OAAA;AAAA,SAAA,WAAAC,SAAA;AAAA,SAAA,QAAAC,SAAA;AAAA,MAAMC,IAAc;AAAA,EAClBC,MAAM;AAAA,EACNC,QAAQ;AAAA,EACRC,OAAO;AACT,GAEaC,IAAwCA,CAAC;AAAA,EACpDC,WAAAA,IAAY;AAAA,EACZC,cAAAA,IAAe;AAAA,EACfC,4BAAAA,IAA6B;AAAA,EAC7BC,aAAAA;AAAAA,EACAC,kBAAAA,IAAmB;AACrB,MAGIC,gBAAAA,EAAAC,cAACb,GAAO;AAAA,EACNO,WAAAA;AAAAA,EACAO,UAAS;AAAA,EACTN,cAAAA;AAAAA,EACAC,4BAAAA;AAAAA,EACAM,yBAAyBA,CAAC;AAAA,IAAEC,gBAAAA;AAAAA,EAAAA,MAC1BJ,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKN,WAAW,GAAGL,EAAYC,IAAI,IAAIa,IAAiBd,EAAYE,SAAS,EAAE,IAAIF,EAAYG,KAAK;AAAA,EAAA,GAClGO,gBAAAA,EAAAC,cAACZ,GAAI;AAAA,IAACgB,MAAK;AAAA,IAAYC,QAAQ;AAAA,EAAA,CAAuB,CACnD;AAAA,EAEPC,uBAAwBC,CAAAA,MACtBR,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKN,WAAW,iBAAiBI,CAAgB;AAAA,EAAA,GAC9CD,KAAeE,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKN,WAAU;AAAA,EAAA,GAAgBG,EAAYU,CAAI,CAAO,CACnE;AAAA,CAER;"}
@@ -23,4 +23,4 @@ function p({
23
23
  export {
24
24
  p as useDismissOnEscape
25
25
  };
26
- //# sourceMappingURL=index208.js.map
26
+ //# sourceMappingURL=index211.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index211.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;"}
@@ -68,4 +68,4 @@ function T({
68
68
  export {
69
69
  T as useFocusSentinel
70
70
  };
71
- //# sourceMappingURL=index209.js.map
71
+ //# sourceMappingURL=index212.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index209.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","first","container","focus","cancelAnimationFrame","isConnected","startSentinelProps","ref","style","onFocus","handleStartFocus","e","contains","relatedTarget","endSentinelProps","handleEndFocus","last"],"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;AAC5CC,QAAAA,IAAalB,EAA2B,IAAI,GAC5CmB,IAAmBnB,EAAuB,IAAI,GAC9CoB,IAAiBpB,EAAuB,IAAI;AAIlDC,SAAAA,EAAgB,MAAM;AAChBc,QAAAA,KAAW,CAACD,EAAQ;AACxB,UAAMO,IACJJ,GAAgBK,WAChBjB,EACAC,KAAAA,OACCiB,SAASC;AACZ,QAAI,GAACH,KAAWA,MAAYE,SAASE,SAMjCJ,EAAQK,YAAY;AACxBR,aAAAA,EAAWI,UAAUD,GACjBD,EAAeE,YAAwBA,EAAAA,QAAQK,WAAW,IACvD,MAAM;AACX,QAAIP,EAAeE,YAAwBA,EAAAA,QAAQK,WAAW;AAAA,MAAA;AAAA,EAChE,GACC,CAACb,GAAQC,CAAO,CAAC,GAGpBb,EAAU,MAAM;AACd,QAAIa,KAAW,CAACD,KAAU,CAACI,EAAWI,QAAS;AAEzCM,UAAAA,IAAQC,sBAAsB,MAAM;AAEvCC,OADa3B,EAAyB;AAAA,QAAE4B,WAAWf,EAAaM;AAAAA,MAAAA,CAAS,KAChEN,EAAaM,UAAUU,MAAM,GAEnCb,EAAiBG,YAA0BA,EAAAA,QAAQK,WAAW;AAAA,IAAA,CACnE;AAED,WAAO,MAAM;AACXM,2BAAqBL,CAAK,GACtBT,EAAiBG,YAA0BA,EAAAA,QAAQK,WAAW;AAClE,YAAMN,IAAUH,EAAWI;AAC3BJ,MAAAA,EAAWI,UAAU,MACjBD,GAASa,eACW,sBAAA,MAAMb,EAAQW,MAAAA,CAAO;AAAA,IAC7C;AAAA,EACF,GACC,CAAClB,GAAQC,CAAO,CAAC,GAkCb;AAAA,IACLoB,oBAAoB;AAAA,MAClBC,KAAKjB;AAAAA,MACLQ,UAAU;AAAA,MACVU,OAAO9B;AAAAA,MACP+B,SArCqBC,CAACC,MAAwB;AAIhD,YAFExB,EAAaM,SAASmB,SAASD,EAAEE,aAAqB,KACtDF,EAAEE,kBAAkB1B,EAAaM,SACnB;AAEd,gBAAMD,IAAUH,EAAWI;AACvBD,UAAAA,GAASa,eAAab,EAAQW,MAAM;AAAA,QAAA;AAIxC,UAAIb,EAAiBG,YAA0BA,EAAAA,QAAQK,WAAW,MACpDxB,EAAyB;AAAA,YAAE4B,WAAWf,EAAaM;AAAAA,UAAAA,CAAS,KAChEN,EAAaM,UAAUU,MAAM;AAAA,MACzC;AAAA,IAwBA;AAAA,IACAW,kBAAkB;AAAA,MAChBP,KAAKhB;AAAAA,MACLO,UAAU;AAAA,MACVU,OAAO9B;AAAAA,MACP+B,SA1BmBM,CAACJ,MAAwB;AAI9C,YAFExB,EAAaM,SAASmB,SAASD,EAAEE,aAAqB,KACtDF,EAAEE,kBAAkB1B,EAAaM,SACnB;AAEd,gBAAMD,IAAUH,EAAWI;AACvBD,UAAAA,GAASa,eAAab,EAAQW,MAAM;AAAA,QAAA;AAIvCa,WADYzC,EAAwB;AAAA,YAAE2B,WAAWf,EAAaM;AAAAA,UAAAA,CAAS,KAC/DN,EAAaM,UAAUU,MAAM;AAAA,MACxC;AAAA,IAeA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"index212.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;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index22.js","sources":["../src/components/TableLayout/index.tsx"],"sourcesContent":["import React, { FC, ReactNode, useRef } from 'react';\nimport { TableContentLoader } from 'components/TableContentLoader';\n\nexport interface TableLayoutProps {\n className?: string;\n automationId?: string;\n loading: boolean;\n headerData: any[];\n tableData: any[];\n headerColSpan?: number[];\n renderTableContentLoader?: (noOfColumns: number) => ReactNode;\n getTableHeaders: (props: { headerData: any[]; sortData: any; onSortUiUpdate: any; loading: boolean }) => ReactNode;\n getTableBody: (props: { tableData: any[]; onRowClick: any; loading: boolean }) => ReactNode;\n getTableFooter: (props: { tableData: any[]; loading: boolean }) => ReactNode;\n onSortUiUpdate: (newSortData: any) => void;\n onRowClick: (rowData: any) => void;\n tableId: string;\n /**\n * ID of element that describes the table (e.g., sort instructions for screen readers)\n */\n ariaDescribedBy?: string;\n /**\n * Accessible name for the table element\n */\n ariaLabel?: string;\n}\n\nexport const TableLayout: FC<TableLayoutProps> = ({\n className = '',\n automationId = '',\n loading,\n headerColSpan = [],\n headerData,\n tableData,\n renderTableContentLoader,\n getTableHeaders,\n getTableBody,\n getTableFooter,\n onSortUiUpdate,\n onRowClick,\n tableId,\n ariaDescribedBy,\n ariaLabel,\n ...props\n}) => {\n const tableRef = useRef<HTMLTableElement>(null);\n\n return (\n <div className={'se-design-table-layout-wrapper flex flex-col flex-1 min-h-0' + (className.length > 0 ? ` ${className}` : '') + (loading? ' table-data-loading' : '')} {...props}>\n <div className=\"se-design-table-scroll-area flex-1 min-h-0 overflow-y-auto\">\n <table\n className={'se-design-table w-full bg-[var(--color-white)] border-collapse table-fixed'}\n ref={tableRef}\n data-automation-id={automationId}\n id={tableId}\n aria-describedby={ariaDescribedBy}\n aria-label={ariaLabel}\n >\n <thead>\n <tr>{getTableHeaders({ headerData, sortData: {}, onSortUiUpdate, loading })}</tr>\n </thead>\n <tbody>\n {loading ? (\n <TableContentLoader noOfColumns={headerData?.length} colSpan={headerColSpan} />\n ) : (\n getTableBody({ tableData, onRowClick, loading })\n )}\n </tbody>\n </table>\n </div>\n <div className=\"se-design-table-footer w-full bg-[var(--color-white)] flex-shrink-0\">\n {getTableFooter({ tableData, loading })}\n </div>\n </div>\n );\n};\n"],"names":["TableLayout","className","automationId","loading","headerColSpan","headerData","tableData","renderTableContentLoader","getTableHeaders","getTableBody","getTableFooter","onSortUiUpdate","onRowClick","tableId","ariaDescribedBy","ariaLabel","props","tableRef","useRef","React","createElement","_extends","length","ref","id","sortData","TableContentLoader","noOfColumns","colSpan"],"mappings":";;;;;;;;;;;AA2BO,MAAMA,IAAoCA,CAAC;AAAA,EAChDC,WAAAA,IAAY;AAAA,EACZC,cAAAA,IAAe;AAAA,EACfC,SAAAA;AAAAA,EACAC,eAAAA,IAAgB,CAAE;AAAA,EAClBC,YAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,0BAAAA;AAAAA,EACAC,iBAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,iBAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACA,GAAGC;AACL,MAAM;AACEC,QAAAA,IAAWC,EAAyB,IAAI;AAG5CC,SAAAA,gBAAAA,EAAAC,cAAA,OAAAC,EAAA;AAAA,IAAKpB,WAAW,iEAAiEA,EAAUqB,SAAS,IAAI,IAAIrB,CAAS,KAAK,OAAOE,IAAS,wBAAwB;AAAA,EAASa,GAAAA,CAAK,GAC9KG,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKnB,WAAU;AAAA,EAAA,GACbmB,gBAAAA,EAAAA,cAAA,SAAA;AAAA,IACEnB,WAAW;AAAA,IACXsB,KAAKN;AAAAA,IACL,sBAAoBf;AAAAA,IACpBsB,IAAIX;AAAAA,IACJ,oBAAkBC;AAAAA,IAClB,cAAYC;AAAAA,EAAAA,qBAEZK,cAAA,SAAA,MACEA,gBAAAA,EAAAA,cAAKZ,MAAAA,MAAAA,EAAgB;AAAA,IAAEH,YAAAA;AAAAA,IAAYoB,UAAU,CAAC;AAAA,IAAGd,gBAAAA;AAAAA,IAAgBR,SAAAA;AAAAA,EAAAA,CAAS,CAAM,CAC3E,GACPgB,gBAAAA,EAAAC,cACGjB,SAAAA,MAAAA,IACCiB,gBAAAA,EAAAA,cAACM,GAAkB;AAAA,IAACC,aAAatB,GAAYiB;AAAAA,IAAQM,SAASxB;AAAAA,EAAgB,CAAA,IAE9EK,EAAa;AAAA,IAAEH,WAAAA;AAAAA,IAAWM,YAAAA;AAAAA,IAAYT,SAAAA;AAAAA,EAAS,CAAA,CAE5C,CACF,CACJ,GACLgB,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKnB,WAAU;AAAA,KACZS,EAAe;AAAA,IAAEJ,WAAAA;AAAAA,IAAWH,SAAAA;AAAAA,EAAS,CAAA,CACnC,CACF;AAET;"}
1
+ {"version":3,"file":"index22.js","sources":["../src/components/TableLayout/index.tsx"],"sourcesContent":["import React, { FC, ReactNode, useRef } from 'react';\nimport { TableContentLoader } from 'components/TableContentLoader';\n\nexport interface TableLayoutProps {\n className?: string;\n automationId?: string;\n loading: boolean;\n headerData: any[];\n tableData: any[];\n headerColSpan?: number[];\n renderTableContentLoader?: (noOfColumns: number) => ReactNode;\n getTableHeaders: (props: { headerData: any[]; sortData: any; onSortUiUpdate: any; loading: boolean }) => ReactNode;\n getTableBody: (props: { tableData: any[]; onRowClick: any; loading: boolean }) => ReactNode;\n getTableFooter: (props: { tableData: any[]; loading: boolean }) => ReactNode;\n onSortUiUpdate: (newSortData: any) => void;\n onRowClick: (rowData: any) => void;\n tableId: string;\n /**\n * ID of element that describes the table (e.g., sort instructions for screen readers)\n */\n ariaDescribedBy?: string;\n /**\n * Accessible name for the table element\n */\n ariaLabel?: string;\n}\n\nexport const TableLayout: FC<TableLayoutProps> = ({\n className = '',\n automationId = '',\n loading,\n headerColSpan = [],\n headerData,\n tableData,\n renderTableContentLoader,\n getTableHeaders,\n getTableBody,\n getTableFooter,\n onSortUiUpdate,\n onRowClick,\n tableId,\n ariaDescribedBy,\n ariaLabel,\n ...props\n}) => {\n const tableRef = useRef<HTMLTableElement>(null);\n\n return (\n <div className={'se-design-table-layout-wrapper flex flex-col flex-1 min-h-0' + (className.length > 0 ? ` ${className}` : '') + (loading? ' table-data-loading' : '')} {...props}>\n <div className=\"se-design-table-scroll-area flex-1 min-h-0 overflow-y-auto\">\n <table\n className={'se-design-table w-full bg-[var(--color-white)] border-collapse table-fixed'}\n ref={tableRef}\n data-automation-id={automationId}\n id={tableId}\n aria-describedby={ariaDescribedBy}\n aria-label={ariaLabel}\n >\n <thead>\n <tr>{getTableHeaders({ headerData, sortData: {}, onSortUiUpdate, loading })}</tr>\n </thead>\n <tbody>\n {loading ? (\n <TableContentLoader noOfColumns={headerData?.length} colSpan={headerColSpan} />\n ) : (\n getTableBody({ tableData, onRowClick, loading })\n )}\n </tbody>\n </table>\n </div>\n <div className=\"se-design-table-footer w-full bg-[var(--color-white)] flex-shrink-0\">\n {getTableFooter({ tableData, loading })}\n </div>\n </div>\n );\n};\n"],"names":["TableLayout","className","automationId","loading","headerColSpan","headerData","tableData","renderTableContentLoader","getTableHeaders","getTableBody","getTableFooter","onSortUiUpdate","onRowClick","tableId","ariaDescribedBy","ariaLabel","props","tableRef","useRef","React","createElement","_extends","length","ref","id","sortData","TableContentLoader","noOfColumns","colSpan"],"mappings":";;;;;;;;;;;AA2BO,MAAMA,IAAoCA,CAAC;AAAA,EAChDC,WAAAA,IAAY;AAAA,EACZC,cAAAA,IAAe;AAAA,EACfC,SAAAA;AAAAA,EACAC,eAAAA,IAAgB,CAAA;AAAA,EAChBC,YAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,0BAAAA;AAAAA,EACAC,iBAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,iBAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAWC,EAAyB,IAAI;AAE9C,SACEC,gBAAAA,EAAAC,cAAA,OAAAC,EAAA;AAAA,IAAKpB,WAAW,iEAAiEA,EAAUqB,SAAS,IAAI,IAAIrB,CAAS,KAAK,OAAOE,IAAS,wBAAwB;AAAA,EAAA,GAASa,CAAK,GAC9KG,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKnB,WAAU;AAAA,EAAA,GACbkB,gBAAAA,EAAAC,cAAA,SAAA;AAAA,IACEnB,WAAW;AAAA,IACXsB,KAAKN;AAAAA,IACL,sBAAoBf;AAAAA,IACpBsB,IAAIX;AAAAA,IACJ,oBAAkBC;AAAAA,IAClB,cAAYC;AAAAA,EAAAA,qBAEZK,cAAA,SAAA,MACED,gBAAAA,EAAAC,cAAA,MAAA,MAAKZ,EAAgB;AAAA,IAAEH,YAAAA;AAAAA,IAAYoB,UAAU,CAAA;AAAA,IAAId,gBAAAA;AAAAA,IAAgBR,SAAAA;AAAAA,EAAAA,CAAS,CAAM,CAC3E,GACPgB,gBAAAA,EAAAC,cAAA,SAAA,MACGjB,IACCgB,gBAAAA,EAAAC,cAACM,GAAkB;AAAA,IAACC,aAAatB,GAAYiB;AAAAA,IAAQM,SAASxB;AAAAA,EAAAA,CAAgB,IAE9EK,EAAa;AAAA,IAAEH,WAAAA;AAAAA,IAAWM,YAAAA;AAAAA,IAAYT,SAAAA;AAAAA,EAAAA,CAAS,CAE5C,CACF,CACJ,GACLgB,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKnB,WAAU;AAAA,EAAA,GACZS,EAAe;AAAA,IAAEJ,WAAAA;AAAAA,IAAWH,SAAAA;AAAAA,EAAAA,CAAS,CACnC,CACF;AAET;"}
@@ -12,4 +12,4 @@ function n(o, u) {
12
12
  export {
13
13
  n as debounce
14
14
  };
15
- //# sourceMappingURL=index217.js.map
15
+ //# sourceMappingURL=index220.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index217.js","sources":["../src/utils/debounce.ts"],"sourcesContent":["export function debounce<T extends (...args: any[]) => void>(func: T, wait: number) {\n let timeout: ReturnType<typeof setTimeout> | null;\n const debounced = (...args: Parameters<T>) => {\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n };\n debounced.cancel = () => {\n if (timeout) clearTimeout(timeout);\n timeout = null;\n };\n return debounced as T & { cancel: () => void };\n }"],"names":["debounce","func","wait","timeout","debounced","args","setTimeout","cancel"],"mappings":"AAAgBA,SAAAA,EAA6CC,GAASC,GAAc;AAC5EC,MAAAA;AACEC,QAAAA,IAAYA,IAAIC,MAAwB;AACxCF,IAAAA,kBAAsBA,CAAO,GACjCA,IAAUG,WAAW,MAAM;AACzBL,MAAAA,EAAK,GAAGI,CAAI;AAAA,OACXH,CAAI;AAAA,EAAA;AAETE,SAAAA,EAAUG,SAAS,MAAM;AACnBJ,IAAAA,kBAAsBA,CAAO,GACvBA,IAAA;AAAA,EAAA,GAELC;AACT;"}
1
+ {"version":3,"file":"index220.js","sources":["../src/utils/debounce.ts"],"sourcesContent":["export function debounce<T extends (...args: any[]) => void>(func: T, wait: number) {\n let timeout: ReturnType<typeof setTimeout> | null;\n const debounced = (...args: Parameters<T>) => {\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(() => {\n func(...args);\n }, wait);\n };\n debounced.cancel = () => {\n if (timeout) clearTimeout(timeout);\n timeout = null;\n };\n return debounced as T & { cancel: () => void };\n }"],"names":["debounce","func","wait","timeout","debounced","args","setTimeout","cancel"],"mappings":"AAAO,SAASA,EAA6CC,GAASC,GAAc;AAChF,MAAIC;AACJ,QAAMC,IAAYA,IAAIC,MAAwB;AAC5C,IAAIF,kBAAsBA,CAAO,GACjCA,IAAUG,WAAW,MAAM;AACzBL,MAAAA,EAAK,GAAGI,CAAI;AAAA,IACd,GAAGH,CAAI;AAAA,EACT;AACAE,SAAAA,EAAUG,SAAS,MAAM;AACvB,IAAIJ,kBAAsBA,CAAO,GACjCA,IAAU;AAAA,EACZ,GACOC;AACT;"}