@fpkit/acss 3.1.1 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/libs/{chunk-2NRIP6RB.cjs → chunk-2C3YLBWP.cjs} +3 -3
  2. package/libs/{chunk-NWJDAHP6.cjs → chunk-2GJHKWEK.cjs} +3 -3
  3. package/libs/{chunk-FVROL3V5.js → chunk-2JCDEC32.js} +3 -3
  4. package/libs/{chunk-IRLFZ3OL.js → chunk-3XJC4XUG.js} +2 -2
  5. package/libs/{chunk-L6PRDL6F.cjs → chunk-5CJPTDK3.cjs} +3 -3
  6. package/libs/{chunk-E4OSROCA.cjs → chunk-5QSNJQVH.cjs} +3 -3
  7. package/libs/{chunk-O3JIHC5M.cjs → chunk-6BUJZ4DJ.cjs} +3 -3
  8. package/libs/{chunk-WXBFBWYF.cjs → chunk-AFINOD2L.cjs} +3 -3
  9. package/libs/{chunk-HRRHPLER.js → chunk-AWZLSWDO.js} +2 -2
  10. package/libs/chunk-DDSXKOUB.js +7 -0
  11. package/libs/chunk-DDSXKOUB.js.map +1 -0
  12. package/libs/{chunk-CWRNJA4P.js → chunk-DIJBIOFE.js} +3 -3
  13. package/libs/chunk-EJ6KYBFE.cjs +13 -0
  14. package/libs/chunk-EJ6KYBFE.cjs.map +1 -0
  15. package/libs/{chunk-GUJSMQ3V.cjs → chunk-EKJYOCLY.cjs} +3 -3
  16. package/libs/{chunk-X5RKCLDC.cjs → chunk-F64GE6RG.cjs} +4 -4
  17. package/libs/{chunk-5RAWNUVD.js → chunk-IBUTNPTQ.js} +2 -2
  18. package/libs/{chunk-ZFJ4U45S.js → chunk-KDMX3FAW.js} +2 -2
  19. package/libs/{chunk-DYFAUAB7.cjs → chunk-LXODKKA3.cjs} +4 -4
  20. package/libs/{chunk-MPTMPBFT.js → chunk-M7JLT62Q.js} +2 -2
  21. package/libs/{chunk-IQ76HGVP.js → chunk-MBWI67UT.js} +2 -2
  22. package/libs/{chunk-O5XAJ7BY.cjs → chunk-NCGVF2QS.cjs} +4 -4
  23. package/libs/{chunk-W2UIN7EV.cjs → chunk-NPWHQVYB.cjs} +3 -3
  24. package/libs/chunk-OU52NIKA.js +8 -0
  25. package/libs/chunk-OU52NIKA.js.map +1 -0
  26. package/libs/{chunk-43TK2ICH.js → chunk-PMWL5XZ4.js} +3 -3
  27. package/libs/{chunk-KVKQLRJG.js → chunk-TF3GQKOY.js} +2 -2
  28. package/libs/{chunk-IEB64SWY.js → chunk-U5VA34SU.js} +2 -2
  29. package/libs/{chunk-EE3ZWSBY.cjs → chunk-URBGDUFN.cjs} +6 -6
  30. package/libs/chunk-WWPLBWCQ.cjs +18 -0
  31. package/libs/chunk-WWPLBWCQ.cjs.map +1 -0
  32. package/libs/{chunk-TPIB3RQP.js → chunk-ZF6Y7W57.js} +5 -5
  33. package/libs/component-props-50e69975.d.ts +66 -0
  34. package/libs/components/box/box.css +1 -0
  35. package/libs/components/box/box.css.map +1 -0
  36. package/libs/components/box/box.min.css +3 -0
  37. package/libs/components/breadcrumbs/breadcrumb.cjs +6 -6
  38. package/libs/components/breadcrumbs/breadcrumb.js +3 -3
  39. package/libs/components/button.cjs +4 -4
  40. package/libs/components/button.d.cts +10 -3
  41. package/libs/components/button.d.ts +10 -3
  42. package/libs/components/button.js +2 -2
  43. package/libs/components/card.cjs +7 -7
  44. package/libs/components/card.d.cts +13 -85
  45. package/libs/components/card.d.ts +13 -85
  46. package/libs/components/card.js +2 -2
  47. package/libs/components/cards/card.css +1 -1
  48. package/libs/components/cards/card.css.map +1 -1
  49. package/libs/components/cards/card.min.css +2 -2
  50. package/libs/components/cluster/cluster.css +1 -0
  51. package/libs/components/cluster/cluster.css.map +1 -0
  52. package/libs/components/cluster/cluster.min.css +3 -0
  53. package/libs/components/dialog/dialog.cjs +7 -7
  54. package/libs/components/dialog/dialog.js +5 -5
  55. package/libs/components/form/fields.cjs +4 -4
  56. package/libs/components/form/fields.js +2 -2
  57. package/libs/components/form/textarea.cjs +4 -4
  58. package/libs/components/form/textarea.js +2 -2
  59. package/libs/components/grid/grid.css +1 -0
  60. package/libs/components/grid/grid.css.map +1 -0
  61. package/libs/components/grid/grid.min.css +3 -0
  62. package/libs/components/heading/heading.cjs +3 -3
  63. package/libs/components/heading/heading.js +2 -2
  64. package/libs/components/icons/icon.cjs +4 -4
  65. package/libs/components/icons/icon.d.cts +2 -2
  66. package/libs/components/icons/icon.d.ts +2 -2
  67. package/libs/components/icons/icon.js +2 -2
  68. package/libs/components/link/link.cjs +6 -6
  69. package/libs/components/link/link.js +2 -2
  70. package/libs/components/list/list.cjs +5 -5
  71. package/libs/components/list/list.js +2 -2
  72. package/libs/components/modal.cjs +4 -4
  73. package/libs/components/modal.d.cts +1 -1
  74. package/libs/components/modal.d.ts +1 -1
  75. package/libs/components/modal.js +3 -3
  76. package/libs/components/nav/nav.cjs +7 -7
  77. package/libs/components/nav/nav.js +3 -3
  78. package/libs/components/stack/stack.css +1 -0
  79. package/libs/components/stack/stack.css.map +1 -0
  80. package/libs/components/stack/stack.min.css +3 -0
  81. package/libs/components/tables/table.d.cts +1 -1
  82. package/libs/components/tables/table.d.ts +1 -1
  83. package/libs/components/text/text.cjs +5 -5
  84. package/libs/components/text/text.js +2 -2
  85. package/libs/hooks.cjs +4 -4
  86. package/libs/hooks.js +3 -3
  87. package/libs/{icons-287fce3a.d.ts → icons-df8e744f.d.ts} +1 -1
  88. package/libs/icons.cjs +3 -3
  89. package/libs/icons.d.cts +2 -2
  90. package/libs/icons.d.ts +2 -2
  91. package/libs/icons.js +2 -2
  92. package/libs/index.cjs +64 -63
  93. package/libs/index.cjs.map +1 -1
  94. package/libs/index.css +1 -1
  95. package/libs/index.css.map +1 -1
  96. package/libs/index.d.cts +923 -4
  97. package/libs/index.d.ts +923 -4
  98. package/libs/index.js +28 -28
  99. package/libs/index.js.map +1 -1
  100. package/package.json +2 -2
  101. package/src/components/alert/STYLES.mdx +790 -0
  102. package/src/components/badge/STYLES.mdx +610 -0
  103. package/src/components/box/README.mdx +401 -0
  104. package/src/components/box/STYLES.mdx +360 -0
  105. package/src/components/box/box.scss +245 -0
  106. package/src/components/box/box.stories.tsx +395 -0
  107. package/src/components/box/box.test.tsx +425 -0
  108. package/src/components/box/box.tsx +170 -0
  109. package/src/components/box/box.types.ts +166 -0
  110. package/src/components/breadcrumbs/STYLES.mdx +99 -0
  111. package/src/components/buttons/STYLES.mdx +766 -0
  112. package/src/components/cards/STYLES.mdx +835 -0
  113. package/src/components/cards/card.scss +30 -21
  114. package/src/components/cards/card.stories.tsx +120 -80
  115. package/src/components/cards/card.tsx +14 -4
  116. package/src/components/cards/card.types.ts +13 -0
  117. package/src/components/cluster/README.mdx +595 -0
  118. package/src/components/cluster/STYLES.mdx +626 -0
  119. package/src/components/cluster/cluster.scss +86 -0
  120. package/src/components/cluster/cluster.stories.tsx +385 -0
  121. package/src/components/cluster/cluster.test.tsx +655 -0
  122. package/src/components/cluster/cluster.tsx +94 -0
  123. package/src/components/cluster/cluster.types.ts +75 -0
  124. package/src/components/details/STYLES.mdx +445 -0
  125. package/src/components/dialog/STYLES.mdx +888 -0
  126. package/src/components/flexbox/STYLES.mdx +1 -1
  127. package/src/components/form/STYLES.mdx +821 -0
  128. package/src/components/grid/README.mdx +709 -0
  129. package/src/components/grid/STYLES.mdx +785 -0
  130. package/src/components/grid/grid.scss +287 -0
  131. package/src/components/grid/grid.stories.tsx +486 -0
  132. package/src/components/grid/grid.test.tsx +981 -0
  133. package/src/components/grid/grid.tsx +222 -0
  134. package/src/components/grid/grid.types.ts +344 -0
  135. package/src/components/icons/STYLES.mdx +56 -0
  136. package/src/components/images/STYLES.mdx +75 -0
  137. package/src/components/layout/STYLES.mdx +556 -0
  138. package/src/components/link/STYLES.mdx +75 -0
  139. package/src/components/list/STYLES.mdx +631 -0
  140. package/src/components/nav/STYLES.mdx +460 -0
  141. package/src/components/progress/STYLES.mdx +64 -0
  142. package/src/components/stack/README.mdx +400 -0
  143. package/src/components/stack/STYLES.mdx +414 -0
  144. package/src/components/stack/stack.scss +109 -0
  145. package/src/components/stack/stack.stories.tsx +559 -0
  146. package/src/components/stack/stack.test.tsx +426 -0
  147. package/src/components/stack/stack.tsx +141 -0
  148. package/src/components/stack/stack.types.ts +133 -0
  149. package/src/components/tag/STYLES.mdx +105 -0
  150. package/src/components/text-to-speech/STYLES.mdx +80 -0
  151. package/src/components/ui.tsx +3 -3
  152. package/src/index.scss +7 -2
  153. package/src/index.ts +305 -12
  154. package/src/sass/GLOBALS-STYLES.md +631 -0
  155. package/src/sass/_globals.scss +45 -24
  156. package/src/sass/_styles.scss +2 -2
  157. package/src/styles/box/box.css +220 -0
  158. package/src/styles/box/box.css.map +1 -0
  159. package/src/styles/cards/card.css +23 -17
  160. package/src/styles/cards/card.css.map +1 -1
  161. package/src/styles/cluster/cluster.css +71 -0
  162. package/src/styles/cluster/cluster.css.map +1 -0
  163. package/src/styles/grid/grid.css +238 -0
  164. package/src/styles/grid/grid.css.map +1 -0
  165. package/src/styles/index.css +668 -49
  166. package/src/styles/index.css.map +1 -1
  167. package/src/styles/stack/stack.css +86 -0
  168. package/src/styles/stack/stack.css.map +1 -0
  169. package/src/types/component-props.ts +42 -14
  170. package/src/types/layout-primitives.ts +48 -0
  171. package/src/types/shared.ts +10 -26
  172. package/libs/chunk-ENTCUJ3A.cjs +0 -13
  173. package/libs/chunk-ENTCUJ3A.cjs.map +0 -1
  174. package/libs/chunk-HHLNOC5T.js +0 -7
  175. package/libs/chunk-HHLNOC5T.js.map +0 -1
  176. package/libs/chunk-KK47SYZI.js +0 -8
  177. package/libs/chunk-KK47SYZI.js.map +0 -1
  178. package/libs/chunk-W5TKWBFC.cjs +0 -18
  179. package/libs/chunk-W5TKWBFC.cjs.map +0 -1
  180. package/libs/component-props-67d978a2.d.ts +0 -38
  181. /package/libs/{chunk-2NRIP6RB.cjs.map → chunk-2C3YLBWP.cjs.map} +0 -0
  182. /package/libs/{chunk-NWJDAHP6.cjs.map → chunk-2GJHKWEK.cjs.map} +0 -0
  183. /package/libs/{chunk-FVROL3V5.js.map → chunk-2JCDEC32.js.map} +0 -0
  184. /package/libs/{chunk-IRLFZ3OL.js.map → chunk-3XJC4XUG.js.map} +0 -0
  185. /package/libs/{chunk-L6PRDL6F.cjs.map → chunk-5CJPTDK3.cjs.map} +0 -0
  186. /package/libs/{chunk-E4OSROCA.cjs.map → chunk-5QSNJQVH.cjs.map} +0 -0
  187. /package/libs/{chunk-O3JIHC5M.cjs.map → chunk-6BUJZ4DJ.cjs.map} +0 -0
  188. /package/libs/{chunk-WXBFBWYF.cjs.map → chunk-AFINOD2L.cjs.map} +0 -0
  189. /package/libs/{chunk-HRRHPLER.js.map → chunk-AWZLSWDO.js.map} +0 -0
  190. /package/libs/{chunk-CWRNJA4P.js.map → chunk-DIJBIOFE.js.map} +0 -0
  191. /package/libs/{chunk-GUJSMQ3V.cjs.map → chunk-EKJYOCLY.cjs.map} +0 -0
  192. /package/libs/{chunk-X5RKCLDC.cjs.map → chunk-F64GE6RG.cjs.map} +0 -0
  193. /package/libs/{chunk-5RAWNUVD.js.map → chunk-IBUTNPTQ.js.map} +0 -0
  194. /package/libs/{chunk-ZFJ4U45S.js.map → chunk-KDMX3FAW.js.map} +0 -0
  195. /package/libs/{chunk-DYFAUAB7.cjs.map → chunk-LXODKKA3.cjs.map} +0 -0
  196. /package/libs/{chunk-MPTMPBFT.js.map → chunk-M7JLT62Q.js.map} +0 -0
  197. /package/libs/{chunk-IQ76HGVP.js.map → chunk-MBWI67UT.js.map} +0 -0
  198. /package/libs/{chunk-O5XAJ7BY.cjs.map → chunk-NCGVF2QS.cjs.map} +0 -0
  199. /package/libs/{chunk-W2UIN7EV.cjs.map → chunk-NPWHQVYB.cjs.map} +0 -0
  200. /package/libs/{chunk-43TK2ICH.js.map → chunk-PMWL5XZ4.js.map} +0 -0
  201. /package/libs/{chunk-KVKQLRJG.js.map → chunk-TF3GQKOY.js.map} +0 -0
  202. /package/libs/{chunk-IEB64SWY.js.map → chunk-U5VA34SU.js.map} +0 -0
  203. /package/libs/{chunk-EE3ZWSBY.cjs.map → chunk-URBGDUFN.cjs.map} +0 -0
  204. /package/libs/{chunk-TPIB3RQP.js.map → chunk-ZF6Y7W57.js.map} +0 -0
