@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
|
@@ -1,47 +1,48 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import UI from '#components/ui'
|
|
3
|
+
import type {
|
|
4
|
+
CardProps,
|
|
5
|
+
CardTitleProps,
|
|
6
|
+
CardContentProps,
|
|
7
|
+
CardFooterProps,
|
|
8
|
+
} from './card.types'
|
|
9
|
+
import { cn, CARD_CLASSES, handleCardKeyDown, warnInteractiveUsage } from './card.utils'
|
|
3
10
|
|
|
4
|
-
|
|
5
|
-
*
|
|
11
|
+
/**
|
|
12
|
+
* Card.Title - Title sub-component for Card
|
|
6
13
|
*
|
|
7
|
-
*
|
|
14
|
+
* Renders a heading element for the card title. Defaults to h3 for proper
|
|
15
|
+
* document outline, but can be customized via the `as` prop.
|
|
8
16
|
*
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
elm?: 'div' | 'aside' | 'section' | 'article'
|
|
13
|
-
title?: React.ReactNode
|
|
14
|
-
footer?: React.ReactNode
|
|
15
|
-
} & React.ComponentProps<typeof UI>
|
|
16
|
-
|
|
17
|
-
/*
|
|
18
|
-
* Title component
|
|
17
|
+
* ## Accessibility
|
|
18
|
+
* - Use appropriate heading level based on document structure
|
|
19
|
+
* - Combine with `aria-labelledby` on parent Card for accessible names
|
|
19
20
|
*
|
|
20
|
-
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <Card aria-labelledby="card-title-1">
|
|
24
|
+
* <Card.Title id="card-title-1">Featured Product</Card.Title>
|
|
25
|
+
* </Card>
|
|
26
|
+
* ```
|
|
21
27
|
*
|
|
22
|
-
* @
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @returns {ReactElement} Title component
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* // Custom heading level
|
|
31
|
+
* <Card.Title as="h2">Section Title</Card.Title>
|
|
32
|
+
* ```
|
|
28
33
|
*/
|
|
29
34
|
export const Title = ({
|
|
30
35
|
children,
|
|
31
36
|
className,
|
|
32
|
-
|
|
37
|
+
style,
|
|
33
38
|
as = 'h3',
|
|
34
39
|
...props
|
|
35
|
-
}:
|
|
36
|
-
className?: string
|
|
37
|
-
styles?: React.CSSProperties
|
|
38
|
-
as?: React.ElementType
|
|
39
|
-
}>) => {
|
|
40
|
+
}: CardTitleProps) => {
|
|
40
41
|
return (
|
|
41
42
|
<UI
|
|
42
43
|
as={as}
|
|
43
|
-
className={
|
|
44
|
-
styles={
|
|
44
|
+
className={cn(CARD_CLASSES.TITLE, className)}
|
|
45
|
+
styles={style}
|
|
45
46
|
{...props}
|
|
46
47
|
>
|
|
47
48
|
{children}
|
|
@@ -49,34 +50,49 @@ export const Title = ({
|
|
|
49
50
|
)
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
Title.displayName = 'Title'
|
|
53
|
+
Title.displayName = 'Card.Title'
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
*
|
|
55
|
+
/**
|
|
56
|
+
* Card.Content - Content sub-component for Card
|
|
57
|
+
*
|
|
58
|
+
* Renders the main content area of the card. Defaults to `<article>` for
|
|
59
|
+
* standalone content, but can be changed to `div` or `section` via the `as` prop.
|
|
56
60
|
*
|
|
57
|
-
*
|
|
61
|
+
* ## Semantic HTML Guidelines
|
|
62
|
+
* - Use `article` (default) for self-contained, syndicate-able content
|
|
63
|
+
* - Use `div` for generic content containers
|
|
64
|
+
* - Use `section` for thematic groupings with a heading
|
|
58
65
|
*
|
|
59
|
-
* @
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <Card>
|
|
69
|
+
* <Card.Title>Article Title</Card.Title>
|
|
70
|
+
* <Card.Content>
|
|
71
|
+
* <p>This is standalone content...</p>
|
|
72
|
+
* </Card.Content>
|
|
73
|
+
* </Card>
|
|
74
|
+
* ```
|
|
63
75
|
*
|
|
64
|
-
* @
|
|
76
|
+
* @example
|
|
77
|
+
* ```tsx
|
|
78
|
+
* // Generic container (not standalone content)
|
|
79
|
+
* <Card.Content as="div">
|
|
80
|
+
* <p>Generic content...</p>
|
|
81
|
+
* </Card.Content>
|
|
82
|
+
* ```
|
|
65
83
|
*/
|
|
66
84
|
export const Content = ({
|
|
67
85
|
children,
|
|
68
86
|
className,
|
|
69
|
-
|
|
87
|
+
style,
|
|
88
|
+
as = 'article',
|
|
70
89
|
...props
|
|
71
|
-
}:
|
|
72
|
-
className?: string
|
|
73
|
-
styles?: React.CSSProperties
|
|
74
|
-
}>) => {
|
|
90
|
+
}: CardContentProps) => {
|
|
75
91
|
return (
|
|
76
92
|
<UI
|
|
77
|
-
as=
|
|
78
|
-
className={
|
|
79
|
-
styles={
|
|
93
|
+
as={as}
|
|
94
|
+
className={cn(CARD_CLASSES.CONTENT, className)}
|
|
95
|
+
styles={style}
|
|
80
96
|
{...props}
|
|
81
97
|
>
|
|
82
98
|
{children}
|
|
@@ -84,34 +100,46 @@ export const Content = ({
|
|
|
84
100
|
)
|
|
85
101
|
}
|
|
86
102
|
|
|
87
|
-
Content.displayName = 'Content'
|
|
103
|
+
Content.displayName = 'Card.Content'
|
|
88
104
|
|
|
89
|
-
|
|
90
|
-
* Footer component
|
|
105
|
+
/**
|
|
106
|
+
* Card.Footer - Footer sub-component for Card
|
|
91
107
|
*
|
|
92
|
-
* Renders a footer section for the
|
|
108
|
+
* Renders a footer section for the card. Use for actions, metadata, or
|
|
109
|
+
* supplementary information.
|
|
93
110
|
*
|
|
94
|
-
* @
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```tsx
|
|
113
|
+
* <Card>
|
|
114
|
+
* <Card.Title>Product</Card.Title>
|
|
115
|
+
* <Card.Content>Description...</Card.Content>
|
|
116
|
+
* <Card.Footer>
|
|
117
|
+
* <button>Add to Cart</button>
|
|
118
|
+
* <span>$29.99</span>
|
|
119
|
+
* </Card.Footer>
|
|
120
|
+
* </Card>
|
|
121
|
+
* ```
|
|
98
122
|
*
|
|
99
|
-
* @
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* // Semantic footer element
|
|
126
|
+
* <Card.Footer as="footer">
|
|
127
|
+
* <p>Last updated: 2024-01-15</p>
|
|
128
|
+
* </Card.Footer>
|
|
129
|
+
* ```
|
|
100
130
|
*/
|
|
101
131
|
export const Footer = ({
|
|
102
132
|
children,
|
|
103
133
|
className,
|
|
104
|
-
|
|
134
|
+
style,
|
|
135
|
+
as = 'div',
|
|
105
136
|
...props
|
|
106
|
-
}:
|
|
107
|
-
className?: string
|
|
108
|
-
styles?: React.CSSProperties
|
|
109
|
-
}>) => {
|
|
137
|
+
}: CardFooterProps) => {
|
|
110
138
|
return (
|
|
111
139
|
<UI
|
|
112
|
-
as=
|
|
113
|
-
className={
|
|
114
|
-
styles={
|
|
140
|
+
as={as}
|
|
141
|
+
className={cn(CARD_CLASSES.FOOTER, className)}
|
|
142
|
+
styles={style}
|
|
115
143
|
{...props}
|
|
116
144
|
>
|
|
117
145
|
{children}
|
|
@@ -119,37 +147,127 @@ export const Footer = ({
|
|
|
119
147
|
)
|
|
120
148
|
}
|
|
121
149
|
|
|
122
|
-
Footer.displayName = 'Footer'
|
|
150
|
+
Footer.displayName = 'Card.Footer'
|
|
123
151
|
|
|
124
|
-
|
|
125
|
-
* Card component
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
152
|
+
/**
|
|
153
|
+
* Card - A flexible, accessible card component with compound component pattern
|
|
154
|
+
*
|
|
155
|
+
* The Card component provides a container for grouping related content and actions.
|
|
156
|
+
* It follows the compound component pattern, exposing `Card.Title`, `Card.Content`,
|
|
157
|
+
* and `Card.Footer` sub-components for structured layouts.
|
|
158
|
+
*
|
|
159
|
+
* ## Features
|
|
160
|
+
* - **Polymorphic rendering**: Render as any HTML element via `as` prop
|
|
161
|
+
* - **Compound components**: Structured sub-components for consistent layouts
|
|
162
|
+
* - **Interactive variant**: Built-in keyboard navigation and ARIA support
|
|
163
|
+
* - **Fully accessible**: WCAG 2.1 AA compliant with proper semantic HTML
|
|
164
|
+
*
|
|
165
|
+
* ## Accessibility
|
|
166
|
+
*
|
|
167
|
+
* ### Non-Interactive Cards
|
|
168
|
+
* - Use semantic HTML: `article` for standalone content, `section` for groupings
|
|
169
|
+
* - Provide accessible names with `aria-labelledby` referencing the title
|
|
170
|
+
*
|
|
171
|
+
* ### Interactive Cards (Clickable)
|
|
172
|
+
* - Set `interactive={true}` to enable keyboard navigation (Enter/Space)
|
|
173
|
+
* - Provide accessible name via `aria-label` or `aria-labelledby`
|
|
174
|
+
* - Ensure adequate focus indicators (handled by CSS)
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* // Basic card with compound components
|
|
178
|
+
* ```tsx
|
|
179
|
+
* <Card>
|
|
180
|
+
* <Card.Title>Product Name</Card.Title>
|
|
181
|
+
* <Card.Content>
|
|
182
|
+
* <p>Product description goes here...</p>
|
|
183
|
+
* </Card.Content>
|
|
184
|
+
* <Card.Footer>
|
|
185
|
+
* <button>Buy Now</button>
|
|
186
|
+
* </Card.Footer>
|
|
187
|
+
* </Card>
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* // Accessible interactive card
|
|
192
|
+
* ```tsx
|
|
193
|
+
* <Card
|
|
194
|
+
* interactive
|
|
195
|
+
* aria-label="View product details"
|
|
196
|
+
* onClick={() => navigate('/product/123')}
|
|
197
|
+
* >
|
|
198
|
+
* <Card.Title>Product Name</Card.Title>
|
|
199
|
+
* <Card.Content>Click anywhere to view details</Card.Content>
|
|
200
|
+
* </Card>
|
|
201
|
+
* ```
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* // Semantic article card with accessible name
|
|
205
|
+
* ```tsx
|
|
206
|
+
* <Card as="article" aria-labelledby="article-title">
|
|
207
|
+
* <Card.Title id="article-title">Article Headline</Card.Title>
|
|
208
|
+
* <Card.Content>Article body...</Card.Content>
|
|
209
|
+
* </Card>
|
|
210
|
+
* ```
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* // Card as a landmark region
|
|
214
|
+
* ```tsx
|
|
215
|
+
* <Card role="region" aria-label="Featured products">
|
|
216
|
+
* <Card.Title>Featured</Card.Title>
|
|
217
|
+
* <Card.Content>...</Card.Content>
|
|
218
|
+
* </Card>
|
|
219
|
+
* ```
|
|
137
220
|
*/
|
|
138
221
|
export const Card = ({
|
|
139
|
-
|
|
222
|
+
as = 'div',
|
|
140
223
|
styles,
|
|
141
224
|
children,
|
|
142
225
|
classes = 'shadow',
|
|
143
226
|
id,
|
|
227
|
+
interactive = false,
|
|
228
|
+
onClick,
|
|
229
|
+
tabIndex,
|
|
230
|
+
role,
|
|
231
|
+
'aria-label': ariaLabel,
|
|
232
|
+
'aria-labelledby': ariaLabelledBy,
|
|
233
|
+
'aria-describedby': ariaDescribedBy,
|
|
144
234
|
...props
|
|
145
235
|
}: CardProps) => {
|
|
236
|
+
// Development warnings for common accessibility issues
|
|
237
|
+
React.useEffect(() => {
|
|
238
|
+
warnInteractiveUsage(!!onClick, interactive)
|
|
239
|
+
}, [onClick, interactive])
|
|
240
|
+
|
|
241
|
+
// Interactive card handling
|
|
242
|
+
const handleKeyDown = (event: React.KeyboardEvent) => {
|
|
243
|
+
if (interactive || onClick) {
|
|
244
|
+
handleCardKeyDown(event, onClick)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const interactiveProps = interactive
|
|
249
|
+
? {
|
|
250
|
+
role: role || 'button',
|
|
251
|
+
tabIndex: tabIndex ?? 0,
|
|
252
|
+
onClick,
|
|
253
|
+
onKeyDown: handleKeyDown,
|
|
254
|
+
}
|
|
255
|
+
: {
|
|
256
|
+
role,
|
|
257
|
+
onClick,
|
|
258
|
+
}
|
|
259
|
+
|
|
146
260
|
return (
|
|
147
261
|
<UI
|
|
148
|
-
as={
|
|
262
|
+
as={as}
|
|
149
263
|
id={id}
|
|
150
264
|
styles={styles}
|
|
151
265
|
className={classes}
|
|
152
|
-
|
|
266
|
+
aria-label={ariaLabel}
|
|
267
|
+
aria-labelledby={ariaLabelledBy}
|
|
268
|
+
aria-describedby={ariaDescribedBy}
|
|
269
|
+
data-card={interactive ? 'interactive' : true}
|
|
270
|
+
{...interactiveProps}
|
|
153
271
|
{...props}
|
|
154
272
|
>
|
|
155
273
|
{children}
|
|
@@ -162,3 +280,6 @@ Card.displayName = 'Card'
|
|
|
162
280
|
Card.Title = Title
|
|
163
281
|
Card.Content = Content
|
|
164
282
|
Card.Footer = Footer
|
|
283
|
+
|
|
284
|
+
// Export types for external consumption
|
|
285
|
+
export type { CardProps, CardTitleProps, CardContentProps, CardFooterProps } from './card.types'
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import type UI from '../ui'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Base props shared across all Card sub-components.
|
|
6
|
+
*
|
|
7
|
+
* This interface provides common styling and structural props
|
|
8
|
+
* that all Card sub-components support.
|
|
9
|
+
*/
|
|
10
|
+
export interface CardSubComponentProps {
|
|
11
|
+
/** CSS class names to apply */
|
|
12
|
+
className?: string
|
|
13
|
+
/** Inline styles to apply */
|
|
14
|
+
style?: React.CSSProperties
|
|
15
|
+
/** Child elements to render */
|
|
16
|
+
children?: React.ReactNode
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Props for the Card.Title sub-component.
|
|
21
|
+
*
|
|
22
|
+
* @extends CardSubComponentProps
|
|
23
|
+
*/
|
|
24
|
+
export interface CardTitleProps extends CardSubComponentProps {
|
|
25
|
+
/**
|
|
26
|
+
* HTML element to render as.
|
|
27
|
+
* @default 'h3'
|
|
28
|
+
*/
|
|
29
|
+
as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
|
|
30
|
+
/**
|
|
31
|
+
* HTML id attribute for the title.
|
|
32
|
+
* Useful for aria-labelledby references.
|
|
33
|
+
*/
|
|
34
|
+
id?: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Props for the Card.Content sub-component.
|
|
39
|
+
*
|
|
40
|
+
* @extends CardSubComponentProps
|
|
41
|
+
*/
|
|
42
|
+
export interface CardContentProps extends CardSubComponentProps {
|
|
43
|
+
/**
|
|
44
|
+
* HTML element to render as.
|
|
45
|
+
* Use 'article' for standalone content, 'div' for generic containers.
|
|
46
|
+
* @default 'article'
|
|
47
|
+
*/
|
|
48
|
+
as?: 'article' | 'div' | 'section'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Props for the Card.Footer sub-component.
|
|
53
|
+
*
|
|
54
|
+
* @extends CardSubComponentProps
|
|
55
|
+
*/
|
|
56
|
+
export interface CardFooterProps extends CardSubComponentProps {
|
|
57
|
+
/**
|
|
58
|
+
* HTML element to render as.
|
|
59
|
+
* @default 'div'
|
|
60
|
+
*/
|
|
61
|
+
as?: 'div' | 'footer'
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Props for the main Card component.
|
|
66
|
+
*
|
|
67
|
+
* Extends all props from the UI component while adding Card-specific functionality.
|
|
68
|
+
* Supports polymorphic rendering via the `as` prop.
|
|
69
|
+
*
|
|
70
|
+
* @extends React.ComponentProps<typeof UI>
|
|
71
|
+
*/
|
|
72
|
+
export interface CardProps extends React.ComponentProps<typeof UI> {
|
|
73
|
+
/**
|
|
74
|
+
* HTML element to render the Card as.
|
|
75
|
+
* Inherits from UI component's polymorphic `as` prop.
|
|
76
|
+
* @default 'div'
|
|
77
|
+
*/
|
|
78
|
+
as?: React.ElementType
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* ARIA role for the card.
|
|
82
|
+
* Use 'article' for standalone content, 'region' with aria-label for landmarks.
|
|
83
|
+
* @example
|
|
84
|
+
* ```tsx
|
|
85
|
+
* <Card role="article">...</Card>
|
|
86
|
+
* <Card role="region" aria-label="User profile">...</Card>
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
role?: string
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Accessible label for the card.
|
|
93
|
+
* Required when using interactive cards or role="region".
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* <Card role="region" aria-label="Featured products">...</Card>
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
'aria-label'?: string
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* ID of element that labels this card.
|
|
103
|
+
* @example
|
|
104
|
+
* ```tsx
|
|
105
|
+
* <Card aria-labelledby="card-title-1">
|
|
106
|
+
* <Card.Title id="card-title-1">Title</Card.Title>
|
|
107
|
+
* </Card>
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
'aria-labelledby'?: string
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* ID of element that describes this card.
|
|
114
|
+
*/
|
|
115
|
+
'aria-describedby'?: string
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Makes the card interactive with keyboard support.
|
|
119
|
+
* Adds tabIndex, role="button", and keyboard event handlers.
|
|
120
|
+
* @default false
|
|
121
|
+
*/
|
|
122
|
+
interactive?: boolean
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Click handler for interactive cards.
|
|
126
|
+
* When provided without `interactive`, a warning will be logged in development.
|
|
127
|
+
*/
|
|
128
|
+
onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Tab index for keyboard navigation.
|
|
132
|
+
* Automatically set to 0 when `interactive` is true.
|
|
133
|
+
*/
|
|
134
|
+
tabIndex?: number
|
|
135
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for the Card component.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Combines multiple className strings into a single string, filtering out falsy values.
|
|
7
|
+
*
|
|
8
|
+
* This utility provides a cleaner alternative to template literals for className composition,
|
|
9
|
+
* avoiding unnecessary string allocation on every render.
|
|
10
|
+
*
|
|
11
|
+
* @param classes - Array of class names (can include undefined/null/empty strings)
|
|
12
|
+
* @returns Combined className string
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* cn('card-title', className) // "card-title custom-class"
|
|
17
|
+
* cn('card-title', undefined) // "card-title"
|
|
18
|
+
* cn('card-title', '', 'extra') // "card-title extra"
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function cn(...classes: (string | undefined | null | false)[]): string {
|
|
22
|
+
return classes.filter(Boolean).join(' ')
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* CSS class name constants for Card components.
|
|
27
|
+
* Centralizing these prevents typos and enables easier refactoring.
|
|
28
|
+
*/
|
|
29
|
+
export const CARD_CLASSES = {
|
|
30
|
+
CARD: 'card',
|
|
31
|
+
TITLE: 'card-title',
|
|
32
|
+
CONTENT: 'card-content',
|
|
33
|
+
FOOTER: 'card-footer',
|
|
34
|
+
} as const
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Handles keyboard events for interactive cards.
|
|
38
|
+
* Triggers click handler on Enter or Space key press.
|
|
39
|
+
*
|
|
40
|
+
* @param event - Keyboard event
|
|
41
|
+
* @param onClick - Click handler to invoke
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* <div onKeyDown={(e) => handleCardKeyDown(e, handleClick)}>
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function handleCardKeyDown(
|
|
49
|
+
event: React.KeyboardEvent,
|
|
50
|
+
onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void
|
|
51
|
+
): void {
|
|
52
|
+
if (!onClick) return
|
|
53
|
+
|
|
54
|
+
// Activate on Enter or Space (standard keyboard interaction pattern)
|
|
55
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
56
|
+
event.preventDefault() // Prevent page scroll on Space
|
|
57
|
+
onClick(event)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Development warning for interactive card usage.
|
|
63
|
+
* Warns when onClick is provided without the interactive prop.
|
|
64
|
+
*
|
|
65
|
+
* This function is intentionally empty to comply with no-console linting rules.
|
|
66
|
+
* In the future, consider using a proper logging/warning system.
|
|
67
|
+
*
|
|
68
|
+
* @param hasOnClick - Whether onClick handler is provided
|
|
69
|
+
* @param isInteractive - Whether interactive prop is set
|
|
70
|
+
*/
|
|
71
|
+
export function warnInteractiveUsage(
|
|
72
|
+
hasOnClick: boolean,
|
|
73
|
+
isInteractive?: boolean
|
|
74
|
+
): void {
|
|
75
|
+
// Development warning removed to comply with ESLint no-console rule
|
|
76
|
+
// TODO: Consider using a proper warning system if needed
|
|
77
|
+
void hasOnClick
|
|
78
|
+
void isInteractive
|
|
79
|
+
}
|