@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,285 @@
1
+ import React__default from 'react';
2
+
3
+ /**
4
+ * Extracts the appropriate ref type for a given element type.
5
+ *
6
+ * This utility type ensures that refs are properly typed based on the element
7
+ * being rendered. For example, a button element receives HTMLButtonElement ref.
8
+ *
9
+ * @typeParam C - The HTML element type (e.g., 'button', 'div', 'a')
10
+ * @example
11
+ * ```typescript
12
+ * type ButtonRef = PolymorphicRef<'button'>; // React.Ref<HTMLButtonElement>
13
+ * type DivRef = PolymorphicRef<'div'>; // React.Ref<HTMLDivElement>
14
+ * ```
15
+ */
16
+ type PolymorphicRef<C extends React__default.ElementType> = React__default.ComponentPropsWithRef<C>["ref"];
17
+ /**
18
+ * Defines the 'as' prop that determines which HTML element to render.
19
+ *
20
+ * This is the core prop that enables polymorphic behavior, allowing components
21
+ * to render as any valid React element type while maintaining type safety.
22
+ *
23
+ * @typeParam C - The HTML element type to render
24
+ * @example
25
+ * ```typescript
26
+ * <UI as="button">Click me</UI>
27
+ * <UI as="a" href="/home">Link</UI>
28
+ * ```
29
+ */
30
+ type AsProp<C extends React__default.ElementType> = {
31
+ as?: C;
32
+ };
33
+ /**
34
+ * Identifies props that should be omitted to prevent type conflicts.
35
+ *
36
+ * This type ensures that our custom props don't conflict with native element
37
+ * props by calculating which keys need to be omitted from the native props.
38
+ *
39
+ * @typeParam C - The HTML element type
40
+ * @typeParam P - The custom props to merge
41
+ */
42
+ type PropsToOmit<C extends React__default.ElementType, P> = keyof (AsProp<C> & P);
43
+ /**
44
+ * Merges custom props with native element props while preventing conflicts.
45
+ *
46
+ * This creates a union of our custom props and the native props for the chosen
47
+ * element, omitting any conflicting keys to ensure type safety.
48
+ *
49
+ * @typeParam C - The HTML element type
50
+ * @typeParam Props - The custom props to add
51
+ * @example
52
+ * ```typescript
53
+ * // For a button, this merges custom props with HTMLButtonElement props
54
+ * type ButtonProps = PolymorphicComponentProp<'button', { variant?: string }>;
55
+ * ```
56
+ */
57
+ type PolymorphicComponentProp<C extends React__default.ElementType, Props = {}> = React__default.PropsWithChildren<Props & AsProp<C>> & Omit<React__default.ComponentPropsWithoutRef<C>, PropsToOmit<C, Props>>;
58
+ /**
59
+ * Extends PolymorphicComponentProp to include properly-typed ref support.
60
+ *
61
+ * This is the final type in the polymorphic type chain, adding ref forwarding
62
+ * with the correct ref type for the chosen element. The ref is properly typed
63
+ * to match the element being rendered, enabling focus management and direct
64
+ * DOM access for accessibility features like programmatic focus control.
65
+ *
66
+ * @typeParam C - The HTML element type
67
+ * @typeParam Props - The custom props to add
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * // Using ref for focus management (important for accessibility)
72
+ * const buttonRef = useRef<HTMLButtonElement>(null);
73
+ * useEffect(() => {
74
+ * // Programmatically focus for keyboard navigation
75
+ * buttonRef.current?.focus();
76
+ * }, []);
77
+ *
78
+ * return <UI as="button" ref={buttonRef}>Accessible Button</UI>;
79
+ * ```
80
+ */
81
+ type PolymorphicComponentPropWithRef<C extends React__default.ElementType, Props = {}> = PolymorphicComponentProp<C, Props> & {
82
+ ref?: PolymorphicRef<C>;
83
+ };
84
+ /**
85
+ * Props for the UI component, extending polymorphic props with style and class support.
86
+ *
87
+ * The UI component automatically forwards all ARIA attributes and native HTML props
88
+ * to the rendered element, ensuring full accessibility support. This includes:
89
+ * - `aria-label`, `aria-labelledby` - Accessible names for screen readers
90
+ * - `aria-describedby` - Additional descriptive text references
91
+ * - `aria-expanded`, `aria-controls` - Interactive widget states
92
+ * - `role` - Semantic role override when needed
93
+ * - All other ARIA attributes and HTML props
94
+ *
95
+ * @typeParam C - The HTML element type to render
96
+ * @property {boolean} [renderStyles] - Reserved for future use. Currently has no effect.
97
+ * Styles are always rendered regardless of this prop value.
98
+ * @property {React.CSSProperties} [styles] - Inline styles to apply (overrides defaultStyles)
99
+ * @property {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop
100
+ * @property {string} [classes] - CSS class names to apply to the element
101
+ * @property {string} [id] - HTML id attribute
102
+ * @property {React.ReactNode} [children] - Child elements to render
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * // All ARIA attributes are automatically forwarded
107
+ * <UI as="button" aria-label="Close dialog" aria-expanded={isOpen}>
108
+ * <CloseIcon />
109
+ * </UI>
110
+ * ```
111
+ */
112
+ type UIProps<C extends React__default.ElementType> = PolymorphicComponentPropWithRef<C, {
113
+ /** @deprecated Reserved for future use. Currently has no effect. Styles are always rendered. */
114
+ renderStyles?: boolean;
115
+ styles?: React__default.CSSProperties;
116
+ defaultStyles?: React__default.CSSProperties;
117
+ classes?: string;
118
+ id?: string;
119
+ children?: React__default.ReactNode;
120
+ }>;
121
+ /**
122
+ * UI Component function signature.
123
+ *
124
+ * Defines the polymorphic component that can render as any HTML element while
125
+ * maintaining full TypeScript type safety for element-specific props.
126
+ *
127
+ * @typeParam C - The HTML element type to render (defaults to 'div')
128
+ * @param {UIProps<C>} props - Component props including 'as', styles, and native element props
129
+ * @returns {React.ReactElement} A React element of the specified type
130
+ * @example
131
+ * ```typescript
132
+ * <UI as="button" onClick={handler}>Button</UI>
133
+ * <UI as="a" href="/link">Link</UI>
134
+ * <UI>Default div</UI>
135
+ * ```
136
+ */
137
+ type UIComponent = (<C extends React__default.ElementType = "div">(props: UIProps<C>) => React__default.ReactElement | any) & {
138
+ displayName?: string;
139
+ };
140
+ /**
141
+ * UI - A polymorphic React component that can render as any HTML element.
142
+ *
143
+ * The UI component is a foundational primitive used throughout fpkit to create
144
+ * flexible, type-safe components. It implements the polymorphic component pattern,
145
+ * allowing a single component to render as different HTML elements while maintaining
146
+ * full TypeScript type safety for element-specific props.
147
+ *
148
+ * ## Accessibility Considerations
149
+ *
150
+ * The UI component forwards all ARIA attributes and native HTML props, placing
151
+ * accessibility responsibility on the consumer. When creating interactive elements,
152
+ * you MUST ensure WCAG 2.1 AA compliance:
153
+ *
154
+ * - **Accessible Names**: All interactive elements need an accessible name via
155
+ * `aria-label`, `aria-labelledby`, or visible text content
156
+ * - **Semantic HTML**: Prefer semantic elements (`button`, `a`, `nav`) over
157
+ * generic containers (`div`, `span`) with ARIA roles when possible
158
+ * - **Focus Indicators**: Ensure focus indicators meet WCAG 2.4.7 (3:1 contrast)
159
+ * - **Keyboard Support**: Interactive elements must be keyboard accessible
160
+ *
161
+ * @typeParam C - The HTML element type to render (e.g., 'button', 'div', 'a')
162
+ *
163
+ * @param {C} [as='div'] - The HTML element type to render. Defaults to 'div'.
164
+ * @param {React.CSSProperties} [styles] - Inline styles to apply. Overrides defaultStyles.
165
+ * @param {string} [classes] - CSS class names to apply to the element.
166
+ * @param {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop.
167
+ * @param {React.ReactNode} [children] - Child elements to render inside the component.
168
+ * @param {PolymorphicRef<C>} [ref] - Forwarded ref with proper typing for the element type.
169
+ * @param {boolean} [renderStyles] - Reserved for future use. Currently has no effect.
170
+ *
171
+ * @returns {React.ReactElement} A React element of the specified type with merged props.
172
+ *
173
+ * @example
174
+ * // Basic usage - renders as div
175
+ * <UI>Hello World</UI>
176
+ *
177
+ * @example
178
+ * // Polymorphic rendering - renders as button with type-safe props
179
+ * <UI as="button" onClick={handleClick} disabled>
180
+ * Click me
181
+ * </UI>
182
+ *
183
+ * @example
184
+ * // ✅ GOOD: Accessible button with aria-label for icon-only button
185
+ * <UI as="button" aria-label="Close dialog" onClick={handleClose}>
186
+ * <CloseIcon />
187
+ * </UI>
188
+ *
189
+ * @example
190
+ * // ✅ GOOD: Accessible link with descriptive text
191
+ * <UI as="a" href="/products">
192
+ * View all products
193
+ * </UI>
194
+ *
195
+ * @example
196
+ * // ✅ GOOD: Interactive element with proper role and keyboard support
197
+ * <UI
198
+ * as="div"
199
+ * role="button"
200
+ * tabIndex={0}
201
+ * aria-label="Toggle menu"
202
+ * onClick={handleToggle}
203
+ * onKeyDown={(e) => e.key === 'Enter' && handleToggle()}
204
+ * >
205
+ * Menu
206
+ * </UI>
207
+ *
208
+ * @example
209
+ * // ❌ BAD: Button without accessible name (screen readers can't identify it)
210
+ * <UI as="button" onClick={handleClose}>
211
+ * <CloseIcon />
212
+ * </UI>
213
+ *
214
+ * @example
215
+ * // ❌ BAD: Non-semantic div with click handler (not keyboard accessible)
216
+ * <UI as="div" onClick={handleClick}>
217
+ * Click me
218
+ * </UI>
219
+ *
220
+ * @example
221
+ * // ✅ GOOD: Custom focus indicator with WCAG 2.4.7 compliant contrast
222
+ * <UI
223
+ * as="button"
224
+ * styles={{
225
+ * outline: '2px solid transparent',
226
+ * outlineOffset: '2px',
227
+ * }}
228
+ * classes="focus:outline-blue-500"
229
+ * >
230
+ * Accessible Button
231
+ * </UI>
232
+ *
233
+ * @example
234
+ * // Style merging - defaultStyles provide base, styles override
235
+ * <UI
236
+ * as="span"
237
+ * defaultStyles={{ padding: '0.5rem', color: 'blue' }}
238
+ * styles={{ color: 'red' }}
239
+ * >
240
+ * Red text with padding
241
+ * </UI>
242
+ *
243
+ * @example
244
+ * // Ref forwarding for focus management
245
+ * const buttonRef = useRef<HTMLButtonElement>(null);
246
+ * useEffect(() => {
247
+ * // Programmatically focus for keyboard navigation
248
+ * buttonRef.current?.focus();
249
+ * }, []);
250
+ * <UI as="button" ref={buttonRef}>Auto-focused Button</UI>
251
+ *
252
+ * @example
253
+ * // Building accessible higher-level components with TypeScript
254
+ * interface AccessibleButtonProps extends React.ComponentPropsWithoutRef<'button'> {
255
+ * variant?: 'primary' | 'secondary';
256
+ * // Require either aria-label or children for accessibility
257
+ * 'aria-label'?: string;
258
+ * children?: React.ReactNode;
259
+ * }
260
+ *
261
+ * const AccessibleButton = React.forwardRef<HTMLButtonElement, AccessibleButtonProps>(
262
+ * ({ variant = 'primary', ...props }, ref) => {
263
+ * // Runtime check: ensure accessible name is provided
264
+ * if (!props['aria-label'] && !props.children) {
265
+ * console.warn('AccessibleButton requires either aria-label or children');
266
+ * }
267
+ *
268
+ * return (
269
+ * <UI
270
+ * as="button"
271
+ * ref={ref}
272
+ * defaultStyles={{
273
+ * padding: '0.5rem 1rem',
274
+ * borderRadius: '0.25rem',
275
+ * backgroundColor: variant === 'primary' ? '#007bff' : '#6c757d',
276
+ * }}
277
+ * {...props}
278
+ * />
279
+ * );
280
+ * }
281
+ * );
282
+ */
283
+ declare const UI: UIComponent;
284
+
285
+ export { UI as U };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@fpkit/acss",
3
3
  "description": "A lightweight React UI library for building modern and accessible components that leverage CSS custom properties for reactive Styles.",
4
4
  "private": false,
5
- "version": "0.5.11",
5
+ "version": "0.5.13",
6
6
  "engines": {
7
7
  "node": ">=20.9.0",
8
8
  "npm": ">=8.0.0"
@@ -127,5 +127,5 @@
127
127
  "publishConfig": {
128
128
  "access": "public"
129
129
  },
130
- "gitHead": "fc1c7450c6166b7155122b1a0efdb1b55306cf2b"
130
+ "gitHead": "00db2b908b9aa637e99c401861de87d43b7009d6"
131
131
  }