@kushagradhawan/kookie-ui 0.1.29 → 0.1.31

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 (522) hide show
  1. package/components.css +4083 -2224
  2. package/dist/cjs/components/_internal/base-button.d.ts +36 -0
  3. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  4. package/dist/cjs/components/_internal/base-button.js +1 -1
  5. package/dist/cjs/components/_internal/base-button.js.map +3 -3
  6. package/dist/cjs/components/_internal/base-button.props.d.ts +61 -0
  7. package/dist/cjs/components/_internal/base-button.props.d.ts.map +1 -1
  8. package/dist/cjs/components/_internal/base-button.props.js +1 -1
  9. package/dist/cjs/components/_internal/base-button.props.js.map +3 -3
  10. package/dist/cjs/components/_internal/base-checkbox.props.d.ts +6 -1
  11. package/dist/cjs/components/_internal/base-checkbox.props.d.ts.map +1 -1
  12. package/dist/cjs/components/_internal/base-checkbox.props.js +1 -1
  13. package/dist/cjs/components/_internal/base-checkbox.props.js.map +3 -3
  14. package/dist/cjs/components/_internal/base-menu.props.d.ts +8 -0
  15. package/dist/cjs/components/_internal/base-menu.props.d.ts.map +1 -1
  16. package/dist/cjs/components/_internal/base-menu.props.js +1 -1
  17. package/dist/cjs/components/_internal/base-menu.props.js.map +3 -3
  18. package/dist/cjs/components/_internal/base-radio.props.d.ts +6 -1
  19. package/dist/cjs/components/_internal/base-radio.props.d.ts.map +1 -1
  20. package/dist/cjs/components/_internal/base-radio.props.js +1 -1
  21. package/dist/cjs/components/_internal/base-radio.props.js.map +3 -3
  22. package/dist/cjs/components/accordion.d.ts.map +1 -1
  23. package/dist/cjs/components/accordion.js +1 -1
  24. package/dist/cjs/components/accordion.js.map +3 -3
  25. package/dist/cjs/components/accordion.props.d.ts +9 -0
  26. package/dist/cjs/components/accordion.props.d.ts.map +1 -1
  27. package/dist/cjs/components/accordion.props.js +1 -1
  28. package/dist/cjs/components/accordion.props.js.map +2 -2
  29. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  30. package/dist/cjs/components/alert-dialog.js +1 -1
  31. package/dist/cjs/components/alert-dialog.js.map +3 -3
  32. package/dist/cjs/components/alert-dialog.props.d.ts +69 -2
  33. package/dist/cjs/components/alert-dialog.props.d.ts.map +1 -1
  34. package/dist/cjs/components/alert-dialog.props.js +1 -1
  35. package/dist/cjs/components/alert-dialog.props.js.map +3 -3
  36. package/dist/cjs/components/avatar.d.ts.map +1 -1
  37. package/dist/cjs/components/avatar.js +1 -1
  38. package/dist/cjs/components/avatar.js.map +3 -3
  39. package/dist/cjs/components/avatar.props.d.ts +9 -1
  40. package/dist/cjs/components/avatar.props.d.ts.map +1 -1
  41. package/dist/cjs/components/avatar.props.js +1 -1
  42. package/dist/cjs/components/avatar.props.js.map +3 -3
  43. package/dist/cjs/components/badge.d.ts +8 -1
  44. package/dist/cjs/components/badge.d.ts.map +1 -1
  45. package/dist/cjs/components/badge.js +1 -1
  46. package/dist/cjs/components/badge.js.map +3 -3
  47. package/dist/cjs/components/badge.props.d.ts +14 -6
  48. package/dist/cjs/components/badge.props.d.ts.map +1 -1
  49. package/dist/cjs/components/badge.props.js +1 -1
  50. package/dist/cjs/components/badge.props.js.map +3 -3
  51. package/dist/cjs/components/blockquote.props.d.ts +1 -1
  52. package/dist/cjs/components/button.d.ts +53 -1
  53. package/dist/cjs/components/button.d.ts.map +1 -1
  54. package/dist/cjs/components/button.js +1 -1
  55. package/dist/cjs/components/button.js.map +3 -3
  56. package/dist/cjs/components/button.props.d.ts +17 -0
  57. package/dist/cjs/components/button.props.d.ts.map +1 -1
  58. package/dist/cjs/components/button.props.js.map +2 -2
  59. package/dist/cjs/components/callout.d.ts +4 -0
  60. package/dist/cjs/components/callout.d.ts.map +1 -1
  61. package/dist/cjs/components/callout.js +1 -1
  62. package/dist/cjs/components/callout.js.map +3 -3
  63. package/dist/cjs/components/callout.props.d.ts +9 -1
  64. package/dist/cjs/components/callout.props.d.ts.map +1 -1
  65. package/dist/cjs/components/callout.props.js +1 -1
  66. package/dist/cjs/components/callout.props.js.map +3 -3
  67. package/dist/cjs/components/card.d.ts.map +1 -1
  68. package/dist/cjs/components/card.js +1 -1
  69. package/dist/cjs/components/card.js.map +3 -3
  70. package/dist/cjs/components/card.props.d.ts +5 -0
  71. package/dist/cjs/components/card.props.d.ts.map +1 -1
  72. package/dist/cjs/components/card.props.js +1 -1
  73. package/dist/cjs/components/card.props.js.map +3 -3
  74. package/dist/cjs/components/checkbox-cards.d.ts.map +1 -1
  75. package/dist/cjs/components/checkbox-cards.js +1 -1
  76. package/dist/cjs/components/checkbox-cards.js.map +3 -3
  77. package/dist/cjs/components/checkbox-cards.props.d.ts +2 -2
  78. package/dist/cjs/components/checkbox-cards.props.js +1 -1
  79. package/dist/cjs/components/checkbox-cards.props.js.map +2 -2
  80. package/dist/cjs/components/checkbox-group.props.d.ts +6 -1
  81. package/dist/cjs/components/checkbox-group.props.d.ts.map +1 -1
  82. package/dist/cjs/components/checkbox.d.ts.map +1 -1
  83. package/dist/cjs/components/checkbox.js +1 -1
  84. package/dist/cjs/components/checkbox.js.map +3 -3
  85. package/dist/cjs/components/code.js.map +1 -1
  86. package/dist/cjs/components/code.props.d.ts +1 -1
  87. package/dist/cjs/components/context-menu.d.ts +1 -1
  88. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  89. package/dist/cjs/components/context-menu.js +1 -1
  90. package/dist/cjs/components/context-menu.js.map +3 -3
  91. package/dist/cjs/components/dialog.d.ts.map +1 -1
  92. package/dist/cjs/components/dialog.js +1 -1
  93. package/dist/cjs/components/dialog.js.map +3 -3
  94. package/dist/cjs/components/dialog.props.d.ts +5 -0
  95. package/dist/cjs/components/dialog.props.d.ts.map +1 -1
  96. package/dist/cjs/components/dialog.props.js +1 -1
  97. package/dist/cjs/components/dialog.props.js.map +3 -3
  98. package/dist/cjs/components/dropdown-menu.d.ts +1 -1
  99. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  100. package/dist/cjs/components/dropdown-menu.js +1 -1
  101. package/dist/cjs/components/dropdown-menu.js.map +3 -3
  102. package/dist/cjs/components/heading.props.d.ts +1 -1
  103. package/dist/cjs/components/icon-button.d.ts +79 -1
  104. package/dist/cjs/components/icon-button.d.ts.map +1 -1
  105. package/dist/cjs/components/icon-button.js +4 -1
  106. package/dist/cjs/components/icon-button.js.map +3 -3
  107. package/dist/cjs/components/image.d.ts +131 -12
  108. package/dist/cjs/components/image.d.ts.map +1 -1
  109. package/dist/cjs/components/image.js +1 -1
  110. package/dist/cjs/components/image.js.map +3 -3
  111. package/dist/cjs/components/image.props.d.ts +136 -21
  112. package/dist/cjs/components/image.props.d.ts.map +1 -1
  113. package/dist/cjs/components/image.props.js +1 -1
  114. package/dist/cjs/components/image.props.js.map +3 -3
  115. package/dist/cjs/components/link.props.d.ts +1 -1
  116. package/dist/cjs/components/progress.props.d.ts +2 -2
  117. package/dist/cjs/components/progress.props.js +1 -1
  118. package/dist/cjs/components/progress.props.js.map +2 -2
  119. package/dist/cjs/components/radio-cards.d.ts.map +1 -1
  120. package/dist/cjs/components/radio-cards.js +1 -1
  121. package/dist/cjs/components/radio-cards.js.map +3 -3
  122. package/dist/cjs/components/radio-cards.props.d.ts +2 -2
  123. package/dist/cjs/components/radio-cards.props.js +1 -1
  124. package/dist/cjs/components/radio-cards.props.js.map +2 -2
  125. package/dist/cjs/components/radio.d.ts.map +1 -1
  126. package/dist/cjs/components/radio.js +1 -1
  127. package/dist/cjs/components/radio.js.map +3 -3
  128. package/dist/cjs/components/segmented-control.props.d.ts +3 -3
  129. package/dist/cjs/components/segmented-control.props.js +1 -1
  130. package/dist/cjs/components/segmented-control.props.js.map +2 -2
  131. package/dist/cjs/components/select.d.ts.map +1 -1
  132. package/dist/cjs/components/select.js +1 -1
  133. package/dist/cjs/components/select.js.map +3 -3
  134. package/dist/cjs/components/select.props.d.ts +12 -0
  135. package/dist/cjs/components/select.props.d.ts.map +1 -1
  136. package/dist/cjs/components/select.props.js +1 -1
  137. package/dist/cjs/components/select.props.js.map +2 -2
  138. package/dist/cjs/components/sidebar.d.ts +5 -0
  139. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  140. package/dist/cjs/components/sidebar.js +1 -1
  141. package/dist/cjs/components/sidebar.js.map +3 -3
  142. package/dist/cjs/components/slider.d.ts +5 -0
  143. package/dist/cjs/components/slider.d.ts.map +1 -1
  144. package/dist/cjs/components/slider.js +1 -1
  145. package/dist/cjs/components/slider.js.map +3 -3
  146. package/dist/cjs/components/slider.props.d.ts +10 -2
  147. package/dist/cjs/components/slider.props.d.ts.map +1 -1
  148. package/dist/cjs/components/slider.props.js +1 -1
  149. package/dist/cjs/components/slider.props.js.map +2 -2
  150. package/dist/cjs/components/switch.d.ts.map +1 -1
  151. package/dist/cjs/components/switch.js +1 -1
  152. package/dist/cjs/components/switch.js.map +3 -3
  153. package/dist/cjs/components/switch.props.d.ts +17 -4
  154. package/dist/cjs/components/switch.props.d.ts.map +1 -1
  155. package/dist/cjs/components/switch.props.js +1 -1
  156. package/dist/cjs/components/switch.props.js.map +3 -3
  157. package/dist/cjs/components/tab-nav.d.ts.map +1 -1
  158. package/dist/cjs/components/tab-nav.js +1 -1
  159. package/dist/cjs/components/tab-nav.js.map +3 -3
  160. package/dist/cjs/components/tabs.d.ts.map +1 -1
  161. package/dist/cjs/components/tabs.js +1 -1
  162. package/dist/cjs/components/tabs.js.map +2 -2
  163. package/dist/cjs/components/text-area.d.ts.map +1 -1
  164. package/dist/cjs/components/text-area.js +1 -1
  165. package/dist/cjs/components/text-area.js.map +3 -3
  166. package/dist/cjs/components/text-area.props.d.ts +29 -0
  167. package/dist/cjs/components/text-area.props.d.ts.map +1 -1
  168. package/dist/cjs/components/text-area.props.js +1 -1
  169. package/dist/cjs/components/text-area.props.js.map +3 -3
  170. package/dist/cjs/components/text-field.d.ts.map +1 -1
  171. package/dist/cjs/components/text-field.js +4 -4
  172. package/dist/cjs/components/text-field.js.map +3 -3
  173. package/dist/cjs/components/text-field.props.d.ts +29 -0
  174. package/dist/cjs/components/text-field.props.d.ts.map +1 -1
  175. package/dist/cjs/components/text-field.props.js +1 -1
  176. package/dist/cjs/components/text-field.props.js.map +3 -3
  177. package/dist/cjs/components/text.props.d.ts +1 -1
  178. package/dist/cjs/components/theme.d.ts +3 -0
  179. package/dist/cjs/components/theme.d.ts.map +1 -1
  180. package/dist/cjs/components/theme.js +1 -1
  181. package/dist/cjs/components/theme.js.map +3 -3
  182. package/dist/cjs/components/theme.props.d.ts +14 -0
  183. package/dist/cjs/components/theme.props.d.ts.map +1 -1
  184. package/dist/cjs/components/theme.props.js +1 -1
  185. package/dist/cjs/components/theme.props.js.map +3 -3
  186. package/dist/cjs/components/toggle-button.d.ts +52 -0
  187. package/dist/cjs/components/toggle-button.d.ts.map +1 -1
  188. package/dist/cjs/components/toggle-button.js +1 -1
  189. package/dist/cjs/components/toggle-button.js.map +3 -3
  190. package/dist/cjs/components/toggle-icon-button.d.ts +84 -2
  191. package/dist/cjs/components/toggle-icon-button.d.ts.map +1 -1
  192. package/dist/cjs/components/toggle-icon-button.js +1 -1
  193. package/dist/cjs/components/toggle-icon-button.js.map +3 -3
  194. package/dist/cjs/hooks/index.d.ts +2 -0
  195. package/dist/cjs/hooks/index.d.ts.map +1 -0
  196. package/dist/cjs/hooks/index.js +2 -0
  197. package/dist/cjs/hooks/index.js.map +7 -0
  198. package/dist/cjs/hooks/use-live-announcer.d.ts +6 -0
  199. package/dist/cjs/hooks/use-live-announcer.d.ts.map +1 -0
  200. package/dist/cjs/hooks/use-live-announcer.js +10 -0
  201. package/dist/cjs/hooks/use-live-announcer.js.map +7 -0
  202. package/dist/cjs/index.d.ts +1 -0
  203. package/dist/cjs/index.d.ts.map +1 -1
  204. package/dist/cjs/index.js +1 -1
  205. package/dist/cjs/index.js.map +2 -2
  206. package/dist/cjs/props/weight.prop.d.ts +1 -1
  207. package/dist/cjs/props/weight.prop.js +1 -1
  208. package/dist/cjs/props/weight.prop.js.map +2 -2
  209. package/dist/esm/components/_internal/base-button.d.ts +36 -0
  210. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  211. package/dist/esm/components/_internal/base-button.js +1 -1
  212. package/dist/esm/components/_internal/base-button.js.map +3 -3
  213. package/dist/esm/components/_internal/base-button.props.d.ts +61 -0
  214. package/dist/esm/components/_internal/base-button.props.d.ts.map +1 -1
  215. package/dist/esm/components/_internal/base-button.props.js +1 -1
  216. package/dist/esm/components/_internal/base-button.props.js.map +3 -3
  217. package/dist/esm/components/_internal/base-checkbox.props.d.ts +6 -1
  218. package/dist/esm/components/_internal/base-checkbox.props.d.ts.map +1 -1
  219. package/dist/esm/components/_internal/base-checkbox.props.js +1 -1
  220. package/dist/esm/components/_internal/base-checkbox.props.js.map +3 -3
  221. package/dist/esm/components/_internal/base-menu.props.d.ts +8 -0
  222. package/dist/esm/components/_internal/base-menu.props.d.ts.map +1 -1
  223. package/dist/esm/components/_internal/base-menu.props.js +1 -1
  224. package/dist/esm/components/_internal/base-menu.props.js.map +3 -3
  225. package/dist/esm/components/_internal/base-radio.props.d.ts +6 -1
  226. package/dist/esm/components/_internal/base-radio.props.d.ts.map +1 -1
  227. package/dist/esm/components/_internal/base-radio.props.js +1 -1
  228. package/dist/esm/components/_internal/base-radio.props.js.map +3 -3
  229. package/dist/esm/components/accordion.d.ts.map +1 -1
  230. package/dist/esm/components/accordion.js +1 -1
  231. package/dist/esm/components/accordion.js.map +3 -3
  232. package/dist/esm/components/accordion.props.d.ts +9 -0
  233. package/dist/esm/components/accordion.props.d.ts.map +1 -1
  234. package/dist/esm/components/accordion.props.js +1 -1
  235. package/dist/esm/components/accordion.props.js.map +2 -2
  236. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  237. package/dist/esm/components/alert-dialog.js +1 -1
  238. package/dist/esm/components/alert-dialog.js.map +3 -3
  239. package/dist/esm/components/alert-dialog.props.d.ts +69 -2
  240. package/dist/esm/components/alert-dialog.props.d.ts.map +1 -1
  241. package/dist/esm/components/alert-dialog.props.js +1 -1
  242. package/dist/esm/components/alert-dialog.props.js.map +3 -3
  243. package/dist/esm/components/avatar.d.ts.map +1 -1
  244. package/dist/esm/components/avatar.js +1 -1
  245. package/dist/esm/components/avatar.js.map +3 -3
  246. package/dist/esm/components/avatar.props.d.ts +9 -1
  247. package/dist/esm/components/avatar.props.d.ts.map +1 -1
  248. package/dist/esm/components/avatar.props.js +1 -1
  249. package/dist/esm/components/avatar.props.js.map +3 -3
  250. package/dist/esm/components/badge.d.ts +8 -1
  251. package/dist/esm/components/badge.d.ts.map +1 -1
  252. package/dist/esm/components/badge.js +1 -1
  253. package/dist/esm/components/badge.js.map +3 -3
  254. package/dist/esm/components/badge.props.d.ts +14 -6
  255. package/dist/esm/components/badge.props.d.ts.map +1 -1
  256. package/dist/esm/components/badge.props.js +1 -1
  257. package/dist/esm/components/badge.props.js.map +3 -3
  258. package/dist/esm/components/blockquote.props.d.ts +1 -1
  259. package/dist/esm/components/button.d.ts +53 -1
  260. package/dist/esm/components/button.d.ts.map +1 -1
  261. package/dist/esm/components/button.js +1 -1
  262. package/dist/esm/components/button.js.map +3 -3
  263. package/dist/esm/components/button.props.d.ts +17 -0
  264. package/dist/esm/components/button.props.d.ts.map +1 -1
  265. package/dist/esm/components/button.props.js.map +2 -2
  266. package/dist/esm/components/callout.d.ts +4 -0
  267. package/dist/esm/components/callout.d.ts.map +1 -1
  268. package/dist/esm/components/callout.js +1 -1
  269. package/dist/esm/components/callout.js.map +3 -3
  270. package/dist/esm/components/callout.props.d.ts +9 -1
  271. package/dist/esm/components/callout.props.d.ts.map +1 -1
  272. package/dist/esm/components/callout.props.js +1 -1
  273. package/dist/esm/components/callout.props.js.map +3 -3
  274. package/dist/esm/components/card.d.ts.map +1 -1
  275. package/dist/esm/components/card.js +1 -1
  276. package/dist/esm/components/card.js.map +3 -3
  277. package/dist/esm/components/card.props.d.ts +5 -0
  278. package/dist/esm/components/card.props.d.ts.map +1 -1
  279. package/dist/esm/components/card.props.js +1 -1
  280. package/dist/esm/components/card.props.js.map +3 -3
  281. package/dist/esm/components/checkbox-cards.d.ts.map +1 -1
  282. package/dist/esm/components/checkbox-cards.js +1 -1
  283. package/dist/esm/components/checkbox-cards.js.map +3 -3
  284. package/dist/esm/components/checkbox-cards.props.d.ts +2 -2
  285. package/dist/esm/components/checkbox-cards.props.js +1 -1
  286. package/dist/esm/components/checkbox-cards.props.js.map +2 -2
  287. package/dist/esm/components/checkbox-group.props.d.ts +6 -1
  288. package/dist/esm/components/checkbox-group.props.d.ts.map +1 -1
  289. package/dist/esm/components/checkbox.d.ts.map +1 -1
  290. package/dist/esm/components/checkbox.js +1 -1
  291. package/dist/esm/components/checkbox.js.map +3 -3
  292. package/dist/esm/components/code.js.map +1 -1
  293. package/dist/esm/components/code.props.d.ts +1 -1
  294. package/dist/esm/components/context-menu.d.ts +1 -1
  295. package/dist/esm/components/context-menu.d.ts.map +1 -1
  296. package/dist/esm/components/context-menu.js +1 -1
  297. package/dist/esm/components/context-menu.js.map +3 -3
  298. package/dist/esm/components/dialog.d.ts.map +1 -1
  299. package/dist/esm/components/dialog.js +1 -1
  300. package/dist/esm/components/dialog.js.map +3 -3
  301. package/dist/esm/components/dialog.props.d.ts +5 -0
  302. package/dist/esm/components/dialog.props.d.ts.map +1 -1
  303. package/dist/esm/components/dialog.props.js +1 -1
  304. package/dist/esm/components/dialog.props.js.map +3 -3
  305. package/dist/esm/components/dropdown-menu.d.ts +1 -1
  306. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  307. package/dist/esm/components/dropdown-menu.js +1 -1
  308. package/dist/esm/components/dropdown-menu.js.map +3 -3
  309. package/dist/esm/components/heading.props.d.ts +1 -1
  310. package/dist/esm/components/icon-button.d.ts +79 -1
  311. package/dist/esm/components/icon-button.d.ts.map +1 -1
  312. package/dist/esm/components/icon-button.js +4 -1
  313. package/dist/esm/components/icon-button.js.map +3 -3
  314. package/dist/esm/components/image.d.ts +131 -12
  315. package/dist/esm/components/image.d.ts.map +1 -1
  316. package/dist/esm/components/image.js +1 -1
  317. package/dist/esm/components/image.js.map +3 -3
  318. package/dist/esm/components/image.props.d.ts +136 -21
  319. package/dist/esm/components/image.props.d.ts.map +1 -1
  320. package/dist/esm/components/image.props.js +1 -1
  321. package/dist/esm/components/image.props.js.map +3 -3
  322. package/dist/esm/components/link.props.d.ts +1 -1
  323. package/dist/esm/components/progress.props.d.ts +2 -2
  324. package/dist/esm/components/progress.props.js +1 -1
  325. package/dist/esm/components/progress.props.js.map +2 -2
  326. package/dist/esm/components/radio-cards.d.ts.map +1 -1
  327. package/dist/esm/components/radio-cards.js +1 -1
  328. package/dist/esm/components/radio-cards.js.map +3 -3
  329. package/dist/esm/components/radio-cards.props.d.ts +2 -2
  330. package/dist/esm/components/radio-cards.props.js +1 -1
  331. package/dist/esm/components/radio-cards.props.js.map +2 -2
  332. package/dist/esm/components/radio.d.ts.map +1 -1
  333. package/dist/esm/components/radio.js +1 -1
  334. package/dist/esm/components/radio.js.map +3 -3
  335. package/dist/esm/components/segmented-control.props.d.ts +3 -3
  336. package/dist/esm/components/segmented-control.props.js +1 -1
  337. package/dist/esm/components/segmented-control.props.js.map +2 -2
  338. package/dist/esm/components/select.d.ts.map +1 -1
  339. package/dist/esm/components/select.js +1 -1
  340. package/dist/esm/components/select.js.map +3 -3
  341. package/dist/esm/components/select.props.d.ts +12 -0
  342. package/dist/esm/components/select.props.d.ts.map +1 -1
  343. package/dist/esm/components/select.props.js +1 -1
  344. package/dist/esm/components/select.props.js.map +2 -2
  345. package/dist/esm/components/sidebar.d.ts +5 -0
  346. package/dist/esm/components/sidebar.d.ts.map +1 -1
  347. package/dist/esm/components/sidebar.js +1 -1
  348. package/dist/esm/components/sidebar.js.map +3 -3
  349. package/dist/esm/components/slider.d.ts +5 -0
  350. package/dist/esm/components/slider.d.ts.map +1 -1
  351. package/dist/esm/components/slider.js +1 -1
  352. package/dist/esm/components/slider.js.map +3 -3
  353. package/dist/esm/components/slider.props.d.ts +10 -2
  354. package/dist/esm/components/slider.props.d.ts.map +1 -1
  355. package/dist/esm/components/slider.props.js +1 -1
  356. package/dist/esm/components/slider.props.js.map +2 -2
  357. package/dist/esm/components/switch.d.ts.map +1 -1
  358. package/dist/esm/components/switch.js +1 -1
  359. package/dist/esm/components/switch.js.map +3 -3
  360. package/dist/esm/components/switch.props.d.ts +17 -4
  361. package/dist/esm/components/switch.props.d.ts.map +1 -1
  362. package/dist/esm/components/switch.props.js +1 -1
  363. package/dist/esm/components/switch.props.js.map +3 -3
  364. package/dist/esm/components/tab-nav.d.ts.map +1 -1
  365. package/dist/esm/components/tab-nav.js +1 -1
  366. package/dist/esm/components/tab-nav.js.map +3 -3
  367. package/dist/esm/components/tabs.d.ts.map +1 -1
  368. package/dist/esm/components/tabs.js +1 -1
  369. package/dist/esm/components/tabs.js.map +2 -2
  370. package/dist/esm/components/text-area.d.ts.map +1 -1
  371. package/dist/esm/components/text-area.js +1 -1
  372. package/dist/esm/components/text-area.js.map +3 -3
  373. package/dist/esm/components/text-area.props.d.ts +29 -0
  374. package/dist/esm/components/text-area.props.d.ts.map +1 -1
  375. package/dist/esm/components/text-area.props.js +1 -1
  376. package/dist/esm/components/text-area.props.js.map +3 -3
  377. package/dist/esm/components/text-field.d.ts.map +1 -1
  378. package/dist/esm/components/text-field.js +4 -4
  379. package/dist/esm/components/text-field.js.map +3 -3
  380. package/dist/esm/components/text-field.props.d.ts +29 -0
  381. package/dist/esm/components/text-field.props.d.ts.map +1 -1
  382. package/dist/esm/components/text-field.props.js +1 -1
  383. package/dist/esm/components/text-field.props.js.map +3 -3
  384. package/dist/esm/components/text.props.d.ts +1 -1
  385. package/dist/esm/components/theme.d.ts +3 -0
  386. package/dist/esm/components/theme.d.ts.map +1 -1
  387. package/dist/esm/components/theme.js +1 -1
  388. package/dist/esm/components/theme.js.map +3 -3
  389. package/dist/esm/components/theme.props.d.ts +14 -0
  390. package/dist/esm/components/theme.props.d.ts.map +1 -1
  391. package/dist/esm/components/theme.props.js +1 -1
  392. package/dist/esm/components/theme.props.js.map +3 -3
  393. package/dist/esm/components/toggle-button.d.ts +52 -0
  394. package/dist/esm/components/toggle-button.d.ts.map +1 -1
  395. package/dist/esm/components/toggle-button.js +1 -1
  396. package/dist/esm/components/toggle-button.js.map +3 -3
  397. package/dist/esm/components/toggle-icon-button.d.ts +84 -2
  398. package/dist/esm/components/toggle-icon-button.d.ts.map +1 -1
  399. package/dist/esm/components/toggle-icon-button.js +1 -1
  400. package/dist/esm/components/toggle-icon-button.js.map +3 -3
  401. package/dist/esm/hooks/index.d.ts +2 -0
  402. package/dist/esm/hooks/index.d.ts.map +1 -0
  403. package/dist/esm/hooks/index.js +2 -0
  404. package/dist/esm/hooks/index.js.map +7 -0
  405. package/dist/esm/hooks/use-live-announcer.d.ts +6 -0
  406. package/dist/esm/hooks/use-live-announcer.d.ts.map +1 -0
  407. package/dist/esm/hooks/use-live-announcer.js +10 -0
  408. package/dist/esm/hooks/use-live-announcer.js.map +7 -0
  409. package/dist/esm/index.d.ts +1 -0
  410. package/dist/esm/index.d.ts.map +1 -1
  411. package/dist/esm/index.js +1 -1
  412. package/dist/esm/index.js.map +2 -2
  413. package/dist/esm/props/weight.prop.d.ts +1 -1
  414. package/dist/esm/props/weight.prop.js +1 -1
  415. package/dist/esm/props/weight.prop.js.map +2 -2
  416. package/layout/components.css +1 -0
  417. package/layout.css +1 -0
  418. package/package.json +2 -1
  419. package/src/components/_internal/base-button.css +483 -284
  420. package/src/components/_internal/base-button.props.ts +87 -0
  421. package/src/components/_internal/base-button.tsx +127 -10
  422. package/src/components/_internal/base-card.css +866 -83
  423. package/src/components/_internal/base-checkbox.css +252 -52
  424. package/src/components/_internal/base-checkbox.props.ts +4 -1
  425. package/src/components/_internal/base-dialog.css +39 -8
  426. package/src/components/_internal/base-menu.css +55 -32
  427. package/src/components/_internal/base-menu.props.ts +10 -0
  428. package/src/components/_internal/base-radio.css +222 -52
  429. package/src/components/_internal/base-radio.props.ts +4 -1
  430. package/src/components/_internal/base-tab-list.css +16 -0
  431. package/src/components/accordion.css +465 -62
  432. package/src/components/accordion.props.tsx +6 -0
  433. package/src/components/accordion.tsx +54 -7
  434. package/src/components/alert-dialog.props.tsx +22 -2
  435. package/src/components/alert-dialog.tsx +94 -3
  436. package/src/components/avatar.css +294 -152
  437. package/src/components/avatar.props.tsx +7 -1
  438. package/src/components/avatar.tsx +12 -2
  439. package/src/components/badge.css +160 -138
  440. package/src/components/badge.props.tsx +10 -3
  441. package/src/components/badge.tsx +71 -9
  442. package/src/components/button.css +88 -0
  443. package/src/components/button.props.tsx +17 -0
  444. package/src/components/button.tsx +107 -5
  445. package/src/components/callout.css +122 -35
  446. package/src/components/callout.props.tsx +7 -1
  447. package/src/components/callout.tsx +32 -9
  448. package/src/components/card.css +0 -597
  449. package/src/components/card.props.tsx +3 -0
  450. package/src/components/card.tsx +4 -2
  451. package/src/components/checkbox-cards.css +27 -104
  452. package/src/components/checkbox-cards.props.tsx +2 -2
  453. package/src/components/checkbox-cards.tsx +21 -3
  454. package/src/components/checkbox.tsx +2 -0
  455. package/src/components/code.css +1 -1
  456. package/src/components/code.tsx +1 -1
  457. package/src/components/container.css +1 -0
  458. package/src/components/context-menu.tsx +54 -12
  459. package/src/components/dialog.props.tsx +3 -0
  460. package/src/components/dialog.tsx +93 -3
  461. package/src/components/dropdown-menu.tsx +49 -12
  462. package/src/components/icon-button.css +73 -4
  463. package/src/components/icon-button.tsx +125 -19
  464. package/src/components/image.css +160 -91
  465. package/src/components/image.props.ts +152 -15
  466. package/src/components/image.tsx +290 -247
  467. package/src/components/kbd.css +23 -44
  468. package/src/components/progress.css +130 -149
  469. package/src/components/progress.props.tsx +2 -2
  470. package/src/components/radio-cards.css +23 -113
  471. package/src/components/radio-cards.props.tsx +2 -2
  472. package/src/components/radio-cards.tsx +45 -18
  473. package/src/components/radio.tsx +4 -3
  474. package/src/components/scroll-area.css +1 -1
  475. package/src/components/segmented-control.css +83 -64
  476. package/src/components/segmented-control.props.tsx +3 -3
  477. package/src/components/select.css +502 -224
  478. package/src/components/select.props.tsx +8 -0
  479. package/src/components/select.tsx +45 -2
  480. package/src/components/sidebar.css +17 -6
  481. package/src/components/sidebar.tsx +61 -5
  482. package/src/components/slider.css +228 -88
  483. package/src/components/slider.props.tsx +6 -2
  484. package/src/components/slider.tsx +201 -24
  485. package/src/components/spinner.css +12 -0
  486. package/src/components/switch.css +135 -216
  487. package/src/components/switch.props.tsx +16 -4
  488. package/src/components/switch.tsx +5 -3
  489. package/src/components/tab-nav.tsx +6 -3
  490. package/src/components/tabs.tsx +2 -0
  491. package/src/components/text-area.css +222 -140
  492. package/src/components/text-area.props.tsx +18 -1
  493. package/src/components/text-area.tsx +58 -7
  494. package/src/components/text-field.css +214 -131
  495. package/src/components/text-field.props.tsx +17 -0
  496. package/src/components/text-field.tsx +79 -28
  497. package/src/components/theme.props.tsx +12 -0
  498. package/src/components/theme.tsx +31 -1
  499. package/src/components/toggle-button.tsx +102 -3
  500. package/src/components/toggle-icon-button.tsx +150 -7
  501. package/src/components/tooltip.css +3 -3
  502. package/src/hooks/index.ts +1 -0
  503. package/src/hooks/use-live-announcer.ts +52 -0
  504. package/src/index.ts +1 -0
  505. package/src/props/weight.prop.ts +1 -1
  506. package/src/styles/fonts.css +27 -13
  507. package/src/styles/index.css +1 -1
  508. package/src/styles/tokens/base.css +2 -0
  509. package/src/styles/tokens/blur.css +32 -0
  510. package/src/styles/tokens/color.css +9 -9
  511. package/src/styles/tokens/constants.css +88 -140
  512. package/src/styles/tokens/index.css +2 -0
  513. package/src/styles/tokens/opacity.css +32 -0
  514. package/src/styles/tokens/radius.css +6 -10
  515. package/src/styles/tokens/shadow.css +25 -25
  516. package/src/styles/tokens/transition.css +49 -13
  517. package/src/styles/tokens/typography.css +7 -3
  518. package/src/styles/utilities/font-weight.css +16 -0
  519. package/styles.css +10689 -8708
  520. package/tokens/base.css +127 -49
  521. package/tokens.css +158 -114
  522. package/utilities.css +72 -0
