@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,452 @@
1
+ import { Meta } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="FP.REACT Components/Title/Readme" />
4
+
5
+ # Title
6
+
7
+ A semantic heading component for document structure and hierarchy.
8
+
9
+ ## Overview
10
+
11
+ The `Title` component renders semantic HTML headings (h1-h6) with proper accessibility support, ensuring WCAG 2.1 AA compliance by maintaining semantic document structure for screen readers and assistive technologies.
12
+
13
+ ---
14
+
15
+ ## Features
16
+
17
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '1rem', margin: '1.5rem 0' }}>
18
+ <div style={{ padding: '1rem', border: '1px solid #e0e0e0', borderRadius: '0.5rem' }}>
19
+ <strong>✅ Semantic HTML</strong>
20
+ <p style={{ fontSize: '0.875rem', color: '#666' }}>Renders actual heading elements (h1-h6) for proper document outline</p>
21
+ </div>
22
+ <div style={{ padding: '1rem', border: '1px solid #e0e0e0', borderRadius: '0.5rem' }}>
23
+ <strong>✅ Accessibility</strong>
24
+ <p style={{ fontSize: '0.875rem', color: '#666' }}>Full ARIA support and proper heading hierarchy</p>
25
+ </div>
26
+ <div style={{ padding: '1rem', border: '1px solid #e0e0e0', borderRadius: '0.5rem' }}>
27
+ <strong>✅ Type Safety</strong>
28
+ <p style={{ fontSize: '0.875rem', color: '#666' }}>Fully typed with TypeScript for excellent DX</p>
29
+ </div>
30
+ <div style={{ padding: '1rem', border: '1px solid #e0e0e0', borderRadius: '0.5rem' }}>
31
+ <strong>✅ Performance</strong>
32
+ <p style={{ fontSize: '0.875rem', color: '#666' }}>Memoized to prevent unnecessary re-renders</p>
33
+ </div>
34
+ </div>
35
+
36
+ ---
37
+
38
+ ## Installation
39
+
40
+ ```bash
41
+ npm install @fpkit/acss
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Basic Usage
47
+
48
+ ```tsx
49
+ import { Title } from '@fpkit/acss';
50
+
51
+ function MyComponent() {
52
+ return (
53
+ <>
54
+ <Title level="h1">Page Title</Title>
55
+ <Title level="h2">Section Heading</Title>
56
+ <Title level="h3">Subsection Heading</Title>
57
+ </>
58
+ );
59
+ }
60
+ ```
61
+
62
+ > **Note**: The default heading level is `h2` when no `level` prop is provided.
63
+
64
+ ---
65
+
66
+ ## Props
67
+
68
+ | Prop | Type | Default | Description |
69
+ |------|------|---------|-------------|
70
+ | `level` | `"h1" \| "h2" \| "h3" \| "h4" \| "h5" \| "h6"` | `"h2"` | The semantic heading level to render |
71
+ | `children` | `React.ReactNode` | *required* | The content to display in the heading |
72
+ | `id` | `string` | - | Unique identifier (useful for anchor links) |
73
+ | `ui` | `string` | - | Data attribute for fpkit styling hooks |
74
+ | `className` | `string` | - | CSS class names to apply |
75
+ | `styles` | `React.CSSProperties` | - | Inline styles to apply |
76
+ | `ref` | `React.Ref<HTMLHeadingElement>` | - | Forwarded ref to the heading element |
77
+
78
+ The component also accepts all standard HTML heading attributes and ARIA properties.
79
+
80
+ ---
81
+
82
+ ## Examples
83
+
84
+ ### All Heading Levels
85
+
86
+ The component supports all six semantic heading levels:
87
+
88
+ ```tsx
89
+ // Page title (use once per page)
90
+ <Title level="h1">Main Page Title</Title>
91
+
92
+ // Major sections
93
+ <Title level="h2">Section Heading</Title>
94
+
95
+ // Subsections
96
+ <Title level="h3">Subsection Heading</Title>
97
+
98
+ // Deeper nesting
99
+ <Title level="h4">Level Four Heading</Title>
100
+ <Title level="h5">Level Five Heading</Title>
101
+ <Title level="h6">Level Six Heading</Title>
102
+ ```
103
+
104
+ ### With Anchor Links
105
+
106
+ Use the `id` prop to create anchor links for navigation:
107
+
108
+ ```tsx
109
+ <Title level="h2" id="getting-started">
110
+ Getting Started
111
+ </Title>
112
+
113
+ {/* Link to this section */}
114
+ <a href="#getting-started">Jump to Getting Started</a>
115
+ ```
116
+
117
+ ### Custom Styling
118
+
119
+ The Title component supports multiple styling approaches:
120
+
121
+ #### Using fpkit's UI System
122
+
123
+ ```tsx
124
+ <Title level="h2" ui="section-title">
125
+ Styled Section Title
126
+ </Title>
127
+ ```
128
+
129
+ #### Using CSS Classes
130
+
131
+ ```tsx
132
+ <Title level="h2" className="text-primary font-bold">
133
+ Custom Styled Title
134
+ </Title>
135
+ ```
136
+
137
+ #### Using Inline Styles
138
+
139
+ ```tsx
140
+ <Title
141
+ level="h2"
142
+ styles={{ color: '#0066cc', marginBottom: '1rem' }}
143
+ >
144
+ Inline Styled Title
145
+ </Title>
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Accessibility
151
+
152
+ ### WCAG 2.1 AA Compliance
153
+
154
+ The Title component helps you comply with:
155
+
156
+ - **1.3.1 Info and Relationships (Level A)** - Semantic heading elements preserve document structure
157
+ - **2.4.6 Headings and Labels (Level AA)** - Headings should be descriptive and properly ordered
158
+ - **2.4.10 Section Headings (Level AAA)** - Use headings to organize content
159
+
160
+ ### Proper Heading Hierarchy
161
+
162
+ **✅ GOOD: Proper heading hierarchy**
163
+
164
+ ```tsx
165
+ <div>
166
+ <Title level="h1">Page Title</Title>
167
+ <p>Introduction paragraph...</p>
168
+
169
+ <Title level="h2">First Major Section</Title>
170
+ <p>Section content...</p>
171
+
172
+ <Title level="h3">Subsection 1.1</Title>
173
+ <p>Subsection content...</p>
174
+
175
+ <Title level="h3">Subsection 1.2</Title>
176
+ <p>Subsection content...</p>
177
+
178
+ <Title level="h2">Second Major Section</Title>
179
+ <p>Section content...</p>
180
+
181
+ <Title level="h3">Subsection 2.1</Title>
182
+ <p>Subsection content...</p>
183
+
184
+ <Title level="h4">Sub-subsection 2.1.1</Title>
185
+ <p>Deep nested content...</p>
186
+ </div>
187
+ ```
188
+
189
+ This example demonstrates correct heading hierarchy:
190
+ - One h1 for the page title
191
+ - h2 for major sections
192
+ - h3 for subsections
193
+ - h4 for nested subsections
194
+ - No skipped levels
195
+
196
+ This structure helps screen reader users navigate the page effectively and improves SEO.
197
+
198
+ ### Improper Hierarchy (Anti-Pattern)
199
+
200
+ **❌ BAD: Improper heading hierarchy**
201
+
202
+ ```tsx
203
+ <div>
204
+ <Title level="h1">Page Title</Title>
205
+ <p>Introduction...</p>
206
+
207
+ {/* ❌ BAD: Skipping from h1 to h4 */}
208
+ <Title level="h4">Skipped h2 and h3</Title>
209
+ <p>This violates WCAG guidelines...</p>
210
+ </div>
211
+ ```
212
+
213
+ Skipping from h1 to h4 without h2 or h3 in between:
214
+ - Confuses screen reader users
215
+ - Violates WCAG 2.4.6 (Headings and Labels)
216
+ - Creates poor document structure
217
+
218
+ **Solution:** Always maintain sequential heading levels.
219
+
220
+ ### ARIA Attributes
221
+
222
+ Enhanced accessibility with ARIA labels:
223
+
224
+ ```tsx
225
+ <Title level="h2" aria-label="User dashboard statistics overview">
226
+ Dashboard
227
+ </Title>
228
+ ```
229
+
230
+ Use `aria-label` when the visible text doesn't provide enough context for screen reader users.
231
+
232
+ ---
233
+
234
+ ## Best Practices
235
+
236
+ ### ✅ DO: Maintain Proper Heading Hierarchy
237
+
238
+ ```tsx
239
+ <Title level="h1">Page Title</Title>
240
+ <Title level="h2">Main Section</Title>
241
+ <Title level="h3">Subsection</Title>
242
+ <Title level="h4">Sub-subsection</Title>
243
+ ```
244
+
245
+ **Why?** Screen readers use heading hierarchy to build a document outline for navigation.
246
+
247
+ ### ❌ DON'T: Skip Heading Levels
248
+
249
+ ```tsx
250
+ {/* ❌ BAD: Skipping from h1 to h4 */}
251
+ <Title level="h1">Page Title</Title>
252
+ <Title level="h4">Skipped h2 and h3</Title>
253
+ ```
254
+
255
+ **Why?** This confuses screen reader users and violates WCAG guidelines.
256
+
257
+ ### ✅ DO: Use One h1 Per Page
258
+
259
+ ```tsx
260
+ <Title level="h1">Main Page Title</Title>
261
+ {/* Only one h1 per page */}
262
+ <Title level="h2">Section 1</Title>
263
+ <Title level="h2">Section 2</Title>
264
+ ```
265
+
266
+ **Why?** Multiple h1 elements can confuse users about the page's main purpose.
267
+
268
+ ### ✅ DO: Make Headings Descriptive
269
+
270
+ ```tsx
271
+ {/* ✅ GOOD: Descriptive */}
272
+ <Title level="h2">User Account Settings</Title>
273
+
274
+ {/* ❌ BAD: Vague */}
275
+ <Title level="h2">Settings</Title>
276
+ ```
277
+
278
+ **Why?** Users navigating by headings need context to understand each section.
279
+
280
+ ### ✅ DO: Avoid Empty or Meaningless Headings
281
+
282
+ ```tsx
283
+ {/* ❌ BAD: No meaningful content */}
284
+ <Title level="h2"> </Title>
285
+
286
+ {/* ✅ GOOD: Clear content */}
287
+ <Title level="h2">Contact Information</Title>
288
+ ```
289
+
290
+ ---
291
+
292
+ ## Advanced Usage
293
+
294
+ ### Ref Forwarding for Focus Management
295
+
296
+ ```tsx
297
+ import { useRef, useEffect } from 'react';
298
+
299
+ function AutoFocusTitle() {
300
+ const titleRef = useRef<HTMLHeadingElement>(null);
301
+
302
+ useEffect(() => {
303
+ // Focus the title on mount (useful for accessibility)
304
+ titleRef.current?.focus();
305
+ }, []);
306
+
307
+ return (
308
+ <Title ref={titleRef} tabIndex={-1} level="h2">
309
+ This title receives focus
310
+ </Title>
311
+ );
312
+ }
313
+ ```
314
+
315
+ ### Complex Content
316
+
317
+ ```tsx
318
+ import { Icon } from '@fpkit/acss';
319
+
320
+ <Title level="h2">
321
+ <Icon name="chart" aria-hidden="true" />
322
+ <span>Statistics Dashboard</span>
323
+ </Title>
324
+ ```
325
+
326
+ ### TypeScript
327
+
328
+ The component is fully typed with comprehensive TypeScript support:
329
+
330
+ ```tsx
331
+ import { Title, type TitleProps, type HeadingLevel } from '@fpkit/acss';
332
+
333
+ // Custom wrapper with additional props
334
+ interface SectionTitleProps extends TitleProps {
335
+ highlighted?: boolean;
336
+ }
337
+
338
+ function SectionTitle({ highlighted, ...props }: SectionTitleProps) {
339
+ return (
340
+ <Title
341
+ {...props}
342
+ className={highlighted ? 'highlighted' : ''}
343
+ />
344
+ );
345
+ }
346
+
347
+ // Type-safe heading level
348
+ const level: HeadingLevel = 'h2';
349
+ <Title level={level}>Typed Title</Title>
350
+ ```
351
+
352
+ ---
353
+
354
+ ## Performance
355
+
356
+ The Title component is wrapped with `React.memo`, which prevents re-renders when parent components update if the props haven't changed.
357
+
358
+ ```tsx
359
+ // This will only re-render when `title` prop changes
360
+ function ParentComponent({ title, someOtherState }) {
361
+ return (
362
+ <>
363
+ <Title level="h2">{title}</Title>
364
+ <p>{someOtherState}</p>
365
+ </>
366
+ );
367
+ }
368
+ ```
369
+
370
+ ---
371
+
372
+ ## Migration from Heading Component
373
+
374
+ > **Note**: If you're using the deprecated `Heading` component, please migrate to `Title`.
375
+
376
+ ### Quick Migration Guide
377
+
378
+ ```tsx
379
+ // Before (deprecated):
380
+ import { Heading } from '@fpkit/acss';
381
+ <Heading type="h2">Section Title</Heading>
382
+
383
+ // After:
384
+ import { Title } from '@fpkit/acss';
385
+ <Title level="h2">Section Title</Title>
386
+ ```
387
+
388
+ ### Key Changes
389
+
390
+ 1. **Component Name**: `Heading` → `Title`
391
+ 2. **Prop Name**: `type` → `level`
392
+ 3. **Default Level**: Changed from `h3` to `h2`
393
+
394
+ ### Why Migrate?
395
+
396
+ - **Better API**: `level` is more semantic than `type`
397
+ - **Improved Accessibility**: Enhanced WCAG 2.1 compliance
398
+ - **Better Documentation**: Comprehensive JSDoc comments
399
+ - **Performance**: Memoization to prevent unnecessary re-renders
400
+
401
+ The `Heading` component will be removed in **v3.0.0**.
402
+
403
+ ---
404
+
405
+ ## Related Components
406
+
407
+ - **Text** - For body text and paragraphs
408
+ - **UI** - The underlying polymorphic component
409
+
410
+ ---
411
+
412
+ ## Accessibility Checklist
413
+
414
+ When using the Title component, ensure:
415
+
416
+ - [ ] One h1 per page for the main title
417
+ - [ ] Sequential heading levels (don't skip levels)
418
+ - [ ] Descriptive heading text that summarizes the following content
419
+ - [ ] ARIA labels when visible text lacks context
420
+ - [ ] Proper document outline for screen reader navigation
421
+
422
+ ---
423
+
424
+ ## Resources
425
+
426
+ - [WCAG 2.1 - Info and Relationships (1.3.1)](https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html)
427
+ - [WCAG 2.1 - Headings and Labels (2.4.6)](https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html)
428
+ - [MDN - Heading elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements)
429
+ - [WebAIM - Semantic Structure](https://webaim.org/techniques/semanticstructure/)
430
+
431
+ ---
432
+
433
+ ## Support
434
+
435
+ For issues, questions, or contributions:
436
+
437
+ - **GitHub**: [fpkit/acss](https://github.com/fpkit/acss)
438
+ - **Documentation**: [fpkit.dev](https://fpkit.dev)
439
+
440
+ ---
441
+
442
+ <div style={{ padding: '1rem', background: '#f0f9ff', border: '1px solid #0ea5e9', borderRadius: '0.5rem', marginTop: '2rem' }}>
443
+ <strong>💡 Pro Tip:</strong> Use browser extensions like{' '}
444
+ <a href="https://www.tpgi.com/arc-platform/arc-toolkit/" target="_blank" rel="noopener noreferrer">
445
+ Arc Toolkit
446
+ </a>{' '}
447
+ or{' '}
448
+ <a href="https://www.deque.com/axe/browser-extensions/" target="_blank" rel="noopener noreferrer">
449
+ axe DevTools
450
+ </a>{' '}
451
+ to validate your heading structure and ensure proper accessibility.
452
+ </div>