@rojaostudio/ds 1.0.1 → 2.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/README.md +75 -13
  2. package/dist/compat/generate.d.ts +0 -1
  3. package/dist/components/accordion.d.ts +30 -20
  4. package/dist/components/accordion.js +31 -87
  5. package/dist/components/action-bar.d.ts +24 -0
  6. package/dist/components/action-bar.js +55 -0
  7. package/dist/components/alert-dialog.d.ts +31 -0
  8. package/dist/components/alert-dialog.js +43 -0
  9. package/dist/components/alert.d.ts +31 -19
  10. package/dist/components/alert.js +74 -65
  11. package/dist/components/attachment.d.ts +37 -0
  12. package/dist/components/attachment.js +76 -0
  13. package/dist/components/avatar.d.ts +43 -36
  14. package/dist/components/avatar.js +59 -83
  15. package/dist/components/badge.d.ts +30 -41
  16. package/dist/components/badge.js +16 -106
  17. package/dist/components/banner.d.ts +27 -0
  18. package/dist/components/banner.js +66 -0
  19. package/dist/components/benefits.d.ts +30 -0
  20. package/dist/components/benefits.js +32 -0
  21. package/dist/components/breadcrumb.d.ts +25 -18
  22. package/dist/components/breadcrumb.js +40 -48
  23. package/dist/components/browser.d.ts +18 -0
  24. package/dist/components/browser.js +32 -0
  25. package/dist/components/bubble.d.ts +29 -0
  26. package/dist/components/bubble.js +33 -0
  27. package/dist/components/button-group.d.ts +19 -0
  28. package/dist/components/button-group.js +20 -0
  29. package/dist/components/button.d.ts +47 -20
  30. package/dist/components/button.js +51 -107
  31. package/dist/components/calendar.d.ts +29 -0
  32. package/dist/components/calendar.js +149 -0
  33. package/dist/components/card.d.ts +47 -19
  34. package/dist/components/card.js +38 -38
  35. package/dist/components/carousel.d.ts +28 -0
  36. package/dist/components/carousel.js +130 -0
  37. package/dist/components/chart.d.ts +49 -0
  38. package/dist/components/chart.js +258 -0
  39. package/dist/components/checkbox-group.d.ts +16 -0
  40. package/dist/components/checkbox-group.js +13 -0
  41. package/dist/components/checkbox.d.ts +25 -10
  42. package/dist/components/checkbox.js +86 -67
  43. package/dist/components/chip-input.d.ts +46 -20
  44. package/dist/components/chip-input.js +171 -158
  45. package/dist/components/chip.d.ts +28 -0
  46. package/dist/components/chip.js +73 -0
  47. package/dist/components/choice-card.d.ts +10 -13
  48. package/dist/components/choice-card.js +11 -56
  49. package/dist/components/choice-carousel.d.ts +9 -0
  50. package/dist/components/choice-carousel.js +67 -78
  51. package/dist/components/choice-preview-card.d.ts +10 -20
  52. package/dist/components/choice-preview-card.js +13 -30
  53. package/dist/components/color-input.d.ts +36 -11
  54. package/dist/components/color-input.js +139 -61
  55. package/dist/components/combobox.d.ts +60 -57
  56. package/dist/components/combobox.js +215 -196
  57. package/dist/components/command.d.ts +58 -0
  58. package/dist/components/command.js +177 -0
  59. package/dist/components/contact.d.ts +23 -0
  60. package/dist/components/contact.js +32 -0
  61. package/dist/components/context-menu.d.ts +34 -26
  62. package/dist/components/context-menu.js +43 -66
  63. package/dist/components/copy-field.d.ts +10 -5
  64. package/dist/components/copy-field.js +25 -27
  65. package/dist/components/currency-input.d.ts +25 -11
  66. package/dist/components/currency-input.js +39 -67
  67. package/dist/components/danger-zone.d.ts +10 -1
  68. package/dist/components/danger-zone.js +20 -14
  69. package/dist/components/data-table-header.d.ts +13 -2
  70. package/dist/components/data-table-header.js +143 -169
  71. package/dist/components/date-picker.d.ts +31 -32
  72. package/dist/components/date-picker.js +126 -242
  73. package/dist/components/delta.d.ts +26 -0
  74. package/dist/components/delta.js +24 -0
  75. package/dist/components/dialog.d.ts +21 -0
  76. package/dist/components/dialog.js +16 -0
  77. package/dist/components/drawer.d.ts +15 -23
  78. package/dist/components/drawer.js +56 -76
  79. package/dist/components/dropdown-menu.d.ts +63 -0
  80. package/dist/components/dropdown-menu.js +62 -0
  81. package/dist/components/dropzone.d.ts +10 -4
  82. package/dist/components/dropzone.js +30 -55
  83. package/dist/components/empty.d.ts +29 -0
  84. package/dist/components/empty.js +42 -0
  85. package/dist/components/fab.d.ts +29 -6
  86. package/dist/components/fab.js +51 -39
  87. package/dist/components/faq.d.ts +21 -0
  88. package/dist/components/faq.js +24 -0
  89. package/dist/components/file-input.d.ts +56 -0
  90. package/dist/components/file-input.js +244 -0
  91. package/dist/components/filter-chip.d.ts +34 -47
  92. package/dist/components/filter-chip.js +61 -57
  93. package/dist/components/floating-stepper.d.ts +7 -18
  94. package/dist/components/floating-stepper.js +17 -35
  95. package/dist/components/footer.d.ts +36 -0
  96. package/dist/components/footer.js +38 -0
  97. package/dist/components/form-actions.d.ts +28 -0
  98. package/dist/components/form-actions.js +24 -0
  99. package/dist/components/google-account-chooser.d.ts +25 -0
  100. package/dist/components/google-account-chooser.js +44 -0
  101. package/dist/components/google-button.d.ts +26 -0
  102. package/dist/components/google-button.js +38 -0
  103. package/dist/components/google-consent.d.ts +23 -0
  104. package/dist/components/google-consent.js +28 -0
  105. package/dist/components/google-sign-in.d.ts +26 -0
  106. package/dist/components/google-sign-in.js +36 -0
  107. package/dist/components/hover-card.d.ts +30 -0
  108. package/dist/components/hover-card.js +55 -0
  109. package/dist/components/icon-button.d.ts +41 -11
  110. package/dist/components/icon-button.js +47 -61
  111. package/dist/components/image-crop-modal.d.ts +3 -3
  112. package/dist/components/image-crop-modal.js +66 -52
  113. package/dist/components/image-upload.d.ts +21 -29
  114. package/dist/components/image-upload.js +59 -219
  115. package/dist/components/index.d.ts +105 -49
  116. package/dist/components/index.js +190 -68
  117. package/dist/components/input-otp.d.ts +35 -0
  118. package/dist/components/input-otp.js +119 -0
  119. package/dist/components/input.d.ts +23 -17
  120. package/dist/components/input.js +103 -108
  121. package/dist/components/insight-card.d.ts +25 -9
  122. package/dist/components/insight-card.js +45 -19
  123. package/dist/components/internal/announce.d.ts +3 -0
  124. package/dist/components/internal/announce.js +20 -0
  125. package/dist/components/internal/block.d.ts +15 -0
  126. package/dist/components/internal/block.js +14 -0
  127. package/dist/components/internal/button.d.ts +23 -0
  128. package/dist/components/internal/button.js +30 -0
  129. package/dist/components/internal/choice-card.d.ts +52 -0
  130. package/dist/components/internal/choice-card.js +117 -0
  131. package/dist/components/internal/choice.d.ts +25 -0
  132. package/dist/components/internal/choice.js +44 -0
  133. package/dist/components/internal/dates.d.ts +17 -0
  134. package/dist/components/internal/dates.js +59 -0
  135. package/dist/components/internal/field.d.ts +66 -0
  136. package/dist/components/internal/field.js +105 -0
  137. package/dist/components/internal/fieldset.d.ts +25 -0
  138. package/dist/components/internal/fieldset.js +56 -0
  139. package/dist/components/internal/focus-after.d.ts +3 -0
  140. package/dist/components/internal/focus-after.js +13 -0
  141. package/dist/components/internal/google.d.ts +47 -0
  142. package/dist/components/internal/google.js +73 -0
  143. package/dist/components/internal/icons.d.ts +108 -0
  144. package/dist/components/internal/icons.js +316 -0
  145. package/dist/components/internal/menu.d.ts +16 -0
  146. package/dist/components/internal/menu.js +14 -0
  147. package/dist/components/internal/modal.d.ts +50 -0
  148. package/dist/components/internal/modal.js +85 -0
  149. package/dist/components/internal/option-content.d.ts +10 -0
  150. package/dist/components/internal/option-content.js +13 -0
  151. package/dist/components/internal/radio-context.d.ts +16 -0
  152. package/dist/components/internal/radio-context.js +6 -0
  153. package/dist/components/internal/toggle.d.ts +7 -0
  154. package/dist/components/internal/toggle.js +13 -0
  155. package/dist/components/internal/use-listbox.d.ts +56 -0
  156. package/dist/components/internal/use-listbox.js +69 -0
  157. package/dist/components/internal/whatsapp.d.ts +8 -0
  158. package/dist/components/internal/whatsapp.js +12 -0
  159. package/dist/components/item.d.ts +32 -0
  160. package/dist/components/item.js +35 -0
  161. package/dist/components/kbd.d.ts +17 -0
  162. package/dist/components/kbd.js +18 -0
  163. package/dist/components/listbox.d.ts +34 -0
  164. package/dist/components/listbox.js +114 -0
  165. package/dist/components/marker.d.ts +24 -0
  166. package/dist/components/marker.js +28 -0
  167. package/dist/components/media-tile.d.ts +17 -14
  168. package/dist/components/media-tile.js +19 -24
  169. package/dist/components/message-scroller.d.ts +20 -0
  170. package/dist/components/message-scroller.js +108 -0
  171. package/dist/components/message.d.ts +33 -0
  172. package/dist/components/message.js +23 -0
  173. package/dist/components/navigation-menu.d.ts +42 -0
  174. package/dist/components/navigation-menu.js +30 -0
  175. package/dist/components/newsletter.d.ts +27 -0
  176. package/dist/components/newsletter.js +75 -0
  177. package/dist/components/number-input.d.ts +60 -0
  178. package/dist/components/number-input.js +234 -0
  179. package/dist/components/option-tile.d.ts +20 -19
  180. package/dist/components/option-tile.js +52 -131
  181. package/dist/components/page-header.d.ts +31 -0
  182. package/dist/components/page-header.js +25 -0
  183. package/dist/components/page-shell.d.ts +11 -1
  184. package/dist/components/page-shell.js +8 -27
  185. package/dist/components/page-skeleton.d.ts +15 -21
  186. package/dist/components/page-skeleton.js +37 -4
  187. package/dist/components/pagination.d.ts +32 -22
  188. package/dist/components/pagination.js +83 -76
  189. package/dist/components/password-input.d.ts +26 -0
  190. package/dist/components/password-input.js +112 -0
  191. package/dist/components/phone-input.d.ts +12 -8
  192. package/dist/components/phone-input.js +77 -47
  193. package/dist/components/phone.d.ts +27 -0
  194. package/dist/components/phone.js +35 -0
  195. package/dist/components/popover.d.ts +25 -36
  196. package/dist/components/popover.js +32 -129
  197. package/dist/components/pricing-card.d.ts +9 -25
  198. package/dist/components/pricing-card.js +9 -25
  199. package/dist/components/pricing.d.ts +48 -0
  200. package/dist/components/pricing.js +64 -0
  201. package/dist/components/progress.d.ts +30 -0
  202. package/dist/components/progress.js +57 -0
  203. package/dist/components/qr-display.d.ts +11 -6
  204. package/dist/components/qr-display.js +8 -19
  205. package/dist/components/questionnaire.d.ts +42 -0
  206. package/dist/components/questionnaire.js +107 -0
  207. package/dist/components/radio-group.d.ts +21 -0
  208. package/dist/components/radio-group.js +40 -0
  209. package/dist/components/radio.d.ts +15 -29
  210. package/dist/components/radio.js +46 -87
  211. package/dist/components/row-actions.d.ts +5 -0
  212. package/dist/components/row-actions.js +57 -56
  213. package/dist/components/saving-bar-context.d.ts +0 -5
  214. package/dist/components/saving-bar-context.js +16 -34
  215. package/dist/components/saving-bar.d.ts +26 -11
  216. package/dist/components/saving-bar.js +53 -65
  217. package/dist/components/section-card.d.ts +18 -4
  218. package/dist/components/section-card.js +26 -39
  219. package/dist/components/section-header.d.ts +8 -12
  220. package/dist/components/section-header.js +7 -2
  221. package/dist/components/select.d.ts +44 -16
  222. package/dist/components/select.js +85 -135
  223. package/dist/components/selectable-card.d.ts +11 -19
  224. package/dist/components/selectable-card.js +4 -21
  225. package/dist/components/separator.d.ts +20 -0
  226. package/dist/components/separator.js +19 -0
  227. package/dist/components/setting-row.d.ts +11 -15
  228. package/dist/components/setting-row.js +11 -14
  229. package/dist/components/settings-list.d.ts +10 -12
  230. package/dist/components/settings-list.js +9 -17
  231. package/dist/components/sheet.d.ts +21 -0
  232. package/dist/components/sheet.js +16 -0
  233. package/dist/components/sidebar.d.ts +79 -0
  234. package/dist/components/sidebar.js +111 -0
  235. package/dist/components/skeleton.d.ts +14 -20
  236. package/dist/components/skeleton.js +8 -36
  237. package/dist/components/slider.d.ts +21 -23
  238. package/dist/components/slider.js +65 -56
  239. package/dist/components/sparkline.d.ts +19 -0
  240. package/dist/components/sparkline.js +32 -0
  241. package/dist/components/spinner.d.ts +16 -8
  242. package/dist/components/spinner.js +35 -32
  243. package/dist/components/star-rating.d.ts +22 -0
  244. package/dist/components/star-rating.js +25 -0
  245. package/dist/components/stat.d.ts +33 -0
  246. package/dist/components/stat.js +29 -0
  247. package/dist/components/status.d.ts +27 -0
  248. package/dist/components/status.js +34 -0
  249. package/dist/components/step-progress.d.ts +13 -6
  250. package/dist/components/step-progress.js +20 -17
  251. package/dist/components/summary-bar.d.ts +20 -20
  252. package/dist/components/summary-bar.js +13 -50
  253. package/dist/components/switch.d.ts +20 -0
  254. package/dist/components/switch.js +46 -0
  255. package/dist/components/table.d.ts +56 -17
  256. package/dist/components/table.js +65 -59
  257. package/dist/components/tabs.d.ts +67 -0
  258. package/dist/components/tabs.js +56 -0
  259. package/dist/components/testimonial.d.ts +30 -0
  260. package/dist/components/testimonial.js +36 -0
  261. package/dist/components/textarea.d.ts +11 -16
  262. package/dist/components/textarea.js +55 -75
  263. package/dist/components/tile.d.ts +24 -0
  264. package/dist/components/tile.js +21 -0
  265. package/dist/components/time-picker.d.ts +40 -25
  266. package/dist/components/time-picker.js +191 -189
  267. package/dist/components/toast.d.ts +63 -0
  268. package/dist/components/toast.js +132 -0
  269. package/dist/components/toggle-card-compact.d.ts +15 -5
  270. package/dist/components/toggle-card-compact.js +22 -81
  271. package/dist/components/toggle-card.d.ts +11 -2
  272. package/dist/components/toggle-card.js +9 -70
  273. package/dist/components/toggle-group.d.ts +21 -59
  274. package/dist/components/toggle-group.js +31 -74
  275. package/dist/components/toggle.d.ts +19 -9
  276. package/dist/components/toggle.js +20 -55
  277. package/dist/components/tooltip.d.ts +25 -12
  278. package/dist/components/tooltip.js +16 -84
  279. package/dist/components/top-navigation.d.ts +33 -0
  280. package/dist/components/top-navigation.js +85 -0
  281. package/dist/components/typing-indicator.d.ts +6 -0
  282. package/dist/components/typing-indicator.js +3 -21
  283. package/dist/components/whatsapp-chat.d.ts +28 -0
  284. package/dist/components/whatsapp-chat.js +95 -0
  285. package/dist/components/whatsapp-message.d.ts +22 -0
  286. package/dist/components/whatsapp-message.js +34 -0
  287. package/dist/components/whatsapp-notification.d.ts +27 -0
  288. package/dist/components/whatsapp-notification.js +73 -0
  289. package/dist/components/whatsapp-template.d.ts +42 -0
  290. package/dist/components/whatsapp-template.js +69 -0
  291. package/dist/icons/index.d.ts +2 -0
  292. package/dist/icons/index.js +2 -0
  293. package/dist/icons/pix.d.ts +16 -0
  294. package/dist/icons/pix.js +29 -0
  295. package/dist/targets/native/components/accordion.js +31 -25
  296. package/dist/targets/native/components/alert.js +22 -16
  297. package/dist/targets/native/components/avatar.js +36 -29
  298. package/dist/targets/native/components/badge.js +4 -3
  299. package/dist/targets/native/components/button.js +11 -4
  300. package/dist/targets/native/components/card.js +2 -1
  301. package/dist/targets/native/components/checkbox.js +18 -15
  302. package/dist/targets/native/components/chips.js +19 -16
  303. package/dist/targets/native/components/choice-card.js +29 -23
  304. package/dist/targets/native/components/context-menu.js +13 -9
  305. package/dist/targets/native/components/currency-input.js +28 -25
  306. package/dist/targets/native/components/danger-zone.js +10 -4
  307. package/dist/targets/native/components/date-picker.js +86 -70
  308. package/dist/targets/native/components/divider.js +3 -2
  309. package/dist/targets/native/components/empty-state.js +6 -1
  310. package/dist/targets/native/components/fab.js +32 -26
  311. package/dist/targets/native/components/filter-chip.js +9 -8
  312. package/dist/targets/native/components/form-field.js +20 -10
  313. package/dist/targets/native/components/form-screen.js +50 -45
  314. package/dist/targets/native/components/google-icon.js +31 -25
  315. package/dist/targets/native/components/icon-button.js +6 -4
  316. package/dist/targets/native/components/icon.js +2 -1
  317. package/dist/targets/native/components/image-upload.js +59 -50
  318. package/dist/targets/native/components/index.d.ts +0 -2
  319. package/dist/targets/native/components/index.js +0 -4
  320. package/dist/targets/native/components/input.js +41 -34
  321. package/dist/targets/native/components/list-item.js +29 -23
  322. package/dist/targets/native/components/menu.js +12 -10
  323. package/dist/targets/native/components/modal.js +41 -32
  324. package/dist/targets/native/components/radio.js +19 -16
  325. package/dist/targets/native/components/search.js +41 -38
  326. package/dist/targets/native/components/select.js +71 -63
  327. package/dist/targets/native/components/sheet.js +36 -30
  328. package/dist/targets/native/components/skeleton.js +6 -5
  329. package/dist/targets/native/components/slider.js +51 -43
  330. package/dist/targets/native/components/spinner.js +2 -1
  331. package/dist/targets/native/components/stepper.js +14 -9
  332. package/dist/targets/native/components/switch.js +15 -14
  333. package/dist/targets/native/components/text.js +2 -1
  334. package/dist/targets/native/components/textarea.js +2 -1
  335. package/dist/targets/native/components/theme.js +2 -1
  336. package/dist/targets/native/components/toaster.js +24 -21
  337. package/dist/targets/native/index.d.ts +1 -1
  338. package/dist/targets/native/index.js +1 -3
  339. package/dist/targets/native/preset.cjs +0 -1
  340. package/dist/targets/native/theme.css +58 -60
  341. package/dist/targets/native/theme.d.ts +58 -60
  342. package/dist/targets/native/theme.js +58 -60
  343. package/package.json +35 -16
  344. package/styles/_primitives.generated.css +40 -0
  345. package/styles/base.css +15 -21
  346. package/styles/rds/components-styles.css +11365 -0
  347. package/styles/rds/components.css +993 -0
  348. package/styles/rds/foundation.css +74 -0
  349. package/styles/rds/theme.css +261 -0
  350. package/styles/rds.css +6 -0
  351. package/styles/themes/rojao.css +46 -53
  352. package/brand/rojao-black-on-white.png +0 -0
  353. package/brand/rojao-black.png +0 -0
  354. package/brand/rojao-white-on-black.png +0 -0
  355. package/brand/rojao-white.png +0 -0
  356. package/dist/components/blocker-card.d.ts +0 -42
  357. package/dist/components/blocker-card.js +0 -45
  358. package/dist/components/bottom-sheet.d.ts +0 -31
  359. package/dist/components/bottom-sheet.js +0 -120
  360. package/dist/components/chat-bubble.d.ts +0 -16
  361. package/dist/components/chat-bubble.js +0 -55
  362. package/dist/components/chips.d.ts +0 -22
  363. package/dist/components/chips.js +0 -94
  364. package/dist/components/copilot-hint.d.ts +0 -18
  365. package/dist/components/copilot-hint.js +0 -63
  366. package/dist/components/divider.d.ts +0 -20
  367. package/dist/components/divider.js +0 -47
  368. package/dist/components/empty-state.d.ts +0 -48
  369. package/dist/components/empty-state.js +0 -91
  370. package/dist/components/form-card-header.d.ts +0 -13
  371. package/dist/components/form-card-header.js +0 -8
  372. package/dist/components/label.d.ts +0 -16
  373. package/dist/components/label.js +0 -43
  374. package/dist/components/menu.d.ts +0 -50
  375. package/dist/components/menu.js +0 -80
  376. package/dist/components/modal.d.ts +0 -25
  377. package/dist/components/modal.js +0 -71
  378. package/dist/components/notice.d.ts +0 -50
  379. package/dist/components/notice.js +0 -103
  380. package/dist/components/page-tabs.d.ts +0 -35
  381. package/dist/components/page-tabs.js +0 -55
  382. package/dist/components/paywall-banner.d.ts +0 -37
  383. package/dist/components/paywall-banner.js +0 -42
  384. package/dist/components/paywall.d.ts +0 -44
  385. package/dist/components/paywall.js +0 -55
  386. package/dist/components/phone-frame.d.ts +0 -9
  387. package/dist/components/phone-frame.js +0 -18
  388. package/dist/components/pix-icon.d.ts +0 -8
  389. package/dist/components/pix-icon.js +0 -24
  390. package/dist/components/search.d.ts +0 -30
  391. package/dist/components/search.js +0 -81
  392. package/dist/components/themed.d.ts +0 -36
  393. package/dist/components/themed.js +0 -22
  394. package/dist/components/toaster.d.ts +0 -84
  395. package/dist/components/toaster.js +0 -284
  396. package/dist/components/use-dismiss.d.ts +0 -9
  397. package/dist/components/use-dismiss.js +0 -28
  398. package/dist/components/use-focus-trap.d.ts +0 -5
  399. package/dist/components/use-focus-trap.js +0 -54
  400. package/dist/targets/native/components/paywall-banner.d.ts +0 -11
  401. package/dist/targets/native/components/paywall-banner.js +0 -46
  402. package/dist/targets/native/components/paywall.d.ts +0 -18
  403. package/dist/targets/native/components/paywall.js +0 -61
