@fpkit/acss 0.5.12 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -0
- package/libs/chunk-2NRIP6RB.cjs +17 -0
- package/libs/chunk-2NRIP6RB.cjs.map +1 -0
- package/libs/chunk-33PNJ4LO.cjs +15 -0
- package/libs/chunk-33PNJ4LO.cjs.map +1 -0
- package/libs/chunk-4BZKFPEC.cjs +17 -0
- package/libs/chunk-4BZKFPEC.cjs.map +1 -0
- package/libs/{chunk-O6QZBB6G.js → chunk-5QD3DWFI.js} +5 -5
- package/libs/chunk-5QD3DWFI.js.map +1 -0
- package/libs/chunk-6SAHIYCZ.js +7 -0
- package/libs/chunk-6SAHIYCZ.js.map +1 -0
- package/libs/{chunk-KKLTUJFB.cjs → chunk-6WTC4JXH.cjs} +5 -5
- package/libs/chunk-6WTC4JXH.cjs.map +1 -0
- package/libs/chunk-75QHTLFO.js +7 -0
- package/libs/chunk-75QHTLFO.js.map +1 -0
- package/libs/{chunk-YWOYVRFT.js → chunk-7XPFW7CB.js} +3 -3
- package/libs/chunk-BFK62VX5.js +5 -0
- package/libs/chunk-BFK62VX5.js.map +1 -0
- package/libs/{chunk-ICCKQ2GC.cjs → chunk-DKTHCQ5P.cjs} +4 -4
- package/libs/{chunk-6TE5QEVE.cjs → chunk-E2AJURUW.cjs} +3 -3
- package/libs/chunk-E2AJURUW.cjs.map +1 -0
- package/libs/chunk-ENTCUJ3A.cjs +13 -0
- package/libs/chunk-ENTCUJ3A.cjs.map +1 -0
- package/libs/chunk-F5EYMVQM.js +10 -0
- package/libs/chunk-F5EYMVQM.js.map +1 -0
- package/libs/chunk-FVROL3V5.js +9 -0
- package/libs/chunk-FVROL3V5.js.map +1 -0
- package/libs/chunk-GT77BX4L.cjs +17 -0
- package/libs/chunk-GT77BX4L.cjs.map +1 -0
- package/libs/chunk-GUJSMQ3V.cjs +16 -0
- package/libs/chunk-GUJSMQ3V.cjs.map +1 -0
- package/libs/chunk-HHLNOC5T.js +7 -0
- package/libs/chunk-HHLNOC5T.js.map +1 -0
- package/libs/chunk-HRRHPLER.js +8 -0
- package/libs/chunk-HRRHPLER.js.map +1 -0
- package/libs/chunk-IEB64SWY.js +8 -0
- package/libs/chunk-IEB64SWY.js.map +1 -0
- package/libs/{chunk-LIQJ7ZZR.js → chunk-IQ76HGVP.js} +2 -2
- package/libs/chunk-IRLFZ3OL.js +9 -0
- package/libs/chunk-IRLFZ3OL.js.map +1 -0
- package/libs/chunk-KK47SYZI.js +8 -0
- package/libs/chunk-KK47SYZI.js.map +1 -0
- package/libs/chunk-O3JIHC5M.cjs +15 -0
- package/libs/chunk-O3JIHC5M.cjs.map +1 -0
- package/libs/chunk-O5XAJ7BY.cjs +18 -0
- package/libs/chunk-O5XAJ7BY.cjs.map +1 -0
- package/libs/chunk-OVWLQYMK.js +10 -0
- package/libs/chunk-OVWLQYMK.js.map +1 -0
- package/libs/chunk-PNWIRCG3.cjs +7 -0
- package/libs/chunk-PNWIRCG3.cjs.map +1 -0
- package/libs/chunk-QVW6W76L.cjs +18 -0
- package/libs/chunk-QVW6W76L.cjs.map +1 -0
- package/libs/chunk-T4T6GWYQ.cjs +17 -0
- package/libs/chunk-T4T6GWYQ.cjs.map +1 -0
- package/libs/chunk-TON2YGMD.cjs +9 -0
- package/libs/chunk-TON2YGMD.cjs.map +1 -0
- package/libs/chunk-UEPAWMDF.js +8 -0
- package/libs/chunk-UEPAWMDF.js.map +1 -0
- package/libs/{chunk-LT5KZ2QW.cjs → chunk-US2I5GI7.cjs} +3 -3
- package/libs/{chunk-E3XP6BEX.cjs → chunk-W2UIN7EV.cjs} +3 -3
- package/libs/chunk-W5TKWBFC.cjs +18 -0
- package/libs/chunk-W5TKWBFC.cjs.map +1 -0
- package/libs/chunk-WXBFBWYF.cjs +16 -0
- package/libs/chunk-WXBFBWYF.cjs.map +1 -0
- package/libs/chunk-X3JCTEPD.js +11 -0
- package/libs/chunk-X3JCTEPD.js.map +1 -0
- package/libs/chunk-X5LGFCWG.js +9 -0
- package/libs/chunk-X5LGFCWG.js.map +1 -0
- package/libs/{chunk-5M57K4SW.js → chunk-Y2PFDELK.js} +2 -2
- package/libs/chunk-ZFJ4U45S.js +10 -0
- package/libs/chunk-ZFJ4U45S.js.map +1 -0
- package/libs/{component-props-a8a2f97e.d.ts → component-props-67d978a2.d.ts} +4 -4
- package/libs/components/alert/alert.css +1 -1
- package/libs/components/alert/alert.css.map +1 -1
- package/libs/components/alert/alert.min.css +2 -2
- package/libs/components/badge/badge.css +1 -1
- package/libs/components/badge/badge.css.map +1 -1
- package/libs/components/badge/badge.min.css +2 -2
- package/libs/components/breadcrumbs/breadcrumb.cjs +9 -5
- package/libs/components/breadcrumbs/breadcrumb.d.cts +275 -36
- package/libs/components/breadcrumbs/breadcrumb.d.ts +275 -36
- package/libs/components/breadcrumbs/breadcrumb.js +3 -3
- package/libs/components/button.cjs +6 -4
- package/libs/components/button.d.cts +97 -4
- package/libs/components/button.d.ts +97 -4
- package/libs/components/button.js +4 -2
- package/libs/components/buttons/button.css +1 -1
- package/libs/components/buttons/button.css.map +1 -1
- package/libs/components/buttons/button.min.css +2 -2
- package/libs/components/card.cjs +7 -7
- package/libs/components/card.d.cts +278 -34
- package/libs/components/card.d.ts +278 -34
- package/libs/components/card.js +2 -2
- package/libs/components/cards/card.css +1 -1
- package/libs/components/cards/card.css.map +1 -1
- package/libs/components/cards/card.min.css +2 -2
- package/libs/components/details/details.css +1 -1
- package/libs/components/details/details.css.map +1 -1
- package/libs/components/details/details.min.css +2 -2
- package/libs/components/dialog/dialog.cjs +9 -7
- package/libs/components/dialog/dialog.css +1 -1
- package/libs/components/dialog/dialog.css.map +1 -1
- package/libs/components/dialog/dialog.d.cts +88 -34
- package/libs/components/dialog/dialog.d.ts +88 -34
- package/libs/components/dialog/dialog.js +7 -5
- package/libs/components/dialog/dialog.min.css +2 -2
- package/libs/components/form/fields.cjs +4 -4
- package/libs/components/form/fields.d.cts +16 -7
- package/libs/components/form/fields.d.ts +16 -7
- package/libs/components/form/fields.js +2 -2
- package/libs/components/form/inputs.cjs +6 -4
- package/libs/components/form/inputs.d.cts +50 -2
- package/libs/components/form/inputs.d.ts +50 -2
- package/libs/components/form/inputs.js +4 -2
- package/libs/components/form/textarea.cjs +5 -4
- package/libs/components/form/textarea.d.cts +32 -23
- package/libs/components/form/textarea.d.ts +32 -23
- package/libs/components/form/textarea.js +3 -2
- package/libs/components/heading/heading.cjs +3 -3
- package/libs/components/heading/heading.d.cts +3 -14
- package/libs/components/heading/heading.d.ts +3 -14
- package/libs/components/heading/heading.js +2 -2
- package/libs/components/icons/icon.cjs +4 -4
- package/libs/components/icons/icon.d.cts +183 -39
- package/libs/components/icons/icon.d.ts +183 -39
- package/libs/components/icons/icon.js +2 -2
- package/libs/components/images/img.css +1 -1
- package/libs/components/images/img.css.map +1 -1
- package/libs/components/images/img.min.css +2 -2
- package/libs/components/link/link.cjs +4 -4
- package/libs/components/link/link.css +1 -1
- package/libs/components/link/link.css.map +1 -1
- package/libs/components/link/link.d.cts +3 -19
- package/libs/components/link/link.d.ts +3 -19
- package/libs/components/link/link.js +2 -2
- package/libs/components/link/link.min.css +2 -2
- package/libs/components/list/list.cjs +5 -5
- package/libs/components/list/list.css +1 -0
- package/libs/components/list/list.css.map +1 -0
- package/libs/components/list/list.d.cts +120 -33
- package/libs/components/list/list.d.ts +120 -33
- package/libs/components/list/list.js +2 -2
- package/libs/components/list/list.min.css +3 -0
- package/libs/components/modal.cjs +6 -4
- package/libs/components/modal.d.cts +8 -8
- package/libs/components/modal.d.ts +8 -8
- package/libs/components/modal.js +5 -3
- package/libs/components/nav/nav.cjs +7 -7
- package/libs/components/nav/nav.css +1 -1
- package/libs/components/nav/nav.css.map +1 -1
- package/libs/components/nav/nav.d.cts +550 -34
- package/libs/components/nav/nav.d.ts +550 -34
- package/libs/components/nav/nav.js +3 -3
- package/libs/components/nav/nav.min.css +2 -2
- package/libs/components/popover/popover.d.cts +5 -5
- package/libs/components/popover/popover.d.ts +5 -5
- package/libs/components/tables/table.cjs +5 -5
- package/libs/components/tables/table.d.cts +8 -8
- package/libs/components/tables/table.d.ts +8 -8
- package/libs/components/tables/table.js +2 -2
- package/libs/components/tag/tag.css +1 -1
- package/libs/components/tag/tag.css.map +1 -1
- package/libs/components/tag/tag.min.css +2 -2
- package/libs/components/text/text.cjs +5 -5
- package/libs/components/text/text.d.cts +5 -5
- package/libs/components/text/text.d.ts +5 -5
- package/libs/components/text/text.js +2 -2
- package/libs/form.types-d25ebfac.d.ts +233 -0
- package/libs/heading-7446cb46.d.ts +250 -0
- package/libs/hooks.cjs +12 -0
- package/libs/hooks.d.cts +140 -1
- package/libs/hooks.d.ts +140 -1
- package/libs/hooks.js +4 -0
- package/libs/icons.cjs +3 -3
- package/libs/icons.d.cts +2 -2
- package/libs/icons.d.ts +2 -2
- package/libs/icons.js +2 -2
- package/libs/index.cjs +117 -94
- package/libs/index.cjs.map +1 -1
- package/libs/index.css +1 -1
- package/libs/index.css.map +1 -1
- package/libs/index.d.cts +834 -61
- package/libs/index.d.ts +834 -61
- package/libs/index.js +36 -22
- package/libs/index.js.map +1 -1
- package/libs/link-5192f411.d.ts +323 -0
- package/libs/list.types-d26de310.d.ts +245 -0
- package/libs/ui-d01b50d4.d.ts +289 -0
- package/package.json +4 -87
- package/src/components/README-UI.mdx +416 -0
- package/src/components/alert/ACCESSIBILITY.md +319 -0
- package/src/components/alert/README.mdx +475 -19
- package/src/components/alert/alert.scss +110 -6
- package/src/components/alert/alert.stories.tsx +372 -0
- package/src/components/alert/alert.test.tsx +762 -0
- package/src/components/alert/alert.tsx +331 -66
- package/src/components/alert/views/alert-actions.tsx +13 -0
- package/src/components/alert/views/alert-content.tsx +17 -0
- package/src/components/alert/views/alert-icon.tsx +53 -0
- package/src/components/alert/views/alert-screen-reader-text.tsx +30 -0
- package/src/components/alert/views/alert-title.tsx +23 -0
- package/src/components/alert/views/alert-view.tsx +158 -0
- package/src/components/alert/views/index.ts +12 -0
- package/src/components/badge/badge.mdx +186 -49
- package/src/components/badge/badge.scss +20 -2
- package/src/components/badge/badge.stories.tsx +160 -14
- package/src/components/badge/badge.test.tsx +179 -0
- package/src/components/badge/badge.tsx +97 -4
- package/src/components/breadcrumbs/README.mdx +364 -45
- package/src/components/breadcrumbs/__snapshots__/breadcrumb.test.tsx.snap +152 -0
- package/src/components/breadcrumbs/breadcrumb.stories.tsx +7 -3
- package/src/components/breadcrumbs/breadcrumb.test.tsx +490 -0
- package/src/components/breadcrumbs/breadcrumb.tsx +430 -170
- package/src/components/buttons/README.mdx +102 -1
- package/src/components/buttons/button.scss +34 -31
- package/src/components/buttons/button.stories.tsx +141 -0
- package/src/components/buttons/button.tsx +82 -52
- package/src/components/cards/README.mdx +657 -0
- package/src/components/cards/card.scss +22 -0
- package/src/components/cards/card.stories.tsx +167 -5
- package/src/components/cards/card.test.tsx +360 -20
- package/src/components/cards/card.tsx +200 -79
- package/src/components/cards/card.types.ts +135 -0
- package/src/components/cards/card.utils.ts +79 -0
- package/src/components/details/ACCESSIBILITY-REVIEW-LIVE.md +1050 -0
- package/src/components/details/ACCESSIBILITY-REVIEW.md +502 -0
- package/src/components/details/README.mdx +437 -69
- package/src/components/details/details.scss +16 -7
- package/src/components/details/details.test.tsx +385 -0
- package/src/components/details/details.tsx +101 -69
- package/src/components/details/details.types.ts +76 -0
- package/src/components/dialog/README.mdx +513 -110
- package/src/components/dialog/dialog-a11y-review.md +653 -0
- package/src/components/dialog/dialog-modal.tsx +79 -56
- package/src/components/dialog/dialog.scss +53 -3
- package/src/components/dialog/dialog.stories.tsx +10 -7
- package/src/components/dialog/dialog.test.tsx +450 -0
- package/src/components/dialog/dialog.tsx +69 -59
- package/src/components/dialog/dialog.types.ts +133 -0
- package/src/components/dialog/views/dialog-footer.tsx +54 -11
- package/src/components/dialog/views/dialog-header.tsx +20 -15
- package/src/components/form/README.mdx +725 -43
- package/src/components/form/WCAG-REVIEW.md +654 -0
- package/src/components/form/fields.tsx +10 -1
- package/src/components/form/form.stories.tsx +604 -23
- package/src/components/form/form.tsx +204 -63
- package/src/components/form/form.types.ts +378 -0
- package/src/components/form/input.stories.tsx +71 -3
- package/src/components/form/inputs.tsx +159 -67
- package/src/components/form/select.tsx +122 -66
- package/src/components/form/textarea.tsx +120 -73
- package/src/components/fp.tsx +86 -11
- package/src/components/heading/heading.stories.tsx +44 -4
- package/src/components/heading/heading.tsx +89 -23
- package/src/components/icons/README.mdx +332 -0
- package/src/components/icons/icon.stories.tsx +74 -1
- package/src/components/icons/icon.tsx +89 -1
- package/src/components/icons/types.ts +47 -0
- package/src/components/images/README.mdx +340 -24
- package/src/components/images/img.scss +19 -3
- package/src/components/images/img.stories.tsx +424 -15
- package/src/components/images/img.test.tsx +354 -25
- package/src/components/images/img.tsx +186 -63
- package/src/components/images/img.types.ts +211 -0
- package/src/components/link/README.mdx +923 -0
- package/src/components/link/link.scss +79 -26
- package/src/components/link/link.stories.tsx +383 -30
- package/src/components/link/link.test.tsx +677 -0
- package/src/components/link/link.tsx +163 -57
- package/src/components/link/link.types.ts +261 -0
- package/src/components/list/README.mdx +764 -0
- package/src/components/list/list.scss +285 -0
- package/src/components/list/list.stories.tsx +514 -27
- package/src/components/list/list.test.tsx +554 -0
- package/src/components/list/list.tsx +153 -51
- package/src/components/list/list.types.ts +255 -0
- package/src/components/nav/ACCESSIBILITY.md +649 -0
- package/src/components/nav/README.mdx +782 -0
- package/src/components/nav/nav.scss +32 -1
- package/src/components/nav/nav.stories.tsx +44 -6
- package/src/components/nav/nav.tsx +302 -51
- package/src/components/nav/nav.types.ts +308 -0
- package/src/components/tag/README.mdx +426 -0
- package/src/components/tag/tag.scss +101 -27
- package/src/components/tag/tag.stories.tsx +384 -10
- package/src/components/tag/tag.test.tsx +210 -0
- package/src/components/tag/tag.tsx +106 -9
- package/src/components/tag/tag.types.ts +107 -0
- package/src/components/title/MIGRATION.md +199 -0
- package/src/components/title/README.md +326 -0
- package/src/components/title/README.mdx +452 -0
- package/src/components/title/title.stories.tsx +393 -0
- package/src/components/title/title.test.tsx +251 -0
- package/src/components/title/title.tsx +219 -0
- package/src/components/ui.stories.tsx +894 -0
- package/src/components/ui.test.tsx +559 -0
- package/src/components/ui.tsx +274 -18
- package/src/components/word-count/README.md +240 -0
- package/src/hooks/use-disabled-state.test.tsx +536 -0
- package/src/hooks/use-disabled-state.ts +246 -0
- package/src/hooks/useDisabledState.md +393 -0
- package/src/hooks.ts +7 -0
- package/src/index.scss +2 -0
- package/src/index.ts +12 -3
- package/src/sass/_globals.scss +2 -7
- package/src/sass/_properties.scss +1 -0
- package/src/styles/alert/alert.css +92 -4
- package/src/styles/alert/alert.css.map +1 -1
- package/src/styles/badge/badge.css +20 -2
- package/src/styles/badge/badge.css.map +1 -1
- package/src/styles/buttons/button.css +31 -31
- package/src/styles/buttons/button.css.map +1 -1
- package/src/styles/cards/card.css +16 -0
- package/src/styles/cards/card.css.map +1 -1
- package/src/styles/details/details.css +19 -8
- package/src/styles/details/details.css.map +1 -1
- package/src/styles/dialog/dialog.css +43 -2
- package/src/styles/dialog/dialog.css.map +1 -1
- package/src/styles/images/img.css +15 -3
- package/src/styles/images/img.css.map +1 -1
- package/src/styles/index.css +691 -128
- package/src/styles/index.css.map +1 -1
- package/src/styles/link/link.css +45 -28
- package/src/styles/link/link.css.map +1 -1
- package/src/styles/list/list.css +214 -0
- package/src/styles/list/list.css.map +1 -0
- package/src/styles/nav/nav.css +21 -1
- package/src/styles/nav/nav.css.map +1 -1
- package/src/styles/tag/tag.css +113 -35
- package/src/styles/tag/tag.css.map +1 -1
- package/src/styles/utilities/_disabled.scss +58 -0
- package/src/test/setup.d.ts +9 -0
- package/src/test/setup.ts +53 -1
- package/src/types/shared.ts +43 -6
- package/src/utils/accessibility.ts +109 -0
- package/libs/chunk-5ZM4XL44.js +0 -8
- package/libs/chunk-5ZM4XL44.js.map +0 -1
- package/libs/chunk-6BVXFW7U.cjs +0 -15
- package/libs/chunk-6BVXFW7U.cjs.map +0 -1
- package/libs/chunk-6TE5QEVE.cjs.map +0 -1
- package/libs/chunk-7K76RW2A.cjs +0 -18
- package/libs/chunk-7K76RW2A.cjs.map +0 -1
- package/libs/chunk-BHRQBJRY.js +0 -8
- package/libs/chunk-BHRQBJRY.js.map +0 -1
- package/libs/chunk-BIP2NY53.js +0 -8
- package/libs/chunk-BIP2NY53.js.map +0 -1
- package/libs/chunk-BSPKFLO4.js +0 -8
- package/libs/chunk-BSPKFLO4.js.map +0 -1
- package/libs/chunk-BV5CLH44.cjs +0 -18
- package/libs/chunk-BV5CLH44.cjs.map +0 -1
- package/libs/chunk-DKGJHKGW.js +0 -9
- package/libs/chunk-DKGJHKGW.js.map +0 -1
- package/libs/chunk-DV56L5YX.cjs +0 -18
- package/libs/chunk-DV56L5YX.cjs.map +0 -1
- package/libs/chunk-ECLD37WN.cjs +0 -16
- package/libs/chunk-ECLD37WN.cjs.map +0 -1
- package/libs/chunk-EQ67LF46.js +0 -9
- package/libs/chunk-EQ67LF46.js.map +0 -1
- package/libs/chunk-HYBZBN4G.js +0 -8
- package/libs/chunk-HYBZBN4G.js.map +0 -1
- package/libs/chunk-IYUN2EW3.cjs +0 -15
- package/libs/chunk-IYUN2EW3.cjs.map +0 -1
- package/libs/chunk-KKLTUJFB.cjs.map +0 -1
- package/libs/chunk-LHVJKDMA.cjs +0 -15
- package/libs/chunk-LHVJKDMA.cjs.map +0 -1
- package/libs/chunk-LL7HTLMS.cjs +0 -15
- package/libs/chunk-LL7HTLMS.cjs.map +0 -1
- package/libs/chunk-M5QL5TAE.cjs +0 -14
- package/libs/chunk-M5QL5TAE.cjs.map +0 -1
- package/libs/chunk-NE6YXTMC.js +0 -7
- package/libs/chunk-NE6YXTMC.js.map +0 -1
- package/libs/chunk-NHYXGV3L.js +0 -8
- package/libs/chunk-NHYXGV3L.js.map +0 -1
- package/libs/chunk-O6QZBB6G.js.map +0 -1
- package/libs/chunk-P7TTEYCD.js +0 -7
- package/libs/chunk-P7TTEYCD.js.map +0 -1
- package/libs/chunk-PPOOBUOS.js +0 -8
- package/libs/chunk-PPOOBUOS.js.map +0 -1
- package/libs/chunk-QCMV4VQZ.js +0 -8
- package/libs/chunk-QCMV4VQZ.js.map +0 -1
- package/libs/chunk-QVV34QEH.cjs +0 -32
- package/libs/chunk-QVV34QEH.cjs.map +0 -1
- package/libs/chunk-S7BABR7Z.cjs +0 -13
- package/libs/chunk-S7BABR7Z.cjs.map +0 -1
- package/libs/chunk-SXVZSWX6.js +0 -11
- package/libs/chunk-SXVZSWX6.js.map +0 -1
- package/libs/chunk-X3EVB7VS.cjs +0 -15
- package/libs/chunk-X3EVB7VS.cjs.map +0 -1
- package/libs/inputs-f3a216db.d.ts +0 -45
- package/libs/ui-9a6f9f8d.d.ts +0 -24
- package/src/components/cards/README.md +0 -80
- package/src/components/dialog/hooks/useClickOutside.ts +0 -33
- /package/libs/{chunk-YWOYVRFT.js.map → chunk-7XPFW7CB.js.map} +0 -0
- /package/libs/{chunk-ICCKQ2GC.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
- /package/libs/{chunk-LIQJ7ZZR.js.map → chunk-IQ76HGVP.js.map} +0 -0
- /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
- /package/libs/{chunk-E3XP6BEX.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
- /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
|
@@ -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>
|