@fpkit/acss 0.5.11 → 0.5.13

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 (312) hide show
  1. package/README.md +514 -18
  2. package/libs/chunk-23ANBDCR.js +8 -0
  3. package/libs/chunk-23ANBDCR.js.map +1 -0
  4. package/libs/chunk-2LTJ7HHX.cjs +18 -0
  5. package/libs/chunk-2LTJ7HHX.cjs.map +1 -0
  6. package/libs/chunk-2Y7W75TT.js +9 -0
  7. package/libs/chunk-2Y7W75TT.js.map +1 -0
  8. package/libs/chunk-3MKLDCKQ.cjs +31 -0
  9. package/libs/chunk-3MKLDCKQ.cjs.map +1 -0
  10. package/libs/chunk-5M57K4SW.js +8 -0
  11. package/libs/chunk-5M57K4SW.js.map +1 -0
  12. package/libs/chunk-5S4ORA4C.cjs +15 -0
  13. package/libs/chunk-5S4ORA4C.cjs.map +1 -0
  14. package/libs/chunk-772NRB75.js +9 -0
  15. package/libs/chunk-772NRB75.js.map +1 -0
  16. package/libs/chunk-AHDJGCG5.cjs +15 -0
  17. package/libs/chunk-AHDJGCG5.cjs.map +1 -0
  18. package/libs/chunk-B7F5FS6D.cjs +16 -0
  19. package/libs/chunk-B7F5FS6D.cjs.map +1 -0
  20. package/libs/chunk-BHRQBJRY.js +8 -0
  21. package/libs/chunk-BHRQBJRY.js.map +1 -0
  22. package/libs/chunk-D4YLRWAO.cjs +18 -0
  23. package/libs/chunk-D4YLRWAO.cjs.map +1 -0
  24. package/libs/chunk-ETFLFC2S.js +10 -0
  25. package/libs/chunk-ETFLFC2S.js.map +1 -0
  26. package/libs/chunk-G55UJ53G.cjs +16 -0
  27. package/libs/chunk-G55UJ53G.cjs.map +1 -0
  28. package/libs/chunk-GZ4QFPRY.js +9 -0
  29. package/libs/chunk-GZ4QFPRY.js.map +1 -0
  30. package/libs/chunk-IYUN2EW3.cjs +15 -0
  31. package/libs/chunk-IYUN2EW3.cjs.map +1 -0
  32. package/libs/chunk-J32EZPYD.cjs +15 -0
  33. package/libs/chunk-J32EZPYD.cjs.map +1 -0
  34. package/libs/chunk-JJ43O4Y5.js +8 -0
  35. package/libs/chunk-JJ43O4Y5.js.map +1 -0
  36. package/libs/chunk-KUKIVRC2.js +7 -0
  37. package/libs/chunk-KUKIVRC2.js.map +1 -0
  38. package/libs/chunk-L75OQKEI.cjs +13 -0
  39. package/libs/chunk-L75OQKEI.cjs.map +1 -0
  40. package/libs/chunk-LT5KZ2QW.cjs +22 -0
  41. package/libs/chunk-LT5KZ2QW.cjs.map +1 -0
  42. package/libs/chunk-M5RRNTVX.cjs +15 -0
  43. package/libs/chunk-M5RRNTVX.cjs.map +1 -0
  44. package/libs/chunk-NGTJDDFO.js +8 -0
  45. package/libs/chunk-NGTJDDFO.js.map +1 -0
  46. package/libs/chunk-OK5QEIMD.cjs +17 -0
  47. package/libs/chunk-OK5QEIMD.cjs.map +1 -0
  48. package/libs/chunk-P2DC76ZZ.cjs +18 -0
  49. package/libs/chunk-P2DC76ZZ.cjs.map +1 -0
  50. package/libs/chunk-P7TTEYCD.js +7 -0
  51. package/libs/chunk-P7TTEYCD.js.map +1 -0
  52. package/libs/chunk-PQ2K3BM6.cjs +17 -0
  53. package/libs/chunk-PQ2K3BM6.cjs.map +1 -0
  54. package/libs/chunk-QLZWHAMK.js +8 -0
  55. package/libs/chunk-QLZWHAMK.js.map +1 -0
  56. package/libs/chunk-RIVUMPOG.js +8 -0
  57. package/libs/chunk-RIVUMPOG.js.map +1 -0
  58. package/libs/chunk-ROZI23GS.cjs +15 -0
  59. package/libs/chunk-ROZI23GS.cjs.map +1 -0
  60. package/libs/chunk-S7BABR7Z.cjs +13 -0
  61. package/libs/chunk-S7BABR7Z.cjs.map +1 -0
  62. package/libs/chunk-SMYRLO3E.js +8 -0
  63. package/libs/chunk-SMYRLO3E.js.map +1 -0
  64. package/libs/chunk-TYRCEX2L.js +8 -0
  65. package/libs/chunk-TYRCEX2L.js.map +1 -0
  66. package/libs/chunk-VUH3FXGJ.js +11 -0
  67. package/libs/chunk-VUH3FXGJ.js.map +1 -0
  68. package/libs/chunk-XBA562WW.js +8 -0
  69. package/libs/chunk-XBA562WW.js.map +1 -0
  70. package/libs/chunk-XTQKWY7W.cjs +32 -0
  71. package/libs/chunk-XTQKWY7W.cjs.map +1 -0
  72. package/libs/chunk-ZANSFMTD.js +9 -0
  73. package/libs/chunk-ZANSFMTD.js.map +1 -0
  74. package/libs/component-props-a8a2f97e.d.ts +38 -0
  75. package/libs/components/alert/alert.css +1 -1
  76. package/libs/components/alert/alert.css.map +1 -1
  77. package/libs/components/alert/alert.min.css +2 -2
  78. package/libs/components/badge/badge.css +1 -1
  79. package/libs/components/badge/badge.css.map +1 -1
  80. package/libs/components/badge/badge.min.css +2 -2
  81. package/libs/components/breadcrumbs/breadcrumb.cjs +24 -0
  82. package/libs/components/breadcrumbs/breadcrumb.cjs.map +1 -0
  83. package/libs/components/breadcrumbs/breadcrumb.d.cts +290 -0
  84. package/libs/components/breadcrumbs/breadcrumb.d.ts +290 -0
  85. package/libs/components/breadcrumbs/breadcrumb.js +5 -0
  86. package/libs/components/breadcrumbs/breadcrumb.js.map +1 -0
  87. package/libs/components/button.cjs +19 -0
  88. package/libs/components/button.cjs.map +1 -0
  89. package/libs/components/button.d.cts +16 -0
  90. package/libs/components/button.d.ts +16 -0
  91. package/libs/components/button.js +4 -0
  92. package/libs/components/button.js.map +1 -0
  93. package/libs/components/buttons/button.css +1 -1
  94. package/libs/components/buttons/button.css.map +1 -1
  95. package/libs/components/buttons/button.min.css +2 -2
  96. package/libs/components/card.cjs +31 -0
  97. package/libs/components/card.cjs.map +1 -0
  98. package/libs/components/card.d.cts +302 -0
  99. package/libs/components/card.d.ts +302 -0
  100. package/libs/components/card.js +4 -0
  101. package/libs/components/card.js.map +1 -0
  102. package/libs/components/cards/card.css +1 -1
  103. package/libs/components/cards/card.css.map +1 -1
  104. package/libs/components/cards/card.min.css +2 -2
  105. package/libs/components/details/details.css +1 -1
  106. package/libs/components/details/details.css.map +1 -1
  107. package/libs/components/details/details.min.css +2 -2
  108. package/libs/components/dialog/dialog.cjs +22 -0
  109. package/libs/components/dialog/dialog.cjs.map +1 -0
  110. package/libs/components/dialog/dialog.css +1 -1
  111. package/libs/components/dialog/dialog.css.map +1 -1
  112. package/libs/components/dialog/dialog.d.cts +105 -0
  113. package/libs/components/dialog/dialog.d.ts +105 -0
  114. package/libs/components/dialog/dialog.js +7 -0
  115. package/libs/components/dialog/dialog.js.map +1 -0
  116. package/libs/components/dialog/dialog.min.css +2 -2
  117. package/libs/components/form/fields.cjs +19 -0
  118. package/libs/components/form/fields.cjs.map +1 -0
  119. package/libs/components/form/fields.d.cts +24 -0
  120. package/libs/components/form/fields.d.ts +24 -0
  121. package/libs/components/form/fields.js +4 -0
  122. package/libs/components/form/fields.js.map +1 -0
  123. package/libs/components/form/inputs.cjs +19 -0
  124. package/libs/components/form/inputs.cjs.map +1 -0
  125. package/libs/components/form/inputs.d.cts +2 -0
  126. package/libs/components/form/inputs.d.ts +2 -0
  127. package/libs/components/form/inputs.js +4 -0
  128. package/libs/components/form/inputs.js.map +1 -0
  129. package/libs/components/form/textarea.cjs +19 -0
  130. package/libs/components/form/textarea.cjs.map +1 -0
  131. package/libs/components/form/textarea.d.cts +29 -0
  132. package/libs/components/form/textarea.d.ts +29 -0
  133. package/libs/components/form/textarea.js +4 -0
  134. package/libs/components/form/textarea.js.map +1 -0
  135. package/libs/components/heading/heading.cjs +10 -0
  136. package/libs/components/heading/heading.cjs.map +1 -0
  137. package/libs/components/heading/heading.d.cts +3 -0
  138. package/libs/components/heading/heading.d.ts +3 -0
  139. package/libs/components/heading/heading.js +4 -0
  140. package/libs/components/heading/heading.js.map +1 -0
  141. package/libs/components/icons/icon.cjs +19 -0
  142. package/libs/components/icons/icon.cjs.map +1 -0
  143. package/libs/{icons-31ace3de.d.ts → components/icons/icon.d.cts} +151 -61
  144. package/libs/components/icons/icon.d.ts +445 -0
  145. package/libs/components/icons/icon.js +4 -0
  146. package/libs/components/icons/icon.js.map +1 -0
  147. package/libs/components/images/img.css +1 -1
  148. package/libs/components/images/img.css.map +1 -1
  149. package/libs/components/images/img.min.css +2 -2
  150. package/libs/components/link/link.cjs +19 -0
  151. package/libs/components/link/link.cjs.map +1 -0
  152. package/libs/components/link/link.d.cts +19 -0
  153. package/libs/components/link/link.d.ts +19 -0
  154. package/libs/components/link/link.js +4 -0
  155. package/libs/components/link/link.js.map +1 -0
  156. package/libs/components/list/list.cjs +23 -0
  157. package/libs/components/list/list.cjs.map +1 -0
  158. package/libs/components/list/list.d.cts +39 -0
  159. package/libs/components/list/list.d.ts +39 -0
  160. package/libs/components/list/list.js +4 -0
  161. package/libs/components/list/list.js.map +1 -0
  162. package/libs/components/modal.cjs +14 -0
  163. package/libs/components/modal.cjs.map +1 -0
  164. package/libs/components/modal.d.cts +35 -0
  165. package/libs/components/modal.d.ts +35 -0
  166. package/libs/components/modal.js +5 -0
  167. package/libs/components/modal.js.map +1 -0
  168. package/libs/components/nav/nav.cjs +28 -0
  169. package/libs/components/nav/nav.cjs.map +1 -0
  170. package/libs/components/nav/nav.d.cts +44 -0
  171. package/libs/components/nav/nav.d.ts +44 -0
  172. package/libs/components/nav/nav.js +5 -0
  173. package/libs/components/nav/nav.js.map +1 -0
  174. package/libs/components/popover/popover.cjs +23 -0
  175. package/libs/components/popover/popover.cjs.map +1 -0
  176. package/libs/components/popover/popover.d.cts +40 -0
  177. package/libs/components/popover/popover.d.ts +40 -0
  178. package/libs/components/popover/popover.js +4 -0
  179. package/libs/components/popover/popover.js.map +1 -0
  180. package/libs/components/tables/table.cjs +21 -0
  181. package/libs/components/tables/table.cjs.map +1 -0
  182. package/libs/components/tables/table.d.cts +36 -0
  183. package/libs/components/tables/table.d.ts +36 -0
  184. package/libs/components/tables/table.js +4 -0
  185. package/libs/components/tables/table.js.map +1 -0
  186. package/libs/components/text/text.cjs +23 -0
  187. package/libs/components/text/text.cjs.map +1 -0
  188. package/libs/components/text/text.d.cts +30 -0
  189. package/libs/components/text/text.d.ts +30 -0
  190. package/libs/components/text/text.js +4 -0
  191. package/libs/components/text/text.js.map +1 -0
  192. package/libs/heading-3648c538.d.ts +250 -0
  193. package/libs/hooks.cjs +7 -0
  194. package/libs/hooks.d.cts +5 -0
  195. package/libs/hooks.d.ts +5 -0
  196. package/libs/hooks.js +3 -0
  197. package/libs/icons.cjs +3 -2
  198. package/libs/icons.d.cts +3 -1
  199. package/libs/icons.d.ts +3 -1
  200. package/libs/icons.js +2 -1
  201. package/libs/index.cjs +174 -62
  202. package/libs/index.cjs.map +1 -1
  203. package/libs/index.css +1 -1
  204. package/libs/index.css.map +1 -1
  205. package/libs/index.d.cts +529 -446
  206. package/libs/index.d.ts +529 -446
  207. package/libs/index.js +36 -7
  208. package/libs/index.js.map +1 -1
  209. package/libs/inputs-f3a216db.d.ts +45 -0
  210. package/libs/ui-645f95b5.d.ts +285 -0
  211. package/package.json +2 -2
  212. package/src/components/README-UI.mdx +416 -0
  213. package/src/components/alert/ACCESSIBILITY.md +319 -0
  214. package/src/components/alert/README.mdx +475 -19
  215. package/src/components/alert/alert.scss +113 -6
  216. package/src/components/alert/alert.stories.tsx +372 -0
  217. package/src/components/alert/alert.test.tsx +762 -0
  218. package/src/components/alert/alert.tsx +331 -66
  219. package/src/components/alert/views/alert-actions.tsx +13 -0
  220. package/src/components/alert/views/alert-content.tsx +17 -0
  221. package/src/components/alert/views/alert-icon.tsx +53 -0
  222. package/src/components/alert/views/alert-screen-reader-text.tsx +30 -0
  223. package/src/components/alert/views/alert-title.tsx +23 -0
  224. package/src/components/alert/views/alert-view.tsx +158 -0
  225. package/src/components/alert/views/index.ts +12 -0
  226. package/src/components/badge/badge.mdx +186 -49
  227. package/src/components/badge/badge.scss +20 -2
  228. package/src/components/badge/badge.stories.tsx +160 -14
  229. package/src/components/badge/badge.test.tsx +179 -0
  230. package/src/components/badge/badge.tsx +97 -4
  231. package/src/components/breadcrumbs/README.mdx +364 -45
  232. package/src/components/breadcrumbs/__snapshots__/breadcrumb.test.tsx.snap +152 -0
  233. package/src/components/breadcrumbs/breadcrumb.stories.tsx +7 -3
  234. package/src/components/breadcrumbs/breadcrumb.test.tsx +490 -0
  235. package/src/components/breadcrumbs/breadcrumb.tsx +427 -170
  236. package/src/components/button.ts +2 -0
  237. package/src/components/buttons/button.scss +34 -31
  238. package/src/components/buttons/button.stories.tsx +35 -0
  239. package/src/components/card.ts +2 -0
  240. package/src/components/cards/README.mdx +657 -0
  241. package/src/components/cards/card.scss +22 -0
  242. package/src/components/cards/card.stories.tsx +167 -5
  243. package/src/components/cards/card.test.tsx +360 -20
  244. package/src/components/cards/card.tsx +200 -79
  245. package/src/components/cards/card.types.ts +135 -0
  246. package/src/components/cards/card.utils.ts +79 -0
  247. package/src/components/details/ACCESSIBILITY-REVIEW-LIVE.md +1050 -0
  248. package/src/components/details/ACCESSIBILITY-REVIEW.md +502 -0
  249. package/src/components/details/README.mdx +437 -69
  250. package/src/components/details/details.scss +16 -0
  251. package/src/components/details/details.test.tsx +385 -0
  252. package/src/components/details/details.tsx +101 -69
  253. package/src/components/details/details.types.ts +76 -0
  254. package/src/components/dialog/README.mdx +513 -110
  255. package/src/components/dialog/dialog-modal.tsx +79 -56
  256. package/src/components/dialog/dialog.scss +53 -3
  257. package/src/components/dialog/dialog.stories.tsx +10 -7
  258. package/src/components/dialog/dialog.test.tsx +450 -0
  259. package/src/components/dialog/dialog.tsx +69 -59
  260. package/src/components/dialog/dialog.types.ts +133 -0
  261. package/src/components/dialog/views/dialog-footer.tsx +54 -11
  262. package/src/components/dialog/views/dialog-header.tsx +20 -15
  263. package/src/components/heading/heading.stories.tsx +44 -4
  264. package/src/components/heading/heading.tsx +89 -23
  265. package/src/components/icons/README.mdx +332 -0
  266. package/src/components/icons/icon.stories.tsx +74 -1
  267. package/src/components/icons/icon.tsx +89 -1
  268. package/src/components/icons/types.ts +47 -0
  269. package/src/components/images/README.mdx +340 -24
  270. package/src/components/images/img.scss +19 -3
  271. package/src/components/images/img.stories.tsx +424 -15
  272. package/src/components/images/img.test.tsx +354 -25
  273. package/src/components/images/img.tsx +186 -63
  274. package/src/components/images/img.types.ts +211 -0
  275. package/src/components/modal.ts +1 -0
  276. package/src/components/title/MIGRATION.md +199 -0
  277. package/src/components/title/README.md +326 -0
  278. package/src/components/title/README.mdx +452 -0
  279. package/src/components/title/title.stories.tsx +393 -0
  280. package/src/components/title/title.test.tsx +251 -0
  281. package/src/components/title/title.tsx +219 -0
  282. package/src/components/ui.stories.tsx +894 -0
  283. package/src/components/ui.test.tsx +559 -0
  284. package/src/components/ui.tsx +266 -15
  285. package/src/components/word-count/README.md +240 -0
  286. package/src/hooks.ts +1 -0
  287. package/src/index.ts +51 -19
  288. package/src/sass/_properties.scss +1 -0
  289. package/src/styles/alert/alert.css +94 -4
  290. package/src/styles/alert/alert.css.map +1 -1
  291. package/src/styles/badge/badge.css +20 -2
  292. package/src/styles/badge/badge.css.map +1 -1
  293. package/src/styles/buttons/button.css +31 -31
  294. package/src/styles/buttons/button.css.map +1 -1
  295. package/src/styles/cards/card.css +16 -0
  296. package/src/styles/cards/card.css.map +1 -1
  297. package/src/styles/details/details.css +19 -0
  298. package/src/styles/details/details.css.map +1 -1
  299. package/src/styles/dialog/dialog.css +43 -2
  300. package/src/styles/dialog/dialog.css.map +1 -1
  301. package/src/styles/images/img.css +15 -3
  302. package/src/styles/images/img.css.map +1 -1
  303. package/src/styles/index.css +240 -43
  304. package/src/styles/index.css.map +1 -1
  305. package/src/test/setup.d.ts +9 -0
  306. package/src/test/setup.ts +53 -1
  307. package/libs/chunk-PWVRDQ3R.js +0 -8
  308. package/libs/chunk-PWVRDQ3R.js.map +0 -1
  309. package/libs/chunk-SVS4MX3U.cjs +0 -31
  310. package/libs/chunk-SVS4MX3U.cjs.map +0 -1
  311. package/src/components/cards/README.md +0 -80
  312. package/src/components/dialog/hooks/useClickOutside.ts +0 -33
