@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,79 +1,157 @@
1
1
  "use client";
2
2
  import "../chunk-ORMEWXMH.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
3
4
  import { useEffect, useRef, useState } from "react";
4
- const HEX_RE = /^#[0-9a-fA-F]{6}$/;
5
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
6
+ import { FieldShell, useFieldIds, warnIfUnlabelled } from "./internal/field.js";
7
+ const HEX = /^#[0-9a-f]{6}$/i;
8
+ function normalizeHex(text) {
9
+ const raw = text.trim();
10
+ const hex = raw.startsWith("#") ? raw : `#${raw}`;
11
+ return HEX.test(hex) ? hex.toUpperCase() : null;
12
+ }
5
13
  function ColorInput({
14
+ label,
15
+ hint,
16
+ error,
17
+ errorMessage,
18
+ required,
6
19
  value,
20
+ defaultValue = "#000000",
7
21
  onChange,
8
- size = "md",
9
- disabled = false,
10
- className = "",
11
- "aria-label": ariaLabel
22
+ palette,
23
+ paletteTitle = "Cores da marca",
24
+ paletteCaption = "Ou digite o hex no campo.",
25
+ pickLabel = "Escolher cor",
26
+ name,
27
+ disabled,
28
+ id,
29
+ className,
30
+ style,
31
+ "aria-label": ariaLabel,
32
+ "aria-labelledby": ariaLabelledBy
12
33
  }) {
13
- const [draft, setDraft] = useState(value.toUpperCase());
14
- const inputRef = useRef(null);
15
- useEffect(() => {
16
- setDraft(value.toUpperCase());
17
- }, [value]);
18
- function commit() {
19
- const raw = draft.trim();
20
- const hex = raw.startsWith("#") ? raw : `#${raw}`;
21
- if (HEX_RE.test(hex)) {
22
- onChange(hex.toUpperCase());
23
- setDraft(hex.toUpperCase());
24
- } else {
25
- setDraft(value.toUpperCase());
26
- }
34
+ var _a;
35
+ warnIfUnlabelled("ColorInput", label, ariaLabel, ariaLabelledBy);
36
+ const { controlId, hintId, errorId, invalid, describedBy } = useFieldIds(id, hint, error, errorMessage);
37
+ const [own, setOwn] = useState(() => {
38
+ var _a2;
39
+ return (_a2 = normalizeHex(defaultValue)) != null ? _a2 : "#000000";
40
+ });
41
+ const color = (_a = normalizeHex(value != null ? value : own)) != null ? _a : own;
42
+ const [draft, setDraft] = useState(color);
43
+ const [open, setOpen] = useState(false);
44
+ const input = useRef(null);
45
+ useEffect(() => setDraft(color), [color]);
46
+ function commit(next) {
47
+ if (value === void 0) setOwn(next);
48
+ setDraft(next);
49
+ if (next !== color) onChange == null ? void 0 : onChange(next);
27
50
  }
28
- const h = size === "sm" ? "h-control-sm" : "h-control-md";
29
- const swatch = size === "sm" ? "size-5" : "size-6";
30
- return /* @__PURE__ */ React.createElement(
31
- "div",
32
- {
33
- className: [
34
- "inline-flex items-center gap-2 px-2.5 w-36",
35
- h,
36
- "rounded-(--radius-control) border border-stroke-control bg-surface-default",
37
- "transition-colors focus-within:border-stroke-focus focus-within:ring-2 focus-within:ring-stroke-focus/20",
38
- disabled ? "opacity-50 cursor-not-allowed" : "",
39
- className
40
- ].filter(Boolean).join(" ")
41
- },
42
- /* @__PURE__ */ React.createElement("span", { className: `relative shrink-0 ${swatch} rounded-(--radius-control) border border-stroke-subtle overflow-hidden` }, /* @__PURE__ */ React.createElement("span", { className: "absolute inset-0", style: { backgroundColor: value } }), /* @__PURE__ */ React.createElement(
43
- "input",
51
+ function confirm() {
52
+ const hex = normalizeHex(draft);
53
+ if (hex) commit(hex);
54
+ else setDraft(color);
55
+ }
56
+ const swatchColor = { backgroundColor: color };
57
+ const choices = (palette != null ? palette : []).map((c) => normalizeHex(c)).filter((c) => c !== null);
58
+ const swatch = choices.length ? /* @__PURE__ */ jsxs(PopoverPrimitive.Root, { open, onOpenChange: (next) => !disabled && setOpen(next), children: [
59
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx("button", { type: "button", className: "rds-color-input__swatch", style: swatchColor, "aria-label": `${pickLabel}: ${color}` }) }),
60
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
61
+ PopoverPrimitive.Content,
44
62
  {
45
- type: "color",
46
- value: HEX_RE.test(value) ? value : "#000000",
47
- onChange: (e) => onChange(e.target.value.toUpperCase()),
48
- disabled,
49
- "aria-label": ariaLabel,
50
- className: "absolute inset-0 opacity-0 w-full h-full cursor-pointer disabled:cursor-not-allowed"
63
+ align: "start",
64
+ sideOffset: 8,
65
+ collisionPadding: 16,
66
+ "aria-label": paletteTitle,
67
+ className: "rds-popover rds-color-input__popover",
68
+ children: [
69
+ /* @__PURE__ */ jsx("p", { className: "rds-color-input__palette-title", children: paletteTitle }),
70
+ /* @__PURE__ */ jsx("div", { className: "rds-color-input__palette", role: "group", "aria-label": paletteTitle, children: choices.map((c) => /* @__PURE__ */ jsx(
71
+ "button",
72
+ {
73
+ type: "button",
74
+ className: "rds-color-input__choice",
75
+ style: { backgroundColor: c },
76
+ "aria-label": c,
77
+ "aria-pressed": c === color,
78
+ onClick: () => {
79
+ commit(c);
80
+ setOpen(false);
81
+ }
82
+ },
83
+ c
84
+ )) }),
85
+ /* @__PURE__ */ jsx("p", { className: "rds-color-input__palette-caption", children: paletteCaption })
86
+ ]
51
87
  }
52
- )),
53
- /* @__PURE__ */ React.createElement(
88
+ ) })
89
+ ] }) : (
90
+ // No palette: the native picker lies invisible over the swatch, with its keyboard and dialog for free.
91
+ /* @__PURE__ */ jsx("span", { className: "rds-color-input__swatch", style: swatchColor, children: /* @__PURE__ */ jsx(
54
92
  "input",
55
93
  {
56
- ref: inputRef,
57
- type: "text",
58
- value: draft,
59
- onChange: (e) => setDraft(e.target.value),
60
- onBlur: commit,
61
- onKeyDown: (e) => {
62
- var _a;
63
- if (e.key === "Enter") {
64
- e.preventDefault();
65
- commit();
66
- (_a = inputRef.current) == null ? void 0 : _a.blur();
67
- }
68
- },
94
+ type: "color",
95
+ className: "rds-color-input__native",
96
+ value: color.toLowerCase(),
69
97
  disabled,
70
- maxLength: 7,
71
- "aria-label": ariaLabel,
72
- className: "min-w-0 flex-1 bg-transparent text-label font-mono text-fg-primary outline-none disabled:cursor-not-allowed"
98
+ "aria-label": pickLabel,
99
+ onChange: (event) => commit(event.target.value.toUpperCase())
73
100
  }
74
- )
101
+ ) })
102
+ );
103
+ return /* @__PURE__ */ jsxs(
104
+ FieldShell,
105
+ {
106
+ kind: "rds-color-input",
107
+ controlId,
108
+ hintId,
109
+ errorId,
110
+ label,
111
+ hint,
112
+ errorMessage,
113
+ invalid,
114
+ required,
115
+ disabled,
116
+ className,
117
+ style,
118
+ children: [
119
+ swatch,
120
+ /* @__PURE__ */ jsx(
121
+ "input",
122
+ {
123
+ ref: input,
124
+ id: controlId,
125
+ className: "rds-field__control rds-color-input__hex",
126
+ type: "text",
127
+ maxLength: 7,
128
+ spellCheck: false,
129
+ autoComplete: "off",
130
+ autoCapitalize: "characters",
131
+ "aria-label": ariaLabel,
132
+ "aria-labelledby": ariaLabelledBy,
133
+ "aria-invalid": invalid || void 0,
134
+ "aria-describedby": describedBy,
135
+ required,
136
+ disabled,
137
+ name,
138
+ placeholder: "#RRGGBB",
139
+ value: draft,
140
+ onChange: (event) => setDraft(event.target.value),
141
+ onBlur: confirm,
142
+ onKeyDown: (event) => {
143
+ if (event.key === "Enter") {
144
+ event.preventDefault();
145
+ confirm();
146
+ }
147
+ }
148
+ }
149
+ )
150
+ ]
151
+ }
75
152
  );
