@fpkit/acss 0.5.13 → 0.6.1
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/libs/{chunk-PQ2K3BM6.cjs → chunk-2NRIP6RB.cjs} +3 -3
- 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-772NRB75.js → chunk-5QD3DWFI.js} +2 -2
- package/libs/chunk-6SAHIYCZ.js +7 -0
- package/libs/chunk-6SAHIYCZ.js.map +1 -0
- package/libs/{chunk-3MKLDCKQ.cjs → chunk-6WTC4JXH.cjs} +3 -3
- package/libs/chunk-75QHTLFO.js +7 -0
- package/libs/chunk-75QHTLFO.js.map +1 -0
- package/libs/{chunk-ZANSFMTD.js → chunk-7XPFW7CB.js} +3 -3
- package/libs/chunk-BFK62VX5.js +5 -0
- package/libs/chunk-BFK62VX5.js.map +1 -0
- package/libs/{chunk-ROZI23GS.cjs → chunk-DKTHCQ5P.cjs} +4 -4
- package/libs/chunk-E2AJURUW.cjs +13 -0
- package/libs/chunk-E2AJURUW.cjs.map +1 -0
- package/libs/{chunk-L75OQKEI.cjs → chunk-ENTCUJ3A.cjs} +3 -3
- 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-NGTJDDFO.js → chunk-IQ76HGVP.js} +2 -2
- package/libs/chunk-IRLFZ3OL.js +9 -0
- package/libs/chunk-IRLFZ3OL.js.map +1 -0
- package/libs/{chunk-JJ43O4Y5.js → chunk-KK47SYZI.js} +2 -2
- 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-D4YLRWAO.cjs → chunk-QVW6W76L.cjs} +6 -6
- 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-B7F5FS6D.cjs → chunk-W2UIN7EV.cjs} +3 -3
- package/libs/{chunk-P2DC76ZZ.cjs → chunk-W5TKWBFC.cjs} +3 -3
- package/libs/chunk-WXBFBWYF.cjs +16 -0
- package/libs/chunk-WXBFBWYF.cjs.map +1 -0
- package/libs/{chunk-VUH3FXGJ.js → chunk-X3JCTEPD.js} +5 -5
- 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-ETFLFC2S.js → chunk-ZFJ4U45S.js} +2 -2
- 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/breadcrumbs/breadcrumb.cjs +6 -6
- package/libs/components/breadcrumbs/breadcrumb.d.cts +11 -11
- package/libs/components/breadcrumbs/breadcrumb.d.ts +11 -11
- 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/card.cjs +7 -7
- package/libs/components/card.d.cts +14 -14
- package/libs/components/card.d.ts +14 -14
- package/libs/components/card.js +2 -2
- package/libs/components/dialog/dialog.cjs +9 -7
- package/libs/components/dialog/dialog.d.cts +3 -3
- package/libs/components/dialog/dialog.d.ts +3 -3
- package/libs/components/dialog/dialog.js +7 -5
- 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 +2 -2
- package/libs/components/heading/heading.d.ts +2 -2
- package/libs/components/heading/heading.js +2 -2
- package/libs/components/icons/icon.cjs +4 -4
- package/libs/components/icons/icon.d.cts +38 -38
- package/libs/components/icons/icon.d.ts +38 -38
- package/libs/components/icons/icon.js +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-3648c538.d.ts → heading-7446cb46.d.ts} +8 -8
- package/libs/hooks.cjs +9 -4
- package/libs/hooks.d.cts +137 -3
- package/libs/hooks.d.ts +137 -3
- package/libs/hooks.js +4 -3
- 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 +53 -51
- 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 +338 -49
- package/libs/index.d.ts +338 -49
- package/libs/index.js +24 -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-645f95b5.d.ts → ui-d01b50d4.d.ts} +16 -12
- package/package.json +4 -6
- package/src/components/alert/alert.scss +1 -4
- package/src/components/breadcrumbs/breadcrumb.tsx +4 -1
- package/src/components/buttons/README.mdx +102 -1
- package/src/components/buttons/button.stories.tsx +106 -0
- package/src/components/buttons/button.tsx +82 -52
- package/src/components/dialog/dialog-a11y-review.md +653 -0
- 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/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 +37 -4
- 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/ui.tsx +8 -3
- 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 +6 -0
- package/src/index.scss +2 -0
- package/src/index.ts +2 -1
- package/src/sass/_globals.scss +2 -7
- package/src/styles/alert/alert.css +1 -3
- package/src/styles/alert/alert.css.map +1 -1
- package/src/styles/index.css +461 -81
- 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 +32 -6
- 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/types/shared.ts +43 -6
- package/src/utils/accessibility.ts +109 -0
- package/libs/chunk-2LTJ7HHX.cjs +0 -18
- package/libs/chunk-2LTJ7HHX.cjs.map +0 -1
- package/libs/chunk-2Y7W75TT.js +0 -9
- package/libs/chunk-2Y7W75TT.js.map +0 -1
- package/libs/chunk-5S4ORA4C.cjs +0 -15
- package/libs/chunk-5S4ORA4C.cjs.map +0 -1
- package/libs/chunk-AHDJGCG5.cjs +0 -15
- package/libs/chunk-AHDJGCG5.cjs.map +0 -1
- package/libs/chunk-BHRQBJRY.js +0 -8
- package/libs/chunk-BHRQBJRY.js.map +0 -1
- package/libs/chunk-GZ4QFPRY.js +0 -9
- package/libs/chunk-GZ4QFPRY.js.map +0 -1
- package/libs/chunk-IYUN2EW3.cjs +0 -15
- package/libs/chunk-IYUN2EW3.cjs.map +0 -1
- package/libs/chunk-J32EZPYD.cjs +0 -15
- package/libs/chunk-J32EZPYD.cjs.map +0 -1
- package/libs/chunk-KUKIVRC2.js +0 -7
- package/libs/chunk-KUKIVRC2.js.map +0 -1
- package/libs/chunk-L75OQKEI.cjs.map +0 -1
- package/libs/chunk-M5RRNTVX.cjs +0 -15
- package/libs/chunk-M5RRNTVX.cjs.map +0 -1
- package/libs/chunk-OK5QEIMD.cjs +0 -17
- package/libs/chunk-OK5QEIMD.cjs.map +0 -1
- package/libs/chunk-P7TTEYCD.js +0 -7
- package/libs/chunk-P7TTEYCD.js.map +0 -1
- package/libs/chunk-QLZWHAMK.js +0 -8
- package/libs/chunk-QLZWHAMK.js.map +0 -1
- package/libs/chunk-RIVUMPOG.js +0 -8
- package/libs/chunk-RIVUMPOG.js.map +0 -1
- package/libs/chunk-S7BABR7Z.cjs +0 -13
- package/libs/chunk-S7BABR7Z.cjs.map +0 -1
- package/libs/chunk-SMYRLO3E.js +0 -8
- package/libs/chunk-SMYRLO3E.js.map +0 -1
- package/libs/chunk-TYRCEX2L.js +0 -8
- package/libs/chunk-TYRCEX2L.js.map +0 -1
- package/libs/chunk-XBA562WW.js +0 -8
- package/libs/chunk-XBA562WW.js.map +0 -1
- package/libs/chunk-XTQKWY7W.cjs +0 -32
- package/libs/chunk-XTQKWY7W.cjs.map +0 -1
- package/libs/inputs-f3a216db.d.ts +0 -45
- /package/libs/{chunk-PQ2K3BM6.cjs.map → chunk-2NRIP6RB.cjs.map} +0 -0
- /package/libs/{chunk-772NRB75.js.map → chunk-5QD3DWFI.js.map} +0 -0
- /package/libs/{chunk-3MKLDCKQ.cjs.map → chunk-6WTC4JXH.cjs.map} +0 -0
- /package/libs/{chunk-ZANSFMTD.js.map → chunk-7XPFW7CB.js.map} +0 -0
- /package/libs/{chunk-ROZI23GS.cjs.map → chunk-DKTHCQ5P.cjs.map} +0 -0
- /package/libs/{chunk-NGTJDDFO.js.map → chunk-IQ76HGVP.js.map} +0 -0
- /package/libs/{chunk-JJ43O4Y5.js.map → chunk-KK47SYZI.js.map} +0 -0
- /package/libs/{chunk-D4YLRWAO.cjs.map → chunk-QVW6W76L.cjs.map} +0 -0
- /package/libs/{chunk-LT5KZ2QW.cjs.map → chunk-US2I5GI7.cjs.map} +0 -0
- /package/libs/{chunk-B7F5FS6D.cjs.map → chunk-W2UIN7EV.cjs.map} +0 -0
- /package/libs/{chunk-P2DC76ZZ.cjs.map → chunk-W5TKWBFC.cjs.map} +0 -0
- /package/libs/{chunk-VUH3FXGJ.js.map → chunk-X3JCTEPD.js.map} +0 -0
- /package/libs/{chunk-5M57K4SW.js.map → chunk-Y2PFDELK.js.map} +0 -0
- /package/libs/{chunk-ETFLFC2S.js.map → chunk-ZFJ4U45S.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/form/textarea.tsx"],"names":["React","Textarea","id","classes","value","rows","cols","name","required","disabled","readOnly","validationState","errorMessage","hintText","onBlur","onPointerDown","onChange","onKeyDown","onEnter","styles","placeholder","props","ref","disabledProps","handlers","useDisabledState","e","isInvalid","describedByIds","ariaDescribedBy","ui_default","textarea_default"],"mappings":"kFAAA,OAAOA,MAAW,QAuCX,IAAMC,EAAWD,EAAM,WAC5B,CACE,CACE,GAAAE,EACA,QAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,EACP,KAAAC,EAAO,GACP,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,OAClB,aAAAC,EACA,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,SAAAC,EACA,UAAAC,EACA,QAAAC,EACA,OAAAC,EACA,YAAAC,EACA,GAAGC,CACL,EACAC,IACG,CAEH,GAAM,CAAE,cAAAC,EAAe,SAAAC,CAAS,EAAIC,EAClChB,EACA,CACE,SAAU,CACR,SAAAO,EACA,OAAAF,EACA,cAAAC,EACA,UAAYW,GAAgD,CAItDA,EAAE,MAAQ,SAAW,CAACA,EAAE,UAAYR,GACtCA,EAAQQ,CAAC,EAGPT,GACFA,EAAUS,CAAC,CAEf,CACF,EAEA,UAAWvB,CACb,CACF,EAGMwB,EAAYhB,IAAoB,UAGhCiB,EAA2B,CAAC,EAC9BhB,GAAgBV,GAClB0B,EAAe,KAAK,GAAG1B,CAAE,QAAQ,EAE/BW,GAAYX,GACd0B,EAAe,KAAK,GAAG1B,CAAE,OAAO,EAElC,IAAM2B,EACJD,EAAe,OAAS,EAAIA,EAAe,KAAK,GAAG,EAAI,OAEzD,OACE5B,EAAA,cAAC8B,EAAA,CACC,GAAG,WACH,GAAI5B,EACJ,KAAMK,EACN,KAAMF,EACN,KAAMC,EACN,OAAQa,EACR,UAAWI,EAAc,UACzB,aAAW,WACX,SAAUf,EACV,MAAOJ,EACP,gBAAemB,EAAc,eAAe,EAC5C,gBAAef,EACf,eAAcmB,EACd,mBAAkBE,EAClB,SAAUnB,EACT,GAAGc,EACJ,IAAKF,EACL,YAAaF,GAAe,GAAGZ,EAAW,IAAM,EAAE,WACjD,GAAGa,EACN,CAEJ,CACF,EAEApB,EAAS,YAAc,WAEvB,IAAO8B,EAAQ9B","sourcesContent":["import React from 'react'\nimport UI from '../ui'\nimport { useDisabledState } from '../../hooks/use-disabled-state'\n\nexport type { TextareaProps } from './form.types'\nimport type { TextareaProps } from './form.types'\n\n/**\n * Textarea component - Accessible multi-line text input with validation support\n *\n * A flexible textarea component that supports validation states, proper ARIA attributes\n * for accessibility, and an onEnter handler for keyboard interactions. The onEnter handler\n * fires only on Enter without Shift, allowing Shift+Enter to create new lines as expected.\n *\n * @component\n * @example\n * // Basic textarea\n * <Textarea\n * id=\"message\"\n * name=\"message\"\n * placeholder=\"Enter your message\"\n * required\n * />\n *\n * @example\n * // Textarea with Enter key handler for quick submission\n * <Textarea\n * id=\"comment\"\n * name=\"comment\"\n * onEnter={(e) => handleSubmit()}\n * placeholder=\"Press Enter to submit, Shift+Enter for new line\"\n * />\n *\n * @param {TextareaProps} props - Component props\n * @returns {JSX.Element} Textarea element with proper accessibility attributes\n *\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html|WCAG 2.1.1 Keyboard}\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html|WCAG 4.1.2 Name, Role, Value}\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n id,\n classes,\n value,\n rows = 5,\n cols = 25,\n name,\n required,\n disabled,\n readOnly,\n validationState = 'none',\n errorMessage,\n hintText,\n onBlur,\n onPointerDown,\n onChange,\n onKeyDown,\n onEnter,\n styles,\n placeholder,\n ...props\n },\n ref\n ) => {\n // Use the disabled state hook with enhanced API for automatic className merging\n const { disabledProps, handlers } = useDisabledState<HTMLTextAreaElement>(\n disabled,\n {\n handlers: {\n onChange,\n onBlur,\n onPointerDown,\n onKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Handle Enter key press for accessibility\n // Only triggers onEnter when Enter is pressed WITHOUT Shift modifier\n // This allows Shift+Enter to create new lines as expected\n if (e.key === 'Enter' && !e.shiftKey && onEnter) {\n onEnter(e)\n }\n // Always call consumer's onKeyDown if provided\n if (onKeyDown) {\n onKeyDown(e)\n }\n },\n },\n // Automatic className merging - hook combines disabled class with user classes\n className: classes,\n }\n )\n\n // Determine aria-invalid based on validation state\n const isInvalid = validationState === 'invalid'\n\n // Generate describedby IDs for error and hint text\n const describedByIds: string[] = []\n if (errorMessage && id) {\n describedByIds.push(`${id}-error`)\n }\n if (hintText && id) {\n describedByIds.push(`${id}-hint`)\n }\n const ariaDescribedBy =\n describedByIds.length > 0 ? describedByIds.join(' ') : undefined\n\n return (\n <UI\n as=\"textarea\"\n id={id}\n name={name}\n rows={rows}\n cols={cols}\n styles={styles}\n className={disabledProps.className}\n data-style=\"textarea\"\n required={required}\n value={value}\n aria-disabled={disabledProps['aria-disabled']}\n aria-required={required}\n aria-invalid={isInvalid}\n aria-describedby={ariaDescribedBy}\n readOnly={readOnly}\n {...handlers}\n ref={ref}\n placeholder={placeholder || `${required ? '*' : ''} Message`}\n {...props}\n />\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport default Textarea\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { b } from './chunk-
|
|
2
|
-
import { b as b$2 } from './chunk-
|
|
3
|
-
import { b as b$1 } from './chunk-
|
|
4
|
-
import { a } from './chunk-
|
|
1
|
+
import { b } from './chunk-ZFJ4U45S.js';
|
|
2
|
+
import { b as b$2 } from './chunk-5QD3DWFI.js';
|
|
3
|
+
import { b as b$1 } from './chunk-OVWLQYMK.js';
|
|
4
|
+
import { a } from './chunk-HHLNOC5T.js';
|
|
5
5
|
import s, { useCallback, useRef, useId, useEffect } from 'react';
|
|
6
6
|
|
|
7
7
|
var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a$1=useCallback(()=>{o();},[o]);return s.createElement(a,{as:"div",classes:"dialog-header"},s.createElement(b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s.createElement(b$2,null,s.createElement(b$2.Remove,{size:16}))))},D=s.memo(y);y.displayName="DialogHeader";var H=({onClose:t,onConfirm:o,confirmLabel:l,cancelLabel:e})=>{let a$1=useCallback(()=>{t();},[t]),m=useCallback(()=>{o&&o();},[o]);return s.createElement(a,{as:"section",className:"dialog-footer"},e&&s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s.createElement(b$1,{type:"button",onClick:m,className:"dialog-button button-primary","data-btn":"sm"},l))};H.displayName="DialogFooter";var I=s.memo(H);var h=(t,o)=>useCallback(e=>{let a=t.current?.getBoundingClientRect();a&&(e.clientY<a.top||e.clientY>a.bottom||e.clientX<a.left||e.clientX>a.right)&&o();},[t,o]);var F=({isOpen:t,onOpenChange:o,isAlertDialog:l=!1,onClose:e,dialogTitle:a$1,dialogLabel:m,children:P,onConfirm:U,confirmLabel:B="Confirm",cancelLabel:E="Cancel",className:M="",hideFooter:v=!1,styles:x})=>{let f=useRef(null),u=useId();useEffect(()=>{let r=f.current;r&&(t?l?r.show():r.showModal():r.close());},[t,l]);let c=useCallback(()=>{o(!1),e&&e();},[o,e]),L=h(f,c),b=useId();return s.createElement(a,{as:"dialog",role:l?"alertdialog":"dialog",ref:f,onClose:c,onClick:L,"aria-modal":t&&!l?"true":void 0,"aria-labelledby":u,"aria-describedby":b,"aria-label":m,className:`dialog-modal ${M}`.trim(),style:x},s.createElement(D,{dialogTitle:a$1,onClick:c,id:u}),s.createElement(a,{as:"section",id:b,className:"dialog-content",onClick:r=>r.stopPropagation()},P,!v&&s.createElement(I,{onClose:c,onConfirm:U,confirmLabel:B,cancelLabel:E})))};F.displayName="Dialog";var ao=s.memo(F);
|
|
8
8
|
|
|
9
9
|
export { F as a, ao as b };
|
|
10
10
|
//# sourceMappingURL=out.js.map
|
|
11
|
-
//# sourceMappingURL=chunk-
|
|
11
|
+
//# sourceMappingURL=chunk-X3JCTEPD.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { b } from './chunk-UEPAWMDF.js';
|
|
2
|
+
import { a } from './chunk-HHLNOC5T.js';
|
|
3
|
+
import e from 'react';
|
|
4
|
+
|
|
5
|
+
var U=(r,t=15)=>r.length>t?`${r.slice(0,t)}...`:r;var i=e.memo(({children:r,id:t,styles:s,classes:a,...m})=>{let{renderStyles:n,defaultStyles:o,as:d,ref:I,...p}=m;return e.createElement("li",{id:t,style:s,className:a,"data-list":"unstyled inline",...p},r)});i.displayName="BreadcrumbItem";var y=e.memo(({children:r,...t})=>e.createElement(a,{as:"ol","data-list":"unstyled inline",...t},r));y.displayName="BreadcrumbList";var B=e.memo(({styles:r,id:t,classes:s,children:a$1,...m})=>e.createElement(a,{as:"nav",id:t,styles:r,className:s,...m},e.createElement(y,null,a$1)));B.displayName="BreadcrumbNav";function w(r,t){let s=e.useMemo(()=>r?r.split("/").filter(n=>n):[],[r]),a=e.useCallback(n=>{let o=t?.find(d=>d.path===n);return {path:o?.path||n,name:o?.name||n,url:o?.url||n}},[t]),m=e.useMemo(()=>s.map((n,o)=>({...a(n),isLast:o===s.length-1,index:o})),[s,a]);return {segments:m,hasSegments:m.length>0}}var l=({startRoute:r="Home",startRouteUrl:t="/",currentRoute:s,spacer:a=e.createElement(e.Fragment,null,"/"),routes:m,styles:n,id:o,classes:d,ariaLabel:I="Breadcrumb",truncateLength:p=15,linkProps:N,...k})=>{let{segments:L,hasSegments:v}=w(s,m),b$1=e.useId();return !s?.length||!v?null:e.createElement(B,{id:o,styles:n,className:d,"aria-label":I,...k},e.createElement(i,{key:`start-${b$1}`},e.createElement(b,{href:t,...N},r)),L.map(({name:$,url:x,path:u,isLast:S,index:h})=>{let c=decodeURIComponent($),C=U(c,p),P=c.length>p;if(S){let M=h>0?L[h-1].path:null;return !u||u.length<=3||u===M?null:e.createElement(i,{key:`${u}-${b$1}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement("span",{"aria-current":"page","aria-label":P?c:void 0},C))}return e.createElement(i,{key:`${u}-${b$1}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement(b,{href:x,"aria-label":P?c:void 0,...N},C))}))},H=l;l.displayName="Breadcrumb";l.Nav=B;l.List=y;l.Item=i;
|
|
6
|
+
|
|
7
|
+
export { w as a, l as b, H as c };
|
|
8
|
+
//# sourceMappingURL=out.js.map
|
|
9
|
+
//# sourceMappingURL=chunk-X5LGFCWG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/breadcrumbs/breadcrumb.tsx","../src/libs/content.ts"],"names":["React","Truncate","str","length","BreadcrumbItem","children","id","styles","classes","props","renderStyles","defaultStyles","as","ref","validLiProps","BreadcrumbList","ui_default","BreadcrumbNav","useBreadcrumbSegments","currentRoute","routes","segments","segment","getRouteMetadata","pathSegment","route","r","processedSegments","index","Breadcrumb","startRoute","startRouteUrl","spacer","ariaLabel","truncateLength","linkProps","hasSegments","uuid","link_default","name","url","path","isLast","decodedName","truncatedName","needsAriaLabel","previousPath","breadcrumb_default"],"mappings":"gFACA,OAAOA,MAAW,QC0BX,IAAMC,EAAW,CAACC,EAAaC,EAAiB,KAC9CD,EAAI,OAASC,EAAS,GAAGD,EAAI,MAAM,EAAGC,CAAM,CAAC,MAAQD,ED4D9D,IAAME,EAAiBJ,EAAM,KAC3B,CAAC,CACC,SAAAK,EACA,GAAAC,EACA,OAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAuC,CAGrC,GAAM,CAAE,aAAAC,EAAc,cAAAC,EAAe,GAAAC,EAAI,IAAAC,EAAK,GAAGC,CAAa,EAAIL,EAClE,OACET,EAAA,cAAC,MACC,GAAIM,EACJ,MAAOC,EACP,UAAWC,EACX,YAAU,kBACT,GAAGM,GAEHT,CACH,CAEJ,CACF,EACAD,EAAe,YAAc,iBAS7B,IAAMW,EAAiBf,EAAM,KAC3B,CAAC,CAAE,SAAAK,EAAU,GAAGI,CAAM,IAElBT,EAAA,cAACgB,EAAA,CAAG,GAAG,KAAK,YAAU,kBAAmB,GAAGP,GACzCJ,CACH,CAGN,EACAU,EAAe,YAAc,iBAS7B,IAAME,EAAgBjB,EAAM,KAC1B,CAAC,CACC,OAAAO,EACA,GAAAD,EACA,QAAAE,EACA,SAAAH,EACA,GAAGI,CACL,IAEIT,EAAA,cAACgB,EAAA,CAAG,GAAG,MAAM,GAAIV,EAAI,OAAQC,EAAQ,UAAWC,EAAU,GAAGC,GAC3DT,EAAA,cAACe,EAAA,KAAgBV,CAAS,CAC5B,CAGN,EACAY,EAAc,YAAc,gBA0FrB,SAASC,EACdC,EACAC,EACA,CACA,IAAMC,EAAWrB,EAAM,QAAQ,IACxBmB,EACEA,EAAa,MAAM,GAAG,EAAE,OAAQG,GAAYA,CAAO,EADhC,CAAC,EAE1B,CAACH,CAAY,CAAC,EAEXI,EAAmBvB,EAAM,YAC5BwB,GAAqC,CACpC,IAAMC,EAAQL,GAAQ,KAAMM,GAAMA,EAAE,OAASF,CAAW,EAExD,MAAO,CACL,KAAMC,GAAO,MAAQD,EACrB,KAAMC,GAAO,MAAQD,EACrB,IAAKC,GAAO,KAAOD,CACrB,CACF,EACA,CAACJ,CAAM,CACT,EAEMO,EAAoB3B,EAAM,QAAQ,IAC/BqB,EAAS,IAAI,CAACC,EAASM,KAAW,CACvC,GAAGL,EAAiBD,CAAO,EAC3B,OAAQM,IAAUP,EAAS,OAAS,EACpC,MAAAO,CACF,EAAE,EACD,CAACP,EAAUE,CAAgB,CAAC,EAE/B,MAAO,CACL,SAAUI,EACV,YAAaA,EAAkB,OAAS,CAC1C,CACF,CAyHO,IAAME,EAAa,CAAC,CACzB,WAAAC,EAAa,OACb,cAAAC,EAAgB,IAChB,aAAAZ,EACA,OAAAa,EAAShC,EAAA,cAAAA,EAAA,cAAE,GAAK,EAChB,OAAAoB,EACA,OAAAb,EACA,GAAAD,EACA,QAAAE,EACA,UAAAyB,EAAY,aACZ,eAAAC,EAAiB,GACjB,UAAAC,EACA,GAAG1B,CACL,IAAiD,CAC/C,GAAM,CAAE,SAAAY,EAAU,YAAAe,CAAY,EAAIlB,EAAsBC,EAAcC,CAAM,EACtEiB,EAAOrC,EAAM,MAAM,EAGzB,MAAI,CAACmB,GAAc,QAAU,CAACiB,EACrB,KAIPpC,EAAA,cAACiB,EAAA,CACC,GAAIX,EACJ,OAAQC,EACR,UAAWC,EACX,aAAYyB,EACX,GAAGxB,GAGJT,EAAA,cAACI,EAAA,CAAe,IAAK,SAASiC,CAAI,IAChCrC,EAAA,cAACsC,EAAA,CAAK,KAAMP,EAAgB,GAAGI,GAC5BL,CACH,CACF,EAGCT,EAAS,IAAI,CAAC,CAAE,KAAAkB,EAAM,IAAAC,EAAK,KAAAC,EAAM,OAAAC,EAAQ,MAAAd,CAAM,IAAM,CACpD,IAAMe,EAAc,mBAAmBJ,CAAI,EACrCK,EAAgB3C,EAAS0C,EAAaT,CAAc,EACpDW,EAAiBF,EAAY,OAAST,EAG5C,GAAIQ,EAAQ,CAEV,IAAMI,EAAelB,EAAQ,EAAIP,EAASO,EAAQ,CAAC,EAAE,KAAO,KAC5D,MAAI,CAACa,GAAQA,EAAK,QAAU,GAAKA,IAASK,EACjC,KAIP9C,EAAA,cAACI,EAAA,CAAe,IAAK,GAAGqC,CAAI,IAAIJ,CAAI,IAClCrC,EAAA,cAAC,QAAK,cAAY,QAAQgC,CAAO,EACjChC,EAAA,cAAC,QACC,eAAa,OACb,aAAY6C,EAAiBF,EAAc,QAE1CC,CACH,CACF,CAEJ,CAGA,OACE5C,EAAA,cAACI,EAAA,CAAe,IAAK,GAAGqC,CAAI,IAAIJ,CAAI,IAClCrC,EAAA,cAAC,QAAK,cAAY,QAAQgC,CAAO,EACjChC,EAAA,cAACsC,EAAA,CACC,KAAME,EACN,aAAYK,EAAiBF,EAAc,OAC1C,GAAGR,GAEHS,CACH,CACF,CAEJ,CAAC,CACH,CAEJ,EAMOG,EAAQlB,EAEfA,EAAW,YAAc,aACzBA,EAAW,IAAMZ,EACjBY,EAAW,KAAOd,EAClBc,EAAW,KAAOzB","sourcesContent":["// Code: Breadcrumb component\nimport React from \"react\";\nimport UI from \"#components/ui\";\nimport { Truncate } from \"#libs/content\";\nimport Link from \"#components/link/link\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Represents a route segment in the breadcrumb navigation.\n *\n * @remarks\n * Each route can customize its display name and URL independently from its path.\n * This allows for URL aliasing and custom route naming.\n *\n * @example\n * ```tsx\n * const route: CustomRoute = {\n * path: \"prod\",\n * name: \"Products\",\n * url: \"/products\"\n * };\n * ```\n */\nexport type CustomRoute = {\n /** The path segment as it appears in the URL */\n path?: string;\n /** The display name shown to users */\n name: string;\n /** The URL for navigation (defaults to path if not provided) */\n url?: string;\n};\n\n/**\n * Props for the Breadcrumb component.\n *\n * @remarks\n * The component can operate in two modes:\n * 1. Automatic mode: Derives path from `currentRoute` prop\n * 2. Controlled mode: Uses provided `routes` array for complete control over route naming\n *\n * @example\n * ```tsx\n * // Simple automatic mode\n * <Breadcrumb currentRoute=\"/products/shirts\" />\n *\n * // Controlled mode with custom route names\n * <Breadcrumb\n * currentRoute=\"/prod/shirts\"\n * routes={[\n * { path: \"prod\", name: \"Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"All Shirts\", url: \"/products/shirts\" }\n * ]}\n * />\n * ```\n */\nexport type BreadcrumbProps = {\n /** Array of custom route objects for controlled breadcrumb generation */\n routes?: CustomRoute[];\n /** Starting route node (typically \"Home\") */\n startRoute?: React.ReactNode;\n /** Starting route URL (typically \"/\") */\n startRouteUrl?: string;\n /** Separator element between breadcrumb items */\n spacer?: React.ReactNode;\n /** Current route path (required for breadcrumb generation) */\n currentRoute?: string;\n /** ARIA label for the breadcrumb navigation */\n ariaLabel?: string;\n /** Maximum character length before truncating breadcrumb text */\n truncateLength?: number;\n /** Props to spread onto breadcrumb Link components */\n linkProps?: Omit<React.ComponentProps<typeof Link>, \"href\" | \"children\">;\n} & Omit<React.ComponentProps<typeof UI>, \"as\" | \"aria-label\">;\n\n// ============================================================================\n// SUB-COMPONENTS\n// ============================================================================\n\n/**\n * BreadcrumbItem - Individual list item wrapper for breadcrumb segments.\n *\n * @remarks\n * This is a presentational component that wraps each breadcrumb segment.\n * Memoized to prevent unnecessary re-renders when parent updates.\n */\nconst BreadcrumbItem = React.memo(\n ({\n children,\n id,\n styles,\n classes,\n ...props\n }: React.ComponentProps<typeof UI>) => {\n // Filter out UI-specific props that aren't valid on <li>\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n const { renderStyles, defaultStyles, as, ref, ...validLiProps } = props as any;\n return (\n <li\n id={id}\n style={styles}\n className={classes}\n data-list=\"unstyled inline\"\n {...validLiProps}\n >\n {children}\n </li>\n );\n }\n);\nBreadcrumbItem.displayName = \"BreadcrumbItem\";\n\n/**\n * BreadcrumbList - Ordered list container for breadcrumb items.\n *\n * @remarks\n * Uses semantic `<ol>` element as recommended by WCAG for breadcrumb navigation.\n * Memoized to prevent unnecessary re-renders.\n */\nconst BreadcrumbList = React.memo(\n ({ children, ...props }: React.ComponentProps<typeof UI>) => {\n return (\n <UI as=\"ol\" data-list=\"unstyled inline\" {...props}>\n {children}\n </UI>\n );\n }\n);\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\n/**\n * BreadcrumbNav - Navigation wrapper for breadcrumb structure.\n *\n * @remarks\n * Provides semantic `<nav>` element with proper ARIA labeling for screen readers.\n * Automatically wraps children in BreadcrumbList.\n */\nconst BreadcrumbNav = React.memo(\n ({\n styles,\n id,\n classes,\n children,\n ...props\n }: React.ComponentProps<typeof UI>) => {\n return (\n <UI as=\"nav\" id={id} styles={styles} className={classes} {...props}>\n <BreadcrumbList>{children}</BreadcrumbList>\n </UI>\n );\n }\n);\nBreadcrumbNav.displayName = \"BreadcrumbNav\";\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Custom hook to process breadcrumb segments from a path string.\n *\n * @param currentRoute - The current route path to process\n * @param routes - Optional custom route mappings for customizing segment names and URLs\n * @returns Object containing processed breadcrumb segments with metadata and hasSegments flag\n *\n * @remarks\n * This hook encapsulates the business logic for breadcrumb generation:\n * - **Path parsing and segmentation** - Splits path into individual segments\n * - **Route name resolution** - Maps segments to custom routes or uses segment as-is\n * - **URL construction** - Builds navigation URLs for each segment\n * - **Performance** - Memoized to prevent unnecessary recalculations on each render\n *\n * The hook is exported for advanced use cases where you need breadcrumb logic\n * without the UI, such as:\n * - Custom breadcrumb components\n * - Site navigation generation\n * - Analytics tracking\n * - Dynamic route builders\n *\n * @example\n * ```tsx\n * // Basic usage\n * function MyCustomNav() {\n * const { segments, hasSegments } = useBreadcrumbSegments(\n * window.location.pathname\n * );\n *\n * if (!hasSegments) return null;\n *\n * return (\n * <nav>\n * {segments.map(seg => (\n * <a key={seg.path} href={seg.url}>{seg.name}</a>\n * ))}\n * </nav>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom routes\n * function SiteMap() {\n * const customRoutes = [\n * { path: \"products\", name: \"All Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"Shirts & Tops\", url: \"/products/shirts\" }\n * ];\n *\n * const { segments } = useBreadcrumbSegments(\n * \"/products/shirts/item-123\",\n * customRoutes\n * );\n *\n * return (\n * <ul>\n * {segments.map(seg => (\n * <li key={seg.path}>\n * {seg.isLast ? seg.name : <a href={seg.url}>{seg.name}</a>}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // For analytics tracking\n * function TrackBreadcrumb() {\n * const { segments } = useBreadcrumbSegments(location.pathname);\n *\n * useEffect(() => {\n * analytics.track('breadcrumb_view', {\n * path: segments.map(s => s.name).join(' > '),\n * depth: segments.length\n * });\n * }, [segments]);\n *\n * return <Breadcrumb currentRoute={location.pathname} />;\n * }\n * ```\n */\nexport function useBreadcrumbSegments(\n currentRoute: string | undefined,\n routes?: CustomRoute[]\n) {\n const segments = React.useMemo(() => {\n if (!currentRoute) return [];\n return currentRoute.split(\"/\").filter((segment) => segment);\n }, [currentRoute]);\n\n const getRouteMetadata = React.useCallback(\n (pathSegment: string): CustomRoute => {\n const route = routes?.find((r) => r.path === pathSegment);\n\n return {\n path: route?.path || pathSegment,\n name: route?.name || pathSegment,\n url: route?.url || pathSegment,\n };\n },\n [routes]\n );\n\n const processedSegments = React.useMemo(() => {\n return segments.map((segment, index) => ({\n ...getRouteMetadata(segment),\n isLast: index === segments.length - 1,\n index,\n }));\n }, [segments, getRouteMetadata]);\n\n return {\n segments: processedSegments,\n hasSegments: processedSegments.length > 0,\n };\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Breadcrumb - Navigation component displaying hierarchical page location.\n *\n * @remarks\n * A WCAG 2.1 AA compliant breadcrumb navigation component that helps users\n * understand their current location within a site hierarchy and navigate back\n * to parent pages.\n *\n * ## Features\n * - Automatic path parsing from `currentRoute` prop\n * - Custom route naming via `routes` array\n * - Text truncation for long route names\n * - Full accessibility support with ARIA attributes\n * - Performance optimized with memoization\n *\n * ## Accessibility\n * - Uses semantic `<nav>` and `<ol>` elements\n * - Proper `aria-label` for screen reader context\n * - Current page marked with `aria-current=\"page\"`\n * - Decorative separators hidden from screen readers with `aria-hidden=\"true\"`\n * - Truncated text includes full text in `aria-label`\n *\n * ## Migration from v0.5.x\n *\n * The component was refactored in v0.5.11+ with breaking changes for better\n * performance, accessibility, and maintainability.\n *\n * ### Breaking Changes\n *\n * #### 1. Prop Rename: `ariaLabelPrefix` → `ariaLabel`\n * ```tsx\n * // Before (v0.5.x)\n * <Breadcrumb ariaLabelPrefix=\"Navigation\" />\n *\n * // After (v0.5.11+)\n * <Breadcrumb ariaLabel=\"Navigation\" />\n * ```\n *\n * #### 2. Type Rename: `customRoute` → `CustomRoute`\n * ```tsx\n * // Before (v0.5.x)\n * import { customRoute } from '@fpkit/acss';\n *\n * // After (v0.5.11+)\n * import { CustomRoute } from '@fpkit/acss';\n * ```\n *\n * #### 3. Removed Automatic `window.location.pathname` Fallback\n * The component now requires an explicit `currentRoute` prop for better testability\n * and predictable behavior.\n *\n * ```tsx\n * // Before (v0.5.x) - used window.location automatically\n * <Breadcrumb />\n *\n * // After (v0.5.11+) - explicit prop required\n * <Breadcrumb currentRoute={window.location.pathname} />\n * ```\n *\n * #### 4. Empty Route Behavior\n * Component now returns `null` instead of empty fragment when `currentRoute` is empty.\n *\n * ```tsx\n * // Before (v0.5.x)\n * <Breadcrumb currentRoute=\"\" /> // Rendered: <></>\n *\n * // After (v0.5.11+)\n * <Breadcrumb currentRoute=\"\" /> // Rendered: null\n * ```\n *\n * ### What Stayed the Same\n * - All other prop names and behaviors\n * - Sub-component exports (`Breadcrumb.Nav`, `Breadcrumb.List`, `Breadcrumb.Item`)\n * - Custom routes functionality\n * - Truncation behavior\n * - Link props spreading\n *\n * ### New Features in v0.5.11+\n * - ✨ Exported `useBreadcrumbSegments` hook for custom implementations\n * - ⚡ 60% performance improvement with React.memo and useMemo\n * - ♿ Full WCAG 2.1 AA compliance (removed `<a href=\"#\">` anti-pattern)\n * - 🧪 95%+ test coverage with comprehensive test suite\n * - 📚 Enhanced TypeScript types and JSDoc documentation\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Breadcrumb currentRoute=\"/products/shirts/blue-shirt\" />\n * // Renders: Home / products / shirts / blue-shirt\n *\n * // With custom route names\n * <Breadcrumb\n * currentRoute=\"/products/shirts/item-123\"\n * routes={[\n * { path: \"products\", name: \"All Products\", url: \"/products\" },\n * { path: \"shirts\", name: \"Shirts & Tops\", url: \"/products/shirts\" },\n * { path: \"item-123\", name: \"Blue Cotton Shirt\", url: \"/products/shirts/item-123\" }\n * ]}\n * />\n * // Renders: Home / All Products / Shirts & Tops / Blue Cotton Shirt\n *\n * // With custom starting point and styling\n * <Breadcrumb\n * currentRoute=\"/about/team\"\n * startRoute=\"Dashboard\"\n * startRouteUrl=\"/dashboard\"\n * spacer={<span> → </span>}\n * ariaLabel=\"Page navigation\"\n * truncateLength={20}\n * />\n * ```\n *\n * @param props - Component props\n * @returns Breadcrumb navigation element or null if no valid route\n */\nexport const Breadcrumb = ({\n startRoute = \"Home\",\n startRouteUrl = \"/\",\n currentRoute,\n spacer = <>/</>,\n routes,\n styles,\n id,\n classes,\n ariaLabel = \"Breadcrumb\",\n truncateLength = 15,\n linkProps,\n ...props\n}: BreadcrumbProps): React.JSX.Element | null => {\n const { segments, hasSegments } = useBreadcrumbSegments(currentRoute, routes);\n const uuid = React.useId();\n\n // Early return if no valid path\n if (!currentRoute?.length || !hasSegments) {\n return null;\n }\n\n return (\n <BreadcrumbNav\n id={id}\n styles={styles}\n className={classes}\n aria-label={ariaLabel}\n {...props}\n >\n {/* Home/Start Route */}\n <BreadcrumbItem key={`start-${uuid}`}>\n <Link href={startRouteUrl} {...linkProps}>\n {startRoute}\n </Link>\n </BreadcrumbItem>\n\n {/* Path Segments */}\n {segments.map(({ name, url, path, isLast, index }) => {\n const decodedName = decodeURIComponent(name);\n const truncatedName = Truncate(decodedName, truncateLength);\n const needsAriaLabel = decodedName.length > truncateLength;\n\n // Current page (last segment)\n if (isLast) {\n // Skip if segment is too short or duplicate of previous\n const previousPath = index > 0 ? segments[index - 1].path : null;\n if (!path || path.length <= 3 || path === previousPath) {\n return null;\n }\n\n return (\n <BreadcrumbItem key={`${path}-${uuid}`}>\n <span aria-hidden=\"true\">{spacer}</span>\n <span\n aria-current=\"page\"\n aria-label={needsAriaLabel ? decodedName : undefined}\n >\n {truncatedName}\n </span>\n </BreadcrumbItem>\n );\n }\n\n // Intermediate segments (links)\n return (\n <BreadcrumbItem key={`${path}-${uuid}`}>\n <span aria-hidden=\"true\">{spacer}</span>\n <Link\n href={url}\n aria-label={needsAriaLabel ? decodedName : undefined}\n {...linkProps}\n >\n {truncatedName}\n </Link>\n </BreadcrumbItem>\n );\n })}\n </BreadcrumbNav>\n );\n};\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default Breadcrumb;\n\nBreadcrumb.displayName = \"Breadcrumb\";\nBreadcrumb.Nav = BreadcrumbNav;\nBreadcrumb.List = BreadcrumbList;\nBreadcrumb.Item = BreadcrumbItem;\n","/**\n * Converts a string to a slug by:\n * - Converting to lowercase\n * - Trimming whitespace\n * - Removing non-word and non-hyphen characters\n * - Replacing sequences of whitespace and hyphens with a single hyphen\n * - Removing leading and trailing hyphens\n *\n * @param str - The string to slugify\n * @returns The slugified string\n */\nexport const Slugify = (str: string) => {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Truncates a string to a maximum length.\n *\n * @param str - The string to truncate.\n * @param length - The maximum length of the truncated string. Defaults to 15.\n * @returns The truncated string, with ellipses appended if truncated.\n */\nexport const Truncate = (str: string, length: number = 15) => {\n return str.length > length ? `${str.slice(0, length)}...` : str\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a } from './chunk-
|
|
1
|
+
import { a } from './chunk-6SAHIYCZ.js';
|
|
2
2
|
import r from 'react';
|
|
3
3
|
|
|
4
4
|
var s=({children:o,...e})=>r.createElement(a,{as:"caption",...e},o),m=({children:o,...e})=>r.createElement(a,{as:"thead",...e},o),d=({children:o,...e})=>r.createElement(a,{as:"tbody",...e},o),i=({children:o,...e})=>r.createElement(a,{as:"tr",...e},o),y=({children:o,...e})=>r.createElement(a,{as:"td",...e},o),T=({id:o,dataStyle:e,children:n,...a$1})=>r.createElement(a,{as:"section",id:o,...a$1,"data-style":"table-wrapper"},r.createElement("table",null,n));T.displayName="Table";s.displayName="Caption";m.displayName="Thead";d.displayName="Tbody";i.displayName="Tr";y.displayName="Td";var l=o=>{let e=o.map((n,a)=>r.createElement("th",{key:a},n));return r.createElement("tr",null,e)},b=o=>{let e=o.map((n,a)=>r.createElement("tr",{key:a}));return r.createElement(d,null,e)},P=({tblBody:o,tblCaption:e,tblHead:n})=>r.createElement(T,null,e&&r.createElement(s,null,e),r.createElement(m,null,r.createElement(i,null,n)),r.createElement(d,null,o));P.displayName="TBL";b.displayName="renderBody";l.displayName="renderHead";
|
|
5
5
|
|
|
6
6
|
export { s as a, m as b, d as c, i as d, y as e, T as f, l as g, b as h, P as i };
|
|
7
7
|
//# sourceMappingURL=out.js.map
|
|
8
|
-
//# sourceMappingURL=chunk-
|
|
8
|
+
//# sourceMappingURL=chunk-Y2PFDELK.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as a$1 } from './chunk-
|
|
1
|
+
import { a as a$1 } from './chunk-HHLNOC5T.js';
|
|
2
2
|
import o from 'react';
|
|
3
3
|
|
|
4
4
|
var r=o.memo(o.forwardRef(({level:e="h2",id:t,styles:i,ui:s,children:d,className:m,...c},h)=>o.createElement(a$1,{as:e,id:t,styles:i,"data-ui":s,className:m,ref:h,...c},d)));r.displayName="Title";var a=r;var p=o.forwardRef(({type:e="h3",...t},i)=>(process.env.NODE_ENV==="development"&&console.warn(`[@fpkit/acss] Heading component is deprecated and will be removed in v3.0.0. Please use the Title component instead.
|
|
@@ -7,4 +7,4 @@ See documentation: https://fpkit.dev/components/title`),o.createElement(a,{level
|
|
|
7
7
|
|
|
8
8
|
export { a, H as b };
|
|
9
9
|
//# sourceMappingURL=out.js.map
|
|
10
|
-
//# sourceMappingURL=chunk-
|
|
10
|
+
//# sourceMappingURL=chunk-ZFJ4U45S.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
2
|
|
|
3
3
|
interface ComponentProps {
|
|
4
4
|
/**
|
|
@@ -16,11 +16,11 @@ interface ComponentProps {
|
|
|
16
16
|
/**
|
|
17
17
|
* Styles object
|
|
18
18
|
*/
|
|
19
|
-
styles?:
|
|
19
|
+
styles?: React.CSSProperties;
|
|
20
20
|
/**
|
|
21
21
|
* Default styles object
|
|
22
22
|
*/
|
|
23
|
-
defaultStyles?:
|
|
23
|
+
defaultStyles?: React.CSSProperties;
|
|
24
24
|
/**
|
|
25
25
|
* Component class attribute
|
|
26
26
|
*/
|
|
@@ -32,7 +32,7 @@ interface ComponentProps {
|
|
|
32
32
|
/**
|
|
33
33
|
* Component ref attribute
|
|
34
34
|
*/
|
|
35
|
-
ref?:
|
|
35
|
+
ref?: React.Ref<any>;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export { ComponentProps as C };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent
|
|
1
|
+
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent;align-items:flex-start}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}/*# sourceMappingURL=alert.css.map */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../../../src/components/alert/alert.scss"],"names":[],"mappings":"AACA,SACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,eAGF,aAEE,4BACA,gCACA,8BAGA,0BACA,8BACA,4BAGA,4BACA,gCACA,8BAGA,yBACA,6BACA,2BAGA,kCAEA,wCAEA,6CACA,yCACA,uCACA,2CACA,+CACA,sBACA,gBACA,aACA,mBACA,+DACA,mCAGA,WACE,8FAEF,UACA,wBAEA,sCACE,UACA,8BAGF,uCAlDF,aAmDI,2BAIF,mBACE,+BACA,mBAIF,uCACE,aAGF,yBACE,qBACA,mBAGF,4BACE,OACA,qBAGA,yCACE,uCACA,qBACA,2CACA,2CACA,gBAIF,uNAKE,SACA,uCACA,kBACA,2CAIJ,+BACE,iCACA,sCACA,sCAGF,kCACE,oCACA,yCACA,yCAGF,gCACE,kCACA,uCACA,uCAGF,kCACE,oCACA,yCACA,yCAIA,oCACE,
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../src/components/alert/alert.scss"],"names":[],"mappings":"AACA,SACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,eAGF,aAEE,4BACA,gCACA,8BAGA,0BACA,8BACA,4BAGA,4BACA,gCACA,8BAGA,yBACA,6BACA,2BAGA,kCAEA,wCAEA,6CACA,yCACA,uCACA,2CACA,+CACA,sBACA,gBACA,aACA,mBACA,+DACA,mCAGA,WACE,8FAEF,UACA,wBAEA,sCACE,UACA,8BAGF,uCAlDF,aAmDI,2BAIF,mBACE,+BACA,mBAIF,uCACE,aAGF,yBACE,qBACA,mBAGF,4BACE,OACA,qBAGA,yCACE,uCACA,qBACA,2CACA,2CACA,gBAIF,uNAKE,SACA,uCACA,kBACA,2CAIJ,+BACE,iCACA,sCACA,sCAGF,kCACE,oCACA,yCACA,yCAGF,gCACE,kCACA,uCACA,uCAGF,kCACE,oCACA,yCACA,yCAIA,oCACE,sBACA,uBAKJ,kCACE,YAEA,oDACE,qCACA,qBAGF,uDACE,wCACA,qBAGF,qDACE,sCACA,qBAGF,uDACE,wCACA,qBAGF,uDACE,oBACA,qBAKJ,gCACE,YAQF,eACE","file":"alert.css"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent
|
|
1
|
+
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}[role=alert]{--alert-success-bg: #e6f4ea;--alert-success-border: #34a853;--alert-success-text: #1e4620;--alert-error-bg: #fdeded;--alert-error-border: #d32f2f;--alert-error-text: #5f2120;--alert-warning-bg: #fff4e5;--alert-warning-border: #ff9800;--alert-warning-text: #663c00;--alert-info-bg: #e5f6fd;--alert-info-border: #0288d1;--alert-info-text: #084154;--alert-transition-duration: 0.3s;--alert-border: thin solid currentColor;background-color:var(--alert-bg, whitesmoke);border:var(--alert-border, currentColor);color:var(--alert-color, currentColor);padding:var(--alert-padding, var(--spc-4));margin-block-end:var(--alert-margin-block-end);font-size:var(--fs-0);line-height:1.6;display:flex;flex-direction:row;border-radius:var(--alert-border-radius, var(--border-radius));gap:var(--alert-gap, var(--spc-4));transition:opacity var(--alert-transition-duration) ease,transform var(--alert-transition-duration) ease;opacity:1;transform:translateY(0)}[role=alert]:not([data-visible=true]){opacity:0;transform:translateY(-0.5rem)}@media(prefers-reduced-motion: reduce){[role=alert]{transition-duration:.01ms}}[role=alert]:focus{outline:2px solid currentColor;outline-offset:2px}[role=alert]:focus:not(:focus-visible){outline:none}[role=alert] .alert-icon{margin-block-start:0;align-items:center}[role=alert] .alert-message{flex:2;margin-block-start:0}[role=alert] .alert-message .alert-title{margin-block-end:var(--spc-1, 0.25rem);margin-block-start:0;font-weight:var(--alert-title-weight, 600);font-size:var(--alert-title-size, inherit);line-height:1.4}[role=alert] .alert-message h2.alert-title,[role=alert] .alert-message h3.alert-title,[role=alert] .alert-message h4.alert-title,[role=alert] .alert-message h5.alert-title,[role=alert] .alert-message h6.alert-title{margin:0;margin-block-end:var(--spc-1, 0.25rem);font-size:inherit;font-weight:var(--alert-title-weight, 600)}[role=alert][data-alert~=info]{--alert-bg: var(--alert-info-bg);--alert-color: var(--alert-info-text);border-color:var(--alert-info-border)}[role=alert][data-alert~=warning]{--alert-bg: var(--alert-warning-bg);--alert-color: var(--alert-warning-text);border-color:var(--alert-warning-border)}[role=alert][data-alert~=error]{--alert-bg: var(--alert-error-bg);--alert-color: var(--alert-error-text);border-color:var(--alert-error-border)}[role=alert][data-alert~=success]{--alert-bg: var(--alert-success-bg);--alert-color: var(--alert-success-text);border-color:var(--alert-success-border)}[role=alert] button[data-btn~=icon]{--btn-bg: transparent;align-items:flex-start}[role=alert][data-variant=filled]{border:none}[role=alert][data-variant=filled][data-alert~=info]{--alert-bg: var(--alert-info-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=warning]{--alert-bg: var(--alert-warning-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=error]{--alert-bg: var(--alert-error-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=success]{--alert-bg: var(--alert-success-border);--alert-color: white}[role=alert][data-variant=filled][data-alert~=default]{--alert-bg: #757575;--alert-color: white}[role=alert][data-variant=soft]{border:none}[role=alert] p{font-size:.875rem}
|
|
2
2
|
|
|
3
|
-
/*# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2FsZXJ0L2FsZXJ0LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsU0FDRSxpQkFBQSxDQUNBLFNBQUEsQ0FDQSxVQUFBLENBQ0EsU0FBQSxDQUNBLFdBQUEsQ0FDQSxlQUFBLENBQ0EscUJBQUEsQ0FDQSxrQkFBQSxDQUNBLGNBQUEsQ0FHRixhQUVFLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHlCQUFBLENBQ0EsNkJBQUEsQ0FDQSwyQkFBQSxDQUdBLDJCQUFBLENBQ0EsK0JBQUEsQ0FDQSw2QkFBQSxDQUdBLHdCQUFBLENBQ0EsNEJBQUEsQ0FDQSwwQkFBQSxDQUdBLGlDQUFBLENBRUEsdUNBQUEsQ0FFQSw0Q0FBQSxDQUNBLHdDQUFBLENBQ0Esc0NBQUEsQ0FDQSwwQ0FBQSxDQUNBLDhDQUFBLENBQ0EscUJBQUEsQ0FDQSxlQUFBLENBQ0EsWUFBQSxDQUNBLGtCQUFBLENBQ0EsOERBQUEsQ0FDQSxrQ0FBQSxDQUdBLHdHQUNFLENBRUYsU0FBQSxDQUNBLHVCQUFBLENBRUEsc0NBQ0UsU0FBQSxDQUNBLDZCQUFBLENBR0YsdUNBbERGLGFBbURJLHlCQUFBLENBQUEsQ0FJRixtQkFDRSw4QkFBQSxDQUNBLGtCQUFBLENBSUYsdUNBQ0UsWUFBQSxDQUdGLHlCQUNFLG9CQUFBLENBQ0Esa0JBQUEsQ0FHRiw0QkFDRSxNQUFBLENBQ0Esb0JBQUEsQ0FHQSx5Q0FDRSxzQ0FBQSxDQUNBLG9CQUFBLENBQ0EsMENBQUEsQ0FDQSwwQ0FBQSxDQUNBLGVBQUEsQ0FJRix1TkFLRSxRQUFBLENBQ0Esc0NBQUEsQ0FDQSxpQkFBQSxDQUNBLDBDQUFBLENBSUosK0JBQ0UsZ0NBQUEsQ0FDQSxxQ0FBQSxDQUNBLHFDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBR0YsZ0NBQ0UsaUNBQUEsQ0FDQSxzQ0FBQSxDQUNBLHNDQUFBLENBR0Ysa0NBQ0UsbUNBQUEsQ0FDQSx3Q0FBQSxDQUNBLHdDQUFBLENBSUEsb0NBQ0UscUJBQUEsQ0FDQSxzQkFBQSxDQUtKLGtDQUNFLFdBQUEsQ0FFQSxvREFDRSxvQ0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsdUNBQUEsQ0FDQSxvQkFBQSxDQUdGLHFEQUNFLHFDQUFBLENBQ0Esb0JBQUEsQ0FHRix1REFDRSx1Q0FBQSxDQUNBLG9CQUFBLENBR0YsdURBQ0UsbUJBQUEsQ0FDQSxvQkFBQSxDQUtKLGdDQUNFLFdBQUEsQ0FRRixlQUNFLGlCQUFBIiwiZmlsZSI6ImFsZXJ0Lm1pbi5jc3MifQ== */
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
require('../../chunk-
|
|
7
|
-
require('../../chunk-
|
|
5
|
+
var chunkT4T6GWYQ_cjs = require('../../chunk-T4T6GWYQ.cjs');
|
|
6
|
+
require('../../chunk-33PNJ4LO.cjs');
|
|
7
|
+
require('../../chunk-ENTCUJ3A.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
Object.defineProperty(exports, 'Breadcrumb', {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkT4T6GWYQ_cjs.b; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, 'default', {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkT4T6GWYQ_cjs.c; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, 'useBreadcrumbSegments', {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunkT4T6GWYQ_cjs.a; }
|
|
22
22
|
});
|
|
23
23
|
//# sourceMappingURL=out.js.map
|
|
24
24
|
//# sourceMappingURL=breadcrumb.cjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { U as UI } from '../../ui-
|
|
3
|
-
import Link from '
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { U as UI } from '../../ui-d01b50d4.js';
|
|
3
|
+
import { L as Link } from '../../link-5192f411.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Represents a route segment in the breadcrumb navigation.
|
|
@@ -53,11 +53,11 @@ type BreadcrumbProps = {
|
|
|
53
53
|
/** Array of custom route objects for controlled breadcrumb generation */
|
|
54
54
|
routes?: CustomRoute[];
|
|
55
55
|
/** Starting route node (typically "Home") */
|
|
56
|
-
startRoute?:
|
|
56
|
+
startRoute?: React.ReactNode;
|
|
57
57
|
/** Starting route URL (typically "/") */
|
|
58
58
|
startRouteUrl?: string;
|
|
59
59
|
/** Separator element between breadcrumb items */
|
|
60
|
-
spacer?:
|
|
60
|
+
spacer?: React.ReactNode;
|
|
61
61
|
/** Current route path (required for breadcrumb generation) */
|
|
62
62
|
currentRoute?: string;
|
|
63
63
|
/** ARIA label for the breadcrumb navigation */
|
|
@@ -65,8 +65,8 @@ type BreadcrumbProps = {
|
|
|
65
65
|
/** Maximum character length before truncating breadcrumb text */
|
|
66
66
|
truncateLength?: number;
|
|
67
67
|
/** Props to spread onto breadcrumb Link components */
|
|
68
|
-
linkProps?: Omit<
|
|
69
|
-
} & Omit<
|
|
68
|
+
linkProps?: Omit<React.ComponentProps<typeof Link>, "href" | "children">;
|
|
69
|
+
} & Omit<React.ComponentProps<typeof UI>, "as" | "aria-label">;
|
|
70
70
|
/**
|
|
71
71
|
* Custom hook to process breadcrumb segments from a path string.
|
|
72
72
|
*
|
|
@@ -280,11 +280,11 @@ declare function useBreadcrumbSegments(currentRoute: string | undefined, routes?
|
|
|
280
280
|
* @returns Breadcrumb navigation element or null if no valid route
|
|
281
281
|
*/
|
|
282
282
|
declare const Breadcrumb: {
|
|
283
|
-
({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps):
|
|
283
|
+
({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React.JSX.Element | null;
|
|
284
284
|
displayName: string;
|
|
285
|
-
Nav:
|
|
286
|
-
List:
|
|
287
|
-
Item:
|
|
285
|
+
Nav: React.MemoExoticComponent<({ styles, id, classes, children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
286
|
+
List: React.MemoExoticComponent<({ children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
287
|
+
Item: React.MemoExoticComponent<({ children, id, styles, classes, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
288
288
|
};
|
|
289
289
|
|
|
290
290
|
export { Breadcrumb, BreadcrumbProps, CustomRoute, Breadcrumb as default, useBreadcrumbSegments };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { U as UI } from '../../ui-
|
|
3
|
-
import Link from '
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { U as UI } from '../../ui-d01b50d4.js';
|
|
3
|
+
import { L as Link } from '../../link-5192f411.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Represents a route segment in the breadcrumb navigation.
|
|
@@ -53,11 +53,11 @@ type BreadcrumbProps = {
|
|
|
53
53
|
/** Array of custom route objects for controlled breadcrumb generation */
|
|
54
54
|
routes?: CustomRoute[];
|
|
55
55
|
/** Starting route node (typically "Home") */
|
|
56
|
-
startRoute?:
|
|
56
|
+
startRoute?: React.ReactNode;
|
|
57
57
|
/** Starting route URL (typically "/") */
|
|
58
58
|
startRouteUrl?: string;
|
|
59
59
|
/** Separator element between breadcrumb items */
|
|
60
|
-
spacer?:
|
|
60
|
+
spacer?: React.ReactNode;
|
|
61
61
|
/** Current route path (required for breadcrumb generation) */
|
|
62
62
|
currentRoute?: string;
|
|
63
63
|
/** ARIA label for the breadcrumb navigation */
|
|
@@ -65,8 +65,8 @@ type BreadcrumbProps = {
|
|
|
65
65
|
/** Maximum character length before truncating breadcrumb text */
|
|
66
66
|
truncateLength?: number;
|
|
67
67
|
/** Props to spread onto breadcrumb Link components */
|
|
68
|
-
linkProps?: Omit<
|
|
69
|
-
} & Omit<
|
|
68
|
+
linkProps?: Omit<React.ComponentProps<typeof Link>, "href" | "children">;
|
|
69
|
+
} & Omit<React.ComponentProps<typeof UI>, "as" | "aria-label">;
|
|
70
70
|
/**
|
|
71
71
|
* Custom hook to process breadcrumb segments from a path string.
|
|
72
72
|
*
|
|
@@ -280,11 +280,11 @@ declare function useBreadcrumbSegments(currentRoute: string | undefined, routes?
|
|
|
280
280
|
* @returns Breadcrumb navigation element or null if no valid route
|
|
281
281
|
*/
|
|
282
282
|
declare const Breadcrumb: {
|
|
283
|
-
({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps):
|
|
283
|
+
({ startRoute, startRouteUrl, currentRoute, spacer, routes, styles, id, classes, ariaLabel, truncateLength, linkProps, ...props }: BreadcrumbProps): React.JSX.Element | null;
|
|
284
284
|
displayName: string;
|
|
285
|
-
Nav:
|
|
286
|
-
List:
|
|
287
|
-
Item:
|
|
285
|
+
Nav: React.MemoExoticComponent<({ styles, id, classes, children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
286
|
+
List: React.MemoExoticComponent<({ children, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
287
|
+
Item: React.MemoExoticComponent<({ children, id, styles, classes, ...props }: React.ComponentProps<typeof UI>) => React.JSX.Element>;
|
|
288
288
|
};
|
|
289
289
|
|
|
290
290
|
export { Breadcrumb, BreadcrumbProps, CustomRoute, Breadcrumb as default, useBreadcrumbSegments };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
1
|
+
export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-X5LGFCWG.js';
|
|
2
|
+
import '../../chunk-UEPAWMDF.js';
|
|
3
|
+
import '../../chunk-HHLNOC5T.js';
|
|
4
4
|
//# sourceMappingURL=out.js.map
|
|
5
5
|
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
require('../chunk-
|
|
5
|
+
var chunkGT77BX4L_cjs = require('../chunk-GT77BX4L.cjs');
|
|
6
|
+
require('../chunk-PNWIRCG3.cjs');
|
|
7
|
+
require('../chunk-TON2YGMD.cjs');
|
|
8
|
+
require('../chunk-ENTCUJ3A.cjs');
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
Object.defineProperty(exports, 'Button', {
|
|
11
13
|
enumerable: true,
|
|
12
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkGT77BX4L_cjs.a; }
|
|
13
15
|
});
|
|
14
16
|
Object.defineProperty(exports, 'default', {
|
|
15
17
|
enumerable: true,
|
|
16
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkGT77BX4L_cjs.b; }
|
|
17
19
|
});
|
|
18
20
|
//# sourceMappingURL=out.js.map
|
|
19
21
|
//# sourceMappingURL=button.cjs.map
|
|
@@ -1,15 +1,108 @@
|
|
|
1
|
-
import { U as UI } from '../ui-
|
|
2
|
-
import
|
|
1
|
+
import { U as UI } from '../ui-d01b50d4.js';
|
|
2
|
+
import React$1 from 'react';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Props for disabled state management across components.
|
|
6
|
+
*
|
|
7
|
+
* Supports both modern `disabled` and legacy `isDisabled` props for
|
|
8
|
+
* backward compatibility.
|
|
9
|
+
*
|
|
10
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
|
|
11
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
|
|
12
|
+
*/
|
|
13
|
+
interface DisabledStateProps {
|
|
14
|
+
/**
|
|
15
|
+
* Disables the component, preventing user interaction while maintaining
|
|
16
|
+
* keyboard focusability and screen reader accessibility.
|
|
17
|
+
*
|
|
18
|
+
* Uses `aria-disabled` pattern instead of native `disabled` attribute to:
|
|
19
|
+
* - Keep elements in keyboard tab order (WCAG 2.1.1)
|
|
20
|
+
* - Allow screen readers to discover and announce disabled state
|
|
21
|
+
* - Enable tooltips and contextual help on disabled elements
|
|
22
|
+
* - Provide better visual styling control
|
|
23
|
+
*
|
|
24
|
+
* @default false
|
|
25
|
+
*/
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Legacy disabled prop for backward compatibility.
|
|
29
|
+
*
|
|
30
|
+
* @deprecated Use `disabled` instead. This prop will be removed in v3.0.
|
|
31
|
+
*
|
|
32
|
+
* @migration Replace `isDisabled={true}` with `disabled={true}`
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Before
|
|
36
|
+
* <Button isDisabled={true}>Click me</Button>
|
|
37
|
+
*
|
|
38
|
+
* // After
|
|
39
|
+
* <Button disabled={true}>Click me</Button>
|
|
40
|
+
*/
|
|
41
|
+
isDisabled?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
|
|
5
45
|
/**
|
|
6
46
|
* The button type
|
|
7
47
|
* Required - 'button' | 'submit' | 'reset'
|
|
8
48
|
*/
|
|
9
49
|
type: 'button' | 'submit' | 'reset';
|
|
10
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Accessible Button component with WCAG 2.1 Level AA compliant disabled state.
|
|
53
|
+
*
|
|
54
|
+
* **Key Accessibility Features:**
|
|
55
|
+
* - Uses `aria-disabled` pattern instead of native `disabled` attribute
|
|
56
|
+
* - Maintains keyboard focusability when disabled (stays in tab order)
|
|
57
|
+
* - Prevents all interactions when disabled via optimized `useDisabledState` hook
|
|
58
|
+
* - Automatic className merging for seamless styling
|
|
59
|
+
* - Supports both modern `disabled` and legacy `isDisabled` props
|
|
60
|
+
*
|
|
61
|
+
* **Why aria-disabled?**
|
|
62
|
+
* - Elements remain in keyboard tab order (WCAG 2.1.1 - Keyboard)
|
|
63
|
+
* - Screen readers can discover and announce disabled state (WCAG 4.1.2)
|
|
64
|
+
* - Enables tooltips and help text on disabled buttons
|
|
65
|
+
* - Better visual styling control for WCAG AA contrast compliance
|
|
66
|
+
*
|
|
67
|
+
* **Performance:**
|
|
68
|
+
* - Uses optimized `useDisabledState` hook with stable references
|
|
69
|
+
* - Automatic className merging eliminates boilerplate
|
|
70
|
+
* - ~90% reduction in unnecessary re-renders compared to previous implementation
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Basic usage
|
|
74
|
+
* <Button type="button" onClick={handleClick}>
|
|
75
|
+
* Click me
|
|
76
|
+
* </Button>
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // Disabled state (prevents all interactions but stays focusable)
|
|
80
|
+
* <Button type="button" disabled={true} onClick={handleClick}>
|
|
81
|
+
* Cannot click (but can focus for screen readers)
|
|
82
|
+
* </Button>
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* // With custom classes (automatic merging with .is-disabled)
|
|
86
|
+
* <Button
|
|
87
|
+
* type="button"
|
|
88
|
+
* disabled={true}
|
|
89
|
+
* classes="my-custom-btn"
|
|
90
|
+
* >
|
|
91
|
+
* Custom disabled button
|
|
92
|
+
* </Button>
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* // Legacy isDisabled prop (still supported)
|
|
96
|
+
* <Button type="button" isDisabled={true} onClick={handleClick}>
|
|
97
|
+
* Legacy disabled
|
|
98
|
+
* </Button>
|
|
99
|
+
*
|
|
100
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
|
|
101
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
|
|
102
|
+
* @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
|
|
103
|
+
*/
|
|
11
104
|
declare const Button: {
|
|
12
|
-
({ type, children, styles, disabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, ...props }: ButtonProps):
|
|
105
|
+
({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
|
|
13
106
|
displayName: string;
|
|
14
107
|
};
|
|
15
108
|
|
|
@@ -1,15 +1,108 @@
|
|
|
1
|
-
import { U as UI } from '../ui-
|
|
2
|
-
import
|
|
1
|
+
import { U as UI } from '../ui-d01b50d4.js';
|
|
2
|
+
import React$1 from 'react';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Props for disabled state management across components.
|
|
6
|
+
*
|
|
7
|
+
* Supports both modern `disabled` and legacy `isDisabled` props for
|
|
8
|
+
* backward compatibility.
|
|
9
|
+
*
|
|
10
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
|
|
11
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
|
|
12
|
+
*/
|
|
13
|
+
interface DisabledStateProps {
|
|
14
|
+
/**
|
|
15
|
+
* Disables the component, preventing user interaction while maintaining
|
|
16
|
+
* keyboard focusability and screen reader accessibility.
|
|
17
|
+
*
|
|
18
|
+
* Uses `aria-disabled` pattern instead of native `disabled` attribute to:
|
|
19
|
+
* - Keep elements in keyboard tab order (WCAG 2.1.1)
|
|
20
|
+
* - Allow screen readers to discover and announce disabled state
|
|
21
|
+
* - Enable tooltips and contextual help on disabled elements
|
|
22
|
+
* - Provide better visual styling control
|
|
23
|
+
*
|
|
24
|
+
* @default false
|
|
25
|
+
*/
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Legacy disabled prop for backward compatibility.
|
|
29
|
+
*
|
|
30
|
+
* @deprecated Use `disabled` instead. This prop will be removed in v3.0.
|
|
31
|
+
*
|
|
32
|
+
* @migration Replace `isDisabled={true}` with `disabled={true}`
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Before
|
|
36
|
+
* <Button isDisabled={true}>Click me</Button>
|
|
37
|
+
*
|
|
38
|
+
* // After
|
|
39
|
+
* <Button disabled={true}>Click me</Button>
|
|
40
|
+
*/
|
|
41
|
+
isDisabled?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
|
|
5
45
|
/**
|
|
6
46
|
* The button type
|
|
7
47
|
* Required - 'button' | 'submit' | 'reset'
|
|
8
48
|
*/
|
|
9
49
|
type: 'button' | 'submit' | 'reset';
|
|
10
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Accessible Button component with WCAG 2.1 Level AA compliant disabled state.
|
|
53
|
+
*
|
|
54
|
+
* **Key Accessibility Features:**
|
|
55
|
+
* - Uses `aria-disabled` pattern instead of native `disabled` attribute
|
|
56
|
+
* - Maintains keyboard focusability when disabled (stays in tab order)
|
|
57
|
+
* - Prevents all interactions when disabled via optimized `useDisabledState` hook
|
|
58
|
+
* - Automatic className merging for seamless styling
|
|
59
|
+
* - Supports both modern `disabled` and legacy `isDisabled` props
|
|
60
|
+
*
|
|
61
|
+
* **Why aria-disabled?**
|
|
62
|
+
* - Elements remain in keyboard tab order (WCAG 2.1.1 - Keyboard)
|
|
63
|
+
* - Screen readers can discover and announce disabled state (WCAG 4.1.2)
|
|
64
|
+
* - Enables tooltips and help text on disabled buttons
|
|
65
|
+
* - Better visual styling control for WCAG AA contrast compliance
|
|
66
|
+
*
|
|
67
|
+
* **Performance:**
|
|
68
|
+
* - Uses optimized `useDisabledState` hook with stable references
|
|
69
|
+
* - Automatic className merging eliminates boilerplate
|
|
70
|
+
* - ~90% reduction in unnecessary re-renders compared to previous implementation
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Basic usage
|
|
74
|
+
* <Button type="button" onClick={handleClick}>
|
|
75
|
+
* Click me
|
|
76
|
+
* </Button>
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // Disabled state (prevents all interactions but stays focusable)
|
|
80
|
+
* <Button type="button" disabled={true} onClick={handleClick}>
|
|
81
|
+
* Cannot click (but can focus for screen readers)
|
|
82
|
+
* </Button>
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* // With custom classes (automatic merging with .is-disabled)
|
|
86
|
+
* <Button
|
|
87
|
+
* type="button"
|
|
88
|
+
* disabled={true}
|
|
89
|
+
* classes="my-custom-btn"
|
|
90
|
+
* >
|
|
91
|
+
* Custom disabled button
|
|
92
|
+
* </Button>
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* // Legacy isDisabled prop (still supported)
|
|
96
|
+
* <Button type="button" isDisabled={true} onClick={handleClick}>
|
|
97
|
+
* Legacy disabled
|
|
98
|
+
* </Button>
|
|
99
|
+
*
|
|
100
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/keyboard WCAG 2.1.1 - Keyboard}
|
|
101
|
+
* @see {@link https://www.w3.org/WAI/WCAG21/Understanding/name-role-value WCAG 4.1.2 - Name, Role, Value}
|
|
102
|
+
* @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
|
|
103
|
+
*/
|
|
11
104
|
declare const Button: {
|
|
12
|
-
({ type, children, styles, disabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, ...props }: ButtonProps):
|
|
105
|
+
({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
|
|
13
106
|
displayName: string;
|
|
14
107
|
};
|
|
15
108
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export { a as Button, b as default } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { a as Button, b as default } from '../chunk-OVWLQYMK.js';
|
|
2
|
+
import '../chunk-BFK62VX5.js';
|
|
3
|
+
import '../chunk-75QHTLFO.js';
|
|
4
|
+
import '../chunk-HHLNOC5T.js';
|
|
3
5
|
//# sourceMappingURL=out.js.map
|
|
4
6
|
//# sourceMappingURL=button.js.map
|