@@ -0,0 +1,133 @@
1
+ import { CSSProperties, ReactNode } from "react";
2
+
3
+ /**
4
+ * Base properties shared by all dialog variants.
5
+ *
6
+ * @property {string} dialogTitle - The title displayed in the dialog header
7
+ * @property {string} [dialogLabel] - Optional accessible label for the dialog (aria-label)
8
+ * @property {ReactNode} children - Content to be displayed inside the dialog body
9
+ * @property {string} [className] - Additional CSS classes to apply to the dialog
10
+ * @property {CSSProperties} [styles] - Inline styles to apply to the dialog element
11
+ */
12
+ export interface BaseDialogProps {
13
+ /** The title displayed in the dialog header */
14
+ dialogTitle: string;
15
+ /** Optional accessible label for the dialog (aria-label) */
16
+ dialogLabel?: string;
17
+ /** Content to be displayed inside the dialog body */
18
+ children: ReactNode;
19
+ /** Additional CSS classes to apply to the dialog */
20
+ className?: string;
21
+ /** Inline styles to apply to the dialog element */
22
+ styles?: CSSProperties;
23
+ }
24
+
25
+ /**
26
+ * Props for the controlled Dialog component.
27
+ * Use this when you want to manage dialog state externally.
28
+ *
29
+ * @extends BaseDialogProps
30
+ * @property {boolean} isOpen - Controls whether the dialog is currently open
31
+ * @property {(open: boolean) => void} onOpenChange - Callback fired when dialog open state should change
32
+ * @property {boolean} [isAlertDialog=false] - If true, renders as non-modal inline alert using dialog.show()
33
+ * @property {() => void} [onClose] - Deprecated: Use onOpenChange instead. Called when dialog closes.
34
+ * @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
35
+ * @property {string} [confirmLabel="Confirm"] - Text label for the confirm button
36
+ * @property {string} [cancelLabel="Cancel"] - Text label for the cancel button
37
+ * @property {boolean} [hideFooter=false] - If true, hides the dialog footer with action buttons
38
+ */
39
+ export interface DialogProps extends BaseDialogProps {
40
+ /** Controls whether the dialog is currently open (controlled component) */
41
+ isOpen: boolean;
42
+ /** Callback fired when dialog open state should change */
43
+ onOpenChange: (open: boolean) => void;
44
+ /** If true, renders as non-modal inline alert using dialog.show() instead of dialog.showModal() */
45
+ isAlertDialog?: boolean;
46
+ /** @deprecated Use onOpenChange instead. Called when dialog closes. */
47
+ onClose?: () => void;
48
+ /** Callback fired when confirm button is clicked */
49
+ onConfirm?: () => void | Promise<void>;
50
+ /** Text label for the confirm button */
51
+ confirmLabel?: string;
52
+ /** Text label for the cancel button */
53
+ cancelLabel?: string;
54
+ /** If true, hides the dialog footer with action buttons */
55
+ hideFooter?: boolean;
56
+ }
57
+
58
+ /**
59
+ * Props for the DialogModal wrapper component.
60
+ * This component manages dialog state internally and provides a trigger button.
61
+ * Use this for simple cases where you don't need external state management.
62
+ *
63
+ * @extends BaseDialogProps
64
+ * @property {boolean} [isAlertDialog=false] - If true, renders as non-modal inline alert
65
+ * @property {() => void} [onClose] - Callback fired when dialog is closed
66
+ * @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
67
+ * @property {string} [confirmLabel="Confirm"] - Text label for the confirm button
68
+ * @property {string} [cancelLabel="Cancel"] - Text label for the cancel button
69
+ * @property {boolean} [hideFooter=false] - If true, hides the dialog footer
70
+ * @property {string} [btnLabel="Open Dialog"] - Text label for the trigger button
71
+ * @property {"sm" | "md" | "lg"} [btnSize="sm"] - Size variant for the trigger button
72
+ * @property {() => void} [btnOnClick] - Callback fired when trigger button is clicked (before opening)
73
+ */
74
+ export interface DialogModalProps extends BaseDialogProps {
75
+ /** If true, renders as non-modal inline alert using dialog.show() */
76
+ isAlertDialog?: boolean;
77
+ /** Callback fired when dialog is closed */
78
+ onClose?: () => void;
79
+ /** Callback fired when confirm button is clicked */
80
+ onConfirm?: () => void | Promise<void>;
81
+ /** Text label for the confirm button */
82
+ confirmLabel?: string;
83
+ /** Text label for the cancel button */
84
+ cancelLabel?: string;
85
+ /** If true, hides the dialog footer with action buttons */
86
+ hideFooter?: boolean;
87
+ /** Text label for the trigger button that opens the dialog */
88
+ btnLabel?: string;
89
+ /** Size variant for the trigger button */
90
+ btnSize?: "sm" | "md" | "lg";
91
+ /** Callback fired when trigger button is clicked (before opening dialog) */
92
+ btnOnClick?: () => void;
93
+ /** Additional props to pass to the trigger button component */
94
+ btnProps?: Record<string, unknown>;
95
+ }
96
+
97
+ /**
98
+ * Props for the DialogHeader component.
99
+ *
100
+ * @property {string} dialogTitle - The title text to display in the header
101
+ * @property {() => void} onClick - Callback fired when the close button is clicked
102
+ * @property {string} [id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.
103
+ * @property {"h1" | "h2" | "h3" | "h4" | "h5" | "h6"} [type="h3"] - Heading level for the title
104
+ */
105
+ export interface DialogHeaderProps {
106
+ /** The title text to display in the header */
107
+ dialogTitle: string;
108
+ /** Callback fired when the close button is clicked */
109
+ onClick: () => void;
110
+ /** Optional ID for aria-labelledby linking. Auto-generated if not provided. */
111
+ id?: string;
112
+ /** Heading level for the title */
113
+ type?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
114
+ }
115
+
116
+ /**
117
+ * Props for the DialogFooter component.
118
+ *
119
+ * @property {() => void} onClose - Callback fired when cancel button is clicked
120
+ * @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
121
+ * @property {string} confirmLabel - Text label for the confirm button
122
+ * @property {string} cancelLabel - Text label for the cancel button
123
+ */
124
+ export interface DialogFooterProps {
125
+ /** Callback fired when cancel button is clicked */
126
+ onClose: () => void;
127
+ /** Callback fired when confirm button is clicked */
128
+ onConfirm?: () => void | Promise<void>;
129
+ /** Text label for the confirm button */
130
+ confirmLabel: string;
131
+ /** Text label for the cancel button */
132
+ cancelLabel: string;
133
+ }
@@ -1,26 +1,67 @@
1
- import React from "react";
1
+ import React, { useCallback } from "react";
2
2
  import UI from "#components/ui";
