@rojaostudio/ds 1.0.2 → 2.0.0-next.1

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 (356) 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 -93
  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 +67 -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 -90
  15. package/dist/components/badge.d.ts +30 -41
  16. package/dist/components/badge.js +13 -110
  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 +38 -56
  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 +45 -108
  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 +31 -46
  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 +87 -81
  43. package/dist/components/chip-input.d.ts +46 -20
  44. package/dist/components/chip-input.js +172 -176
  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 -62
  49. package/dist/components/choice-carousel.d.ts +9 -0
  50. package/dist/components/choice-carousel.js +28 -44
  51. package/dist/components/choice-preview-card.d.ts +10 -20
  52. package/dist/components/choice-preview-card.js +12 -40
  53. package/dist/components/color-input.d.ts +36 -11
  54. package/dist/components/color-input.js +131 -59
  55. package/dist/components/combobox.d.ts +60 -57
  56. package/dist/components/combobox.js +210 -213
  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 +41 -68
  63. package/dist/components/copy-field.d.ts +10 -5
  64. package/dist/components/copy-field.js +24 -29
  65. package/dist/components/currency-input.d.ts +25 -11
  66. package/dist/components/currency-input.js +29 -65
  67. package/dist/components/danger-zone.d.ts +10 -1
  68. package/dist/components/danger-zone.js +14 -18
  69. package/dist/components/data-table-header.d.ts +13 -2
  70. package/dist/components/data-table-header.js +114 -190
  71. package/dist/components/date-picker.d.ts +31 -32
  72. package/dist/components/date-picker.js +119 -254
  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 +57 -89
  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 -58
  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 -51
  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 -61
  93. package/dist/components/floating-stepper.d.ts +7 -18
  94. package/dist/components/floating-stepper.js +27 -55
  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 +44 -64
  111. package/dist/components/image-crop-modal.d.ts +3 -3
  112. package/dist/components/image-crop-modal.js +32 -39
  113. package/dist/components/image-upload.d.ts +21 -29
  114. package/dist/components/image-upload.js +55 -259
  115. package/dist/components/index.d.ts +105 -52
  116. package/dist/components/index.js +190 -74
  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 +104 -137
  121. package/dist/components/insight-card.d.ts +25 -9
  122. package/dist/components/insight-card.js +42 -27
  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 -27
  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 -137
  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 -34
  185. package/dist/components/page-skeleton.d.ts +15 -21
  186. package/dist/components/page-skeleton.js +28 -25
  187. package/dist/components/pagination.d.ts +32 -22
  188. package/dist/components/pagination.js +78 -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 +75 -64
  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 +30 -131
  197. package/dist/components/pricing-card.d.ts +9 -25
  198. package/dist/components/pricing-card.js +9 -40
  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 +6 -22
  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 +45 -103
  211. package/dist/components/row-actions.d.ts +5 -0
  212. package/dist/components/row-actions.js +27 -34
  213. package/dist/components/saving-bar-context.d.ts +0 -5
  214. package/dist/components/saving-bar-context.js +16 -40
  215. package/dist/components/saving-bar.d.ts +26 -11
  216. package/dist/components/saving-bar.js +50 -65
  217. package/dist/components/section-card.d.ts +18 -4
  218. package/dist/components/section-card.js +29 -50
  219. package/dist/components/section-header.d.ts +8 -12
  220. package/dist/components/section-header.js +5 -10
  221. package/dist/components/select.d.ts +44 -16
  222. package/dist/components/select.js +83 -154
  223. package/dist/components/selectable-card.d.ts +11 -19
  224. package/dist/components/selectable-card.js +4 -28
  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 +10 -23
  229. package/dist/components/settings-list.d.ts +10 -12
  230. package/dist/components/settings-list.js +7 -19
  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 -37
  237. package/dist/components/slider.d.ts +21 -23
  238. package/dist/components/slider.js +59 -64
  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 +34 -37
  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 +18 -16
  251. package/dist/components/summary-bar.d.ts +20 -20
  252. package/dist/components/summary-bar.js +13 -55
  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 +59 -58
  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 -91
  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 +185 -203
  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 +19 -86
  271. package/dist/components/toggle-card.d.ts +11 -2
  272. package/dist/components/toggle-card.js +8 -77
  273. package/dist/components/toggle-group.d.ts +21 -59
  274. package/dist/components/toggle-group.js +31 -80
  275. package/dist/components/toggle.d.ts +19 -9
  276. package/dist/components/toggle.js +16 -61
  277. package/dist/components/tooltip.d.ts +25 -12
  278. package/dist/components/tooltip.js +15 -88
  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 -24
  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/targets/native/components/index.d.ts +0 -2
  295. package/dist/targets/native/components/index.js +0 -4
  296. package/dist/targets/native/preset.cjs +0 -1
  297. package/dist/targets/native/theme.css +58 -60
  298. package/dist/targets/native/theme.d.ts +58 -60
  299. package/dist/targets/native/theme.js +58 -60
  300. package/package.json +34 -12
  301. package/styles/_primitives.generated.css +40 -0
  302. package/styles/base.css +12 -18
  303. package/styles/rds/components-styles.css +11365 -0
  304. package/styles/rds/components.css +993 -0
  305. package/styles/rds/foundation.css +74 -0
  306. package/styles/rds/theme.css +261 -0
  307. package/styles/rds.css +6 -0
  308. package/styles/themes/rojao.css +46 -53
  309. package/dist/components/blocker-card.d.ts +0 -42
  310. package/dist/components/blocker-card.js +0 -54
  311. package/dist/components/bottom-sheet.d.ts +0 -31
  312. package/dist/components/bottom-sheet.js +0 -127
  313. package/dist/components/chat-bubble.d.ts +0 -16
  314. package/dist/components/chat-bubble.js +0 -56
  315. package/dist/components/chips.d.ts +0 -22
  316. package/dist/components/chips.js +0 -101
  317. package/dist/components/copilot-hint.d.ts +0 -18
  318. package/dist/components/copilot-hint.js +0 -72
  319. package/dist/components/divider.d.ts +0 -20
  320. package/dist/components/divider.js +0 -50
  321. package/dist/components/empty-state.d.ts +0 -48
  322. package/dist/components/empty-state.js +0 -94
  323. package/dist/components/form-card-header.d.ts +0 -13
  324. package/dist/components/form-card-header.js +0 -16
  325. package/dist/components/label.d.ts +0 -16
  326. package/dist/components/label.js +0 -48
  327. package/dist/components/menu.d.ts +0 -50
  328. package/dist/components/menu.js +0 -83
  329. package/dist/components/modal.d.ts +0 -25
  330. package/dist/components/modal.js +0 -86
  331. package/dist/components/notice.d.ts +0 -50
  332. package/dist/components/notice.js +0 -121
  333. package/dist/components/page-tabs.d.ts +0 -35
  334. package/dist/components/page-tabs.js +0 -68
  335. package/dist/components/paywall-banner.d.ts +0 -37
  336. package/dist/components/paywall-banner.js +0 -58
  337. package/dist/components/paywall.d.ts +0 -44
  338. package/dist/components/paywall.js +0 -65
  339. package/dist/components/phone-frame.d.ts +0 -9
  340. package/dist/components/phone-frame.js +0 -19
  341. package/dist/components/pix-icon.d.ts +0 -8
  342. package/dist/components/search.d.ts +0 -30
  343. package/dist/components/search.js +0 -86
  344. package/dist/components/themed.d.ts +0 -36
  345. package/dist/components/themed.js +0 -23
  346. package/dist/components/toaster.d.ts +0 -84
  347. package/dist/components/toaster.js +0 -290
  348. package/dist/components/use-dismiss.d.ts +0 -9
  349. package/dist/components/use-dismiss.js +0 -28
  350. package/dist/components/use-focus-trap.d.ts +0 -5
  351. package/dist/components/use-focus-trap.js +0 -54
  352. package/dist/targets/native/components/paywall-banner.d.ts +0 -11
  353. package/dist/targets/native/components/paywall-banner.js +0 -55
  354. package/dist/targets/native/components/paywall.d.ts +0 -18
  355. package/dist/targets/native/components/paywall.js +0 -71
  356. /package/dist/{components/pix-icon.js → icons/pix.js} +0 -0
