@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,82 +1,62 @@
1
1
  "use client";
2
- import "../chunk-ORMEWXMH.js";
3
- import { useEffect, useId } from "react";
4
- import { X } from "lucide-react";
5
- import { createPortal } from "react-dom";
6
- import { useFocusTrap } from "./use-focus-trap.js";
7
- const SIZE_WIDTH = {
8
- sm: "w-80",
9
- // 320px
10
- md: "w-96",
11
- // 384px
12
- lg: "w-[480px]",
13
- xl: "w-[640px]"
14
- };
15
- function Drawer({
16
- open,
17
- onClose,
18
- title,
19
- subtitle,
20
- children,
21
- footer,
22
- side = "right",
23
- size,
24
- width,
25
- closeOnBackdrop = true,
26
- hideClose = false,
27
- className = "",
28
- container
29
- }) {
30
- const widthClass = width != null ? width : SIZE_WIDTH[size != null ? size : "md"];
31
- const titleId = useId();
32
- const panelRef = useFocusTrap(open);
33
- useEffect(() => {
34
- if (!open) return;
35
- const prev = document.body.style.overflow;
36
- document.body.style.overflow = "hidden";
37
- const onKey = (e) => {
38
- if (e.key === "Escape") onClose();
39
- };
40
- document.addEventListener("keydown", onKey);
41
- return () => {
42
- document.body.style.overflow = prev;
43
- document.removeEventListener("keydown", onKey);
44
- };
45
- }, [open, onClose]);
46
- if (!open) return null;
47
- return createPortal(
48
- /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 z-50 flex" }, /* @__PURE__ */ React.createElement("div", { className: "absolute inset-0 [background:var(--overlay-scrim)]", onClick: closeOnBackdrop ? onClose : void 0, "aria-hidden": "true" }), /* @__PURE__ */ React.createElement(
49
- "div",
50
- {
51
- ref: panelRef,
52
- role: "dialog",
53
- "aria-modal": "true",
54
- "aria-labelledby": title ? titleId : void 0,
55
- tabIndex: -1,
56
- className: [
57
- "relative z-10 flex flex-col bg-surface-default shadow-xl h-full max-w-full",
58
- "focus:outline-none",
59
- widthClass,
60
- side === "right" ? "ml-auto" : "mr-auto",
61
- className
62
- ].join(" ")
2
+ import {
3
+ __objRest,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useRef, useState } from "react";
8
+ import { ModalClose, ModalShell } from "./internal/modal.js";
9
+ const DISMISS_DISTANCE = 80;
10
+ function Drawer(_a) {
11
+ var _b = _a, { open, defaultOpen, onOpenChange } = _b, props = __objRest(_b, ["open", "defaultOpen", "onOpenChange"]);
12
+ const [own, setOwn] = useState(defaultOpen != null ? defaultOpen : false);
13
+ const isOpen = open != null ? open : own;
14
+ const setOpen = (next) => {
15
+ setOwn(next);
16
+ onOpenChange == null ? void 0 : onOpenChange(next);
17
+ };
18
+ const start = useRef(null);
19
+ const [drag, setDrag] = useState(0);
20
+ const reset = () => {
21
+ start.current = null;
22
+ setDrag(0);
23
+ };
24
+ const handle = /* @__PURE__ */ jsx(
25
+ "div",
26
+ {
27
+ className: "rds-drawer__handle-area",
28
+ "aria-hidden": "true",
29
+ onPointerDown: (event) => {
30
+ var _a2, _b2;
31
+ start.current = event.clientY;
32
+ (_b2 = (_a2 = event.currentTarget).setPointerCapture) == null ? void 0 : _b2.call(_a2, event.pointerId);
33
+ },
34
+ onPointerMove: (event) => {
35
+ if (start.current !== null) setDrag(Math.max(0, event.clientY - start.current));
63
36
  },
64
- (title || !hideClose) && /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between gap-4 px-6 py-4 border-b border-stroke-default shrink-0" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, title && /* @__PURE__ */ React.createElement("h2", { id: titleId, className: "text-body font-semibold text-fg-primary" }, title), subtitle && /* @__PURE__ */ React.createElement("p", { className: "text-label text-fg-muted mt-0.5" }, subtitle)), !hideClose && /* @__PURE__ */ React.createElement(
65
- "button",
66
- {
67
- type: "button",
68
- onClick: onClose,
69
- className: "shrink-0 text-fg-muted hover:text-fg-primary transition-colors rounded focus-visible:ring-2 focus-visible:ring-stroke-focus focus-visible:outline-none p-0.5",
70
- "aria-label": "Fechar"
71
- },
72
- /* @__PURE__ */ React.createElement(X, { size: 20 })
73
- )),
74
- /* @__PURE__ */ React.createElement("div", { className: "flex-1 overflow-y-auto px-6 py-4" }, children),
75
- footer && /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-end gap-3 px-6 py-4 border-t border-stroke-default shrink-0" }, footer)
76
- )),
77
- container != null ? container : document.body
37
+ onPointerUp: (event) => {
38
+ if (start.current !== null && event.clientY - start.current > DISMISS_DISTANCE) setOpen(false);
39
+ reset();
40
+ },
41
+ onPointerCancel: reset,
42
+ children: /* @__PURE__ */ jsx("span", { className: "rds-drawer__handle" })
43
+ }
44
+ );
45
+ return /* @__PURE__ */ jsx(
46
+ ModalShell,
47
+ __spreadValues({
48
+ prefix: "rds-drawer",
49
+ closeButton: false,
50
+ stackedFooter: true,
51
+ handle,
52
+ open: isOpen,
53
+ onOpenChange: setOpen,
54
+ boxStyle: drag ? { transform: `translateY(${drag}px)`, animation: "none" } : void 0
55
+ }, props)
78
56
  );
