@rojaostudio/ds 1.0.2 → 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 (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 -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 +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
@@ -1,164 +1,131 @@
1
1
  "use client";
2
2
  import {
3
3
  __objRest,
4
+ __spreadProps,
4
5
  __spreadValues
5
6
  } from "../chunk-ORMEWXMH.js";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
- import { forwardRef, useId, useState } from "react";
8
- import { Eye, EyeOff, X } from "lucide-react";
9
- const SIZE = {
10
- sm: { h: "h-control-sm", text: "text-caption", pad: "px-2.5", icon: 14, padIconL: "pl-8", padIconR: "pr-8", affix: "px-2.5" },
11
- md: { h: "h-control-md", text: "text-label", pad: "px-3", icon: 16, padIconL: "pl-9", padIconR: "pr-9", affix: "px-3" },
12
- lg: { h: "h-control-lg", text: "text-body", pad: "px-4", icon: 18, padIconL: "pl-11", padIconR: "pr-11", affix: "px-4" }
13
- };
14
- const Input = forwardRef(function Input2(_a, ref) {
8
+ import { useRef, useState } from "react";
9
+ import {
10
+ clearNativeValue,
11
+ FieldAction,
12
+ FieldShell,
13
+ hasContent,
14
+ useFieldIds,
15
+ warnIfUnlabelled
16
+ } from "./internal/field.js";
17
+ import { CloseIcon } from "./internal/icons.js";
18
+ function Input(_a) {
15
19
  var _b = _a, {
16
20
  label,
17
- helper,
21
+ labelPosition,
22
+ hint,
18
23
  error,
19
- size = "md",
24
+ errorMessage,
20
25
  required,
21
- optional,
22
- iconLeft,
23
- iconRight,
26
+ leadingIcon,
24
27
  prefix,
25
28
  suffix,
29
+ trailingIcon,
26
30
  clearable,
27
31
  onClear,
28
- passwordReveal = true,
29
- showCount,
30
- className = "",
32
+ clearLabel = "Limpar",
31
33
  id,
32
- type = "text",
33
- value,
34
- defaultValue,
35
- maxLength
36
- } = _b, props = __objRest(_b, [
34
+ disabled,
35
+ className,
36
+ style,
37
+ onChange,
38
+ ref
39
+ } = _b, input = __objRest(_b, [
37
40
  "label",
38
- "helper",
41
+ "labelPosition",
42
+ "hint",
39
43
  "error",
40
- "size",
44
+ "errorMessage",
41
45
  "required",
42
- "optional",
43
- "iconLeft",
44
- "iconRight",
46
+ "leadingIcon",
45
47
  "prefix",
46
48
  "suffix",
49
+ "trailingIcon",
47
50
  "clearable",
48
51
  "onClear",
49
- "passwordReveal",
50
- "showCount",
51
- "className",
52
+ "clearLabel",
52
53
  "id",
53
- "type",
54
- "value",
55
- "defaultValue",
56
- "maxLength"
54
+ "disabled",
55
+ "className",
56
+ "style",
57
+ "onChange",
58
+ "ref"
57
59
  ]);
58
- const generatedId = useId();
59
- const inputId = id != null ? id : generatedId;
60
- const [revealed, setRevealed] = useState(false);
61
- const isPassword = type === "password";
62
- const effectiveType = isPassword && passwordReveal && revealed ? "text" : type;
63
- const hasValue = !!(value != null ? value : defaultValue);
64
- const showClear = clearable && hasValue;
65
- const showReveal = isPassword && passwordReveal;
66
- const hasRightAdornment = showClear || showReveal || iconRight;
67
- const sz = SIZE[size];
68
- const hasAffix = !!(prefix || suffix);
69
- const inputRadius = hasAffix ? prefix && suffix ? "rounded-none" : prefix ? "rounded-l-none rounded-r-(--radius-control)" : "rounded-l-(--radius-control) rounded-r-none" : "rounded-(--radius-control)";
70
- const errorClass = error ? "border-danger focus:border-danger focus:ring-2 focus:ring-danger/20" : "border-stroke-control focus:border-stroke-focus focus:ring-2 focus:ring-stroke-focus/20";
71
- const inputElement = /* @__PURE__ */ jsxs("div", { className: "relative flex-1 inline-flex items-center", children: [
72
- iconLeft && /* @__PURE__ */ jsx(
73
- "span",
74
- {
75
- "aria-hidden": true,
76
- className: "absolute left-0 inset-y-0 flex items-center pl-3 text-fg-muted pointer-events-none",
77
- children: /* @__PURE__ */ jsx("span", { className: "[&_svg]:shrink-0", style: { width: sz.icon, height: sz.icon }, children: iconLeft })
78
- }
79
- ),
80
- /* @__PURE__ */ jsx(
81
- "input",
82
- __spreadValues({
83
- ref,
84
- id: inputId,
85
- type: effectiveType,
86
- value,
87
- defaultValue,
88
- maxLength,
89
- required,
90
- className: [
91
- "w-full bg-surface-default text-fg-primary placeholder:text-fg-placeholder",
92
- "border transition-colors outline-none",
93
- inputRadius,
94
- sz.h,
95
- sz.text,
96
- sz.pad,
97
- iconLeft ? sz.padIconL : "",
98
- hasRightAdornment ? sz.padIconR : "",
99
- errorClass,
100
- "disabled:opacity-50 disabled:cursor-not-allowed",
101
- className
102
- ].filter(Boolean).join(" "),
103
- "aria-invalid": error ? true : void 0,
104
- "aria-describedby": error ? `${inputId}-error` : helper ? `${inputId}-helper` : void 0
105
- }, props)
106
- ),
107
- hasRightAdornment && /* @__PURE__ */ jsxs("span", { className: "absolute right-0 inset-y-0 flex items-center pr-2 gap-1 pointer-events-none", children: [
108
- iconRight && !showClear && !showReveal && /* @__PURE__ */ jsx("span", { className: "text-fg-muted", children: iconRight }),
109
- showClear && /* @__PURE__ */ jsx(
110
- "button",
111
- {
112
- type: "button",
113
- onClick: onClear,
114
- "aria-label": "Limpar",
115
- className: "text-fg-muted hover:text-fg-primary p-0.5 rounded transition-colors pointer-events-auto",
116
- children: /* @__PURE__ */ jsx(X, { size: sz.icon - 2 })
117
- }
118
- ),
119
- showReveal && /* @__PURE__ */ jsx(
120
- "button",
121
- {
122
- type: "button",
123
- onClick: () => setRevealed((r) => !r),
124
- "aria-label": revealed ? "Ocultar senha" : "Mostrar senha",
125
- className: "text-fg-muted hover:text-fg-primary p-1 rounded bg-surface-default transition-colors pointer-events-auto",
126
- children: revealed ? /* @__PURE__ */ jsx(EyeOff, { size: sz.icon }) : /* @__PURE__ */ jsx(Eye, { size: sz.icon })
127
- }
128
- )
129
- ] })
130
- ] });
131
- const wrappedInput = hasAffix ? /* @__PURE__ */ jsxs("div", { className: "inline-flex w-full items-stretch", children: [
132
- prefix && /* @__PURE__ */ jsx("span", { className: [
133
- "inline-flex items-center border border-r-0 border-stroke-control rounded-l-(--radius-control) bg-surface-raised text-fg-muted",
134
- sz.text,
135
- sz.affix
136
- ].join(" "), children: prefix }),
137
- inputElement,
138
- suffix && /* @__PURE__ */ jsx("span", { className: [
139
- "inline-flex items-center border border-l-0 border-stroke-control rounded-r-(--radius-control) bg-surface-raised text-fg-muted",
140
- sz.text,
141
- sz.affix
142
- ].join(" "), children: suffix })
143
- ] }) : inputElement;
144
- const currentLength = typeof value === "string" ? value.length : typeof defaultValue === "string" ? defaultValue.length : 0;
145
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 w-full", children: [
146
- label && /* @__PURE__ */ jsxs("label", { htmlFor: inputId, className: "inline-flex items-center gap-1 text-label font-medium text-fg-primary", children: [
147
- /* @__PURE__ */ jsx("span", { children: label }),
148
- required && /* @__PURE__ */ jsx("span", { className: "text-danger", "aria-label": "obrigat\xF3rio", children: "*" }),
149
- optional && !required && /* @__PURE__ */ jsx("span", { className: "text-fg-muted font-normal", children: "(opcional)" })
150
- ] }),
151
- wrappedInput,
152
- (error || helper || showCount && maxLength) && /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
153
- error ? /* @__PURE__ */ jsx("p", { id: `${inputId}-error`, className: "text-caption text-danger-text flex-1", children: error }) : helper ? /* @__PURE__ */ jsx("p", { id: `${inputId}-helper`, className: "text-caption text-fg-muted flex-1", children: helper }) : /* @__PURE__ */ jsx("span", { className: "flex-1" }),
154
- showCount && maxLength && /* @__PURE__ */ jsxs("span", { className: "text-caption text-fg-muted tabular-nums shrink-0", children: [
155
- currentLength,
156
- "/",
157
- maxLength
158
- ] })
159
- ] })
160
- ] });
161
- });
60
+ warnIfUnlabelled("Input", label, input["aria-label"], input["aria-labelledby"]);
61
+ const { controlId, hintId, errorId, invalid, describedBy } = useFieldIds(id, hint, error, errorMessage);
62
+ const own = useRef(null);
63
+ const [typed, setTyped] = useState(() => hasContent(input.defaultValue));
64
+ const hasValue = input.value !== void 0 ? String(input.value) !== "" : typed;
65
+ const showClear = clearable && hasValue && !disabled;
66
+ const floating = labelPosition === "floating" && hasContent(label);
67
+ function change(event) {
68
+ setTyped(event.target.value !== "");
69
+ onChange == null ? void 0 : onChange(event);
70
+ }
71
+ function setRef(node) {
72
+ own.current = node;
73
+ if (typeof ref === "function") ref(node);
74
+ else if (ref) ref.current = node;
75
+ }
76
+ return /* @__PURE__ */ jsxs(
77
+ FieldShell,
78
+ {
79
+ kind: "rds-input",
80
+ controlId,
81
+ hintId,
82
+ errorId,
83
+ label,
84
+ labelPosition,
85
+ hint,
86
+ errorMessage,
87
+ invalid,
88
+ required,
89
+ disabled,
90
+ boxClassName: showClear ? "rds-field__box--action" : void 0,
91
+ className,
92
+ style,
93
+ children: [
94
+ leadingIcon && /* @__PURE__ */ jsx("span", { className: "rds-field__icon", "aria-hidden": "true", children: leadingIcon }),
95
+ prefix && /* @__PURE__ */ jsx("span", { className: "rds-field__affix", "aria-hidden": "true", children: prefix }),
96
+ /* @__PURE__ */ jsx(
97
+ "input",
98
+ __spreadProps(__spreadValues({}, input), {
99
+ ref: setRef,
100
+ id: controlId,
101
+ className: "rds-field__control",
102
+ required,
103
+ disabled,
104
+ "aria-invalid": invalid || void 0,
105
+ "aria-describedby": [describedBy, input["aria-describedby"]].filter(Boolean).join(" ") || void 0,
106
+ onChange: change,
107
+ placeholder: floating ? " " : input.placeholder
108
+ })
109
+ ),
110
+ suffix && /* @__PURE__ */ jsx("span", { className: "rds-field__affix", "aria-hidden": "true", children: suffix }),
111
+ trailingIcon && !showClear && /* @__PURE__ */ jsx("span", { className: "rds-field__icon", "aria-hidden": "true", children: trailingIcon }),
112
+ showClear && /* @__PURE__ */ jsx(
113
+ FieldAction,
114
+ {
115
+ label: clearLabel,
116
+ icon: /* @__PURE__ */ jsx(CloseIcon, {}),
117
+ onClick: () => {
118
+ var _a2;
119
+ clearNativeValue(own.current);
120
+ (_a2 = own.current) == null ? void 0 : _a2.focus();
121
+ onClear == null ? void 0 : onClear();
122
+ }
123
+ }
124
+ )
125
+ ]
126
+ }
127
+ );
128
+ }
162
129
  export {
163
130
  Input
164
131
  };