@@ -1,136 +1,131 @@
1
1
  "use client";
2
2
  import {
3
3
  __objRest,
4
+ __spreadProps,
4
5
  __spreadValues
5
6
  } from "../chunk-ORMEWXMH.js";
6
- import { forwardRef, useId, useState } from "react";
7
- import { Eye, EyeOff, X } from "lucide-react";
8
- const SIZE = {
9
- sm: { h: "h-control-sm", text: "text-caption", pad: "px-2.5", icon: 14, padIconL: "pl-8", padIconR: "pr-8", affix: "px-2.5" },
10
- md: { h: "h-control-md", text: "text-label", pad: "px-3", icon: 16, padIconL: "pl-9", padIconR: "pr-9", affix: "px-3" },
11
- lg: { h: "h-control-lg", text: "text-body", pad: "px-4", icon: 18, padIconL: "pl-11", padIconR: "pr-11", affix: "px-4" }
12
- };
13
- const Input = forwardRef(function Input2(_a, ref) {
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { useRef, useState } from "react";
9
+ import {
10
+ clearNativeValue,
11
+ FieldAction,
12
+ FieldShell,
13
+ hasContent,
14
+ useFieldIds,
15
+ warnIfUnlabelled
16
+ } from "./internal/field.js";
17
+ import { CloseIcon } from "./internal/icons.js";
18
+ function Input(_a) {
14
19
  var _b = _a, {
15
20
  label,
16
- helper,
21
+ labelPosition,
22
+ hint,
17
23
  error,
18
- size = "md",
24
+ errorMessage,
19
25
  required,
20
- optional,
21
- iconLeft,
22
- iconRight,
26
+ leadingIcon,
23
27
  prefix,
24
28
  suffix,
29
+ trailingIcon,
25
30
  clearable,
26
31
  onClear,
27
- passwordReveal = true,
28
- showCount,
29
- className = "",
32
+ clearLabel = "Limpar",
30
33
  id,
31
- type = "text",
32
- value,
33
- defaultValue,
34
- maxLength
35
- } = _b, props = __objRest(_b, [
34
+ disabled,
35
+ className,
36
+ style,
37
+ onChange,
38
+ ref
39
+ } = _b, input = __objRest(_b, [
36
40
  "label",
37
- "helper",
41
+ "labelPosition",
42
+ "hint",
38
43
  "error",
39
- "size",
44
+ "errorMessage",
40
45
  "required",
41
- "optional",
42
- "iconLeft",
43
- "iconRight",
46
+ "leadingIcon",
44
47
  "prefix",
45
48
  "suffix",
49
+ "trailingIcon",
46
50
  "clearable",
47
51
  "onClear",
48
- "passwordReveal",
49
- "showCount",
50
- "className",
52
+ "clearLabel",
51
53
  "id",
52
- "type",
53
- "value",
54
- "defaultValue",
55
- "maxLength"
54
+ "disabled",
55
+ "className",
56
+ "style",
57
+ "onChange",
58
+ "ref"
56
59
  ]);
57
- const generatedId = useId();
58
- const inputId = id != null ? id : generatedId;
59
- const [revealed, setRevealed] = useState(false);
60
- const isPassword = type === "password";
61
- const effectiveType = isPassword && passwordReveal && revealed ? "text" : type;
62
- const hasValue = !!(value != null ? value : defaultValue);
63
- const showClear = clearable && hasValue;
64
- const showReveal = isPassword && passwordReveal;
65
- const hasRightAdornment = showClear || showReveal || iconRight;
66
- const sz = SIZE[size];
67
- const hasAffix = !!(prefix || suffix);
68
- const inputRadius = hasAffix ? prefix && suffix ? "rounded-none" : prefix ? "rounded-l-none rounded-r-(--radius-control)" : "rounded-l-(--radius-control) rounded-r-none" : "rounded-(--radius-control)";
69
- const errorClass = error ? "border-danger focus:border-danger focus:ring-2 focus:ring-danger/20" : "border-stroke-control focus:border-stroke-focus focus:ring-2 focus:ring-stroke-focus/20";
70
- const inputElement = /* @__PURE__ */ React.createElement("div", { className: "relative flex-1 inline-flex items-center" }, iconLeft && /* @__PURE__ */ React.createElement(
71
- "span",
60
+ warnIfUnlabelled("Input", label, input["aria-label"], input["aria-labelledby"]);
61
+ const { controlId, hintId, errorId, invalid, describedBy } = useFieldIds(id, hint, error, errorMessage);
62
+ const own = useRef(null);
63
+ const [typed, setTyped] = useState(() => hasContent(input.defaultValue));
64
+ const hasValue = input.value !== void 0 ? String(input.value) !== "" : typed;
65
+ const showClear = clearable && hasValue && !disabled;
66
+ const floating = labelPosition === "floating" && hasContent(label);
67
+ function change(event) {
68
+ setTyped(event.target.value !== "");
69
+ onChange == null ? void 0 : onChange(event);
70
+ }
71
+ function setRef(node) {
72
+ own.current = node;
73
+ if (typeof ref === "function") ref(node);
74
+ else if (ref) ref.current = node;
75
+ }
76
+ return /* @__PURE__ */ jsxs(
77
+ FieldShell,
72
78
  {
73
- "aria-hidden": true,
74
- className: "absolute left-0 inset-y-0 flex items-center pl-3 text-fg-muted pointer-events-none"
75
- },
76
- /* @__PURE__ */ React.createElement("span", { className: "[&_svg]:shrink-0", style: { width: sz.icon, height: sz.icon } }, iconLeft)
77
- ), /* @__PURE__ */ React.createElement(
78
- "input",
79
- __spreadValues({
80
- ref,
81
- id: inputId,
82
- type: effectiveType,
83
- value,
84
- defaultValue,
85
- maxLength,
79
+ kind: "rds-input",
80
+ controlId,
81
+ hintId,
82
+ errorId,
83
+ label,
84
+ labelPosition,
85
+ hint,
86
+ errorMessage,
87
+ invalid,
86
88
  required,
87
- className: [
88
- "w-full bg-surface-default text-fg-primary placeholder:text-fg-placeholder",
89
- "border transition-colors outline-none",
90
- inputRadius,
91
- sz.h,
92
- sz.text,
93
- sz.pad,
94
- iconLeft ? sz.padIconL : "",
95
- hasRightAdornment ? sz.padIconR : "",
96
- errorClass,
97
- "disabled:opacity-50 disabled:cursor-not-allowed",
98
- className
99
- ].filter(Boolean).join(" "),
100
- "aria-invalid": error ? true : void 0,
101
- "aria-describedby": error ? `${inputId}-error` : helper ? `${inputId}-helper` : void 0
102
- }, props)
103
- ), hasRightAdornment && /* @__PURE__ */ React.createElement("span", { className: "absolute right-0 inset-y-0 flex items-center pr-2 gap-1 pointer-events-none" }, iconRight && !showClear && !showReveal && /* @__PURE__ */ React.createElement("span", { className: "text-fg-muted" }, iconRight), showClear && /* @__PURE__ */ React.createElement(
104
- "button",
105
- {
106
- type: "button",
107
- onClick: onClear,
108
- "aria-label": "Limpar",
109
- className: "text-fg-muted hover:text-fg-primary p-0.5 rounded transition-colors pointer-events-auto"
110
- },
111
- /* @__PURE__ */ React.createElement(X, { size: sz.icon - 2 })
112
- ), showReveal && /* @__PURE__ */ React.createElement(
113
- "button",
114
- {
115
- type: "button",
116
- onClick: () => setRevealed((r) => !r),
117
- "aria-label": revealed ? "Ocultar senha" : "Mostrar senha",
118
- className: "text-fg-muted hover:text-fg-primary p-1 rounded bg-surface-default transition-colors pointer-events-auto"
119
- },
120
- revealed ? /* @__PURE__ */ React.createElement(EyeOff, { size: sz.icon }) : /* @__PURE__ */ React.createElement(Eye, { size: sz.icon })
121
- )));
122
- const wrappedInput = hasAffix ? /* @__PURE__ */ React.createElement("div", { className: "inline-flex w-full items-stretch" }, prefix && /* @__PURE__ */ React.createElement("span", { className: [
123
- "inline-flex items-center border border-r-0 border-stroke-control rounded-l-(--radius-control) bg-surface-raised text-fg-muted",
124
- sz.text,
125
- sz.affix
126
- ].join(" ") }, prefix), inputElement, suffix && /* @__PURE__ */ React.createElement("span", { className: [
127
- "inline-flex items-center border border-l-0 border-stroke-control rounded-r-(--radius-control) bg-surface-raised text-fg-muted",
128
- sz.text,
129
- sz.affix
130
- ].join(" ") }, suffix)) : inputElement;
131
- const currentLength = typeof value === "string" ? value.length : typeof defaultValue === "string" ? defaultValue.length : 0;
132
- return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-1.5 w-full" }, label && /* @__PURE__ */ React.createElement("label", { htmlFor: inputId, className: "inline-flex items-center gap-1 text-label font-medium text-fg-primary" }, /* @__PURE__ */ React.createElement("span", null, label), required && /* @__PURE__ */ React.createElement("span", { className: "text-danger", "aria-label": "obrigat\xF3rio" }, "*"), optional && !required && /* @__PURE__ */ React.createElement("span", { className: "text-fg-muted font-normal" }, "(opcional)")), wrappedInput, (error || helper || showCount && maxLength) && /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between gap-3" }, error ? /* @__PURE__ */ React.createElement("p", { id: `${inputId}-error`, className: "text-caption text-danger-text flex-1" }, error) : helper ? /* @__PURE__ */ React.createElement("p", { id: `${inputId}-helper`, className: "text-caption text-fg-muted flex-1" }, helper) : /* @__PURE__ */ React.createElement("span", { className: "flex-1" }), showCount && maxLength && /* @__PURE__ */ React.createElement("span", { className: "text-caption text-fg-muted tabular-nums shrink-0" }, currentLength, "/", maxLength)));
133
- });
89
+ disabled,
90
+ boxClassName: showClear ? "rds-field__box--action" : void 0,
91
+ className,
92
+ style,
93
+ children: [
94
+ leadingIcon && /* @__PURE__ */ jsx("span", { className: "rds-field__icon", "aria-hidden": "true", children: leadingIcon }),
95
+ prefix && /* @__PURE__ */ jsx("span", { className: "rds-field__affix", "aria-hidden": "true", children: prefix }),
96
+ /* @__PURE__ */ jsx(
97
+ "input",
98
+ __spreadProps(__spreadValues({}, input), {
99
+ ref: setRef,
100
+ id: controlId,
101
+ className: "rds-field__control",
102
+ required,
103
+ disabled,
104
+ "aria-invalid": invalid || void 0,
105
+ "aria-describedby": [describedBy, input["aria-describedby"]].filter(Boolean).join(" ") || void 0,
106
+ onChange: change,
107
+ placeholder: floating ? " " : input.placeholder
108
+ })
109
+ ),
110
+ suffix && /* @__PURE__ */ jsx("span", { className: "rds-field__affix", "aria-hidden": "true", children: suffix }),
111
+ trailingIcon && !showClear && /* @__PURE__ */ jsx("span", { className: "rds-field__icon", "aria-hidden": "true", children: trailingIcon }),
112
+ showClear && /* @__PURE__ */ jsx(
113
+ FieldAction,
114
+ {
115
+ label: clearLabel,
116
+ icon: /* @__PURE__ */ jsx(CloseIcon, {}),
117
+ onClick: () => {
118
+ var _a2;
119
+ clearNativeValue(own.current);
120
+ (_a2 = own.current) == null ? void 0 : _a2.focus();
121
+ onClear == null ? void 0 : onClear();
122
+ }
123
+ }
124
+ )
125
+ ]
126
+ }
127
+ );
128
+ }
134
129
  export {
135
130
  Input
136
131
  };