@@ -1,5 +1,3 @@
1
- 'use client';
2
-
3
1
  import * as React from 'react';
4
2
  import classNames from 'classnames';
5
3
 
@@ -10,7 +8,7 @@ import { widthPropDefs } from '../props/width.props.js';
10
8
  import { heightPropDefs } from '../props/height.props.js';
11
9
  import { layoutPropDefs } from '../props/layout.props.js';
12
10
  import { Skeleton } from './skeleton.js';
13
- import { Box } from './box.js';
11
+ import { Slot } from './slot.js';
14
12
 
15
13
  import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
16
14
  import type { MarginProps } from '../props/margin.props.js';
@@ -20,35 +18,81 @@ import type { LayoutProps } from '../props/layout.props.js';
20
18
  import type { GetPropDefTypes } from '../props/prop-def.js';
21
19
 
22
20
  type ImageElement = React.ElementRef<'img'>;
21
+
22
+ /**
23
+ * Core Image props that extend the base image prop definitions
24
+ * These props provide enhanced functionality beyond standard HTML img attributes
25
+ */
23
26
  type ImageOwnProps = GetPropDefTypes<typeof imagePropDefs> & {
27
+ /**
28
+ * Native loading behavior for the image
29
+ * 'lazy' defers loading until the image is near the viewport
30
+ * 'eager' loads the image immediately
31
+ */
24
32
  loading?: 'eager' | 'lazy';
25
33
  /**
26
- * Placeholder image URL to show while the main image is loading.
27
- * Can be a low-quality/blurred version of the main image.
34
+ * Placeholder image URL to show while the main image is loading
35
+ *
36
+ * Best practices:
37
+ * - Use a low-quality/blurred version of the main image
38
+ * - Keep file size small (under 10KB recommended)
39
+ * - Use same aspect ratio as main image
40
+ * - Consider using base64 data URLs for inline placeholders
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <Image
45
+ * src="/high-res-image.jpg"
46
+ * placeholder="/low-res-placeholder.jpg"
47
+ * alt="Product photo"
48
+ * />
49
+ * ```
28
50
  */
29
51
  placeholder?: string;
30
52
  /**
31
- * Shows a skeleton placeholder while loading instead of a blank space.
53
+ * Shows a skeleton placeholder while loading instead of a blank space
54
+ *
55
+ * Use this when:
56
+ * - You don't have a placeholder image
57
+ * - You want consistent loading states across your interface
58
+ * - The image is part of a content layout that needs stable dimensions
32
59
  */
33
60
  showSkeleton?: boolean;
34
61
  /**
35
- * Whether the image should fade in when loaded. Set to false for background images or when you want immediate visibility.
62
+ * Whether the image should fade in when loaded
63
+ *
64
+ * Set to false for:
65
+ * - Background images where immediate visibility is important
66
+ * - Images that need to appear instantly for UX reasons
67
+ * - When you're implementing custom loading animations
36
68
  */
37
69
  fadeIn?: boolean;
38
70
  /**
39
- * Callback fired when the image successfully loads.
71
+ * Callback fired when the image successfully loads
72
+ *
73
+ * Use this to:
74
+ * - Track image loading performance
75
+ * - Trigger layout adjustments after load
76
+ * - Implement custom loading state management
40
77
  */
41
78
  onLoad?: (event: React.SyntheticEvent<HTMLImageElement>) => void;
42
79
  /**
43
- * Callback fired when the image fails to load.
80
+ * Callback fired when the image fails to load
81
+ *
82
+ * Use this to:
83
+ * - Log errors for monitoring
84
+ * - Show fallback content
85
+ * - Implement retry logic
44
86
  */
45
87
  onError?: (event: React.SyntheticEvent<HTMLImageElement>) => void;
46
- /**
47
- * Style object to apply to the wrapper container. Useful for overriding display, width, height, etc.
48
- */
49
- wrapperStyle?: React.CSSProperties;
50
88
  };