76
153
  }
77
154
  export {
78
- ColorInput
155
+ ColorInput,
156
+ normalizeHex
79
157
  };
@@ -1,70 +1,73 @@
1
1
  import * as react from 'react';
2
- import { ReactNode } from 'react';
2
+ import { ReactNode, CSSProperties } from 'react';
3
+ import { FieldTextProps } from './internal/field.js';
3
4
 
4
- /**
5
- * Combobox — Search + Select. Lista filtrada por digitação.
6
- * Inspirado em shadcn Combobox / cmdk.
7
- *
8
- * Uso:
9
- * <Combobox
10
- * options={cities}
11
- * value={selected}
12
- * onChange={setSelected}
13
- * placeholder="Buscar cidade..."
14
- * />
15
- *
16
- * Multi-select:
17
- * <Combobox
18
- * multi
19
- * options={tags}
20
- * value={selectedTags}
21
- * onChange={setSelectedTags}
22
- * />
23
- *
24
- * Suporta filtro custom (por default usa includes case-insensitive em label).
25
- */
26
5
  interface ComboboxOption {
6
+ /** The value sent with the form. */
27
7
  value: string;
8
+ /** The text shown and filtered by typing. */
28
9
  label: string;
29
- /** Subtítulo opcional (ex: email abaixo do nome). */
30
- description?: string;
31
- /** Ícone leading. */
10
+ /** An icon before the text. Decorative. */
32
11
  icon?: ReactNode;
12
+ /** Cannot be chosen now: skipped by the arrows. */
33
13
  disabled?: boolean;
34
14
  }
