@fpkit/acss 0.5.12 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/README.md +89 -0
  2. package/libs/chunk-2NRIP6RB.cjs +17 -0
  3. package/libs/chunk-2NRIP6RB.cjs.map +1 -0
  4. package/libs/chunk-33PNJ4LO.cjs +15 -0
  5. package/libs/chunk-33PNJ4LO.cjs.map +1 -0
  6. package/libs/chunk-4BZKFPEC.cjs +17 -0
  7. package/libs/chunk-4BZKFPEC.cjs.map +1 -0
  8. package/libs/{chunk-O6QZBB6G.js → chunk-5QD3DWFI.js} +5 -5
  9. package/libs/chunk-5QD3DWFI.js.map +1 -0
  10. package/libs/chunk-6SAHIYCZ.js +7 -0
  11. package/libs/chunk-6SAHIYCZ.js.map +1 -0
  12. package/libs/{chunk-KKLTUJFB.cjs → chunk-6WTC4JXH.cjs} +5 -5
  13. package/libs/chunk-6WTC4JXH.cjs.map +1 -0
  14. package/libs/chunk-75QHTLFO.js +7 -0
  15. package/libs/chunk-75QHTLFO.js.map +1 -0
  16. package/libs/{chunk-YWOYVRFT.js → chunk-7XPFW7CB.js} +3 -3
  17. package/libs/chunk-BFK62VX5.js +5 -0
  18. package/libs/chunk-BFK62VX5.js.map +1 -0
  19. package/libs/{chunk-ICCKQ2GC.cjs → chunk-DKTHCQ5P.cjs} +4 -4
  20. package/libs/{chunk-6TE5QEVE.cjs → chunk-E2AJURUW.cjs} +3 -3
  21. package/libs/chunk-E2AJURUW.cjs.map +1 -0
  22. package/libs/chunk-ENTCUJ3A.cjs +13 -0
  23. package/libs/chunk-ENTCUJ3A.cjs.map +1 -0
  24. package/libs/chunk-F5EYMVQM.js +10 -0
  25. package/libs/chunk-F5EYMVQM.js.map +1 -0
  26. package/libs/chunk-FVROL3V5.js +9 -0
  27. package/libs/chunk-FVROL3V5.js.map +1 -0
  28. package/libs/chunk-GT77BX4L.cjs +17 -0
  29. package/libs/chunk-GT77BX4L.cjs.map +1 -0
  30. package/libs/chunk-GUJSMQ3V.cjs +16 -0
  31. package/libs/chunk-GUJSMQ3V.cjs.map +1 -0
  32. package/libs/chunk-HHLNOC5T.js +7 -0
  33. package/libs/chunk-HHLNOC5T.js.map +1 -0
  34. package/libs/chunk-HRRHPLER.js +8 -0
  35. package/libs/chunk-HRRHPLER.js.map +1 -0
  36. package/libs/chunk-IEB64SWY.js +8 -0
  37. package/libs/chunk-IEB64SWY.js.map +1 -0
  38. package/libs/{chunk-LIQJ7ZZR.js → chunk-IQ76HGVP.js} +2 -2
  39. package/libs/chunk-IRLFZ3OL.js +9 -0
  40. package/libs/chunk-IRLFZ3OL.js.map +1 -0
  41. package/libs/chunk-KK47SYZI.js +8 -0
  42. package/libs/chunk-KK47SYZI.js.map +1 -0
  43. package/libs/chunk-O3JIHC5M.cjs +15 -0
  44. package/libs/chunk-O3JIHC5M.cjs.map +1 -0
  45. package/libs/chunk-O5XAJ7BY.cjs +18 -0
  46. package/libs/chunk-O5XAJ7BY.cjs.map +1 -0
  47. package/libs/chunk-OVWLQYMK.js +10 -0
  48. package/libs/chunk-OVWLQYMK.js.map +1 -0
  49. package/libs/chunk-PNWIRCG3.cjs +7 -0
  50. package/libs/chunk-PNWIRCG3.cjs.map +1 -0
  51. package/libs/chunk-QVW6W76L.cjs +18 -0
  52. package/libs/chunk-QVW6W76L.cjs.map +1 -0
  53. package/libs/chunk-T4T6GWYQ.cjs +17 -0
  54. package/libs/chunk-T4T6GWYQ.cjs.map +1 -0
  55. package/libs/chunk-TON2YGMD.cjs +9 -0
  56. package/libs/chunk-TON2YGMD.cjs.map +1 -0
  57. package/libs/chunk-UEPAWMDF.js +8 -0
  58. package/libs/chunk-UEPAWMDF.js.map +1 -0
  59. package/libs/{chunk-LT5KZ2QW.cjs → chunk-US2I5GI7.cjs} +3 -3
  60. package/libs/{chunk-E3XP6BEX.cjs → chunk-W2UIN7EV.cjs} +3 -3
  61. package/libs/chunk-W5TKWBFC.cjs +18 -0
  62. package/libs/chunk-W5TKWBFC.cjs.map +1 -0
  63. package/libs/chunk-WXBFBWYF.cjs +16 -0
  64. package/libs/chunk-WXBFBWYF.cjs.map +1 -0
  65. package/libs/chunk-X3JCTEPD.js +11 -0
  66. package/libs/chunk-X3JCTEPD.js.map +1 -0
  67. package/libs/chunk-X5LGFCWG.js +9 -0
  68. package/libs/chunk-X5LGFCWG.js.map +1 -0
  69. package/libs/{chunk-5M57K4SW.js → chunk-Y2PFDELK.js} +2 -2
  70. package/libs/chunk-ZFJ4U45S.js +10 -0
  71. package/libs/chunk-ZFJ4U45S.js.map +1 -0
  72. package/libs/{component-props-a8a2f97e.d.ts → component-props-67d978a2.d.ts} +4 -4
  73. package/libs/components/alert/alert.css +1 -1
  74. package/libs/components/alert/alert.css.map +1 -1
  75. package/libs/components/alert/alert.min.css +2 -2
  76. package/libs/components/badge/badge.css +1 -1
  77. package/libs/components/badge/badge.css.map +1 -1
  78. package/libs/components/badge/badge.min.css +2 -2
  79. package/libs/components/breadcrumbs/breadcrumb.cjs +9 -5
  80. package/libs/components/breadcrumbs/breadcrumb.d.cts +275 -36
  81. package/libs/components/breadcrumbs/breadcrumb.d.ts +275 -36
  82. package/libs/components/breadcrumbs/breadcrumb.js +3 -3
  83. package/libs/components/button.cjs +6 -4
  84. package/libs/components/button.d.cts +97 -4
  85. package/libs/components/button.d.ts +97 -4
  86. package/libs/components/button.js +4 -2
  87. package/libs/components/buttons/button.css +1 -1
  88. package/libs/components/buttons/button.css.map +1 -1
  89. package/libs/components/buttons/button.min.css +2 -2
  90. package/libs/components/card.cjs +7 -7
  91. package/libs/components/card.d.cts +278 -34
  92. package/libs/components/card.d.ts +278 -34
  93. package/libs/components/card.js +2 -2
  94. package/libs/components/cards/card.css +1 -1
  95. package/libs/components/cards/card.css.map +1 -1
  96. package/libs/components/cards/card.min.css +2 -2
  97. package/libs/components/details/details.css +1 -1
  98. package/libs/components/details/details.css.map +1 -1
  99. package/libs/components/details/details.min.css +2 -2
  100. package/libs/components/dialog/dialog.cjs +9 -7
  101. package/libs/components/dialog/dialog.css +1 -1
  102. package/libs/components/dialog/dialog.css.map +1 -1
  103. package/libs/components/dialog/dialog.d.cts +88 -34
  104. package/libs/components/dialog/dialog.d.ts +88 -34
  105. package/libs/components/dialog/dialog.js +7 -5
  106. package/libs/components/dialog/dialog.min.css +2 -2
  107. package/libs/components/form/fields.cjs +4 -4
  108. package/libs/components/form/fields.d.cts +16 -7
  109. package/libs/components/form/fields.d.ts +16 -7
  110. package/libs/components/form/fields.js +2 -2
  111. package/libs/components/form/inputs.cjs +6 -4
  112. package/libs/components/form/inputs.d.cts +50 -2
  113. package/libs/components/form/inputs.d.ts +50 -2
  114. package/libs/components/form/inputs.js +4 -2
  115. package/libs/components/form/textarea.cjs +5 -4
  116. package/libs/components/form/textarea.d.cts +32 -23
  117. package/libs/components/form/textarea.d.ts +32 -23
  118. package/libs/components/form/textarea.js +3 -2
  119. package/libs/components/heading/heading.cjs +3 -3
  120. package/libs/components/heading/heading.d.cts +3 -14
  121. package/libs/components/heading/heading.d.ts +3 -14
  122. package/libs/components/heading/heading.js +2 -2
  123. package/libs/components/icons/icon.cjs +4 -4
  124. package/libs/components/icons/icon.d.cts +183 -39
  125. package/libs/components/icons/icon.d.ts +183 -39
  126. package/libs/components/icons/icon.js +2 -2
  127. package/libs/components/images/img.css +1 -1
  128. package/libs/components/images/img.css.map +1 -1
  129. package/libs/components/images/img.min.css +2 -2
  130. package/libs/components/link/link.cjs +4 -4
  131. package/libs/components/link/link.css +1 -1
  132. package/libs/components/link/link.css.map +1 -1
  133. package/libs/components/link/link.d.cts +3 -19
  134. package/libs/components/link/link.d.ts +3 -19
  135. package/libs/components/link/link.js +2 -2
  136. package/libs/components/link/link.min.css +2 -2
  137. package/libs/components/list/list.cjs +5 -5
  138. package/libs/components/list/list.css +1 -0
  139. package/libs/components/list/list.css.map +1 -0
  140. package/libs/components/list/list.d.cts +120 -33
  141. package/libs/components/list/list.d.ts +120 -33
  142. package/libs/components/list/list.js +2 -2
  143. package/libs/components/list/list.min.css +3 -0
  144. package/libs/components/modal.cjs +6 -4
  145. package/libs/components/modal.d.cts +8 -8
  146. package/libs/components/modal.d.ts +8 -8
  147. package/libs/components/modal.js +5 -3
  148. package/libs/components/nav/nav.cjs +7 -7
  149. package/libs/components/nav/nav.css +1 -1
  150. package/libs/components/nav/nav.css.map +1 -1
  151. package/libs/components/nav/nav.d.cts +550 -34
  152. package/libs/components/nav/nav.d.ts +550 -34
  153. package/libs/components/nav/nav.js +3 -3
  154. package/libs/components/nav/nav.min.css +2 -2
  155. package/libs/components/popover/popover.d.cts +5 -5
  156. package/libs/components/popover/popover.d.ts +5 -5
  157. package/libs/components/tables/table.cjs +5 -5
  158. package/libs/components/tables/table.d.cts +8 -8
  159. package/libs/components/tables/table.d.ts +8 -8
  160. package/libs/components/tables/table.js +2 -2
  161. package/libs/components/tag/tag.css +1 -1
  162. package/libs/components/tag/tag.css.map +1 -1
  163. package/libs/components/tag/tag.min.css +2 -2
  164. package/libs/components/text/text.cjs +5 -5
  165. package/libs/components/text/text.d.cts +5 -5
  166. package/libs/components/text/text.d.ts +5 -5
  167. package/libs/components/text/text.js +2 -2
  168. package/libs/form.types-d25ebfac.d.ts +233 -0
  169. package/libs/heading-7446cb46.d.ts +250 -0
  170. package/libs/hooks.cjs +12 -0
  171. package/libs/hooks.d.cts +140 -1
  172. package/libs/hooks.d.ts +140 -1
  173. package/libs/hooks.js +4 -0
  174. package/libs/icons.cjs +3 -3
  175. package/libs/icons.d.cts +2 -2
  176. package/libs/icons.d.ts +2 -2
  177. package/libs/icons.js +2 -2
  178. package/libs/index.cjs +117 -94
  179. package/libs/index.cjs.map +1 -1
  180. package/libs/index.css +1 -1
  181. package/libs/index.css.map +1 -1
  182. package/libs/index.d.cts +834 -61
  183. package/libs/index.d.ts +834 -61
  184. package/libs/index.js +36 -22
  185. package/libs/index.js.map +1 -1
  186. package/libs/link-5192f411.d.ts +323 -0
  187. package/libs/list.types-d26de310.d.ts +245 -0
  188. package/libs/ui-d01b50d4.d.ts +289 -0
  189. package/package.json +4 -87
  190. package/src/components/README-UI.mdx +416 -0
  191. package/src/components/alert/ACCESSIBILITY.md +319 -0
  192. package/src/components/alert/README.mdx +475 -19
  193. package/src/components/alert/alert.scss +110 -6
  194. package/src/components/alert/alert.stories.tsx +372 -0
  195. package/src/components/alert/alert.test.tsx +762 -0
  196. package/src/components/alert/alert.tsx +331 -66
  197. package/src/components/alert/views/alert-actions.tsx +13 -0
  198. package/src/components/alert/views/alert-content.tsx +17 -0
  199. package/src/components/alert/views/alert-icon.tsx +53 -0
  200. package/src/components/alert/views/alert-screen-reader-text.tsx +30 -0
  201. package/src/components/alert/views/alert-title.tsx +23 -0
  202. package/src/components/alert/views/alert-view.tsx +158 -0
  203. package/src/components/alert/views/index.ts +12 -0
  204. package/src/components/badge/badge.mdx +186 -49
  205. package/src/components/badge/badge.scss +20 -2
  206. package/src/components/badge/badge.stories.tsx +160 -14
  207. package/src/components/badge/badge.test.tsx +179 -0
  208. package/src/components/badge/badge.tsx +97 -4
  209. package/src/components/breadcrumbs/README.mdx +364 -45
  210. package/src/components/breadcrumbs/__snapshots__/breadcrumb.test.tsx.snap +152 -0
  211. package/src/components/breadcrumbs/breadcrumb.stories.tsx +7 -3
  212. package/src/components/breadcrumbs/breadcrumb.test.tsx +490 -0
  213. package/src/components/breadcrumbs/breadcrumb.tsx +430 -170
  214. package/src/components/buttons/README.mdx +102 -1
  215. package/src/components/buttons/button.scss +34 -31
  216. package/src/components/buttons/button.stories.tsx +141 -0
  217. package/src/components/buttons/button.tsx +82 -52
  218. package/src/components/cards/README.mdx +657 -0
  219. package/src/components/cards/card.scss +22 -0
  220. package/src/components/cards/card.stories.tsx +167 -5
  221. package/src/components/cards/card.test.tsx +360 -20
  222. package/src/components/cards/card.tsx +200 -79
  223. package/src/components/cards/card.types.ts +135 -0
  224. package/src/components/cards/card.utils.ts +79 -0
  225. package/src/components/details/ACCESSIBILITY-REVIEW-LIVE.md +1050 -0
  226. package/src/components/details/ACCESSIBILITY-REVIEW.md +502 -0
  227. package/src/components/details/README.mdx +437 -69
  228. package/src/components/details/details.scss +16 -7
  229. package/src/components/details/details.test.tsx +385 -0
  230. package/src/components/details/details.tsx +101 -69
  231. package/src/components/details/details.types.ts +76 -0
  232. package/src/components/dialog/README.mdx +513 -110
  233. package/src/components/dialog/dialog-a11y-review.md +653 -0
  234. package/src/components/dialog/dialog-modal.tsx +79 -56
  235. package/src/components/dialog/dialog.scss +53 -3
  236. package/src/components/dialog/dialog.stories.tsx +10 -7
  237. package/src/components/dialog/dialog.test.tsx +450 -0
  238. package/src/components/dialog/dialog.tsx +69 -59
  239. package/src/components/dialog/dialog.types.ts +133 -0
  240. package/src/components/dialog/views/dialog-footer.tsx +54 -11
  241. package/src/components/dialog/views/dialog-header.tsx +20 -15
  242. package/src/components/form/README.mdx +725 -43
  243. package/src/components/form/WCAG-REVIEW.md +654 -0
  244. package/src/components/form/fields.tsx +10 -1
  245. package/src/components/form/form.stories.tsx +604 -23
  246. package/src/components/form/form.tsx +204 -63
  247. package/src/components/form/form.types.ts +378 -0
  248. package/src/components/form/input.stories.tsx +71 -3
  249. package/src/components/form/inputs.tsx +159 -67
  250. package/src/components/form/select.tsx +122 -66
  251. package/src/components/form/textarea.tsx +120 -73
  252. package/src/components/fp.tsx +86 -11
  253. package/src/components/heading/heading.stories.tsx +44 -4
  254. package/src/components/heading/heading.tsx +89 -23
  255. package/src/components/icons/README.mdx +332 -0
  256. package/src/components/icons/icon.stories.tsx +74 -1
  257. package/src/components/icons/icon.tsx +89 -1
  258. package/src/components/icons/types.ts +47 -0
  259. package/src/components/images/README.mdx +340 -24
  260. package/src/components/images/img.scss +19 -3
  261. package/src/components/images/img.stories.tsx +424 -15
  262. package/src/components/images/img.test.tsx +354 -25
  263. package/src/components/images/img.tsx +186 -63
  264. package/src/components/images/img.types.ts +211 -0
  265. package/src/components/link/README.mdx +923 -0
  266. package/src/components/link/link.scss +79 -26
  267. package/src/components/link/link.stories.tsx +383 -30
  268. package/src/components/link/link.test.tsx +677 -0
  269. package/src/components/link/link.tsx +163 -57
  270. package/src/components/link/link.types.ts +261 -0
  271. package/src/components/list/README.mdx +764 -0
  272. package/src/components/list/list.scss +285 -0
  273. package/src/components/list/list.stories.tsx +514 -27
  274. package/src/components/list/list.test.tsx +554 -0
  275. package/src/components/list/list.tsx +153 -51
  276. package/src/components/list/list.types.ts +255 -0
  277. package/src/components/nav/ACCESSIBILITY.md +649 -0
  278. package/src/components/nav/README.mdx +782 -0
  279. package/src/components/nav/nav.scss +32 -1
  280. package/src/components/nav/nav.stories.tsx +44 -6
  281. package/src/components/nav/nav.tsx +302 -51
  282. package/src/components/nav/nav.types.ts +308 -0
  283. package/src/components/tag/README.mdx +426 -0
  284. package/src/components/tag/tag.scss +101 -27
  285. package/src/components/tag/tag.stories.tsx +384 -10
  286. package/src/components/tag/tag.test.tsx +210 -0
  287. package/src/components/tag/tag.tsx +106 -9
  288. package/src/components/tag/tag.types.ts +107 -0
  289. package/src/components/title/MIGRATION.md +199 -0
  290. package/src/components/title/README.md +326 -0
  291. package/src/components/title/README.mdx +452 -0
  292. package/src/components/title/title.stories.tsx +393 -0
  293. package/src/components/title/title.test.tsx +251 -0
  294. package/src/components/title/title.tsx +219 -0
  295. package/src/components/ui.stories.tsx +894 -0
  296. package/src/components/ui.test.tsx +559 -0
  297. package/src/components/ui.tsx +274 -18
  298. package/src/components/word-count/README.md +240 -0
  299. package/src/hooks/use-disabled-state.test.tsx +536 -0
  300. package/src/hooks/use-disabled-state.ts +246 -0
  301. package/src/hooks/useDisabledState.md +393 -0
  302. package/src/hooks.ts +7 -0
  303. package/src/index.scss +2 -0
  304. package/src/index.ts +12 -3
  305. package/src/sass/_globals.scss +2 -7
  306. package/src/sass/_properties.scss +1 -0
  307. package/src/styles/alert/alert.css +92 -4
  308. package/src/styles/alert/alert.css.map +1 -1
  309. package/src/styles/badge/badge.css +20 -2
  310. package/src/styles/badge/badge.css.map +1 -1
  311. package/src/styles/buttons/button.css +31 -31
  312. package/src/styles/buttons/button.css.map +1 -1
  313. package/src/styles/cards/card.css +16 -0
  314. package/src/styles/cards/card.css.map +1 -1
  315. package/src/styles/details/details.css +19 -8
  316. package/src/styles/details/details.css.map +1 -1
  317. package/src/styles/dialog/dialog.css +43 -2
  318. package/src/styles/dialog/dialog.css.map +1 -1
  319. package/src/styles/images/img.css +15 -3
  320. package/src/styles/images/img.css.map +1 -1
  321. package/src/styles/index.css +691 -128
  322. package/src/styles/index.css.map +1 -1
  323. package/src/styles/link/link.css +45 -28
  324. package/src/styles/link/link.css.map +1 -1
  325. package/src/styles/list/list.css +214 -0
  326. package/src/styles/list/list.css.map +1 -0
  327. package/src/styles/nav/nav.css +21 -1
  328. package/src/styles/nav/nav.css.map +1 -1
  329. package/src/styles/tag/tag.css +113 -35
  330. package/src/styles/tag/tag.css.map +1 -1
  331. package/src/styles/utilities/_disabled.scss +58 -0
  332. package/src/test/setup.d.ts +9 -0
  333. package/src/test/setup.ts +53 -1
  334. package/src/types/shared.ts +43 -6
  335. package/src/utils/accessibility.ts +109 -0
  336. package/libs/chunk-5ZM4XL44.js +0 -8
  337. package/libs/chunk-5ZM4XL44.js.map +0 -1
  338. package/libs/chunk-6BVXFW7U.cjs +0 -15
  339. package/libs/chunk-6BVXFW7U.cjs.map +0 -1
  340. package/libs/chunk-6TE5QEVE.cjs.map +0 -1
  341. package/libs/chunk-7K76RW2A.cjs +0 -18
  342. package/libs/chunk-7K76RW2A.cjs.map +0 -1
  343. package/libs/chunk-BHRQBJRY.js +0 -8
  344. package/libs/chunk-BHRQBJRY.js.map +0 -1
  345. package/libs/chunk-BIP2NY53.js +0 -8
  346. package/libs/chunk-BIP2NY53.js.map +0 -1
  347. package/libs/chunk-BSPKFLO4.js +0 -8
  348. package/libs/chunk-BSPKFLO4.js.map +0 -1
  349. package/libs/chunk-BV5CLH44.cjs +0 -18
  350. package/libs/chunk-BV5CLH44.cjs.map +0 -1
  351. package/libs/chunk-DKGJHKGW.js +0 -9
  352. package/libs/chunk-DKGJHKGW.js.map +0 -1
  353. package/libs/chunk-DV56L5YX.cjs +0 -18
  354. package/libs/chunk-DV56L5YX.cjs.map +0 -1
  355. package/libs/chunk-ECLD37WN.cjs +0 -16
  356. package/libs/chunk-ECLD37WN.cjs.map +0 -1
  357. package/libs/chunk-EQ67LF46.js +0 -9
  358. package/libs/chunk-EQ67LF46.js.map +0 -1
  359. package/libs/chunk-HYBZBN4G.js +0 -8
  360. package/libs/chunk-HYBZBN4G.js.map +0 -1
  361. package/libs/chunk-IYUN2EW3.cjs +0 -15
  362. package/libs/chunk-IYUN2EW3.cjs.map +0 -1
  363. package/libs/chunk-KKLTUJFB.cjs.map +0 -1
  364. package/libs/chunk-LHVJKDMA.cjs +0 -15
  365. package/libs/chunk-LHVJKDMA.cjs.map +0 -1
  366. package/libs/chunk-LL7HTLMS.cjs +0 -15
  367. package/libs/chunk-LL7HTLMS.cjs.map +0 -1
  368. package/libs/chunk-M5QL5TAE.cjs +0 -14
  369. package/libs/chunk-M5QL5TAE.cjs.map +0 -1
  370. package/libs/chunk-NE6YXTMC.js +0 -7
  371. package/libs/chunk-NE6YXTMC.js.map +0 -1
  372. package/libs/chunk-NHYXGV3L.js +0 -8
  373. package/libs/chunk-NHYXGV3L.js.map +0 -1
  374. package/libs/chunk-O6QZBB6G.js.map +0 -1
  375. package/libs/chunk-P7TTEYCD.js +0 -7
  376. package/libs/chunk-P7TTEYCD.js.map +0 -1
  377. package/libs/chunk-PPOOBUOS.js +0 -8
  378. package/libs/chunk-PPOOBUOS.js.map +0 -1
  379. package/libs/chunk-QCMV4VQZ.js +0 -8
  380. package/libs/chunk-QCMV4VQZ.js.map +0 -1
  381. package/libs/chunk-QVV34QEH.cjs +0 -32
  382. package/libs/chunk-QVV34QEH.cjs.map +0 -1
  383. package/libs/chunk-S7BABR7Z.cjs +0 -13
  384. package/libs/chunk-S7BABR7Z.cjs.map +0 -1
  385. package/libs/chunk-SXVZSWX6.js +0 -11
  386. package/libs/chunk-SXVZSWX6.js.map +0 -1
  387. package/libs/chunk-X3EVB7VS.cjs +0 -15
  388. package/libs/chunk-X3EVB7VS.cjs.map +0 -1
  389. package/libs/inputs-f3a216db.d.ts +0 -45
  390. package/libs/ui-9a6f9f8d.d.ts +0 -24
  391. package/src/components/cards/README.md +0 -80
  392. package/src/components/dialog/hooks/useClickOutside.ts +0 -33
  393. /package/libs/{chunk-YWOYVRFT.js.map → chunk-7XPFW7CB.js.map} +0 -0
  394. /package/libs/{chunk-ICCKQ2GC.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
  395. /package/libs/{chunk-LIQJ7ZZR.js.map → chunk-IQ76HGVP.js.map} +0 -0
  396. /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
  397. /package/libs/{chunk-E3XP6BEX.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
  398. /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
@@ -0,0 +1,450 @@
1
+ import React from "react";
2
+ import { render, screen, waitFor } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { Dialog } from "./dialog";
5
+ import { DialogModal } from "./dialog-modal";
6
+
7
+ describe("Dialog", () => {
8
+ describe("Controlled Component Behavior", () => {
9
+ it("renders dialog when isOpen is true", () => {
10
+ const onOpenChange = vi.fn();
11
+ render(
12
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Test Dialog">
13
+ Dialog content
14
+ </Dialog>
15
+ );
16
+
17
+ const dialog = screen.getByRole("dialog");
18
+ expect(dialog).toBeInTheDocument();
19
+ expect(screen.getByText("Test Dialog")).toBeInTheDocument();
20
+ expect(screen.getByText("Dialog content")).toBeInTheDocument();
21
+ });
22
+
23
+ it("does not render dialog when isOpen is false", () => {
24
+ const onOpenChange = vi.fn();
25
+ render(
26
+ <Dialog isOpen={false} onOpenChange={onOpenChange} dialogTitle="Test Dialog">
27
+ Dialog content
28
+ </Dialog>
29
+ );
30
+
31
+ const dialog = screen.queryByRole("dialog");
32
+ // Dialog element exists in DOM but should not have 'open' attribute
33
+ if (dialog) {
34
+ expect(dialog).not.toHaveAttribute("open");
35
+ }
36
+ });
37
+
38
+ it("calls onOpenChange with false when close button is clicked", async () => {
39
+ const user = userEvent.setup();
40
+ const onOpenChange = vi.fn();
41
+
42
+ render(
43
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Test Dialog">
44
+ Dialog content
45
+ </Dialog>
46
+ );
47
+
48
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
49
+ await user.click(closeButton);
50
+
51
+ expect(onOpenChange).toHaveBeenCalledWith(false);
52
+ });
53
+
54
+ it("calls deprecated onClose callback for backward compatibility", async () => {
55
+ const user = userEvent.setup();
56
+ const onOpenChange = vi.fn();
57
+ const onClose = vi.fn();
58
+
59
+ render(
60
+ <Dialog
61
+ isOpen={true}
62
+ onOpenChange={onOpenChange}
63
+ onClose={onClose}
64
+ dialogTitle="Test Dialog"
65
+ >
66
+ Dialog content
67
+ </Dialog>
68
+ );
69
+
70
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
71
+ await user.click(closeButton);
72
+
73
+ expect(onOpenChange).toHaveBeenCalledWith(false);
74
+ expect(onClose).toHaveBeenCalled();
75
+ });
76
+ });
77
+
78
+ describe("Modal vs Non-Modal Behavior", () => {
79
+ it("renders as modal dialog by default (role='dialog')", () => {
80
+ const onOpenChange = vi.fn();
81
+ render(
82
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Modal Dialog">
83
+ Content
84
+ </Dialog>
85
+ );
86
+
87
+ const dialog = screen.getByRole("dialog");
88
+ expect(dialog).toBeInTheDocument();
89
+ expect(dialog).toHaveAttribute("aria-modal", "true");
90
+ });
91
+
92
+ it("renders as alert dialog when isAlertDialog is true", () => {
93
+ const onOpenChange = vi.fn();
94
+ render(
95
+ <Dialog
96
+ isOpen={true}
97
+ onOpenChange={onOpenChange}
98
+ dialogTitle="Alert Dialog"
99
+ isAlertDialog={true}
100
+ >
101
+ Alert content
102
+ </Dialog>
103
+ );
104
+
105
+ const dialog = screen.getByRole("alertdialog");
106
+ expect(dialog).toBeInTheDocument();
107
+ // Alert dialogs (inline) should not have aria-modal
108
+ expect(dialog).not.toHaveAttribute("aria-modal", "true");
109
+ });
110
+ });
111
+
112
+ describe("Accessibility (ARIA Attributes)", () => {
113
+ it("links dialog to title with aria-labelledby", () => {
114
+ const onOpenChange = vi.fn();
115
+ render(
116
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Accessible Dialog">
117
+ Content
118
+ </Dialog>
119
+ );
120
+
121
+ const dialog = screen.getByRole("dialog");
122
+ const title = screen.getByText("Accessible Dialog");
123
+
124
+ expect(dialog).toHaveAttribute("aria-labelledby");
125
+ expect(title).toHaveAttribute("id");
126
+
127
+ const labelledBy = dialog.getAttribute("aria-labelledby");
128
+ const titleId = title.getAttribute("id");
129
+ expect(labelledBy).toBe(titleId);
130
+ });
131
+
132
+ it("links dialog to content with aria-describedby", () => {
133
+ const onOpenChange = vi.fn();
134
+ render(
135
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Test Dialog">
136
+ Dialog description
137
+ </Dialog>
138
+ );
139
+
140
+ const dialog = screen.getByRole("dialog");
141
+ const content = screen.getByText("Dialog description").closest("section");
142
+
143
+ expect(dialog).toHaveAttribute("aria-describedby");
144
+ expect(content).toHaveAttribute("id");
145
+
146
+ const describedBy = dialog.getAttribute("aria-describedby");
147
+ const contentId = content?.getAttribute("id");
148
+ expect(describedBy).toBe(contentId);
149
+ });
150
+
151
+ it("applies custom aria-label when provided", () => {
152
+ const onOpenChange = vi.fn();
153
+ render(
154
+ <Dialog
155
+ isOpen={true}
156
+ onOpenChange={onOpenChange}
157
+ dialogTitle="Dialog"
158
+ dialogLabel="Custom accessible label"
159
+ >
160
+ Content
161
+ </Dialog>
162
+ );
163
+
164
+ const dialog = screen.getByRole("dialog");
165
+ expect(dialog).toHaveAttribute("aria-label", "Custom accessible label");
166
+ });
167
+
168
+ it("close button has accessible label", () => {
169
+ const onOpenChange = vi.fn();
170
+ render(
171
+ <Dialog isOpen={true} onOpenChange={onOpenChange} dialogTitle="Test">
172
+ Content
173
+ </Dialog>
174
+ );
175
+
176
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
177
+ expect(closeButton).toHaveAttribute("aria-label", "Close dialog");
178
+ });
179
+ });
180
+
181
+ describe("Dialog Footer", () => {
182
+ it("shows footer with cancel and confirm buttons by default", () => {
183
+ const onOpenChange = vi.fn();
184
+ const onConfirm = vi.fn();
185
+
186
+ render(
187
+ <Dialog
188
+ isOpen={true}
189
+ onOpenChange={onOpenChange}
190
+ dialogTitle="Confirm Action"
191
+ onConfirm={onConfirm}
192
+ >
193
+ Content
194
+ </Dialog>
195
+ );
196
+
197
+ expect(screen.getByRole("button", { name: /cancel/i })).toBeInTheDocument();
198
+ expect(screen.getByRole("button", { name: /confirm/i })).toBeInTheDocument();
199
+ });
200
+
201
+ it("hides footer when hideFooter is true", () => {
202
+ const onOpenChange = vi.fn();
203
+
204
+ render(
205
+ <Dialog
206
+ isOpen={true}
207
+ onOpenChange={onOpenChange}
208
+ dialogTitle="No Footer"
209
+ hideFooter={true}
210
+ >
211
+ Content
212
+ </Dialog>
213
+ );
214
+
215
+ expect(screen.queryByRole("button", { name: /cancel/i })).not.toBeInTheDocument();
216
+ expect(screen.queryByRole("button", { name: /confirm/i })).not.toBeInTheDocument();
217
+ });
218
+
219
+ it("calls onConfirm when confirm button is clicked", async () => {
220
+ const user = userEvent.setup();
221
+ const onOpenChange = vi.fn();
222
+ const onConfirm = vi.fn();
223
+
224
+ render(
225
+ <Dialog
226
+ isOpen={true}
227
+ onOpenChange={onOpenChange}
228
+ dialogTitle="Test"
229
+ onConfirm={onConfirm}
230
+ >
231
+ Content
232
+ </Dialog>
233
+ );
234
+
235
+ const confirmButton = screen.getByRole("button", { name: /confirm/i });
236
+ await user.click(confirmButton);
237
+
238
+ expect(onConfirm).toHaveBeenCalled();
239
+ });
240
+
241
+ it("uses custom button labels when provided", () => {
242
+ const onOpenChange = vi.fn();
243
+ const onConfirm = vi.fn();
244
+
245
+ render(
246
+ <Dialog
247
+ isOpen={true}
248
+ onOpenChange={onOpenChange}
249
+ dialogTitle="Delete Item"
250
+ onConfirm={onConfirm}
251
+ confirmLabel="Delete"
252
+ cancelLabel="Keep"
253
+ >
254
+ Are you sure?
255
+ </Dialog>
256
+ );
257
+
258
+ expect(screen.getByRole("button", { name: /delete/i })).toBeInTheDocument();
259
+ expect(screen.getByRole("button", { name: /keep/i })).toBeInTheDocument();
260
+ });
261
+ });
262
+
263
+ describe("Custom Styling", () => {
264
+ it("applies custom className", () => {
265
+ const onOpenChange = vi.fn();
266
+ render(
267
+ <Dialog
268
+ isOpen={true}
269
+ onOpenChange={onOpenChange}
270
+ dialogTitle="Styled Dialog"
271
+ className="custom-class"
272
+ >
273
+ Content
274
+ </Dialog>
275
+ );
276
+
277
+ const dialog = screen.getByRole("dialog");
278
+ expect(dialog).toHaveClass("custom-class");
279
+ });
280
+
281
+ it("applies custom inline styles", () => {
282
+ const onOpenChange = vi.fn();
283
+ const customStyles = { maxWidth: "600px" };
284
+
285
+ render(
286
+ <Dialog
287
+ isOpen={true}
288
+ onOpenChange={onOpenChange}
289
+ dialogTitle="Custom Styled"
290
+ styles={customStyles}
291
+ >
292
+ Content
293
+ </Dialog>
294
+ );
295
+
296
+ const dialog = screen.getByRole("dialog");
297
+ expect(dialog).toHaveStyle({ maxWidth: "600px" });
298
+ });
299
+ });
300
+ });
301
+
302
+ describe("DialogModal", () => {
303
+ describe("Uncontrolled State Management", () => {
304
+ it("renders trigger button with custom label", () => {
305
+ render(
306
+ <DialogModal dialogTitle="Test" btnLabel="Open My Dialog">
307
+ Content
308
+ </DialogModal>
309
+ );
310
+
311
+ const triggerButton = screen.getByRole("button", { name: /open my dialog/i });
312
+ expect(triggerButton).toBeInTheDocument();
313
+ });
314
+
315
+ it("opens dialog when trigger button is clicked", async () => {
316
+ const user = userEvent.setup();
317
+
318
+ render(
319
+ <DialogModal dialogTitle="Test Dialog" btnLabel="Open">
320
+ Dialog content
321
+ </DialogModal>
322
+ );
323
+
324
+ const triggerButton = screen.getByRole("button", { name: /open/i });
325
+ await user.click(triggerButton);
326
+
327
+ await waitFor(() => {
328
+ expect(screen.getByRole("dialog")).toBeInTheDocument();
329
+ expect(screen.getByText("Dialog content")).toBeInTheDocument();
330
+ });
331
+ });
332
+
333
+ it("closes dialog when close button is clicked", async () => {
334
+ const user = userEvent.setup();
335
+
336
+ render(
337
+ <DialogModal dialogTitle="Test" btnLabel="Open">
338
+ Content
339
+ </DialogModal>
340
+ );
341
+
342
+ const triggerButton = screen.getByRole("button", { name: /open/i });
343
+ await user.click(triggerButton);
344
+
345
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
346
+ await user.click(closeButton);
347
+
348
+ await waitFor(() => {
349
+ const dialog = screen.queryByRole("dialog");
350
+ // Dialog should not have 'open' attribute when closed
351
+ if (dialog) {
352
+ expect(dialog).not.toHaveAttribute("open");
353
+ }
354
+ });
355
+ });
356
+
357
+ it("calls onClose callback when dialog is closed", async () => {
358
+ const user = userEvent.setup();
359
+ const onClose = vi.fn();
360
+
361
+ render(
362
+ <DialogModal dialogTitle="Test" btnLabel="Open" onClose={onClose}>
363
+ Content
364
+ </DialogModal>
365
+ );
366
+
367
+ const triggerButton = screen.getByRole("button", { name: /open/i });
368
+ await user.click(triggerButton);
369
+
370
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
371
+ await user.click(closeButton);
372
+
373
+ await waitFor(() => {
374
+ expect(onClose).toHaveBeenCalled();
375
+ });
376
+ });
377
+
378
+ it("calls btnOnClick before opening dialog", async () => {
379
+ const user = userEvent.setup();
380
+ const btnOnClick = vi.fn();
381
+
382
+ render(
383
+ <DialogModal dialogTitle="Test" btnLabel="Open" btnOnClick={btnOnClick}>
384
+ Content
385
+ </DialogModal>
386
+ );
387
+
388
+ const triggerButton = screen.getByRole("button", { name: /open/i });
389
+ await user.click(triggerButton);
390
+
391
+ expect(btnOnClick).toHaveBeenCalled();
392
+ });
393
+ });
394
+
395
+ describe("Focus Restoration", () => {
396
+ it("restores focus to trigger button after dialog closes", async () => {
397
+ const user = userEvent.setup();
398
+
399
+ render(
400
+ <DialogModal dialogTitle="Focus Test" btnLabel="Open Dialog">
401
+ Content
402
+ </DialogModal>
403
+ );
404
+
405
+ const triggerButton = screen.getByRole("button", { name: /open dialog/i });
406
+ await user.click(triggerButton);
407
+
408
+ const closeButton = screen.getByRole("button", { name: /close dialog/i });
409
+ await user.click(closeButton);
410
+
411
+ // Wait for focus restoration (has 100ms delay in DialogModal)
412
+ await waitFor(
413
+ () => {
414
+ // Focus restoration happens after dialog closes
415
+ expect(triggerButton).toHaveFocus();
416
+ },
417
+ { timeout: 300, interval: 50 }
418
+ );
419
+ });
420
+ });
421
+
422
+ describe("Button Props", () => {
423
+ it("applies custom button size", () => {
424
+ render(
425
+ <DialogModal dialogTitle="Test" btnLabel="Open" btnSize="lg">
426
+ Content
427
+ </DialogModal>
428
+ );
429
+
430
+ const triggerButton = screen.getByRole("button", { name: /open/i });
431
+ expect(triggerButton).toHaveAttribute("data-btn", "lg");
432
+ });
433
+
434
+ it("forwards additional button props", () => {
435
+ render(
436
+ <DialogModal
437
+ dialogTitle="Test"
438
+ btnLabel="Open"
439
+ btnProps={{ "data-testid": "custom-trigger", disabled: false }}
440
+ >
441
+ Content
442
+ </DialogModal>
443
+ );
444
+
445
+ const triggerButton = screen.getByTestId("custom-trigger");
446
+ expect(triggerButton).toBeInTheDocument();
447
+ expect(triggerButton).not.toBeDisabled();
448
+ });
449
+ });
450
+ });
@@ -1,58 +1,59 @@
1
- import React, { useRef, useEffect, CSSProperties } from "react";
1
+ import React, { useRef, useEffect, useCallback, useId } from "react";
2
2
  import UI from "#components/ui";
3
3
  import DialogHeader from "#components/dialog/views/dialog-header";
4
4
  import DialogFooter from "#components/dialog/views/dialog-footer";
5
5
  import { useDialogClickHandler } from "#hooks/useDialogClickHandler.js";
6
+ import type { DialogProps } from "./dialog.types";
6
7
 
7
8
  /**
8
- * Defines the props for the Dialog component.
9
+ * A controlled dialog component that supports both modal and non-modal (inline alert) modes.
9
10
  *
10
- * @property {boolean} [showDialog] - Determines whether the dialog should be shown.
11
- * @property {boolean} [isAlertDialog] - Determines whether the dialog should be displayed as an alert dialog.
12
- * @property {() => void} [onClose] - A callback function to be called when the dialog is closed.
13
- * @property {string} dialogTitle - The title of the dialog.
14
- * @property {string} [dialogLabel] - An optional label for the dialog.
15
- * @property {React.ReactNode} children - The content to be displayed inside the dialog.
16
- * @property {() => void | Promise<void>} [onConfirm] - A callback function to be called when the user confirms the dialog.
17
- * @property {string} [confirmLabel] - The label for the confirm button.
18
- * @property {string} [cancelLabel] - The label for the cancel button.
19
- * @property {string} [className] - An optional CSS class name to be applied to the dialog.
20
- * @property {CSSProperties} [styles] - Optional inline styles to be applied to the dialog.
21
- */
22
- type DialogModalProps = React.ComponentProps<typeof UI> &
23
- React.ComponentProps<"dialog"> & {
24
- dialogTitle: string;
25
- dialogLabel?: string;
26
- children: React.ReactNode;
27
- showDialog?: boolean;
28
- isAlertDialog?: boolean;
29
- onClose?: () => void;
30
- onConfirm?: () => void | Promise<void>;
31
- confirmLabel?: string;
32
- cancelLabel?: string;
33
- className?: string;
34
- hideFooter?: boolean;
35
- styles?: CSSProperties;
36
- };
37
-
38
- /**
39
- * Renders a dialog modal component with customizable content and behavior.
11
+ * **Modal Dialog** (default): Uses native `<dialog>` element with `.showModal()` which provides:
12
+ * - Automatic focus trap (Tab cycles within dialog)
13
+ * - Escape key closes dialog (native behavior)
14
+ * - Backdrop overlay with click-to-close
15
+ * - Inert background (page content becomes non-interactive)
16
+ *
17
+ * **Inline Alert Dialog** (`isAlertDialog={true}`): Uses `.show()` for non-modal inline alerts:
18
+ * - No focus trap (page remains interactive)
19
+ * - No escape key behavior
20
+ * - Positioned inline in page flow
21
+ * - User must explicitly close with button
22
+ *
23
+ * @component
24
+ * @example
25
+ * ```tsx
26
+ * // Controlled usage
27
+ * const [open, setOpen] = useState(false);
28
+ * <Dialog
29
+ * isOpen={open}
30
+ * onOpenChange={setOpen}
31
+ * dialogTitle="Confirm Delete"
32
+ * >
33
+ * Are you sure you want to delete this item?
34
+ * </Dialog>
35
+ * ```
40
36
  *
41
- * @param showDialog - Determines whether the dialog should be shown.
42
- * @param isAlertDialog - Determines whether the dialog should be displayed as an alert dialog.
43
- * @param onClose - A callback function to be called when the dialog is closed.
44
- * @param dialogTitle - The title of the dialog.
45
- * @param dialogLabel - An optional label for the dialog.
46
- * @param children - The content to be displayed inside the dialog.
47
- * @param onConfirm - A callback function to be called when the user confirms the dialog.
48
- * @param confirmLabel - The label for the confirm button.
49
- * @param cancelLabel - The label for the cancel button.
50
- * @param className - An optional CSS class name to be applied to the dialog.
51
- * @param styles - Optional inline styles to be applied to the dialog.
37
+ * @param {DialogProps} props - Component props
38
+ * @param {boolean} props.isOpen - Controls whether the dialog is currently open
39
+ * @param {(open: boolean) => void} props.onOpenChange - Callback fired when dialog open state changes
40
+ * @param {string} props.dialogTitle - The title displayed in the dialog header
41
+ * @param {boolean} [props.isAlertDialog=false] - If true, renders as non-modal inline alert
42
+ * @param {() => void} [props.onClose] - Deprecated: Use onOpenChange. Called when dialog closes.
43
+ * @param {ReactNode} props.children - Content to display inside the dialog body
44
+ * @param {() => void | Promise<void>} [props.onConfirm] - Callback fired when confirm button is clicked
45
+ * @param {string} [props.confirmLabel="Confirm"] - Text label for confirm button
46
+ * @param {string} [props.cancelLabel="Cancel"] - Text label for cancel button
47
+ * @param {boolean} [props.hideFooter=false] - If true, hides the footer with action buttons
48
+ * @param {string} [props.className] - Additional CSS classes to apply
49
+ * @param {string} [props.dialogLabel] - Optional aria-label for the dialog
50
+ * @param {CSSProperties} [props.styles] - Inline styles to apply to dialog element
51
+ * @returns {JSX.Element} A controlled dialog component
52
52
  */
53
- export const Dialog: React.FC<DialogModalProps> = ({
54
- showDialog,
55
- isAlertDialog,
53
+ export const Dialog: React.FC<DialogProps> = ({
54
+ isOpen,
55
+ onOpenChange,
56
+ isAlertDialog = false,
56
57
  onClose,
57
58
  dialogTitle,
58
59
  dialogLabel,
@@ -61,24 +62,23 @@ export const Dialog: React.FC<DialogModalProps> = ({
61
62
  confirmLabel = "Confirm",
62
63
  cancelLabel = "Cancel",
63
64
  className = "",
64
- hideFooter,
65
+ hideFooter = false,
65
66
  styles,
66
67
  }) => {
67
68
  const dialogRef = useRef<HTMLDialogElement>(null);
68
- const [isOpen, setIsOpen] = React.useState(showDialog);
69
-
70
- useEffect(() => {
71
- setIsOpen(showDialog);
72
- }, [showDialog]);
69
+ const titleId = useId();
73
70
 
71
+ // Handle native dialog open/close based on isOpen prop
74
72
  useEffect(() => {
75
73
  const dialog = dialogRef.current;
76
74
  if (!dialog) return;
77
75
 
78
76
  if (isOpen) {
79
77
  if (isAlertDialog) {
78
+ // Non-modal inline alert - no focus trap, no backdrop
80
79
  dialog.show();
81
80
  } else {
81
+ // Modal dialog - native focus trap, escape key, backdrop
82
82
  dialog.showModal();
83
83
  }
84
84
  } else {
@@ -86,13 +86,18 @@ export const Dialog: React.FC<DialogModalProps> = ({
86
86
  }
87
87
  }, [isOpen, isAlertDialog]);
88
88
 
89
- const handleClose = () => {
89
+ // Handle close event - notify parent via onOpenChange
90
+ const handleClose = useCallback(() => {
91
+ onOpenChange(false);
92
+ // Support deprecated onClose prop for backward compatibility
90
93
  if (onClose) onClose();
91
- setIsOpen(false);
92
- };
94
+ }, [onOpenChange, onClose]);
93
95
 
96
+ // Handle backdrop clicks (only for modal dialogs)
94
97
  const handleClickOutside = useDialogClickHandler(dialogRef, handleClose);
95
98
 
99
+ const contentId = useId();
100
+
96
101
  return (
97
102
  <UI
98
103
  as="dialog"
@@ -100,16 +105,19 @@ export const Dialog: React.FC<DialogModalProps> = ({
100
105
  ref={dialogRef}
101
106
  onClose={handleClose}
102
107
  onClick={handleClickOutside}
103
- aria-modal={isOpen ? "true" : undefined}
104
- className={`${"dialog-modal"} ${className}`}
108
+ aria-modal={isOpen && !isAlertDialog ? "true" : undefined}
109
+ aria-labelledby={titleId}
110
+ aria-describedby={contentId}
105
111
  aria-label={dialogLabel}
112
+ className={`dialog-modal ${className}`.trim()}
106
113
  style={styles}
107
114
  >
108
- <DialogHeader dialogTitle={dialogTitle} onClick={handleClose} />
115
+ <DialogHeader dialogTitle={dialogTitle} onClick={handleClose} id={titleId} />
109
116
 
110
117
  <UI
111
118
  as="section"
112
- className={`dialog-content ${className}`}
119
+ id={contentId}
120
+ className="dialog-content"
113
121
  onClick={(e: React.MouseEvent) => e.stopPropagation()}
114
122
  >
115
123
  {children}
@@ -125,4 +133,6 @@ export const Dialog: React.FC<DialogModalProps> = ({
125
133
  </UI>
126
134
  );
127
135
  };
136
+ Dialog.displayName = "Dialog";
137
+
128
138
  export default React.memo(Dialog);