51
89
 
90
+ /**
91
+ * Complete Image component props interface
92
+ *
93
+ * Combines HTML img attributes with design system props and enhanced functionality.
94
+ * Excludes conflicting props like 'color', 'width', 'height' that are handled by the design system.
95
+ */
52
96
  interface ImageProps
53
97
  extends ComponentPropsWithout<'img', RemovedProps | 'color' | 'width' | 'height' | 'alt'>,
54
98
  MarginProps,
@@ -57,31 +101,108 @@ interface ImageProps
57
101
  LayoutProps,
58
102
  ImageOwnProps {
59
103
  /**
60
- * The alt attribute provides alternative information for an image if a user for some reason cannot view it.
61
- * Required for accessibility when not using asChild. Use empty string for decorative images.
104
+ * Alternative text for the image
105
+ *
106
+ * Required for accessibility when not using asChild pattern.
107
+ * Describes the image content for screen readers and when images fail to load.
108
+ *
109
+ * Guidelines:
110
+ * - Be descriptive but concise
111
+ * - Don't include "image of" or "picture of"
112
+ * - Use empty string ("") for purely decorative images
113
+ * - Describe the content and context, not just what you see
114
+ *
115
+ * @example
116
+ * ```tsx
117
+ * // Good alt text
118
+ * <Image src="/chart.png" alt="Sales increased 25% from Q1 to Q2" />
119
+ *
120
+ * // Decorative image
121
+ * <Image src="/decoration.png" alt="" />
122
+ *
123
+ * // Avoid generic descriptions
124
+ * <Image src="/photo.jpg" alt="A photo" /> // ❌ Too generic
125
+ * <Image src="/photo.jpg" alt="Team celebrating project launch" /> // ✅ Descriptive
126
+ * ```
62
127
  */
63
128
  alt: string;
64
129
  }
