@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,245 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { U as UI } from './ui-d01b50d4.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the List component.
|
|
6
|
+
*
|
|
7
|
+
* Combines native HTML list element props with custom styling and accessibility features.
|
|
8
|
+
* The List component provides a flexible, type-safe way to create ordered, unordered,
|
|
9
|
+
* and definition lists with built-in accessibility support and customizable styling.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // Unordered list (default)
|
|
14
|
+
* <List>
|
|
15
|
+
* <List.ListItem>Item 1</List.ListItem>
|
|
16
|
+
* <List.ListItem>Item 2</List.ListItem>
|
|
17
|
+
* </List>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* // Ordered list with custom styling
|
|
23
|
+
* <List
|
|
24
|
+
* type="ol"
|
|
25
|
+
* variant="numbered"
|
|
26
|
+
* styles={{ '--list-marker-color': 'blue' }}
|
|
27
|
+
* >
|
|
28
|
+
* <List.ListItem>First step</List.ListItem>
|
|
29
|
+
* <List.ListItem>Second step</List.ListItem>
|
|
30
|
+
* </List>
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* // Definition list
|
|
36
|
+
* <List type="dl">
|
|
37
|
+
* <List.ListItem type="dt">Term</List.ListItem>
|
|
38
|
+
* <List.ListItem type="dd">Definition</List.ListItem>
|
|
39
|
+
* </List>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
type ListProps = {
|
|
43
|
+
/**
|
|
44
|
+
* Type of list element to render.
|
|
45
|
+
*
|
|
46
|
+
* - `'ul'` - Unordered list (default) - Use for items where order doesn't matter
|
|
47
|
+
* - `'ol'` - Ordered list - Use for sequential steps or ranked items
|
|
48
|
+
* - `'dl'` - Definition list - Use for term-definition pairs
|
|
49
|
+
*
|
|
50
|
+
* @default 'ul'
|
|
51
|
+
* @example
|
|
52
|
+
* ```tsx
|
|
53
|
+
* type="ol" // Renders an ordered list with numbers
|
|
54
|
+
* type="dl" // Renders a definition list
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
type?: "ul" | "ol" | "dl";
|
|
58
|
+
/**
|
|
59
|
+
* Variant for custom styling through CSS.
|
|
60
|
+
* Applied as `data-variant` attribute for CSS targeting.
|
|
61
|
+
*
|
|
62
|
+
* Common variants might include:
|
|
63
|
+
* - `'inline'` - Display items horizontally
|
|
64
|
+
* - `'none'` - Remove list markers
|
|
65
|
+
* - `'custom'` - Custom marker styling
|
|
66
|
+
*
|
|
67
|
+
* @optional
|
|
68
|
+
* @example
|
|
69
|
+
* ```tsx
|
|
70
|
+
* variant="inline" // Horizontal list for navigation
|
|
71
|
+
* variant="none" // Clean list without bullets
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
variant?: string;
|
|
75
|
+
/**
|
|
76
|
+
* ARIA role override.
|
|
77
|
+
*
|
|
78
|
+
* Note: Only override the default role when necessary for accessibility.
|
|
79
|
+
* Native list elements have semantic meaning that should be preserved.
|
|
80
|
+
*
|
|
81
|
+
* Use `role="list"` when CSS `list-style: none` is applied, as some screen
|
|
82
|
+
* readers remove list semantics when list styling is removed.
|
|
83
|
+
*
|
|
84
|
+
* @optional
|
|
85
|
+
* @see {@link https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html}
|
|
86
|
+
* @example
|
|
87
|
+
* ```tsx
|
|
88
|
+
* // Restore list semantics when using list-style: none
|
|
89
|
+
* <List variant="none" role="list">
|
|
90
|
+
* <List.ListItem>Navigation item</List.ListItem>
|
|
91
|
+
* </List>
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
role?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Inline CSS styles to apply to the list element.
|
|
97
|
+
* Can include CSS custom properties for theming.
|
|
98
|
+
*
|
|
99
|
+
* @optional
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* styles={{
|
|
103
|
+
* '--list-gap': '1rem',
|
|
104
|
+
* '--list-marker-color': '#0066cc'
|
|
105
|
+
* }}
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
styles?: React.CSSProperties;
|
|
109
|
+
/**
|
|
110
|
+
* CSS class names to apply to the list element.
|
|
111
|
+
*
|
|
112
|
+
* @optional
|
|
113
|
+
* @example
|
|
114
|
+
* ```tsx
|
|
115
|
+
* classes="navigation-list"
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
classes?: string;
|
|
119
|
+
/**
|
|
120
|
+
* HTML id attribute for the list element.
|
|
121
|
+
*
|
|
122
|
+
* @optional
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* id="main-navigation"
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
id?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Accessible label for screen readers.
|
|
131
|
+
*
|
|
132
|
+
* Use when the list's purpose isn't clear from context or when
|
|
133
|
+
* multiple lists exist on the page.
|
|
134
|
+
*
|
|
135
|
+
* @optional
|
|
136
|
+
* @example
|
|
137
|
+
* ```tsx
|
|
138
|
+
* aria-label="Product features"
|
|
139
|
+
* aria-labelledby="features-heading"
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
"aria-label"?: string;
|
|
143
|
+
"aria-labelledby"?: string;
|
|
144
|
+
/**
|
|
145
|
+
* Child elements (typically ListItem components).
|
|
146
|
+
*
|
|
147
|
+
* @required
|
|
148
|
+
* @example
|
|
149
|
+
* ```tsx
|
|
150
|
+
* <List>
|
|
151
|
+
* <List.ListItem>Item 1</List.ListItem>
|
|
152
|
+
* <List.ListItem>Item 2</List.ListItem>
|
|
153
|
+
* </List>
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
children: React.ReactNode;
|
|
157
|
+
} & Partial<React.ComponentProps<typeof UI>>;
|
|
158
|
+
/**
|
|
159
|
+
* Props for the ListItem component.
|
|
160
|
+
*
|
|
161
|
+
* Provides a flexible list item that can render as different HTML elements
|
|
162
|
+
* depending on the parent list type (li, dt, dd).
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```tsx
|
|
166
|
+
* // Standard list item (li) - default
|
|
167
|
+
* <ListItem>Regular item</ListItem>
|
|
168
|
+
* ```
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```tsx
|
|
172
|
+
* // Definition term (dt)
|
|
173
|
+
* <ListItem type="dt">Term to define</ListItem>
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```tsx
|
|
178
|
+
* // Definition description (dd)
|
|
179
|
+
* <ListItem type="dd">The definition</ListItem>
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
type ListItemProps = {
|
|
183
|
+
/**
|
|
184
|
+
* Type of list item element to render.
|
|
185
|
+
*
|
|
186
|
+
* - `'li'` - Standard list item (default) - For ul and ol
|
|
187
|
+
* - `'dt'` - Definition term - For dl (term being defined)
|
|
188
|
+
* - `'dd'` - Definition description - For dl (the definition itself)
|
|
189
|
+
*
|
|
190
|
+
* @default 'li'
|
|
191
|
+
* @example
|
|
192
|
+
* ```tsx
|
|
193
|
+
* // In a definition list
|
|
194
|
+
* <List type="dl">
|
|
195
|
+
* <ListItem type="dt">React</ListItem>
|
|
196
|
+
* <ListItem type="dd">A JavaScript library for building user interfaces</ListItem>
|
|
197
|
+
* </List>
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
type?: "li" | "dt" | "dd";
|
|
201
|
+
/**
|
|
202
|
+
* HTML id attribute for the list item.
|
|
203
|
+
*
|
|
204
|
+
* @optional
|
|
205
|
+
* @example
|
|
206
|
+
* ```tsx
|
|
207
|
+
* id="feature-1"
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
id?: string;
|
|
211
|
+
/**
|
|
212
|
+
* Inline CSS styles to apply to the list item.
|
|
213
|
+
*
|
|
214
|
+
* @optional
|
|
215
|
+
* @example
|
|
216
|
+
* ```tsx
|
|
217
|
+
* styles={{ paddingLeft: '1rem' }}
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
styles?: React.CSSProperties;
|
|
221
|
+
/**
|
|
222
|
+
* CSS class names to apply to the list item.
|
|
223
|
+
*
|
|
224
|
+
* @optional
|
|
225
|
+
* @example
|
|
226
|
+
* ```tsx
|
|
227
|
+
* classes="list-item-active"
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
classes?: string;
|
|
231
|
+
/**
|
|
232
|
+
* Child elements to render inside the list item.
|
|
233
|
+
*
|
|
234
|
+
* @required
|
|
235
|
+
* @example
|
|
236
|
+
* ```tsx
|
|
237
|
+
* <ListItem>
|
|
238
|
+
* <strong>Bold text</strong> and regular text
|
|
239
|
+
* </ListItem>
|
|
240
|
+
* ```
|
|
241
|
+
*/
|
|
242
|
+
children: React.ReactNode;
|
|
243
|
+
} & Partial<React.ComponentProps<typeof UI>>;
|
|
244
|
+
|
|
245
|
+
export { ListItemProps as L, ListProps as a };
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import React 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
|
+
* Excludes legacy string refs (deprecated since React 16.3).
|
|
9
|
+
*
|
|
10
|
+
* @typeParam C - The HTML element type (e.g., 'button', 'div', 'a')
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* type ButtonRef = PolymorphicRef<'button'>; // React.Ref<HTMLButtonElement>
|
|
14
|
+
* type DivRef = PolymorphicRef<'div'>; // React.Ref<HTMLDivElement>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
type PolymorphicRef<C extends React.ElementType> = React.Ref<React.ElementRef<C>>;
|
|
18
|
+
/**
|
|
19
|
+
* Defines the 'as' prop that determines which HTML element to render.
|
|
20
|
+
*
|
|
21
|
+
* This is the core prop that enables polymorphic behavior, allowing components
|
|
22
|
+
* to render as any valid React element type while maintaining type safety.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam C - The HTML element type to render
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* <UI as="button">Click me</UI>
|
|
28
|
+
* <UI as="a" href="/home">Link</UI>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
type AsProp<C extends React.ElementType> = {
|
|
32
|
+
as?: C;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Identifies props that should be omitted to prevent type conflicts.
|
|
36
|
+
*
|
|
37
|
+
* This type ensures that our custom props don't conflict with native element
|
|
38
|
+
* props by calculating which keys need to be omitted from the native props.
|
|
39
|
+
*
|
|
40
|
+
* @typeParam C - The HTML element type
|
|
41
|
+
* @typeParam P - The custom props to merge
|
|
42
|
+
*/
|
|
43
|
+
type PropsToOmit<C extends React.ElementType, P> = keyof (AsProp<C> & P);
|
|
44
|
+
/**
|
|
45
|
+
* Merges custom props with native element props while preventing conflicts.
|
|
46
|
+
*
|
|
47
|
+
* This creates a union of our custom props and the native props for the chosen
|
|
48
|
+
* element, omitting any conflicting keys to ensure type safety.
|
|
49
|
+
*
|
|
50
|
+
* @typeParam C - The HTML element type
|
|
51
|
+
* @typeParam Props - The custom props to add
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // For a button, this merges custom props with HTMLButtonElement props
|
|
55
|
+
* type ButtonProps = PolymorphicComponentProp<'button', { variant?: string }>;
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
type PolymorphicComponentProp<C extends React.ElementType, Props = {}> = React.PropsWithChildren<Props & AsProp<C>> & Omit<React.ComponentPropsWithoutRef<C>, PropsToOmit<C, Props>>;
|
|
59
|
+
/**
|
|
60
|
+
* Extends PolymorphicComponentProp to include properly-typed ref support.
|
|
61
|
+
*
|
|
62
|
+
* This is the final type in the polymorphic type chain, adding ref forwarding
|
|
63
|
+
* with the correct ref type for the chosen element. The ref is properly typed
|
|
64
|
+
* to match the element being rendered, enabling focus management and direct
|
|
65
|
+
* DOM access for accessibility features like programmatic focus control.
|
|
66
|
+
*
|
|
67
|
+
* Supports both PolymorphicRef and ForwardedRef for compatibility with
|
|
68
|
+
* React.forwardRef components.
|
|
69
|
+
*
|
|
70
|
+
* @typeParam C - The HTML element type
|
|
71
|
+
* @typeParam Props - The custom props to add
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // Using ref for focus management (important for accessibility)
|
|
76
|
+
* const buttonRef = useRef<HTMLButtonElement>(null);
|
|
77
|
+
* useEffect(() => {
|
|
78
|
+
* // Programmatically focus for keyboard navigation
|
|
79
|
+
* buttonRef.current?.focus();
|
|
80
|
+
* }, []);
|
|
81
|
+
*
|
|
82
|
+
* return <UI as="button" ref={buttonRef}>Accessible Button</UI>;
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
type PolymorphicComponentPropWithRef<C extends React.ElementType, Props = {}> = PolymorphicComponentProp<C, Props> & {
|
|
86
|
+
ref?: PolymorphicRef<C> | React.ForwardedRef<React.ElementRef<C>>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Props for the UI component, extending polymorphic props with style and class support.
|
|
90
|
+
*
|
|
91
|
+
* The UI component automatically forwards all ARIA attributes and native HTML props
|
|
92
|
+
* to the rendered element, ensuring full accessibility support. This includes:
|
|
93
|
+
* - `aria-label`, `aria-labelledby` - Accessible names for screen readers
|
|
94
|
+
* - `aria-describedby` - Additional descriptive text references
|
|
95
|
+
* - `aria-expanded`, `aria-controls` - Interactive widget states
|
|
96
|
+
* - `role` - Semantic role override when needed
|
|
97
|
+
* - All other ARIA attributes and HTML props
|
|
98
|
+
*
|
|
99
|
+
* @typeParam C - The HTML element type to render
|
|
100
|
+
* @property {boolean} [renderStyles] - Reserved for future use. Currently has no effect.
|
|
101
|
+
* Styles are always rendered regardless of this prop value.
|
|
102
|
+
* @property {React.CSSProperties} [styles] - Inline styles to apply (overrides defaultStyles)
|
|
103
|
+
* @property {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop
|
|
104
|
+
* @property {string} [classes] - CSS class names to apply to the element
|
|
105
|
+
* @property {string} [id] - HTML id attribute
|
|
106
|
+
* @property {React.ReactNode} [children] - Child elements to render
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // All ARIA attributes are automatically forwarded
|
|
111
|
+
* <UI as="button" aria-label="Close dialog" aria-expanded={isOpen}>
|
|
112
|
+
* <CloseIcon />
|
|
113
|
+
* </UI>
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
type UIProps<C extends React.ElementType> = PolymorphicComponentPropWithRef<C, {
|
|
117
|
+
/** @deprecated Reserved for future use. Currently has no effect. Styles are always rendered. */
|
|
118
|
+
renderStyles?: boolean;
|
|
119
|
+
styles?: React.CSSProperties;
|
|
120
|
+
defaultStyles?: React.CSSProperties;
|
|
121
|
+
classes?: string;
|
|
122
|
+
id?: string;
|
|
123
|
+
children?: React.ReactNode;
|
|
124
|
+
}>;
|
|
125
|
+
/**
|
|
126
|
+
* UI Component function signature.
|
|
127
|
+
*
|
|
128
|
+
* Defines the polymorphic component that can render as any HTML element while
|
|
129
|
+
* maintaining full TypeScript type safety for element-specific props.
|
|
130
|
+
*
|
|
131
|
+
* @typeParam C - The HTML element type to render (defaults to 'div')
|
|
132
|
+
* @param {UIProps<C>} props - Component props including 'as', styles, and native element props
|
|
133
|
+
* @returns {React.ReactElement} A React element of the specified type
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* <UI as="button" onClick={handler}>Button</UI>
|
|
137
|
+
* <UI as="a" href="/link">Link</UI>
|
|
138
|
+
* <UI>Default div</UI>
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
type UIComponent = (<C extends React.ElementType = "div">(props: UIProps<C>) => React.ReactElement | any) & {
|
|
142
|
+
displayName?: string;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* UI - A polymorphic React component that can render as any HTML element.
|
|
146
|
+
*
|
|
147
|
+
* The UI component is a foundational primitive used throughout fpkit to create
|
|
148
|
+
* flexible, type-safe components. It implements the polymorphic component pattern,
|
|
149
|
+
* allowing a single component to render as different HTML elements while maintaining
|
|
150
|
+
* full TypeScript type safety for element-specific props.
|
|
151
|
+
*
|
|
152
|
+
* ## Accessibility Considerations
|
|
153
|
+
*
|
|
154
|
+
* The UI component forwards all ARIA attributes and native HTML props, placing
|
|
155
|
+
* accessibility responsibility on the consumer. When creating interactive elements,
|
|
156
|
+
* you MUST ensure WCAG 2.1 AA compliance:
|
|
157
|
+
*
|
|
158
|
+
* - **Accessible Names**: All interactive elements need an accessible name via
|
|
159
|
+
* `aria-label`, `aria-labelledby`, or visible text content
|
|
160
|
+
* - **Semantic HTML**: Prefer semantic elements (`button`, `a`, `nav`) over
|
|
161
|
+
* generic containers (`div`, `span`) with ARIA roles when possible
|
|
162
|
+
* - **Focus Indicators**: Ensure focus indicators meet WCAG 2.4.7 (3:1 contrast)
|
|
163
|
+
* - **Keyboard Support**: Interactive elements must be keyboard accessible
|
|
164
|
+
*
|
|
165
|
+
* @typeParam C - The HTML element type to render (e.g., 'button', 'div', 'a')
|
|
166
|
+
*
|
|
167
|
+
* @param {C} [as='div'] - The HTML element type to render. Defaults to 'div'.
|
|
168
|
+
* @param {React.CSSProperties} [styles] - Inline styles to apply. Overrides defaultStyles.
|
|
169
|
+
* @param {string} [classes] - CSS class names to apply to the element.
|
|
170
|
+
* @param {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop.
|
|
171
|
+
* @param {React.ReactNode} [children] - Child elements to render inside the component.
|
|
172
|
+
* @param {PolymorphicRef<C>} [ref] - Forwarded ref with proper typing for the element type.
|
|
173
|
+
* @param {boolean} [renderStyles] - Reserved for future use. Currently has no effect.
|
|
174
|
+
*
|
|
175
|
+
* @returns {React.ReactElement} A React element of the specified type with merged props.
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* // Basic usage - renders as div
|
|
179
|
+
* <UI>Hello World</UI>
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* // Polymorphic rendering - renders as button with type-safe props
|
|
183
|
+
* <UI as="button" onClick={handleClick} disabled>
|
|
184
|
+
* Click me
|
|
185
|
+
* </UI>
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* // ✅ GOOD: Accessible button with aria-label for icon-only button
|
|
189
|
+
* <UI as="button" aria-label="Close dialog" onClick={handleClose}>
|
|
190
|
+
* <CloseIcon />
|
|
191
|
+
* </UI>
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* // ✅ GOOD: Accessible link with descriptive text
|
|
195
|
+
* <UI as="a" href="/products">
|
|
196
|
+
* View all products
|
|
197
|
+
* </UI>
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* // ✅ GOOD: Interactive element with proper role and keyboard support
|
|
201
|
+
* <UI
|
|
202
|
+
* as="div"
|
|
203
|
+
* role="button"
|
|
204
|
+
* tabIndex={0}
|
|
205
|
+
* aria-label="Toggle menu"
|
|
206
|
+
* onClick={handleToggle}
|
|
207
|
+
* onKeyDown={(e) => e.key === 'Enter' && handleToggle()}
|
|
208
|
+
* >
|
|
209
|
+
* Menu
|
|
210
|
+
* </UI>
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* // ❌ BAD: Button without accessible name (screen readers can't identify it)
|
|
214
|
+
* <UI as="button" onClick={handleClose}>
|
|
215
|
+
* <CloseIcon />
|
|
216
|
+
* </UI>
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* // ❌ BAD: Non-semantic div with click handler (not keyboard accessible)
|
|
220
|
+
* <UI as="div" onClick={handleClick}>
|
|
221
|
+
* Click me
|
|
222
|
+
* </UI>
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* // ✅ GOOD: Custom focus indicator with WCAG 2.4.7 compliant contrast
|
|
226
|
+
* <UI
|
|
227
|
+
* as="button"
|
|
228
|
+
* styles={{
|
|
229
|
+
* outline: '2px solid transparent',
|
|
230
|
+
* outlineOffset: '2px',
|
|
231
|
+
* }}
|
|
232
|
+
* classes="focus:outline-blue-500"
|
|
233
|
+
* >
|
|
234
|
+
* Accessible Button
|
|
235
|
+
* </UI>
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* // Style merging - defaultStyles provide base, styles override
|
|
239
|
+
* <UI
|
|
240
|
+
* as="span"
|
|
241
|
+
* defaultStyles={{ padding: '0.5rem', color: 'blue' }}
|
|
242
|
+
* styles={{ color: 'red' }}
|
|
243
|
+
* >
|
|
244
|
+
* Red text with padding
|
|
245
|
+
* </UI>
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* // Ref forwarding for focus management
|
|
249
|
+
* const buttonRef = useRef<HTMLButtonElement>(null);
|
|
250
|
+
* useEffect(() => {
|
|
251
|
+
* // Programmatically focus for keyboard navigation
|
|
252
|
+
* buttonRef.current?.focus();
|
|
253
|
+
* }, []);
|
|
254
|
+
* <UI as="button" ref={buttonRef}>Auto-focused Button</UI>
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* // Building accessible higher-level components with TypeScript
|
|
258
|
+
* interface AccessibleButtonProps extends React.ComponentPropsWithoutRef<'button'> {
|
|
259
|
+
* variant?: 'primary' | 'secondary';
|
|
260
|
+
* // Require either aria-label or children for accessibility
|
|
261
|
+
* 'aria-label'?: string;
|
|
262
|
+
* children?: React.ReactNode;
|
|
263
|
+
* }
|
|
264
|
+
*
|
|
265
|
+
* const AccessibleButton = React.forwardRef<HTMLButtonElement, AccessibleButtonProps>(
|
|
266
|
+
* ({ variant = 'primary', ...props }, ref) => {
|
|
267
|
+
* // Runtime check: ensure accessible name is provided
|
|
268
|
+
* if (!props['aria-label'] && !props.children) {
|
|
269
|
+
* console.warn('AccessibleButton requires either aria-label or children');
|
|
270
|
+
* }
|
|
271
|
+
*
|
|
272
|
+
* return (
|
|
273
|
+
* <UI
|
|
274
|
+
* as="button"
|
|
275
|
+
* ref={ref}
|
|
276
|
+
* defaultStyles={{
|
|
277
|
+
* padding: '0.5rem 1rem',
|
|
278
|
+
* borderRadius: '0.25rem',
|
|
279
|
+
* backgroundColor: variant === 'primary' ? '#007bff' : '#6c757d',
|
|
280
|
+
* }}
|
|
281
|
+
* {...props}
|
|
282
|
+
* />
|
|
283
|
+
* );
|
|
284
|
+
* }
|
|
285
|
+
* );
|
|
286
|
+
*/
|
|
287
|
+
declare const UI: UIComponent;
|
|
288
|
+
|
|
289
|
+
export { UI as U };
|
package/package.json
CHANGED
|
@@ -2,16 +2,15 @@
|
|
|
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
|
+
"version": "0.6.0",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
7
|
+
"node": ">=22.12.0",
|
|
8
8
|
"npm": ">=8.0.0"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"start": "run-p package:watch sass:watch",
|
|
12
12
|
"dev": "vite --open",
|
|
13
13
|
"build": "run-s package sass build:sass build:css",
|
|
14
|
-
"build:components": "tsup --config tsup.components.config.cjs",
|
|
15
14
|
"package": "tsc && tsup --dts",
|
|
16
15
|
"package:watch": "tsc && tsup --watch --dts",
|
|
17
16
|
"build::css": "postcss ./libs/components/**/*.css --base libs/components/ --use autoprefixer -d ./libs/components/ --ext min.css",
|
|
@@ -25,7 +24,6 @@
|
|
|
25
24
|
"test:coverage": "vitest --coverage",
|
|
26
25
|
"test:ui:coverage": "vitest --coverage --ui",
|
|
27
26
|
"test:snapshot": "vitest --run --update",
|
|
28
|
-
"release": "npm publish",
|
|
29
27
|
"lint": "eslint . --ext .jsx,.tsx",
|
|
30
28
|
"lint-fix": "eslint . --ext .jsx,.tsx"
|
|
31
29
|
},
|
|
@@ -82,86 +80,6 @@
|
|
|
82
80
|
"require": "./libs/index.cjs",
|
|
83
81
|
"default": "./libs/index.js"
|
|
84
82
|
},
|
|
85
|
-
"./button": {
|
|
86
|
-
"import": "./libs/components/button.js",
|
|
87
|
-
"require": "./libs/components/button.cjs",
|
|
88
|
-
"default": "./libs/components/button.js"
|
|
89
|
-
},
|
|
90
|
-
"./card": {
|
|
91
|
-
"import": "./libs/components/card.js",
|
|
92
|
-
"require": "./libs/components/card.cjs",
|
|
93
|
-
"default": "./libs/components/card.js"
|
|
94
|
-
},
|
|
95
|
-
"./modal": {
|
|
96
|
-
"import": "./libs/components/modal.js",
|
|
97
|
-
"require": "./libs/components/modal.cjs",
|
|
98
|
-
"default": "./libs/components/modal.js"
|
|
99
|
-
},
|
|
100
|
-
"./input": {
|
|
101
|
-
"import": "./libs/components/input.js",
|
|
102
|
-
"require": "./libs/components/input.cjs",
|
|
103
|
-
"default": "./libs/components/input.js"
|
|
104
|
-
},
|
|
105
|
-
"./link": {
|
|
106
|
-
"import": "./libs/components/link.js",
|
|
107
|
-
"require": "./libs/components/link.cjs",
|
|
108
|
-
"default": "./libs/components/link.js"
|
|
109
|
-
},
|
|
110
|
-
"./list": {
|
|
111
|
-
"import": "./libs/components/list.js",
|
|
112
|
-
"require": "./libs/components/list.cjs",
|
|
113
|
-
"default": "./libs/components/list.js"
|
|
114
|
-
},
|
|
115
|
-
"./icon": {
|
|
116
|
-
"import": "./libs/components/icon.js",
|
|
117
|
-
"require": "./libs/components/icon.cjs",
|
|
118
|
-
"default": "./libs/components/icon.js"
|
|
119
|
-
},
|
|
120
|
-
"./table": {
|
|
121
|
-
"import": "./libs/components/table.js",
|
|
122
|
-
"require": "./libs/components/table.cjs",
|
|
123
|
-
"default": "./libs/components/table.js"
|
|
124
|
-
},
|
|
125
|
-
"./dialog": {
|
|
126
|
-
"import": "./libs/components/dialog.js",
|
|
127
|
-
"require": "./libs/components/dialog.cjs",
|
|
128
|
-
"default": "./libs/components/dialog.js"
|
|
129
|
-
},
|
|
130
|
-
"./nav": {
|
|
131
|
-
"import": "./libs/components/nav.js",
|
|
132
|
-
"require": "./libs/components/nav.cjs",
|
|
133
|
-
"default": "./libs/components/nav.js"
|
|
134
|
-
},
|
|
135
|
-
"./popover": {
|
|
136
|
-
"import": "./libs/components/popover.js",
|
|
137
|
-
"require": "./libs/components/popover.cjs",
|
|
138
|
-
"default": "./libs/components/popover.js"
|
|
139
|
-
},
|
|
140
|
-
"./text": {
|
|
141
|
-
"import": "./libs/components/text.js",
|
|
142
|
-
"require": "./libs/components/text.cjs",
|
|
143
|
-
"default": "./libs/components/text.js"
|
|
144
|
-
},
|
|
145
|
-
"./heading": {
|
|
146
|
-
"import": "./libs/components/heading.js",
|
|
147
|
-
"require": "./libs/components/heading.cjs",
|
|
148
|
-
"default": "./libs/components/heading.js"
|
|
149
|
-
},
|
|
150
|
-
"./breadcrumb": {
|
|
151
|
-
"import": "./libs/components/breadcrumb.js",
|
|
152
|
-
"require": "./libs/components/breadcrumb.cjs",
|
|
153
|
-
"default": "./libs/components/breadcrumb.js"
|
|
154
|
-
},
|
|
155
|
-
"./textarea": {
|
|
156
|
-
"import": "./libs/components/textarea.js",
|
|
157
|
-
"require": "./libs/components/textarea.cjs",
|
|
158
|
-
"default": "./libs/components/textarea.js"
|
|
159
|
-
},
|
|
160
|
-
"./field": {
|
|
161
|
-
"import": "./libs/components/field.js",
|
|
162
|
-
"require": "./libs/components/field.cjs",
|
|
163
|
-
"default": "./libs/components/field.js"
|
|
164
|
-
},
|
|
165
83
|
"./hooks": {
|
|
166
84
|
"import": "./libs/hooks.js",
|
|
167
85
|
"require": "./libs/hooks.cjs",
|
|
@@ -175,7 +93,7 @@
|
|
|
175
93
|
"./package.json": "./package.json",
|
|
176
94
|
"./styles": {
|
|
177
95
|
"import": "./libs/index.css",
|
|
178
|
-
"require": "./libs/index.
|
|
96
|
+
"require": "./libs/index.css",
|
|
179
97
|
"default": "./libs/index.css"
|
|
180
98
|
},
|
|
181
99
|
"./css": "./libs/components",
|
|
@@ -183,7 +101,6 @@
|
|
|
183
101
|
},
|
|
184
102
|
"files": [
|
|
185
103
|
"src",
|
|
186
|
-
"dist",
|
|
187
104
|
"libs",
|
|
188
105
|
"libs/index.css"
|
|
189
106
|
],
|
|
@@ -208,5 +125,5 @@
|
|
|
208
125
|
"publishConfig": {
|
|
209
126
|
"access": "public"
|
|
210
127
|
},
|
|
211
|
-
"gitHead": "
|
|
128
|
+
"gitHead": "9c4bba23e1f85ae1ec81a63ec9488a5e36ff5c5b"
|
|
212
129
|
}
|