@fpkit/acss 0.5.12 → 0.5.13
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-DV56L5YX.cjs → chunk-2LTJ7HHX.cjs} +4 -4
- package/libs/{chunk-EQ67LF46.js → chunk-2Y7W75TT.js} +3 -3
- package/libs/{chunk-KKLTUJFB.cjs → chunk-3MKLDCKQ.cjs} +5 -5
- package/libs/chunk-3MKLDCKQ.cjs.map +1 -0
- package/libs/{chunk-X3EVB7VS.cjs → chunk-5S4ORA4C.cjs} +3 -3
- package/libs/{chunk-O6QZBB6G.js → chunk-772NRB75.js} +5 -5
- package/libs/chunk-772NRB75.js.map +1 -0
- package/libs/{chunk-6BVXFW7U.cjs → chunk-AHDJGCG5.cjs} +3 -3
- package/libs/{chunk-E3XP6BEX.cjs → chunk-B7F5FS6D.cjs} +3 -3
- package/libs/chunk-D4YLRWAO.cjs +18 -0
- package/libs/chunk-D4YLRWAO.cjs.map +1 -0
- package/libs/chunk-ETFLFC2S.js +10 -0
- package/libs/chunk-ETFLFC2S.js.map +1 -0
- package/libs/chunk-GZ4QFPRY.js +9 -0
- package/libs/chunk-GZ4QFPRY.js.map +1 -0
- package/libs/{chunk-LHVJKDMA.cjs → chunk-J32EZPYD.cjs} +3 -3
- package/libs/chunk-JJ43O4Y5.js +8 -0
- package/libs/chunk-JJ43O4Y5.js.map +1 -0
- package/libs/chunk-KUKIVRC2.js +7 -0
- package/libs/chunk-KUKIVRC2.js.map +1 -0
- package/libs/chunk-L75OQKEI.cjs +13 -0
- package/libs/chunk-L75OQKEI.cjs.map +1 -0
- package/libs/{chunk-LL7HTLMS.cjs → chunk-M5RRNTVX.cjs} +3 -3
- package/libs/{chunk-LIQJ7ZZR.js → chunk-NGTJDDFO.js} +2 -2
- package/libs/chunk-OK5QEIMD.cjs +17 -0
- package/libs/chunk-OK5QEIMD.cjs.map +1 -0
- package/libs/chunk-P2DC76ZZ.cjs +18 -0
- package/libs/chunk-P2DC76ZZ.cjs.map +1 -0
- package/libs/chunk-PQ2K3BM6.cjs +17 -0
- package/libs/chunk-PQ2K3BM6.cjs.map +1 -0
- package/libs/{chunk-QCMV4VQZ.js → chunk-QLZWHAMK.js} +2 -2
- package/libs/{chunk-BIP2NY53.js → chunk-RIVUMPOG.js} +2 -2
- package/libs/{chunk-ICCKQ2GC.cjs → chunk-ROZI23GS.cjs} +4 -4
- package/libs/{chunk-NHYXGV3L.js → chunk-SMYRLO3E.js} +2 -2
- package/libs/{chunk-5ZM4XL44.js → chunk-TYRCEX2L.js} +2 -2
- package/libs/chunk-VUH3FXGJ.js +11 -0
- package/libs/chunk-VUH3FXGJ.js.map +1 -0
- package/libs/{chunk-PPOOBUOS.js → chunk-XBA562WW.js} +2 -2
- package/libs/{chunk-QVV34QEH.cjs → chunk-XTQKWY7W.cjs} +3 -3
- package/libs/{chunk-YWOYVRFT.js → chunk-ZANSFMTD.js} +3 -3
- 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 +271 -32
- package/libs/components/breadcrumbs/breadcrumb.d.ts +271 -32
- package/libs/components/breadcrumbs/breadcrumb.js +3 -3
- package/libs/components/button.cjs +4 -4
- package/libs/components/button.d.cts +2 -2
- package/libs/components/button.d.ts +2 -2
- package/libs/components/button.js +2 -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 +277 -33
- package/libs/components/card.d.ts +277 -33
- 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 +7 -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 +5 -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 +2 -2
- package/libs/components/form/fields.d.ts +2 -2
- package/libs/components/form/fields.js +2 -2
- package/libs/components/form/textarea.cjs +4 -4
- package/libs/components/form/textarea.d.cts +2 -2
- package/libs/components/form/textarea.d.ts +2 -2
- package/libs/components/form/textarea.js +2 -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 +148 -4
- package/libs/components/icons/icon.d.ts +148 -4
- 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.d.cts +2 -2
- package/libs/components/link/link.d.ts +2 -2
- package/libs/components/link/link.js +2 -2
- package/libs/components/list/list.cjs +5 -5
- package/libs/components/list/list.d.cts +3 -3
- package/libs/components/list/list.d.ts +3 -3
- package/libs/components/list/list.js +2 -2
- package/libs/components/modal.cjs +4 -4
- package/libs/components/modal.js +3 -3
- package/libs/components/nav/nav.cjs +7 -7
- package/libs/components/nav/nav.d.cts +2 -2
- package/libs/components/nav/nav.d.ts +2 -2
- package/libs/components/nav/nav.js +3 -3
- package/libs/components/text/text.cjs +5 -5
- package/libs/components/text/text.d.cts +2 -2
- package/libs/components/text/text.d.ts +2 -2
- package/libs/components/text/text.js +2 -2
- package/libs/heading-3648c538.d.ts +250 -0
- package/libs/hooks.cjs +7 -0
- package/libs/hooks.d.cts +5 -0
- package/libs/hooks.d.ts +5 -0
- package/libs/hooks.js +3 -0
- package/libs/icons.cjs +3 -3
- package/libs/icons.d.cts +1 -1
- package/libs/icons.d.ts +1 -1
- package/libs/icons.js +2 -2
- package/libs/index.cjs +112 -91
- 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 +515 -31
- package/libs/index.d.ts +515 -31
- package/libs/index.js +31 -19
- package/libs/index.js.map +1 -1
- package/libs/ui-645f95b5.d.ts +285 -0
- package/package.json +2 -83
- 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 +113 -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 +427 -170
- package/src/components/buttons/button.scss +34 -31
- package/src/components/buttons/button.stories.tsx +35 -0
- 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-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/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/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 +266 -15
- package/src/components/word-count/README.md +240 -0
- package/src/hooks.ts +1 -0
- package/src/index.ts +10 -2
- package/src/sass/_properties.scss +1 -0
- package/src/styles/alert/alert.css +94 -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 +240 -51
- package/src/styles/index.css.map +1 -1
- package/src/test/setup.d.ts +9 -0
- package/src/test/setup.ts +53 -1
- package/libs/chunk-6TE5QEVE.cjs +0 -13
- 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-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-ECLD37WN.cjs +0 -16
- package/libs/chunk-ECLD37WN.cjs.map +0 -1
- package/libs/chunk-HYBZBN4G.js +0 -8
- package/libs/chunk-HYBZBN4G.js.map +0 -1
- package/libs/chunk-KKLTUJFB.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-O6QZBB6G.js.map +0 -1
- package/libs/chunk-SXVZSWX6.js +0 -11
- package/libs/chunk-SXVZSWX6.js.map +0 -1
- 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-DV56L5YX.cjs.map → chunk-2LTJ7HHX.cjs.map} +0 -0
- /package/libs/{chunk-EQ67LF46.js.map → chunk-2Y7W75TT.js.map} +0 -0
- /package/libs/{chunk-X3EVB7VS.cjs.map → chunk-5S4ORA4C.cjs.map} +0 -0
- /package/libs/{chunk-6BVXFW7U.cjs.map → chunk-AHDJGCG5.cjs.map} +0 -0
- /package/libs/{chunk-E3XP6BEX.cjs.map → chunk-B7F5FS6D.cjs.map} +0 -0
- /package/libs/{chunk-LHVJKDMA.cjs.map → chunk-J32EZPYD.cjs.map} +0 -0
- /package/libs/{chunk-LL7HTLMS.cjs.map → chunk-M5RRNTVX.cjs.map} +0 -0
- /package/libs/{chunk-LIQJ7ZZR.js.map → chunk-NGTJDDFO.js.map} +0 -0
- /package/libs/{chunk-QCMV4VQZ.js.map → chunk-QLZWHAMK.js.map} +0 -0
- /package/libs/{chunk-BIP2NY53.js.map → chunk-RIVUMPOG.js.map} +0 -0
- /package/libs/{chunk-ICCKQ2GC.cjs.map → chunk-ROZI23GS.cjs.map} +0 -0
- /package/libs/{chunk-NHYXGV3L.js.map → chunk-SMYRLO3E.js.map} +0 -0
- /package/libs/{chunk-5ZM4XL44.js.map → chunk-TYRCEX2L.js.map} +0 -0
- /package/libs/{chunk-PPOOBUOS.js.map → chunk-XBA562WW.js.map} +0 -0
- /package/libs/{chunk-QVV34QEH.cjs.map → chunk-XTQKWY7W.cjs.map} +0 -0
- /package/libs/{chunk-YWOYVRFT.js.map → chunk-ZANSFMTD.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/icons/components/code.tsx","../src/components/icons/components/svg.tsx","../src/components/icons/components/home.tsx","../src/components/icons/components/add.tsx","../src/components/icons/components/arrow-left.tsx","../src/components/icons/components/chat.tsx","../src/components/icons/components/arrow-down.tsx","../src/components/icons/components/arrow-up.tsx","../src/components/icons/components/arrow-right.tsx","../src/components/icons/components/user.tsx","../src/components/icons/components/right.tsx","../src/components/icons/components/left.tsx","../src/components/icons/components/minus.tsx","../src/components/icons/components/remove.tsx","../src/components/icons/components/copy.tsx","../src/components/icons/components/up.tsx","../src/components/icons/components/down.tsx","../src/components/icons/components/star.tsx","../src/components/icons/components/play.tsx","../src/components/icons/components/pause.tsx","../src/components/icons/components/resume.tsx","../src/components/icons/components/stop.tsx","../src/components/icons/components/stop-solid.tsx","../src/components/icons/components/play-solid.tsx","../src/components/icons/components/pause-solid.tsx","../src/components/icons/components/resume-solid.tsx","../src/components/icons/components/info.tsx","../src/components/icons/components/alert-solid.tsx","../src/components/icons/components/info-solid.tsx","../src/components/icons/components/question-solid.tsx","../src/components/icons/components/warn-solid.tsx","../src/components/icons/components/success-solid.tsx","../src/components/icons/components/alert-square-solid.tsx","../src/components/icons/icon.tsx"],"names":["React","defaultStyes","Svg","fill","strokeColor","styles","size","role","alt","children","props","svg_default","defaultStyles","Code","Home","Add","ArrowLeft","Chat","ArrowDown","ArrowUp","ArrowRight","User","Right","Left","Minus","Remove","Copy","Up","Down","Star","Play","Pause","Resume","Stop","StopSolid","PlaySolid","PauseSolid","ResumeSolid","Info","AlertSolid","InfoSolid","QuestionSolid","WarnSolid","SuccessSolid","AlertSquareSolid","Icon","id","classes","ariaHidden","ariaLabel","ui_default","icon_default"],"mappings":"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","sourcesContent":["import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\nexport const Code = ({\n strokeColor = 'currentColor',\n fill = 'none',\n size = 16,\n styles,\n role = 'img',\n alt = 'Code icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n> = {}) => {\n return (\n <Svg size={size} role={role} alt={alt} styles={styles} {...props}>\n <g\n fill={fill}\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <rect\n height=\"22\"\n width=\"18\"\n fill=\"none\"\n stroke={strokeColor}\n x=\"3\"\n y=\"1\"\n />\n <polyline fill=\"none\" points=\"9 9 6 12 9 15\" />\n <polyline fill=\"none\" points=\"15 15 18 12 15 9\" />\n </g>\n </Svg>\n )\n}\n\nexport default Code\nCode.styles = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\n\nconst defaultStyes = {\n display: 'inline-flex',\n alignItems: 'center',\n width: 'auto',\n}\n\nexport const Svg = ({\n fill,\n strokeColor,\n styles,\n size = 24,\n role = 'img',\n alt,\n children,\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt' | 'children'\n>) => {\n return (\n <svg\n fill={fill}\n stroke={strokeColor}\n height={size}\n width={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={styles}\n role={role}\n aria-label={alt}\n {...props}\n >\n {children}\n </svg>\n )\n}\n\nexport default Svg\nSvg.displayName = 'Svg'\nSvg.styles = defaultStyes\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'currentColor',\n stroke: 'none',\n}\n\n/**\n * Renders a home icon.\n *\n * @param {string} strokeColor - The color of the icon's stroke.\n * @param {string} fill - The color of the icon's fill.\n * @param {string} size - The size of the icon.\n * @param {string} viewBox - The viewBox of the icon.\n * @param {string} name - The name of the icon.\n * @param {Object} styles - The styles of the icon.\n * @param {Object} props - The props of the icon.\n * @returns {JSX.Element} - A home icon.\n */\nexport const Home = ({\n strokeColor = 'currentColor',\n fill = 'none',\n size = 16,\n styles = defaultStyles,\n role = 'img',\n alt = 'Home icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill={fill}\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <polygon\n fill=\"none\"\n points=\"12 2 2 10 2 23 9 23 9 16 15 16 15 23 22 23 22 10 12 2\"\n stroke={strokeColor}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Home\nHome.displayName = 'Home'\nHome.styles = defaultStyles\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: \"currentColor\",\n};\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const Add = ({\n fill = \"gray\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M17,11h-4V7c0-.553-.447-1-1-1s-1,.447-1,1v4H7c-.553,0-1,.447-1,1s.447,1,1,1h4v4c0,.553,.447,1,1,1s1-.447,1-1v-4h4c.553,0,1-.447,1-1s-.447-1-1-1Z\"\n fill={fill}\n />\n </g>\n </Svg>\n );\n};\n\nexport default Add;\nAdd.styles = defaultStyles;\nAdd.displayName = \"Add\";\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = { ...Svg.styles }\n\nexport const ArrowLeft = ({\n strokeColor = 'currentColor',\n fill = 'currentColor',\n size = 16,\n styles,\n role = 'img',\n alt = 'Arrow pointing left',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} {...props} alt={alt}>\n <g fill={fill} strokeMiterlimit=\"10\">\n <line\n fill=\"none\"\n stroke={strokeColor}\n strokeLinecap=\"butt\"\n strokeLinejoin=\"miter\"\n strokeWidth=\"2\"\n x1=\"22\"\n x2=\"2\"\n y1=\"12\"\n y2=\"12\"\n />\n <polyline\n fill=\"none\"\n points=\"9,19 2,12 9,5 \"\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeWidth=\"2\"\n />\n </g>\n </Svg>\n )\n}\n\nexport default ArrowLeft\nArrowLeft.styles = defaultStyles\nArrowLeft.displayName = 'ArrowLeft'\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = { ...Svg.styles }\n\n/**\n * @param {string} size - The width and height of the icon in pixels. Defaults to 24.\n * @param {string} strokeColor - The color of the icon stroke. Defaults to 'currentcolor'.\n * @param {React.CSSProperties} styles - Additional CSS styles to apply to the icon.\n * @param {IconProps} props - Additional props to pass to the SVG element.\n * @returns {JSX.Element} - A chat icon component that displays a speech bubble with lines representing text.\n */\nexport const Chat = ({\n size = 16,\n strokeColor = 'currentcolor',\n styles,\n role = 'img',\n alt = 'Chat icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>): JSX.Element => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={strokeColor} strokeMiterlimit=\"10\">\n <path\n d=\"M21,2H3c-1.105,0-2,.895-2,2V15c0,1.105,.895,2,2,2h5l4,5,4-5h5c1.105,0,2-.895,2-2V4c0-1.105-.895-2-2-2Z\"\n fill=\"none\"\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeWidth=\"2\"\n />\n </g>\n </Svg>\n )\n}\n\nexport default Chat\nChat.styles = defaultStyles\nChat.displayName = 'Chat'\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = { ...Svg.styles }\n\n/**\n * ArrowDown icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const ArrowDown = ({\n fill = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Down icon',\n ...props\n}: Pick<IconProps, 'fill' | 'styles' | 'size' | 'role' | 'alt'>) => {\n return (\n <Svg size={size} role={role} styles={styles} alt={alt} {...props}>\n <g fill={fill} strokeMiterlimit=\"10\">\n <line\n fill=\"none\"\n stroke={fill}\n strokeLinecap=\"butt\"\n strokeLinejoin=\"miter\"\n strokeWidth=\"2\"\n x1=\"12\"\n x2=\"12\"\n y1=\"2\"\n y2=\"22\"\n />\n <polyline\n fill=\"none\"\n points=\"19,15 12,22 5,15 \"\n stroke={fill}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeWidth=\"2\"\n />\n </g>\n </Svg>\n )\n}\n\nexport default ArrowDown\nArrowDown.styles = defaultStyles\nArrowDown.displayName = 'ArrowDown'\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * ArrowUp icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const ArrowUp = ({\n strokeColor = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <line fill=\"none\" strokeLinecap=\"butt\" x1=\"12\" x2=\"12\" y1=\"22\" y2=\"2\" />\n <polyline fill=\"none\" points=\"5,9 12,2 19,9 \" stroke={strokeColor} />\n </g>\n </Svg>\n )\n}\n\nexport default ArrowUp\nArrowUp.displayName = 'ArrowUp'\nArrowUp.style = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'currentColor',\n}\n\n/*\n * ArrowRight icon component.\n *\n * Renders a right arrow SVG icon.\n *\n * @param {IconProps} props - The component props\n * @param {string} [props.size=\"24\"] - Icon size\n * @param {string} [props.fill=\"currentColor\"] - Icon fill color\n * @param {string} [props.strokeColor=\"currentColor\"] - Stroke color\n *\n * @returns {React.ReactElement} - The rendered icon\n */\nexport const ArrowRight = ({\n size = 16,\n fill = 'currentColor',\n strokeColor = 'currentColor',\n styles,\n role = 'img',\n alt = 'Right arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill={fill}\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <line fill=\"none\" strokeLinecap=\"butt\" x1=\"2\" x2=\"22\" y1=\"12\" y2=\"12\" />\n <polyline fill=\"none\" points=\"15,5 22,12 15,19 \" stroke={strokeColor} />\n </g>\n </Svg>\n )\n}\n\nexport default ArrowRight\nArrowRight.displayName = 'ArrowRight'\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\nexport const User = ({\n size = 16,\n fill = 'none',\n strokeColor = 'currentColor',\n styles,\n alt = 'User Icon',\n role,\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} role={role} alt={alt} styles={styles} {...props}>\n <g\n fill={fill}\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"5.5\" fill=\"none\" r=\"4.5\" />\n <path\n d=\"M12,14c-4.971,0-9,4.029-9,9H21c0-4.971-4.029-9-9-9Z\"\n fill=\"none\"\n stroke={strokeColor}\n />\n </g>\n </Svg>\n )\n}\n\nexport default User\nUser.styles = defaultStyles\nUser.displayName = 'User'\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n fill: 'currentColor',\n}\n\n/**\n * Renders a right arrow icon.\n *\n * @param {string} size - The size of the icon.\n * @param {string} fill - The fill color of the icon.\n * @param {React.CSSProperties} styles - The styles to apply to the icon.\n * @param {IconProps} props - The props to pass down to the icon.\n * @returns {JSX.Element} - A right arrow icon.\n */\nexport const Right = ({\n size = 16,\n fill = 'currentColor',\n styles,\n role = 'img',\n alt = 'Right arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} alt={alt} styles={styles} role={role} {...props}>\n <g fill={fill}>\n <path\n d=\"M7,23a1,1,0,0,1-.707-1.707L15.586,12,6.293,2.707A1,1,0,0,1,7.707,1.293l10,10a1,1,0,0,1,0,1.414l-10,10A1,1,0,0,1,7,23Z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Right\nRight.displayName = 'Right'\nRight.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'currentColor',\n}\n\n/**\n * Left arrow icon\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {React.CSSProperties} styles - Icon styles (default: {})\n * @param {IconProps} props - Any other valid props for an SVG element\n * @returns {JSX.Element} - Rendered icon component\n */\nexport const Left = ({\n fill = 'currentColor',\n size = 16,\n styles,\n role = 'img',\n alt = 'Left arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} alt={alt} role={role} {...props}>\n <g fill={fill}>\n <path\n d=\"M17,23a1,1,0,0,1-.707-.293l-10-10a1,1,0,0,1,0-1.414l10-10a1,1,0,0,1,1.414,1.414L8.414,12l9.293,9.293A1,1,0,0,1,17,23Z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Left\nLeft.displayName = 'Left'\nLeft.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n fill: 'currentColor',\n}\n\n/**\n * Minus icon component\n * @param {string} size - Icon size (default: 24)\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {object} styles - Inline styles for the SVG element\n * @param {object} props - Any other SVG attributes\n * @returns {JSX.Element} - Rendered Minus icon component\n */\nexport const Minus = ({\n size = 24,\n fill = 'currentColor',\n styles,\n role = 'img',\n alt = 'Minus icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M17,11H7c-.553,0-1,.447-1,1s.447,1,1,1h10c.553,0,1-.447,1-1s-.447-1-1-1Z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Minus\nMinus.displayName = 'Minus'\nMinus.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n fill: 'currenStyle',\n}\n\n/**\n * Remove icon component\n * @param {string} size - The size of the icon\n * @param {string} fill - The fill color of the icon\n * @param {object} styles - The styles to apply to the icon\n * @param {object} props - The additional props to pass to the icon\n * @returns {JSX.Element} - The Remove icon component\n */\nexport const Remove = ({\n size = 16,\n fill = 'currentColor',\n styles,\n role = 'img',\n alt = 'Remove icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} alt={alt} styles={styles} role={role} {...props}>\n <g fill={fill}>\n <path\n d=\"M19.7,4.3c-0.4-0.4-1-0.4-1.4,0L12,10.6L5.7,4.3c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l6.3,6.3l-6.3,6.3 c-0.4,0.4-0.4,1,0,1.4C4.5,19.9,4.7,20,5,20s0.5-0.1,0.7-0.3l6.3-6.3l6.3,6.3c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3 c0.4-0.4,0.4-1,0-1.4L13.4,12l6.3-6.3C20.1,5.3,20.1,4.7,19.7,4.3z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Remove\nRemove.displayName = 'Remove'\nRemove.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n stroke: 'currentColor',\n}\n\n/**\n * Copy icon component\n * @param {string} size - The width and height of the icon\n * @param {string} strokeColor - The color of the icon stroke\n * @param {IconProps} props - The icon component props\n * @returns {JSX.Element} - A react JSX element representing the copy icon\n */\nexport const Copy = ({\n size = 16,\n strokeColor = 'currentColor',\n styles,\n role = 'img',\n alt = 'Copy icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>): JSX.Element => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <polyline\n fill=\"none\"\n points=\"8 19 2 19 2 1 17 1 17 6\"\n stroke={strokeColor}\n />\n <rect height=\"13\" width=\"10\" fill=\"none\" x=\"12\" y=\"10\" />\n </g>\n </Svg>\n )\n}\n\nexport default Copy\nCopy.displayName = 'Copy'\nCopy.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nconst defaultStyles = { ...Svg.styles }\nexport const Up = ({\n size = 16,\n fill = 'currentColor',\n styles,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} alt={alt} styles={styles} role={role} {...props}>\n <g fill={fill}>\n <path\n d=\"M22,18a1,1,0,0,1-.707-.293L12,8.414,2.707,17.707a1,1,0,0,1-1.414-1.414l10-10a1,1,0,0,1,1.414,0l10,10A1,1,0,0,1,22,18Z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Up\nUp.displayName = 'Up'\nUp.styles = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = { ...Svg.styles }\n\nexport const Down = ({\n size = 16,\n fill = 'currentColor',\n styles,\n role = 'img',\n alt = 'Down arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} alt={alt} styles={styles} role={role} {...props}>\n <g fill={fill}>\n <path\n d=\"M12,18a1,1,0,0,1-.707-.293l-10-10A1,1,0,0,1,2.707,6.293L12,15.586l9.293-9.293a1,1,0,1,1,1.414,1.414l-10,10A1,1,0,0,1,12,18Z\"\n fill={fill}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Down\nDown.displayName = 'Down'\nDown.styles = defaultStyles\n","import { IconProps } from '../types'\nimport React from 'react'\nimport Svg from './svg'\n\nexport function Star({\n size = 16,\n fill,\n strokeColor = 'currentColor',\n styles,\n role = 'img',\n alt = 'Star icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) {\n return (\n <Svg size={size} alt={alt} styles={styles} role={role} {...props}>\n <g\n fill={fill}\n stroke={strokeColor}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n strokeMiterlimit=\"10\"\n strokeWidth=\"2\"\n >\n <polygon\n fill=\"none\"\n points=\"12,2.49 15.09,8.75 22,9.754 17,14.628 18.18,21.51 12,18.262 5.82,21.51 7,14.628 2,9.754 8.91,8.75 \"\n stroke={strokeColor}\n />\n </g>\n </Svg>\n )\n}\n\nexport default Star\nStar.displayName = 'Star'\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * ArrowUp icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const Play = ({\n strokeColor = 'currentColor',\n styles,\n size = 24,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke-linecap=\"square\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n >\n <path\n d=\"M7 21L7 3L19 12L7 21Z\"\n stroke={strokeColor}\n stroke-width=\"2\"\n fill=\"none\"\n ></path>{' '}\n </g>\n </Svg>\n )\n}\n\nexport default Play\nPlay.displayName = 'PlayIcon'\nPlay.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * ArrowUp icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const Pause = ({\n strokeColor = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke-linecap=\"square\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"6\"\n height=\"20\"\n fill=\"none\"\n stroke={strokeColor}\n stroke-width=\"2\"\n ></rect>\n <rect\n x=\"16\"\n y=\"2\"\n width=\"6\"\n height=\"20\"\n fill=\"none\"\n stroke={strokeColor}\n stroke-width=\"2\"\n ></rect>\n </g>\n </Svg>\n )\n}\n\nexport default Pause\nPause.displayName = 'Pause'\nPause.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * Resume icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const Resume = ({\n strokeColor = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke-linecap=\"square\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n >\n <path\n d=\"M20 21L20 3\"\n stroke={strokeColor}\n stroke-width=\"2\"\n fill=\"none\"\n ></path>\n <path\n d=\"M4 4L4 20L16 12L4 4Z\"\n stroke={strokeColor}\n stroke-width=\"2\"\n fill=\"none\"\n ></path>\n </g>\n </Svg>\n )\n}\n\nexport default Resume\nResume.displayName = 'Resume'\nResume.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * Stop icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const Stop = ({\n strokeColor = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g\n fill=\"none\"\n stroke-linecap=\"square\"\n stroke-linejoin=\"miter\"\n stroke-miterlimit=\"10\"\n >\n <rect\n x=\"2\"\n y=\"2\"\n fill=\"none\"\n stroke={strokeColor}\n stroke-width=\"2\"\n width=\"20\"\n height=\"20\"\n ></rect>\n </g>\n </Svg>\n )\n}\n\nexport default Stop\nStop.displayName = 'Stop'\nStop.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * Stop icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const StopSolid = ({\n strokeColor = 'currentColor',\n styles,\n size = 24,\n role = 'img',\n alt = 'Stop icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={strokeColor}>\n <path\n fill={strokeColor}\n d=\"M22,1H2C1.447,1,1,1.447,1,2v20c0,0.553,0.447,1,1,1h20c0.553,0,1-0.447,1-1V2C23,1.447,22.553,1,22,1z\"\n ></path>\n </g>\n </Svg>\n )\n}\n\nexport default StopSolid\nStopSolid.displayName = 'StopSolid'\nStopSolid.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * ArrowUp icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const PlaySolid = ({\n strokeColor = 'currentColor',\n styles,\n size = 24,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={strokeColor}>\n <path\n fill={strokeColor}\n d=\"M20.555,11.168l-15-10c-0.307-0.204-0.702-0.224-1.026-0.05C4.203,1.292,4,1.631,4,2v20 c0,0.369,0.203,0.708,0.528,0.882C4.676,22.961,4.838,23,5,23c0.194,0,0.388-0.057,0.555-0.168l15-10C20.833,12.646,21,12.334,21,12 S20.833,11.354,20.555,11.168z\"\n ></path>\n </g>\n </Svg>\n )\n}\n\nexport default PlaySolid\nPlaySolid.displayName = 'PlaySolid'\nPlaySolid.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * ArrowUp icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const PauseSolid = ({\n strokeColor = 'currentColor',\n styles,\n size = 24,\n role = 'img',\n alt = 'Pause arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={strokeColor}>\n <path\n d=\"M7,1H2A1,1,0,0,0,1,2V22a1,1,0,0,0,1,1H7a1,1,0,0,0,1-1V2A1,1,0,0,0,7,1Z\"\n fill={strokeColor}\n ></path>\n <path\n d=\"M22,1H17a1,1,0,0,0-1,1V22a1,1,0,0,0,1,1h5a1,1,0,0,0,1-1V2A1,1,0,0,0,22,1Z\"\n fill={strokeColor}\n ></path>\n </g>\n </Svg>\n )\n}\n\nexport default PauseSolid\nPauseSolid.displayName = 'PauseSolid'\nPauseSolid.style = defaultStyles\n","import * as React from 'react'\n\nimport { IconProps } from '../types'\nimport Svg from './svg'\n\nconst defaultStyles = {\n ...Svg.styles,\n fill: 'none',\n stroke: 'currentColor',\n}\n\n/**\n * Resume icon component\n * @param fill - Icon fill color\n * @param strokeColor - Icon stroke color\n * @param styles - Icon styles\n * @param size - Icon size\n */\nexport const ResumeSolid = ({\n strokeColor = 'currentColor',\n styles,\n size = 16,\n role = 'img',\n alt = 'Up arrow icon',\n ...props\n}: Pick<\n IconProps,\n 'strokeColor' | 'fill' | 'styles' | 'size' | 'role' | 'alt'\n>) => {\n return (\n <Svg size={size} styles={styles} role={role} alt={alt} {...props}>\n <g fill={strokeColor}>\n <path\n fill={strokeColor}\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 21.8685L17.8028 12L3 2.1315L3 21.8685Z\"\n ></path>\n <path\n fill={strokeColor}\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M19 2L19 22L21 22L21 2L19 2Z\"\n ></path>\n </g>\n </Svg>\n )\n}\n\nexport default ResumeSolid\nResumeSolid.displayName = 'ResumeSolid'\nResumeSolid.style = defaultStyles\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const Info = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Info icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z\"\n fill={fill}\n />\n </g>\n </Svg>\n );\n};\n\nexport default Info;\nInfo.displayName = \"Info\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const AlertSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M23.707,6.736,17.263.293A1,1,0,0,0,16.556,0H7.444a1,1,0,0,0-.707.293L.293,6.736A1,1,0,0,0,0,7.443v9.114a1,1,0,0,0,.293.707l6.444,6.443A1,1,0,0,0,7.444,24h9.112a1,1,0,0,0,.707-.293l6.444-6.443A1,1,0,0,0,24,16.557V7.443A1,1,0,0,0,23.707,6.736ZM13.645,5,13,14H11l-.608-9ZM12,20a2,2,0,1,1,2-2A2,2,0,0,1,12,20Z\"\n fill={fill}\n />\n </g>\n </Svg>\n );\n};\n\nexport default AlertSolid;\nAlertSolid.displayName = \"AlertSolid\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const InfoSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n fill={fill}\n d=\"M8,17.06V20h8v-2.94c3.059-1.514,5-4.607,5-8.06c0-4.963-4.038-9-9-9S3,4.037,3,9 C3,12.452,4.941,15.546,8,17.06z M7,9c0-2.757,2.243-5,5-5h1v2h-1c-1.654,0-3,1.346-3,3v1H7V9z\"\n ></path>{\" \"}\n <path\n fill={fill}\n d=\"M8,22v1c0,0.553,0.448,1,1,1h6c0.552,0,1-0.447,1-1v-1H8z\"\n ></path>\n </g>\n </Svg>\n );\n};\n\nexport default InfoSolid;\nInfoSolid.displayName = \"InfoSolid\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const QuestionSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M12,0C5.383,0,0,5.383,0,12s5.383,12,12,12,12-5.383,12-12S18.617,0,12,0Zm0,19.5c-.69,0-1.25-.56-1.25-1.25s.56-1.25,1.25-1.25,1.25,.56,1.25,1.25-.56,1.25-1.25,1.25Zm2.688-7.198c-1.444,1.224-1.688,1.667-1.688,2.198,0,.553-.447,1-1,1s-1-.447-1-1c0-1.434,.807-2.379,2.395-3.724,.447-.38,1.844-1.72,1.024-3.046-.532-.861-2.517-.984-4.162-.256-.507,.223-1.096-.006-1.319-.511-.223-.505,.006-1.096,.511-1.319,2.33-1.03,5.463-.924,6.672,1.035,1.103,1.784,.554,3.938-1.433,5.622Z\"\n fill={fill}\n ></path>\n </g>\n </Svg>\n );\n};\n\nexport default QuestionSolid;\nQuestionSolid.displayName = \"QuestionSolid\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const WarnSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M23.641,18.485L14.732,1.643C13.931,.134,12.059-.44,10.55,.361c-.546,.29-.992,.736-1.282,1.282L.359,18.485c-.793,1.504-.217,3.367,1.288,4.16,.445,.235,.942,.357,1.445,.355H20.908c1.7,.005,3.083-1.369,3.088-3.07,.002-.504-.12-1-.355-1.445Zm-11.641,1.515c-.828,0-1.5-.672-1.5-1.5s.672-1.5,1.5-1.5,1.5,.672,1.5,1.5-.672,1.5-1.5,1.5Zm.53-5h-1.061c-.264,0-.483-.205-.499-.469l-.438-7c-.018-.288,.211-.531,.499-.531h1.936c.288,0,.517,.243,.499,.531l-.438,7c-.016,.264-.235,.469-.499,.469Z\"\n fill={fill}\n />\n </g>\n </Svg>\n );\n};\n\nexport default WarnSolid;\nWarnSolid.displayName = \"WarnSolid\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const SuccessSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M12,0C5.373,0,0,5.373,0,12s5.373,12,12,12,12-5.373,12-12C23.981,5.381,18.619,.019,12,0Zm7.207,7.707l-9,9c-.195,.195-.451,.293-.707,.293s-.512-.098-.707-.293l-4-4c-.391-.391-.391-1.023,0-1.414s1.023-.391,1.414,0l3.293,3.293L17.793,6.293c.391-.391,1.023-.391,1.414,0s.391,1.023,0,1.414Z\"\n fill={fill}\n ></path>\n </g>\n </Svg>\n );\n};\n\nexport default SuccessSolid;\nSuccessSolid.displayName = \"SuccessSolid\";\n","import * as React from \"react\";\n\nimport { IconProps } from \"../types\";\nimport Svg from \"./svg\";\n\n/**\n * Add Icon component\n * @param {string} fill - Icon fill color (default: 'currentColor')\n * @param {string} size - Icon size (default: '24')\n * @param {IconProps} props - Other icon properties\n * @returns {JSX.Element} - Rendered component\n */\nexport const AlertSquareSolid = ({\n fill = \"currentColor\",\n size = 24,\n role = \"img\",\n alt = \"Add icon\",\n ...props\n}: Pick<\n IconProps,\n \"strokeColor\" | \"fill\" | \"styles\" | \"size\" | \"role\" | \"alt\"\n>): JSX.Element => {\n return (\n <Svg size={size} role={role} alt={alt} {...props}>\n <g fill={fill}>\n <path\n d=\"M20,1H4c-1.654,0-3,1.346-3,3V20c0,1.654,1.346,3,3,3H20c1.654,0,3-1.346,3-3V4c0-1.654-1.346-3-3-3ZM11,7c0-.553,.448-1,1-1s1,.447,1,1v6c0,.553-.448,1-1,1s-1-.447-1-1V7Zm1,11.5c-.69,0-1.25-.56-1.25-1.25s.56-1.25,1.25-1.25,1.25,.56,1.25,1.25-.56,1.25-1.25,1.25Z\"\n fill={fill}\n ></path>\n </g>\n </Svg>\n );\n};\n\nexport default AlertSquareSolid;\nAlertSquareSolid.displayName = \"AlertSquareSolid\";\n","import {\n Add,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Chat,\n Code,\n Copy,\n Down,\n Home,\n Info,\n Left,\n Minus,\n Remove,\n Right,\n Star,\n Up,\n User,\n Play,\n Pause,\n Stop,\n Resume,\n PlaySolid,\n PauseSolid,\n ResumeSolid,\n StopSolid,\n AlertSolid,\n InfoSolid,\n QuestionSolid,\n WarnSolid,\n SuccessSolid,\n AlertSquareSolid,\n} from \"./index\";\n\nimport UI from \"#components/ui\";\nimport React from \"react\";\n\n/**\n * The default styles object for the Icon component.\n *\n * @property {string} display - Sets display to 'inline-flex' to make Icon inline.\n * @property {string} direction - Sets flex direction to 'row'.\n * @property {string} gap - Sets gap between items to '.2rem'.\n * @property {string} placeItems - Centers items vertically using 'center'.\n * @property {string} width - Sets width to 'auto' for automatic sizing.\n */\nconst defaultStyles = {\n display: \"inline-flex\",\n direction: \"row\",\n gap: \".2rem\",\n placeItems: \"center\",\n width: \"auto\",\n};\n\nexport type IconProps = React.ComponentProps<typeof UI> & {\n /**\n * Controls screen reader visibility.\n * - `true` (default): Hides icon from screen readers (decorative icon)\n * - `false`: Makes icon visible to screen readers (semantic icon)\n *\n * **When to use decorative (aria-hidden=\"true\", default):**\n * - Icon accompanies visible text (e.g., button with icon + label)\n * - Icon is purely visual decoration\n *\n * **When to use semantic (aria-hidden=\"false\"):**\n * - Icon is the only content (e.g., icon-only button)\n * - Must provide `aria-label` or `aria-labelledby` for accessible name\n *\n * @default true\n * @see https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html\n */\n \"aria-hidden\"?: boolean;\n /**\n * Accessible label for semantic icons.\n * Required when icon is standalone (not accompanied by visible text).\n *\n * @example\n * ```tsx\n * // ✅ GOOD: Icon-only button with accessible name\n * <button>\n * <Icon aria-hidden={false} aria-label=\"Close dialog\">\n * <Icon.Remove />\n * </Icon>\n * </button>\n *\n * // ✅ GOOD: Icon with visible text (default decorative)\n * <button>\n * <Icon><Icon.Add /></Icon>\n * Add Item\n * </button>\n * ```\n */\n \"aria-label\"?: string;\n /**\n * Semantic role override.\n * Use `role=\"img\"` when icon conveys meaning and is not decorative.\n *\n * @default undefined (no role for decorative icons)\n */\n role?: string;\n};\n\n/**\n * Icon wrapper component that enforces accessibility best practices.\n *\n * **Default behavior (decorative icon):**\n * - Hidden from screen readers (`aria-hidden=\"true\"`)\n * - Used when icon accompanies visible text\n *\n * **Semantic icon pattern:**\n * - Set `aria-hidden={false}` to expose to screen readers\n * - Must provide `aria-label` for accessible name\n * - Consider `role=\"img\"` for complex SVG icons\n *\n * @param {IconProps} props - Component props\n * @returns {React.ReactElement} Accessible icon wrapper\n *\n * @example\n * // ✅ Decorative icon with text (default)\n * <button>\n * <Icon><Icon.Save /></Icon>\n * Save Changes\n * </button>\n *\n * @example\n * // ✅ Semantic icon-only button\n * <button aria-label=\"Close dialog\">\n * <Icon aria-hidden={false}>\n * <Icon.Remove />\n * </Icon>\n * </button>\n *\n * @example\n * // ❌ BAD: Icon-only button without accessible name\n * <button>\n * <Icon><Icon.Remove /></Icon>\n * </button>\n */\nexport const Icon = ({\n id,\n classes,\n children,\n styles,\n \"aria-hidden\": ariaHidden = true,\n \"aria-label\": ariaLabel,\n role,\n ...props\n}: IconProps) => {\n return (\n <UI\n id={id}\n as=\"span\"\n styles={styles}\n className={classes}\n data-icon\n data-style=\"icons\"\n aria-hidden={ariaHidden}\n aria-label={ariaLabel}\n role={role}\n {...props}\n >\n {children}\n </UI>\n );\n};\n\nexport default Icon;\nIcon.displayName = \"Icon\";\nIcon.Add = Add;\nIcon.ArrowDown = ArrowDown;\nIcon.ArrowLeft = ArrowLeft;\nIcon.ArrowRight = ArrowRight;\nIcon.ArrowUp = ArrowUp;\nIcon.Chat = Chat;\nIcon.Code = Code;\nIcon.Copy = Copy;\nIcon.Down = Down;\nIcon.Home = Home;\nIcon.Info = Info;\nIcon.InfoSolid = InfoSolid;\nIcon.AlertSolid = AlertSolid;\nIcon.Left = Left;\nIcon.Minus = Minus;\nIcon.Pause = Pause;\nIcon.PauseSolid = PauseSolid;\nIcon.Play = Play;\nIcon.PlaySolid = PlaySolid;\nIcon.Remove = Remove;\nIcon.Resume = Resume;\nIcon.ResumeSolid = ResumeSolid;\nIcon.Right = Right;\nIcon.Star = Star;\nIcon.Stop = Stop;\nIcon.StopSolid = StopSolid;\nIcon.Up = Up;\nIcon.User = User;\nIcon.styles = defaultStyles;\nIcon.QuestionSolid = QuestionSolid;\nIcon.WarnSolid = WarnSolid;\nIcon.SuccessSolid = SuccessSolid;\nIcon.AlertSquareSolid = AlertSquareSolid;\n// aliases\nIcon.Close = Icon.Remove;\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
4
4
|
var t = require('react');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
|
|
8
8
|
var t__default = /*#__PURE__*/_interopDefault(t);
|
|
9
9
|
|
|
10
|
-
var l=({label:o,labelFor:a,id:r,styles:p,classes:d,children:s,...i})=>t__default.default.createElement(
|
|
10
|
+
var l=({label:o,labelFor:a,id:r,styles:p,classes:d,children:s,...i})=>t__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"div",id:r,styles:p,className:d,"data-style":"fields",...i},t__default.default.createElement("label",{htmlFor:a},o),s),n=l;l.displayName="Field";
|
|
11
11
|
|
|
12
12
|
exports.a = l;
|
|
13
13
|
exports.b = n;
|
|
14
14
|
//# sourceMappingURL=out.js.map
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-AHDJGCG5.cjs.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
4
4
|
var m = require('react');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
|
|
8
8
|
var m__default = /*#__PURE__*/_interopDefault(m);
|
|
9
9
|
|
|
10
|
-
var l=({elm:e="p",id:t,text:o,styles:s,classes:p,children:r,...i})=>m__default.default.createElement(
|
|
10
|
+
var l=({elm:e="p",id:t,text:o,styles:s,classes:p,children:r,...i})=>m__default.default.createElement(chunkL75OQKEI_cjs.a,{as:e,id:t,styles:s,className:p,...i},m__default.default.createElement(chunkL75OQKEI_cjs.a,{as:e,id:t,styles:s,className:p,...i},r||o)),n=({elm:e="h3",id:t,children:o,styles:s,classes:p,...r})=>m__default.default.createElement(l,{as:e,id:t,styles:s,className:p,...r},o),d=l;l.displayName="Text";n.displayName="Title";
|
|
11
11
|
|
|
12
12
|
exports.a = l;
|
|
13
13
|
exports.b = n;
|
|
14
14
|
exports.c = d;
|
|
15
15
|
//# sourceMappingURL=out.js.map
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
16
|
+
//# sourceMappingURL=chunk-B7F5FS6D.cjs.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkPQ2K3BM6_cjs = require('./chunk-PQ2K3BM6.cjs');
|
|
4
|
+
var chunk3MKLDCKQ_cjs = require('./chunk-3MKLDCKQ.cjs');
|
|
5
|
+
var chunkJ32EZPYD_cjs = require('./chunk-J32EZPYD.cjs');
|
|
6
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
7
|
+
var s = require('react');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var s__default = /*#__PURE__*/_interopDefault(s);
|
|
12
|
+
|
|
13
|
+
var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a=s.useCallback(()=>{o();},[o]);return s__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"div",classes:"dialog-header"},s__default.default.createElement(chunkPQ2K3BM6_cjs.b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s__default.default.createElement(chunkJ32EZPYD_cjs.b,{type:"button",onClick:a,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s__default.default.createElement(chunk3MKLDCKQ_cjs.b,null,s__default.default.createElement(chunk3MKLDCKQ_cjs.b.Remove,{size:16}))))},D=s__default.default.memo(y);y.displayName="DialogHeader";var H=({onClose:t,onConfirm:o,confirmLabel:l,cancelLabel:e})=>{let a=s.useCallback(()=>{t();},[t]),m=s.useCallback(()=>{o&&o();},[o]);return s__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"section",className:"dialog-footer"},e&&s__default.default.createElement(chunkJ32EZPYD_cjs.b,{type:"button",onClick:a,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s__default.default.createElement(chunkJ32EZPYD_cjs.b,{type:"button",onClick:m,className:"dialog-button button-primary","data-btn":"sm"},l))};H.displayName="DialogFooter";var I=s__default.default.memo(H);var h=(t,o)=>s.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,dialogLabel:m,children:P,onConfirm:U,confirmLabel:B="Confirm",cancelLabel:E="Cancel",className:M="",hideFooter:v=!1,styles:x})=>{let f=s.useRef(null),u=s.useId();s.useEffect(()=>{let r=f.current;r&&(t?l?r.show():r.showModal():r.close());},[t,l]);let c=s.useCallback(()=>{o(!1),e&&e();},[o,e]),L=h(f,c),b=s.useId();return s__default.default.createElement(chunkL75OQKEI_cjs.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__default.default.createElement(D,{dialogTitle:a,onClick:c,id:u}),s__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"section",id:b,className:"dialog-content",onClick:r=>r.stopPropagation()},P,!v&&s__default.default.createElement(I,{onClose:c,onConfirm:U,confirmLabel:B,cancelLabel:E})))};F.displayName="Dialog";var ao=s__default.default.memo(F);
|
|
14
|
+
|
|
15
|
+
exports.a = F;
|
|
16
|
+
exports.b = ao;
|
|
17
|
+
//# sourceMappingURL=out.js.map
|
|
18
|
+
//# sourceMappingURL=chunk-D4YLRWAO.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dialog/dialog.tsx","../src/components/dialog/views/dialog-header.tsx","../src/components/dialog/views/dialog-footer.tsx","../src/hooks/useDialogClickHandler.ts"],"names":["React","useRef","useEffect","useCallback","useId","DialogHeader","dialogTitle","onClick","id","type","handleClose","ui_default","heading_default","button_default","icon_default","dialog_header_default","DialogFooter","onClose","onConfirm","confirmLabel","cancelLabel","handleCancel","handleConfirm","dialog_footer_default","useDialogClickHandler","dialogRef","dialogDimensions","Dialog","isOpen","onOpenChange","isAlertDialog","dialogLabel","children","className","hideFooter","styles","titleId","dialog","handleClickOutside","contentId","e","dialog_default"],"mappings":"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","sourcesContent":["import React, { useRef, useEffect, useCallback, useId } from \"react\";\nimport UI from \"#components/ui\";\nimport DialogHeader from \"#components/dialog/views/dialog-header\";\nimport DialogFooter from \"#components/dialog/views/dialog-footer\";\nimport { useDialogClickHandler } from \"#hooks/useDialogClickHandler.js\";\nimport type { DialogProps } from \"./dialog.types\";\n\n/**\n * A controlled dialog component that supports both modal and non-modal (inline alert) modes.\n *\n * **Modal Dialog** (default): Uses native `<dialog>` element with `.showModal()` which provides:\n * - Automatic focus trap (Tab cycles within dialog)\n * - Escape key closes dialog (native behavior)\n * - Backdrop overlay with click-to-close\n * - Inert background (page content becomes non-interactive)\n *\n * **Inline Alert Dialog** (`isAlertDialog={true}`): Uses `.show()` for non-modal inline alerts:\n * - No focus trap (page remains interactive)\n * - No escape key behavior\n * - Positioned inline in page flow\n * - User must explicitly close with button\n *\n * @component\n * @example\n * ```tsx\n * // Controlled usage\n * const [open, setOpen] = useState(false);\n * <Dialog\n * isOpen={open}\n * onOpenChange={setOpen}\n * dialogTitle=\"Confirm Delete\"\n * >\n * Are you sure you want to delete this item?\n * </Dialog>\n * ```\n *\n * @param {DialogProps} props - Component props\n * @param {boolean} props.isOpen - Controls whether the dialog is currently open\n * @param {(open: boolean) => void} props.onOpenChange - Callback fired when dialog open state changes\n * @param {string} props.dialogTitle - The title displayed in the dialog header\n * @param {boolean} [props.isAlertDialog=false] - If true, renders as non-modal inline alert\n * @param {() => void} [props.onClose] - Deprecated: Use onOpenChange. Called when dialog closes.\n * @param {ReactNode} props.children - Content to display inside the dialog body\n * @param {() => void | Promise<void>} [props.onConfirm] - Callback fired when confirm button is clicked\n * @param {string} [props.confirmLabel=\"Confirm\"] - Text label for confirm button\n * @param {string} [props.cancelLabel=\"Cancel\"] - Text label for cancel button\n * @param {boolean} [props.hideFooter=false] - If true, hides the footer with action buttons\n * @param {string} [props.className] - Additional CSS classes to apply\n * @param {string} [props.dialogLabel] - Optional aria-label for the dialog\n * @param {CSSProperties} [props.styles] - Inline styles to apply to dialog element\n * @returns {JSX.Element} A controlled dialog component\n */\nexport const Dialog: React.FC<DialogProps> = ({\n isOpen,\n onOpenChange,\n isAlertDialog = false,\n onClose,\n dialogTitle,\n dialogLabel,\n children,\n onConfirm,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n className = \"\",\n hideFooter = false,\n styles,\n}) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n\n // Handle native dialog open/close based on isOpen prop\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen) {\n if (isAlertDialog) {\n // Non-modal inline alert - no focus trap, no backdrop\n dialog.show();\n } else {\n // Modal dialog - native focus trap, escape key, backdrop\n dialog.showModal();\n }\n } else {\n dialog.close();\n }\n }, [isOpen, isAlertDialog]);\n\n // Handle close event - notify parent via onOpenChange\n const handleClose = useCallback(() => {\n onOpenChange(false);\n // Support deprecated onClose prop for backward compatibility\n if (onClose) onClose();\n }, [onOpenChange, onClose]);\n\n // Handle backdrop clicks (only for modal dialogs)\n const handleClickOutside = useDialogClickHandler(dialogRef, handleClose);\n\n const contentId = useId();\n\n return (\n <UI\n as=\"dialog\"\n role={isAlertDialog ? \"alertdialog\" : \"dialog\"}\n ref={dialogRef}\n onClose={handleClose}\n onClick={handleClickOutside}\n aria-modal={isOpen && !isAlertDialog ? \"true\" : undefined}\n aria-labelledby={titleId}\n aria-describedby={contentId}\n aria-label={dialogLabel}\n className={`dialog-modal ${className}`.trim()}\n style={styles}\n >\n <DialogHeader dialogTitle={dialogTitle} onClick={handleClose} id={titleId} />\n\n <UI\n as=\"section\"\n id={contentId}\n className=\"dialog-content\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {children}\n {!hideFooter && (\n <DialogFooter\n onClose={handleClose}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n cancelLabel={cancelLabel}\n />\n )}\n </UI>\n </UI>\n );\n};\nDialog.displayName = \"Dialog\";\n\nexport default React.memo(Dialog);\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Heading from \"#components/heading/heading\";\nimport Button from \"#components/buttons/button\";\nimport Icon from \"#components/icons/icon\";\nimport type { DialogHeaderProps } from \"../dialog.types\";\n\n/**\n * DialogHeader component displays the header section of a dialog with a title and close button.\n *\n * This component is optimized for accessibility with:\n * - Unique ID for `aria-labelledby` linking to parent dialog\n * - Semantic heading structure for screen readers\n * - Clear close button with accessible label\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogHeaderProps} props - Component props\n * @param {string} props.dialogTitle - The title text to display in the dialog header\n * @param {() => void} props.onClick - Callback function triggered when close button is clicked\n * @param {string} [props.id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.\n * @param {\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"} [props.type=\"h3\"] - Heading level for semantic structure\n * @returns {JSX.Element} A dialog header with title and close button\n *\n * @example\n * ```tsx\n * <DialogHeader\n * id=\"dialog-title-1\"\n * dialogTitle=\"Confirm Action\"\n * onClick={() => setIsOpen(false)}\n * type=\"h2\"\n * />\n * ```\n */\nconst DialogHeader: React.FC<DialogHeaderProps> = ({\n dialogTitle,\n onClick,\n id,\n type = \"h3\",\n}) => {\n const handleClose = useCallback(() => {\n onClick();\n }, [onClick]);\n\n return (\n <UI as=\"div\" classes=\"dialog-header\">\n <Heading type={type} className=\"dialog-title\" id={id}>\n {dialogTitle || \"Dialog\"}\n </Heading>\n <Button\n type=\"button\"\n onClick={handleClose}\n className=\"dialog-close\"\n aria-label=\"Close dialog\"\n data-btn=\"icon\"\n >\n <Icon>\n <Icon.Remove size={16} />\n </Icon>\n </Button>\n </UI>\n );\n};\n\nexport default React.memo(DialogHeader);\nDialogHeader.displayName = \"DialogHeader\";\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Button from \"#components/buttons/button\";\nimport type { DialogFooterProps } from \"../dialog.types\";\n\n/**\n * DialogFooter component renders action buttons for dialog confirmation/cancellation.\n *\n * This component provides a consistent footer layout with:\n * - Cancel button (secondary style) - Always shown if cancelLabel provided\n * - Confirm button (primary style) - Only shown if onConfirm callback provided\n * - Proper semantic button types\n * - Accessible button sizing and spacing\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogFooterProps} props - Component props\n * @param {() => void} props.onClose - Callback fired when cancel button is clicked\n * @param {() => void | Promise<void>} [props.onConfirm] - Optional callback for confirm action. If omitted, confirm button is hidden.\n * @param {string} props.confirmLabel - Text label for the confirm button\n * @param {string} props.cancelLabel - Text label for the cancel button\n * @returns {JSX.Element} A footer section with action buttons\n *\n * @example\n * ```tsx\n * // Simple close-only footer\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * cancelLabel=\"Close\"\n * confirmLabel=\"OK\"\n * />\n *\n * // Confirmation dialog with both actions\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * onConfirm={async () => await deleteItem()}\n * confirmLabel=\"Delete\"\n * cancelLabel=\"Cancel\"\n * />\n * ```\n */\nconst DialogFooter: React.FC<DialogFooterProps> = ({\n onClose,\n onConfirm,\n confirmLabel,\n cancelLabel,\n}) => {\n // Memoize handlers to prevent unnecessary re-renders\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirm = useCallback(() => {\n if (onConfirm) {\n onConfirm();\n }\n }, [onConfirm]);\n\n return (\n <UI as=\"section\" className=\"dialog-footer\">\n {cancelLabel && (\n <Button\n type=\"button\"\n onClick={handleCancel}\n className=\"dialog-button button-secondary\"\n data-btn=\"sm\"\n >\n {cancelLabel}\n </Button>\n )}\n\n {onConfirm && (\n <Button\n type=\"button\"\n onClick={handleConfirm}\n className=\"dialog-button button-primary\"\n data-btn=\"sm\"\n >\n {confirmLabel}\n </Button>\n )}\n </UI>\n );\n};\n\nDialogFooter.displayName = \"DialogFooter\";\n\nexport default React.memo(DialogFooter);\n","import { useCallback, RefObject } from \"react\";\n\nexport const useDialogClickHandler = (\n dialogRef: RefObject<HTMLDialogElement>,\n handleClose: () => void\n) => {\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDialogElement>) => {\n const dialogDimensions = dialogRef.current?.getBoundingClientRect();\n if (dialogDimensions) {\n const isClickOutside =\n e.clientY < dialogDimensions.top ||\n e.clientY > dialogDimensions.bottom ||\n e.clientX < dialogDimensions.left ||\n e.clientX > dialogDimensions.right;\n\n if (isClickOutside) {\n handleClose();\n }\n }\n },\n [dialogRef, handleClose]\n );\n\n return handleClick;\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { a as a$1 } from './chunk-KUKIVRC2.js';
|
|
2
|
+
import o from 'react';
|
|
3
|
+
|
|
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.
|
|
5
|
+
Migration: <Heading type="${e}"> \u2192 <Title level="${e}">
|
|
6
|
+
See documentation: https://fpkit.dev/components/title`),o.createElement(a,{level:e,ref:i,...t})));p.displayName="Heading (Deprecated)";var H=p;
|
|
7
|
+
|
|
8
|
+
export { a, H as b };
|
|
9
|
+
//# sourceMappingURL=out.js.map
|
|
10
|
+
//# sourceMappingURL=chunk-ETFLFC2S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/heading/heading.tsx","../src/components/title/title.tsx"],"names":["React","Title","level","id","styles","ui","children","className","props","ref","ui_default","title_default","Heading","type","heading_default"],"mappings":"wCAAA,OAAOA,MAAW,QCAlB,OAAOA,MAAW,QAyLlB,IAAMC,EAAQD,EAAM,KAClBA,EAAM,WACJ,CACE,CACE,MAAAE,EAAQ,KACR,GAAAC,EACA,OAAAC,EACA,GAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EACAC,IAGET,EAAA,cAACU,EAAA,CACC,GAAIR,EACJ,GAAIC,EACJ,OAAQC,EACR,UAASC,EACT,UAAWE,EACX,IAAKE,EACJ,GAAGD,GAEHF,CACH,CAGN,CACF,EAEAL,EAAM,YAAc,QAEpB,IAAOU,EAAQV,EDlJf,IAAMW,EAAUZ,EAAM,WACpB,CAAC,CAAE,KAAAa,EAAO,KAAM,GAAGL,CAAM,EAAGC,KAEtB,QAAQ,IAAI,WAAa,eAE3B,QAAQ,KACN;AAAA,4BAE6BI,CAAI,2BAAsBA,CAAI;AAAA,sDAE7D,EAIKb,EAAA,cAACW,EAAA,CAAM,MAAOE,EAAM,IAAKJ,EAAM,GAAGD,EAAO,EAEpD,EAEAI,EAAQ,YAAc,uBAEtB,IAAOE,EAAQF","sourcesContent":["import React from \"react\";\nimport Title from \"#components/title/title\";\n\n/**\n * @deprecated Use `Title` component instead. This component will be removed in v3.0.0.\n *\n * @remarks\n * The `Heading` component has been deprecated in favor of the new `Title` component\n * which offers improved API design and better accessibility features.\n *\n * **Migration Guide:**\n * - Rename `Heading` → `Title`\n * - Rename prop `type` → `level`\n * - Default level changed from `h3` → `h2` (update if you relied on the default)\n *\n * @example\n * // Before (deprecated):\n * <Heading type=\"h2\">Section Title</Heading>\n *\n * // After:\n * <Title level=\"h2\">Section Title</Title>\n *\n * @see {@link Title} for the new component\n */\nexport type TitleProps = {\n /**\n * @deprecated Use `level` prop on the `Title` component instead.\n */\n children: React.ReactNode;\n\n /**\n * @deprecated Use `level` prop on the `Title` component instead.\n */\n type?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n /**\n * @deprecated Use `ui` prop on the `Title` component.\n */\n ui?: string;\n} & Omit<React.ComponentPropsWithoutRef<typeof Title>, 'level'>;\n\n/**\n * Heading - Deprecated component wrapper for Title.\n *\n * @deprecated Use {@link Title} component instead. Will be removed in v3.0.0.\n *\n * This component provides backwards compatibility for existing code using\n * the old `Heading` component API. It forwards all props to the new `Title`\n * component with appropriate prop name mapping.\n *\n * **Breaking Changes in v3.0.0:**\n * - This component will be removed\n * - Migrate to `Title` component before upgrading\n *\n * **Migration Steps:**\n * 1. Replace all `<Heading>` imports with `<Title>`\n * 2. Rename `type` prop to `level`\n * 3. Review default behavior (default changed from h3 to h2)\n *\n * @example\n * // Old API (still works but deprecated):\n * import { Heading } from '@fpkit/acss';\n * <Heading type=\"h2\">Section</Heading>\n *\n * @example\n * // New API (recommended):\n * import { Title } from '@fpkit/acss';\n * <Title level=\"h2\">Section</Title>\n *\n * @param {TitleProps} props - Component props (maps old API to new)\n * @returns {React.ReactElement} The rendered Title component\n */\nconst Heading = React.forwardRef<HTMLHeadingElement, TitleProps>(\n ({ type = \"h3\", ...props }, ref) => {\n // Development warning for deprecated usage\n if (process.env.NODE_ENV === \"development\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[@fpkit/acss] Heading component is deprecated and will be removed in v3.0.0. ` +\n `Please use the Title component instead.\\n` +\n `Migration: <Heading type=\"${type}\"> → <Title level=\"${type}\">\\n` +\n `See documentation: https://fpkit.dev/components/title`\n );\n }\n\n // Map old 'type' prop to new 'level' prop\n return <Title level={type} ref={ref} {...props} />;\n }\n);\n\nHeading.displayName = \"Heading (Deprecated)\";\n\nexport default Heading;\n","import React from \"react\";\nimport UI from \"#components/ui\";\n\n/**\n * Valid HTML heading levels for semantic document structure.\n *\n * @remarks\n * Heading levels establish the document outline and hierarchy for screen readers.\n * Always maintain proper heading order (don't skip levels) for WCAG 2.1 compliance.\n *\n * @example\n * // ✅ GOOD: Proper heading hierarchy\n * <Title level=\"h1\">Main Page Title</Title>\n * <Title level=\"h2\">Section Heading</Title>\n * <Title level=\"h3\">Subsection Heading</Title>\n *\n * @example\n * // ❌ BAD: Skipping heading levels\n * <Title level=\"h1\">Main Title</Title>\n * <Title level=\"h4\">Skipped h2 and h3</Title>\n */\nexport type HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/**\n * Props for the Title component.\n *\n * @typeParam TLevel - The heading level to render (h1-h6)\n *\n * @property {HeadingLevel} level - The semantic heading level (h1-h6). Defaults to \"h2\".\n * @property {React.ReactNode} children - The text or elements to render inside the heading.\n * @property {string} [id] - Unique identifier for the heading, useful for anchor links.\n * @property {React.CSSProperties} [styles] - Inline styles to apply to the heading.\n * @property {string} [ui] - Data attribute for UI framework styling hooks.\n * @property {string} [className] - CSS class names to apply.\n *\n * @remarks\n * This interface extends the polymorphic UI component props, providing full access\n * to native HTML heading attributes and ARIA properties for accessibility.\n *\n * For AI assistants: This component ensures semantic HTML structure for document\n * outlines, which is critical for screen reader navigation and SEO.\n */\nexport type TitleProps = {\n /**\n * The semantic heading level to render.\n *\n * @default \"h2\"\n *\n * @remarks\n * Choose the appropriate level based on your document structure:\n * - h1: Page title (typically one per page)\n * - h2: Major sections\n * - h3-h6: Subsections and nested content\n *\n * WCAG 2.1 requires proper heading hierarchy for screen reader users.\n */\n level?: HeadingLevel;\n\n /**\n * The content to display in the heading.\n *\n * @remarks\n * Can be text, elements, or a combination. Ensure text content is meaningful\n * and descriptive for users navigating with screen readers.\n */\n children: React.ReactNode;\n\n /**\n * Unique identifier for the heading element.\n *\n * @remarks\n * Useful for:\n * - Creating anchor links to sections\n * - ARIA relationships (aria-labelledby, aria-describedby)\n * - Testing and automation\n */\n id?: string;\n\n /**\n * Data attribute for UI framework styling hooks.\n *\n * @remarks\n * Used by fpkit's CSS system to apply component-specific styles.\n * Automatically prefixed with \"data-ui\" when rendered.\n */\n ui?: string;\n\n /**\n * CSS class names to apply to the heading.\n *\n * @remarks\n * Prefer using the `ui` prop for fpkit styling, and this for\n * utility classes or custom overrides.\n */\n className?: string;\n} & React.ComponentPropsWithoutRef<typeof UI>;\n\n/**\n * Title - A semantic heading component for document structure and hierarchy.\n *\n * The Title component renders semantic HTML headings (h1-h6) with proper\n * accessibility support. It ensures WCAG 2.1 AA compliance by maintaining\n * semantic document structure for screen readers and assistive technologies.\n *\n * ## Key Features\n *\n * - **Semantic HTML**: Renders actual heading elements (h1-h6) for proper document outline\n * - **Accessibility**: Full ARIA support and keyboard navigation\n * - **Flexible Styling**: Supports fpkit's UI system, custom classes, and inline styles\n * - **Type Safety**: Fully typed with TypeScript for developer experience\n * - **Performance**: Memoized to prevent unnecessary re-renders\n *\n * ## Accessibility Considerations\n *\n * ### WCAG 2.1 AA Compliance\n *\n * - **1.3.1 Info and Relationships (Level A)**: Semantic heading elements preserve\n * document structure for screen readers\n * - **2.4.6 Headings and Labels (Level AA)**: Headings should be descriptive and\n * properly ordered\n * - **2.4.10 Section Headings (Level AAA)**: Use headings to organize content\n *\n * ### Best Practices\n *\n * 1. **Maintain Heading Hierarchy**: Don't skip levels (e.g., h1 → h3)\n * 2. **One h1 Per Page**: Use h1 for the main page title only\n * 3. **Descriptive Text**: Headings should clearly describe the following content\n * 4. **Avoid Empty Headings**: Always provide meaningful text content\n *\n * ## Usage Examples\n *\n * @example\n * // Basic usage with default h2\n * <Title>Section Heading</Title>\n *\n * @example\n * // Page title with explicit h1\n * <Title level=\"h1\">Welcome to Our Application</Title>\n *\n * @example\n * // Subsection with custom styling\n * <Title\n * level=\"h3\"\n * id=\"getting-started\"\n * className=\"text-primary\"\n * >\n * Getting Started\n * </Title>\n *\n * @example\n * // With fpkit UI data attribute\n * <Title level=\"h2\" ui=\"section-title\">\n * Features Overview\n * </Title>\n *\n * @example\n * // Accessible heading with aria-label for context\n * <Title level=\"h2\" aria-label=\"User dashboard overview\">\n * Dashboard\n * </Title>\n *\n * @example\n * // Complex heading with mixed content\n * <Title level=\"h2\" id=\"stats\">\n * <Icon name=\"chart\" aria-hidden=\"true\" />\n * <span>Statistics</span>\n * </Title>\n *\n * @example\n * // ✅ GOOD: Proper heading hierarchy\n * <Title level=\"h1\">Page Title</Title>\n * <Title level=\"h2\">Main Section</Title>\n * <Title level=\"h3\">Subsection</Title>\n *\n * @example\n * // ❌ BAD: Skipping heading levels (accessibility violation)\n * <Title level=\"h1\">Page Title</Title>\n * <Title level=\"h4\">Skipped h2 and h3</Title>\n *\n * @param {TitleProps} props - Component props\n * @returns {React.ReactElement} A semantic heading element\n *\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html WCAG 1.3.1}\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html WCAG 2.4.6}\n */\nconst Title = React.memo(\n React.forwardRef<HTMLHeadingElement, TitleProps>(\n (\n {\n level = \"h2\",\n id,\n styles,\n ui,\n children,\n className,\n ...props\n }: TitleProps,\n ref\n ) => {\n return (\n <UI\n as={level}\n id={id}\n styles={styles}\n data-ui={ui}\n className={className}\n ref={ref}\n {...props}\n >\n {children}\n </UI>\n );\n }\n )\n);\n\nTitle.displayName = \"Title\";\n\nexport default Title;\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { b } from './chunk-TYRCEX2L.js';
|
|
2
|
+
import { a } from './chunk-KUKIVRC2.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:n,classes:a,...o})=>e.createElement("li",{id:t,style:n,className:a,"data-list":"unstyled inline",...o},r));i.displayName="BreadcrumbItem";var f=e.memo(({children:r,...t})=>e.createElement(a,{as:"ol","data-list":"unstyled inline",...t},r));f.displayName="BreadcrumbList";var y=e.memo(({styles:r,id:t,classes:n,children:a$1,...o})=>e.createElement(a,{as:"nav",id:t,styles:r,className:n,...o},e.createElement(f,null,a$1)));y.displayName="BreadcrumbNav";function w(r,t){let n=e.useMemo(()=>r?r.split("/").filter(s=>s):[],[r]),a=e.useCallback(s=>{let m=t?.find(p=>p.path===s);return {path:m?.path||s,name:m?.name||s,url:m?.url||s}},[t]),o=e.useMemo(()=>n.map((s,m)=>({...a(s),isLast:m===n.length-1,index:m})),[n,a]);return {segments:o,hasSegments:o.length>0}}var l=({startRoute:r="Home",startRouteUrl:t="/",currentRoute:n,spacer:a=e.createElement(e.Fragment,null,"/"),routes:o,styles:s,id:m,classes:p,ariaLabel:k="Breadcrumb",truncateLength:B=15,linkProps:I,...P})=>{let{segments:N,hasSegments:$}=w(n,o),c=e.useId();return !n?.length||!$?null:e.createElement(y,{id:m,styles:s,className:p,"aria-label":k,...P},e.createElement(i,{key:`start-${c}`},e.createElement(b,{href:t,...I},r)),N.map(({name:v,url:x,path:u,isLast:M,index:h})=>{let d=decodeURIComponent(v),C=U(d,B),L=d.length>B;if(M){let S=h>0?N[h-1].path:null;return !u||u.length<=3||u===S?null:e.createElement(i,{key:`${u}-${c}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement("span",{"aria-current":"page","aria-label":L?d:void 0},C))}return e.createElement(i,{key:`${u}-${c}`},e.createElement("span",{"aria-hidden":"true"},a),e.createElement(b,{href:x,"aria-label":L?d:void 0,...I},C))}))},H=l;l.displayName="Breadcrumb";l.Nav=y;l.List=f;l.Item=i;
|
|
6
|
+
|
|
7
|
+
export { w as a, l as b, H as c };
|
|
8
|
+
//# sourceMappingURL=out.js.map
|
|
9
|
+
//# sourceMappingURL=chunk-GZ4QFPRY.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","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":"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","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 return (\n <li\n id={id}\n style={styles}\n className={classes}\n data-list=\"unstyled inline\"\n {...props}\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,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
4
4
|
var v = require('react');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
|
|
8
8
|
var v__default = /*#__PURE__*/_interopDefault(v);
|
|
9
9
|
|
|
10
|
-
var r=({type:a="button",children:i,styles:l,disabled:e,classes:u,onPointerDown:P,onPointerOver:c,onPointerLeave:p,onClick:s,...m})=>{let n=t=>{e||P?.(t);};return v__default.default.createElement(
|
|
10
|
+
var r=({type:a="button",children:i,styles:l,disabled:e,classes:u,onPointerDown:P,onPointerOver:c,onPointerLeave:p,onClick:s,...m})=>{let n=t=>{e||P?.(t);};return v__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"button",type:a,onPointerOver:t=>{e||c?.(t);},onPointerDown:n,onPointerLeave:t=>{e||p?.(t);},onKeyDown:n,style:l,className:u,"aria-disabled":e,onClick:t=>{e||s?.(t);},...m},i)},L=r;r.displayName="Button";
|
|
11
11
|
|
|
12
12
|
exports.a = r;
|
|
13
13
|
exports.b = L;
|
|
14
14
|
//# sourceMappingURL=out.js.map
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-J32EZPYD.cjs.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { a } from './chunk-KUKIVRC2.js';
|
|
2
|
+
import l from 'react';
|
|
3
|
+
|
|
4
|
+
function p(...e){return e.filter(Boolean).join(" ")}var y={CARD:"card",TITLE:"card-title",CONTENT:"card-content",FOOTER:"card-footer"};function c(e,r){r&&(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),r(e));}var f=({children:e,className:r,style:a$1,as:t="h3",...o})=>l.createElement(a,{as:t,className:p(y.TITLE,r),styles:a$1,...o},e);f.displayName="Card.Title";var b=({children:e,className:r,style:a$1,as:t="article",...o})=>l.createElement(a,{as:t,className:p(y.CONTENT,r),styles:a$1,...o},e);b.displayName="Card.Content";var m=({children:e,className:r,style:a$1,as:t="div",...o})=>l.createElement(a,{as:t,className:p(y.FOOTER,r),styles:a$1,...o},e);m.displayName="Card.Footer";var i=({as:e="div",styles:r,children:a$1,classes:t="shadow",id:o,interactive:n=!1,onClick:s,tabIndex:u,role:C,"aria-label":T,"aria-labelledby":E,"aria-describedby":P,...N})=>(l.useEffect(()=>{},[s,n]),l.createElement(a,{as:e,id:o,styles:r,className:t,"aria-label":T,"aria-labelledby":E,"aria-describedby":P,"data-card":n?"interactive":!0,...n?{role:C||"button",tabIndex:u??0,onClick:s,onKeyDown:v=>{(n||s)&&c(v,s);}}:{role:C,onClick:s},...N},a$1)),h=i;i.displayName="Card";i.Title=f;i.Content=b;i.Footer=m;
|
|
5
|
+
|
|
6
|
+
export { f as a, b, m as c, i as d, h as e };
|
|
7
|
+
//# sourceMappingURL=out.js.map
|
|
8
|
+
//# sourceMappingURL=chunk-JJ43O4Y5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/cards/card.tsx","../src/components/cards/card.utils.ts"],"names":["React","cn","classes","CARD_CLASSES","handleCardKeyDown","event","onClick","Title","children","className","style","as","props","ui_default","Content","Footer","Card","styles","id","interactive","tabIndex","role","ariaLabel","ariaLabelledBy","ariaDescribedBy","card_default"],"mappings":"wCAAA,OAAOA,MAAW,QCoBX,SAASC,KAAMC,EAAwD,CAC5E,OAAOA,EAAQ,OAAO,OAAO,EAAE,KAAK,GAAG,CACzC,CAMO,IAAMC,EAAe,CAC1B,KAAM,OACN,MAAO,aACP,QAAS,eACT,OAAQ,aACV,EAcO,SAASC,EACdC,EACAC,EACM,CACDA,IAGDD,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAe,EACrBC,EAAQD,CAAK,EAEjB,CDzBO,IAAME,EAAQ,CAAC,CACpB,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAAC,EAAK,KACL,GAAGC,CACL,IAEIZ,EAAA,cAACa,EAAA,CACC,GAAIF,EACJ,UAAWV,EAAGE,EAAa,MAAOM,CAAS,EAC3C,OAAQC,EACP,GAAGE,GAEHJ,CACH,EAIJD,EAAM,YAAc,aA+Bb,IAAMO,EAAU,CAAC,CACtB,SAAAN,EACA,UAAAC,EACA,MAAAC,EACA,GAAAC,EAAK,UACL,GAAGC,CACL,IAEIZ,EAAA,cAACa,EAAA,CACC,GAAIF,EACJ,UAAWV,EAAGE,EAAa,QAASM,CAAS,EAC7C,OAAQC,EACP,GAAGE,GAEHJ,CACH,EAIJM,EAAQ,YAAc,eA4Bf,IAAMC,EAAS,CAAC,CACrB,SAAAP,EACA,UAAAC,EACA,MAAAC,EACA,GAAAC,EAAK,MACL,GAAGC,CACL,IAEIZ,EAAA,cAACa,EAAA,CACC,GAAIF,EACJ,UAAWV,EAAGE,EAAa,OAAQM,CAAS,EAC5C,OAAQC,EACP,GAAGE,GAEHJ,CACH,EAIJO,EAAO,YAAc,cAuEd,IAAMC,EAAO,CAAC,CACnB,GAAAL,EAAK,MACL,OAAAM,EACA,SAAAT,EACA,QAAAN,EAAU,SACV,GAAAgB,EACA,YAAAC,EAAc,GACd,QAAAb,EACA,SAAAc,EACA,KAAAC,EACA,aAAcC,EACd,kBAAmBC,EACnB,mBAAoBC,EACpB,GAAGZ,CACL,KAEEZ,EAAM,UAAU,IAAM,CAEtB,EAAG,CAACM,EAASa,CAAW,CAAC,EAsBvBnB,EAAA,cAACa,EAAA,CACC,GAAIF,EACJ,GAAIO,EACJ,OAAQD,EACR,UAAWf,EACX,aAAYoB,EACZ,kBAAiBC,EACjB,mBAAkBC,EAClB,YAAWL,EAAc,cAAgB,GACxC,GAtBoBA,EACrB,CACE,KAAME,GAAQ,SACd,SAAUD,GAAY,EACtB,QAAAd,EACA,UAXiBD,GAA+B,EAChDc,GAAeb,IACjBF,EAAkBC,EAAOC,CAAO,CAEpC,CAQI,EACA,CACE,KAAAe,EACA,QAAAf,CACF,EAaC,GAAGM,GAEHJ,CACH,GAIGiB,EAAQT,EACfA,EAAK,YAAc,OACnBA,EAAK,MAAQT,EACbS,EAAK,QAAUF,EACfE,EAAK,OAASD","sourcesContent":["import React from 'react'\nimport UI from '#components/ui'\nimport type {\n CardProps,\n CardTitleProps,\n CardContentProps,\n CardFooterProps,\n} from './card.types'\nimport { cn, CARD_CLASSES, handleCardKeyDown, warnInteractiveUsage } from './card.utils'\n\n/**\n * Card.Title - Title sub-component for Card\n *\n * Renders a heading element for the card title. Defaults to h3 for proper\n * document outline, but can be customized via the `as` prop.\n *\n * ## Accessibility\n * - Use appropriate heading level based on document structure\n * - Combine with `aria-labelledby` on parent Card for accessible names\n *\n * @example\n * ```tsx\n * <Card aria-labelledby=\"card-title-1\">\n * <Card.Title id=\"card-title-1\">Featured Product</Card.Title>\n * </Card>\n * ```\n *\n * @example\n * ```tsx\n * // Custom heading level\n * <Card.Title as=\"h2\">Section Title</Card.Title>\n * ```\n */\nexport const Title = ({\n children,\n className,\n style,\n as = 'h3',\n ...props\n}: CardTitleProps) => {\n return (\n <UI\n as={as}\n className={cn(CARD_CLASSES.TITLE, className)}\n styles={style}\n {...props}\n >\n {children}\n </UI>\n )\n}\n\nTitle.displayName = 'Card.Title'\n\n/**\n * Card.Content - Content sub-component for Card\n *\n * Renders the main content area of the card. Defaults to `<article>` for\n * standalone content, but can be changed to `div` or `section` via the `as` prop.\n *\n * ## Semantic HTML Guidelines\n * - Use `article` (default) for self-contained, syndicate-able content\n * - Use `div` for generic content containers\n * - Use `section` for thematic groupings with a heading\n *\n * @example\n * ```tsx\n * <Card>\n * <Card.Title>Article Title</Card.Title>\n * <Card.Content>\n * <p>This is standalone content...</p>\n * </Card.Content>\n * </Card>\n * ```\n *\n * @example\n * ```tsx\n * // Generic container (not standalone content)\n * <Card.Content as=\"div\">\n * <p>Generic content...</p>\n * </Card.Content>\n * ```\n */\nexport const Content = ({\n children,\n className,\n style,\n as = 'article',\n ...props\n}: CardContentProps) => {\n return (\n <UI\n as={as}\n className={cn(CARD_CLASSES.CONTENT, className)}\n styles={style}\n {...props}\n >\n {children}\n </UI>\n )\n}\n\nContent.displayName = 'Card.Content'\n\n/**\n * Card.Footer - Footer sub-component for Card\n *\n * Renders a footer section for the card. Use for actions, metadata, or\n * supplementary information.\n *\n * @example\n * ```tsx\n * <Card>\n * <Card.Title>Product</Card.Title>\n * <Card.Content>Description...</Card.Content>\n * <Card.Footer>\n * <button>Add to Cart</button>\n * <span>$29.99</span>\n * </Card.Footer>\n * </Card>\n * ```\n *\n * @example\n * ```tsx\n * // Semantic footer element\n * <Card.Footer as=\"footer\">\n * <p>Last updated: 2024-01-15</p>\n * </Card.Footer>\n * ```\n */\nexport const Footer = ({\n children,\n className,\n style,\n as = 'div',\n ...props\n}: CardFooterProps) => {\n return (\n <UI\n as={as}\n className={cn(CARD_CLASSES.FOOTER, className)}\n styles={style}\n {...props}\n >\n {children}\n </UI>\n )\n}\n\nFooter.displayName = 'Card.Footer'\n\n/**\n * Card - A flexible, accessible card component with compound component pattern\n *\n * The Card component provides a container for grouping related content and actions.\n * It follows the compound component pattern, exposing `Card.Title`, `Card.Content`,\n * and `Card.Footer` sub-components for structured layouts.\n *\n * ## Features\n * - **Polymorphic rendering**: Render as any HTML element via `as` prop\n * - **Compound components**: Structured sub-components for consistent layouts\n * - **Interactive variant**: Built-in keyboard navigation and ARIA support\n * - **Fully accessible**: WCAG 2.1 AA compliant with proper semantic HTML\n *\n * ## Accessibility\n *\n * ### Non-Interactive Cards\n * - Use semantic HTML: `article` for standalone content, `section` for groupings\n * - Provide accessible names with `aria-labelledby` referencing the title\n *\n * ### Interactive Cards (Clickable)\n * - Set `interactive={true}` to enable keyboard navigation (Enter/Space)\n * - Provide accessible name via `aria-label` or `aria-labelledby`\n * - Ensure adequate focus indicators (handled by CSS)\n *\n * @example\n * // Basic card with compound components\n * ```tsx\n * <Card>\n * <Card.Title>Product Name</Card.Title>\n * <Card.Content>\n * <p>Product description goes here...</p>\n * </Card.Content>\n * <Card.Footer>\n * <button>Buy Now</button>\n * </Card.Footer>\n * </Card>\n * ```\n *\n * @example\n * // Accessible interactive card\n * ```tsx\n * <Card\n * interactive\n * aria-label=\"View product details\"\n * onClick={() => navigate('/product/123')}\n * >\n * <Card.Title>Product Name</Card.Title>\n * <Card.Content>Click anywhere to view details</Card.Content>\n * </Card>\n * ```\n *\n * @example\n * // Semantic article card with accessible name\n * ```tsx\n * <Card as=\"article\" aria-labelledby=\"article-title\">\n * <Card.Title id=\"article-title\">Article Headline</Card.Title>\n * <Card.Content>Article body...</Card.Content>\n * </Card>\n * ```\n *\n * @example\n * // Card as a landmark region\n * ```tsx\n * <Card role=\"region\" aria-label=\"Featured products\">\n * <Card.Title>Featured</Card.Title>\n * <Card.Content>...</Card.Content>\n * </Card>\n * ```\n */\nexport const Card = ({\n as = 'div',\n styles,\n children,\n classes = 'shadow',\n id,\n interactive = false,\n onClick,\n tabIndex,\n role,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n}: CardProps) => {\n // Development warnings for common accessibility issues\n React.useEffect(() => {\n warnInteractiveUsage(!!onClick, interactive)\n }, [onClick, interactive])\n\n // Interactive card handling\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (interactive || onClick) {\n handleCardKeyDown(event, onClick)\n }\n }\n\n const interactiveProps = interactive\n ? {\n role: role || 'button',\n tabIndex: tabIndex ?? 0,\n onClick,\n onKeyDown: handleKeyDown,\n }\n : {\n role,\n onClick,\n }\n\n return (\n <UI\n as={as}\n id={id}\n styles={styles}\n className={classes}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n data-card={interactive ? 'interactive' : true}\n {...interactiveProps}\n {...props}\n >\n {children}\n </UI>\n )\n}\n\nexport default Card\nCard.displayName = 'Card'\nCard.Title = Title\nCard.Content = Content\nCard.Footer = Footer\n\n// Export types for external consumption\nexport type { CardProps, CardTitleProps, CardContentProps, CardFooterProps } from './card.types'\n","/**\n * Utility functions for the Card component.\n */\n\n/**\n * Combines multiple className strings into a single string, filtering out falsy values.\n *\n * This utility provides a cleaner alternative to template literals for className composition,\n * avoiding unnecessary string allocation on every render.\n *\n * @param classes - Array of class names (can include undefined/null/empty strings)\n * @returns Combined className string\n *\n * @example\n * ```tsx\n * cn('card-title', className) // \"card-title custom-class\"\n * cn('card-title', undefined) // \"card-title\"\n * cn('card-title', '', 'extra') // \"card-title extra\"\n * ```\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n/**\n * CSS class name constants for Card components.\n * Centralizing these prevents typos and enables easier refactoring.\n */\nexport const CARD_CLASSES = {\n CARD: 'card',\n TITLE: 'card-title',\n CONTENT: 'card-content',\n FOOTER: 'card-footer',\n} as const\n\n/**\n * Handles keyboard events for interactive cards.\n * Triggers click handler on Enter or Space key press.\n *\n * @param event - Keyboard event\n * @param onClick - Click handler to invoke\n *\n * @example\n * ```tsx\n * <div onKeyDown={(e) => handleCardKeyDown(e, handleClick)}>\n * ```\n */\nexport function handleCardKeyDown(\n event: React.KeyboardEvent,\n onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void\n): void {\n if (!onClick) return\n\n // Activate on Enter or Space (standard keyboard interaction pattern)\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault() // Prevent page scroll on Space\n onClick(event)\n }\n}\n\n/**\n * Development warning for interactive card usage.\n * Warns when onClick is provided without the interactive prop.\n *\n * This function is intentionally empty to comply with no-console linting rules.\n * In the future, consider using a proper logging/warning system.\n *\n * @param hasOnClick - Whether onClick handler is provided\n * @param isInteractive - Whether interactive prop is set\n */\nexport function warnInteractiveUsage(\n hasOnClick: boolean,\n isInteractive?: boolean\n): void {\n // Development warning removed to comply with ESLint no-console rule\n // TODO: Consider using a proper warning system if needed\n void hasOnClick\n void isInteractive\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import e from 'react';
|
|
2
|
+
|
|
3
|
+
var t=e.forwardRef(({as:o,styles:p,classes:r,children:n,defaultStyles:s,...m},C)=>{let P=o??"div",a={...s,...p};return e.createElement(P,{ref:C,style:a,className:r,...m},n)}),y=t;t.displayName="UI";
|
|
4
|
+
|
|
5
|
+
export { y as a };
|
|
6
|
+
//# sourceMappingURL=out.js.map
|
|
7
|
+
//# sourceMappingURL=chunk-KUKIVRC2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui.tsx"],"names":["React","UI","as","styles","classes","children","defaultStyles","props","ref","Component","styleObj","ui_default"],"mappings":"AAEA,OAAOA,MAAW,QA4SlB,IAAMC,EAAkBD,EAAM,WAC5B,CACE,CAAE,GAAAE,EAAI,OAAAC,EAAQ,QAAAC,EAAS,SAAAC,EAAU,cAAAC,EAAe,GAAGC,CAAM,EACzDC,IACG,CACH,IAAMC,EAAYP,GAAM,MAElBQ,EAAgC,CAAE,GAAGJ,EAAe,GAAGH,CAAO,EAEpE,OACEH,EAAA,cAACS,EAAA,CAAU,IAAKD,EAAK,MAAOE,EAAU,UAAWN,EAAU,GAAGG,GAC3DF,CACH,CAEJ,CACF,EAEOM,EAAQV,EACfA,EAAG,YAAc","sourcesContent":[" \n/* eslint-disable */\nimport React from \"react\";\n\n/**\n * Extracts the appropriate ref type for a given element type.\n *\n * This utility type ensures that refs are properly typed based on the element\n * being rendered. For example, a button element receives HTMLButtonElement ref.\n *\n * @typeParam C - The HTML element type (e.g., 'button', 'div', 'a')\n * @example\n * ```typescript\n * type ButtonRef = PolymorphicRef<'button'>; // React.Ref<HTMLButtonElement>\n * type DivRef = PolymorphicRef<'div'>; // React.Ref<HTMLDivElement>\n * ```\n */\ntype PolymorphicRef<C extends React.ElementType> =\n React.ComponentPropsWithRef<C>[\"ref\"];\n\n/**\n * Defines the 'as' prop that determines which HTML element to render.\n *\n * This is the core prop that enables polymorphic behavior, allowing components\n * to render as any valid React element type while maintaining type safety.\n *\n * @typeParam C - The HTML element type to render\n * @example\n * ```typescript\n * <UI as=\"button\">Click me</UI>\n * <UI as=\"a\" href=\"/home\">Link</UI>\n * ```\n */\ntype AsProp<C extends React.ElementType> = {\n as?: C;\n};\n\n/**\n * Identifies props that should be omitted to prevent type conflicts.\n *\n * This type ensures that our custom props don't conflict with native element\n * props by calculating which keys need to be omitted from the native props.\n *\n * @typeParam C - The HTML element type\n * @typeParam P - The custom props to merge\n */\ntype PropsToOmit<C extends React.ElementType, P> = keyof (AsProp<C> & P);\n\n/**\n * Merges custom props with native element props while preventing conflicts.\n *\n * This creates a union of our custom props and the native props for the chosen\n * element, omitting any conflicting keys to ensure type safety.\n *\n * @typeParam C - The HTML element type\n * @typeParam Props - The custom props to add\n * @example\n * ```typescript\n * // For a button, this merges custom props with HTMLButtonElement props\n * type ButtonProps = PolymorphicComponentProp<'button', { variant?: string }>;\n * ```\n */\ntype PolymorphicComponentProp<\n C extends React.ElementType,\n Props = {},\n> = React.PropsWithChildren<Props & AsProp<C>> &\n Omit<React.ComponentPropsWithoutRef<C>, PropsToOmit<C, Props>>;\n\n/**\n * Extends PolymorphicComponentProp to include properly-typed ref support.\n *\n * This is the final type in the polymorphic type chain, adding ref forwarding\n * with the correct ref type for the chosen element. The ref is properly typed\n * to match the element being rendered, enabling focus management and direct\n * DOM access for accessibility features like programmatic focus control.\n *\n * @typeParam C - The HTML element type\n * @typeParam Props - The custom props to add\n *\n * @example\n * ```typescript\n * // Using ref for focus management (important for accessibility)\n * const buttonRef = useRef<HTMLButtonElement>(null);\n * useEffect(() => {\n * // Programmatically focus for keyboard navigation\n * buttonRef.current?.focus();\n * }, []);\n *\n * return <UI as=\"button\" ref={buttonRef}>Accessible Button</UI>;\n * ```\n */\ntype PolymorphicComponentPropWithRef<\n C extends React.ElementType,\n Props = {},\n> = PolymorphicComponentProp<C, Props> & {\n ref?: PolymorphicRef<C>;\n};\n\n/**\n * Props for the UI component, extending polymorphic props with style and class support.\n *\n * The UI component automatically forwards all ARIA attributes and native HTML props\n * to the rendered element, ensuring full accessibility support. This includes:\n * - `aria-label`, `aria-labelledby` - Accessible names for screen readers\n * - `aria-describedby` - Additional descriptive text references\n * - `aria-expanded`, `aria-controls` - Interactive widget states\n * - `role` - Semantic role override when needed\n * - All other ARIA attributes and HTML props\n *\n * @typeParam C - The HTML element type to render\n * @property {boolean} [renderStyles] - Reserved for future use. Currently has no effect.\n * Styles are always rendered regardless of this prop value.\n * @property {React.CSSProperties} [styles] - Inline styles to apply (overrides defaultStyles)\n * @property {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop\n * @property {string} [classes] - CSS class names to apply to the element\n * @property {string} [id] - HTML id attribute\n * @property {React.ReactNode} [children] - Child elements to render\n *\n * @example\n * ```typescript\n * // All ARIA attributes are automatically forwarded\n * <UI as=\"button\" aria-label=\"Close dialog\" aria-expanded={isOpen}>\n * <CloseIcon />\n * </UI>\n * ```\n */\ntype UIProps<C extends React.ElementType> = PolymorphicComponentPropWithRef<\n C,\n {\n /** @deprecated Reserved for future use. Currently has no effect. Styles are always rendered. */\n renderStyles?: boolean;\n styles?: React.CSSProperties;\n defaultStyles?: React.CSSProperties;\n classes?: string;\n id?: string;\n children?: React.ReactNode;\n }\n>;\n\n/**\n * UI Component function signature.\n *\n * Defines the polymorphic component that can render as any HTML element while\n * maintaining full TypeScript type safety for element-specific props.\n *\n * @typeParam C - The HTML element type to render (defaults to 'div')\n * @param {UIProps<C>} props - Component props including 'as', styles, and native element props\n * @returns {React.ReactElement} A React element of the specified type\n * @example\n * ```typescript\n * <UI as=\"button\" onClick={handler}>Button</UI>\n * <UI as=\"a\" href=\"/link\">Link</UI>\n * <UI>Default div</UI>\n * ```\n */\ntype UIComponent = (<C extends React.ElementType = \"div\">(\n props: UIProps<C>\n) => React.ReactElement | any) & { displayName?: string };\n\n/**\n * UI - A polymorphic React component that can render as any HTML element.\n *\n * The UI component is a foundational primitive used throughout fpkit to create\n * flexible, type-safe components. It implements the polymorphic component pattern,\n * allowing a single component to render as different HTML elements while maintaining\n * full TypeScript type safety for element-specific props.\n *\n * ## Accessibility Considerations\n *\n * The UI component forwards all ARIA attributes and native HTML props, placing\n * accessibility responsibility on the consumer. When creating interactive elements,\n * you MUST ensure WCAG 2.1 AA compliance:\n *\n * - **Accessible Names**: All interactive elements need an accessible name via\n * `aria-label`, `aria-labelledby`, or visible text content\n * - **Semantic HTML**: Prefer semantic elements (`button`, `a`, `nav`) over\n * generic containers (`div`, `span`) with ARIA roles when possible\n * - **Focus Indicators**: Ensure focus indicators meet WCAG 2.4.7 (3:1 contrast)\n * - **Keyboard Support**: Interactive elements must be keyboard accessible\n *\n * @typeParam C - The HTML element type to render (e.g., 'button', 'div', 'a')\n *\n * @param {C} [as='div'] - The HTML element type to render. Defaults to 'div'.\n * @param {React.CSSProperties} [styles] - Inline styles to apply. Overrides defaultStyles.\n * @param {string} [classes] - CSS class names to apply to the element.\n * @param {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop.\n * @param {React.ReactNode} [children] - Child elements to render inside the component.\n * @param {PolymorphicRef<C>} [ref] - Forwarded ref with proper typing for the element type.\n * @param {boolean} [renderStyles] - Reserved for future use. Currently has no effect.\n *\n * @returns {React.ReactElement} A React element of the specified type with merged props.\n *\n * @example\n * // Basic usage - renders as div\n * <UI>Hello World</UI>\n *\n * @example\n * // Polymorphic rendering - renders as button with type-safe props\n * <UI as=\"button\" onClick={handleClick} disabled>\n * Click me\n * </UI>\n *\n * @example\n * // ✅ GOOD: Accessible button with aria-label for icon-only button\n * <UI as=\"button\" aria-label=\"Close dialog\" onClick={handleClose}>\n * <CloseIcon />\n * </UI>\n *\n * @example\n * // ✅ GOOD: Accessible link with descriptive text\n * <UI as=\"a\" href=\"/products\">\n * View all products\n * </UI>\n *\n * @example\n * // ✅ GOOD: Interactive element with proper role and keyboard support\n * <UI\n * as=\"div\"\n * role=\"button\"\n * tabIndex={0}\n * aria-label=\"Toggle menu\"\n * onClick={handleToggle}\n * onKeyDown={(e) => e.key === 'Enter' && handleToggle()}\n * >\n * Menu\n * </UI>\n *\n * @example\n * // ❌ BAD: Button without accessible name (screen readers can't identify it)\n * <UI as=\"button\" onClick={handleClose}>\n * <CloseIcon />\n * </UI>\n *\n * @example\n * // ❌ BAD: Non-semantic div with click handler (not keyboard accessible)\n * <UI as=\"div\" onClick={handleClick}>\n * Click me\n * </UI>\n *\n * @example\n * // ✅ GOOD: Custom focus indicator with WCAG 2.4.7 compliant contrast\n * <UI\n * as=\"button\"\n * styles={{\n * outline: '2px solid transparent',\n * outlineOffset: '2px',\n * }}\n * classes=\"focus:outline-blue-500\"\n * >\n * Accessible Button\n * </UI>\n *\n * @example\n * // Style merging - defaultStyles provide base, styles override\n * <UI\n * as=\"span\"\n * defaultStyles={{ padding: '0.5rem', color: 'blue' }}\n * styles={{ color: 'red' }}\n * >\n * Red text with padding\n * </UI>\n *\n * @example\n * // Ref forwarding for focus management\n * const buttonRef = useRef<HTMLButtonElement>(null);\n * useEffect(() => {\n * // Programmatically focus for keyboard navigation\n * buttonRef.current?.focus();\n * }, []);\n * <UI as=\"button\" ref={buttonRef}>Auto-focused Button</UI>\n *\n * @example\n * // Building accessible higher-level components with TypeScript\n * interface AccessibleButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n * variant?: 'primary' | 'secondary';\n * // Require either aria-label or children for accessibility\n * 'aria-label'?: string;\n * children?: React.ReactNode;\n * }\n *\n * const AccessibleButton = React.forwardRef<HTMLButtonElement, AccessibleButtonProps>(\n * ({ variant = 'primary', ...props }, ref) => {\n * // Runtime check: ensure accessible name is provided\n * if (!props['aria-label'] && !props.children) {\n * console.warn('AccessibleButton requires either aria-label or children');\n * }\n *\n * return (\n * <UI\n * as=\"button\"\n * ref={ref}\n * defaultStyles={{\n * padding: '0.5rem 1rem',\n * borderRadius: '0.25rem',\n * backgroundColor: variant === 'primary' ? '#007bff' : '#6c757d',\n * }}\n * {...props}\n * />\n * );\n * }\n * );\n */\nconst UI: UIComponent = React.forwardRef(\n <C extends React.ElementType>(\n { as, styles, classes, children, defaultStyles, ...props }: UIProps<C>,\n ref?: PolymorphicRef<C>\n ) => {\n const Component = as ?? \"div\";\n\n const styleObj: React.CSSProperties = { ...defaultStyles, ...styles };\n\n return (\n <Component ref={ref} style={styleObj} className={classes} {...props}>\n {children}\n </Component>\n );\n }\n);\n\nexport default UI;\nUI.displayName = \"UI\";\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var e = require('react');
|
|
4
|
+
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var e__default = /*#__PURE__*/_interopDefault(e);
|
|
8
|
+
|
|
9
|
+
var t=e__default.default.forwardRef(({as:o,styles:p,classes:r,children:n,defaultStyles:s,...m},C)=>{let P=o??"div",a={...s,...p};return e__default.default.createElement(P,{ref:C,style:a,className:r,...m},n)}),y=t;t.displayName="UI";
|
|
10
|
+
|
|
11
|
+
exports.a = y;
|
|
12
|
+
//# sourceMappingURL=out.js.map
|
|
13
|
+
//# sourceMappingURL=chunk-L75OQKEI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui.tsx"],"names":["React","UI","as","styles","classes","children","defaultStyles","props","ref","Component","styleObj","ui_default"],"mappings":"AAEA,OAAOA,MAAW,QA4SlB,IAAMC,EAAkBD,EAAM,WAC5B,CACE,CAAE,GAAAE,EAAI,OAAAC,EAAQ,QAAAC,EAAS,SAAAC,EAAU,cAAAC,EAAe,GAAGC,CAAM,EACzDC,IACG,CACH,IAAMC,EAAYP,GAAM,MAElBQ,EAAgC,CAAE,GAAGJ,EAAe,GAAGH,CAAO,EAEpE,OACEH,EAAA,cAACS,EAAA,CAAU,IAAKD,EAAK,MAAOE,EAAU,UAAWN,EAAU,GAAGG,GAC3DF,CACH,CAEJ,CACF,EAEOM,EAAQV,EACfA,EAAG,YAAc","sourcesContent":[" \n/* eslint-disable */\nimport React from \"react\";\n\n/**\n * Extracts the appropriate ref type for a given element type.\n *\n * This utility type ensures that refs are properly typed based on the element\n * being rendered. For example, a button element receives HTMLButtonElement ref.\n *\n * @typeParam C - The HTML element type (e.g., 'button', 'div', 'a')\n * @example\n * ```typescript\n * type ButtonRef = PolymorphicRef<'button'>; // React.Ref<HTMLButtonElement>\n * type DivRef = PolymorphicRef<'div'>; // React.Ref<HTMLDivElement>\n * ```\n */\ntype PolymorphicRef<C extends React.ElementType> =\n React.ComponentPropsWithRef<C>[\"ref\"];\n\n/**\n * Defines the 'as' prop that determines which HTML element to render.\n *\n * This is the core prop that enables polymorphic behavior, allowing components\n * to render as any valid React element type while maintaining type safety.\n *\n * @typeParam C - The HTML element type to render\n * @example\n * ```typescript\n * <UI as=\"button\">Click me</UI>\n * <UI as=\"a\" href=\"/home\">Link</UI>\n * ```\n */\ntype AsProp<C extends React.ElementType> = {\n as?: C;\n};\n\n/**\n * Identifies props that should be omitted to prevent type conflicts.\n *\n * This type ensures that our custom props don't conflict with native element\n * props by calculating which keys need to be omitted from the native props.\n *\n * @typeParam C - The HTML element type\n * @typeParam P - The custom props to merge\n */\ntype PropsToOmit<C extends React.ElementType, P> = keyof (AsProp<C> & P);\n\n/**\n * Merges custom props with native element props while preventing conflicts.\n *\n * This creates a union of our custom props and the native props for the chosen\n * element, omitting any conflicting keys to ensure type safety.\n *\n * @typeParam C - The HTML element type\n * @typeParam Props - The custom props to add\n * @example\n * ```typescript\n * // For a button, this merges custom props with HTMLButtonElement props\n * type ButtonProps = PolymorphicComponentProp<'button', { variant?: string }>;\n * ```\n */\ntype PolymorphicComponentProp<\n C extends React.ElementType,\n Props = {},\n> = React.PropsWithChildren<Props & AsProp<C>> &\n Omit<React.ComponentPropsWithoutRef<C>, PropsToOmit<C, Props>>;\n\n/**\n * Extends PolymorphicComponentProp to include properly-typed ref support.\n *\n * This is the final type in the polymorphic type chain, adding ref forwarding\n * with the correct ref type for the chosen element. The ref is properly typed\n * to match the element being rendered, enabling focus management and direct\n * DOM access for accessibility features like programmatic focus control.\n *\n * @typeParam C - The HTML element type\n * @typeParam Props - The custom props to add\n *\n * @example\n * ```typescript\n * // Using ref for focus management (important for accessibility)\n * const buttonRef = useRef<HTMLButtonElement>(null);\n * useEffect(() => {\n * // Programmatically focus for keyboard navigation\n * buttonRef.current?.focus();\n * }, []);\n *\n * return <UI as=\"button\" ref={buttonRef}>Accessible Button</UI>;\n * ```\n */\ntype PolymorphicComponentPropWithRef<\n C extends React.ElementType,\n Props = {},\n> = PolymorphicComponentProp<C, Props> & {\n ref?: PolymorphicRef<C>;\n};\n\n/**\n * Props for the UI component, extending polymorphic props with style and class support.\n *\n * The UI component automatically forwards all ARIA attributes and native HTML props\n * to the rendered element, ensuring full accessibility support. This includes:\n * - `aria-label`, `aria-labelledby` - Accessible names for screen readers\n * - `aria-describedby` - Additional descriptive text references\n * - `aria-expanded`, `aria-controls` - Interactive widget states\n * - `role` - Semantic role override when needed\n * - All other ARIA attributes and HTML props\n *\n * @typeParam C - The HTML element type to render\n * @property {boolean} [renderStyles] - Reserved for future use. Currently has no effect.\n * Styles are always rendered regardless of this prop value.\n * @property {React.CSSProperties} [styles] - Inline styles to apply (overrides defaultStyles)\n * @property {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop\n * @property {string} [classes] - CSS class names to apply to the element\n * @property {string} [id] - HTML id attribute\n * @property {React.ReactNode} [children] - Child elements to render\n *\n * @example\n * ```typescript\n * // All ARIA attributes are automatically forwarded\n * <UI as=\"button\" aria-label=\"Close dialog\" aria-expanded={isOpen}>\n * <CloseIcon />\n * </UI>\n * ```\n */\ntype UIProps<C extends React.ElementType> = PolymorphicComponentPropWithRef<\n C,\n {\n /** @deprecated Reserved for future use. Currently has no effect. Styles are always rendered. */\n renderStyles?: boolean;\n styles?: React.CSSProperties;\n defaultStyles?: React.CSSProperties;\n classes?: string;\n id?: string;\n children?: React.ReactNode;\n }\n>;\n\n/**\n * UI Component function signature.\n *\n * Defines the polymorphic component that can render as any HTML element while\n * maintaining full TypeScript type safety for element-specific props.\n *\n * @typeParam C - The HTML element type to render (defaults to 'div')\n * @param {UIProps<C>} props - Component props including 'as', styles, and native element props\n * @returns {React.ReactElement} A React element of the specified type\n * @example\n * ```typescript\n * <UI as=\"button\" onClick={handler}>Button</UI>\n * <UI as=\"a\" href=\"/link\">Link</UI>\n * <UI>Default div</UI>\n * ```\n */\ntype UIComponent = (<C extends React.ElementType = \"div\">(\n props: UIProps<C>\n) => React.ReactElement | any) & { displayName?: string };\n\n/**\n * UI - A polymorphic React component that can render as any HTML element.\n *\n * The UI component is a foundational primitive used throughout fpkit to create\n * flexible, type-safe components. It implements the polymorphic component pattern,\n * allowing a single component to render as different HTML elements while maintaining\n * full TypeScript type safety for element-specific props.\n *\n * ## Accessibility Considerations\n *\n * The UI component forwards all ARIA attributes and native HTML props, placing\n * accessibility responsibility on the consumer. When creating interactive elements,\n * you MUST ensure WCAG 2.1 AA compliance:\n *\n * - **Accessible Names**: All interactive elements need an accessible name via\n * `aria-label`, `aria-labelledby`, or visible text content\n * - **Semantic HTML**: Prefer semantic elements (`button`, `a`, `nav`) over\n * generic containers (`div`, `span`) with ARIA roles when possible\n * - **Focus Indicators**: Ensure focus indicators meet WCAG 2.4.7 (3:1 contrast)\n * - **Keyboard Support**: Interactive elements must be keyboard accessible\n *\n * @typeParam C - The HTML element type to render (e.g., 'button', 'div', 'a')\n *\n * @param {C} [as='div'] - The HTML element type to render. Defaults to 'div'.\n * @param {React.CSSProperties} [styles] - Inline styles to apply. Overrides defaultStyles.\n * @param {string} [classes] - CSS class names to apply to the element.\n * @param {React.CSSProperties} [defaultStyles] - Base styles that can be overridden by styles prop.\n * @param {React.ReactNode} [children] - Child elements to render inside the component.\n * @param {PolymorphicRef<C>} [ref] - Forwarded ref with proper typing for the element type.\n * @param {boolean} [renderStyles] - Reserved for future use. Currently has no effect.\n *\n * @returns {React.ReactElement} A React element of the specified type with merged props.\n *\n * @example\n * // Basic usage - renders as div\n * <UI>Hello World</UI>\n *\n * @example\n * // Polymorphic rendering - renders as button with type-safe props\n * <UI as=\"button\" onClick={handleClick} disabled>\n * Click me\n * </UI>\n *\n * @example\n * // ✅ GOOD: Accessible button with aria-label for icon-only button\n * <UI as=\"button\" aria-label=\"Close dialog\" onClick={handleClose}>\n * <CloseIcon />\n * </UI>\n *\n * @example\n * // ✅ GOOD: Accessible link with descriptive text\n * <UI as=\"a\" href=\"/products\">\n * View all products\n * </UI>\n *\n * @example\n * // ✅ GOOD: Interactive element with proper role and keyboard support\n * <UI\n * as=\"div\"\n * role=\"button\"\n * tabIndex={0}\n * aria-label=\"Toggle menu\"\n * onClick={handleToggle}\n * onKeyDown={(e) => e.key === 'Enter' && handleToggle()}\n * >\n * Menu\n * </UI>\n *\n * @example\n * // ❌ BAD: Button without accessible name (screen readers can't identify it)\n * <UI as=\"button\" onClick={handleClose}>\n * <CloseIcon />\n * </UI>\n *\n * @example\n * // ❌ BAD: Non-semantic div with click handler (not keyboard accessible)\n * <UI as=\"div\" onClick={handleClick}>\n * Click me\n * </UI>\n *\n * @example\n * // ✅ GOOD: Custom focus indicator with WCAG 2.4.7 compliant contrast\n * <UI\n * as=\"button\"\n * styles={{\n * outline: '2px solid transparent',\n * outlineOffset: '2px',\n * }}\n * classes=\"focus:outline-blue-500\"\n * >\n * Accessible Button\n * </UI>\n *\n * @example\n * // Style merging - defaultStyles provide base, styles override\n * <UI\n * as=\"span\"\n * defaultStyles={{ padding: '0.5rem', color: 'blue' }}\n * styles={{ color: 'red' }}\n * >\n * Red text with padding\n * </UI>\n *\n * @example\n * // Ref forwarding for focus management\n * const buttonRef = useRef<HTMLButtonElement>(null);\n * useEffect(() => {\n * // Programmatically focus for keyboard navigation\n * buttonRef.current?.focus();\n * }, []);\n * <UI as=\"button\" ref={buttonRef}>Auto-focused Button</UI>\n *\n * @example\n * // Building accessible higher-level components with TypeScript\n * interface AccessibleButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n * variant?: 'primary' | 'secondary';\n * // Require either aria-label or children for accessibility\n * 'aria-label'?: string;\n * children?: React.ReactNode;\n * }\n *\n * const AccessibleButton = React.forwardRef<HTMLButtonElement, AccessibleButtonProps>(\n * ({ variant = 'primary', ...props }, ref) => {\n * // Runtime check: ensure accessible name is provided\n * if (!props['aria-label'] && !props.children) {\n * console.warn('AccessibleButton requires either aria-label or children');\n * }\n *\n * return (\n * <UI\n * as=\"button\"\n * ref={ref}\n * defaultStyles={{\n * padding: '0.5rem 1rem',\n * borderRadius: '0.25rem',\n * backgroundColor: variant === 'primary' ? '#007bff' : '#6c757d',\n * }}\n * {...props}\n * />\n * );\n * }\n * );\n */\nconst UI: UIComponent = React.forwardRef(\n <C extends React.ElementType>(\n { as, styles, classes, children, defaultStyles, ...props }: UIProps<C>,\n ref?: PolymorphicRef<C>\n ) => {\n const Component = as ?? \"div\";\n\n const styleObj: React.CSSProperties = { ...defaultStyles, ...styles };\n\n return (\n <Component ref={ref} style={styleObj} className={classes} {...props}>\n {children}\n </Component>\n );\n }\n);\n\nexport default UI;\nUI.displayName = \"UI\";\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
4
4
|
var y = require('react');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
|
|
8
8
|
var y__default = /*#__PURE__*/_interopDefault(y);
|
|
9
9
|
|
|
10
|
-
var s=({id:p,classes:c,value:x,rows:m=5,cols:h=25,name:T,required:a,disabled:t,readOnly:i,onBlur:r,onPointerDown:n,onChange:o,ref:d,styles:f,placeholder:P,...u})=>y__default.default.createElement(
|
|
10
|
+
var s=({id:p,classes:c,value:x,rows:m=5,cols:h=25,name:T,required:a,disabled:t,readOnly:i,onBlur:r,onPointerDown:n,onChange:o,ref:d,styles:f,placeholder:P,...u})=>y__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"textarea",id:p,name:T,rows:m,cols:h,styles:f,className:c,"data-style":"textarea",required:a,value:x,"aria-disabled":t,readOnly:i,onChange:e=>{o&&!t&&o?.(e);},onBlur:e=>{r&&!t&&r?.(e);},onPointerDown:e=>{n&&!t&&n?.(e);},ref:d,placeholder:P||`${a?"*":""} Message`,...u}),M=s;s.displayName="Textarea";
|
|
11
11
|
|
|
12
12
|
exports.a = s;
|
|
13
13
|
exports.b = M;
|
|
14
14
|
//# sourceMappingURL=out.js.map
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-M5RRNTVX.cjs.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a } from './chunk-
|
|
1
|
+
import { a } from './chunk-KUKIVRC2.js';
|
|
2
2
|
import m from 'react';
|
|
3
3
|
|
|
4
4
|
var l=({elm:e="p",id:t,text:o,styles:s,classes:p,children:r,...i})=>m.createElement(a,{as:e,id:t,styles:s,className:p,...i},m.createElement(a,{as:e,id:t,styles:s,className:p,...i},r||o)),n=({elm:e="h3",id:t,children:o,styles:s,classes:p,...r})=>m.createElement(l,{as:e,id:t,styles:s,className:p,...r},o),d=l;l.displayName="Text";n.displayName="Title";
|
|
5
5
|
|
|
6
6
|
export { l as a, n as b, d as c };
|
|
7
7
|
//# sourceMappingURL=out.js.map
|
|
8
|
-
//# sourceMappingURL=chunk-
|
|
8
|
+
//# sourceMappingURL=chunk-NGTJDDFO.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5S4ORA4C_cjs = require('./chunk-5S4ORA4C.cjs');
|
|
4
|
+
var chunkL75OQKEI_cjs = require('./chunk-L75OQKEI.cjs');
|
|
5
|
+
var e = require('react');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var e__default = /*#__PURE__*/_interopDefault(e);
|
|
10
|
+
|
|
11
|
+
var U=(r,t=15)=>r.length>t?`${r.slice(0,t)}...`:r;var i=e__default.default.memo(({children:r,id:t,styles:n,classes:a,...o})=>e__default.default.createElement("li",{id:t,style:n,className:a,"data-list":"unstyled inline",...o},r));i.displayName="BreadcrumbItem";var f=e__default.default.memo(({children:r,...t})=>e__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"ol","data-list":"unstyled inline",...t},r));f.displayName="BreadcrumbList";var y=e__default.default.memo(({styles:r,id:t,classes:n,children:a,...o})=>e__default.default.createElement(chunkL75OQKEI_cjs.a,{as:"nav",id:t,styles:r,className:n,...o},e__default.default.createElement(f,null,a)));y.displayName="BreadcrumbNav";function w(r,t){let n=e__default.default.useMemo(()=>r?r.split("/").filter(s=>s):[],[r]),a=e__default.default.useCallback(s=>{let m=t?.find(p=>p.path===s);return {path:m?.path||s,name:m?.name||s,url:m?.url||s}},[t]),o=e__default.default.useMemo(()=>n.map((s,m)=>({...a(s),isLast:m===n.length-1,index:m})),[n,a]);return {segments:o,hasSegments:o.length>0}}var l=({startRoute:r="Home",startRouteUrl:t="/",currentRoute:n,spacer:a=e__default.default.createElement(e__default.default.Fragment,null,"/"),routes:o,styles:s,id:m,classes:p,ariaLabel:k="Breadcrumb",truncateLength:B=15,linkProps:I,...P})=>{let{segments:N,hasSegments:$}=w(n,o),c=e__default.default.useId();return !n?.length||!$?null:e__default.default.createElement(y,{id:m,styles:s,className:p,"aria-label":k,...P},e__default.default.createElement(i,{key:`start-${c}`},e__default.default.createElement(chunk5S4ORA4C_cjs.b,{href:t,...I},r)),N.map(({name:v,url:x,path:u,isLast:M,index:h})=>{let d=decodeURIComponent(v),C=U(d,B),L=d.length>B;if(M){let S=h>0?N[h-1].path:null;return !u||u.length<=3||u===S?null:e__default.default.createElement(i,{key:`${u}-${c}`},e__default.default.createElement("span",{"aria-hidden":"true"},a),e__default.default.createElement("span",{"aria-current":"page","aria-label":L?d:void 0},C))}return e__default.default.createElement(i,{key:`${u}-${c}`},e__default.default.createElement("span",{"aria-hidden":"true"},a),e__default.default.createElement(chunk5S4ORA4C_cjs.b,{href:x,"aria-label":L?d:void 0,...I},C))}))},H=l;l.displayName="Breadcrumb";l.Nav=y;l.List=f;l.Item=i;
|
|
12
|
+
|
|
13
|
+
exports.a = w;
|
|
14
|
+
exports.b = l;
|
|
15
|
+
exports.c = H;
|
|
16
|
+
//# sourceMappingURL=out.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-OK5QEIMD.cjs.map
|