@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,40 +1,39 @@
1
1
  import * as react from 'react';
2
- import { ReactNode } from 'react';
2
+ import { CSSProperties } from 'react';
3
+ import { IsoDate } from './internal/dates.js';
4
+ import { FieldTextProps } from './internal/field.js';
3
5
 
4
- /**
5
- * DatePicker — input de data com calendar popover.
6
- *
7
- * Uso:
8
- * <DatePicker value={date} onChange={setDate} />
9
- * <DatePicker value={date} onChange={setDate} min={new Date()} />
10
- * <DatePicker value={date} onChange={setDate} placeholder="Selecione" />
11
- *
12
- * Sem dependências externas — calendar próprio (mês/ano nav, semana ISO).
13
- * Locale pt-BR por default (segunda como primeiro dia).
14
- *
15
- * Limitações conscientes (MVP):
16
- * - Single date só (sem range)
17
- */
18
- interface DatePickerProps {
19
- /** Label renderada acima do controle (mesmo padrão do Input do DS). */
20
- label?: ReactNode;
21
- value: Date | null;
22
- onChange: (date: Date | null) => void;
23
- min?: Date;
24
- max?: Date;
25
- placeholder?: string;
26
- size?: 'sm' | 'md';
27
- width?: 'full' | 'hug';
28
- /** locale pra formato. default = 'pt-BR'. */
29
- locale?: string;
30
- /** Primeiro dia da semana. default = 1 (segunda). */
31
- weekStartsOn?: 0 | 1;
6
+ interface DatePickerProps extends FieldTextProps {
7
+ /** Controlled: the date, ISO (2026-09-30), or '' for none (Figma: the Input's `text`). */
8
+ value?: IsoDate;
9
+ /** Uncontrolled: the date at first. */
10
+ defaultValue?: IsoDate;
11
+ /** Called with the ISO date when a valid date is typed or chosen, and with '' when the field is emptied. */
12
+ onValueChange?: (value: IsoDate) => void;
13
+ /** Days that can't be chosen in the calendar. */
14
+ isDateDisabled?: (date: Date) => boolean;
15
+ /** The message when the typed date does not exist (31/02). */
16
+ invalidMessage?: string;
17
+ /** The calendar button's accessible name, also the popover's. */
18
+ pickLabel?: string;
19
+ /** The form field name: a hidden input carries the ISO date. */
20
+ name?: string;
32
21
  disabled?: boolean;
33
- /** Texto label dos dias da semana (S T Q ...). default = pt-BR. */
34
- weekdayLabels?: string[];
22
+ id?: string;
35
23
  className?: string;
24
+ style?: CSSProperties;
25
+ /** The name when there is no visible label. */
36
26
  'aria-label'?: string;
27
+ 'aria-labelledby'?: string;
28
+ /** Today, for tests and screenshots. */
29
+ today?: IsoDate;
37
30
  }
38
- declare const DatePicker: react.ForwardRefExoticComponent<DatePickerProps & react.RefAttributes<HTMLButtonElement>>;
31
+ /**
32
+ * DatePicker — Figma [RDS] Forms/DatePicker. A date field that takes typing (dd/mm/aaaa, the slashes come by
33
+ * themselves) and, from the calendar button, opens the Calendar in a popover (Figma: `menu`). Choosing a day
34
+ * closes it and gives the focus back to the field; Escape closes without choosing. For a date near today, where
35
+ * seeing the month helps: a birth date is an Input. Styles: date-picker.css, internal/field.css, calendar.css.
36
+ */
37
+ declare function DatePicker({ label, labelPosition, hint, error, errorMessage, required, value, defaultValue, onValueChange, isDateDisabled, invalidMessage, pickLabel, name, disabled, id, className, style, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, today, }: DatePickerProps): react.JSX.Element;
39
38
 
40
39
  export { DatePicker, type DatePickerProps };
@@ -1,252 +1,136 @@
1
1
  "use client";
2
2
  import "../chunk-ORMEWXMH.js";
3
- import { forwardRef, useState, useRef, useEffect, useId, useImperativeHandle } from "react";
4
- import { Calendar, ChevronLeft, ChevronRight, X } from "lucide-react";
5
- import { Popover } from "./popover.js";
6
- const PT_WEEKDAYS_MON_FIRST = ["S", "T", "Q", "Q", "S", "S", "D"];
7
- const PT_MONTHS = [
8
- "Janeiro",
9
- "Fevereiro",
10
- "Mar\xE7o",
11
- "Abril",
12
- "Maio",
13
- "Junho",
14
- "Julho",
15
- "Agosto",
16
- "Setembro",
17
- "Outubro",
18
- "Novembro",
19
- "Dezembro"
20
- ];
21
- const SIZE_CLASS = {
22
- sm: "h-8 text-caption px-2.5",
23
- md: "h-10 text-label px-3"
24
- };
25
- function startOfDay(d) {
26
- const x = new Date(d);
27
- x.setHours(0, 0, 0, 0);
28
- return x;
29
- }
30
- function isSameDay(a, b) {
31
- return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
32
- }
33
- function addDays(d, n) {
34
- const r = new Date(d);
35
- r.setDate(r.getDate() + n);
36
- return r;
37
- }
38
- function buildMonthGrid(year, month, weekStartsOn) {
39
- const first = new Date(year, month, 1);
40
- const firstWeekday = first.getDay();
41
- const offset = (firstWeekday - weekStartsOn + 7) % 7;
42
- const start = new Date(year, month, 1 - offset);
43
- const days = [];
44
- for (let i = 0; i < 42; i++) {
45
- days.push(new Date(start.getFullYear(), start.getMonth(), start.getDate() + i));
46
- }
47
- return days;
48
- }
49
- const DatePicker = forwardRef(function DatePicker2({
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useRef, useState } from "react";
5
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
6
+ import { Calendar } from "./calendar.js";
7
+ import { formatBr, maskBr, parseBr } from "./internal/dates.js";
8
+ import { FieldAction, FieldShell, useFieldIds, warnIfUnlabelled } from "./internal/field.js";
9
+ import { CalendarIcon } from "./internal/icons.js";
10
+ function DatePicker({
50
11
  label,
12
+ labelPosition,
13
+ hint,
14
+ error,
15
+ errorMessage,
16
+ required,
51
17
  value,
52
- onChange,
53
- min,
54
- max,
55
- placeholder = "Selecione\u2026",
56
- size = "md",
57
- width = "full",
58
- locale = "pt-BR",
59
- weekStartsOn = 1,
60
- disabled = false,
61
- weekdayLabels,
62
- className = "",
63
- "aria-label": ariaLabel
64
- }, ref) {
65
- const triggerId = useId();
18
+ defaultValue = "",
19
+ onValueChange,
20
+ isDateDisabled,
21
+ invalidMessage = "Essa data n\xE3o existe. Use dd/mm/aaaa.",
22
+ pickLabel = "Escolher data",
23
+ name,
24
+ disabled,
25
+ id,
26
+ className,
27
+ style,
28
+ "aria-label": ariaLabel,
29
+ "aria-labelledby": ariaLabelledBy,
30
+ today
31
+ }) {
32
+ warnIfUnlabelled("DatePicker", label, ariaLabel, ariaLabelledBy);
33
+ const [own, setOwn] = useState(defaultValue);
34
+ const iso = value != null ? value : own;
35
+ const [text, setText] = useState(() => formatBr(iso));
36
+ const [editing, setEditing] = useState(false);
66
37
  const [open, setOpen] = useState(false);
67
- const [view, setView] = useState(() => {
68
- const r = value != null ? value : /* @__PURE__ */ new Date();
69
- return { year: r.getFullYear(), month: r.getMonth() };
70
- });
71
- const [focusedDate, setFocusedDate] = useState(null);
72
- const triggerRef = useRef(null);
73
- const activeDayRef = useRef(null);
74
- useImperativeHandle(ref, () => triggerRef.current);
75
- useEffect(() => {
76
- if (open && value) {
77
- setView({ year: value.getFullYear(), month: value.getMonth() });
78
- }
79
- }, [open, value]);
80
- useEffect(() => {
81
- if (!open) setFocusedDate(null);
82
- }, [open]);
83
- useEffect(() => {
84
- var _a;
85
- if (focusedDate) (_a = activeDayRef.current) == null ? void 0 : _a.focus();
86
- }, [focusedDate]);
87
- function isDisabled(date) {
88
- if (min && startOfDay(date) < startOfDay(min)) return true;
89
- if (max && startOfDay(date) > startOfDay(max)) return true;
90
- return false;
91
- }
92
- function handleSelect(date) {
93
- if (isDisabled(date)) return;
94
- onChange(date);
95
- setOpen(false);
96
- }
97
- function handleClear(e) {
98
- var _a;
99
- e.stopPropagation();
100
- onChange(null);
101
- (_a = triggerRef.current) == null ? void 0 : _a.focus();
102
- }
103
- function handleGridKeyDown(e) {
104
- var _a;
105
- const base = (_a = focusedDate != null ? focusedDate : value) != null ? _a : new Date(view.year, view.month, 1);
106
- let next = null;
107
- if (e.key === "ArrowRight") {
108
- e.preventDefault();
109
- next = addDays(base, 1);
110
- } else if (e.key === "ArrowLeft") {
111
- e.preventDefault();
112
- next = addDays(base, -1);
113
- } else if (e.key === "ArrowDown") {
114
- e.preventDefault();
115
- next = addDays(base, 7);
116
- } else if (e.key === "ArrowUp") {
117
- e.preventDefault();
118
- next = addDays(base, -7);
119
- } else if (e.key === "Enter" && focusedDate && !isDisabled(focusedDate)) {
120
- e.preventDefault();
121
- handleSelect(focusedDate);
122
- return;
123
- }
124
- if (next) {
125
- setFocusedDate(next);
126
- if (next.getMonth() !== view.month || next.getFullYear() !== view.year) {
127
- setView({ year: next.getFullYear(), month: next.getMonth() });
128
- }
129
- }
130
- }
131
- function nav(delta) {
132
- setView(({ year, month }) => {
133
- const m = month + delta;
134
- if (m < 0) return { year: year - 1, month: 11 };
135
- if (m > 11) return { year: year + 1, month: 0 };
136
- return { year, month: m };
137
- });
138
- }
139
- const tabFocusDate = focusedDate != null ? focusedDate : value;
140
- const days = buildMonthGrid(view.year, view.month, weekStartsOn);
141
- const weekdays = weekdayLabels != null ? weekdayLabels : weekStartsOn === 1 ? PT_WEEKDAYS_MON_FIRST : ["D", ...PT_WEEKDAYS_MON_FIRST.slice(0, 6)];
142
- const today = startOfDay(/* @__PURE__ */ new Date());
143
- const formatted = value ? value.toLocaleDateString(locale, { day: "2-digit", month: "2-digit", year: "numeric" }) : "";
144
- const calendar = /* @__PURE__ */ React.createElement(
145
- "div",
38
+ const input = useRef(null);
39
+ const shown = editing ? text : formatBr(iso);
40
+ const nonexistent = shown.length === 10 && !parseBr(shown);
41
+ const message = nonexistent ? invalidMessage : errorMessage;
42
+ const { controlId, hintId, errorId, invalid, describedBy } = useFieldIds(id, hint, error || nonexistent, message);
43
+ const floating = labelPosition === "floating" && Boolean(label);
44
+ const commit = (next) => {
45
+ if (value === void 0) setOwn(next);
46
+ onValueChange == null ? void 0 : onValueChange(next);
47
+ };
48
+ return /* @__PURE__ */ jsxs(
49
+ FieldShell,
146
50
  {
147
- role: "dialog",
148
- "aria-label": "Calend\xE1rio",
149
- className: "rounded-(--radius-control) border border-stroke-control bg-surface-default shadow-lg p-3 w-[280px]"
150
- },
151
- /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between mb-3" }, /* @__PURE__ */ React.createElement(
152
- "button",
153
- {
154
- type: "button",
155
- onClick: () => nav(-1),
156
- "aria-label": "M\xEAs anterior",
157
- className: "p-1 rounded hover:bg-surface-raised text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus"
158
- },
159
- /* @__PURE__ */ React.createElement(ChevronLeft, { size: 16 })
160
- ), /* @__PURE__ */ React.createElement("span", { className: "text-label font-semibold text-fg-primary" }, PT_MONTHS[view.month], " ", view.year), /* @__PURE__ */ React.createElement(
161
- "button",
162
- {
163
- type: "button",
164
- onClick: () => nav(1),
165
- "aria-label": "Pr\xF3ximo m\xEAs",
166
- className: "p-1 rounded hover:bg-surface-raised text-fg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus"
167
- },
168
- /* @__PURE__ */ React.createElement(ChevronRight, { size: 16 })
169
- )),
170
- /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-7 gap-1 mb-1" }, weekdays.map((w, i) => /* @__PURE__ */ React.createElement("div", { key: i, className: "text-center text-[10px] font-semibold text-fg-muted uppercase" }, w))),
171
- /* @__PURE__ */ React.createElement("div", { role: "grid", className: "grid grid-cols-7 gap-1", onKeyDown: handleGridKeyDown }, days.map((d, i) => {
172
- const inMonth = d.getMonth() === view.month;
173
- const isToday = isSameDay(d, today);
174
- const isSelected = !!value && isSameDay(d, value);
175
- const isFocused = !!tabFocusDate && isSameDay(d, tabFocusDate);
176
- const dis = isDisabled(d);
177
- return /* @__PURE__ */ React.createElement(
178
- "button",
179
- {
180
- key: i,
181
- ref: isFocused ? activeDayRef : void 0,
182
- type: "button",
183
- role: "gridcell",
184
- onClick: () => handleSelect(d),
185
- disabled: dis,
186
- "aria-selected": isSelected,
187
- "aria-label": d.toLocaleDateString(locale, { weekday: "long", day: "numeric", month: "long", year: "numeric" }),
188
- tabIndex: isFocused ? 0 : -1,
189
- className: [
190
- "h-8 rounded text-caption font-medium transition-colors",
191
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus",
192
- "disabled:cursor-not-allowed disabled:opacity-30",
193
- isSelected ? "bg-brand-primary text-brand-on-primary" : isToday ? "border border-stroke-focus text-fg-primary hover:bg-surface-raised" : inMonth ? "text-fg-primary hover:bg-surface-raised" : "text-fg-disabled hover:bg-surface-raised"
194
- ].join(" ")
195
- },
196
- d.getDate()
197
- );
198
- }))
51
+ kind: "rds-date-picker",
52
+ controlId,
53
+ hintId,
54
+ errorId,
55
+ label,
56
+ labelPosition,
57
+ hint,
58
+ errorMessage: message,
59
+ invalid,
60
+ required,
61
+ disabled,
62
+ boxClassName: "rds-field__box--action",
63
+ className,
64
+ style,
65
+ children: [
66
+ /* @__PURE__ */ jsx(
67
+ "input",
68
+ {
69
+ ref: input,
70
+ id: controlId,
71
+ className: "rds-field__control",
72
+ inputMode: "numeric",
73
+ autoComplete: "off",
74
+ placeholder: floating ? " " : "dd/mm/aaaa",
75
+ maxLength: 10,
76
+ required,
77
+ disabled,
78
+ "aria-label": ariaLabel,
79
+ "aria-labelledby": ariaLabelledBy,
80
+ "aria-invalid": invalid || void 0,
81
+ "aria-describedby": describedBy,
82
+ value: shown,
83
+ onChange: (event) => {
84
+ const masked = maskBr(event.target.value);
85
+ setText(masked);
86
+ setEditing(true);
87
+ if (masked === "") commit("");
88
+ const parsed = parseBr(masked);
89
+ if (parsed) commit(parsed);
90
+ },
91
+ onBlur: () => {
92
+ if (parseBr(text) || text === "") setEditing(false);
93
+ }
94
+ }
95
+ ),
96
+ name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: iso }),
97
+ /* @__PURE__ */ jsxs(PopoverPrimitive.Root, { open, onOpenChange: setOpen, children: [
98
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx(FieldAction, { label: pickLabel, icon: /* @__PURE__ */ jsx(CalendarIcon, {}) }) }),
99
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
100
+ PopoverPrimitive.Content,
101
+ {
102
+ "aria-label": pickLabel,
103
+ align: "end",
104
+ sideOffset: 4,
105
+ className: "rds-date-picker__popover",
106
+ onOpenAutoFocus: (event) => event.preventDefault(),
107
+ onCloseAutoFocus: (event) => {
108
+ var _a;
109
+ event.preventDefault();
110
+ (_a = input.current) == null ? void 0 : _a.focus();
111
+ },
112
+ children: /* @__PURE__ */ jsx(
113
+ Calendar,
114
+ {
115
+ value: iso || null,
116
+ today,
117
+ autoFocus: true,
118
+ isDateDisabled,
119
+ onValueChange: (next) => {
120
+ commit(next);
121
+ setText(formatBr(next));
122
+ setEditing(false);
123
+ setOpen(false);
124
+ }
125
+ }
126
+ )
127
+ }
128
+ ) })
129
+ ] })
130
+ ]
131
+ }
199
132
  );