@@ -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","CardRoot","styles","id","interactive","tabIndex","role","ariaLabel","ariaLabelledBy","ariaDescribedBy","Card","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,CDxBO,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,cAuErB,IAAMC,EAAW,CAAC,CAChB,GAAAL,EAAK,MACL,OAAAM,EACA,SAAAT,EACA,QAAAN,EAAU,YACV,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,GAKSiB,EAAOT,EACpBS,EAAK,YAAc,OACnBA,EAAK,MAAQlB,EACbkB,EAAK,QAAUX,EACfW,EAAK,OAASV,EAEd,IAAOW,EAAQD","sourcesContent":["import React from 'react'\nimport UI from '#components/ui'\nimport type {\n CardProps,\n CardTitleProps,\n CardContentProps,\n CardFooterProps,\n CardComponent,\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 */\nconst CardRoot = ({\n as = 'div',\n styles,\n children,\n classes = 'shadow-sm',\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\n// Create compound component with proper TypeScript typing\nexport const Card = CardRoot as CardComponent\nCard.displayName = 'Card'\nCard.Title = Title\nCard.Content = Content\nCard.Footer = Footer\n\nexport default Card\n\n// Export types for external consumption\nexport type {\n CardProps,\n CardTitleProps,\n CardContentProps,\n CardFooterProps,\n CardComponent,\n} 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"]}
@@ -1,9 +1,9 @@
1
- import { a as a$1 } from './chunk-KVKQLRJG.js';
2
- import { a } from './chunk-HHLNOC5T.js';
1
+ import { a as a$1 } from './chunk-TF3GQKOY.js';
2
+ import { a } from './chunk-DDSXKOUB.js';
3
3
  import e from 'react';
4
4
 
5
5
  var l=({id:n,children:a$1,classes:r,modalRef:d,openOnMount:i,...t})=>e.createElement(a,{as:"dialog",id:n,classes:r,ref:d,open:i,onClick:o=>{o.currentTarget===o.target&&o.currentTarget.close();},...t},a$1);e.memo(l);l.displayName="Dialog";var u=({openChild:n,closeChild:a,modalHeader:r,modalFooter:d,children:i,showOpen:t=!1,...p})=>{let o=e.useRef(null),f=()=>{o.current&&(t?o.current.show():o.current.showModal());},M=()=>{o.current&&o.current.close();};return e.createElement(e.Fragment,null,e.createElement(l,{modalRef:o,openOnMount:t,...p},e.createElement("section",null,r,i,d??e.createElement("div",null,e.createElement(a$1,{type:"button",pointerDown:()=>{M();}},a||"Close")," "))),!t&&e.createElement(a$1,{type:"button",pointerDown:f},n||"Open Modal"))};u.displayName="Modal";
6
6
 
7
7
  export { u as a };
8
8
  //# sourceMappingURL=out.js.map
9
- //# sourceMappingURL=chunk-43TK2ICH.js.map
9
+ //# sourceMappingURL=chunk-PMWL5XZ4.js.map
@@ -1,10 +1,10 @@
1
1
  import { a } from './chunk-BFK62VX5.js';
2
2
  import { a as a$1 } from './chunk-75QHTLFO.js';
3
- import { a as a$2 } from './chunk-HHLNOC5T.js';
3
+ import { a as a$2 } from './chunk-DDSXKOUB.js';
4
4
  import D from 'react';
5
5
 
6
6
  var r=({type:a$3="button",children:n,styles:p,disabled:i,isDisabled:l,classes:m,onPointerDown:u,onPointerOver:d,onPointerLeave:b,onClick:P,onKeyDown:c,...y})=>{let B=a(i,l),{disabledProps:t,handlers:f}=a$1(B,{handlers:{onClick:P,onPointerDown:u,onKeyDown:c},className:m});return D.createElement(a$2,{as:"button",type:a$3,"aria-disabled":t["aria-disabled"],onPointerOver:d,onPointerLeave:b,style:p,className:t.className,...f,...y},n)};var h=r;r.displayName="Button";
7
7
 
8
8
  export { r as a, h as b };
9
9
  //# sourceMappingURL=out.js.map
10
- //# sourceMappingURL=chunk-KVKQLRJG.js.map
10
+ //# sourceMappingURL=chunk-TF3GQKOY.js.map
@@ -1,8 +1,8 @@
1
- import { a as a$1 } from './chunk-HHLNOC5T.js';
1
+ import { a as a$1 } from './chunk-DDSXKOUB.js';
2
2
  import t from 'react';
3
3
 
4
4
  var n=t.forwardRef(({type:e="li",id:s,styles:i,children:r,classes:o,...L},m)=>t.createElement(a$1,{id:s,as:e,className:o,style:i,ref:m,...L},r));n.displayName="ListItem";var a=t.forwardRef(({children:e,classes:s,type:i="ul",variant:r,styles:o,role:L,...m},l)=>t.createElement(a$1,{as:i,"data-variant":r,className:s,style:o,role:L,ref:l,...m},e));a.displayName="List";var f=Object.assign(a,{ListItem:n}),d=f;
5
5
 
6
6
  export { n as a, a as b, d as c };
7
7
  //# sourceMappingURL=out.js.map
8
- //# sourceMappingURL=chunk-IEB64SWY.js.map
8
+ //# sourceMappingURL=chunk-U5VA34SU.js.map
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunk2NRIP6RB_cjs = require('./chunk-2NRIP6RB.cjs');
4
- var chunkL6PRDL6F_cjs = require('./chunk-L6PRDL6F.cjs');
5
- var chunkE4OSROCA_cjs = require('./chunk-E4OSROCA.cjs');
6
- var chunkENTCUJ3A_cjs = require('./chunk-ENTCUJ3A.cjs');
3
+ var chunk2C3YLBWP_cjs = require('./chunk-2C3YLBWP.cjs');
4
+ var chunk5CJPTDK3_cjs = require('./chunk-5CJPTDK3.cjs');
5
+ var chunk5QSNJQVH_cjs = require('./chunk-5QSNJQVH.cjs');
6
+ var chunkEJ6KYBFE_cjs = require('./chunk-EJ6KYBFE.cjs');
7
7
  var s = require('react');
8
8
 
9
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
10
 
11
11
  var s__default = /*#__PURE__*/_interopDefault(s);
12
12
 
13
- var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a=s.useCallback(()=>{o();},[o]);return s__default.default.createElement(chunkENTCUJ3A_cjs.a,{as:"div",classes:"dialog-header"},s__default.default.createElement(chunk2NRIP6RB_cjs.b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s__default.default.createElement(chunkE4OSROCA_cjs.b,{type:"button",onClick:a,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s__default.default.createElement(chunkL6PRDL6F_cjs.b,null,s__default.default.createElement(chunkL6PRDL6F_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(chunkENTCUJ3A_cjs.a,{as:"section",className:"dialog-footer"},e&&s__default.default.createElement(chunkE4OSROCA_cjs.b,{type:"button",onClick:a,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s__default.default.createElement(chunkE4OSROCA_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(chunkENTCUJ3A_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(chunkENTCUJ3A_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);
13
+ var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a=s.useCallback(()=>{o();},[o]);return s__default.default.createElement(chunkEJ6KYBFE_cjs.a,{as:"div",classes:"dialog-header"},s__default.default.createElement(chunk2C3YLBWP_cjs.b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s__default.default.createElement(chunk5QSNJQVH_cjs.b,{type:"button",onClick:a,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s__default.default.createElement(chunk5CJPTDK3_cjs.b,null,s__default.default.createElement(chunk5CJPTDK3_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(chunkEJ6KYBFE_cjs.a,{as:"section",className:"dialog-footer"},e&&s__default.default.createElement(chunk5QSNJQVH_cjs.b,{type:"button",onClick:a,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s__default.default.createElement(chunk5QSNJQVH_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(chunkEJ6KYBFE_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(chunkEJ6KYBFE_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
14
 
15
15
  exports.a = F;
16
16
  exports.b = ao;
17
17
  //# sourceMappingURL=out.js.map
18
- //# sourceMappingURL=chunk-EE3ZWSBY.cjs.map
18
+ //# sourceMappingURL=chunk-URBGDUFN.cjs.map
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ var chunkEJ6KYBFE_cjs = require('./chunk-EJ6KYBFE.cjs');
4
+ var p = require('react');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var p__default = /*#__PURE__*/_interopDefault(p);
9
+
10
+ function i(...e){return e.filter(Boolean).join(" ")}var C={CARD:"card",TITLE:"card-title",CONTENT:"card-content",FOOTER:"card-footer"};function y(e,r){r&&(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),r(e));}var m=({children:e,className:r,style:a,as:o="h3",...t})=>p__default.default.createElement(chunkEJ6KYBFE_cjs.a,{as:o,className:i(C.TITLE,r),styles:a,...t},e);m.displayName="Card.Title";var f=({children:e,className:r,style:a,as:o="article",...t})=>p__default.default.createElement(chunkEJ6KYBFE_cjs.a,{as:o,className:i(C.CONTENT,r),styles:a,...t},e);f.displayName="Card.Content";var b=({children:e,className:r,style:a,as:o="div",...t})=>p__default.default.createElement(chunkEJ6KYBFE_cjs.a,{as:o,className:i(C.FOOTER,r),styles:a,...t},e);b.displayName="Card.Footer";var x=({as:e="div",styles:r,children:a,classes:o="shadow-sm",id:t,interactive:s=!1,onClick:n,tabIndex:u,role:c,"aria-label":T,"aria-labelledby":E,"aria-describedby":P,...N})=>(p__default.default.useEffect(()=>{},[n,s]),p__default.default.createElement(chunkEJ6KYBFE_cjs.a,{as:e,id:t,styles:r,className:o,"aria-label":T,"aria-labelledby":E,"aria-describedby":P,"data-card":s?"interactive":!0,...s?{role:c||"button",tabIndex:u??0,onClick:n,onKeyDown:v=>{(s||n)&&y(v,n);}}:{role:c,onClick:n},...N},a)),l=x;l.displayName="Card";l.Title=m;l.Content=f;l.Footer=b;var h=l;
11
+
12
+ exports.a = m;
13
+ exports.b = f;
14
+ exports.c = b;
15
+ exports.d = l;
16
+ exports.e = h;
17
+ //# sourceMappingURL=out.js.map
18
+ //# sourceMappingURL=chunk-WWPLBWCQ.cjs.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","CardRoot","styles","id","interactive","tabIndex","role","ariaLabel","ariaLabelledBy","ariaDescribedBy","Card","card_default"],"mappings":"yCAAA,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,CDxBO,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,cAuErB,IAAMC,EAAW,CAAC,CAChB,GAAAL,EAAK,MACL,OAAAM,EACA,SAAAT,EACA,QAAAN,EAAU,YACV,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,GAKSiB,EAAOT,EACpBS,EAAK,YAAc,OACnBA,EAAK,MAAQlB,EACbkB,EAAK,QAAUX,EACfW,EAAK,OAASV,EAEd,IAAOW,EAAQD","sourcesContent":["import React from 'react'\nimport UI from '#components/ui'\nimport type {\n CardProps,\n CardTitleProps,\n CardContentProps,\n CardFooterProps,\n CardComponent,\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 */\nconst CardRoot = ({\n as = 'div',\n styles,\n children,\n classes = 'shadow-sm',\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\n// Create compound component with proper TypeScript typing\nexport const Card = CardRoot as CardComponent\nCard.displayName = 'Card'\nCard.Title = Title\nCard.Content = Content\nCard.Footer = Footer\n\nexport default Card\n\n// Export types for external consumption\nexport type {\n CardProps,\n CardTitleProps,\n CardContentProps,\n CardFooterProps,\n CardComponent,\n} 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"]}
@@ -1,11 +1,11 @@
1
- import { b } from './chunk-ZFJ4U45S.js';
2
- import { b as b$2 } from './chunk-MPTMPBFT.js';
3
- import { b as b$1 } from './chunk-KVKQLRJG.js';
4
- import { a } from './chunk-HHLNOC5T.js';
1
+ import { b } from './chunk-KDMX3FAW.js';
2
+ import { b as b$2 } from './chunk-M7JLT62Q.js';
3
+ import { b as b$1 } from './chunk-TF3GQKOY.js';
4
+ import { a } from './chunk-DDSXKOUB.js';
5
5
  import s, { useCallback, useRef, useId, useEffect } from 'react';
6
6
 
7
7
  var y=({dialogTitle:t,onClick:o,id:l,type:e="h3"})=>{let a$1=useCallback(()=>{o();},[o]);return s.createElement(a,{as:"div",classes:"dialog-header"},s.createElement(b,{type:e,className:"dialog-title",id:l},t||"Dialog"),s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-close","aria-label":"Close dialog","data-btn":"icon"},s.createElement(b$2,null,s.createElement(b$2.Remove,{size:16}))))},D=s.memo(y);y.displayName="DialogHeader";var H=({onClose:t,onConfirm:o,confirmLabel:l,cancelLabel:e})=>{let a$1=useCallback(()=>{t();},[t]),m=useCallback(()=>{o&&o();},[o]);return s.createElement(a,{as:"section",className:"dialog-footer"},e&&s.createElement(b$1,{type:"button",onClick:a$1,className:"dialog-button button-secondary","data-btn":"sm"},e),o&&s.createElement(b$1,{type:"button",onClick:m,className:"dialog-button button-primary","data-btn":"sm"},l))};H.displayName="DialogFooter";var I=s.memo(H);var h=(t,o)=>useCallback(e=>{let a=t.current?.getBoundingClientRect();a&&(e.clientY<a.top||e.clientY>a.bottom||e.clientX<a.left||e.clientX>a.right)&&o();},[t,o]);var F=({isOpen:t,onOpenChange:o,isAlertDialog:l=!1,onClose:e,dialogTitle:a$1,dialogLabel:m,children:P,onConfirm:U,confirmLabel:B="Confirm",cancelLabel:E="Cancel",className:M="",hideFooter:v=!1,styles:x})=>{let f=useRef(null),u=useId();useEffect(()=>{let r=f.current;r&&(t?l?r.show():r.showModal():r.close());},[t,l]);let c=useCallback(()=>{o(!1),e&&e();},[o,e]),L=h(f,c),b=useId();return s.createElement(a,{as:"dialog",role:l?"alertdialog":"dialog",ref:f,onClose:c,onClick:L,"aria-modal":t&&!l?"true":void 0,"aria-labelledby":u,"aria-describedby":b,"aria-label":m,className:`dialog-modal ${M}`.trim(),style:x},s.createElement(D,{dialogTitle:a$1,onClick:c,id:u}),s.createElement(a,{as:"section",id:b,className:"dialog-content",onClick:r=>r.stopPropagation()},P,!v&&s.createElement(I,{onClose:c,onConfirm:U,confirmLabel:B,cancelLabel:E})))};F.displayName="Dialog";var ao=s.memo(F);
8
8
 
9
9
  export { F as a, ao as b };
10
10
  //# sourceMappingURL=out.js.map
11
- //# sourceMappingURL=chunk-TPIB3RQP.js.map
11
+ //# sourceMappingURL=chunk-ZF6Y7W57.js.map
@@ -0,0 +1,66 @@
1
+ import { ReactNode, CSSProperties } from 'react';
2
+
3
+ /**
4
+ * Base component props interface for all fpkit components.
5
+ *
6
+ * Provides common props for styling, children, and component behavior that can be
7
+ * safely spread onto DOM elements.
8
+ *
9
+ * **Note on Refs:** This interface intentionally does not include a `ref` prop.
10
+ * Refs should be handled explicitly using `React.forwardRef` rather than being
11
+ * spread with other props, which ensures proper type safety and follows React best practices.
12
+ *
13
+ * @typeParam T - Reserved for future use (currently unused). The generic parameter
14
+ * is maintained for backward compatibility with existing component interfaces.
15
+ *
16
+ * @example
17
+ * // Basic usage
18
+ * interface ModalProps extends ComponentProps {
19
+ * openChild?: React.ReactNode;
20
+ * onClose?: () => void;
21
+ * }
22
+ *
23
+ * @example
24
+ * // With forwardRef for proper ref handling
25
+ * interface ButtonProps extends ComponentProps {
26
+ * variant: 'primary' | 'secondary';
27
+ * }
28
+ *
29
+ * const MyButton = forwardRef<HTMLButtonElement, ButtonProps>(
30
+ * ({ variant, ...props }, ref) => {
31
+ * return <button ref={ref} {...props} />;
32
+ * }
33
+ * );
34
+ */
35
+ interface ComponentProps<T = HTMLElement> {
36
+ /**
37
+ * The default child content/component to render.
38
+ */
39
+ children?: ReactNode;
40
+ /**
41
+ * Use default component styles
42
+ */
43
+ renderStyles?: boolean;
44
+ /**
45
+ * Component id attribute
46
+ */
47
+ id?: string;
48
+ /**
49
+ * Styles object
50
+ */
51
+ styles?: CSSProperties;
52
+ /**
53
+ * Default styles object
54
+ */
55
+ defaultStyles?: CSSProperties;
56
+ /**
57
+ * Component class attribute
58
+ */
59
+ classes?: string;
60
+ /**
61
+ * Style value for [data-style] attribute
62
+ */
63
+ dataStyle?: string;
64
+ }
65
+
66
+ export { ComponentProps as C };
@@ -0,0 +1 @@
1
+ .box-padding-0{padding:0}.box-padding-xs{padding:var(--spacing-xs)}.box-padding-sm{padding:var(--spacing-sm)}.box-padding-md{padding:var(--spacing-md)}.box-padding-lg{padding:var(--spacing-lg)}.box-padding-xl{padding:var(--spacing-xl)}.box-padding-inline-0{padding-inline:0}.box-padding-inline-xs{padding-inline:var(--spacing-xs)}.box-padding-inline-sm{padding-inline:var(--spacing-sm)}.box-padding-inline-md{padding-inline:var(--spacing-md)}.box-padding-inline-lg{padding-inline:var(--spacing-lg)}.box-padding-inline-xl{padding-inline:var(--spacing-xl)}.box-padding-block-0{padding-block:0}.box-padding-block-xs{padding-block:var(--spacing-xs)}.box-padding-block-sm{padding-block:var(--spacing-sm)}.box-padding-block-md{padding-block:var(--spacing-md)}.box-padding-block-lg{padding-block:var(--spacing-lg)}.box-padding-block-xl{padding-block:var(--spacing-xl)}.box-margin-0{margin:0}.box-margin-xs{margin:var(--spacing-xs)}.box-margin-sm{margin:var(--spacing-sm)}.box-margin-md{margin:var(--spacing-md)}.box-margin-lg{margin:var(--spacing-lg)}.box-margin-xl{margin:var(--spacing-xl)}.box-margin-inline-0{margin-inline:0}.box-margin-inline-xs{margin-inline:var(--spacing-xs)}.box-margin-inline-sm{margin-inline:var(--spacing-sm)}.box-margin-inline-md{margin-inline:var(--spacing-md)}.box-margin-inline-lg{margin-inline:var(--spacing-lg)}.box-margin-inline-xl{margin-inline:var(--spacing-xl)}.box-margin-block-0{margin-block:0}.box-margin-block-xs{margin-block:var(--spacing-xs)}.box-margin-block-sm{margin-block:var(--spacing-sm)}.box-margin-block-md{margin-block:var(--spacing-md)}.box-margin-block-lg{margin-block:var(--spacing-lg)}.box-margin-block-xl{margin-block:var(--spacing-xl)}.box-width-auto{width:auto}.box-width-full{width:100%}.box-width-fit{width:fit-content}.box-width-max{width:max-content}.box-max-width-xs{max-width:var(--box-max-width-xs)}.box-max-width-sm{max-width:var(--box-max-width-sm)}.box-max-width-md{max-width:var(--box-max-width-md)}.box-max-width-lg{max-width:var(--box-max-width-lg)}.box-max-width-xl{max-width:var(--box-max-width-xl)}.box-max-width-container{max-width:var(--box-max-width-container)}.box-radius-0{border-radius:0}.box-radius-xs{border-radius:var(--box-radius-xs)}.box-radius-sm{border-radius:var(--box-radius-sm)}.box-radius-md{border-radius:var(--box-radius-md)}.box-radius-lg{border-radius:var(--box-radius-lg)}.box-radius-xl{border-radius:var(--box-radius-xl)}.box-radius-full{border-radius:var(--box-radius-full)}/*# sourceMappingURL=box.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/components/box/box.scss"],"names":[],"mappings":"AAaA,eACE,UAGF,gBACE,0BAGF,gBACE,0BAGF,gBACE,0BAGF,gBACE,0BAGF,gBACE,0BAIF,sBACE,iBAGF,uBACE,iCAGF,uBACE,iCAGF,uBACE,iCAGF,uBACE,iCAGF,uBACE,iCAIF,qBACE,gBAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAQF,cACE,SAGF,eACE,yBAGF,eACE,yBAGF,eACE,yBAGF,eACE,yBAGF,eACE,yBAIF,qBACE,gBAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAGF,sBACE,gCAIF,oBACE,eAGF,qBACE,+BAGF,qBACE,+BAGF,qBACE,+BAGF,qBACE,+BAGF,qBACE,+BAOF,gBACE,WAGF,gBACE,WAGF,eACE,kBAGF,eACE,kBAOF,kBACE,kCAGF,kBACE,kCAGF,kBACE,kCAGF,kBACE,kCAGF,kBACE,kCAGF,yBACE,yCAOF,cACE,gBAGF,eACE,mCAGF,eACE,mCAGF,eACE,mCAGF,eACE,mCAGF,eACE,mCAGF,iBACE","file":"box.css"}
@@ -0,0 +1,3 @@
1
+ .box-padding-0{padding:0}.box-padding-xs{padding:var(--spacing-xs)}.box-padding-sm{padding:var(--spacing-sm)}.box-padding-md{padding:var(--spacing-md)}.box-padding-lg{padding:var(--spacing-lg)}.box-padding-xl{padding:var(--spacing-xl)}.box-padding-inline-0{padding-inline:0}.box-padding-inline-xs{padding-inline:var(--spacing-xs)}.box-padding-inline-sm{padding-inline:var(--spacing-sm)}.box-padding-inline-md{padding-inline:var(--spacing-md)}.box-padding-inline-lg{padding-inline:var(--spacing-lg)}.box-padding-inline-xl{padding-inline:var(--spacing-xl)}.box-padding-block-0{padding-block:0}.box-padding-block-xs{padding-block:var(--spacing-xs)}.box-padding-block-sm{padding-block:var(--spacing-sm)}.box-padding-block-md{padding-block:var(--spacing-md)}.box-padding-block-lg{padding-block:var(--spacing-lg)}.box-padding-block-xl{padding-block:var(--spacing-xl)}.box-margin-0{margin:0}.box-margin-xs{margin:var(--spacing-xs)}.box-margin-sm{margin:var(--spacing-sm)}.box-margin-md{margin:var(--spacing-md)}.box-margin-lg{margin:var(--spacing-lg)}.box-margin-xl{margin:var(--spacing-xl)}.box-margin-inline-0{margin-inline:0}.box-margin-inline-xs{margin-inline:var(--spacing-xs)}.box-margin-inline-sm{margin-inline:var(--spacing-sm)}.box-margin-inline-md{margin-inline:var(--spacing-md)}.box-margin-inline-lg{margin-inline:var(--spacing-lg)}.box-margin-inline-xl{margin-inline:var(--spacing-xl)}.box-margin-block-0{margin-block:0}.box-margin-block-xs{margin-block:var(--spacing-xs)}.box-margin-block-sm{margin-block:var(--spacing-sm)}.box-margin-block-md{margin-block:var(--spacing-md)}.box-margin-block-lg{margin-block:var(--spacing-lg)}.box-margin-block-xl{margin-block:var(--spacing-xl)}.box-width-auto{width:auto}.box-width-full{width:100%}.box-width-fit{width:-moz-fit-content;width:fit-content}.box-width-max{width:-moz-max-content;width:max-content}.box-max-width-xs{max-width:var(--box-max-width-xs)}.box-max-width-sm{max-width:var(--box-max-width-sm)}.box-max-width-md{max-width:var(--box-max-width-md)}.box-max-width-lg{max-width:var(--box-max-width-lg)}.box-max-width-xl{max-width:var(--box-max-width-xl)}.box-max-width-container{max-width:var(--box-max-width-container)}.box-radius-0{border-radius:0}.box-radius-xs{border-radius:var(--box-radius-xs)}.box-radius-sm{border-radius:var(--box-radius-sm)}.box-radius-md{border-radius:var(--box-radius-md)}.box-radius-lg{border-radius:var(--box-radius-lg)}.box-radius-xl{border-radius:var(--box-radius-xl)}.box-radius-full{border-radius:var(--box-radius-full)}
2
+
3
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JveC9ib3guc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxlQUNFLFNBQUEsQ0FHRixnQkFDRSx5QkFBQSxDQUdGLGdCQUNFLHlCQUFBLENBR0YsZ0JBQ0UseUJBQUEsQ0FHRixnQkFDRSx5QkFBQSxDQUdGLGdCQUNFLHlCQUFBLENBSUYsc0JBQ0UsZ0JBQUEsQ0FHRix1QkFDRSxnQ0FBQSxDQUdGLHVCQUNFLGdDQUFBLENBR0YsdUJBQ0UsZ0NBQUEsQ0FHRix1QkFDRSxnQ0FBQSxDQUdGLHVCQUNFLGdDQUFBLENBSUYscUJBQ0UsZUFBQSxDQUdGLHNCQUNFLCtCQUFBLENBR0Ysc0JBQ0UsK0JBQUEsQ0FHRixzQkFDRSwrQkFBQSxDQUdGLHNCQUNFLCtCQUFBLENBR0Ysc0JBQ0UsK0JBQUEsQ0FRRixjQUNFLFFBQUEsQ0FHRixlQUNFLHdCQUFBLENBR0YsZUFDRSx3QkFBQSxDQUdGLGVBQ0Usd0JBQUEsQ0FHRixlQUNFLHdCQUFBLENBR0YsZUFDRSx3QkFBQSxDQUlGLHFCQUNFLGVBQUEsQ0FHRixzQkFDRSwrQkFBQSxDQUdGLHNCQUNFLCtCQUFBLENBR0Ysc0JBQ0UsK0JBQUEsQ0FHRixzQkFDRSwrQkFBQSxDQUdGLHNCQUNFLCtCQUFBLENBSUYsb0JBQ0UsY0FBQSxDQUdGLHFCQUNFLDhCQUFBLENBR0YscUJBQ0UsOEJBQUEsQ0FHRixxQkFDRSw4QkFBQSxDQUdGLHFCQUNFLDhCQUFBLENBR0YscUJBQ0UsOEJBQUEsQ0FPRixnQkFDRSxVQUFBLENBR0YsZ0JBQ0UsVUFBQSxDQUdGLGVBQ0Usc0JBQUEsQ0FBQSxpQkFBQSxDQUdGLGVBQ0Usc0JBQUEsQ0FBQSxpQkFBQSxDQU9GLGtCQUNFLGlDQUFBLENBR0Ysa0JBQ0UsaUNBQUEsQ0FHRixrQkFDRSxpQ0FBQSxDQUdGLGtCQUNFLGlDQUFBLENBR0Ysa0JBQ0UsaUNBQUEsQ0FHRix5QkFDRSx3Q0FBQSxDQU9GLGNBQ0UsZUFBQSxDQUdGLGVBQ0Usa0NBQUEsQ0FHRixlQUNFLGtDQUFBLENBR0YsZUFDRSxrQ0FBQSxDQUdGLGVBQ0Usa0NBQUEsQ0FHRixlQUNFLGtDQUFBLENBR0YsaUJBQ0Usb0NBQUEiLCJmaWxlIjoiYm94Lm1pbi5jc3MifQ== */
@@ -2,23 +2,23 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkDYFAUAB7_cjs = require('../../chunk-DYFAUAB7.cjs');
6
- require('../../chunk-NWJDAHP6.cjs');
7
- require('../../chunk-ENTCUJ3A.cjs');
5
+ var chunkLXODKKA3_cjs = require('../../chunk-LXODKKA3.cjs');
6
+ require('../../chunk-2GJHKWEK.cjs');
7
+ require('../../chunk-EJ6KYBFE.cjs');
8
8
 
9
9
 
10
10
 
11
11
  Object.defineProperty(exports, 'Breadcrumb', {
12
12
  enumerable: true,
13
- get: function () { return chunkDYFAUAB7_cjs.b; }
13
+ get: function () { return chunkLXODKKA3_cjs.b; }
14
14
  });
15
15
  Object.defineProperty(exports, 'default', {
16
16
  enumerable: true,
17
- get: function () { return chunkDYFAUAB7_cjs.c; }
17
+ get: function () { return chunkLXODKKA3_cjs.c; }
18
18
  });
19
19
  Object.defineProperty(exports, 'useBreadcrumbSegments', {
20
20
  enumerable: true,
21
- get: function () { return chunkDYFAUAB7_cjs.a; }
21
+ get: function () { return chunkLXODKKA3_cjs.a; }
22
22
  });
23
23
  //# sourceMappingURL=out.js.map
24
24
  //# sourceMappingURL=breadcrumb.cjs.map
@@ -1,5 +1,5 @@
1
- export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-CWRNJA4P.js';
2
- import '../../chunk-5RAWNUVD.js';
3
- import '../../chunk-HHLNOC5T.js';
1
+ export { b as Breadcrumb, c as default, a as useBreadcrumbSegments } from '../../chunk-DIJBIOFE.js';
2
+ import '../../chunk-IBUTNPTQ.js';
3
+ import '../../chunk-DDSXKOUB.js';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=breadcrumb.js.map
@@ -2,20 +2,20 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkE4OSROCA_cjs = require('../chunk-E4OSROCA.cjs');
5
+ var chunk5QSNJQVH_cjs = require('../chunk-5QSNJQVH.cjs');
6
6
  require('../chunk-PNWIRCG3.cjs');
7
7
  require('../chunk-TON2YGMD.cjs');
8
- require('../chunk-ENTCUJ3A.cjs');
8
+ require('../chunk-EJ6KYBFE.cjs');
9
9
 
10
10
 
11
11
 
12
12
  Object.defineProperty(exports, 'Button', {
13
13
  enumerable: true,
14
- get: function () { return chunkE4OSROCA_cjs.a; }
14
+ get: function () { return chunk5QSNJQVH_cjs.a; }
15
15
  });
16
16
  Object.defineProperty(exports, 'default', {
17
17
  enumerable: true,
18
- get: function () { return chunkE4OSROCA_cjs.b; }
18
+ get: function () { return chunk5QSNJQVH_cjs.b; }
19
19
  });
20
20
  //# sourceMappingURL=out.js.map
21
21
  //# sourceMappingURL=button.cjs.map
@@ -1,5 +1,12 @@
1
1
  import { U as UI } from '../ui-d01b50d4.js';
2
- import React$1 from 'react';
2
+ import React from 'react';
3
+
4
+ /**
5
+ * Import ComponentProps from the canonical definition.
6
+ * This ensures a single source of truth for the interface.
7
+ *
8
+ * @see {@link ./component-props.ts} for the full interface definition with generic type support
9
+ */
3
10
 
4
11
  /**
5
12
  * Props for disabled state management across components.
@@ -41,7 +48,7 @@ interface DisabledStateProps {
41
48
  isDisabled?: boolean;
42
49
  }
43
50
 
44
- type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
51
+ type ButtonProps = Partial<React.ComponentProps<typeof UI>> & DisabledStateProps & {
45
52
  /**
46
53
  * The button type
47
54
  * Required - 'button' | 'submit' | 'reset'
@@ -102,7 +109,7 @@ type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStatePro
102
109
  * @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
103
110
  */
104
111
  declare const Button: {
105
- ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
112
+ ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React.JSX.Element;
106
113
  displayName: string;
107
114
  };
108
115
 
@@ -1,5 +1,12 @@
1
1
  import { U as UI } from '../ui-d01b50d4.js';
2
- import React$1 from 'react';
2
+ import React from 'react';
3
+
4
+ /**
5
+ * Import ComponentProps from the canonical definition.
6
+ * This ensures a single source of truth for the interface.
7
+ *
8
+ * @see {@link ./component-props.ts} for the full interface definition with generic type support
9
+ */
3
10
 
4
11
  /**
5
12
  * Props for disabled state management across components.
@@ -41,7 +48,7 @@ interface DisabledStateProps {
41
48
  isDisabled?: boolean;
42
49
  }
43
50
 
44
- type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStateProps & {
51
+ type ButtonProps = Partial<React.ComponentProps<typeof UI>> & DisabledStateProps & {
45
52
  /**
46
53
  * The button type
47
54
  * Required - 'button' | 'submit' | 'reset'
@@ -102,7 +109,7 @@ type ButtonProps = Partial<React$1.ComponentProps<typeof UI>> & DisabledStatePro
102
109
  * @see {@link file://./../../hooks/useDisabledState.md useDisabledState Hook Documentation}
103
110
  */
104
111
  declare const Button: {
105
- ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React$1.JSX.Element;
112
+ ({ type, children, styles, disabled, isDisabled, classes, onPointerDown, onPointerOver, onPointerLeave, onClick, onKeyDown, ...props }: ButtonProps): React.JSX.Element;
106
113
  displayName: string;
107
114
  };
108
115
 
@@ -1,6 +1,6 @@
1
- export { a as Button, b as default } from '../chunk-KVKQLRJG.js';
1
+ export { a as Button, b as default } from '../chunk-TF3GQKOY.js';
2
2
  import '../chunk-BFK62VX5.js';
3
3
  import '../chunk-75QHTLFO.js';
4
- import '../chunk-HHLNOC5T.js';
4
+ import '../chunk-DDSXKOUB.js';
5
5
  //# sourceMappingURL=out.js.map
6
6
  //# sourceMappingURL=button.js.map
@@ -2,30 +2,30 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkW5TKWBFC_cjs = require('../chunk-W5TKWBFC.cjs');
6
- require('../chunk-ENTCUJ3A.cjs');
5
+ var chunkWWPLBWCQ_cjs = require('../chunk-WWPLBWCQ.cjs');
6
+ require('../chunk-EJ6KYBFE.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, 'Card', {
11
11
  enumerable: true,
12
- get: function () { return chunkW5TKWBFC_cjs.d; }
12
+ get: function () { return chunkWWPLBWCQ_cjs.d; }
13
13
  });
14
14
  Object.defineProperty(exports, 'Content', {
15
15
  enumerable: true,
16
- get: function () { return chunkW5TKWBFC_cjs.b; }
16
+ get: function () { return chunkWWPLBWCQ_cjs.b; }
17
17
  });
18
18
  Object.defineProperty(exports, 'Footer', {
19
19
  enumerable: true,
20
- get: function () { return chunkW5TKWBFC_cjs.c; }
20
+ get: function () { return chunkWWPLBWCQ_cjs.c; }
21
21
  });
22
22
  Object.defineProperty(exports, 'Title', {
23
23
  enumerable: true,
24
- get: function () { return chunkW5TKWBFC_cjs.a; }
24
+ get: function () { return chunkWWPLBWCQ_cjs.a; }
25
25
  });
26
26
  Object.defineProperty(exports, 'default', {
27
27
  enumerable: true,
28
- get: function () { return chunkW5TKWBFC_cjs.e; }
28
+ get: function () { return chunkWWPLBWCQ_cjs.e; }
29
29
  });
30
30
  //# sourceMappingURL=out.js.map
31
31
  //# sourceMappingURL=card.cjs.map
@@ -57,6 +57,18 @@ interface CardFooterProps extends CardSubComponentProps {
57
57
  */
58
58
  as?: 'div' | 'footer';
59
59
  }
60
+ /**
61
+ * Type for Card component with attached sub-components.
62
+ *
63
+ * This type ensures TypeScript recognizes Card.Title, Card.Content, and Card.Footer
64
+ * as valid properties on the Card component.
65
+ */
66
+ interface CardComponent extends React.FC<CardProps> {
67
+ Title: React.FC<CardTitleProps>;
68
+ Content: React.FC<CardContentProps>;
69
+ Footer: React.FC<CardFooterProps>;
70
+ displayName: string;
71
+ }
60
72
  /**
61
73
  * Props for the main Card component.
62
74
  *
@@ -213,90 +225,6 @@ declare const Footer: {
213
225
  ({ children, className, style, as, ...props }: CardFooterProps): React.JSX.Element;
214
226
  displayName: string;
215
227
  };
216
- /**
217
- * Card - A flexible, accessible card component with compound component pattern
218
- *
219
- * The Card component provides a container for grouping related content and actions.
220
- * It follows the compound component pattern, exposing `Card.Title`, `Card.Content`,
221
- * and `Card.Footer` sub-components for structured layouts.
222
- *
223
- * ## Features
224
- * - **Polymorphic rendering**: Render as any HTML element via `as` prop
225
- * - **Compound components**: Structured sub-components for consistent layouts
226
- * - **Interactive variant**: Built-in keyboard navigation and ARIA support
227
- * - **Fully accessible**: WCAG 2.1 AA compliant with proper semantic HTML
228
- *
229
- * ## Accessibility
230
- *
231
- * ### Non-Interactive Cards
232
- * - Use semantic HTML: `article` for standalone content, `section` for groupings
233
- * - Provide accessible names with `aria-labelledby` referencing the title
234
- *
235
- * ### Interactive Cards (Clickable)
236
- * - Set `interactive={true}` to enable keyboard navigation (Enter/Space)
237
- * - Provide accessible name via `aria-label` or `aria-labelledby`
238
- * - Ensure adequate focus indicators (handled by CSS)
239
- *
240
- * @example
241
- * // Basic card with compound components
242
- * ```tsx
243
- * <Card>
244
- * <Card.Title>Product Name</Card.Title>
245
- * <Card.Content>
246
- * <p>Product description goes here...</p>
247
- * </Card.Content>
248
- * <Card.Footer>
249
- * <button>Buy Now</button>
250
- * </Card.Footer>
251
- * </Card>
252
- * ```
253
- *
254
- * @example
255
- * // Accessible interactive card
256
- * ```tsx
257
- * <Card
258
- * interactive
259
- * aria-label="View product details"
260
- * onClick={() => navigate('/product/123')}
261
- * >
262
- * <Card.Title>Product Name</Card.Title>
263
- * <Card.Content>Click anywhere to view details</Card.Content>
264
- * </Card>
265
- * ```
266
- *
267
- * @example
268
- * // Semantic article card with accessible name
269
- * ```tsx
270
- * <Card as="article" aria-labelledby="article-title">
271
- * <Card.Title id="article-title">Article Headline</Card.Title>
272
- * <Card.Content>Article body...</Card.Content>
273
- * </Card>
274
- * ```
275
- *
276
- * @example
277
- * // Card as a landmark region
278
- * ```tsx
279
- * <Card role="region" aria-label="Featured products">
280
- * <Card.Title>Featured</Card.Title>
281
- * <Card.Content>...</Card.Content>
282
- * </Card>
283
- * ```
284
- */
285
- declare const Card: {
286
- ({ as, styles, children, classes, id, interactive, onClick, tabIndex, role, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }: CardProps): React.JSX.Element;
287
- displayName: string;
288
- Title: {
289
- ({ children, className, style, as, ...props }: CardTitleProps): React.JSX.Element;
290
- displayName: string;
291
- };
292
- Content: {
293
- ({ children, className, style, as, ...props }: CardContentProps): React.JSX.Element;
294
- displayName: string;
295
- };
296
- Footer: {
297
- ({ children, className, style, as, ...props }: CardFooterProps): React.JSX.Element;
298
- displayName: string;
299
- };
300
- };
228
+ declare const Card: CardComponent;
301
229
 
302
230
  export { Card, CardProps, Content, Footer, Title, Card as default };