@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
@@ -4,230 +4,212 @@ import {
4
4
  __spreadValues
5
5
  } from "../chunk-ORMEWXMH.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
- import { forwardRef, useState, useRef, useEffect, useImperativeHandle } from "react";
8
- import { Clock, ChevronUp, ChevronDown, X } from "lucide-react";
9
- import { Popover } from "./popover.js";
10
- const SIZE_CLASS = {
11
- sm: "h-8 text-caption px-2.5",
12
- md: "h-10 text-label px-3"
7
+ import { useMemo, useRef, useState } from "react";
8
+ import { FieldShell, useFieldIds, warnIfUnlabelled } from "./internal/field.js";
9
+ import { ClockIcon } from "./internal/icons.js";
10
+ import { OptionContent } from "./internal/option-content.js";
11
+ import { useListbox } from "./internal/use-listbox.js";
12
+ const toMinutes = (time) => {
13
+ const [h, m] = time.split(":").map(Number);
14
+ return h * 60 + m;
13
15
  };
14
- function parseTime(t) {
15
- if (!t) return null;
16
- const match = t.match(/^(\d{1,2}):(\d{2})$/);
16
+ const fromMinutes = (minutes) => `${String(Math.floor(minutes / 60)).padStart(2, "0")}:${String(minutes % 60).padStart(2, "0")}`;
17
+ function parseTime(text) {
18
+ const match = text.trim().toLowerCase().match(/^(\d{1,2}):?(\d{2})\s*(am|pm)?$/);
17
19
  if (!match) return null;
18
- const h = parseInt(match[1], 10);
19
- const m = parseInt(match[2], 10);
20
- if (h < 0 || h > 23 || m < 0 || m > 59) return null;
21
- return { h, m };
22
- }
23
- function formatTime(h, m, format) {
24
- const mm = String(m).padStart(2, "0");
25
- if (format === "24h") return `${String(h).padStart(2, "0")}:${mm}`;
26
- const period = h >= 12 ? "PM" : "AM";
27
- const h12 = h === 0 ? 12 : h > 12 ? h - 12 : h;
28
- return `${String(h12).padStart(2, "0")}:${mm} ${period}`;
29
- }
30
- function clampMinute(m, step) {
31
- return Math.round(m / step) * step % 60;
20
+ let h = Number(match[1]);
21
+ const m = Number(match[2]);
22
+ const period = match[3];
23
+ if (period) {
24
+ if (h < 1 || h > 12) return null;
25
+ h = h % 12 + (period === "pm" ? 12 : 0);
26
+ }
27
+ if (h > 23 || m > 59) return null;
28
+ return fromMinutes(h * 60 + m);
32
29
  }
33
- function compareTime(a, b) {
34
- const pa = parseTime(a);
35
- const pb = parseTime(b);
36
- return pa.h * 60 + pa.m - (pb.h * 60 + pb.m);
30
+ function formatTime(time, format = "24h") {
31
+ if (format === "24h") return time;
32
+ const [h, m] = time.split(":").map(Number);
33
+ const h12 = h % 12 === 0 ? 12 : h % 12;
34
+ return `${String(h12).padStart(2, "0")}:${String(m).padStart(2, "0")} ${h >= 12 ? "PM" : "AM"}`;
37
35
  }
38
- const TimePicker = forwardRef(function TimePicker2({
36
+ const mask24 = (text) => {
37
+ const digits = text.replace(/\D/g, "").slice(0, 4);
38
+ return digits.length > 2 ? `${digits.slice(0, 2)}:${digits.slice(2)}` : digits;
39
+ };
40
+ function TimePicker({
41
+ label,
42
+ labelPosition,
43
+ hint,
44
+ error,
45
+ errorMessage,
46
+ required,
39
47
  value,
48
+ defaultValue = null,
40
49
  onChange,
41
- step = 1,
42
- format = "24h",
43
- placeholder = "HH:mm",
44
- size = "md",
45
- width = "full",
46
- disabled = false,
50
+ step = 30,
47
51
  min,
48
52
  max,
49
- className = "",
50
- "aria-label": ariaLabel
51
- }, ref) {
53
+ format = "24h",
54
+ placeholder,
55
+ invalidMessage = "Essa hora n\xE3o existe. Use HH:mm.",
56
+ name,
57
+ disabled,
58
+ id,
59
+ className,
60
+ style,
61
+ "aria-label": ariaLabel,
62
+ "aria-labelledby": ariaLabelledBy
63
+ }) {
64
+ warnIfUnlabelled("TimePicker", label, ariaLabel, ariaLabelledBy);
65
+ const [own, setOwn] = useState(defaultValue);
66
+ const time = value !== void 0 ? value : own;
67
+ const [text, setText] = useState("");
68
+ const [editing, setEditing] = useState(false);
52
69
  const [open, setOpen] = useState(false);
53
- const [draft, setDraft] = useState(() => {
54
- const p = parseTime(value);
55
- return p != null ? p : { h: 9, m: 0 };
70
+ const input = useRef(null);
71
+ const low = min ? toMinutes(min) : 0;
72
+ const high = max ? toMinutes(max) : 23 * 60 + 59;
73
+ const inRange = (t) => toMinutes(t) >= low && toMinutes(t) <= high;
74
+ const times = useMemo(() => {
75
+ const list = [];
76
+ const every = Math.max(1, Math.round(step));
77
+ for (let m = low; m <= high; m += every) list.push({ value: fromMinutes(m), label: formatTime(fromMinutes(m), format) });
78
+ return list;
79
+ }, [low, high, step, format]);
80
+ const shown = editing ? text : time ? formatTime(time, format) : "";
81
+ const parsed = parseTime(shown);
82
+ const complete = format === "24h" ? shown.length === 5 : /\s*(am|pm)$/i.test(shown);
83
+ const wrong = editing && complete && (!parsed || !inRange(parsed));
84
+ const message = wrong ? invalidMessage : errorMessage;
85
+ const { controlId, hintId, errorId, invalid, describedBy } = useFieldIds(id, hint, error || wrong, message);
86
+ const floating = labelPosition === "floating" && Boolean(label);
87
+ function commit(next) {
88
+ if (value === void 0) setOwn(next);
89
+ onChange == null ? void 0 : onChange(next);
90
+ }
91
+ const { listId, setActive, onKeyDown: listKeyDown, controlProps, listProps, optionProps } = useListbox({
92
+ items: times,
93
+ showing: open,
94
+ selected: time ? [time] : [],
95
+ onOpen: () => setOpen(true),
96
+ onChoose: (row) => {
97
+ commit(row.value);
98
+ setEditing(false);
99
+ setOpen(false);
100
+ setActive(-1);
101
+ }
56
102
  });
57
- const triggerRef = useRef(null);
58
- const draftRef = useRef(draft);
59
- draftRef.current = draft;
60
- useImperativeHandle(ref, () => triggerRef.current);
61
- useEffect(() => {
62
- if (open) {
63
- const p = parseTime(value);
64
- if (p) setDraft(p);
103
+ function openList() {
104
+ if (open || disabled) return;
105
+ setOpen(true);
106
+ const target = time ? toMinutes(time) : -1;
107
+ const index = target < 0 ? -1 : times.findIndex((t) => toMinutes(t.value) >= target);
108
+ setActive(index);
109
+ if (index >= 0) {
110
+ requestAnimationFrame(() => {
111
+ var _a, _b;
112
+ return (_b = (_a = document.getElementById(listId)) == null ? void 0 : _a.children[index]) == null ? void 0 : _b.scrollIntoView({ block: "nearest" });
113
+ });
65
114
  }
66
- }, [open, value]);
67
- function commit() {
68
- const d = draftRef.current;
69
- const t = `${String(d.h).padStart(2, "0")}:${String(d.m).padStart(2, "0")}`;
70
- if (min && compareTime(t, min) < 0) return;
71
- if (max && compareTime(t, max) > 0) return;
72
- onChange(t);
73
115
  }
74
- function adjust(field, delta) {
75
- setDraft((d) => {
76
- if (field === "h") {
77
- let h = d.h + delta;
78
- if (h < 0) h = 23;
79
- if (h > 23) h = 0;
80
- return __spreadProps(__spreadValues({}, d), { h });
81
- }
82
- let m = d.m + delta * step;
83
- if (m < 0) m = 60 - step;
84
- if (m >= 60) m = 0;
85
- return __spreadProps(__spreadValues({}, d), { m: clampMinute(m, step) });
86
- });
116
+ function close() {
117
+ setOpen(false);
118
+ setActive(-1);
87
119
  }
88
- function handleClear(e) {
89
- var _a;
90
- e.stopPropagation();
91
- onChange(null);
92
- (_a = triggerRef.current) == null ? void 0 : _a.focus();
120
+ function keyDown(event) {
121
+ if (!open && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
122
+ event.preventDefault();
123
+ openList();
124
+ return;
125
+ }
126
+ if (listKeyDown(event)) return;
127
+ if (event.key === "Escape" && open) {
128
+ event.preventDefault();
129
+ close();
130
+ }
93
131
  }
94
- const display = (() => {
95
- const p = parseTime(value);
96
- if (!p) return "";
97
- return formatTime(p.h, p.m, format);
98
- })();
99
- const dialog = /* @__PURE__ */ jsxs(
100
- "div",
132
+ return /* @__PURE__ */ jsxs(
133
+ FieldShell,
101
134
  {
102
- role: "dialog",
103
- "aria-label": "Seletor de hora",
104
- className: "rounded-(--radius-control) border border-stroke-default bg-surface-default shadow-lg p-3",
135
+ kind: "rds-time-picker",
136
+ controlId,
137
+ hintId,
138
+ errorId,
139
+ label,
140
+ labelPosition,
141
+ hint,
142
+ errorMessage: message,
143
+ invalid,
144
+ required,
145
+ disabled,
146
+ className,
147
+ style,
105
148
  children: [
106
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
107
- /* @__PURE__ */ jsx(
108
- Spinner,
109
- {
110
- label: "Hora",
111
- value: String(draft.h).padStart(2, "0"),
112
- onUp: () => adjust("h", 1),
113
- onDown: () => adjust("h", -1)
114
- }
115
- ),
116
- /* @__PURE__ */ jsx("span", { className: "text-heading-sm font-semibold text-fg-muted", children: ":" }),
117
- /* @__PURE__ */ jsx(
118
- Spinner,
119
- {
120
- label: "Minuto",
121
- value: String(draft.m).padStart(2, "0"),
122
- onUp: () => adjust("m", 1),
123
- onDown: () => adjust("m", -1)
124
- }
125
- ),
126
- format === "12h" && /* @__PURE__ */ jsx("span", { className: "text-caption font-medium text-fg-secondary ml-1", children: draft.h >= 12 ? "PM" : "AM" })
127
- ] }),
128
- /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2 mt-3", children: [
129
- /* @__PURE__ */ jsx(
130
- "button",
131
- {
132
- type: "button",
133
- onClick: () => setOpen(false),
134
- className: "text-caption text-fg-muted hover:text-fg-primary transition-colors px-2 py-1",
135
- children: "Cancelar"
136
- }
137
- ),
138
- /* @__PURE__ */ jsx(
139
- "button",
140
- {
141
- type: "button",
142
- onClick: () => {
143
- commit();
144
- setOpen(false);
145
- },
146
- className: "text-caption font-medium bg-brand-primary text-brand-on-primary px-3 py-1 rounded transition-colors hover:bg-brand-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus",
147
- children: "OK"
149
+ /* @__PURE__ */ jsx(
150
+ "input",
151
+ __spreadProps(__spreadValues({
152
+ ref: input,
153
+ id: controlId,
154
+ className: "rds-field__control",
155
+ type: "text",
156
+ role: "combobox",
157
+ inputMode: format === "24h" ? "numeric" : "text",
158
+ autoComplete: "off",
159
+ "aria-autocomplete": "none"
160
+ }, controlProps), {
161
+ "aria-label": ariaLabel,
162
+ "aria-labelledby": ariaLabelledBy,
163
+ "aria-invalid": invalid || void 0,
164
+ "aria-describedby": describedBy,
165
+ "aria-required": required || void 0,
166
+ required,
167
+ disabled,
168
+ placeholder: floating ? " " : placeholder != null ? placeholder : format === "24h" ? "HH:mm" : "hh:mm AM",
169
+ maxLength: format === "24h" ? 5 : 8,
170
+ value: shown,
171
+ onChange: (event) => {
172
+ const next = format === "24h" ? mask24(event.target.value) : event.target.value;
173
+ setText(next);
174
+ setEditing(true);
175
+ if (next === "") commit(null);
176
+ const typed = parseTime(next);
177
+ const done = format === "24h" ? next.length === 5 : /\s*(am|pm)$/i.test(next);
178
+ if (typed && done && inRange(typed)) commit(typed);
179
+ },
180
+ onClick: () => open ? close() : openList(),
181
+ onKeyDown: keyDown,
182
+ onBlur: () => {
183
+ close();
184
+ const typed = parseTime(text);
185
+ if (text === "" || typed && inRange(typed)) setEditing(false);
148
186
  }
149
- )
150
- ] })
151
- ]
152
- }
153
- );
154
- return /* @__PURE__ */ jsxs("div", { className: ["relative", width === "full" ? "block w-full" : "inline-block", className].join(" "), children: [
155
- /* @__PURE__ */ jsx(
156
- Popover,
157
- {
158
- trigger: /* @__PURE__ */ jsxs(
159
- "button",
187
+ })
188
+ ),
189
+ /* @__PURE__ */ jsx(
190
+ "span",
160
191
  {
161
- ref: triggerRef,
162
- type: "button",
163
- onClick: (e) => {
164
- e.stopPropagation();
165
- if (!disabled) setOpen((o) => !o);
192
+ className: "rds-field__icon rds-time-picker__clock",
193
+ "aria-hidden": "true",
194
+ onMouseDown: (event) => {
195
+ var _a;
196
+ event.preventDefault();
197
+ if (disabled) return;
198
+ (_a = input.current) == null ? void 0 : _a.focus();
199
+ if (open) close();
200
+ else openList();
166
201
  },
167
- disabled,
168
- "aria-label": ariaLabel != null ? ariaLabel : "Selecionar hora",
169
- "aria-haspopup": "dialog",
170
- "aria-expanded": open,
171
- className: [
172
- "w-full flex items-center gap-2 rounded-(--radius-control) border border-stroke-default bg-surface-default",
173
- "transition-colors focus:outline-none focus:border-stroke-focus focus:ring-2 focus:ring-stroke-focus/20",
174
- "disabled:opacity-50 disabled:cursor-not-allowed",
175
- value ? "pr-7" : "",
176
- SIZE_CLASS[size]
177
- ].join(" "),
178
- children: [
179
- /* @__PURE__ */ jsx(Clock, { size: 16, className: "text-fg-muted shrink-0" }),
180
- /* @__PURE__ */ jsx("span", { className: ["flex-1 text-left truncate", display ? "text-fg-primary" : "text-fg-placeholder"].join(" "), children: display || placeholder })
181
- ]
202
+ children: /* @__PURE__ */ jsx(ClockIcon, {})
182
203
  }
183
204
  ),
184
- triggerClassName: width === "full" ? "block w-full" : "inline-block",
185
- placement: "bottom-start",
186
- offset: 4,
187
- open,
188
- onOpenChange: (v) => {
189
- if (!disabled) setOpen(v);
190
- },
191
- children: () => dialog
192
- }
193
- ),
194
- value && !disabled && /* @__PURE__ */ jsx(
195
- "button",
196
- {
197
- type: "button",
198
- onClick: handleClear,
199
- "aria-label": "Limpar hora",
200
- className: "absolute right-2 top-1/2 -translate-y-1/2 text-fg-muted hover:text-fg-primary p-0.5 rounded transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stroke-focus",
201
- children: /* @__PURE__ */ jsx(X, { size: 14 })
202
- }
203
- )
204
- ] });
205
- });
206
- function Spinner({ label, value, onUp, onDown }) {
207
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", role: "group", "aria-label": label, children: [
208
- /* @__PURE__ */ jsx(
209
- "button",
210
- {
211
- type: "button",
212
- onClick: onUp,
213
- "aria-label": `Aumentar ${label.toLowerCase()}`,
214
- className: "p-0.5 rounded hover:bg-surface-raised text-fg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stroke-focus",
215
- children: /* @__PURE__ */ jsx(ChevronUp, { size: 16 })
216
- }
217
- ),
218
- /* @__PURE__ */ jsx("div", { className: "px-2 py-1 text-heading-lg font-mono font-semibold text-fg-primary tabular-nums select-none min-w-[3ch] text-center", children: value }),
219
- /* @__PURE__ */ jsx(
220
- "button",
221
- {
222
- type: "button",
223
- onClick: onDown,
224
- "aria-label": `Diminuir ${label.toLowerCase()}`,
225
- className: "p-0.5 rounded hover:bg-surface-raised text-fg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stroke-focus",
226
- children: /* @__PURE__ */ jsx(ChevronDown, { size: 16 })
227
- }
228
- )
229
- ] });
205
+ name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: time != null ? time : "" }),
206
+ open && /* @__PURE__ */ jsx("ul", __spreadProps(__spreadValues({}, listProps), { "aria-label": typeof label === "string" ? label : ariaLabel != null ? ariaLabel : "Hor\xE1rios", className: "rds-listbox rds-time-picker__list", children: times.map((row, index) => /* @__PURE__ */ jsx("li", __spreadProps(__spreadValues({}, optionProps(row, index)), { className: "rds-listbox__option", children: /* @__PURE__ */ jsx(OptionContent, { selected: row.value === time, children: row.label }) }), row.value)) }))
207
+ ]
208
+ }
209
+ );
230
210
  }