3
3
  import Button from "#components/buttons/button";
4
+ import type { DialogFooterProps } from "../dialog.types";
4
5
 
5
- type DialogFooterProps = {
6
- onClose: () => void;
7
- onConfirm?: () => void | Promise<void>;
8
- confirmLabel: string;
9
- cancelLabel: string;
10
- };
11
-
6
+ /**
7
+ * DialogFooter component renders action buttons for dialog confirmation/cancellation.
8
+ *
9
+ * This component provides a consistent footer layout with:
10
+ * - Cancel button (secondary style) - Always shown if cancelLabel provided
11
+ * - Confirm button (primary style) - Only shown if onConfirm callback provided
12
+ * - Proper semantic button types
13
+ * - Accessible button sizing and spacing
14
+ * - Memoized to prevent unnecessary re-renders
15
+ *
16
+ * @component
17
+ * @param {DialogFooterProps} props - Component props
18
+ * @param {() => void} props.onClose - Callback fired when cancel button is clicked
19
+ * @param {() => void | Promise<void>} [props.onConfirm] - Optional callback for confirm action. If omitted, confirm button is hidden.
20
+ * @param {string} props.confirmLabel - Text label for the confirm button
21
+ * @param {string} props.cancelLabel - Text label for the cancel button
22
+ * @returns {JSX.Element} A footer section with action buttons
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // Simple close-only footer
27
+ * <DialogFooter
28
+ * onClose={() => setOpen(false)}
29
+ * cancelLabel="Close"
30
+ * confirmLabel="OK"
31
+ * />
32
+ *
33
+ * // Confirmation dialog with both actions
34
+ * <DialogFooter
35
+ * onClose={() => setOpen(false)}
36
+ * onConfirm={async () => await deleteItem()}
37
+ * confirmLabel="Delete"
38
+ * cancelLabel="Cancel"
39
+ * />
40
+ * ```
41
+ */
12
42
  const DialogFooter: React.FC<DialogFooterProps> = ({
13
43
  onClose,
14
44
  onConfirm,
15
45
  confirmLabel,
16
46
  cancelLabel,
17
47
  }) => {
48
+ // Memoize handlers to prevent unnecessary re-renders
49
+ const handleCancel = useCallback(() => {
50
+ onClose();
51
+ }, [onClose]);
52
+
53
+ const handleConfirm = useCallback(() => {
54
+ if (onConfirm) {
55
+ onConfirm();
56
+ }
57
+ }, [onConfirm]);
58
+
18
59
  return (
19
60
  <UI as="section" className="dialog-footer">
20
61
  {cancelLabel && (
21
62
  <Button
22
63
  type="button"
23
- onClick={onClose}
64
+ onClick={handleCancel}
24
65
  className="dialog-button button-secondary"
25
66
  data-btn="sm"
26
67
  >
@@ -31,7 +72,7 @@ const DialogFooter: React.FC<DialogFooterProps> = ({
31
72
  {onConfirm && (
32
73
  <Button
33
74
  type="button"
34
- onClick={onConfirm}
75
+ onClick={handleConfirm}
35
76
  className="dialog-button button-primary"
36
77
  data-btn="sm"
37
78
  >
@@ -42,4 +83,6 @@ const DialogFooter: React.FC<DialogFooterProps> = ({
42
83
  );
43
84
  };
44
85
 
45
- export default DialogFooter;
86
+ DialogFooter.displayName = "DialogFooter";
87
+
88
+ export default React.memo(DialogFooter);
@@ -1,45 +1,50 @@
1
- import React from "react";
1
+ import React, { useCallback } from "react";
2
2
  import UI from "#components/ui";
3
3
  import Heading from "#components/heading/heading";
4
4
  import Button from "#components/buttons/button";
5
5
  import Icon from "#components/icons/icon";
6
-
7
- export type DialogHeaderProps = {
8
- dialogTitle: string;
9
- onClick: () => void;
10
- } & React.ComponentProps<typeof Heading>;
6
+ import type { DialogHeaderProps } from "../dialog.types";
11
7
 
12
8
  /**
13
9
  * DialogHeader component displays the header section of a dialog with a title and close button.
14
10
  *
11
+ * This component is optimized for accessibility with:
12
+ * - Unique ID for `aria-labelledby` linking to parent dialog
13
+ * - Semantic heading structure for screen readers
14
+ * - Clear close button with accessible label
15
+ * - Memoized to prevent unnecessary re-renders
16
+ *
15
17
  * @component
16
- * @param {Object} props - Component props
18
+ * @param {DialogHeaderProps} props - Component props
17
19
  * @param {string} props.dialogTitle - The title text to display in the dialog header
18
20
  * @param {() => void} props.onClick - Callback function triggered when close button is clicked
19
- * @param {string} [props.type='h3'] - Heading type/level to use for the title
21
+ * @param {string} [props.id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.
22
+ * @param {"h1" | "h2" | "h3" | "h4" | "h5" | "h6"} [props.type="h3"] - Heading level for semantic structure
20
23
  * @returns {JSX.Element} A dialog header with title and close button
21
24
  *
22
25
  * @example
23
- * ```jsx
26
+ * ```tsx
24
27
  * <DialogHeader
28
+ * id="dialog-title-1"
25
29
  * dialogTitle="Confirm Action"
26
30
  * onClick={() => setIsOpen(false)}
27
31
  * type="h2"
28
32
  * />
29
33
  * ```
30
34
  */
31
-
32
- const DialogHeader = ({
35
+ const DialogHeader: React.FC<DialogHeaderProps> = ({
33
36
  dialogTitle,
34
37
  onClick,
38
+ id,
35
39
  type = "h3",
36
- }: DialogHeaderProps): JSX.Element => {
37
- const handleClose = () => {
40
+ }) => {
41
+ const handleClose = useCallback(() => {
38
42
  onClick();
39
- };
43
+ }, [onClick]);
44
+
40
45
  return (
41
46
  <UI as="div" classes="dialog-header">
42
- <Heading type={type} className="dialog-title">
47
+ <Heading type={type} className="dialog-title" id={id}>
43
48
  {dialogTitle || "Dialog"}
44
49
  </Heading>
45
50
  <Button
@@ -3,22 +3,62 @@ import { within, expect } from "storybook/test";
3
3
 
4
4
  import Heading from "./heading";
5
5
 
6
+ /**
7
+ * @deprecated This component is deprecated. Use Title component instead.
8
+ */
6
9
  const meta: Meta<typeof Heading> = {
7
- title: "FP.REACT Components/Heading",
10
+ title: "FP.REACT Components/Heading (Deprecated)",
8
11
  component: Heading,
9
- tags: ["version:1.0.0"],
12
+ tags: ["version:1.0.0", "deprecated"],
10
13
  parameters: {
11
14
  actions: { argTypesRegex: "^on.*" },
12
15
  docs: {
13
16
  description: {
14
- component: "Heading description here...",
17
+ component: `
18
+ # ⚠️ DEPRECATED: Use Title Component Instead
19
+
20
+ The \`Heading\` component is **deprecated** and will be removed in **v3.0.0**.
21
+
22
+ Please migrate to the new [\`Title\`](?path=/docs/fp-react-components-title--docs) component.
23
+
24
+ ## Migration Guide
25
+
26
+ \`\`\`tsx
27
+ // ❌ Old API (deprecated):
28
+ import { Heading } from '@fpkit/acss';
29
+ <Heading type="h2">Section Title</Heading>
30
+
31
+ // ✅ New API:
32
+ import { Title } from '@fpkit/acss';
33
+ <Title level="h2">Section Title</Title>
34
+ \`\`\`
35
+
36
+ ### Key Changes
37
+
38
+ 1. **Component Name**: \`Heading\` → \`Title\`
39
+ 2. **Prop Name**: \`type\` → \`level\`
40
+ 3. **Default Level**: Changed from \`h3\` to \`h2\` (update if you relied on the default)
41
+
42
+ ### Why the Change?
43
+
44
+ - **Better API**: \`level\` is more semantic than \`type\`
45
+ - **Improved Accessibility**: Enhanced WCAG 2.1 compliance
46
+ - **Better Documentation**: Comprehensive JSDoc comments
47
+ - **Performance**: Memoization to prevent unnecessary re-renders
48
+
49
+ ## Current Behavior
50
+
51
+ This component still works for backwards compatibility but will log deprecation warnings in development mode.
52
+
53
+ **Removal Timeline**: v3.0.0 (TBD)
54
+ `,
15
55
  },
16
56
  },
17
57
  },
18
58
  args: {
19
59
  children: "Default title",
20
60
  },
21
- } as Story;
61
+ } satisfies Meta<typeof Heading>;
22
62
 
23
63
  export default meta;
24
64
  type Story = StoryObj<typeof Heading>;
@@ -1,27 +1,93 @@
1
- import React from 'react'
2
- import UI from '#components/ui'
3
- import { type } from 'os'
1
+ import React from "react";
2
+ import Title from "#components/title/title";
4
3
 
4
+ /**
5
+ * @deprecated Use `Title` component instead. This component will be removed in v3.0.0.
6
+ *
7
+ * @remarks
8
+ * The `Heading` component has been deprecated in favor of the new `Title` component
9
+ * which offers improved API design and better accessibility features.
10
+ *
11
+ * **Migration Guide:**
12
+ * - Rename `Heading` → `Title`
13
+ * - Rename prop `type` → `level`
14
+ * - Default level changed from `h3` → `h2` (update if you relied on the default)
15
+ *
16
+ * @example
17
+ * // Before (deprecated):
18
+ * <Heading type="h2">Section Title</Heading>
19
+ *
20
+ * // After:
21
+ * <Title level="h2">Section Title</Title>
22
+ *
23
+ * @see {@link Title} for the new component
24
+ */
5
25
  export type TitleProps = {
6
- children: React.ReactNode
7
- type: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
8
- ui?: string
9
- } & React.ComponentProps<typeof UI>
26
+ /**
27
+ * @deprecated Use `level` prop on the `Title` component instead.
28
+ */
29
+ children: React.ReactNode;
10
30
 
11
- const Heading = ({
12
- type = 'h3',
13
- id,
14
- styles,
15
- ui,
16
- children,
17
- ...props
18
- }: TitleProps) => {
19
- return (
20
- <UI as={type} id={id} styles={styles} data-ui={ui} {...props}>
21
- {children}
22
- </UI>
23
- )
24
- }
31
+ /**
32
+ * @deprecated Use `level` prop on the `Title` component instead.
33
+ */
34
+ type?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
25
35
 
26
- export default Heading
27
- Heading.displayName = 'Heading'
36
+ /**
37
+ * @deprecated Use `ui` prop on the `Title` component.
38
+ */
39
+ ui?: string;
40
+ } & Omit<React.ComponentPropsWithoutRef<typeof Title>, 'level'>;
41
+
42
+ /**
43
+ * Heading - Deprecated component wrapper for Title.
44
+ *
45
+ * @deprecated Use {@link Title} component instead. Will be removed in v3.0.0.
46
+ *
47
+ * This component provides backwards compatibility for existing code using
48
+ * the old `Heading` component API. It forwards all props to the new `Title`
49
+ * component with appropriate prop name mapping.
50
+ *
51
+ * **Breaking Changes in v3.0.0:**
52
+ * - This component will be removed
53
+ * - Migrate to `Title` component before upgrading
54
+ *
55
+ * **Migration Steps:**
56
+ * 1. Replace all `<Heading>` imports with `<Title>`
57
+ * 2. Rename `type` prop to `level`
58
+ * 3. Review default behavior (default changed from h3 to h2)
59
+ *
60
+ * @example
61
+ * // Old API (still works but deprecated):
62
+ * import { Heading } from '@fpkit/acss';
63
+ * <Heading type="h2">Section</Heading>
64
+ *
65
+ * @example
66
+ * // New API (recommended):
67
+ * import { Title } from '@fpkit/acss';
68
+ * <Title level="h2">Section</Title>
69
+ *
70
+ * @param {TitleProps} props - Component props (maps old API to new)
71
+ * @returns {React.ReactElement} The rendered Title component
72
+ */
73
+ const Heading = React.forwardRef<HTMLHeadingElement, TitleProps>(
74
+ ({ type = "h3", ...props }, ref) => {
75
+ // Development warning for deprecated usage
76
+ if (process.env.NODE_ENV === "development") {
77
+ // eslint-disable-next-line no-console
78
+ console.warn(
79
+ `[@fpkit/acss] Heading component is deprecated and will be removed in v3.0.0. ` +
80
+ `Please use the Title component instead.\n` +
81
+ `Migration: <Heading type="${type}"> → <Title level="${type}">\n` +
82
+ `See documentation: https://fpkit.dev/components/title`
83
+ );
84
+ }
85
+
86
+ // Map old 'type' prop to new 'level' prop
87
+ return <Title level={type} ref={ref} {...props} />;
88
+ }
89
+ );
90
+
91
+ Heading.displayName = "Heading (Deprecated)";
92
+
93
+ export default Heading;