@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,71 +1,212 @@
|
|
|
1
|
-
import UI from
|
|
2
|
-
import React from
|
|
1
|
+
import UI from "#components/ui";
|
|
2
|
+
import React from "react";
|
|
3
3
|
|
|
4
|
-
import Input from
|
|
5
|
-
import Field from
|
|
6
|
-
import Select from
|
|
7
|
-
import Textarea from
|
|
4
|
+
import Input from "./inputs";
|
|
5
|
+
import Field from "./fields";
|
|
6
|
+
import Select from "./select";
|
|
7
|
+
import Textarea from "./textarea";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Form submission status type
|
|
11
|
+
*/
|
|
12
|
+
export type FormStatus = "idle" | "submitting" | "success" | "error";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Form component props interface
|
|
16
|
+
* @interface FormProps
|
|
17
|
+
* @extends {React.ComponentProps<'form'>}
|
|
18
|
+
*/
|
|
19
|
+
export interface FormProps
|
|
20
|
+
extends Omit<React.ComponentProps<"form">, "className"> {
|
|
21
|
+
/**
|
|
22
|
+
* Unique identifier for the form
|
|
23
|
+
*/
|
|
24
|
+
id?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Name attribute for the form
|
|
27
|
+
*/
|
|
28
|
+
name?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Inline CSS styles object
|
|
31
|
+
*/
|
|
32
|
+
styles?: React.CSSProperties;
|
|
33
|
+
/**
|
|
34
|
+
* CSS class names (preferred over 'className' for consistency with fpkit components)
|
|
35
|
+
*/
|
|
36
|
+
classes?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Form submission action URL
|
|
39
|
+
*/
|
|
40
|
+
action?: string;
|
|
41
|
+
/**
|
|
42
|
+
* HTTP method for form submission
|
|
43
|
+
* @default 'post'
|
|
44
|
+
*/
|
|
45
|
+
formMethod?: "get" | "post";
|
|
46
|
+
/**
|
|
47
|
+
* Form submission handler - prevents default browser submission
|
|
48
|
+
* @param {React.FormEvent<HTMLFormElement>} event - Form submit event
|
|
49
|
+
*/
|
|
50
|
+
onSubmit?: (event: React.FormEvent<HTMLFormElement>) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Target for form submission (_blank, _self, _parent, _top)
|
|
53
|
+
*/
|
|
54
|
+
target?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Disable HTML5 validation
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
noValidate?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Current form status for accessibility and styling
|
|
62
|
+
* @default 'idle'
|
|
63
|
+
*/
|
|
64
|
+
status?: FormStatus;
|
|
65
|
+
/**
|
|
66
|
+
* Accessible name for the form
|
|
67
|
+
* RECOMMENDED when multiple forms exist on the same page to help screen reader users distinguish between them.
|
|
68
|
+
* Use descriptive labels like "Contact form", "Login form", "Search form"
|
|
69
|
+
* @example "Contact form"
|
|
70
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html|WCAG 2.4.6 Headings and Labels}
|
|
71
|
+
*/
|
|
72
|
+
"aria-label"?: string;
|
|
73
|
+
/**
|
|
74
|
+
* ID of element that labels the form
|
|
75
|
+
* Alternative to aria-label. Use when a visible heading already labels the form.
|
|
76
|
+
* @example "contact-form-title"
|
|
77
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html|WCAG 2.4.6 Headings and Labels}
|
|
78
|
+
*/
|
|
79
|
+
"aria-labelledby"?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Child elements (form fields, buttons, etc.)
|
|
82
|
+
*/
|
|
83
|
+
children: React.ReactNode;
|
|
84
|
+
}
|
|
11
85
|
|
|
12
86
|
/**
|
|
13
|
-
* Form component
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @
|
|
20
|
-
* @
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
87
|
+
* Form component - Accessible HTML form wrapper with validation support
|
|
88
|
+
*
|
|
89
|
+
* A flexible form component that provides proper ARIA attributes, form submission
|
|
90
|
+
* handling, and validation state management. Supports both controlled and uncontrolled
|
|
91
|
+
* form patterns, with status management for loading states and error handling.
|
|
92
|
+
*
|
|
93
|
+
* @component
|
|
94
|
+
* @example
|
|
95
|
+
* // Basic form with validation
|
|
96
|
+
* <Form onSubmit={handleSubmit} aria-label="Contact form">
|
|
97
|
+
* <Form.Field label="Name" labelFor="name" required>
|
|
98
|
+
* <Form.Input id="name" name="name" required />
|
|
99
|
+
* </Form.Field>
|
|
100
|
+
* <button type="submit">Submit</button>
|
|
101
|
+
* </Form>
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* // Form with loading state
|
|
105
|
+
* <Form
|
|
106
|
+
* status={isSubmitting ? 'submitting' : 'idle'}
|
|
107
|
+
* onSubmit={handleSubmit}
|
|
108
|
+
* >
|
|
109
|
+
* <Form.Field label="Email" labelFor="email">
|
|
110
|
+
* <Form.Input id="email" type="email" disabled={isSubmitting} />
|
|
111
|
+
* </Form.Field>
|
|
112
|
+
* <button type="submit" disabled={isSubmitting}>
|
|
113
|
+
* {isSubmitting ? 'Submitting...' : 'Submit'}
|
|
114
|
+
* </button>
|
|
115
|
+
* </Form>
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* // Uncontrolled form with native submission
|
|
119
|
+
* <Form action="/api/contact" formMethod="post">
|
|
120
|
+
* <Form.Field label="Message" labelFor="message">
|
|
121
|
+
* <Form.Textarea id="message" name="message" required />
|
|
122
|
+
* </Form.Field>
|
|
123
|
+
* <button type="submit">Send</button>
|
|
124
|
+
* </Form>
|
|
125
|
+
*
|
|
126
|
+
* @param {FormProps} props - Component props
|
|
127
|
+
* @returns {JSX.Element} Form element with proper accessibility attributes
|
|
128
|
+
*
|
|
129
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html|WCAG 4.1.2 Name, Role, Value}
|
|
130
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/error-identification.html|WCAG 3.3.1 Error Identification}
|
|
26
131
|
*/
|
|
27
|
-
export const Form = (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
132
|
+
export const Form = React.forwardRef<HTMLFormElement, FormProps>(
|
|
133
|
+
(
|
|
134
|
+
{
|
|
135
|
+
id,
|
|
136
|
+
name,
|
|
137
|
+
styles,
|
|
138
|
+
classes,
|
|
139
|
+
children,
|
|
140
|
+
action,
|
|
141
|
+
formMethod = "post",
|
|
142
|
+
onSubmit,
|
|
143
|
+
target,
|
|
144
|
+
noValidate = false,
|
|
145
|
+
status = "idle",
|
|
146
|
+
...props
|
|
147
|
+
},
|
|
148
|
+
ref: React.ForwardedRef<HTMLFormElement>
|
|
149
|
+
) => {
|
|
150
|
+
/**
|
|
151
|
+
* Form submission handler
|
|
152
|
+
* Prevents default browser submission only when onSubmit handler is provided
|
|
153
|
+
* @param {React.FormEvent<HTMLFormElement>} event - Form submit event
|
|
154
|
+
*/
|
|
155
|
+
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
|
156
|
+
if (onSubmit) {
|
|
157
|
+
event.preventDefault();
|
|
158
|
+
onSubmit(event);
|
|
159
|
+
}
|
|
160
|
+
// If no onSubmit handler, allow native form submission
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// Determine if form is busy (submitting)
|
|
164
|
+
const isBusy = status === "submitting";
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<UI
|
|
168
|
+
as="form"
|
|
169
|
+
// @ts-expect-error - ForwardedRef includes legacy string refs in its type union,
|
|
170
|
+
// but modern React (18+) and our polymorphic types correctly exclude them.
|
|
171
|
+
// String refs are deprecated and will not be passed at runtime.
|
|
172
|
+
ref={ref}
|
|
173
|
+
id={id}
|
|
174
|
+
name={name}
|
|
175
|
+
className={classes}
|
|
176
|
+
styles={styles}
|
|
177
|
+
action={action}
|
|
178
|
+
method={formMethod}
|
|
179
|
+
onSubmit={handleSubmit}
|
|
180
|
+
target={target}
|
|
181
|
+
noValidate={noValidate}
|
|
182
|
+
// Accessibility attributes
|
|
183
|
+
aria-busy={isBusy}
|
|
184
|
+
// Data attribute for CSS styling hooks
|
|
185
|
+
data-status={status}
|
|
186
|
+
{...props}
|
|
187
|
+
>
|
|
188
|
+
{children}
|
|
189
|
+
</UI>
|
|
190
|
+
);
|
|
45
191
|
}
|
|
192
|
+
);
|
|
46
193
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
194
|
+
// Compound component type with sub-components
|
|
195
|
+
type FormComponent = typeof Form & {
|
|
196
|
+
Field: typeof Field;
|
|
197
|
+
Input: typeof Input;
|
|
198
|
+
Select: typeof Select;
|
|
199
|
+
Textarea: typeof Textarea;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// Display name for React DevTools
|
|
203
|
+
Form.displayName = "Form";
|
|
204
|
+
|
|
205
|
+
// Compound component pattern - attach sub-components with proper typing
|
|
206
|
+
const FormWithSubComponents = Form as FormComponent;
|
|
207
|
+
FormWithSubComponents.Field = Field;
|
|
208
|
+
FormWithSubComponents.Input = Input;
|
|
209
|
+
FormWithSubComponents.Select = Select;
|
|
210
|
+
FormWithSubComponents.Textarea = Textarea;
|
|
65
211
|
|
|
66
|
-
export default
|
|
67
|
-
Form.displayName = 'Form'
|
|
68
|
-
Form.Field = Field
|
|
69
|
-
Form.Input = Input
|
|
70
|
-
Form.Select = Select
|
|
71
|
-
Form.Textarea = Textarea
|
|
212
|
+
export default FormWithSubComponents;
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validation state for form inputs
|
|
5
|
+
*/
|
|
6
|
+
export type ValidationState = 'valid' | 'invalid' | 'none'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Input component props interface
|
|
10
|
+
* Extends native HTML input props with custom validation and accessibility features
|
|
11
|
+
*
|
|
12
|
+
* @interface InputProps
|
|
13
|
+
*/
|
|
14
|
+
export interface InputProps extends Omit<React.ComponentPropsWithoutRef<'input'>, 'className'> {
|
|
15
|
+
/**
|
|
16
|
+
* Input type attribute
|
|
17
|
+
* @default 'text'
|
|
18
|
+
*/
|
|
19
|
+
type?: React.HTMLInputTypeAttribute
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Unique identifier for the input element
|
|
23
|
+
*/
|
|
24
|
+
id?: string
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Name attribute for form submission
|
|
28
|
+
*/
|
|
29
|
+
name?: string
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Controlled value
|
|
33
|
+
*/
|
|
34
|
+
value?: string | number | readonly string[]
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Uncontrolled default value
|
|
38
|
+
*/
|
|
39
|
+
defaultValue?: string | number | readonly string[]
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Placeholder text
|
|
43
|
+
*/
|
|
44
|
+
placeholder?: string
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* CSS class names (preferred over 'className' for consistency with fpkit components)
|
|
48
|
+
*/
|
|
49
|
+
classes?: string
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Inline CSS styles object
|
|
53
|
+
*/
|
|
54
|
+
styles?: React.CSSProperties
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Disabled state (standard prop)
|
|
58
|
+
*/
|
|
59
|
+
disabled?: boolean
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Disabled state (legacy support)
|
|
63
|
+
* @deprecated Use `disabled` instead
|
|
64
|
+
*/
|
|
65
|
+
isDisabled?: boolean
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Read-only state
|
|
69
|
+
*/
|
|
70
|
+
readOnly?: boolean
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Required field indicator
|
|
74
|
+
* @default false
|
|
75
|
+
*/
|
|
76
|
+
required?: boolean
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Current validation state for styling and accessibility
|
|
80
|
+
* @default 'none'
|
|
81
|
+
*/
|
|
82
|
+
validationState?: ValidationState
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Error message to display and link via aria-describedby
|
|
86
|
+
*/
|
|
87
|
+
errorMessage?: string
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Hint text to display and link via aria-describedby
|
|
91
|
+
*/
|
|
92
|
+
hintText?: string
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Maximum character length
|
|
96
|
+
*/
|
|
97
|
+
maxLength?: number
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Minimum character length
|
|
101
|
+
*/
|
|
102
|
+
minLength?: number
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Validation pattern regex
|
|
106
|
+
*/
|
|
107
|
+
pattern?: string
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Autocomplete attribute for browser autofill
|
|
111
|
+
*/
|
|
112
|
+
autoComplete?: string
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Auto-focus on mount
|
|
116
|
+
* @default false
|
|
117
|
+
*/
|
|
118
|
+
autoFocus?: boolean
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Input mode for virtual keyboards
|
|
122
|
+
*/
|
|
123
|
+
inputMode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Change event handler
|
|
127
|
+
*/
|
|
128
|
+
onChange?: React.ChangeEventHandler<HTMLInputElement>
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Blur event handler
|
|
132
|
+
*/
|
|
133
|
+
onBlur?: React.FocusEventHandler<HTMLInputElement>
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Focus event handler
|
|
137
|
+
*/
|
|
138
|
+
onFocus?: React.FocusEventHandler<HTMLInputElement>
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Key down event handler
|
|
142
|
+
*/
|
|
143
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Accessibility handler for Enter key press
|
|
147
|
+
* Enables keyboard-only users to trigger actions without requiring mouse interaction
|
|
148
|
+
* @param {React.KeyboardEvent<HTMLInputElement>} event - Keyboard event
|
|
149
|
+
*
|
|
150
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html|WCAG 2.1.1 Keyboard}
|
|
151
|
+
*/
|
|
152
|
+
onEnter?: (event: React.KeyboardEvent<HTMLInputElement>) => void
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Textarea component props interface
|
|
157
|
+
* Extends native HTML textarea props with custom validation and accessibility features
|
|
158
|
+
*
|
|
159
|
+
* @interface TextareaProps
|
|
160
|
+
*/
|
|
161
|
+
export interface TextareaProps extends Omit<React.ComponentPropsWithoutRef<'textarea'>, 'className'> {
|
|
162
|
+
/**
|
|
163
|
+
* Unique identifier for the textarea element
|
|
164
|
+
*/
|
|
165
|
+
id?: string
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Name attribute for form submission
|
|
169
|
+
*/
|
|
170
|
+
name?: string
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Controlled value
|
|
174
|
+
*/
|
|
175
|
+
value?: string | number | readonly string[]
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Uncontrolled default value
|
|
179
|
+
*/
|
|
180
|
+
defaultValue?: string | number | readonly string[]
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Placeholder text
|
|
184
|
+
*/
|
|
185
|
+
placeholder?: string
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* CSS class names (preferred over 'className' for consistency with fpkit components)
|
|
189
|
+
*/
|
|
190
|
+
classes?: string
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Inline CSS styles object
|
|
194
|
+
*/
|
|
195
|
+
styles?: React.CSSProperties
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Number of visible text rows
|
|
199
|
+
* @default 5
|
|
200
|
+
*/
|
|
201
|
+
rows?: number
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Number of visible text columns
|
|
205
|
+
* @default 25
|
|
206
|
+
*/
|
|
207
|
+
cols?: number
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Disabled state
|
|
211
|
+
*/
|
|
212
|
+
disabled?: boolean
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Read-only state
|
|
216
|
+
*/
|
|
217
|
+
readOnly?: boolean
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Required field indicator
|
|
221
|
+
* @default false
|
|
222
|
+
*/
|
|
223
|
+
required?: boolean
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Current validation state for styling and accessibility
|
|
227
|
+
* @default 'none'
|
|
228
|
+
*/
|
|
229
|
+
validationState?: ValidationState
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Error message to display and link via aria-describedby
|
|
233
|
+
*/
|
|
234
|
+
errorMessage?: string
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Hint text to display and link via aria-describedby
|
|
238
|
+
*/
|
|
239
|
+
hintText?: string
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Change event handler
|
|
243
|
+
*/
|
|
244
|
+
onChange?: React.ChangeEventHandler<HTMLTextAreaElement>
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Blur event handler
|
|
248
|
+
*/
|
|
249
|
+
onBlur?: React.FocusEventHandler<HTMLTextAreaElement>
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Focus event handler
|
|
253
|
+
*/
|
|
254
|
+
onFocus?: React.FocusEventHandler<HTMLTextAreaElement>
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Pointer down event handler
|
|
258
|
+
*/
|
|
259
|
+
onPointerDown?: React.PointerEventHandler<HTMLTextAreaElement>
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Key down event handler
|
|
263
|
+
*/
|
|
264
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement>
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Accessibility handler for Enter key press (without Shift modifier)
|
|
268
|
+
* Enables keyboard-only users to submit forms with Enter, while Shift+Enter creates new lines
|
|
269
|
+
* @param {React.KeyboardEvent<HTMLTextAreaElement>} event - Keyboard event
|
|
270
|
+
*
|
|
271
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html|WCAG 2.1.1 Keyboard}
|
|
272
|
+
*/
|
|
273
|
+
onEnter?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Ref for the textarea element
|
|
277
|
+
*/
|
|
278
|
+
ref?: React.Ref<HTMLTextAreaElement>
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Select component props interface
|
|
283
|
+
* Extends native HTML select props with custom validation and accessibility features
|
|
284
|
+
*
|
|
285
|
+
* @interface SelectProps
|
|
286
|
+
*/
|
|
287
|
+
export interface SelectProps extends Omit<React.ComponentPropsWithoutRef<'select'>, 'className'> {
|
|
288
|
+
/**
|
|
289
|
+
* Unique identifier for the select element
|
|
290
|
+
*/
|
|
291
|
+
id?: string
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Name attribute for form submission
|
|
295
|
+
*/
|
|
296
|
+
name?: string
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* CSS class names (preferred over 'className' for consistency with fpkit components)
|
|
300
|
+
*/
|
|
301
|
+
classes?: string
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Inline CSS styles object
|
|
305
|
+
*/
|
|
306
|
+
styles?: React.CSSProperties
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Disabled state
|
|
310
|
+
*/
|
|
311
|
+
disabled?: boolean
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Required field indicator
|
|
315
|
+
* @default false
|
|
316
|
+
*/
|
|
317
|
+
required?: boolean
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Selected option value(s)
|
|
321
|
+
*/
|
|
322
|
+
selected?: string | number | string[]
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Current validation state for styling and accessibility
|
|
326
|
+
* @default 'none'
|
|
327
|
+
*/
|
|
328
|
+
validationState?: ValidationState
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Error message to display and link via aria-describedby
|
|
332
|
+
*/
|
|
333
|
+
errorMessage?: string
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Hint text to display and link via aria-describedby
|
|
337
|
+
*/
|
|
338
|
+
hintText?: string
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Blur event handler
|
|
342
|
+
*/
|
|
343
|
+
onBlur?: React.FocusEventHandler<HTMLSelectElement>
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Selection change handler (alternative to onChange)
|
|
347
|
+
*/
|
|
348
|
+
onSelectionChange?: React.ChangeEventHandler<HTMLSelectElement>
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Pointer down event handler
|
|
352
|
+
*/
|
|
353
|
+
onPointerDown?: React.PointerEventHandler<HTMLSelectElement>
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Key down event handler
|
|
357
|
+
*/
|
|
358
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLSelectElement>
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Accessibility handler for Enter key press
|
|
362
|
+
* Enables keyboard-only users to trigger actions after selection
|
|
363
|
+
* @param {React.KeyboardEvent<HTMLSelectElement>} event - Keyboard event
|
|
364
|
+
*
|
|
365
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html|WCAG 2.1.1 Keyboard}
|
|
366
|
+
*/
|
|
367
|
+
onEnter?: (event: React.KeyboardEvent<HTMLSelectElement>) => void
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Ref for the select element
|
|
371
|
+
*/
|
|
372
|
+
ref?: React.Ref<HTMLSelectElement>
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Child option elements
|
|
376
|
+
*/
|
|
377
|
+
children?: React.ReactNode
|
|
378
|
+
}
|