35
- interface ComboboxSingleProps {
36
- multi?: false;
37
- value: string | null;
38
- onChange: (value: string | null) => void;
39
- }
40
- interface ComboboxMultiProps {
41
- multi: true;
42
- value: string[];
43
- onChange: (value: string[]) => void;
44
- }
45
- type ComboboxProps = (ComboboxSingleProps | ComboboxMultiProps) & {
46
- options: ComboboxOption[];
47
- placeholder?: string;
48
- /** Filtro custom. default = includes case-insensitive em label/description. */
49
- filter?: (option: ComboboxOption, query: string) => boolean;
50
- /** Texto quando lista vazia. default = "Nada encontrado". */
15
+ interface ComboboxBaseProps extends FieldTextProps {
16
+ /** The whole list. The field filters it as the person types, ignoring case and accents. */
17
+ options: (ComboboxOption | string)[];
18
+ /** Shown when nothing matches (Figma: menu=empty). Say what was not found ("Nenhum público com esse nome."). */
51
19
  emptyMessage?: string;
52
- /** Largura. default = full. */
53
- width?: 'full' | 'hug';
54
- size?: 'sm' | 'md';
20
+ /** Tells the result count to screen readers, in the subject's words. By default "N resultados". */
21
+ resultsMessage?: (count: number) => string;
22
+ /**
23
+ * Offers to create what was typed when nothing matches it exactly (Figma: menu=create and empty-create): an
24
+ * option `Cadastrar "<texto>"` after a divider, reached by the arrows like any other. With no match it is the only
25
+ * option and is already active, so Enter creates. On by default when `onCreate` is given.
26
+ */
27
+ creatable?: boolean;
28
+ /** Called with the typed text when the person creates it; return the new option (or its value). */
29
+ onCreate?: (text: string) => ComboboxOption | string | void;
30
+ /** The create option's text. By default `Cadastrar "<texto>"`. */
31
+ createLabel?: (text: string) => string;
32
+ /** What shows in the empty field. */
33
+ placeholder?: string;
34
+ /** An icon on the left, as in the Input (Figma: `showLeadingIcon` + `leadingIcon`). Decorative. */
35
+ leadingIcon?: ReactNode;
36
+ /** The form field name: hidden inputs carry the chosen values. */
37
+ name?: string;
55
38
  disabled?: boolean;
39
+ id?: string;
56
40
  className?: string;
41
+ style?: CSSProperties;
42
+ /** The name when there is no visible label. */
57
43
  'aria-label'?: string;
58
- /** Customiza o conteúdo do trigger fechado (ex: só o ícone). default = ícone + label. */
59
- triggerContent?: (selected: ComboboxOption | null) => ReactNode;
60
- /** Largura mínima do dropdown em px. Útil quando o trigger é compacto (width="hug"). */
61
- dropdownMinWidth?: number;
62
- /** Buscar→criar: quando a busca não casa com nenhuma opção (por label), mostra uma
63
- * linha "criar" que chama onCreate(query). Campo padrão tipo cliente/fornecedor. */
64
- onCreate?: (query: string) => void;
65
- /** Rótulo da linha de criar. default = `+ "<query>"`. Passe localizado. */
66
- createLabel?: (query: string) => string;
67
- };
68
- declare const Combobox: react.ForwardRefExoticComponent<ComboboxProps & react.RefAttributes<HTMLButtonElement>>;
44
+ 'aria-labelledby'?: string;
45
+ }
46
+ interface ComboboxSingleProps extends ComboboxBaseProps {
47
+ multiple?: false;
48
+ /** Controlled: the chosen option's value ('' for none). */
49
+ value?: string;
50
+ /** Uncontrolled: the option chosen at first. */
51
+ defaultValue?: string;
52
+ onValueChange?: (value: string) => void;
53
+ }
54
+ interface ComboboxMultipleProps extends ComboboxBaseProps {
55
+ /**
56
+ * Many values: the chosen ones show as Chips in the field, choosing toggles, the list stays open, and
57
+ * Backspace on an empty field removes the last one.
58
+ */
59
+ multiple: true;
60
+ value?: string[];
61
+ defaultValue?: string[];
62
+ onValueChange?: (value: string[]) => void;
63
+ }
64
+ type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;
65
+ /**
66
+ * Combobox — Figma [RDS] Forms/Combobox. A field that filters a long list while the person types: audiences,
67
+ * cities, companies. It is the Input with the Listbox under it (ARIA combobox): the focus stays in the field,
68
+ * the arrows move the active option, Enter chooses, Escape closes (and, closed, gives back the chosen text).
69
+ * For 5 to 15 fixed options, the Select. Styles: combobox.css, internal/field.css and internal/listbox.css.
70
+ */
71
+ declare function Combobox(props: ComboboxProps): react.JSX.Element;
69
72
 
70
- export { Combobox, type ComboboxOption, type ComboboxProps };
73
+ export { Combobox, type ComboboxMultipleProps, type ComboboxOption, type ComboboxProps, type ComboboxSingleProps };