79
57
  }
58
+ const DrawerClose = ModalClose;
80
59
  export {
81
- Drawer
60
+ Drawer,
61
+ DrawerClose
82
62
  };
@@ -0,0 +1,63 @@
1
+ import * as react from 'react';
2
+ import { ReactElement, ReactNode } from 'react';
3
+ import { MenuItemContentProps, MenuItemTone } from './internal/menu.js';
4
+
5
+ type DropdownMenuAlign = 'start' | 'center' | 'end';
6
+ type DropdownMenuSide = 'top' | 'bottom' | 'left' | 'right';
7
+ type DropdownMenuItemTone = MenuItemTone;
8
+ interface DropdownMenuProps {
9
+ /** The button that opens it, usually the "⋯" IconButton named after the item whose actions it lists. */
10
+ trigger: ReactElement;
11
+ /** The DropdownMenuItems, with a DropdownMenuSeparator between groups (Figma: the `items` slot). */
12
+ children: ReactNode;
13
+ /** Where it lines up with the button: start (its left edge), end (its right edge). */
14
+ align?: DropdownMenuAlign;
15
+ side?: DropdownMenuSide;
16
+ open?: boolean;
17
+ defaultOpen?: boolean;
18
+ onOpenChange?: (open: boolean) => void;
19
+ /** The menu's name, when the trigger's own name doesn't say it. */
20
+ 'aria-label'?: string;
21
+ className?: string;
22
+ }
23
+ /**
24
+ * DropdownMenu — Figma [RDS] Overlays/DropdownMenu. The actions of an item that don't fit on the screen (Radix
25
+ * DropdownMenu): role="menu"; the focus goes to the first item; the arrows move (disabled items are skipped),
26
+ * typing a letter jumps, Enter or Space chooses, Escape closes and gives the focus back to the button.
27
+ * Up to 7 items; the one that destroys goes last, after a separator. Styles: internal/menu.css.
28
+ */
29
+ declare function DropdownMenu({ trigger, children, align, side, open, defaultOpen, onOpenChange, className, 'aria-label': ariaLabel, }: DropdownMenuProps): react.JSX.Element;
30
+ interface DropdownMenuItemProps extends MenuItemContentProps {
31
+ /** Runs when the item is chosen (click, Enter or Space); the menu then closes. A destructive action asks first (AlertDialog). */
32
+ onSelect?: () => void;
33
+ /** danger for what destroys: last, after a separator (Figma: `tone`). */
34
+ tone?: DropdownMenuItemTone;
35
+ /** Stays in the list, can't be chosen, and the arrows skip it. */
36
+ disabled?: boolean;
37
+ /** The text typing jumps by, when the label is not plain text. */
38
+ textValue?: string;
39
+ /** Render the single child element (a link) as the item: a place to go instead of an action. */
40
+ asChild?: boolean;
41
+ }
42
+ /** One action (Figma .menu/item): role="menuitem". */
43
+ declare function DropdownMenuItem({ children, icon, shortcut, onSelect, tone, disabled, textValue, asChild }: DropdownMenuItemProps): react.JSX.Element;
44
+ interface DropdownMenuRadioGroupProps {
45
+ /** The chosen item's value. */
46
+ value: string;
47
+ onValueChange: (value: string) => void;
48
+ /** The DropdownMenuRadioItems. */
49
+ children: ReactNode;
50
+ }
51
+ /** A group of items of which one is chosen (a filter's options): role="group" of menuitemradio. */
52
+ declare function DropdownMenuRadioGroup({ value, onValueChange, children }: DropdownMenuRadioGroupProps): react.JSX.Element;
53
+ interface DropdownMenuRadioItemProps extends MenuItemContentProps {
54
+ value: string;
55
+ disabled?: boolean;
56
+ textValue?: string;
57
+ }
58
+ /** One option of a DropdownMenuRadioGroup: role="menuitemradio", aria-checked; the chosen one shows a check. */
59
+ declare function DropdownMenuRadioItem({ value, children, icon, shortcut, disabled, textValue }: DropdownMenuRadioItemProps): react.JSX.Element;
60
+ /** The line between groups of actions (Figma: the Separator in the `items` slot). */
61
+ declare function DropdownMenuSeparator(): react.JSX.Element;
62
+
63
+ export { DropdownMenu, type DropdownMenuAlign, DropdownMenuItem, type DropdownMenuItemProps, type DropdownMenuItemTone, type DropdownMenuProps, DropdownMenuRadioGroup, type DropdownMenuRadioGroupProps, DropdownMenuRadioItem, type DropdownMenuRadioItemProps, DropdownMenuSeparator, type DropdownMenuSide };
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import "../chunk-ORMEWXMH.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import * as Menu from "@radix-ui/react-dropdown-menu";
5
+ import { CheckIcon } from "./internal/icons.js";
6
+ import { MenuItemContent, menuItemClassName } from "./internal/menu.js";
7
+ function DropdownMenu({
8
+ trigger,
9
+ children,
10
+ align = "start",
11
+ side = "bottom",
12
+ open,
13
+ defaultOpen,
14
+ onOpenChange,
15
+ className,
16
+ "aria-label": ariaLabel
17
+ }) {
18
+ return (
19
+ // Not modal: the page is not hidden from screen readers (aria-hidden over the focusable trigger) nor locked; a
20
+ // click outside, Escape or Tab still close it, and the focus goes back to the trigger.
21
+ /* @__PURE__ */ jsxs(Menu.Root, { open, defaultOpen, onOpenChange, modal: false, children: [
22
+ /* @__PURE__ */ jsx(Menu.Trigger, { asChild: true, children: trigger }),
23
+ /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(
24
+ Menu.Content,
25
+ {
26
+ align,
27
+ side,
28
+ sideOffset: 4,
29
+ collisionPadding: 8,
30
+ "aria-label": ariaLabel,
31
+ className: ["rds-menu", "rds-dropdown-menu", className].filter(Boolean).join(" "),
32
+ children
33
+ }
34
+ ) })
35
+ ] })
36
+ );
37
+ }
38
+ function DropdownMenuItem({ children, icon, shortcut, onSelect, tone, disabled, textValue, asChild }) {
39
+ if (asChild) {
40
+ return /* @__PURE__ */ jsx(Menu.Item, { asChild: true, onSelect, disabled, textValue, className: menuItemClassName(tone), children });
41
+ }
42
+ return /* @__PURE__ */ jsx(Menu.Item, { onSelect, disabled, textValue, className: menuItemClassName(tone), children: /* @__PURE__ */ jsx(MenuItemContent, { icon, shortcut, children }) });
43
+ }
44
+ function DropdownMenuRadioGroup({ value, onValueChange, children }) {
45
+ return /* @__PURE__ */ jsx(Menu.RadioGroup, { value, onValueChange, children });
46
+ }
47
+ function DropdownMenuRadioItem({ value, children, icon, shortcut, disabled, textValue }) {
48
+ return /* @__PURE__ */ jsxs(Menu.RadioItem, { value, disabled, textValue, className: menuItemClassName(), children: [
49
+ /* @__PURE__ */ jsx(MenuItemContent, { icon, shortcut, children }),
50
+ /* @__PURE__ */ jsx(Menu.ItemIndicator, { className: "rds-menu__check", "aria-hidden": "true", children: /* @__PURE__ */ jsx(CheckIcon, {}) })
51
+ ] });
52
+ }
53
+ function DropdownMenuSeparator() {
54
+ return /* @__PURE__ */ jsx(Menu.Separator, { className: "rds-menu__separator" });
55
+ }
56
+ export {
57
+ DropdownMenu,
58
+ DropdownMenuItem,
59
+ DropdownMenuRadioGroup,
60
+ DropdownMenuRadioItem,
61
+ DropdownMenuSeparator
62
+ };
@@ -2,9 +2,8 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
4
  /**
5
- * Dropzone — área de arrastar-e-soltar / clicar para selecionar arquivos.
6
- * Substitui `<div className="border-2 border-dashed rounded-xl" onDrop=...>` reimplementado.
7
- * Gerencia estado de drag, input file escondido e clique. O conteúdo (ícone + texto) é livre.
5
+ * @deprecated Use `<FileInput variant="dropzone">` (Figma [RDS] Forms/FileInput), which has the label, the hint, the
6
+ * error and the chosen file's row. Kept as a thin wrapper so 1.x code keeps compiling.
8
7
  */