200
- const control = /* @__PURE__ */ React.createElement("div", { className: ["relative", width === "full" ? "block w-full" : "inline-block", label ? "" : className].join(" ") }, /* @__PURE__ */ React.createElement(
201
- Popover,
202
- {
203
- trigger: /* @__PURE__ */ React.createElement(
204
- "button",
205
- {
206
- ref: triggerRef,
207
- id: triggerId,
208
- type: "button",
209
- onClick: (e) => {
210
- e.stopPropagation();
211
- if (!disabled) setOpen((o) => !o);
212
- },
213
- disabled,
214
- "aria-label": ariaLabel != null ? ariaLabel : "Selecionar data",
215
- "aria-haspopup": "dialog",
216
- "aria-expanded": open,
217
- className: [
218
- "w-full flex items-center gap-2 rounded-(--radius-control) border border-stroke-control bg-surface-default",
219
- "transition-colors focus:outline-none focus:border-stroke-focus focus:ring-2 focus:ring-stroke-focus/20",
220
- "disabled:opacity-50 disabled:cursor-not-allowed",
221
- value ? "pr-7" : "",
222
- SIZE_CLASS[size]
223
- ].join(" ")
224
- },
225
- /* @__PURE__ */ React.createElement(Calendar, { size: 16, className: "text-fg-muted shrink-0" }),
226
- /* @__PURE__ */ React.createElement("span", { className: ["flex-1 text-left truncate", value ? "text-fg-primary" : "text-fg-placeholder"].join(" ") }, formatted || placeholder)
227
- ),
228
- triggerClassName: width === "full" ? "block w-full" : "inline-block",
229
- placement: "bottom-start",
230
- offset: 4,
231
- open,
232
- onOpenChange: (v) => {
233
- if (!disabled) setOpen(v);
234
- }
235
- },
236
- () => calendar
237
- ), value && !disabled && /* @__PURE__ */ React.createElement(
238
- "button",
239
- {
240
- type: "button",
241
- onClick: handleClear,
242
- "aria-label": "Limpar data",
243
- className: "absolute right-2 top-1/2 -translate-y-1/2 text-fg-muted hover:text-fg-primary p-0.5 rounded transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus"
244
- },
245
- /* @__PURE__ */ React.createElement(X, { size: 14 })
246
- ));
247
- if (!label) return control;
248
- return /* @__PURE__ */ React.createElement("div", { className: ["flex flex-col gap-1.5", width === "full" ? "w-full" : "inline-flex", className].join(" ") }, /* @__PURE__ */ React.createElement("label", { htmlFor: triggerId, className: "text-label font-medium text-fg-primary" }, label), control);
249
- });
133
+ }
250
134
  export {
251
135
  DatePicker
252
136
  };