@@ -1,19 +1,35 @@
1
1
  import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, ComponentType } from 'react';
2
3
 
3
4
  type InsightCardType = 'alert' | 'opportunity' | 'tip';
4
- interface InsightCardProps {
5
+ interface InsightCardProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
6
+ /** The kind of message: it gives the colour and the tag (Atenção, Oportunidade, Dica). */
5
7
  type: InsightCardType;
6
- title: string;
7
- description: string;
8
- /** Optional numeric/text highlight, e.g. "+ R$ 450/mês" */
9
- potential?: string;
10
- /** CTA label */
8
+ /** What the system noticed, in one line (Figma: `title`). */
9
+ title: ReactNode;
10
+ /** Why it matters or what to do (Figma: `description`). */
11
+ description: ReactNode;
12
+ /** A number or short highlight beside the title (Figma: `hasPotential` + `potential`): "+ R$ 450/mês". */
13
+ potential?: ReactNode;
14
+ /** The action's text (Figma: `hasAction` + `action`). Rendered with `actionHref` (a link) or `actionOnClick`. */
11
15
  action?: string;
12
- /** CTA href — renders an <a> tag */
16
+ /** Where the action leads: renders a link (`linkAs`, or a plain <a>). */
13
17
  actionHref?: string;
14
- /** CTA onClick — renders a <button> (takes precedence over actionHref when both provided) */
18
+ /** What the action does: renders a button. Takes precedence over `actionHref`. */
15
19
  actionOnClick?: () => void;
20
+ /** The link component for `actionHref` (a framework Link). Default: a plain <a>. */
21
+ linkAs?: ComponentType<{
22
+ href: string;
23
+ className?: string;
24
+ children: ReactNode;
25
+ }>;
26
+ /** The heading level that fits the page's heading order. */
27
+ titleAs?: 'h2' | 'h3' | 'h4';
16
28
  }