9
8
  interface DropzoneProps {
10
9
  onFiles: (files: FileList) => void;
@@ -12,8 +11,15 @@ interface DropzoneProps {
12
11
  multiple?: boolean;
13
12
  disabled?: boolean;
14
13
  className?: string;
14
+ /** The call inside the area (FileInput's `dropTitle`). */
15
15
  children: ReactNode;
16
+ /** The area's name for screen readers: a Dropzone has no visible label. */
17
+ 'aria-label'?: string;
16
18
  }
17
- declare function Dropzone({ onFiles, accept, multiple, disabled, className, children }: DropzoneProps): react.JSX.Element;
19
+ /**
20
+ * @deprecated Use `<FileInput variant="dropzone">`. A drop target only: it hands the files over and stays empty,
21
+ * ready for the next ones, as the 1.x Dropzone did.
22
+ */
23
+ declare function Dropzone({ onFiles, accept, multiple, disabled, className, children, 'aria-label': ariaLabel, }: DropzoneProps): react.JSX.Element;
18
24
 
19
25
  export { Dropzone, type DropzoneProps };
@@ -1,63 +1,38 @@
1
1
  "use client";
2
2
  import "../chunk-ORMEWXMH.js";
3
- import { useRef, useState } from "react";
4
- function Dropzone({ onFiles, accept, multiple = false, disabled = false, className = "", children }) {
5
- const inputRef = useRef(null);
6
- const [dragging, setDragging] = useState(false);
7
- function handleDrop(e) {
8
- var _a;
9
- e.preventDefault();
10
- setDragging(false);
11
- if (disabled) return;
12
- if ((_a = e.dataTransfer.files) == null ? void 0 : _a.length) onFiles(e.dataTransfer.files);
13
- }
14
- return /* @__PURE__ */ React.createElement(
15
- "div",
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { FileInput } from "./file-input.js";
5
+ function Dropzone({
6
+ onFiles,
7
+ accept,
8
+ multiple = false,
9
+ disabled = false,
10
+ className,
11
+ children,
12
+ "aria-label": ariaLabel = "Enviar arquivo"
13
+ }) {
14
+ return /* @__PURE__ */ jsx(
15
+ FileInput,
16
16
  {
17
- role: "button",
18
- tabIndex: disabled ? -1 : 0,
19
- onClick: () => {
20
- var _a;
21
- return !disabled && ((_a = inputRef.current) == null ? void 0 : _a.click());
17
+ variant: "dropzone",
18
+ "aria-label": ariaLabel,
19
+ dropTitle: children,
20
+ fileName: "",
21
+ accept,
22
+ multiple,
23
+ disabled,
24
+ className,
25
+ onFiles: (files) => {
26
+ const copy = new DataTransfer();
27
+ for (const file of Array.from(files)) copy.items.add(file);
28
+ onFiles(copy.files);
22
29
  },
23
- onKeyDown: (e) => {
24
- var _a;
25
- if (!disabled && (e.key === "Enter" || e.key === " ")) {
26
- e.preventDefault();
27
- (_a = inputRef.current) == null ? void 0 : _a.click();
28
- }
29
- },
30
- onDragOver: (e) => {
31
- e.preventDefault();
32
- if (!disabled) setDragging(true);
33
- },
34
- onDragLeave: () => setDragging(false),
35
- onDrop: handleDrop,
36
- className: [
37
- "flex flex-col items-center justify-center gap-3 rounded-(--radius-card) border-2 border-dashed py-10 transition-colors",
38
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus",
39
- disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer",
40
- dragging ? "border-stroke-focus bg-surface-raised" : "border-stroke-control hover:border-stroke-strong hover:bg-surface-page",
41
- className
42
- ].filter(Boolean).join(" ")
43
- },
44
- /* @__PURE__ */ React.createElement(
45
- "input",
46
- {
47
- ref: inputRef,
48
- type: "file",
49
- accept,
50
- multiple,
51
- disabled,
52
- className: "hidden",
53
- onChange: (e) => {
54
- var _a;
55
- if ((_a = e.target.files) == null ? void 0 : _a.length) onFiles(e.target.files);
56
- e.target.value = "";
57
- }
30
+ onChange: (event) => {
31
+ queueMicrotask(() => {
32
+ event.target.value = "";
33
+ });
58
34
  }
59
- ),
60
- children
35
+ }
61
36
  );
62
37
  }
63
38
  export {
@@ -0,0 +1,29 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode } from 'react';
3
+
4
+ type Heading = 'h2' | 'h3' | 'h4';
5
+ interface EmptyProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
6
+ /** What is missing (Figma: `title`): "Nenhum pedido por aqui". No "Ops!", and no blaming the person. */
7
+ title: ReactNode;
8
+ /** The heading level that fits the page's heading order. */
9
+ titleAs?: Heading;
10
+ /** How to change that (Figma: `showDescription` + `description`). */
11
+ description?: ReactNode;
12
+ /** The screen's subject (Figma: `showIcon`), an inline SVG shown in a soft lg Tile. */
13
+ icon?: ReactNode;
14
+ /**
15
+ * The Tile's tone. neutral (the Figma), or danger when the content failed to load (the Table's error state).
16
+ */
17
+ tone?: 'neutral' | 'danger';
18
+ /** The way out (Figma: `showAction`): a fill Button. */
19
+ action?: ReactNode;
20
+ /** A second way (Figma: `showSecondaryAction`): an outline Button. */
21
+ secondaryAction?: ReactNode;
22
+ }
23
+ /**
24
+ * Empty — Figma [RDS] Content/Empty. The empty state: what is missing, why, and what to do. A system error is an
25
+ * Alert, not an Empty. Styles: empty.css.
26
+ */
27
+ declare function Empty({ title, titleAs: Title, description, icon, tone, action, secondaryAction, className, ...rest }: EmptyProps): react.JSX.Element;
28
+
29
+ export { Empty, type EmptyProps };
@@ -0,0 +1,42 @@
1
+ import {
2
+ __objRest,
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Tile } from "./tile.js";
8
+ function Empty(_a) {
9
+ var _b = _a, {
10
+ title,
11
+ titleAs: Title = "h3",
12
+ description,
13
+ icon,
14
+ tone = "neutral",
15
+ action,
16
+ secondaryAction,
17
+ className
18
+ } = _b, rest = __objRest(_b, [
19
+ "title",
20
+ "titleAs",
21
+ "description",
22
+ "icon",
23
+ "tone",
24
+ "action",
25
+ "secondaryAction",
26
+ "className"
27
+ ]);
28
+ return /* @__PURE__ */ jsxs("div", __spreadProps(__spreadValues({}, rest), { className: ["rds-empty", className].filter(Boolean).join(" "), children: [
29
+ icon && /* @__PURE__ */ jsx(Tile, { icon, tone, variant: "soft", size: "lg" }),
30
+ /* @__PURE__ */ jsxs("div", { className: "rds-empty__text", children: [
31
+ /* @__PURE__ */ jsx(Title, { className: "rds-empty__title", children: title }),
32
+ description && /* @__PURE__ */ jsx("p", { className: "rds-empty__description", children: description })
33
+ ] }),
34
+ (action || secondaryAction) && /* @__PURE__ */ jsxs("div", { className: "rds-empty__actions", children: [
35
+ action,
36
+ secondaryAction
37
+ ] })
38
+ ] }));
39
+ }
40
+ export {
41
+ Empty
42
+ };
@@ -1,14 +1,38 @@
1
1
  import * as react from 'react';
2
- import { ReactNode } from 'react';
2
+ import { ComponentPropsWithRef, ReactNode } from 'react';
3
3
 
4
+ interface FABProps extends ComponentPropsWithRef<'button'> {
5
+ /** The action's name, a verb ("Novo pedido") (Figma: `label`). Always shown: it is the accessible name. */
6
+ children: ReactNode;
7
+ /** Icon before the text (Figma: `hasIcon`). Decorative, rendered with aria-hidden. */
8
+ icon?: ReactNode;
9
+ /** Rendered as aria-disabled="true": stays in the tab order and takes focus, but clicks do nothing. */
10
+ disabled?: boolean;
11
+ /**
12
+ * Render the single child element (an `<a>`, a framework `Link`) with the FAB's classes and behaviour
13
+ * instead of a `<button>`. Use it when the action navigates.
14
+ */
15
+ asChild?: boolean;
16
+ }
17
+ /**
18
+ * FAB — Figma [RDS] Actions/FAB. The floating button of a screen's main action: a 56 pill in the brand
19
+ * colour, raised. One per screen, never beside a visible button that does the same thing. It does not
20
+ * place itself: FABRoot (below) or the page puts it in the corner. Styles: fab.css.
21
+ */
22
+ declare function FAB({ children, icon, disabled, asChild, type, className, onClick, ...rest }: FABProps): react.JSX.Element;
4
23
  type FABConfig = {
5
24
  label: string;
25
+ /** The FAB's icon. Defaults to a plus. */
26
+ icon?: ReactNode;
27
+ /** Navigates with a plain `<a>`. For client-side routing, render <FAB asChild><Link/></FAB> yourself. */
6
28
  href?: string;
7
29
  onClick?: () => void;
8
- /** cta = primary action button | save = saving-bar with primary + secondary */
30
+ /** cta = the FAB | save = a SavingBar (label saves, secondary discards) */
9
31
  variant?: 'cta' | 'save';
10
32
  disabled?: boolean;
33
+ /** Only for `save`: the bar shows its saving status. */
11
34
  loading?: boolean;
35
+ /** Only for `save`: the discard action. */
12
36
  secondary?: {
13
37
  label: string;
14
38
  onClick: () => void;
@@ -28,11 +52,10 @@ declare function FABProvider({ children }: {
28
52
  }): react.JSX.Element;
29
53
  declare function useFAB(): FABContextValue;
30
54
  /**
31
- * Register the page's primary FAB action.
32
- * Clears the FAB automatically on unmount.
55
+ * Register the page's primary FAB action. Clears the FAB automatically on unmount.
33
56
  * Pass a stable deps array to avoid re-registering on every render.
34
57
  */
35
58
  declare function usePageFAB(config: FABConfig | null, deps?: unknown[]): void;
36
- declare function FABRoot(): react.JSX.Element;
59
+ declare function FABRoot(): react.JSX.Element | null;
37
60
 
38
- export { type FABConfig, FABProvider, FABRoot, useFAB, usePageFAB };
61
+ export { FAB, type FABConfig, type FABProps, FABProvider, FABRoot, useFAB, usePageFAB };
@@ -1,5 +1,10 @@
1
1
  "use client";
2
- import "../chunk-ORMEWXMH.js";
2
+ import {
3
+ __objRest,
4
+ __spreadProps,
5
+ __spreadValues
6
+ } from "../chunk-ORMEWXMH.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
3
8
  import {
4
9
  createContext,
5
10
  useCallback,
@@ -8,9 +13,28 @@ import {
8
13
  useRef,
9
14
  useState
10
15
  } from "react";
11
- import Link from "next/link";
12
- import { Plus, Loader2 } from "lucide-react";
16
+ import { Slot, Slottable } from "@radix-ui/react-slot";
17
+ import { blockWhenDisabled } from "./internal/button.js";
18
+ import { PlusIcon } from "./internal/icons.js";
19
+ import { SavingBar } from "./saving-bar.js";
13
20
  import { useSavingBarActive } from "./saving-bar-context.js";
21
+ function FAB(_a) {
22
+ var _b = _a, { children, icon, disabled, asChild, type = "button", className, onClick } = _b, rest = __objRest(_b, ["children", "icon", "disabled", "asChild", "type", "className", "onClick"]);
23
+ const Root = asChild ? Slot : "button";
24
+ return /* @__PURE__ */ jsxs(
25
+ Root,
26
+ __spreadProps(__spreadValues({}, rest), {
27
+ type: asChild ? void 0 : type,
28
+ className: ["rds-fab", className].filter(Boolean).join(" "),
29
+ "aria-disabled": disabled || void 0,
30
+ onClick: blockWhenDisabled(disabled, onClick),
31
+ children: [
32
+ icon && /* @__PURE__ */ jsx("span", { className: "rds-fab__icon", "aria-hidden": "true", children: icon }),
33
+ /* @__PURE__ */ jsx(Slottable, { children })
34
+ ]
35
+ })
36
+ );
37
+ }
14
38
  const FABContext = createContext({
15
39
  config: null,
16
40
  setFAB: () => {
@@ -30,7 +54,7 @@ function FABProvider({ children }) {
30
54
  const [fabHidden, setFabHidden] = useState(false);
31
55
  const setFAB = useCallback((cfg) => setConfig(cfg), []);
32
56
  const clearFAB = useCallback(() => setConfig(null), []);
33
- return /* @__PURE__ */ React.createElement(FABContext.Provider, { value: { config, setFAB, clearFAB, bottomOffset, setBottomOffset, fabHidden, setFabHidden } }, children);
57
+ return /* @__PURE__ */ jsx(FABContext.Provider, { value: { config, setFAB, clearFAB, bottomOffset, setBottomOffset, fabHidden, setFabHidden }, children });
34
58
  }
35
59
  function useFAB() {
36
60
  return useContext(FABContext);
@@ -49,50 +73,38 @@ function usePageFAB(config, deps = []) {
49
73
  }, [setFAB, clearFAB, ...deps]);
50
74
  }
51
75
  function FABRoot() {
76
+ var _a, _b, _c;
52
77
  const { config, bottomOffset, fabHidden } = useFAB();
53
78
  const savingBarActive = useSavingBarActive();
54
79
  const hiddenByBar = savingBarActive && (config == null ? void 0 : config.variant) !== "save";
55
80
  const visible = !!config && !fabHidden && !hiddenByBar;
56
81
  const wrapCls = [
57
- "fixed right-6 z-40 flex items-center gap-2 transition-all duration-200",
58
- visible ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-2 pointer-events-none"
59
- ].join(" ");
60
- const bottomStyle = { bottom: `${24 + bottomOffset}px` };
61
- if ((config == null ? void 0 : config.variant) === "save") {
62
- return /* @__PURE__ */ React.createElement("div", { className: wrapCls, style: bottomStyle }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 rounded-(--radius-control) px-4 py-3 [background:var(--fab-save-bg)] [box-shadow:var(--fab-save-shadow)]" }, config.secondary && /* @__PURE__ */ React.createElement(
63
- "button",
64
- {
65
- type: "button",
66
- onClick: config.secondary.onClick,
67
- disabled: config.loading,
68
- className: "rounded-(--radius-control) border px-3 py-1.5 text-label font-medium transition-colors disabled:opacity-40 cursor-pointer [border-color:var(--fab-save-discard-border)] [color:var(--fab-save-discard-text)] hover:[border-color:var(--fab-save-discard-border-hover)] hover:[color:var(--fab-save-discard-text-hover)]"
69
- },
70
- config.secondary.label
71
- ), /* @__PURE__ */ React.createElement(
72
- "button",
82
+ "rds-fab-root",
83
+ (config == null ? void 0 : config.variant) === "save" ? "rds-fab-root--bar" : "rds-fab-root--fab",
84
+ !visible && "rds-fab-root--hidden"
85
+ ].filter(Boolean).join(" ");
86
+ const bottomStyle = { bottom: `${((config == null ? void 0 : config.variant) === "save" ? 0 : 24) + bottomOffset}px` };
87
+ if (!config) return null;
88
+ if (config.variant === "save") {
89
+ return /* @__PURE__ */ jsx("div", { className: wrapCls, style: bottomStyle, children: /* @__PURE__ */ jsx(
90
+ SavingBar,
73
91
  {
74
- type: "button",
75
- onClick: config.onClick,
76
- disabled: config.disabled || config.loading,
77
- className: "rounded-(--radius-control) px-4 py-1.5 text-label font-medium transition-colors disabled:opacity-50 cursor-pointer flex items-center gap-2 [background:var(--fab-save-primary-bg)] [color:var(--fab-save-primary-text)] hover:[background:var(--fab-save-primary-bg-hover)]"
78
- },
79
- config.loading ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Loader2, { className: "w-4 h-4 animate-spin" }), "Salvando...") : config.label
80
- )));
92
+ status: config.loading ? "saving" : "unsaved",
93
+ saveLabel: config.label,
94
+ onSave: () => {
95
+ var _a2;
96
+ return (_a2 = config.onClick) == null ? void 0 : _a2.call(config);
97
+ },
98
+ onDiscard: (_a = config.secondary) == null ? void 0 : _a.onClick,
99
+ discardLabel: (_b = config.secondary) == null ? void 0 : _b.label
100
+ }
101
+ ) });
81
102
  }
82
- const btnCls = "flex items-center gap-2 h-12 pl-4 pr-5 rounded-(--radius-control) text-label font-semibold shadow-lg transition-colors cursor-pointer [background:var(--fab-cta-bg)] [color:var(--fab-cta-text)] hover:[background:var(--fab-cta-bg-hover)]";
83
- return /* @__PURE__ */ React.createElement("div", { className: wrapCls, style: bottomStyle }, (config == null ? void 0 : config.href) ? /* @__PURE__ */ React.createElement(Link, { href: config.href, className: btnCls }, /* @__PURE__ */ React.createElement(Plus, { size: 16, strokeWidth: 2.5 }), config == null ? void 0 : config.label) : /* @__PURE__ */ React.createElement(
84
- "button",
85
- {
86
- type: "button",
87
- onClick: config == null ? void 0 : config.onClick,
88
- disabled: config == null ? void 0 : config.disabled,
89
- className: btnCls + " disabled:opacity-50"
90
- },
91
- /* @__PURE__ */ React.createElement(Plus, { size: 16, strokeWidth: 2.5 }),
92
- config == null ? void 0 : config.label
93
- ));
103
+ const icon = (_c = config.icon) != null ? _c : /* @__PURE__ */ jsx(PlusIcon, {});
104
+ return /* @__PURE__ */ jsx("div", { className: wrapCls, style: bottomStyle, children: config.href ? /* @__PURE__ */ jsx(FAB, { asChild: true, icon, disabled: config.disabled, children: /* @__PURE__ */ jsx("a", { href: config.href, children: config.label }) }) : /* @__PURE__ */ jsx(FAB, { icon, disabled: config.disabled, onClick: config.onClick, children: config.label }) });
94
105
  }
95
106
  export {
107
+ FAB,
96
108
  FABProvider,
97
109
  FABRoot,
98
110
  useFAB,