@fpkit/acss 0.5.13 → 0.6.1

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 (280) hide show
  1. package/libs/{chunk-PQ2K3BM6.cjs → chunk-2NRIP6RB.cjs} +3 -3
  2. package/libs/chunk-33PNJ4LO.cjs +15 -0
  3. package/libs/chunk-33PNJ4LO.cjs.map +1 -0
  4. package/libs/chunk-4BZKFPEC.cjs +17 -0
  5. package/libs/chunk-4BZKFPEC.cjs.map +1 -0
  6. package/libs/{chunk-772NRB75.js → chunk-5QD3DWFI.js} +2 -2
  7. package/libs/chunk-6SAHIYCZ.js +7 -0
  8. package/libs/chunk-6SAHIYCZ.js.map +1 -0
  9. package/libs/{chunk-3MKLDCKQ.cjs → chunk-6WTC4JXH.cjs} +3 -3
  10. package/libs/chunk-75QHTLFO.js +7 -0
  11. package/libs/chunk-75QHTLFO.js.map +1 -0
  12. package/libs/{chunk-ZANSFMTD.js → chunk-7XPFW7CB.js} +3 -3
  13. package/libs/chunk-BFK62VX5.js +5 -0
  14. package/libs/chunk-BFK62VX5.js.map +1 -0
  15. package/libs/{chunk-ROZI23GS.cjs → chunk-DKTHCQ5P.cjs} +4 -4
  16. package/libs/chunk-E2AJURUW.cjs +13 -0
  17. package/libs/chunk-E2AJURUW.cjs.map +1 -0
  18. package/libs/{chunk-L75OQKEI.cjs → chunk-ENTCUJ3A.cjs} +3 -3
  19. package/libs/chunk-ENTCUJ3A.cjs.map +1 -0
  20. package/libs/chunk-F5EYMVQM.js +10 -0
  21. package/libs/chunk-F5EYMVQM.js.map +1 -0
  22. package/libs/chunk-FVROL3V5.js +9 -0
  23. package/libs/chunk-FVROL3V5.js.map +1 -0
  24. package/libs/chunk-GT77BX4L.cjs +17 -0
  25. package/libs/chunk-GT77BX4L.cjs.map +1 -0
  26. package/libs/chunk-GUJSMQ3V.cjs +16 -0
  27. package/libs/chunk-GUJSMQ3V.cjs.map +1 -0
  28. package/libs/chunk-HHLNOC5T.js +7 -0
  29. package/libs/chunk-HHLNOC5T.js.map +1 -0
  30. package/libs/chunk-HRRHPLER.js +8 -0
  31. package/libs/chunk-HRRHPLER.js.map +1 -0
  32. package/libs/chunk-IEB64SWY.js +8 -0
  33. package/libs/chunk-IEB64SWY.js.map +1 -0
  34. package/libs/{chunk-NGTJDDFO.js → chunk-IQ76HGVP.js} +2 -2
  35. package/libs/chunk-IRLFZ3OL.js +9 -0
  36. package/libs/chunk-IRLFZ3OL.js.map +1 -0
  37. package/libs/{chunk-JJ43O4Y5.js → chunk-KK47SYZI.js} +2 -2
  38. package/libs/chunk-O3JIHC5M.cjs +15 -0
  39. package/libs/chunk-O3JIHC5M.cjs.map +1 -0
  40. package/libs/chunk-O5XAJ7BY.cjs +18 -0
  41. package/libs/chunk-O5XAJ7BY.cjs.map +1 -0
  42. package/libs/chunk-OVWLQYMK.js +10 -0
  43. package/libs/chunk-OVWLQYMK.js.map +1 -0
  44. package/libs/chunk-PNWIRCG3.cjs +7 -0
  45. package/libs/chunk-PNWIRCG3.cjs.map +1 -0
  46. package/libs/{chunk-D4YLRWAO.cjs → chunk-QVW6W76L.cjs} +6 -6
  47. package/libs/chunk-T4T6GWYQ.cjs +17 -0
  48. package/libs/chunk-T4T6GWYQ.cjs.map +1 -0
  49. package/libs/chunk-TON2YGMD.cjs +9 -0
  50. package/libs/chunk-TON2YGMD.cjs.map +1 -0
  51. package/libs/chunk-UEPAWMDF.js +8 -0
  52. package/libs/chunk-UEPAWMDF.js.map +1 -0
  53. package/libs/{chunk-LT5KZ2QW.cjs → chunk-US2I5GI7.cjs} +3 -3
  54. package/libs/{chunk-B7F5FS6D.cjs → chunk-W2UIN7EV.cjs} +3 -3
  55. package/libs/{chunk-P2DC76ZZ.cjs → chunk-W5TKWBFC.cjs} +3 -3
  56. package/libs/chunk-WXBFBWYF.cjs +16 -0
  57. package/libs/chunk-WXBFBWYF.cjs.map +1 -0
  58. package/libs/{chunk-VUH3FXGJ.js → chunk-X3JCTEPD.js} +5 -5
  59. package/libs/chunk-X5LGFCWG.js +9 -0
  60. package/libs/chunk-X5LGFCWG.js.map +1 -0
  61. package/libs/{chunk-5M57K4SW.js → chunk-Y2PFDELK.js} +2 -2
  62. package/libs/{chunk-ETFLFC2S.js → chunk-ZFJ4U45S.js} +2 -2
  63. package/libs/{component-props-a8a2f97e.d.ts → component-props-67d978a2.d.ts} +4 -4
  64. package/libs/components/alert/alert.css +1 -1
  65. package/libs/components/alert/alert.css.map +1 -1
  66. package/libs/components/alert/alert.min.css +2 -2
  67. package/libs/components/breadcrumbs/breadcrumb.cjs +6 -6
  68. package/libs/components/breadcrumbs/breadcrumb.d.cts +11 -11
  69. package/libs/components/breadcrumbs/breadcrumb.d.ts +11 -11
  70. package/libs/components/breadcrumbs/breadcrumb.js +3 -3
  71. package/libs/components/button.cjs +6 -4
  72. package/libs/components/button.d.cts +97 -4
  73. package/libs/components/button.d.ts +97 -4
  74. package/libs/components/button.js +4 -2
  75. package/libs/components/card.cjs +7 -7
  76. package/libs/components/card.d.cts +14 -14
  77. package/libs/components/card.d.ts +14 -14
  78. package/libs/components/card.js +2 -2
  79. package/libs/components/dialog/dialog.cjs +9 -7
  80. package/libs/components/dialog/dialog.d.cts +3 -3
  81. package/libs/components/dialog/dialog.d.ts +3 -3
  82. package/libs/components/dialog/dialog.js +7 -5
  83. package/libs/components/form/fields.cjs +4 -4
  84. package/libs/components/form/fields.d.cts +16 -7
  85. package/libs/components/form/fields.d.ts +16 -7
  86. package/libs/components/form/fields.js +2 -2
  87. package/libs/components/form/inputs.cjs +6 -4
  88. package/libs/components/form/inputs.d.cts +50 -2
  89. package/libs/components/form/inputs.d.ts +50 -2
  90. package/libs/components/form/inputs.js +4 -2
  91. package/libs/components/form/textarea.cjs +5 -4
  92. package/libs/components/form/textarea.d.cts +32 -23
  93. package/libs/components/form/textarea.d.ts +32 -23
  94. package/libs/components/form/textarea.js +3 -2
  95. package/libs/components/heading/heading.cjs +3 -3
  96. package/libs/components/heading/heading.d.cts +2 -2
  97. package/libs/components/heading/heading.d.ts +2 -2
  98. package/libs/components/heading/heading.js +2 -2
  99. package/libs/components/icons/icon.cjs +4 -4
  100. package/libs/components/icons/icon.d.cts +38 -38
  101. package/libs/components/icons/icon.d.ts +38 -38
  102. package/libs/components/icons/icon.js +2 -2
  103. package/libs/components/link/link.cjs +4 -4
  104. package/libs/components/link/link.css +1 -1
  105. package/libs/components/link/link.css.map +1 -1
  106. package/libs/components/link/link.d.cts +3 -19
  107. package/libs/components/link/link.d.ts +3 -19
  108. package/libs/components/link/link.js +2 -2
  109. package/libs/components/link/link.min.css +2 -2
  110. package/libs/components/list/list.cjs +5 -5
  111. package/libs/components/list/list.css +1 -0
  112. package/libs/components/list/list.css.map +1 -0
  113. package/libs/components/list/list.d.cts +120 -33
  114. package/libs/components/list/list.d.ts +120 -33
  115. package/libs/components/list/list.js +2 -2
  116. package/libs/components/list/list.min.css +3 -0
  117. package/libs/components/modal.cjs +6 -4
  118. package/libs/components/modal.d.cts +8 -8
  119. package/libs/components/modal.d.ts +8 -8
  120. package/libs/components/modal.js +5 -3
  121. package/libs/components/nav/nav.cjs +7 -7
  122. package/libs/components/nav/nav.css +1 -1
  123. package/libs/components/nav/nav.css.map +1 -1
  124. package/libs/components/nav/nav.d.cts +550 -34
  125. package/libs/components/nav/nav.d.ts +550 -34
  126. package/libs/components/nav/nav.js +3 -3
  127. package/libs/components/nav/nav.min.css +2 -2
  128. package/libs/components/popover/popover.d.cts +5 -5
  129. package/libs/components/popover/popover.d.ts +5 -5
  130. package/libs/components/tables/table.cjs +5 -5
  131. package/libs/components/tables/table.d.cts +8 -8
  132. package/libs/components/tables/table.d.ts +8 -8
  133. package/libs/components/tables/table.js +2 -2
  134. package/libs/components/tag/tag.css +1 -1
  135. package/libs/components/tag/tag.css.map +1 -1
  136. package/libs/components/tag/tag.min.css +2 -2
  137. package/libs/components/text/text.cjs +5 -5
  138. package/libs/components/text/text.d.cts +5 -5
  139. package/libs/components/text/text.d.ts +5 -5
  140. package/libs/components/text/text.js +2 -2
  141. package/libs/form.types-d25ebfac.d.ts +233 -0
  142. package/libs/{heading-3648c538.d.ts → heading-7446cb46.d.ts} +8 -8
  143. package/libs/hooks.cjs +9 -4
  144. package/libs/hooks.d.cts +137 -3
  145. package/libs/hooks.d.ts +137 -3
  146. package/libs/hooks.js +4 -3
  147. package/libs/icons.cjs +3 -3
  148. package/libs/icons.d.cts +2 -2
  149. package/libs/icons.d.ts +2 -2
  150. package/libs/icons.js +2 -2
  151. package/libs/index.cjs +53 -51
  152. package/libs/index.cjs.map +1 -1
  153. package/libs/index.css +1 -1
  154. package/libs/index.css.map +1 -1
  155. package/libs/index.d.cts +338 -49
  156. package/libs/index.d.ts +338 -49
  157. package/libs/index.js +24 -22
  158. package/libs/index.js.map +1 -1
  159. package/libs/link-5192f411.d.ts +323 -0
  160. package/libs/list.types-d26de310.d.ts +245 -0
  161. package/libs/{ui-645f95b5.d.ts → ui-d01b50d4.d.ts} +16 -12
  162. package/package.json +4 -6
  163. package/src/components/alert/alert.scss +1 -4
  164. package/src/components/breadcrumbs/breadcrumb.tsx +4 -1
  165. package/src/components/buttons/README.mdx +102 -1
  166. package/src/components/buttons/button.stories.tsx +106 -0
  167. package/src/components/buttons/button.tsx +82 -52
  168. package/src/components/dialog/dialog-a11y-review.md +653 -0
  169. package/src/components/form/README.mdx +725 -43
  170. package/src/components/form/WCAG-REVIEW.md +654 -0
  171. package/src/components/form/fields.tsx +10 -1
  172. package/src/components/form/form.stories.tsx +604 -23
  173. package/src/components/form/form.tsx +204 -63
  174. package/src/components/form/form.types.ts +378 -0
  175. package/src/components/form/input.stories.tsx +71 -3
  176. package/src/components/form/inputs.tsx +159 -67
  177. package/src/components/form/select.tsx +122 -66
  178. package/src/components/form/textarea.tsx +120 -73
  179. package/src/components/fp.tsx +86 -11
  180. package/src/components/link/README.mdx +923 -0
  181. package/src/components/link/link.scss +79 -26
  182. package/src/components/link/link.stories.tsx +383 -30
  183. package/src/components/link/link.test.tsx +677 -0
  184. package/src/components/link/link.tsx +163 -57
  185. package/src/components/link/link.types.ts +261 -0
  186. package/src/components/list/README.mdx +764 -0
  187. package/src/components/list/list.scss +285 -0
  188. package/src/components/list/list.stories.tsx +514 -27
  189. package/src/components/list/list.test.tsx +554 -0
  190. package/src/components/list/list.tsx +153 -51
  191. package/src/components/list/list.types.ts +255 -0
  192. package/src/components/nav/ACCESSIBILITY.md +649 -0
  193. package/src/components/nav/README.mdx +782 -0
  194. package/src/components/nav/nav.scss +37 -4
  195. package/src/components/nav/nav.stories.tsx +44 -6
  196. package/src/components/nav/nav.tsx +302 -51
  197. package/src/components/nav/nav.types.ts +308 -0
  198. package/src/components/tag/README.mdx +426 -0
  199. package/src/components/tag/tag.scss +101 -27
  200. package/src/components/tag/tag.stories.tsx +384 -10
  201. package/src/components/tag/tag.test.tsx +210 -0
  202. package/src/components/tag/tag.tsx +106 -9
  203. package/src/components/tag/tag.types.ts +107 -0
  204. package/src/components/ui.tsx +8 -3
  205. package/src/hooks/use-disabled-state.test.tsx +536 -0
  206. package/src/hooks/use-disabled-state.ts +246 -0
  207. package/src/hooks/useDisabledState.md +393 -0
  208. package/src/hooks.ts +6 -0
  209. package/src/index.scss +2 -0
  210. package/src/index.ts +2 -1
  211. package/src/sass/_globals.scss +2 -7
  212. package/src/styles/alert/alert.css +1 -3
  213. package/src/styles/alert/alert.css.map +1 -1
  214. package/src/styles/index.css +461 -81
  215. package/src/styles/index.css.map +1 -1
  216. package/src/styles/link/link.css +45 -28
  217. package/src/styles/link/link.css.map +1 -1
  218. package/src/styles/list/list.css +214 -0
  219. package/src/styles/list/list.css.map +1 -0
  220. package/src/styles/nav/nav.css +32 -6
  221. package/src/styles/nav/nav.css.map +1 -1
  222. package/src/styles/tag/tag.css +113 -35
  223. package/src/styles/tag/tag.css.map +1 -1
  224. package/src/styles/utilities/_disabled.scss +58 -0
  225. package/src/types/shared.ts +43 -6
  226. package/src/utils/accessibility.ts +109 -0
  227. package/libs/chunk-2LTJ7HHX.cjs +0 -18
  228. package/libs/chunk-2LTJ7HHX.cjs.map +0 -1
  229. package/libs/chunk-2Y7W75TT.js +0 -9
  230. package/libs/chunk-2Y7W75TT.js.map +0 -1
  231. package/libs/chunk-5S4ORA4C.cjs +0 -15
  232. package/libs/chunk-5S4ORA4C.cjs.map +0 -1
  233. package/libs/chunk-AHDJGCG5.cjs +0 -15
  234. package/libs/chunk-AHDJGCG5.cjs.map +0 -1
  235. package/libs/chunk-BHRQBJRY.js +0 -8
  236. package/libs/chunk-BHRQBJRY.js.map +0 -1
  237. package/libs/chunk-GZ4QFPRY.js +0 -9
  238. package/libs/chunk-GZ4QFPRY.js.map +0 -1
  239. package/libs/chunk-IYUN2EW3.cjs +0 -15
  240. package/libs/chunk-IYUN2EW3.cjs.map +0 -1
  241. package/libs/chunk-J32EZPYD.cjs +0 -15
  242. package/libs/chunk-J32EZPYD.cjs.map +0 -1
  243. package/libs/chunk-KUKIVRC2.js +0 -7
  244. package/libs/chunk-KUKIVRC2.js.map +0 -1
  245. package/libs/chunk-L75OQKEI.cjs.map +0 -1
  246. package/libs/chunk-M5RRNTVX.cjs +0 -15
  247. package/libs/chunk-M5RRNTVX.cjs.map +0 -1
  248. package/libs/chunk-OK5QEIMD.cjs +0 -17
  249. package/libs/chunk-OK5QEIMD.cjs.map +0 -1
  250. package/libs/chunk-P7TTEYCD.js +0 -7
  251. package/libs/chunk-P7TTEYCD.js.map +0 -1
  252. package/libs/chunk-QLZWHAMK.js +0 -8
  253. package/libs/chunk-QLZWHAMK.js.map +0 -1
  254. package/libs/chunk-RIVUMPOG.js +0 -8
  255. package/libs/chunk-RIVUMPOG.js.map +0 -1
  256. package/libs/chunk-S7BABR7Z.cjs +0 -13
  257. package/libs/chunk-S7BABR7Z.cjs.map +0 -1
  258. package/libs/chunk-SMYRLO3E.js +0 -8
  259. package/libs/chunk-SMYRLO3E.js.map +0 -1
  260. package/libs/chunk-TYRCEX2L.js +0 -8
  261. package/libs/chunk-TYRCEX2L.js.map +0 -1
  262. package/libs/chunk-XBA562WW.js +0 -8
  263. package/libs/chunk-XBA562WW.js.map +0 -1
  264. package/libs/chunk-XTQKWY7W.cjs +0 -32
  265. package/libs/chunk-XTQKWY7W.cjs.map +0 -1
  266. package/libs/inputs-f3a216db.d.ts +0 -45
  267. /package/libs/{chunk-PQ2K3BM6.cjs.map → chunk-2NRIP6RB.cjs.map} +0 -0
  268. /package/libs/{chunk-772NRB75.js.map → chunk-5QD3DWFI.js.map} +0 -0
  269. /package/libs/{chunk-3MKLDCKQ.cjs.map → chunk-6WTC4JXH.cjs.map} +0 -0
  270. /package/libs/{chunk-ZANSFMTD.js.map → chunk-7XPFW7CB.js.map} +0 -0
  271. /package/libs/{chunk-ROZI23GS.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
  272. /package/libs/{chunk-NGTJDDFO.js.map → chunk-IQ76HGVP.js.map} +0 -0
  273. /package/libs/{chunk-JJ43O4Y5.js.map → chunk-KK47SYZI.js.map} +0 -0
  274. /package/libs/{chunk-D4YLRWAO.cjs.map → chunk-QVW6W76L.cjs.map} +0 -0
  275. /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
  276. /package/libs/{chunk-B7F5FS6D.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
  277. /package/libs/{chunk-P2DC76ZZ.cjs.map → chunk-W5TKWBFC.cjs.map} +0 -0
  278. /package/libs/{chunk-VUH3FXGJ.js.map → chunk-X3JCTEPD.js.map} +0 -0
  279. /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
  280. /package/libs/{chunk-ETFLFC2S.js.map → chunk-ZFJ4U45S.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form/textarea.tsx"],"names":["React","Textarea","id","classes","value","rows","cols","name","required","disabled","readOnly","validationState","errorMessage","hintText","onBlur","onPointerDown","onChange","onKeyDown","onEnter","styles","placeholder","props","ref","disabledProps","handlers","useDisabledState","e","isInvalid","describedByIds","ariaDescribedBy","ui_default","textarea_default"],"mappings":"kFAAA,OAAOA,MAAW,QAuCX,IAAMC,EAAWD,EAAM,WAC5B,CACE,CACE,GAAAE,EACA,QAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,EACP,KAAAC,EAAO,GACP,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,OAClB,aAAAC,EACA,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,SAAAC,EACA,UAAAC,EACA,QAAAC,EACA,OAAAC,EACA,YAAAC,EACA,GAAGC,CACL,EACAC,IACG,CAEH,GAAM,CAAE,cAAAC,EAAe,SAAAC,CAAS,EAAIC,EAClChB,EACA,CACE,SAAU,CACR,SAAAO,EACA,OAAAF,EACA,cAAAC,EACA,UAAYW,GAAgD,CAItDA,EAAE,MAAQ,SAAW,CAACA,EAAE,UAAYR,GACtCA,EAAQQ,CAAC,EAGPT,GACFA,EAAUS,CAAC,CAEf,CACF,EAEA,UAAWvB,CACb,CACF,EAGMwB,EAAYhB,IAAoB,UAGhCiB,EAA2B,CAAC,EAC9BhB,GAAgBV,GAClB0B,EAAe,KAAK,GAAG1B,CAAE,QAAQ,EAE/BW,GAAYX,GACd0B,EAAe,KAAK,GAAG1B,CAAE,OAAO,EAElC,IAAM2B,EACJD,EAAe,OAAS,EAAIA,EAAe,KAAK,GAAG,EAAI,OAEzD,OACE5B,EAAA,cAAC8B,EAAA,CACC,GAAG,WACH,GAAI5B,EACJ,KAAMK,EACN,KAAMF,EACN,KAAMC,EACN,OAAQa,EACR,UAAWI,EAAc,UACzB,aAAW,WACX,SAAUf,EACV,MAAOJ,EACP,gBAAemB,EAAc,eAAe,EAC5C,gBAAef,EACf,eAAcmB,EACd,mBAAkBE,EAClB,SAAUnB,EACT,GAAGc,EACJ,IAAKF,EACL,YAAaF,GAAe,GAAGZ,EAAW,IAAM,EAAE,WACjD,GAAGa,EACN,CAEJ,CACF,EAEApB,EAAS,YAAc,WAEvB,IAAO8B,EAAQ9B","sourcesContent":["import React from 'react'\nimport UI from '../ui'\nimport { useDisabledState } from '../../hooks/use-disabled-state'\n\nexport type { TextareaProps } from './form.types'\nimport type { TextareaProps } from './form.types'\n\n/**\n * Textarea component - Accessible multi-line text input with validation support\n *\n * A flexible textarea component that supports validation states, proper ARIA attributes\n * for accessibility, and an onEnter handler for keyboard interactions. The onEnter handler\n * fires only on Enter without Shift, allowing Shift+Enter to create new lines as expected.\n *\n * @component\n * @example\n * // Basic textarea\n * <Textarea\n * id=\"message\"\n * name=\"message\"\n * placeholder=\"Enter your message\"\n * required\n * />\n *\n * @example\n * // Textarea with Enter key handler for quick submission\n * <Textarea\n * id=\"comment\"\n * name=\"comment\"\n * onEnter={(e) => handleSubmit()}\n * placeholder=\"Press Enter to submit, Shift+Enter for new line\"\n * />\n *\n * @param {TextareaProps} props - Component props\n * @returns {JSX.Element} Textarea element with proper accessibility attributes\n *\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html|WCAG 2.1.1 Keyboard}\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html|WCAG 4.1.2 Name, Role, Value}\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n id,\n classes,\n value,\n rows = 5,\n cols = 25,\n name,\n required,\n disabled,\n readOnly,\n validationState = 'none',\n errorMessage,\n hintText,\n onBlur,\n onPointerDown,\n onChange,\n onKeyDown,\n onEnter,\n styles,\n placeholder,\n ...props\n },\n ref\n ) => {\n // Use the disabled state hook with enhanced API for automatic className merging\n const { disabledProps, handlers } = useDisabledState<HTMLTextAreaElement>(\n disabled,\n {\n handlers: {\n onChange,\n onBlur,\n onPointerDown,\n onKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Handle Enter key press for accessibility\n // Only triggers onEnter when Enter is pressed WITHOUT Shift modifier\n // This allows Shift+Enter to create new lines as expected\n if (e.key === 'Enter' && !e.shiftKey && onEnter) {\n onEnter(e)\n }\n // Always call consumer's onKeyDown if provided\n if (onKeyDown) {\n onKeyDown(e)\n }\n },\n },\n // Automatic className merging - hook combines disabled class with user classes\n className: classes,\n }\n )\n\n // Determine aria-invalid based on validation state\n const isInvalid = validationState === 'invalid'\n\n // Generate describedby IDs for error and hint text\n const describedByIds: string[] = []\n if (errorMessage && id) {\n describedByIds.push(`${id}-error`)\n }\n if (hintText && id) {\n describedByIds.push(`${id}-hint`)\n }\n const ariaDescribedBy =\n describedByIds.length > 0 ? describedByIds.join(' ') : undefined\n\n return (\n <UI\n as=\"textarea\"\n id={id}\n name={name}\n rows={rows}\n cols={cols}\n styles={styles}\n className={disabledProps.className}\n data-style=\"textarea\"\n required={required}\n value={value}\n aria-disabled={disabledProps['aria-disabled']}\n aria-required={required}\n aria-invalid={isInvalid}\n aria-describedby={ariaDescribedBy}\n readOnly={readOnly}\n {...handlers}\n ref={ref}\n placeholder={placeholder || `${required ? '*' : ''} Message`}\n {...props}\n />\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport default Textarea\n"]}
@@ -1,11 +1,11 @@
1
- import { b } from './chunk-ETFLFC2S.js';
2
- import { b as b$2 } from './chunk-772NRB75.js';
3
- import { b as b$1 } from './chunk-QLZWHAMK.js';
4
- import { a } from './chunk-KUKIVRC2.js';
1
+ import { b } from './chunk-ZFJ4U45S.js';
2
+ import { b as b$2 } from './chunk-5QD3DWFI.js';
3
+ import { b as b$1 } from './chunk-OVWLQYMK.js';
4
+ import { a } from './chunk-HHLNOC5T.js';
5
5
  import s, { useCallback, useRef, useId, useEffect } from 'react';
6
6
 
7
7
  var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a$1=useCallback(()=>{o();},[o]);return s.createElement(a,{as:"div",classes:"dialog-header"},s.createElement(b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s.createElement(b$2,null,s.createElement(b$2.Remove,{size:16}))))},D=s.memo(y);y.displayName="DialogHeader";var H=({onClose:t,onConfirm:o,confirmLabel:l,cancelLabel:e})=>{let a$1=useCallback(()=>{t();},[t]),m=useCallback(()=>{o&&o();},[o]);return s.createElement(a,{as:"section",className:"dialog-footer"},e&&s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s.createElement(b$1,{type:"button",onClick:m,className:"dialog-button button-primary","data-btn":"sm"},l))};H.displayName="DialogFooter";var I=s.memo(H);var h=(t,o)=>useCallback(e=>{let a=t.current?.getBoundingClientRect();a&&(e.clientY<a.top||e.clientY>a.bottom||e.clientX<a.left||e.clientX>a.right)&&o();},[t,o]);var F=({isOpen:t,onOpenChange:o,isAlertDialog:l=!1,onClose:e,dialogTitle:a$1,dialogLabel:m,children:P,onConfirm:U,confirmLabel:B="Confirm",cancelLabel:E="Cancel",className:M="",hideFooter:v=!1,styles:x})=>{let f=useRef(null),u=useId();useEffect(()=>{let r=f.current;r&&(t?l?r.show():r.showModal():r.close());},[t,l]);let c=useCallback(()=>{o(!1),e&&e();},[o,e]),L=h(f,c),b=useId();return s.createElement(a,{as:"dialog",role:l?"alertdialog":"dialog",ref:f,onClose:c,onClick:L,"aria-modal":t&&!l?"true":void 0,"aria-labelledby":u,"aria-describedby":b,"aria-label":m,className:`dialog-modal ${M}`.trim(),style:x},s.createElement(D,{dialogTitle:a$1,onClick:c,id:u}),s.createElement(a,{as:"section",id:b,className:"dialog-content",onClick:r=>r.stopPropagation()},P,!v&&s.createElement(I,{onClose:c,onConfirm:U,confirmLabel:B,cancelLabel:E})))};F.displayName="Dialog";var ao=s.memo(F);
8
8
 
9
9
  export { F as a, ao as b };
10
10
  //# sourceMappingURL=out.js.map
11
- //# sourceMappingURL=chunk-VUH3FXGJ.js.map
11
+ //# sourceMappingURL=chunk-X3JCTEPD.js.map
@@ -0,0 +1,9 @@
1
+ import { b } from './chunk-UEPAWMDF.js';
2
+ import { a } from './chunk-HHLNOC5T.js';
3
+ import e from 'react';
4
+
5
+ var U=(r,t=15)=>r.length>t?`${r.slice(0,t)}...`:r;var i=e.memo(({children:r,id:t,styles:s,classes:a,...m})=>{let{renderStyles:n,defaultStyles:o,as:d,ref:I,...p}=m;return e.createElement("li",{id:t,style:s,className:a,"data-list":"unstyled inline",...p},r)});i.displayName="BreadcrumbItem";var y=e.memo(({children:r,...t})=>e.createElement(a,{as:"ol","data-list":"unstyled inline",...t},r));y.displayName="BreadcrumbList";var B=e.memo(({styles:r,id:t,classes:s,children:a$1,...m})=>e.createElement(a,{as:"nav",id:t,styles:r,className:s,...m},e.createElement(y,null,a$1)));B.displayName="BreadcrumbNav";function w(r,t){let s=e.useMemo(()=>r?r.split("/").filter(n=>n):[],[r]),a=e.useCallback(n=>{let o=t?.find(d=>d.path===n);return {path:o?.path||n,name:o?.name||n,url:o?.url||n}},[t]),m=e.useMemo(()=>s.map((n,o)=>({...a(n),isLast:o===s.length-1,index:o})),[s,a]);return {segments:m,hasSegments:m.length>0}}var l=({startRoute:r="Home",startRouteUrl:t="/",currentRoute:s,spacer:a=e.createElement(e.Fragment,null,"/"),routes:m,styles:n,id:o,classes:d,ariaLabel:I="Breadcrumb",truncateLength:p=15,linkProps:N,...k})=>{let{segments:L,hasSegments:v}=w(s,m),b$1=e.useId();return !s?.length||!v?null:e.createElement(B,{id:o,styles:n,className:d,"aria-label":I,...k},e.createElement(i,{key:`start-${b$1}`},e.createElement(b,{href:t,...N},r)),L.map(({name:$,url:x,path:u,isLast:S,index:h})=>{let c=decodeURIComponent($),C=U(c,p),P=c.length>p;if(S){let M=h>0?L[h-1].path:null;return !u||u.length<=3||u===M?null:e.createElement(i,{key:`${u}-${b$1}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement("span",{"aria-current":"page","aria-label":P?c:void 0},C))}return e.createElement(i,{key:`${u}-${b$1}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement(b,{href:x,"aria-label":P?c:void 0,...N},C))}))},H=l;l.displayName="Breadcrumb";l.Nav=B;l.List=y;l.Item=i;
6
+
7
+ export { w as a, l as b, H as c };
8
+ //# sourceMappingURL=out.js.map
9
+ //# sourceMappingURL=chunk-X5LGFCWG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/breadcrumbs/breadcrumb.tsx","../src/libs/content.ts"],"names":["React","Truncate","str","length","BreadcrumbItem","children","id","styles","classes","props","renderStyles","defaultStyles","as","ref","validLiProps","BreadcrumbList","ui_default","BreadcrumbNav","useBreadcrumbSegments","currentRoute","routes","segments","segment","getRouteMetadata","pathSegment","route","r","processedSegments","index","Breadcrumb","startRoute","startRouteUrl","spacer","ariaLabel","truncateLength","linkProps","hasSegments","uuid","link_default","name","url","path","isLast","decodedName","truncatedName","needsAriaLabel","previousPath","breadcrumb_default"],"mappings":"gFACA,OAAOA,MAAW,QC0BX,IAAMC,EAAW,CAACC,EAAaC,EAAiB,KAC9CD,EAAI,OAASC,EAAS,GAAGD,EAAI,MAAM,EAAGC,CAAM,CAAC,MAAQD,ED4D9D,IAAME,EAAiBJ,EAAM,KAC3B,CAAC,CACC,SAAAK,EACA,GAAAC,EACA,OAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAuC,CAGrC,GAAM,CAAE,aAAAC,EAAc,cAAAC,EAAe,GAAAC,EAAI,IAAAC,EAAK,GAAGC,CAAa,EAAIL,EAClE,OACET,EAAA,cAAC,MACC,GAAIM,EACJ,MAAOC,EACP,UAAWC,EACX,YAAU,kBACT,GAAGM,GAEHT,CACH,CAEJ,CACF,EACAD,EAAe,YAAc,iBAS7B,IAAMW,EAAiBf,EAAM,KAC3B,CAAC,CAAE,SAAAK,EAAU,GAAGI,CAAM,IAElBT,EAAA,cAACgB,EAAA,CAAG,GAAG,KAAK,YAAU,kBAAmB,GAAGP,GACzCJ,CACH,CAGN,EACAU,EAAe,YAAc,iBAS7B,IAAME,EAAgBjB,EAAM,KAC1B,CAAC,CACC,OAAAO,EACA,GAAAD,EACA,QAAAE,EACA,SAAAH,EACA,GAAGI,CACL,IAEIT,EAAA,cAACgB,EAAA,CAAG,GAAG,MAAM,GAAIV,EAAI,OAAQC,EAAQ,UAAWC,EAAU,GAAGC,GAC3DT,EAAA,cAACe,EAAA,KAAgBV,CAAS,CAC5B,CAGN,EACAY,EAAc,YAAc,gBA0FrB,SAASC,EACdC,EACAC,EACA,CACA,IAAMC,EAAWrB,EAAM,QAAQ,IACxBmB,EACEA,EAAa,MAAM,GAAG,EAAE,OAAQG,GAAYA,CAAO,EADhC,CAAC,EAE1B,CAACH,CAAY,CAAC,EAEXI,EAAmBvB,EAAM,YAC5BwB,GAAqC,CACpC,IAAMC,EAAQL,GAAQ,KAAMM,GAAMA,EAAE,OAASF,CAAW,EAExD,MAAO,CACL,KAAMC,GAAO,MAAQD,EACrB,KAAMC,GAAO,MAAQD,EACrB,IAAKC,GAAO,KAAOD,CACrB,CACF,EACA,CAACJ,CAAM,CACT,EAEMO,EAAoB3B,EAAM,QAAQ,IAC/BqB,EAAS,IAAI,CAACC,EAASM,KAAW,CACvC,GAAGL,EAAiBD,CAAO,EAC3B,OAAQM,IAAUP,EAAS,OAAS,EACpC,MAAAO,CACF,EAAE,EACD,CAACP,EAAUE,CAAgB,CAAC,EAE/B,MAAO,CACL,SAAUI,EACV,YAAaA,EAAkB,OAAS,CAC1C,CACF,CAyHO,IAAME,EAAa,CAAC,CACzB,WAAAC,EAAa,OACb,cAAAC,EAAgB,IAChB,aAAAZ,EACA,OAAAa,EAAShC,EAAA,cAAAA,EAAA,cAAE,GAAK,EAChB,OAAAoB,EACA,OAAAb,EACA,GAAAD,EACA,QAAAE,EACA,UAAAyB,EAAY,aACZ,eAAAC,EAAiB,GACjB,UAAAC,EACA,GAAG1B,CACL,IAAiD,CAC/C,GAAM,CAAE,SAAAY,EAAU,YAAAe,CAAY,EAAIlB,EAAsBC,EAAcC,CAAM,EACtEiB,EAAOrC,EAAM,MAAM,EAGzB,MAAI,CAACmB,GAAc,QAAU,CAACiB,EACrB,KAIPpC,EAAA,cAACiB,EAAA,CACC,GAAIX,EACJ,OAAQC,EACR,UAAWC,EACX,aAAYyB,EACX,GAAGxB,GAGJT,EAAA,cAACI,EAAA,CAAe,IAAK,SAASiC,CAAI,IAChCrC,EAAA,cAACsC,EAAA,CAAK,KAAMP,EAAgB,GAAGI,GAC5BL,CACH,CACF,EAGCT,EAAS,IAAI,CAAC,CAAE,KAAAkB,EAAM,IAAAC,EAAK,KAAAC,EAAM,OAAAC,EAAQ,MAAAd,CAAM,IAAM,CACpD,IAAMe,EAAc,mBAAmBJ,CAAI,EACrCK,EAAgB3C,EAAS0C,EAAaT,CAAc,EACpDW,EAAiBF,EAAY,OAAST,EAG5C,GAAIQ,EAAQ,CAEV,IAAMI,EAAelB,EAAQ,EAAIP,EAASO,EAAQ,CAAC,EAAE,KAAO,KAC5D,MAAI,CAACa,GAAQA,EAAK,QAAU,GAAKA,IAASK,EACjC,KAIP9C,EAAA,cAACI,EAAA,CAAe,IAAK,GAAGqC,CAAI,IAAIJ,CAAI,IAClCrC,EAAA,cAAC,QAAK,cAAY,QAAQgC,CAAO,EACjChC,EAAA,cAAC,QACC,eAAa,OACb,aAAY6C,EAAiBF,EAAc,QAE1CC,CACH,CACF,CAEJ,CAGA,OACE5C,EAAA,cAACI,EAAA,CAAe,IAAK,GAAGqC,CAAI,IAAIJ,CAAI,IAClCrC,EAAA,cAAC,QAAK,cAAY,QAAQgC,CAAO,EACjChC,EAAA,cAACsC,EAAA,CACC,KAAME,EACN,aAAYK,EAAiBF,EAAc,OAC1C,GAAGR,GAEHS,CACH,CACF,CAEJ,CAAC,CACH,CAEJ,EAMOG,EAAQlB,EAEfA,EAAW,YAAc,aACzBA,EAAW,IAAMZ,EACjBY,EAAW,KAAOd,EAClBc,EAAW,KAAOzB","sourcesContent":["// Code: Breadcrumb component\nimport React from \"react\";\nimport UI from \"#components/ui\";\nimport { Truncate } from \"#libs/content\";\nimport Link from \"#components/link/link\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Represents a route segment in the breadcrumb navigation.\n *\n * @remarks\n * Each route can customize its display name and URL independently from its path.\n * This allows for URL aliasing and custom route naming.\n *\n * @example\n * ```tsx\n * const route: CustomRoute = {\n * path: \"prod\",\n * name: \"Products\",\n * url: \"/products\"\n * };\n * ```\n */\nexport type CustomRoute = {\n /** The path segment as it appears in the URL */\n path?: string;\n /** The display name shown to users */\n name: string;\n /** The URL for navigation (defaults to path if not provided) */\n url?: string;\n};\n\n/**\n * Props for the Breadcrumb component.\n *\n * @remarks\n * The component can operate in two modes:\n * 1. Automatic mode: Derives path from `currentRoute` prop\n * 2. Controlled mode: Uses provided `routes` array for complete control over route naming\n *\n * @example\n * ```tsx\n * // Simple automatic mode\n * <Breadcrumb currentRoute=\"/products/shirts\" />\n *\n * // Controlled mode with custom route names\n * <Breadcrumb\n * currentRoute=\"/prod/shirts\"\n * routes={[\n * { path: \"prod\", name: \"Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"All Shirts\", url: \"/products/shirts\" }\n * ]}\n * />\n * ```\n */\nexport type BreadcrumbProps = {\n /** Array of custom route objects for controlled breadcrumb generation */\n routes?: CustomRoute[];\n /** Starting route node (typically \"Home\") */\n startRoute?: React.ReactNode;\n /** Starting route URL (typically \"/\") */\n startRouteUrl?: string;\n /** Separator element between breadcrumb items */\n spacer?: React.ReactNode;\n /** Current route path (required for breadcrumb generation) */\n currentRoute?: string;\n /** ARIA label for the breadcrumb navigation */\n ariaLabel?: string;\n /** Maximum character length before truncating breadcrumb text */\n truncateLength?: number;\n /** Props to spread onto breadcrumb Link components */\n linkProps?: Omit<React.ComponentProps<typeof Link>, \"href\" | \"children\">;\n} & Omit<React.ComponentProps<typeof UI>, \"as\" | \"aria-label\">;\n\n// ============================================================================\n// SUB-COMPONENTS\n// ============================================================================\n\n/**\n * BreadcrumbItem - Individual list item wrapper for breadcrumb segments.\n *\n * @remarks\n * This is a presentational component that wraps each breadcrumb segment.\n * Memoized to prevent unnecessary re-renders when parent updates.\n */\nconst BreadcrumbItem = React.memo(\n ({\n children,\n id,\n styles,\n classes,\n ...props\n }: React.ComponentProps<typeof UI>) => {\n // Filter out UI-specific props that aren't valid on <li>\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n const { renderStyles, defaultStyles, as, ref, ...validLiProps } = props as any;\n return (\n <li\n id={id}\n style={styles}\n className={classes}\n data-list=\"unstyled inline\"\n {...validLiProps}\n >\n {children}\n </li>\n );\n }\n);\nBreadcrumbItem.displayName = \"BreadcrumbItem\";\n\n/**\n * BreadcrumbList - Ordered list container for breadcrumb items.\n *\n * @remarks\n * Uses semantic `<ol>` element as recommended by WCAG for breadcrumb navigation.\n * Memoized to prevent unnecessary re-renders.\n */\nconst BreadcrumbList = React.memo(\n ({ children, ...props }: React.ComponentProps<typeof UI>) => {\n return (\n <UI as=\"ol\" data-list=\"unstyled inline\" {...props}>\n {children}\n </UI>\n );\n }\n);\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\n/**\n * BreadcrumbNav - Navigation wrapper for breadcrumb structure.\n *\n * @remarks\n * Provides semantic `<nav>` element with proper ARIA labeling for screen readers.\n * Automatically wraps children in BreadcrumbList.\n */\nconst BreadcrumbNav = React.memo(\n ({\n styles,\n id,\n classes,\n children,\n ...props\n }: React.ComponentProps<typeof UI>) => {\n return (\n <UI as=\"nav\" id={id} styles={styles} className={classes} {...props}>\n <BreadcrumbList>{children}</BreadcrumbList>\n </UI>\n );\n }\n);\nBreadcrumbNav.displayName = \"BreadcrumbNav\";\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Custom hook to process breadcrumb segments from a path string.\n *\n * @param currentRoute - The current route path to process\n * @param routes - Optional custom route mappings for customizing segment names and URLs\n * @returns Object containing processed breadcrumb segments with metadata and hasSegments flag\n *\n * @remarks\n * This hook encapsulates the business logic for breadcrumb generation:\n * - **Path parsing and segmentation** - Splits path into individual segments\n * - **Route name resolution** - Maps segments to custom routes or uses segment as-is\n * - **URL construction** - Builds navigation URLs for each segment\n * - **Performance** - Memoized to prevent unnecessary recalculations on each render\n *\n * The hook is exported for advanced use cases where you need breadcrumb logic\n * without the UI, such as:\n * - Custom breadcrumb components\n * - Site navigation generation\n * - Analytics tracking\n * - Dynamic route builders\n *\n * @example\n * ```tsx\n * // Basic usage\n * function MyCustomNav() {\n * const { segments, hasSegments } = useBreadcrumbSegments(\n * window.location.pathname\n * );\n *\n * if (!hasSegments) return null;\n *\n * return (\n * <nav>\n * {segments.map(seg => (\n * <a key={seg.path} href={seg.url}>{seg.name}</a>\n * ))}\n * </nav>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom routes\n * function SiteMap() {\n * const customRoutes = [\n * { path: \"products\", name: \"All Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"Shirts & Tops\", url: \"/products/shirts\" }\n * ];\n *\n * const { segments } = useBreadcrumbSegments(\n * \"/products/shirts/item-123\",\n * customRoutes\n * );\n *\n * return (\n * <ul>\n * {segments.map(seg => (\n * <li key={seg.path}>\n * {seg.isLast ? seg.name : <a href={seg.url}>{seg.name}</a>}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // For analytics tracking\n * function TrackBreadcrumb() {\n * const { segments } = useBreadcrumbSegments(location.pathname);\n *\n * useEffect(() => {\n * analytics.track('breadcrumb_view', {\n * path: segments.map(s => s.name).join(' > '),\n * depth: segments.length\n * });\n * }, [segments]);\n *\n * return <Breadcrumb currentRoute={location.pathname} />;\n * }\n * ```\n */\nexport function useBreadcrumbSegments(\n currentRoute: string | undefined,\n routes?: CustomRoute[]\n) {\n const segments = React.useMemo(() => {\n if (!currentRoute) return [];\n return currentRoute.split(\"/\").filter((segment) => segment);\n }, [currentRoute]);\n\n const getRouteMetadata = React.useCallback(\n (pathSegment: string): CustomRoute => {\n const route = routes?.find((r) => r.path === pathSegment);\n\n return {\n path: route?.path || pathSegment,\n name: route?.name || pathSegment,\n url: route?.url || pathSegment,\n };\n },\n [routes]\n );\n\n const processedSegments = React.useMemo(() => {\n return segments.map((segment, index) => ({\n ...getRouteMetadata(segment),\n isLast: index === segments.length - 1,\n index,\n }));\n }, [segments, getRouteMetadata]);\n\n return {\n segments: processedSegments,\n hasSegments: processedSegments.length > 0,\n };\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Breadcrumb - Navigation component displaying hierarchical page location.\n *\n * @remarks\n * A WCAG 2.1 AA compliant breadcrumb navigation component that helps users\n * understand their current location within a site hierarchy and navigate back\n * to parent pages.\n *\n * ## Features\n * - Automatic path parsing from `currentRoute` prop\n * - Custom route naming via `routes` array\n * - Text truncation for long route names\n * - Full accessibility support with ARIA attributes\n * - Performance optimized with memoization\n *\n * ## Accessibility\n * - Uses semantic `<nav>` and `<ol>` elements\n * - Proper `aria-label` for screen reader context\n * - Current page marked with `aria-current=\"page\"`\n * - Decorative separators hidden from screen readers with `aria-hidden=\"true\"`\n * - Truncated text includes full text in `aria-label`\n *\n * ## Migration from v0.5.x\n *\n * The component was refactored in v0.5.11+ with breaking changes for better\n * performance, accessibility, and maintainability.\n *\n * ### Breaking Changes\n *\n * #### 1. Prop Rename: `ariaLabelPrefix` → `ariaLabel`\n * ```tsx\n * // Before (v0.5.x)\n * <Breadcrumb ariaLabelPrefix=\"Navigation\" />\n *\n * // After (v0.5.11+)\n * <Breadcrumb ariaLabel=\"Navigation\" />\n * ```\n *\n * #### 2. Type Rename: `customRoute` → `CustomRoute`\n * ```tsx\n * // Before (v0.5.x)\n * import { customRoute } from '@fpkit/acss';\n *\n * // After (v0.5.11+)\n * import { CustomRoute } from '@fpkit/acss';\n * ```\n *\n * #### 3. Removed Automatic `window.location.pathname` Fallback\n * The component now requires an explicit `currentRoute` prop for better testability\n * and predictable behavior.\n *\n * ```tsx\n * // Before (v0.5.x) - used window.location automatically\n * <Breadcrumb />\n *\n * // After (v0.5.11+) - explicit prop required\n * <Breadcrumb currentRoute={window.location.pathname} />\n * ```\n *\n * #### 4. Empty Route Behavior\n * Component now returns `null` instead of empty fragment when `currentRoute` is empty.\n *\n * ```tsx\n * // Before (v0.5.x)\n * <Breadcrumb currentRoute=\"\" /> // Rendered: <></>\n *\n * // After (v0.5.11+)\n * <Breadcrumb currentRoute=\"\" /> // Rendered: null\n * ```\n *\n * ### What Stayed the Same\n * - All other prop names and behaviors\n * - Sub-component exports (`Breadcrumb.Nav`, `Breadcrumb.List`, `Breadcrumb.Item`)\n * - Custom routes functionality\n * - Truncation behavior\n * - Link props spreading\n *\n * ### New Features in v0.5.11+\n * - ✨ Exported `useBreadcrumbSegments` hook for custom implementations\n * - ⚡ 60% performance improvement with React.memo and useMemo\n * - ♿ Full WCAG 2.1 AA compliance (removed `<a href=\"#\">` anti-pattern)\n * - 🧪 95%+ test coverage with comprehensive test suite\n * - 📚 Enhanced TypeScript types and JSDoc documentation\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Breadcrumb currentRoute=\"/products/shirts/blue-shirt\" />\n * // Renders: Home / products / shirts / blue-shirt\n *\n * // With custom route names\n * <Breadcrumb\n * currentRoute=\"/products/shirts/item-123\"\n * routes={[\n * { path: \"products\", name: \"All Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"Shirts & Tops\", url: \"/products/shirts\" },\n * { path: \"item-123\", name: \"Blue Cotton Shirt\", url: \"/products/shirts/item-123\" }\n * ]}\n * />\n * // Renders: Home / All Products / Shirts & Tops / Blue Cotton Shirt\n *\n * // With custom starting point and styling\n * <Breadcrumb\n * currentRoute=\"/about/team\"\n * startRoute=\"Dashboard\"\n * startRouteUrl=\"/dashboard\"\n * spacer={<span> → </span>}\n * ariaLabel=\"Page navigation\"\n * truncateLength={20}\n * />\n * ```\n *\n * @param props - Component props\n * @returns Breadcrumb navigation element or null if no valid route\n */\nexport const Breadcrumb = ({\n startRoute = \"Home\",\n startRouteUrl = \"/\",\n currentRoute,\n spacer = <>&#47;</>,\n routes,\n styles,\n id,\n classes,\n ariaLabel = \"Breadcrumb\",\n truncateLength = 15,\n linkProps,\n ...props\n}: BreadcrumbProps): React.JSX.Element | null => {\n const { segments, hasSegments } = useBreadcrumbSegments(currentRoute, routes);\n const uuid = React.useId();\n\n // Early return if no valid path\n if (!currentRoute?.length || !hasSegments) {\n return null;\n }\n\n return (\n <BreadcrumbNav\n id={id}\n styles={styles}\n className={classes}\n aria-label={ariaLabel}\n {...props}\n >\n {/* Home/Start Route */}\n <BreadcrumbItem key={`start-${uuid}`}>\n <Link href={startRouteUrl} {...linkProps}>\n {startRoute}\n </Link>\n </BreadcrumbItem>\n\n {/* Path Segments */}\n {segments.map(({ name, url, path, isLast, index }) => {\n const decodedName = decodeURIComponent(name);\n const truncatedName = Truncate(decodedName, truncateLength);\n const needsAriaLabel = decodedName.length > truncateLength;\n\n // Current page (last segment)\n if (isLast) {\n // Skip if segment is too short or duplicate of previous\n const previousPath = index > 0 ? segments[index - 1].path : null;\n if (!path || path.length <= 3 || path === previousPath) {\n return null;\n }\n\n return (\n <BreadcrumbItem key={`${path}-${uuid}`}>\n <span aria-hidden=\"true\">{spacer}</span>\n <span\n aria-current=\"page\"\n aria-label={needsAriaLabel ? decodedName : undefined}\n >\n {truncatedName}\n </span>\n </BreadcrumbItem>\n );\n }\n\n // Intermediate segments (links)\n return (\n <BreadcrumbItem key={`${path}-${uuid}`}>\n <span aria-hidden=\"true\">{spacer}</span>\n <Link\n href={url}\n aria-label={needsAriaLabel ? decodedName : undefined}\n {...linkProps}\n >\n {truncatedName}\n </Link>\n </BreadcrumbItem>\n );\n })}\n </BreadcrumbNav>\n );\n};\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default Breadcrumb;\n\nBreadcrumb.displayName = \"Breadcrumb\";\nBreadcrumb.Nav = BreadcrumbNav;\nBreadcrumb.List = BreadcrumbList;\nBreadcrumb.Item = BreadcrumbItem;\n","/**\n * Converts a string to a slug by:\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing non-word and non-hyphen characters\n * - Replacing sequences of whitespace and hyphens with a single hyphen\n * - Removing leading and trailing hyphens\n *\n * @param str - The string to slugify\n * @returns The slugified string\n */\nexport const Slugify = (str: string) => {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Truncates a string to a maximum length.\n *\n * @param str - The string to truncate.\n * @param length - The maximum length of the truncated string. Defaults to 15.\n * @returns The truncated string, with ellipses appended if truncated.\n */\nexport const Truncate = (str: string, length: number = 15) => {\n return str.length > length ? `${str.slice(0, length)}...` : str\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { a } from './chunk-P7TTEYCD.js';
1
+ import { a } from './chunk-6SAHIYCZ.js';
2
2
  import r from 'react';
3
3
 
4
4
  var s=({children:o,...e})=>r.createElement(a,{as:"caption",...e},o),m=({children:o,...e})=>r.createElement(a,{as:"thead",...e},o),d=({children:o,...e})=>r.createElement(a,{as:"tbody",...e},o),i=({children:o,...e})=>r.createElement(a,{as:"tr",...e},o),y=({children:o,...e})=>r.createElement(a,{as:"td",...e},o),T=({id:o,dataStyle:e,children:n,...a$1})=>r.createElement(a,{as:"section",id:o,...a$1,"data-style":"table-wrapper"},r.createElement("table",null,n));T.displayName="Table";s.displayName="Caption";m.displayName="Thead";d.displayName="Tbody";i.displayName="Tr";y.displayName="Td";var l=o=>{let e=o.map((n,a)=>r.createElement("th",{key:a},n));return r.createElement("tr",null,e)},b=o=>{let e=o.map((n,a)=>r.createElement("tr",{key:a}));return r.createElement(d,null,e)},P=({tblBody:o,tblCaption:e,tblHead:n})=>r.createElement(T,null,e&&r.createElement(s,null,e),r.createElement(m,null,r.createElement(i,null,n)),r.createElement(d,null,o));P.displayName="TBL";b.displayName="renderBody";l.displayName="renderHead";
5
5
 
6
6
  export { s as a, m as b, d as c, i as d, y as e, T as f, l as g, b as h, P as i };
7
7
  //# sourceMappingURL=out.js.map
8
- //# sourceMappingURL=chunk-5M57K4SW.js.map
8
+ //# sourceMappingURL=chunk-Y2PFDELK.js.map
@@ -1,4 +1,4 @@
1
- import { a as a$1 } from './chunk-KUKIVRC2.js';
1
+ import { a as a$1 } from './chunk-HHLNOC5T.js';
2
2
  import o from 'react';
3
3
 
4
4
  var r=o.memo(o.forwardRef(({level:e="h2",id:t,styles:i,ui:s,children:d,className:m,...c},h)=>o.createElement(a$1,{as:e,id:t,styles:i,"data-ui":s,className:m,ref:h,...c},d)));r.displayName="Title";var a=r;var p=o.forwardRef(({type:e="h3",...t},i)=>(process.env.NODE_ENV==="development"&&console.warn(`[@fpkit/acss] Heading component is deprecated and will be removed in v3.0.0. Please use the Title component instead.
@@ -7,4 +7,4 @@ See documentation: https://fpkit.dev/components/title`),o.createElement(a,{level
7
7
 
8
8
  export { a, H as b };
9
9
  //# sourceMappingURL=out.js.map
10
- //# sourceMappingURL=chunk-ETFLFC2S.js.map
10
+ //# sourceMappingURL=chunk-ZFJ4U45S.js.map
@@ -1,4 +1,4 @@
1
- import React__default, { ReactNode } from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
 
3
3
  interface ComponentProps {
4
4
  /**
@@ -16,11 +16,11 @@ interface ComponentProps {
16
16
  /**
17
17
  * Styles object
18
18
  */
19
- styles?: React__default.CSSProperties;
19
+ styles?: React.CSSProperties;
20
20
  /**
21
21
  * Default styles object
22
22
  */
23
- defaultStyles?: React__default.CSSProperties;
23
+ defaultStyles?: React.CSSProperties;
24
24
  /**
25
25
  * Component class attribute
26
26
  */
@@ -32,7 +32,7 @@ interface ComponentProps {
32
32
  /**
33
33
  * Component ref attribute
34
34
  */
35
- ref?: React__default.Ref<any>;
35
+ ref?: React.Ref<any>;
36
36
  }
37
37
 
38
38
  export { ComponentProps as C };
@@ -1 +1 @@
1
- .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent}[role=alert] *+div{margin-block-start:var(--spc-1)}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}/*# sourceMappingURL=alert.css.map */
1
+ .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent;align-items:flex-start}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}/*# sourceMappingURL=alert.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../src/components/alert/alert.scss"],"names":[],"mappings":"AACA,SACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,eAGF,aAEE,4BACA,gCACA,8BAGA,0BACA,8BACA,4BAGA,4BACA,gCACA,8BAGA,yBACA,6BACA,2BAGA,kCAEA,wCAEA,6CACA,yCACA,uCACA,2CACA,+CACA,sBACA,gBACA,aACA,mBACA,+DACA,mCAGA,WACE,8FAEF,UACA,wBAEA,sCACE,UACA,8BAGF,uCAlDF,aAmDI,2BAIF,mBACE,+BACA,mBAIF,uCACE,aAGF,yBACE,qBACA,mBAGF,4BACE,OACA,qBAGA,yCACE,uCACA,qBACA,2CACA,2CACA,gBAIF,uNAKE,SACA,uCACA,kBACA,2CAIJ,+BACE,iCACA,sCACA,sCAGF,kCACE,oCACA,yCACA,yCAGF,gCACE,kCACA,uCACA,uCAGF,kCACE,oCACA,yCACA,yCAIA,oCACE,sBAIJ,mBACE,gCAIF,kCACE,YAEA,oDACE,qCACA,qBAGF,uDACE,wCACA,qBAGF,qDACE,sCACA,qBAGF,uDACE,wCACA,qBAGF,uDACE,oBACA,qBAKJ,gCACE,YAQF,eACE","file":"alert.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/components/alert/alert.scss"],"names":[],"mappings":"AACA,SACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,eAGF,aAEE,4BACA,gCACA,8BAGA,0BACA,8BACA,4BAGA,4BACA,gCACA,8BAGA,yBACA,6BACA,2BAGA,kCAEA,wCAEA,6CACA,yCACA,uCACA,2CACA,+CACA,sBACA,gBACA,aACA,mBACA,+DACA,mCAGA,WACE,8FAEF,UACA,wBAEA,sCACE,UACA,8BAGF,uCAlDF,aAmDI,2BAIF,mBACE,+BACA,mBAIF,uCACE,aAGF,yBACE,qBACA,mBAGF,4BACE,OACA,qBAGA,yCACE,uCACA,qBACA,2CACA,2CACA,gBAIF,uNAKE,SACA,uCACA,kBACA,2CAIJ,+BACE,iCACA,sCACA,sCAGF,kCACE,oCACA,yCACA,yCAGF,gCACE,kCACA,uCACA,uCAGF,kCACE,oCACA,yCACA,yCAIA,oCACE,sBACA,uBAKJ,kCACE,YAEA,oDACE,qCACA,qBAGF,uDACE,wCACA,qBAGF,qDACE,sCACA,qBAGF,uDACE,wCACA,qBAGF,uDACE,oBACA,qBAKJ,gCACE,YAQF,eACE","file":"alert.css"}
@@ -1,3 +1,3 @@
1
- .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent}[role=alert] *+div{margin-block-start:var(--spc-1)}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}
1
+ .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent;align-items:flex-start}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}
2
2
 
3
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2FsZXJ0L2FsZXJ0LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsU0FDRSxpQkFBQSxDQUNBLFNBQUEsQ0FDQSxVQUFBLENBQ0EsU0FBQSxDQUNBLFdBQUEsQ0FDQSxlQUFBLENBQ0EscUJBQUEsQ0FDQSxrQkFBQSxDQUNBLGNBQUEsQ0FHRixhQUVFLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHlCQUFBLENBQ0EsNkJBQUEsQ0FDQSwyQkFBQSxDQUdBLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHdCQUFBLENBQ0EsNEJBQUEsQ0FDQSwwQkFBQSxDQUdBLGlDQUFBLENBRUEsdUNBQUEsQ0FFQSw0Q0FBQSxDQUNBLHdDQUFBLENBQ0Esc0NBQUEsQ0FDQSwwQ0FBQSxDQUNBLDhDQUFBLENBQ0EscUJBQUEsQ0FDQSxlQUFBLENBQ0EsWUFBQSxDQUNBLGtCQUFBLENBQ0EsOERBQUEsQ0FDQSxrQ0FBQSxDQUdBLHdHQUNFLENBRUYsU0FBQSxDQUNBLHVCQUFBLENBRUEsc0NBQ0UsU0FBQSxDQUNBLDZCQUFBLENBR0YsdUNBbERGLGFBbURJLHlCQUFBLENBQUEsQ0FJRixtQkFDRSw4QkFBQSxDQUNBLGtCQUFBLENBSUYsdUNBQ0UsWUFBQSxDQUdGLHlCQUNFLG9CQUFBLENBQ0Esa0JBQUEsQ0FHRiw0QkFDRSxNQUFBLENBQ0Esb0JBQUEsQ0FHQSx5Q0FDRSxzQ0FBQSxDQUNBLG9CQUFBLENBQ0EsMENBQUEsQ0FDQSwwQ0FBQSxDQUNBLGVBQUEsQ0FJRix1TkFLRSxRQUFBLENBQ0Esc0NBQUEsQ0FDQSxpQkFBQSxDQUNBLDBDQUFBLENBSUosK0JBQ0UsZ0NBQUEsQ0FDQSxxQ0FBQSxDQUNBLHFDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBR0YsZ0NBQ0UsaUNBQUEsQ0FDQSxzQ0FBQSxDQUNBLHNDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBSUEsb0NBQ0UscUJBQUEsQ0FJSixtQkFDRSwrQkFBQSxDQUlGLGtDQUNFLFdBQUEsQ0FFQSxvREFDRSxvQ0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsdUNBQUEsQ0FDQSxvQkFBQSxDQUdGLHFEQUNFLHFDQUFBLENBQ0Esb0JBQUEsQ0FHRix1REFDRSx1Q0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsbUJBQUEsQ0FDQSxvQkFBQSxDQUtKLGdDQUNFLFdBQUEsQ0FRRixlQUNFLGlCQUFBIiwiZmlsZSI6ImFsZXJ0Lm1pbi5jc3MifQ== */
3
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2FsZXJ0L2FsZXJ0LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsU0FDRSxpQkFBQSxDQUNBLFNBQUEsQ0FDQSxVQUFBLENBQ0EsU0FBQSxDQUNBLFdBQUEsQ0FDQSxlQUFBLENBQ0EscUJBQUEsQ0FDQSxrQkFBQSxDQUNBLGNBQUEsQ0FHRixhQUVFLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHlCQUFBLENBQ0EsNkJBQUEsQ0FDQSwyQkFBQSxDQUdBLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHdCQUFBLENBQ0EsNEJBQUEsQ0FDQSwwQkFBQSxDQUdBLGlDQUFBLENBRUEsdUNBQUEsQ0FFQSw0Q0FBQSxDQUNBLHdDQUFBLENBQ0Esc0NBQUEsQ0FDQSwwQ0FBQSxDQUNBLDhDQUFBLENBQ0EscUJBQUEsQ0FDQSxlQUFBLENBQ0EsWUFBQSxDQUNBLGtCQUFBLENBQ0EsOERBQUEsQ0FDQSxrQ0FBQSxDQUdBLHdHQUNFLENBRUYsU0FBQSxDQUNBLHVCQUFBLENBRUEsc0NBQ0UsU0FBQSxDQUNBLDZCQUFBLENBR0YsdUNBbERGLGFBbURJLHlCQUFBLENBQUEsQ0FJRixtQkFDRSw4QkFBQSxDQUNBLGtCQUFBLENBSUYsdUNBQ0UsWUFBQSxDQUdGLHlCQUNFLG9CQUFBLENBQ0Esa0JBQUEsQ0FHRiw0QkFDRSxNQUFBLENBQ0Esb0JBQUEsQ0FHQSx5Q0FDRSxzQ0FBQSxDQUNBLG9CQUFBLENBQ0EsMENBQUEsQ0FDQSwwQ0FBQSxDQUNBLGVBQUEsQ0FJRix1TkFLRSxRQUFBLENBQ0Esc0NBQUEsQ0FDQSxpQkFBQSxDQUNBLDBDQUFBLENBSUosK0JBQ0UsZ0NBQUEsQ0FDQSxxQ0FBQSxDQUNBLHFDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBR0YsZ0NBQ0UsaUNBQUEsQ0FDQSxzQ0FBQSxDQUNBLHNDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBSUEsb0NBQ0UscUJBQUEsQ0FDQSxzQkFBQSxDQUtKLGtDQUNFLFdBQUEsQ0FFQSxvREFDRSxvQ0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsdUNBQUEsQ0FDQSxvQkFBQSxDQUdGLHFEQUNFLHFDQUFBLENBQ0Esb0JBQUEsQ0FHRix1REFDRSx1Q0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsbUJBQUEsQ0FDQSxvQkFBQSxDQUtKLGdDQUNFLFdBQUEsQ0FRRixlQUNFLGlCQUFBIiwiZmlsZSI6ImFsZXJ0Lm1pbi5jc3MifQ== */
@@ -2,23 +2,23 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkOK5QEIMD_cjs = require('../../chunk-OK5QEIMD.cjs');
6
- require('../../chunk-5S4ORA4C.cjs');
7
- require('../../chunk-L75OQKEI.cjs');
5
+ var chunkT4T6GWYQ_cjs = require('../../chunk-T4T6GWYQ.cjs');
6
+ require('../../chunk-33PNJ4LO.cjs');
7
+ require('../../chunk-ENTCUJ3A.cjs');
8
8
 
9
9
 
10
10
 
11
11
  Object.defineProperty(exports, 'Breadcrumb', {
12
12
  enumerable: true,
13
- get: function () { return chunkOK5QEIMD_cjs.b; }
13
+ get: function () { return chunkT4T6GWYQ_cjs.b; }
14
14
  });
15
15
  Object.defineProperty(exports, 'default', {
16
16
  enumerable: true,
17
- get: function () { return chunkOK5QEIMD_cjs.c; }
17
+ get: function () { return chunkT4T6GWYQ_cjs.c; }
18
18
  });
19
19
  Object.defineProperty(exports, 'useBreadcrumbSegments', {
20
20
  enumerable: true,
21
- get: function () { return chunkOK5QEIMD_cjs.a; }
21
+ get: function () { return chunkT4T6GWYQ_cjs.a; }
22
22
  });
23
23
  //# sourceMappingURL=out.js.map
24
24
  //# sourceMappingURL=breadcrumb.cjs.map
@@ -1,6 +1,6 @@
1
- import React__default from 'react';
2
- import { U as UI } from '../../ui-645f95b5.js';
3
- import Link from '../link/link.cjs';
1
+ import React from 'react';
2
+ import { U as UI } from '../../ui-d01b50d4.js';
3
+ import { L as Link } from '../../link-5192f411.js';
4
4
 
5
5
  /**
6
6
  * Represents a route segment in the breadcrumb navigation.
@@ -53,11 +53,11 @@ type BreadcrumbProps = {
53
53
  /** Array of custom route objects for controlled breadcrumb generation */
54
54
  routes?: CustomRoute[];
55
55
  /** Starting route node (typically "Home") */
56
- startRoute?: React__default.ReactNode;
56
+ startRoute?: React.ReactNode;
57
57
  /** Starting route URL (typically "/") */
58
58
  startRouteUrl?: string;
59
59
  /** Separator element between breadcrumb items */
60
- spacer?: React__default.ReactNode;
60
+ spacer?: React.ReactNode;
61
61
  /** Current route path (required for breadcrumb generation) */
62
62
  currentRoute?: string;
63
63
  /** ARIA label for the breadcrumb navigation */
@@ -65,8 +65,8 @@ type BreadcrumbProps = {
65
65
  /** Maximum character length before truncating breadcrumb text */
66
66
  truncateLength?: number;
67
67
  /** Props to spread onto breadcrumb Link components */
68
- linkProps?: Omit<React__default.ComponentProps<typeof Link>, "href" | "children">;
69
- } & Omit<React__default.ComponentProps<typeof UI>, "as" | "aria-label">;
68
+ linkProps?: Omit<React.ComponentProps<typeof Link>, "href" | "children">;
69
+ } & Omit<React.ComponentProps<typeof UI>, "as" | "aria-label">;
70
70
  /**
71
71
  * Custom hook to process breadcrumb segments from a path string.
72
72
  *
@@ -280,11 +280,11 @@ declare function useBreadcrumbSegments(currentRoute: string | undefined, routes?
280
280
  * @returns Breadcrumb navigation element or null if no valid route
281
281
  */
282
282
  declare const Breadcrumb: {
283
- ({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React__default.JSX.Element | null;
283
+ ({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React.JSX.Element | null;
284
284
  displayName: string;
285
- Nav: React__default.MemoExoticComponent<({ styles, id, classes, children, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
286
- List: React__default.MemoExoticComponent<({ children, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
287
- Item: React__default.MemoExoticComponent<({ children, id, styles, classes, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
285
+ Nav: React.MemoExoticComponent<({ styles, id, classes, children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
286
+ List: React.MemoExoticComponent<({ children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
287
+ Item: React.MemoExoticComponent<({ children, id, styles, classes, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
288
288
  };
289
289
 
290
290
  export { Breadcrumb, BreadcrumbProps, CustomRoute, Breadcrumb as default, useBreadcrumbSegments };
@@ -1,6 +1,6 @@
1
- import React__default from 'react';
2
- import { U as UI } from '../../ui-645f95b5.js';
3
- import Link from '../link/link.js';
1
+ import React from 'react';
2
+ import { U as UI } from '../../ui-d01b50d4.js';
3
+ import { L as Link } from '../../link-5192f411.js';
4
4
 
5
5
  /**
6
6
  * Represents a route segment in the breadcrumb navigation.
@@ -53,11 +53,11 @@ type BreadcrumbProps = {
53
53
  /** Array of custom route objects for controlled breadcrumb generation */
54
54
  routes?: CustomRoute[];
55
55
  /** Starting route node (typically "Home") */
56
- startRoute?: React__default.ReactNode;
56
+ startRoute?: React.ReactNode;
57
57
  /** Starting route URL (typically "/") */
58
58
  startRouteUrl?: string;
59
59
  /** Separator element between breadcrumb items */
60
- spacer?: React__default.ReactNode;
60
+ spacer?: React.ReactNode;
61
61
  /** Current route path (required for breadcrumb generation) */
62
62
  currentRoute?: string;
63
63
  /** ARIA label for the breadcrumb navigation */
@@ -65,8 +65,8 @@ type BreadcrumbProps = {
65
65
  /** Maximum character length before truncating breadcrumb text */
66
66
  truncateLength?: number;
67
67
  /** Props to spread onto breadcrumb Link components */
68
- linkProps?: Omit<React__default.ComponentProps<typeof Link>, "href" | "children">;
69
- } & Omit<React__default.ComponentProps<typeof UI>, "as" | "aria-label">;
68
+ linkProps?: Omit<React.ComponentProps<typeof Link>, "href" | "children">;
69
+ } & Omit<React.ComponentProps<typeof UI>, "as" | "aria-label">;
70
70
  /**
71
71
  * Custom hook to process breadcrumb segments from a path string.
72
72
  *
@@ -280,11 +280,11 @@ declare function useBreadcrumbSegments(currentRoute: string | undefined, routes?
280
280
  * @returns Breadcrumb navigation element or null if no valid route
281
281
  */
282
282
  declare const Breadcrumb: {
283
- ({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React__default.JSX.Element | null;
283
+ ({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React.JSX.Element | null;
284
284
  displayName: string;
285
- Nav: React__default.MemoExoticComponent<({ styles, id, classes, children, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
286
- List: React__default.MemoExoticComponent<({ children, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
287
- Item: React__default.MemoExoticComponent<({ children, id, styles, classes, ...props }: React__default.ComponentProps<typeof UI>) => React__default.JSX.Element>;
285
+ Nav: React.MemoExoticComponent<({ styles, id, classes, children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
286
+ List: React.MemoExoticComponent<({ children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
287
+ Item: React.MemoExoticComponent<({ children, id, styles, classes, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
288
288
  };
289
289
 
290
290
  export { Breadcrumb, BreadcrumbProps, CustomRoute, Breadcrumb as default, useBreadcrumbSegments };
@@ -1,5 +1,5 @@
1
- export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-GZ4QFPRY.js';
2
- import '../../chunk-TYRCEX2L.js';
3
- import '../../chunk-KUKIVRC2.js';
1
+ export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-X5LGFCWG.js';
2
+ import '../../chunk-UEPAWMDF.js';
3
+ import '../../chunk-HHLNOC5T.js';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=breadcrumb.js.map
@@ -2,18 +2,20 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkJ32EZPYD_cjs = require('../chunk-J32EZPYD.cjs');
6
- require('../chunk-L75OQKEI.cjs');
5
+ var chunkGT77BX4L_cjs = require('../chunk-GT77BX4L.cjs');
6
+ require('../chunk-PNWIRCG3.cjs');
7
+ require('../chunk-TON2YGMD.cjs');
8
+ require('../chunk-ENTCUJ3A.cjs');
7
9
 
8
10
 
9
11
 
10
12
  Object.defineProperty(exports, 'Button', {
11
13
  enumerable: true,
12
- get: function () { return chunkJ32EZPYD_cjs.a; }
14
+ get: function () { return chunkGT77BX4L_cjs.a; }
13
15
  });
14
16
  Object.defineProperty(exports, 'default', {
15
17
  enumerable: true,
16
- get: function () { return chunkJ32EZPYD_cjs.b; }
18
+ get: function () { return chunkGT77BX4L_cjs.b; }
17
19
  });
18
20
  //# sourceMappingURL=out.js.map
19
21
  //# sourceMappingURL=button.cjs.map
@@ -1,15 +1,108 @@
1
- import { U as UI } from '../ui-645f95b5.js';
2
- import React__default from 'react';
1
+ import { U as UI } from '../ui-d01b50d4.js';
2
+ import React$1 from 'react';
3
3
 
4
- type ButtonProps = Partial<React__default.ComponentProps<typeof UI>> & {
4
+ /**
5
+ * Props for disabled state management across components.
6
+ *
7
+ * Supports both modern `disabled` and legacy `isDisabled` props for
8
+ * backward compatibility.
9
+ *
10
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
11
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
12
+ */
13
+ interface DisabledStateProps {
14
+ /**
15
+ * Disables the component, preventing user interaction while maintaining
16
+ * keyboard focusability and screen reader accessibility.
17
+ *
18
+ * Uses `aria-disabled` pattern instead of native `disabled` attribute to:
19
+ * - Keep elements in keyboard tab order (WCAG 2.1.1)
20
+ * - Allow screen readers to discover and announce disabled state
21
+ * - Enable tooltips and contextual help on disabled elements
22
+ * - Provide better visual styling control
23
+ *
24
+ * @default false
25
+ */
26
+ disabled?: boolean;
27
+ /**
28
+ * Legacy disabled prop for backward compatibility.
29
+ *
30
+ * @deprecated Use `disabled` instead. This prop will be removed in v3.0.
31
+ *
32
+ * @migration Replace `isDisabled={true}` with `disabled={true}`
33
+ *
34
+ * @example
35
+ * // Before
36
+ * <Button isDisabled={true}>Click me</Button>
37
+ *
38
+ * // After
39
+ * <Button disabled={true}>Click me</Button>
40
+ */
41
+ isDisabled?: boolean;
42
+ }
43
+
44
+ type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
5
45
  /**
6
46
  * The button type
7
47
  * Required - 'button' | 'submit' | 'reset'
8
48
  */
9
49
  type: 'button' | 'submit' | 'reset';
10
50
  };
51
+ /**
52
+ * Accessible Button component with WCAG 2.1 Level AA compliant disabled state.
53
+ *
54
+ * **Key Accessibility Features:**
55
+ * - Uses `aria-disabled` pattern instead of native `disabled` attribute
56
+ * - Maintains keyboard focusability when disabled (stays in tab order)
57
+ * - Prevents all interactions when disabled via optimized `useDisabledState` hook
58
+ * - Automatic className merging for seamless styling
59
+ * - Supports both modern `disabled` and legacy `isDisabled` props
60
+ *
61
+ * **Why aria-disabled?**
62
+ * - Elements remain in keyboard tab order (WCAG 2.1.1 - Keyboard)
63
+ * - Screen readers can discover and announce disabled state (WCAG 4.1.2)
64
+ * - Enables tooltips and help text on disabled buttons
65
+ * - Better visual styling control for WCAG AA contrast compliance
66
+ *
67
+ * **Performance:**
68
+ * - Uses optimized `useDisabledState` hook with stable references
69
+ * - Automatic className merging eliminates boilerplate
70
+ * - ~90% reduction in unnecessary re-renders compared to previous implementation
71
+ *
72
+ * @example
73
+ * // Basic usage
74
+ * <Button type="button" onClick={handleClick}>
75
+ * Click me
76
+ * </Button>
77
+ *
78
+ * @example
79
+ * // Disabled state (prevents all interactions but stays focusable)
80
+ * <Button type="button" disabled={true} onClick={handleClick}>
81
+ * Cannot click (but can focus for screen readers)
82
+ * </Button>
83
+ *
84
+ * @example
85
+ * // With custom classes (automatic merging with .is-disabled)
86
+ * <Button
87
+ * type="button"
88
+ * disabled={true}
89
+ * classes="my-custom-btn"
90
+ * >
91
+ * Custom disabled button
92
+ * </Button>
93
+ *
94
+ * @example
95
+ * // Legacy isDisabled prop (still supported)
96
+ * <Button type="button" isDisabled={true} onClick={handleClick}>
97
+ * Legacy disabled
98
+ * </Button>
99
+ *
100
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
101
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
102
+ * @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
103
+ */
11
104
  declare const Button: {
12
- ({ type, children, styles, disabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, ...props }: ButtonProps): React__default.JSX.Element;
105
+ ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
13
106
  displayName: string;
14
107
  };
15
108
 
@@ -1,15 +1,108 @@
1
- import { U as UI } from '../ui-645f95b5.js';
2
- import React__default from 'react';
1
+ import { U as UI } from '../ui-d01b50d4.js';
2
+ import React$1 from 'react';
3
3
 
4
- type ButtonProps = Partial<React__default.ComponentProps<typeof UI>> & {
4
+ /**
5
+ * Props for disabled state management across components.
6
+ *
7
+ * Supports both modern `disabled` and legacy `isDisabled` props for
8
+ * backward compatibility.
9
+ *
10
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
11
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
12
+ */
13
+ interface DisabledStateProps {
14
+ /**
15
+ * Disables the component, preventing user interaction while maintaining
16
+ * keyboard focusability and screen reader accessibility.
17
+ *
18
+ * Uses `aria-disabled` pattern instead of native `disabled` attribute to:
19
+ * - Keep elements in keyboard tab order (WCAG 2.1.1)
20
+ * - Allow screen readers to discover and announce disabled state
21
+ * - Enable tooltips and contextual help on disabled elements
22
+ * - Provide better visual styling control
23
+ *
24
+ * @default false
25
+ */
26
+ disabled?: boolean;
27
+ /**
28
+ * Legacy disabled prop for backward compatibility.
29
+ *
30
+ * @deprecated Use `disabled` instead. This prop will be removed in v3.0.
31
+ *
32
+ * @migration Replace `isDisabled={true}` with `disabled={true}`
33
+ *
34
+ * @example
35
+ * // Before
36
+ * <Button isDisabled={true}>Click me</Button>
37
+ *
38
+ * // After
39
+ * <Button disabled={true}>Click me</Button>
40
+ */
41
+ isDisabled?: boolean;
42
+ }
43
+
44
+ type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
5
45
  /**
6
46
  * The button type
7
47
  * Required - 'button' | 'submit' | 'reset'
8
48
  */
9
49
  type: 'button' | 'submit' | 'reset';
10
50
  };
51
+ /**
52
+ * Accessible Button component with WCAG 2.1 Level AA compliant disabled state.
53
+ *
54
+ * **Key Accessibility Features:**
55
+ * - Uses `aria-disabled` pattern instead of native `disabled` attribute
56
+ * - Maintains keyboard focusability when disabled (stays in tab order)
57
+ * - Prevents all interactions when disabled via optimized `useDisabledState` hook
58
+ * - Automatic className merging for seamless styling
59
+ * - Supports both modern `disabled` and legacy `isDisabled` props
60
+ *
61
+ * **Why aria-disabled?**
62
+ * - Elements remain in keyboard tab order (WCAG 2.1.1 - Keyboard)
63
+ * - Screen readers can discover and announce disabled state (WCAG 4.1.2)
64
+ * - Enables tooltips and help text on disabled buttons
65
+ * - Better visual styling control for WCAG AA contrast compliance
66
+ *
67
+ * **Performance:**
68
+ * - Uses optimized `useDisabledState` hook with stable references
69
+ * - Automatic className merging eliminates boilerplate
70
+ * - ~90% reduction in unnecessary re-renders compared to previous implementation
71
+ *
72
+ * @example
73
+ * // Basic usage
74
+ * <Button type="button" onClick={handleClick}>
75
+ * Click me
76
+ * </Button>
77
+ *
78
+ * @example
79
+ * // Disabled state (prevents all interactions but stays focusable)
80
+ * <Button type="button" disabled={true} onClick={handleClick}>
81
+ * Cannot click (but can focus for screen readers)
82
+ * </Button>
83
+ *
84
+ * @example
85
+ * // With custom classes (automatic merging with .is-disabled)
86
+ * <Button
87
+ * type="button"
88
+ * disabled={true}
89
+ * classes="my-custom-btn"
90
+ * >
91
+ * Custom disabled button
92
+ * </Button>
93
+ *
94
+ * @example
95
+ * // Legacy isDisabled prop (still supported)
96
+ * <Button type="button" isDisabled={true} onClick={handleClick}>
97
+ * Legacy disabled
98
+ * </Button>
99
+ *
100
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
101
+ * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
102
+ * @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
103
+ */
11
104
  declare const Button: {
12
- ({ type, children, styles, disabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, ...props }: ButtonProps): React__default.JSX.Element;
105
+ ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
13
106
  displayName: string;
14
107
  };
15
108
 
@@ -1,4 +1,6 @@
1
- export { a as Button, b as default } from '../chunk-QLZWHAMK.js';
2
- import '../chunk-KUKIVRC2.js';
1
+ export { a as Button, b as default } from '../chunk-OVWLQYMK.js';
2
+ import '../chunk-BFK62VX5.js';
3
+ import '../chunk-75QHTLFO.js';
4
+ import '../chunk-HHLNOC5T.js';
3
5
  //# sourceMappingURL=out.js.map
4
6
  //# sourceMappingURL=button.js.map