231
211
  export {
232
- TimePicker
212
+ TimePicker,
213
+ formatTime,
214
+ parseTime
233
215
  };
@@ -0,0 +1,63 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ type ToastTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
5
+ /** Figma calls this property `style`: outline (white with a border, the default), soft (light plate), fill (full plate). */
6
+ type ToastVariant = 'outline' | 'soft' | 'fill';
7
+ interface ToastOptions {
8
+ /** What happened, in a few words (Figma: `title`). */
9
+ title: ReactNode;
10
+ /** The detail (Figma: `showDescription` + `description`). */
11
+ description?: ReactNode;
12
+ /** neutral for a plain confirmation. danger is announced at once (assertive); the others politely. */
13
+ tone?: ToastTone;
14
+ variant?: ToastVariant;
15
+ /** The tone's icon (Figma: `showIcon`). Decorative. */
16
+ showIcon?: boolean;
17
+ /** One action (Figma: `showAction`): "Desfazer", "Ver". With an action it stays at least 6 s. */
18
+ action?: {
19
+ label: string;
20
+ onClick: () => void;
21
+ };
22
+ /** ms on screen. Default 5 s, 6 s with an action. It pauses while the mouse or the focus is on it. */
23
+ duration?: number;
24
+ /** Give the same id to replace a toast that is on screen instead of stacking another one. */
25
+ id?: string;
26
+ }
27
+ declare const toastClassName: (tone?: ToastTone, variant?: ToastVariant, extra?: string) => string;
28
+ interface ToastViewProps extends Omit<ToastOptions, 'duration' | 'id'> {
29
+ /** Called by the ×. */
30
+ onClose?: () => void;
31
+ /** The ×'s accessible name. */
32
+ closeLabel?: string;
33
+ className?: string;
34
+ }
35
+ /**
36
+ * ToastView — the toast's drawing alone, outside the Toaster: for documentation and static previews. In the app,
37
+ * show toasts with `toast()` (or `useToast()`) and mount one `<Toaster />`.
38
+ */
39
+ declare function ToastView({ title, description, tone, variant, showIcon, action, onClose, closeLabel, className, }: ToastViewProps): react.JSX.Element;
40
+ interface ToastFn {
41
+ /** Shows a toast and returns its id. Needs one `<Toaster />` mounted on the page. */
42
+ (options: ToastOptions): string;
43
+ /** Closes the toast with that id, or every toast. */
44
+ dismiss: (id?: string) => void;
45
+ }
46
+ /** Shows a toast from anywhere (an event handler, a mutation's onSuccess). One `<Toaster />` must be mounted. */
47
+ declare const toast: ToastFn;
48
+ /** The same `toast` function, as a hook, for components that prefer to receive it. */
49
+ declare function useToast(): ToastFn;
50
+ interface ToasterProps {
51
+ /** The region's name, said with the F8 shortcut that takes the focus to it. */
52
+ label?: string;
53
+ /** The app, when the Toaster wraps it. It can also be mounted alone, once, anywhere on the page. */
54
+ children?: ReactNode;
55
+ }
56
+ /**
57
+ * Toaster — the region where the toasts of the Figma [RDS] Feedback/Toast appear (Radix Toast): the bottom-right
58
+ * corner, up to three at a time (a fourth pushes the oldest out), each one announced in a live region (danger
59
+ * assertively, the others politely). F8 takes the focus to the region; swiping right dismisses. Styles: toast.css.
60
+ */
61
+ declare function Toaster({ label, children }: ToasterProps): react.JSX.Element;
62
+
63
+ export { type ToastFn, type ToastOptions, type ToastTone, type ToastVariant, ToastView, type ToastViewProps, Toaster, type ToasterProps, toast, toastClassName, useToast };
@@ -0,0 +1,132 @@
1
+ "use client";
2
+ import {
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ import { useCallback, useEffect, useState } from "react";
8
+ import * as ToastPrimitive from "@radix-ui/react-toast";
9
+ import { Button } from "./button.js";
10
+ import { IconButton } from "./icon-button.js";
11
+ import { Tooltip } from "./tooltip.js";
12
+ import { AlertIcon, CircleCheckIcon, CloseIcon, InfoIcon, TriangleAlertIcon } from "./internal/icons.js";
13
+ const ICONS = {
14
+ neutral: InfoIcon,
15
+ info: InfoIcon,
16
+ success: CircleCheckIcon,
17
+ warning: TriangleAlertIcon,
18
+ danger: AlertIcon
19
+ };
20
+ const toastClassName = (tone = "neutral", variant = "outline", extra) => ["rds-toast", `rds-toast--${tone}-${variant}`, variant !== "outline" && "rds-toast--plate", extra].filter(Boolean).join(" ");
21
+ function ToastView({
22
+ title,
23
+ description,
24
+ tone = "neutral",
25
+ variant = "outline",
26
+ showIcon = true,
27
+ action,
28
+ onClose,
29
+ closeLabel = "Fechar",
30
+ className
31
+ }) {
32
+ return /* @__PURE__ */ jsxs("div", { className: toastClassName(tone, variant, className), children: [
33
+ /* @__PURE__ */ jsx(ToastBody, { tone, showIcon, title: /* @__PURE__ */ jsx("p", { className: "rds-toast__title", children: title }), children: description && /* @__PURE__ */ jsx("p", { className: "rds-toast__description", children: description }) }),
34
+ action && /* @__PURE__ */ jsx(Button, { tone: "neutral", variant: "ghost", className: "rds-toast__action", onClick: action.onClick, children: action.label }),
35
+ /* @__PURE__ */ jsx(Tooltip, { text: closeLabel, children: /* @__PURE__ */ jsx(IconButton, { icon: /* @__PURE__ */ jsx(CloseIcon, {}), label: closeLabel, tone: "neutral", variant: "ghost", className: "rds-toast__close", onClick: onClose }) })
36
+ ] });
37
+ }
38
+ function ToastBody({ tone, showIcon, title, children }) {
39
+ const Icon = ICONS[tone];
40
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
41
+ showIcon && /* @__PURE__ */ jsx("span", { className: "rds-toast__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Icon, {}) }),
42
+ /* @__PURE__ */ jsxs("div", { className: "rds-toast__content", children: [
43
+ title,
44
+ children
45
+ ] })
46
+ ] });
47
+ }
48
+ const listeners = /* @__PURE__ */ new Set();
49
+ let counter = 0;
50
+ const toast = Object.assign(
51
+ (options) => {
52
+ var _a;
53
+ counter += 1;
54
+ const key = (_a = options.id) != null ? _a : `rds-toast-${counter}`;
55
+ if (!listeners.size && process.env.NODE_ENV !== "production") {
56
+ console.warn("[@rojaostudio/ds] toast(): no <Toaster /> is mounted, so the toast is not shown.");
57
+ }
58
+ listeners.forEach((listener) => listener({ type: "show", item: __spreadProps(__spreadValues({}, options), { key, open: true }) }));
59
+ return key;
60
+ },
61
+ {
62
+ dismiss: (id) => listeners.forEach((listener) => listener({ type: "dismiss", id }))
63
+ }
64
+ );
65
+ function useToast() {
66
+ return toast;
67
+ }
68
+ const MAX_VISIBLE = 3;
69
+ function Toaster({ label = "Notifica\xE7\xF5es", children }) {
70
+ const [items, setItems] = useState([]);
71
+ useEffect(() => {
72
+ const listener = (event) => {
73
+ if (event.type === "show") {
74
+ setItems((current) => {
75
+ const rest = current.filter((item) => item.key !== event.item.key);
76
+ const open = rest.filter((item) => item.open);
77
+ const drop = open.length >= MAX_VISIBLE ? open[0].key : null;
78
+ return [...rest.map((item) => item.key === drop ? __spreadProps(__spreadValues({}, item), { open: false }) : item), event.item];
79
+ });
80
+ } else {
81
+ setItems(
82
+ (current) => current.map((item) => event.id === void 0 || item.key === event.id ? __spreadProps(__spreadValues({}, item), { open: false }) : item)
83
+ );
84
+ }
85
+ };
86
+ listeners.add(listener);
87
+ return () => {
88
+ listeners.delete(listener);
89
+ };
90
+ }, []);
91
+ const close = useCallback((key) => {
92
+ setItems((current) => current.map((item) => item.key === key ? __spreadProps(__spreadValues({}, item), { open: false }) : item));
93
+ window.setTimeout(() => setItems((current) => current.filter((item) => item.key !== key || item.open)), 300);
94
+ }, []);
95
+ return /* @__PURE__ */ jsxs(ToastPrimitive.Provider, { label, swipeDirection: "right", children: [
96
+ children,
97
+ items.map(({ key, open, title, description, tone = "neutral", variant = "outline", showIcon = true, action, duration }) => /* @__PURE__ */ jsxs(
98
+ ToastPrimitive.Root,
99
+ {
100
+ open,
101
+ onOpenChange: (next) => {
102
+ if (!next) close(key);
103
+ },
104
+ type: tone === "danger" ? "foreground" : "background",
105
+ duration: duration != null ? duration : action ? 6e3 : 5e3,
106
+ className: toastClassName(tone, variant),
107
+ children: [
108
+ /* @__PURE__ */ jsx(
109
+ ToastBody,
110
+ {
111
+ tone,
112
+ showIcon,
113
+ title: /* @__PURE__ */ jsx(ToastPrimitive.Title, { className: "rds-toast__title", children: title }),
114
+ children: description && /* @__PURE__ */ jsx(ToastPrimitive.Description, { className: "rds-toast__description", children: description })
115
+ }
116
+ ),
117
+ action && /* @__PURE__ */ jsx(ToastPrimitive.Action, { altText: action.label, asChild: true, children: /* @__PURE__ */ jsx(Button, { tone: "neutral", variant: "ghost", className: "rds-toast__action", onClick: action.onClick, children: action.label }) }),
118
+ /* @__PURE__ */ jsx(Tooltip, { text: "Fechar", children: /* @__PURE__ */ jsx(ToastPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { icon: /* @__PURE__ */ jsx(CloseIcon, {}), label: "Fechar", tone: "neutral", variant: "ghost", className: "rds-toast__close" }) }) })
119
+ ]
120
+ },
121
+ key
122
+ )),
123
+ /* @__PURE__ */ jsx(ToastPrimitive.Viewport, { className: "rds-toast-viewport", label: `${label} ({hotkey})` })
124
+ ] });
125
+ }
126
+ export {
127
+ ToastView,
128
+ Toaster,
129
+ toast,
130
+ toastClassName,
131
+ useToast
132
+ };
@@ -2,20 +2,30 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
4
  interface ToggleCardCompactProps {
5
+ /** An icon before the text (the Item's media). */
5
6
  icon?: ReactNode;
7
+ /** The setting it turns on (the Item's title and the Switch's name). */
6
8
  label: string;
7
- /** Texto mostrado quando OFF. Substituído por `summary` quando ON. */
9
+ /** The line under the label while off. */
8
10
  description?: ReactNode;
9
- /** Texto mostrado quando ON (geralmente um resumo da config aplicada). */
11
+ /** The line under the label while on (a summary of what is set); it replaces `description`. */
10
12
  summary?: ReactNode;
11
13
  checked: boolean;
12
14
  onCheckedChange?: (checked: boolean) => void;
13
- /** Botão de edição (pencil). Só aparece quando ON. Use para abrir modal de config. */
15
+ /** Shows the pencil (an IconButton) while on: opens the setting's options (a Dialog). */
14
16
  onEdit?: () => void;
17
+ /** The pencil's accessible name and tooltip. */
15
18
  editLabel?: string;
16
- /** Hidden input name — quando presente, submete em forms nativos. */
19
+ /** Submits 'on' (or '') under this name with a native form, through a hidden input. */
17
20
  name?: string;
21
+ disabled?: boolean;
22
+ className?: string;
18
23
  }
19
- declare function ToggleCardCompact({ icon, label, description, summary, checked, onCheckedChange, onEdit, editLabel, name, }: ToggleCardCompactProps): react.JSX.Element;
24
+ /**
25
+ * ToggleCardCompact — a composition of the Item (outline), the Switch and the IconButton with its Tooltip: a
26
+ * setting in one row, its summary under the label while on and a pencil that opens its options. Styles:
27
+ * toggle-card-compact.css.
28
+ */
29
+ declare function ToggleCardCompact({ icon, label, description, summary, checked, onCheckedChange, onEdit, editLabel, name, disabled, className, }: ToggleCardCompactProps): react.JSX.Element;
20
30
 
21
31
  export { ToggleCardCompact, type ToggleCardCompactProps };