@@ -2,78 +2,149 @@
2
2
  import "../chunk-ORMEWXMH.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { useEffect, useRef, useState } from "react";
5
- 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
+ }
6
13
  function ColorInput({
14
+ label,
15
+ hint,
16
+ error,
17
+ errorMessage,
18
+ required,
7
19
  value,
20
+ defaultValue = "#000000",
8
21
  onChange,
9
- size = "md",
10
- disabled = false,
11
- className = "",
12
- "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
13
33
  }) {
14
- const [draft, setDraft] = useState(value.toUpperCase());
15
- const inputRef = useRef(null);
16
- useEffect(() => {
17
- setDraft(value.toUpperCase());
18
- }, [value]);
19
- function commit() {
20
- const raw = draft.trim();
21
- const hex = raw.startsWith("#") ? raw : `#${raw}`;
22
- if (HEX_RE.test(hex)) {
23
- onChange(hex.toUpperCase());
24
- setDraft(hex.toUpperCase());
25
- } else {
26
- setDraft(value.toUpperCase());
27
- }
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);
50
+ }
51
+ function confirm() {
52
+ const hex = normalizeHex(draft);
53
+ if (hex) commit(hex);
54
+ else setDraft(color);
28
55
  }
29
- const h = size === "sm" ? "h-control-sm" : "h-control-md";
30
- const swatch = size === "sm" ? "size-5" : "size-6";
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,
62
+ {
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
+ ]
87
+ }
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(
92
+ "input",
93
+ {
94
+ type: "color",
95
+ className: "rds-color-input__native",
96
+ value: color.toLowerCase(),
97
+ disabled,
98
+ "aria-label": pickLabel,
99
+ onChange: (event) => commit(event.target.value.toUpperCase())
100
+ }
101
+ ) })
102
+ );
31
103
  return /* @__PURE__ */ jsxs(
32
- "div",
104
+ FieldShell,
33
105
  {
34
- className: [
35
- "inline-flex items-center gap-2 px-2.5 w-36",
36
- h,
37
- "rounded-(--radius-control) border border-stroke-control bg-surface-default",
38
- "transition-colors focus-within:border-stroke-focus focus-within:ring-2 focus-within:ring-stroke-focus/20",
39
- disabled ? "opacity-50 cursor-not-allowed" : "",
40
- className
41
- ].filter(Boolean).join(" "),
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,
42
118
  children: [
43
- /* @__PURE__ */ jsxs("span", { className: `relative shrink-0 ${swatch} rounded-(--radius-control) border border-stroke-subtle overflow-hidden`, children: [
44
- /* @__PURE__ */ jsx("span", { className: "absolute inset-0", style: { backgroundColor: value } }),
45
- /* @__PURE__ */ jsx(
46
- "input",
47
- {
48
- type: "color",
49
- value: HEX_RE.test(value) ? value : "#000000",
50
- onChange: (e) => onChange(e.target.value.toUpperCase()),
51
- disabled,
52
- "aria-label": ariaLabel,
53
- className: "absolute inset-0 opacity-0 w-full h-full cursor-pointer disabled:cursor-not-allowed"
54
- }
55
- )
56
- ] }),
119
+ swatch,
57
120
  /* @__PURE__ */ jsx(
58
121
  "input",
59
122
  {
60
- ref: inputRef,
123
+ ref: input,
124
+ id: controlId,
125
+ className: "rds-field__control rds-color-input__hex",
61
126
  type: "text",
62
- value: draft,
63
- onChange: (e) => setDraft(e.target.value),
64
- onBlur: commit,
65
- onKeyDown: (e) => {
66
- var _a;
67
- if (e.key === "Enter") {
68
- e.preventDefault();
69
- commit();
70
- (_a = inputRef.current) == null ? void 0 : _a.blur();
71
- }
72
- },
73
- disabled,
74
127
  maxLength: 7,
128
+ spellCheck: false,
129
+ autoComplete: "off",
130
+ autoCapitalize: "characters",
75
131
  "aria-label": ariaLabel,
76
- className: "min-w-0 flex-1 bg-transparent text-label font-mono text-fg-primary outline-none disabled:cursor-not-allowed"
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
+ }
77
148
  }
78
149
  )
79
150
  ]
@@ -81,5 +152,6 @@ function ColorInput({
81
152
  );
82
153
  }
83
154
  export {
84
- ColorInput
155
+ ColorInput,
156
+ normalizeHex
85
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 };