65
130
 
131
+ /**
132
+ * Image component for displaying images with enhanced loading states and accessibility
133
+ *
134
+ * The Image component extends the standard HTML img element with advanced features
135
+ * including placeholder images, skeleton loading states, fade-in animations, and
136
+ * comprehensive accessibility support. It integrates seamlessly with the design
137
+ * system's layout, spacing, and theming capabilities.
138
+ *
139
+ * Key features:
140
+ * - Progressive loading with placeholder and skeleton states
141
+ * - Fade-in animations with reduced motion support
142
+ * - Comprehensive accessibility with ARIA attributes
143
+ * - Object-fit control for responsive image scaling
144
+ * - Caption support for additional context
145
+ * - AsChild pattern for flexible composition
146
+ * - Error handling with fallback states
147
+ * - Performance optimizations for cached images
148
+ *
149
+ * @example
150
+ * ```tsx
151
+ * // Basic usage
152
+ * <Image src="/photo.jpg" alt="Team photo" />
153
+ *
154
+ * // With placeholder and skeleton
155
+ * <Image
156
+ * src="/high-res.jpg"
157
+ * placeholder="/low-res.jpg"
158
+ * showSkeleton
159
+ * alt="Product showcase"
160
+ * />
161
+ *
162
+ * // With caption and custom fit
163
+ * <Image
164
+ * src="/chart.png"
165
+ * alt="Sales data visualization"
166
+ * caption="Q3 2024 Sales Performance"
167
+ * fit="contain"
168
+ * width="400px"
169
+ * height="300px"
170
+ * />
171
+ *
172
+ * // As clickable element
173
+ * <Image
174
+ * asChild
175
+ * src="/thumbnail.jpg"
176
+ * alt="View full gallery"
177
+ * >
178
+ * <a href="/gallery">
179
+ * View Gallery
180
+ * </a>
181
+ * </Image>
182
+ * ```
183
+ */
66
184
  const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) => {
67
- const { variant = 'surface', wrapperStyle, ...restProps } = props;
185
+ // Extract and organize props for different purposes
68
186
  const {
69
187
  asChild,
70
188
  className,
71
- radius,
72
189
  style,
73
- loading = 'lazy',
190
+ loading = 'lazy', // Default to lazy loading for performance
74
191
  alt,
75
192
  src,
76
193
  placeholder,
77
- showSkeleton = false,
78
- fadeIn = true,
194
+ showSkeleton = false, // Default to no skeleton for simpler UX
195
+ fadeIn = true, // Default to fade-in for smooth loading experience
196
+ loadingAriaLabel, // Extract but don't use
197
+ errorAriaLabel = 'Failed to load image',
198
+ radius,
199
+ caption,
79
200
  onLoad: userOnLoad,
80
201
  onError: userOnError,
81
202
  children,
82
203
  ...wrapperProps
83
204
  } = extractProps(
84
- restProps,
205
+ props,
85
206
  imagePropDefs,
86
207
  marginPropDefs,
87
208
  widthPropDefs,
@@ -89,47 +210,52 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
89
210
  layoutPropDefs,
90
211
  );
91
212
 
92
- // Loading state management
93
- const [imageLoaded, setImageLoaded] = React.useState(false);
94
- const [imageError, setImageError] = React.useState(false);
213
+ // State management for loading, error, and placeholder states
214
+ const [loadingState, setLoadingState] = React.useState<'loading' | 'loaded' | 'error'>('loading');
95
215
  const [showPlaceholder, setShowPlaceholder] = React.useState(!!placeholder);
96
-
97
- // Ref to check if image is already loaded (for cached images)
98
216
  const imgRef = React.useRef<HTMLImageElement>(null);
99
217
 
100
- // Handle image load
218
+ /**
219
+ * Handle successful image load
220
+ * Updates state and triggers user callback for load event
221
+ */
101
222
  const handleLoad = React.useCallback(
102
223
  (event: React.SyntheticEvent<HTMLImageElement>) => {
103
- setImageLoaded(true);
104
- setImageError(false);
224
+ setLoadingState('loaded');
105
225
  setShowPlaceholder(false);
226
+ // Call user's onLoad handler if provided
106
227
  userOnLoad?.(event);
107
228
  },
108
229
  [userOnLoad],
109
230
  );
110
231
 
111
- // Handle image error
232
+ /**
233
+ * Handle image load error
234
+ * Updates state and triggers user callback for error event
235
+ */
112
236
  const handleError = React.useCallback(
113
237
  (event: React.SyntheticEvent<HTMLImageElement>) => {
114
- setImageLoaded(false);
115
- setImageError(true);
238
+ setLoadingState('error');
116
239
  setShowPlaceholder(false);
240
+ // Call user's onError handler if provided
117
241
  userOnError?.(event);
118
242
  },
119
243
  [userOnError],
120
244
  );
121
245
 
122
- // Check if image is already loaded (for cached images)
246
+ /**
247
+ * Check if image is already loaded (optimization for cached images)
248
+ * This prevents unnecessary loading states for images that are already available
249
+ */
123
250
  React.useEffect(() => {
124
251
  const img = imgRef.current;
125
252
  if (img && img.complete && img.naturalWidth > 0) {
126
- setImageLoaded(true);
127
- setImageError(false);
253
+ setLoadingState('loaded');
128
254
  setShowPlaceholder(false);
129
255
  }
130
256
  }, [src]);
131
257
 
132
- // Validate required props
258
+ // Validate required props and provide helpful development warnings
133
259
  if (!src) {
134
260
  console.warn('Image component: src prop is required');
135
261
  return null;
@@ -139,200 +265,98 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
139
265
  console.warn('Image component: alt prop is required for accessibility when not using asChild');
140
266
  }
141
267
 
142
- // Common image styles that apply to the actual img element
268
+ // Derive loading state flags for cleaner conditional rendering
269
+ const isLoading = loadingState === 'loading';
270
+ const isError = loadingState === 'error';
271
+ const isLoaded = loadingState === 'loaded';
272
+
273
+ /**
274
+ * ARIA attributes for comprehensive accessibility support
275
+ * These attributes help screen readers understand the image state
276
+ */
277
+ const ariaProps = {
278
+ 'aria-busy': isLoading,
279
+ 'aria-invalid': isError,
280
+ 'aria-describedby': isError ? 'image-error' : undefined,
281
+ };
282
+
283
+ /**
284
+ * Image styling that handles fade-in animation and responsive behavior
285
+ * Respects user's motion preferences through CSS media queries
286
+ */
143
287
  const imgStyle: React.CSSProperties = {
144
288
  width: '100%',
145
289
  height: '100%',
146
290
  display: 'block',
147
- opacity: fadeIn ? (imageLoaded ? 1 : 0) : 1,
291
+ // Conditional opacity for fade-in effect
292
+ opacity: fadeIn ? (isLoaded ? 1 : 0) : 1,
293
+ // Smooth transition for fade-in, respects reduced motion preferences
148
294
  transition: fadeIn ? 'opacity 0.3s ease-out' : 'none',
149
- ...style, // Allow style overrides for the image
150
295
  };
151
296
 
152
- // Wrapper styles that get all the sizing and positioning
153
- const wrapperStyleFinal: React.CSSProperties = {
154
- position: 'relative',
155
- display: 'block', // Use block instead of inline-block to work better with AspectRatio
156
- ...wrapperStyle,
157
- };
158
-
159
- // Create skeleton placeholder
160
- const skeletonElement =
161
- showSkeleton && !imageLoaded && !imageError ? (
162
- <Skeleton
163
- width="100%"
164
- height="100px" // Default height, can be overridden by wrapper
165
- style={{
166
- borderRadius: radius ? `var(--radius-${radius})` : undefined,
167
- }}
168
- className={className}
169
- />
170
- ) : null;
171
-
172
- // Create placeholder image element
173
- const placeholderElement =
174
- placeholder && showPlaceholder ? (
175
- <img
176
- data-radius={radius}
297
+ /**
298
+ * Create the complete image content structure
299
+ * This includes the main image, placeholder, skeleton, caption, and error states
300
+ */
301
+ const imageContent = (
302
+ <>
303
+ {/*
304
+ * Image container - handles layout and positioning
305
+ * Uses flex layout when caption is present for proper space distribution
306
+ */}
307
+ <div
177
308
  style={{
178
- ...imgStyle,
179
- filter: 'blur(4px)',
180
- opacity: 0.7,
181
- transition: 'opacity 0.3s ease-out',
309
+ position: 'relative',
310
+ flex: caption ? '1 1 0%' : undefined,
311
+ height: caption ? undefined : '100%',
312
+ minHeight: 0, // Important for flex shrinking in constrained layouts
182
313
  }}
183
- className={classNames('rt-reset', 'rt-Image', 'rt-Image--placeholder', className)}
184
- alt=""
185
- src={placeholder}
186
- />
187
- ) : null;
314
+ >
315
+ {/*
316
+ * Error message for screen readers
317
+ * Hidden visually but announced by assistive technology
318
+ */}
319
+ {isError && (
320
+ <div id="image-error" className="rt-sr-only" aria-live="polite">
321
+ {errorAriaLabel}
322
+ </div>
323
+ )}
188
324
 
189
- // Handle asChild - inject content into the child element
190
- if (asChild && children) {
191
- const child = React.Children.only(children) as React.ReactElement<any>;
325
+ {/*
326
+ * Skeleton placeholder during loading
327
+ * Provides visual feedback and prevents layout shift
328
+ */}
329
+ {showSkeleton && isLoading && (
330
+ <Skeleton width="100%" height="100%" style={{ position: 'absolute', inset: 0 }} />
331
+ )}
192
332
 
193
- if (variant === 'blur') {
194
- // For blur variant with asChild
195
- return React.cloneElement(child, {
196
- className: classNames(child.props?.className, 'rt-variant-blur'),
197
- style: {
198
- textDecoration: 'none',
199
- color: 'inherit',
200
- border: 'none',
201
- background: 'none',
202
- padding: 0,
203
- font: 'inherit',
204
- cursor: 'pointer',
205
- ...wrapperStyleFinal,
206
- ...style, // Apply sizing to the child element
207
- ...child.props?.style,
208
- },
209
- children: (
210
- <>
211
- {/* Background blurred image */}
212
- <img
213
- data-radius={radius}
214
- loading={loading}
215
- style={{
216
- position: 'absolute',
217
- top: '0',
218
- left: '0',
219
- width: '105%',
220
- height: '105%',
221
- transform: 'translate(-2.5%, -2.5%)',
222
- filter: 'blur(16px) saturate(1.5)',
223
- opacity: 0.5,
224
- zIndex: -1,
225
- }}
226
- className={classNames('rt-reset', 'rt-Image', 'rt-Image--blur-bg', className)}
227
- alt=""
228
- src={src}
229
- />
230
- {/* Foreground image */}
231
- <img
232
- data-radius={radius}
233
- loading={loading}
234
- style={imgStyle}
235
- className={classNames('rt-reset', 'rt-Image', 'rt-Image--blur', className)}
236
- alt={alt}
237
- src={src}
238
- onLoad={handleLoad}
239
- onError={handleError}
240
- ref={(node) => {
241
- imgRef.current = node;
242
- if (typeof forwardedRef === 'function') {
243
- forwardedRef(node);
244
- } else if (forwardedRef) {
245
- forwardedRef.current = node;
246
- }
247
- }}
248
- />
249
- </>
250
- ),
251
- });
252
- } else {
253
- // For surface variant with asChild
254
- return React.cloneElement(child, {
255
- className: classNames(child.props?.className),
256
- style: {
257
- textDecoration: 'none',
258
- color: 'inherit',
259
- border: 'none',
260
- background: 'none',
261
- padding: 0,
262
- font: 'inherit',
263
- cursor: 'pointer',
264
- ...wrapperStyleFinal,
265
- ...child.props?.style,
266
- },
267
- children: (
268
- <>
269
- {skeletonElement}
270
- {placeholderElement}
271
- <img
272
- data-radius={radius}
273
- loading={loading}
274
- style={imgStyle}
275
- className={classNames('rt-reset', 'rt-Image', className)}
276
- alt={alt}
277
- src={src}
278
- onLoad={handleLoad}
279
- onError={handleError}
280
- ref={(node) => {
281
- imgRef.current = node;
282
- if (typeof forwardedRef === 'function') {
283
- forwardedRef(node);
284
- } else if (forwardedRef) {
285
- forwardedRef.current = node;
286
- }
287
- }}
288
- />
289
- </>
290
- ),
291
- });
292
- }
293
- }
333
+ {/*
334
+ * Placeholder image with blur effect
335
+ * Shows a low-quality version while the main image loads
336
+ */}
337
+ {placeholder && showPlaceholder && (
338
+ <img
339
+ style={{
340
+ ...imgStyle,
341
+ position: 'absolute',
342
+ inset: 0,
343
+ filter: 'blur(4px)', // Creates the blur effect for LQIP (Low Quality Image Placeholder)
344
+ opacity: 0.7, // Subtle opacity to indicate it's a placeholder
345
+ zIndex: 0, // Behind the main image
346
+ }}
347
+ className={classNames('rt-reset', 'rt-Image', 'rt-Image--placeholder')}
348
+ alt="" // Decorative placeholder, no alt text needed
349
+ src={placeholder}
350
+ />
351
+ )}
294
352
 
295
- // Regular rendering without asChild - both variants use Box wrapper
296
- if (variant === 'blur') {
297
- return (
298
- <Box
299
- className={classNames('rt-variant-blur', className)}
300
- style={{
301
- ...style, // Include the width/height styles from extractProps
302
- ...wrapperStyleFinal,
303
- }}
304
- {...wrapperProps} // Apply other props to wrapper
305
- >
306
- {/* Background blurred image */}
353
+ {/*
354
+ * Main image element
355
+ * Handles all the core functionality and user interactions
356
+ */}
307
357
  <img
308
- data-radius={radius}
309
- loading={loading}
310
- style={{
311
- position: 'absolute',
312
- top: '0',
313
- left: '0',
314
- width: '105%',
315
- height: '105%',
316
- transform: 'translate(-2.5%, -2.5%)',
317
- filter: 'blur(16px) saturate(1.5)',
318
- opacity: 0.5,
319
- zIndex: -1,
320
- }}
321
- className={classNames('rt-reset', 'rt-Image', 'rt-Image--blur-bg', className)}
322
- alt=""
323
- src={src}
324
- />
325
- {/* Foreground image */}
326
- <img
327
- data-radius={radius}
328
- loading={loading}
329
- style={imgStyle}
330
- className={classNames('rt-reset', 'rt-Image', 'rt-Image--blur', className)}
331
- alt={alt}
332
- src={src}
333
- onLoad={handleLoad}
334
- onError={handleError}
335
358
  ref={(node) => {
359
+ // Handle both internal ref and forwarded ref
336
360
  imgRef.current = node;
337
361
  if (typeof forwardedRef === 'function') {
338
362
  forwardedRef(node);
@@ -340,42 +364,61 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
340
364
  forwardedRef.current = node;
341
365
  }
342
366
  }}
367
+ loading={loading}
368
+ style={{ ...imgStyle, position: 'relative', zIndex: 1 }}
369
+ className={classNames('rt-reset', 'rt-Image', className)}
370
+ alt={alt}
371
+ src={src}
372
+ data-radius={radius}
373
+ onLoad={handleLoad}
374
+ onError={handleError}
375
+ {...ariaProps}
343
376
  />
344
- </Box>
377
+ </div>
378
+
379
+ {/*
380
+ * Caption element - positioned below the image
381
+ * Takes only the space it needs, doesn't interfere with image sizing
382
+ */}
383
+ {caption && (
384
+ <div className="rt-Image-caption" style={{ flex: '0 0 auto' }}>
385
+ {caption}
386
+ </div>
387
+ )}
388
+ </>
389
+ );
390
+
391
+ /**
392
+ * Container styling that adapts based on caption presence
393
+ * Uses flexbox when caption is present for proper layout control
394
+ */
395
+ const containerStyle: React.CSSProperties = {
396
+ display: caption ? 'flex' : 'block',
397
+ flexDirection: caption ? 'column' : undefined,
398
+ ...style, // Allow user styles to override defaults
399
+ };
400
+
401
+ /**
402
+ * Render with asChild pattern for composition
403
+ * This allows the Image to be rendered as a child of another element
404
+ * while maintaining all its functionality and styling
405
+ */
406
+ if (asChild) {
407
+ return (
408
+ <Slot className={className} style={containerStyle} {...wrapperProps}>
409
+ {React.cloneElement(children as React.ReactElement, {}, imageContent)}
410
+ </Slot>
345
411
  );
346
412
  }
347
413
 
348
- // Surface variant - also use Box wrapper for consistency
414
+ /**
415
+ * Regular rendering as a standalone div container
416
+ * This is the default rendering mode for most use cases
417
+ */
349
418
  return (
350
- <Box
351
- className={className}
352
- style={{
353
- ...style, // Include the width/height styles from extractProps
354
- ...wrapperStyleFinal,
355
- }}
356
- {...wrapperProps} // Apply other props to wrapper
357
- >
358
- {skeletonElement}
359
- {placeholderElement}
360
- <img
361
- data-radius={radius}
362
- loading={loading}
363
- style={imgStyle}
364
- className={classNames('rt-reset', 'rt-Image', className)}
365
- alt={alt}
366
- src={src}
367
- onLoad={handleLoad}
368
- onError={handleError}
369
- ref={(node) => {
370
- imgRef.current = node;
371
- if (typeof forwardedRef === 'function') {
372
- forwardedRef(node);
373
- } else if (forwardedRef) {
374
- forwardedRef.current = node;
375
- }
376
- }}
377
- />
378
- </Box>
419
+ <div className={className} style={containerStyle} {...wrapperProps}>
420
+ {imageContent}
421
+ </div>
379
422
  );
380
423
  });
381
424