17
- declare function InsightCard({ type, title, description, potential, action, actionHref, actionOnClick, }: InsightCardProps): react.JSX.Element;
29
+ /**
30
+ * InsightCard — Figma [RDS] Content/InsightCard. A note from the system about the business: an alert, an
31
+ * opportunity or a tip, with what to do. Styles: insight-card.css.
32
+ */
33
+ declare function InsightCard({ type, title, description, potential, action, actionHref, actionOnClick, linkAs: LinkAs, titleAs: Title, className, ...rest }: InsightCardProps): react.JSX.Element;
18
34
 
19
35
  export { InsightCard, type InsightCardProps, type InsightCardType };
@@ -1,37 +1,52 @@
1
- import "../chunk-ORMEWXMH.js";
1
+ import {
2
+ __objRest,
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
2
6
  import { jsx, jsxs } from "react/jsx-runtime";
3
- const TYPE_VARS = {
4
- alert: { card: "[border-color:var(--insight-alert-border)] [background:var(--insight-alert-bg)]", badge: "[background:var(--insight-alert-badge-bg)] [color:var(--insight-alert-badge-text)]" },
5
- opportunity: { card: "[border-color:var(--insight-opportunity-border)] [background:var(--insight-opportunity-bg)]", badge: "[background:var(--insight-opportunity-badge-bg)] [color:var(--insight-opportunity-badge-text)]" },
6
- tip: { card: "[border-color:var(--insight-tip-border)] [background:var(--insight-tip-bg)]", badge: "[background:var(--insight-tip-badge-bg)] [color:var(--insight-tip-badge-text)]" }
7
- };
8
- const TYPE_LABELS = {
7
+ const LABELS = {
9
8
  alert: "Aten\xE7\xE3o",
10
9
  opportunity: "Oportunidade",
11
10
  tip: "Dica"
12
11
  };
13
- function InsightCard({
14
- type,
15
- title,
16
- description,
17
- potential,
18
- action,
19
- actionHref,
20
- actionOnClick
21
- }) {
22
- const v = TYPE_VARS[type];
23
- const ctaClass = "shrink-0 rounded-(--radius-card) px-3 py-1.5 text-caption font-medium whitespace-nowrap shadow-sm transition-colors [background:var(--insight-action-bg)] [border:1px_solid_var(--insight-action-border)] [color:var(--insight-action-text)] hover:[background:var(--insight-action-bg-hover)]";
24
- return /* @__PURE__ */ jsx("div", { className: ["rounded-(--radius-card) border p-4", v.card].join(" "), children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
25
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
26
- /* @__PURE__ */ jsx("span", { className: ["inline-block text-[10px] font-semibold uppercase tracking-wide rounded px-1.5 py-0.5", v.badge].join(" "), children: TYPE_LABELS[type] }),
27
- /* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex items-baseline gap-2 flex-wrap", children: [
28
- /* @__PURE__ */ jsx("p", { className: "font-semibold text-label leading-tight [color:var(--insight-title-color)]", children: title }),
29
- potential && /* @__PURE__ */ jsx("span", { className: "text-caption font-medium tabular-nums [color:var(--insight-potential-color)]", children: potential })
12
+ function DefaultLink({ href, className, children }) {
13
+ return /* @__PURE__ */ jsx("a", { href, className, children });
14
+ }
15
+ function InsightCard(_a) {
16
+ var _b = _a, {
17
+ type,
18
+ title,
19
+ description,
20
+ potential,
21
+ action,
22
+ actionHref,
23
+ actionOnClick,
24
+ linkAs: LinkAs = DefaultLink,
25
+ titleAs: Title = "h3",
26
+ className
27
+ } = _b, rest = __objRest(_b, [
28
+ "type",
29
+ "title",
30
+ "description",
31
+ "potential",
32
+ "action",
33
+ "actionHref",
34
+ "actionOnClick",
35
+ "linkAs",
36
+ "titleAs",
37
+ "className"
38
+ ]);
39
+ return /* @__PURE__ */ jsxs("article", __spreadProps(__spreadValues({}, rest), { className: ["rds-insight-card", `rds-insight-card--${type}`, className].filter(Boolean).join(" "), children: [
40
+ /* @__PURE__ */ jsxs("div", { className: "rds-insight-card__body", children: [
41
+ /* @__PURE__ */ jsx("span", { className: "rds-insight-card__badge", children: LABELS[type] }),
42
+ /* @__PURE__ */ jsxs("div", { className: "rds-insight-card__head", children: [
43
+ /* @__PURE__ */ jsx(Title, { className: "rds-insight-card__title", children: title }),
44
+ potential && /* @__PURE__ */ jsx("span", { className: "rds-insight-card__potential", children: potential })
30
45
  ] }),
31
- /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-caption [color:var(--insight-description-color)]", children: description })
46
+ /* @__PURE__ */ jsx("p", { className: "rds-insight-card__description", children: description })
32
47
  ] }),
33
- action && (actionOnClick ? /* @__PURE__ */ jsx("button", { type: "button", onClick: actionOnClick, className: ctaClass, children: action }) : actionHref ? /* @__PURE__ */ jsx("a", { href: actionHref, className: ctaClass, children: action }) : null)
34
- ] }) });
48
+ action && (actionOnClick ? /* @__PURE__ */ jsx("button", { type: "button", className: "rds-insight-card__action", onClick: actionOnClick, children: action }) : actionHref ? /* @__PURE__ */ jsx(LinkAs, { href: actionHref, className: "rds-insight-card__action", children: action }) : null)
49
+ ] }));
35
50
  }