@@ -1,19 +1,35 @@
1
1
  import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, ComponentType } from 'react';
2
3
 
3
4
  type InsightCardType = 'alert' | 'opportunity' | 'tip';
4
- interface InsightCardProps {
5
+ interface InsightCardProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
6
+ /** The kind of message: it gives the colour and the tag (Atenção, Oportunidade, Dica). */
5
7
  type: InsightCardType;
6
- title: string;
7
- description: string;
8
- /** Optional numeric/text highlight, e.g. "+ R$ 450/mês" */
9
- potential?: string;
10
- /** CTA label */
8
+ /** What the system noticed, in one line (Figma: `title`). */
9
+ title: ReactNode;
10
+ /** Why it matters or what to do (Figma: `description`). */
11
+ description: ReactNode;
12
+ /** A number or short highlight beside the title (Figma: `hasPotential` + `potential`): "+ R$ 450/mês". */
13
+ potential?: ReactNode;
14
+ /** The action's text (Figma: `hasAction` + `action`). Rendered with `actionHref` (a link) or `actionOnClick`. */
11
15
  action?: string;
12
- /** CTA href — renders an <a> tag */
16
+ /** Where the action leads: renders a link (`linkAs`, or a plain <a>). */
13
17
  actionHref?: string;
14
- /** CTA onClick — renders a <button> (takes precedence over actionHref when both provided) */
18
+ /** What the action does: renders a button. Takes precedence over `actionHref`. */
15
19
  actionOnClick?: () => void;
20
+ /** The link component for `actionHref` (a framework Link). Default: a plain <a>. */
21
+ linkAs?: ComponentType<{
22
+ href: string;
23
+ className?: string;
24
+ children: ReactNode;
25
+ }>;
26
+ /** The heading level that fits the page's heading order. */
27
+ titleAs?: 'h2' | 'h3' | 'h4';
16
28
  }