@@ -0,0 +1,26 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode } from 'react';
3
+
4
+ type DeltaDirection = 'up' | 'down' | 'flat';
5
+ /** Whether the change is good (success), bad (danger) or just information (neutral). Not the direction. */
6
+ type DeltaTone = 'neutral' | 'success' | 'danger';
7
+ interface DeltaProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
8
+ /** How much it changed, with the unit (Figma: `value`): "24%", "3,5 pp". */
9
+ children: ReactNode;
10
+ /** Where the number went (Figma: `direction`). */
11
+ direction?: DeltaDirection;
12
+ /** Whether that is good: going up is not always good (Figma: `tone`). */
13
+ tone?: DeltaTone;
14
+ /**
15
+ * What a screen reader hears before the value, since the arrow is hidden from it. Defaults to a word for the
16
+ * direction ("Subiu", "Caiu", "Sem mudança"); pass the full sentence when there is context, such as the period.
17
+ */
18
+ srPrefix?: string;
19
+ }
20
+ /**
21
+ * Delta — Figma [RDS] Indicators/Delta. The change of a number against the previous period: an arrow and the value.
22
+ * Styles: delta.css.
23
+ */
24
+ declare function Delta({ direction, tone, srPrefix, children, className, ...rest }: DeltaProps): react.JSX.Element;
25
+
26
+ export { Delta, type DeltaDirection, type DeltaProps, type DeltaTone };
@@ -0,0 +1,24 @@
1
+ import {
2
+ __objRest,
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { ArrowDownIcon, ArrowUpIcon, MinusIcon } from "./internal/icons.js";
8
+ const ARROWS = { up: ArrowUpIcon, down: ArrowDownIcon, flat: MinusIcon };
9
+ const SR_PREFIX = { up: "Subiu", down: "Caiu", flat: "Sem mudan\xE7a" };
10
+ function Delta(_a) {
11
+ var _b = _a, { direction = "up", tone = "neutral", srPrefix, children, className } = _b, rest = __objRest(_b, ["direction", "tone", "srPrefix", "children", "className"]);
12
+ const Arrow = ARROWS[direction];
13
+ return /* @__PURE__ */ jsxs("span", __spreadProps(__spreadValues({}, rest), { className: ["rds-delta", `rds-delta--${tone}`, className].filter(Boolean).join(" "), children: [
14
+ /* @__PURE__ */ jsx("span", { className: "rds-delta__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Arrow, {}) }),
15
+ /* @__PURE__ */ jsxs("span", { className: "rds-visually-hidden", children: [
16
+ srPrefix != null ? srPrefix : SR_PREFIX[direction],
17
+ " "
18
+ ] }),
19
+ children
20
+ ] }));
21
+ }
22
+ export {
23
+ Delta
24
+ };
@@ -0,0 +1,21 @@
1
+ import * as _radix_ui_react_dialog from '@radix-ui/react-dialog';
2
+ import * as react from 'react';
3
+ import { ModalProps } from './internal/modal.js';
4
+
5
+ type DialogSize = 'sm' | 'default' | 'lg';
6
+ interface DialogProps extends ModalProps {
7
+ /** sm 400 (a question with one field), default 560 (a short form), lg 720 (a table or a preview). */
8
+ size?: DialogSize;
9
+ }
10
+ /**
11
+ * Dialog — Figma [RDS] Overlays/Dialog. A window over the screen for a short task: create, edit (Radix Dialog).
12
+ * role="dialog", aria-modal, named by the title and described by the description; the focus opens on the first
13
+ * control of the content, stays inside (Tab cycles) and goes back to what opened it. Escape, the × and a click on
14
+ * the veil close it, and the page behind doesn't scroll. Something with no way back is the AlertDialog; a long
15
+ * form is the Sheet. Styles: internal/modal.css and dialog.css.
16
+ */
17
+ declare function Dialog({ size, ...props }: DialogProps): react.JSX.Element;
18
+ /** Wraps an element inside the Dialog that closes it when pressed, with asChild. */
19
+ declare const DialogClose: react.ForwardRefExoticComponent<_radix_ui_react_dialog.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
20
+
21
+ export { Dialog, DialogClose, type DialogProps, type DialogSize };
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import {
3
+ __objRest,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { ModalClose, ModalShell } from "./internal/modal.js";
8
+ function Dialog(_a) {
9
+ var _b = _a, { size = "default" } = _b, props = __objRest(_b, ["size"]);
10
+ return /* @__PURE__ */ jsx(ModalShell, __spreadValues({ prefix: "rds-dialog", modifiers: [`rds-dialog--${size}`] }, props));
11
+ }
12
+ const DialogClose = ModalClose;
13
+ export {
14
+ Dialog,
15
+ DialogClose
16
+ };
@@ -1,26 +1,18 @@
1
+ import * as _radix_ui_react_dialog from '@radix-ui/react-dialog';
1
2
  import * as react from 'react';
3
+ import { ModalProps } from './internal/modal.js';
2
4
 
3
- type DrawerSize = 'sm' | 'md' | 'lg' | 'xl';
4
- interface DrawerProps {
5
- open: boolean;
6
- onClose: () => void;
7
- title?: React.ReactNode;
8
- /** Subtítulo opcional abaixo do title. */
9
- subtitle?: React.ReactNode;
10
- children: React.ReactNode;
11
- footer?: React.ReactNode;
12
- side?: 'left' | 'right';
13
- /** Tamanho preset. Sobrescreve `width` se ambos passados. */
14
- size?: DrawerSize;
15
- /** Largura custom (Tailwind class, ex: "w-96"). Use só se size não atende. */
16
- width?: string;
17
- closeOnBackdrop?: boolean;
18
- hideClose?: boolean;
19
- className?: string;
20
- /** Alvo do portal. default = document.body. Passe um elemento de um subtree TEMATIZADO (ex.: a
21
- * raiz do tema da loja) pra o drawer herdar tokens/mode/fonte daquele contexto em vez do global. */
22
- container?: Element | null;
23
- }
24
- declare function Drawer({ open, onClose, title, subtitle, children, footer, side, size, width, closeOnBackdrop, hideClose, className, container, }: DrawerProps): react.ReactPortal | null;
5
+ type DrawerProps = ModalProps;
6
+ /**
7
+ * Drawer — Figma [RDS] Overlays/Drawer. The panel that comes up from the bottom, on a phone: filters, quick
8
+ * choices (Radix Dialog). role="dialog", aria-modal, named by the title; the focus stays inside and goes back to
9
+ * what opened it, and the page behind doesn't scroll. It has no ×: dragging the handle down, a tap on the veil,
10
+ * Escape or Cancel close it. The default footer is stacked, the main action first and full width.
11
+ * In 1.x this was the BottomSheet; the 1.x Drawer (from the side) is now the Sheet.
12
+ * Styles: internal/modal.css and drawer.css.
13
+ */
14
+ declare function Drawer({ open, defaultOpen, onOpenChange, ...props }: DrawerProps): react.JSX.Element;
15
+ /** Wraps an element inside the Drawer that closes it when pressed, with asChild. */
16
+ declare const DrawerClose: react.ForwardRefExoticComponent<_radix_ui_react_dialog.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
25
17
 
26
- export { Drawer, type DrawerProps, type DrawerSize };
18
+ export { Drawer, DrawerClose, type DrawerProps };