36
51
  export {
37
52
  InsightCard
@@ -0,0 +1,3 @@
1
+ declare function announce(message: string): void;
2
+
3
+ export { announce };
@@ -0,0 +1,20 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ let region = null;
3
+ function announce(message) {
4
+ if (typeof document === "undefined") return;
5
+ if (!region || !region.isConnected) {
6
+ region = document.createElement("div");
7
+ region.setAttribute("role", "status");
8
+ region.className = "rds-visually-hidden";
9
+ region.dataset.rdsAnnouncer = "";
10
+ document.body.append(region);
11
+ }
12
+ region.textContent = "";
13
+ const target = region;
14
+ setTimeout(() => {
15
+ target.textContent = message;
16
+ }, 50);
17
+ }
18
+ export {
19
+ announce
20
+ };
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface BlockHeadingProps {
5
+ /** A short label above the title (Figma: `eyebrow`). */
6
+ eyebrow?: ReactNode;
7
+ title: ReactNode;
8
+ description?: ReactNode;
9
+ /** The title's id: it names the block's <section>. */
10
+ titleId: string;
11
+ }
12
+ declare function BlockHeading({ eyebrow, title, description, titleId }: BlockHeadingProps): react.JSX.Element;
13
+ declare const cx: (...names: (string | false | undefined)[]) => string;
14
+
15
+ export { BlockHeading, type BlockHeadingProps, cx };
@@ -0,0 +1,14 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ function BlockHeading({ eyebrow, title, description, titleId }) {
4
+ return /* @__PURE__ */ jsxs("div", { className: "rds-block__heading", children: [
5
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "rds-block__eyebrow", children: eyebrow }),
6
+ /* @__PURE__ */ jsx("h2", { id: titleId, className: "rds-block__title", children: title }),
7
+ description && /* @__PURE__ */ jsx("p", { className: "rds-block__description", children: description })
8
+ ] });
9
+ }
10
+ const cx = (...names) => names.filter(Boolean).join(" ");
11
+ export {
12
+ BlockHeading,
13
+ cx
14
+ };
@@ -0,0 +1,23 @@
1
+ import * as react from 'react';
2
+ import { MouseEventHandler, MouseEvent } from 'react';
3
+
4
+ type ButtonTone = 'action' | 'neutral' | 'danger' | 'inverse';
5
+ /** Figma calls this property `style`; here it is `variant` because `style` belongs to React. */
6
+ type ButtonVariant = 'fill' | 'outline' | 'ghost';
7
+ /**
8
+ * The height: sm 36, md 44 (the default), lg 52. The touch target is 44 in every size: on sm, an invisible layer
9
+ * extends it to 44 under a coarse pointer (button.css).
10
+ */
11
+ type ButtonSize = 'sm' | 'md' | 'lg';
12
+ declare function buttonClassName(tone: ButtonTone, variant: ButtonVariant, size: ButtonSize, extra?: string): string;
13
+ /**
14
+ * With aria-disabled the element still fires click (implicit form submit on a button, navigation
15
+ * on a link rendered with asChild); cancel it here.
16
+ */
17
+ declare function blockWhenDisabled<T extends HTMLElement>(disabled: boolean | undefined, onClick?: MouseEventHandler<T>): (event: MouseEvent<T>) => void;
18
+ /** Says `label` through the page's live region when loading starts. */
19
+ declare function useLoadingAnnouncement(loading: boolean | undefined, label: string): void;
20
+ /** The loader: a turning arc, drawn inline so the button needs no icon library. */
21
+ declare function Loader(): react.JSX.Element;
22
+
23
+ export { type ButtonSize, type ButtonTone, type ButtonVariant, Loader, blockWhenDisabled, buttonClassName, useLoadingAnnouncement };
@@ -0,0 +1,30 @@
1
+ import "../../chunk-ORMEWXMH.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect } from "react";
4
+ import { announce } from "./announce.js";
5
+ function buttonClassName(tone, variant, size, extra) {
6
+ return ["rds-button", `rds-button--${tone}`, `rds-button--${variant}`, `rds-button--${size}`, extra].filter(Boolean).join(" ");
7
+ }
8
+ function blockWhenDisabled(disabled, onClick) {
9
+ return (event) => {
10
+ if (disabled) {
11
+ event.preventDefault();
12
+ return;
13
+ }
14
+ onClick == null ? void 0 : onClick(event);
15
+ };
16
+ }
17
+ function useLoadingAnnouncement(loading, label) {
18
+ useEffect(() => {
19
+ if (loading) announce(label);
20
+ }, [loading, label]);
21
+ }
22
+ function Loader() {
23
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) });
24
+ }
25
+ export {
26
+ Loader,
27
+ blockWhenDisabled,
28
+ buttonClassName,
29
+ useLoadingAnnouncement
30
+ };
@@ -0,0 +1,52 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, ReactNode } from 'react';
3
+
4
+ /** row: the line with the radio; tile: a grid cell, icon on top; preview: an image on top. */
5
+ type ChoiceCardLayout = 'row' | 'tile' | 'preview';
6
+ interface ChoiceCardProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'checked' | 'onSelect'> {
7
+ /** The option (Figma: `label`). It is the radio's accessible name. */
8
+ children: ReactNode;
9
+ /** What choosing it means (Figma: `hasDescription` + `description`). */
10
+ description?: ReactNode;
11
+ /** An inline SVG in a 36 square (Figma: `hasIcon` + `icon`). Decorative. Not drawn in `preview`. */
12
+ icon?: ReactNode;
13
+ /** Chosen (Figma: `selected`). Inside a ChoiceCardGroup the group decides; alone, pass it with `onSelect`. */
14
+ selected?: boolean;
15
+ /** Called when the person chooses this card (click, Space, or an arrow key from a sibling with the same name). */
16
+ onSelect?: () => void;
17
+ /** The value inside a ChoiceCardGroup. */
18
+ value?: string;
19
+ /**
20
+ * Figma: `layout`. row (the default): the line with the radio. tile: a grid cell, the icon on top and a check in
21
+ * the corner when chosen. preview: an image on top with the check in its corner. Inside a ChoiceCardGroup the
22
+ * group's layout is the default.
23
+ */
24
+ layout?: ChoiceCardLayout;
25
+ /** The picture on top in `preview` (a mockup, a swatch, an <img>). Decorative; without it, a placeholder icon. */
26
+ preview?: ReactNode;
27
+ }
28
+ declare function ChoiceCardControl({ control, children, description, icon, selected, onSelect, value, disabled, className, onChange, name, layout, preview, ...rest }: ChoiceCardProps & {
29
+ control: 'radio' | 'checkbox';
30
+ }): react.JSX.Element;
31
+ interface ChoiceCardGroupProps {
32
+ /** What is being chosen. Required: it names the group (a visible <legend>). */
33
+ legend: ReactNode;
34
+ /** The ChoiceCards, each with a `value`. */
35
+ children: ReactNode;
36
+ value?: string;
37
+ defaultValue?: string;
38
+ onValueChange?: (value: string) => void;
39
+ /** The form field name. By default a generated one. */
40
+ name?: string;
41
+ disabled?: boolean;
42
+ /**
43
+ * The cards' layout. row stacks them; tile and preview lay them in a grid (cells of at least 160 and 240) and are
44
+ * every card's default.
45
+ */
46
+ layout?: ChoiceCardLayout;
47
+ className?: string;
48
+ }
49
+ /** A set of ChoiceCards where one is chosen at a time: a <fieldset> of native radios with a legend. */
50
+ declare function ChoiceCardGroup({ legend, children, value, defaultValue, onValueChange, name, disabled, layout, className }: ChoiceCardGroupProps): react.JSX.Element;
51
+
52
+ export { ChoiceCardControl, ChoiceCardGroup, type ChoiceCardGroupProps, type ChoiceCardLayout, type ChoiceCardProps };