17
- declare function InsightCard({ type, title, description, potential, action, actionHref, actionOnClick, }: InsightCardProps): react.JSX.Element;
29
+ /**
30
+ * InsightCard — Figma [RDS] Content/InsightCard. A note from the system about the business: an alert, an
31
+ * opportunity or a tip, with what to do. Styles: insight-card.css.
32
+ */
33
+ declare function InsightCard({ type, title, description, potential, action, actionHref, actionOnClick, linkAs: LinkAs, titleAs: Title, className, ...rest }: InsightCardProps): react.JSX.Element;
18
34
 
19
35
  export { InsightCard, type InsightCardProps, type InsightCardType };
@@ -1,26 +1,52 @@
1
- import "../chunk-ORMEWXMH.js";
2
- const TYPE_VARS = {
3
- alert: { card: "[border-color:var(--insight-alert-border)] [background:var(--insight-alert-bg)]", badge: "[background:var(--insight-alert-badge-bg)] [color:var(--insight-alert-badge-text)]" },
4
- opportunity: { card: "[border-color:var(--insight-opportunity-border)] [background:var(--insight-opportunity-bg)]", badge: "[background:var(--insight-opportunity-badge-bg)] [color:var(--insight-opportunity-badge-text)]" },
5
- tip: { card: "[border-color:var(--insight-tip-border)] [background:var(--insight-tip-bg)]", badge: "[background:var(--insight-tip-badge-bg)] [color:var(--insight-tip-badge-text)]" }
6
- };
7
- const TYPE_LABELS = {
1
+ import {
2
+ __objRest,
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ const LABELS = {
8
8
  alert: "Aten\xE7\xE3o",
9
9
  opportunity: "Oportunidade",
10
10
  tip: "Dica"
11
11
  };
12
- function InsightCard({
13
- type,
14
- title,
15
- description,
16
- potential,
17
- action,
18
- actionHref,
19
- actionOnClick
20
- }) {
21
- const v = TYPE_VARS[type];
22
- const ctaClass = "shrink-0 rounded-(--radius-card) px-3 py-1.5 text-caption font-medium whitespace-nowrap shadow-sm transition-colors [background:var(--insight-action-bg)] [border:1px_solid_var(--insight-action-border)] [color:var(--insight-action-text)] hover:[background:var(--insight-action-bg-hover)]";
23
- return /* @__PURE__ */ React.createElement("div", { className: ["rounded-(--radius-card) border p-4", v.card].join(" ") }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("span", { className: ["inline-block text-[10px] font-semibold uppercase tracking-wide rounded px-1.5 py-0.5", v.badge].join(" ") }, TYPE_LABELS[type]), /* @__PURE__ */ React.createElement("div", { className: "mt-1.5 flex items-baseline gap-2 flex-wrap" }, /* @__PURE__ */ React.createElement("p", { className: "font-semibold text-label leading-tight [color:var(--insight-title-color)]" }, title), potential && /* @__PURE__ */ React.createElement("span", { className: "text-caption font-medium tabular-nums [color:var(--insight-potential-color)]" }, potential)), /* @__PURE__ */ React.createElement("p", { className: "mt-0.5 text-caption [color:var(--insight-description-color)]" }, description)), action && (actionOnClick ? /* @__PURE__ */ React.createElement("button", { type: "button", onClick: actionOnClick, className: ctaClass }, action) : actionHref ? /* @__PURE__ */ React.createElement("a", { href: actionHref, className: ctaClass }, action) : null)));
12
+ function DefaultLink({ href, className, children }) {
13
+ return /* @__PURE__ */ jsx("a", { href, className, children });
14
+ }
15
+ function InsightCard(_a) {
16
+ var _b = _a, {
17
+ type,
18
+ title,
19
+ description,
20
+ potential,
21
+ action,
22
+ actionHref,
23
+ actionOnClick,
24
+ linkAs: LinkAs = DefaultLink,
25
+ titleAs: Title = "h3",
26
+ className
27
+ } = _b, rest = __objRest(_b, [
28
+ "type",
29
+ "title",
30
+ "description",
31
+ "potential",
32
+ "action",
33
+ "actionHref",
34
+ "actionOnClick",
35
+ "linkAs",
36
+ "titleAs",
37
+ "className"
38
+ ]);
39
+ return /* @__PURE__ */ jsxs("article", __spreadProps(__spreadValues({}, rest), { className: ["rds-insight-card", `rds-insight-card--${type}`, className].filter(Boolean).join(" "), children: [
40
+ /* @__PURE__ */ jsxs("div", { className: "rds-insight-card__body", children: [
41
+ /* @__PURE__ */ jsx("span", { className: "rds-insight-card__badge", children: LABELS[type] }),
42
+ /* @__PURE__ */ jsxs("div", { className: "rds-insight-card__head", children: [
43
+ /* @__PURE__ */ jsx(Title, { className: "rds-insight-card__title", children: title }),
44
+ potential && /* @__PURE__ */ jsx("span", { className: "rds-insight-card__potential", children: potential })
45
+ ] }),
46
+ /* @__PURE__ */ jsx("p", { className: "rds-insight-card__description", children: description })
47
+ ] }),
48
+ action && (actionOnClick ? /* @__PURE__ */ jsx("button", { type: "button", className: "rds-insight-card__action", onClick: actionOnClick, children: action }) : actionHref ? /* @__PURE__ */ jsx(LinkAs, { href: actionHref, className: "rds-insight-card__action", children: action }) : null)
49
+ ] }));
24
50
  }
25
51
  export {
26
52
  InsightCard
@@ -0,0 +1,3 @@
1
+ declare function announce(message: string): void;
2
+
3
+ export { announce };
@@ -0,0 +1,20 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ let region = null;
3
+ function announce(message) {
4
+ if (typeof document === "undefined") return;
5
+ if (!region || !region.isConnected) {
6
+ region = document.createElement("div");
7
+ region.setAttribute("role", "status");
8
+ region.className = "rds-visually-hidden";
9
+ region.dataset.rdsAnnouncer = "";
10
+ document.body.append(region);
11
+ }
12
+ region.textContent = "";
13
+ const target = region;
14
+ setTimeout(() => {
15
+ target.textContent = message;
16
+ }, 50);
17
+ }
18
+ export {
19
+ announce
20
+ };
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface BlockHeadingProps {
5
+ /** A short label above the title (Figma: `eyebrow`). */
6
+ eyebrow?: ReactNode;
7
+ title: ReactNode;
8
+ description?: ReactNode;
9
+ /** The title's id: it names the block's <section>. */
10
+ titleId: string;
11
+ }
12
+ declare function BlockHeading({ eyebrow, title, description, titleId }: BlockHeadingProps): react.JSX.Element;
13
+ declare const cx: (...names: (string | false | undefined)[]) => string;
14
+
15
+ export { BlockHeading, type BlockHeadingProps, cx };
@@ -0,0 +1,14 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ function BlockHeading({ eyebrow, title, description, titleId }) {
4
+ return /* @__PURE__ */ jsxs("div", { className: "rds-block__heading", children: [
5
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "rds-block__eyebrow", children: eyebrow }),
6
+ /* @__PURE__ */ jsx("h2", { id: titleId, className: "rds-block__title", children: title }),
7
+ description && /* @__PURE__ */ jsx("p", { className: "rds-block__description", children: description })
8
+ ] });
9
+ }
10
+ const cx = (...names) => names.filter(Boolean).join(" ");
11
+ export {
12
+ BlockHeading,
13
+ cx
14
+ };
@@ -0,0 +1,23 @@
1
+ import * as react from 'react';
2
+ import { MouseEventHandler, MouseEvent } from 'react';
3
+
4
+ type ButtonTone = 'action' | 'neutral' | 'danger' | 'inverse';
5
+ /** Figma calls this property `style`; here it is `variant` because `style` belongs to React. */
6
+ type ButtonVariant = 'fill' | 'outline' | 'ghost';
7
+ /**
8
+ * The height: sm 36, md 44 (the default), lg 52. The touch target is 44 in every size: on sm, an invisible layer
9
+ * extends it to 44 under a coarse pointer (button.css).
10
+ */
11
+ type ButtonSize = 'sm' | 'md' | 'lg';
12
+ declare function buttonClassName(tone: ButtonTone, variant: ButtonVariant, size: ButtonSize, extra?: string): string;
13
+ /**
14
+ * With aria-disabled the element still fires click (implicit form submit on a button, navigation
15
+ * on a link rendered with asChild); cancel it here.
16
+ */
17
+ declare function blockWhenDisabled<T extends HTMLElement>(disabled: boolean | undefined, onClick?: MouseEventHandler<T>): (event: MouseEvent<T>) => void;
18
+ /** Says `label` through the page's live region when loading starts. */
19
+ declare function useLoadingAnnouncement(loading: boolean | undefined, label: string): void;
20
+ /** The loader: a turning arc, drawn inline so the button needs no icon library. */
21
+ declare function Loader(): react.JSX.Element;
22
+
23
+ export { type ButtonSize, type ButtonTone, type ButtonVariant, Loader, blockWhenDisabled, buttonClassName, useLoadingAnnouncement };
@@ -0,0 +1,30 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect } from "react";
4
+ import { announce } from "./announce.js";
5
+ function buttonClassName(tone, variant, size, extra) {
6
+ return ["rds-button", `rds-button--${tone}`, `rds-button--${variant}`, `rds-button--${size}`, extra].filter(Boolean).join(" ");
7
+ }
8
+ function blockWhenDisabled(disabled, onClick) {
9
+ return (event) => {
10
+ if (disabled) {
11
+ event.preventDefault();
12
+ return;
13
+ }
14
+ onClick == null ? void 0 : onClick(event);
15
+ };
16
+ }
17
+ function useLoadingAnnouncement(loading, label) {
18
+ useEffect(() => {
19
+ if (loading) announce(label);
20
+ }, [loading, label]);
21
+ }
22
+ function Loader() {
23
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) });
24
+ }
25
+ export {
26
+ Loader,
27
+ blockWhenDisabled,
28
+ buttonClassName,
29
+ useLoadingAnnouncement
30
+ };
@@ -0,0 +1,52 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, ReactNode } from 'react';
3
+
4
+ /** row: the line with the radio; tile: a grid cell, icon on top; preview: an image on top. */
5
+ type ChoiceCardLayout = 'row' | 'tile' | 'preview';
6
+ interface ChoiceCardProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'checked' | 'onSelect'> {
7
+ /** The option (Figma: `label`). It is the radio's accessible name. */
8
+ children: ReactNode;
9
+ /** What choosing it means (Figma: `hasDescription` + `description`). */
10
+ description?: ReactNode;
11
+ /** An inline SVG in a 36 square (Figma: `hasIcon` + `icon`). Decorative. Not drawn in `preview`. */
12
+ icon?: ReactNode;
13
+ /** Chosen (Figma: `selected`). Inside a ChoiceCardGroup the group decides; alone, pass it with `onSelect`. */
14
+ selected?: boolean;
15
+ /** Called when the person chooses this card (click, Space, or an arrow key from a sibling with the same name). */
16
+ onSelect?: () => void;
17
+ /** The value inside a ChoiceCardGroup. */
18
+ value?: string;
19
+ /**
20
+ * Figma: `layout`. row (the default): the line with the radio. tile: a grid cell, the icon on top and a check in
21
+ * the corner when chosen. preview: an image on top with the check in its corner. Inside a ChoiceCardGroup the
22
+ * group's layout is the default.
23
+ */
24
+ layout?: ChoiceCardLayout;
25
+ /** The picture on top in `preview` (a mockup, a swatch, an <img>). Decorative; without it, a placeholder icon. */
26
+ preview?: ReactNode;
27
+ }
28
+ declare function ChoiceCardControl({ control, children, description, icon, selected, onSelect, value, disabled, className, onChange, name, layout, preview, ...rest }: ChoiceCardProps & {
29
+ control: 'radio' | 'checkbox';
30
+ }): react.JSX.Element;
31
+ interface ChoiceCardGroupProps {
32
+ /** What is being chosen. Required: it names the group (a visible <legend>). */
33
+ legend: ReactNode;
34
+ /** The ChoiceCards, each with a `value`. */
35
+ children: ReactNode;
36
+ value?: string;
37
+ defaultValue?: string;
38
+ onValueChange?: (value: string) => void;
39
+ /** The form field name. By default a generated one. */
40
+ name?: string;
41
+ disabled?: boolean;
42
+ /**
43
+ * The cards' layout. row stacks them; tile and preview lay them in a grid (cells of at least 160 and 240) and are
44
+ * every card's default.
45
+ */
46
+ layout?: ChoiceCardLayout;
47
+ className?: string;
48
+ }
49
+ /** A set of ChoiceCards where one is chosen at a time: a <fieldset> of native radios with a legend. */
50
+ declare function ChoiceCardGroup({ legend, children, value, defaultValue, onValueChange, name, disabled, layout, className }: ChoiceCardGroupProps): react.JSX.Element;
51
+
52
+ export { ChoiceCardControl, ChoiceCardGroup, type ChoiceCardGroupProps, type ChoiceCardLayout, type ChoiceCardProps };
@@ -0,0 +1,117 @@
1
+ "use client";
2
+ import {
3
+ __objRest,
4
+ __spreadProps,
5
+ __spreadValues
6
+ } from "../../chunk-ORMEWXMH.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { createContext, useContext, useId, useState } from "react";
9
+ import { CheckIcon, ImageIcon } from "./icons.js";
10
+ const Group = createContext(null);
11
+ function ChoiceCardControl(_a) {
12
+ var _b = _a, {
13
+ control,
14
+ children,
15
+ description,
16
+ icon,
17
+ selected,
18
+ onSelect,
19
+ value,
20
+ disabled,
21
+ className,
22
+ onChange,
23
+ name,
24
+ layout,
25
+ preview
26
+ } = _b, rest = __objRest(_b, [
27
+ "control",
28
+ "children",
29
+ "description",
30
+ "icon",
31
+ "selected",
32
+ "onSelect",
33
+ "value",
34
+ "disabled",
35
+ "className",
36
+ "onChange",
37
+ "name",
38
+ "layout",
39
+ "preview"
40
+ ]);
41
+ var _a2, _b2;
42
+ const group = useContext(Group);
43
+ const descriptionId = useId();
44
+ const checked = group && value !== void 0 && control === "radio" ? group.value === value : !!selected;
45
+ const isDisabled = disabled || (group == null ? void 0 : group.disabled);
46
+ const kind = (_a2 = layout != null ? layout : group == null ? void 0 : group.layout) != null ? _a2 : "row";
47
+ const check = checked && /* @__PURE__ */ jsx("span", { className: "rds-choice-card__check", "aria-hidden": "true", children: /* @__PURE__ */ jsx(CheckIcon, {}) });
48
+ return /* @__PURE__ */ jsxs(
49
+ "label",
50
+ {
51
+ className: [
52
+ "rds-choice-card",
53
+ `rds-choice-card--${kind}`,
54
+ checked && "rds-choice-card--selected",
55
+ isDisabled && "rds-choice-card--disabled",
56
+ className
57
+ ].filter(Boolean).join(" "),
58
+ children: [
59
+ /* @__PURE__ */ jsx(
60
+ "input",
61
+ __spreadProps(__spreadValues({}, rest), {
62
+ type: control,
63
+ className: "rds-choice-card__input",
64
+ name: (_b2 = group == null ? void 0 : group.name) != null ? _b2 : name,
65
+ value,
66
+ checked,
67
+ disabled: isDisabled,
68
+ "aria-describedby": description ? descriptionId : void 0,
69
+ onChange: (event) => {
70
+ onChange == null ? void 0 : onChange(event);
71
+ if (group && value !== void 0) group.select(value);
72
+ onSelect == null ? void 0 : onSelect();
73
+ }
74
+ })
75
+ ),
76
+ kind === "preview" ? /* @__PURE__ */ jsxs("span", { className: "rds-choice-card__preview", "aria-hidden": "true", children: [
77
+ preview != null ? preview : /* @__PURE__ */ jsx("span", { className: "rds-choice-card__placeholder", children: /* @__PURE__ */ jsx(ImageIcon, {}) }),
78
+ check
79
+ ] }) : icon && /* @__PURE__ */ jsx("span", { className: "rds-choice-card__icon", "aria-hidden": "true", children: icon }),
80
+ /* @__PURE__ */ jsxs("span", { className: "rds-choice-card__text", children: [
81
+ /* @__PURE__ */ jsx("span", { className: "rds-choice-card__label", children }),
82
+ description && /* @__PURE__ */ jsx("span", { id: descriptionId, className: "rds-choice-card__description", children: description })
83
+ ] }),
84
+ kind === "row" && /* @__PURE__ */ jsx("span", { className: "rds-choice-card__radio", "aria-hidden": "true" }),
85
+ kind === "tile" && check
86
+ ]
87
+ }
88
+ );
89
+ }
90
+ function ChoiceCardGroup({ legend, children, value, defaultValue, onValueChange, name, disabled, layout = "row", className }) {
91
+ const generated = useId();
92
+ const [own, setOwn] = useState(defaultValue);
93
+ const current = value != null ? value : own;
94
+ return /* @__PURE__ */ jsx(
95
+ Group.Provider,
96
+ {
97
+ value: {
98
+ name: name != null ? name : generated,
99
+ value: current,
100
+ disabled,
101
+ layout,
102
+ select: (next) => {
103
+ setOwn(next);
104
+ onValueChange == null ? void 0 : onValueChange(next);
105
+ }
106
+ },
107
+ children: /* @__PURE__ */ jsxs("fieldset", { className: ["rds-choice-card-group", `rds-choice-card-group--${layout}`, className].filter(Boolean).join(" "), children: [
108
+ /* @__PURE__ */ jsx("legend", { className: "rds-choice-card-group__legend", children: legend }),
109
+ children
110
+ ] })
111
+ }
112
+ );
113
+ }
114
+ export {
115
+ ChoiceCardControl,
116
+ ChoiceCardGroup
117
+ };