@ctrl-ui/react 0.8.7 → 0.8.8

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 (351) hide show
  1. package/dist/action-bar.d.ts +15 -7
  2. package/dist/action-bar.js +40 -20
  3. package/dist/activity.js +8 -16
  4. package/dist/audio-recorder.d.ts +14 -4
  5. package/dist/audio-recorder.js +82 -29
  6. package/dist/audio-visualizer.js +1 -1
  7. package/dist/blocks/coding-agent.js +39 -39
  8. package/dist/blocks/design-canvas-inspector.js +2 -2
  9. package/dist/blocks/design-canvas.d.ts +5 -1
  10. package/dist/blocks/design-canvas.js +200 -94
  11. package/dist/blocks/discussion.d.ts +28 -0
  12. package/dist/blocks/discussion.js +67 -0
  13. package/dist/blocks/file-explorer-data.d.ts +1 -0
  14. package/dist/blocks/file-explorer-data.js +4 -1
  15. package/dist/blocks/file-explorer.d.ts +9 -1
  16. package/dist/blocks/file-explorer.js +461 -192
  17. package/dist/blocks/settings.d.ts +2 -1
  18. package/dist/blocks/settings.js +102 -80
  19. package/dist/blocks/team-chat.d.ts +12 -0
  20. package/dist/blocks/team-chat.js +26 -0
  21. package/dist/blocks/theme-toggle.js +23 -31
  22. package/dist/chat-composer-attachment.d.ts +4 -1
  23. package/dist/chat-composer-attachment.js +35 -10
  24. package/dist/chat-composer-editor/extensions/mention.d.ts +5 -1
  25. package/dist/chat-composer-editor/extensions/mention.js +58 -27
  26. package/dist/chat-composer-editor/ghost.js +2 -4
  27. package/dist/chat-composer-editor/types.d.ts +5 -0
  28. package/dist/chat-composer-editor.d.ts +1 -1
  29. package/dist/chat-composer-editor.js +57 -30
  30. package/dist/chat-composer.d.ts +13 -32
  31. package/dist/chat-composer.js +53 -13
  32. package/dist/chat-layout.d.ts +19 -0
  33. package/dist/chat-layout.js +91 -40
  34. package/dist/chat-message/social.d.ts +26 -0
  35. package/dist/chat-message/social.js +122 -0
  36. package/dist/chat-message.d.ts +28 -29
  37. package/dist/chat-message.js +106 -25
  38. package/dist/context.d.ts +2 -2
  39. package/dist/context.js +39 -24
  40. package/dist/dynamic-notification-canvas-loop.d.ts +24 -0
  41. package/dist/dynamic-notification-canvas-loop.js +113 -0
  42. package/dist/dynamic-notification-glass.js +23 -114
  43. package/dist/dynamic-notification-liquid.js +14 -118
  44. package/dist/dynamic-notification.d.ts +16 -8
  45. package/dist/dynamic-notification.js +86 -23
  46. package/dist/email/email-brand.d.ts +7 -4
  47. package/dist/email/email-brand.js +9 -6
  48. package/dist/email/email-code.d.ts +3 -2
  49. package/dist/email/email-code.js +11 -9
  50. package/dist/email/email-footer.d.ts +5 -3
  51. package/dist/email/email-footer.js +11 -5
  52. package/dist/email/email.d.ts +31 -9
  53. package/dist/email/email.js +50 -26
  54. package/dist/email/templates.d.ts +10 -9
  55. package/dist/email/templates.js +102 -38
  56. package/dist/email/theme.js +1 -1
  57. package/dist/environment-variables.d.ts +4 -2
  58. package/dist/environment-variables.js +52 -32
  59. package/dist/filter-bar/editor.js +20 -8
  60. package/dist/filter-bar/model.d.ts +1 -0
  61. package/dist/filter-bar/model.js +10 -1
  62. package/dist/filter-bar/motion.js +4 -4
  63. package/dist/filter-bar/parts.js +20 -9
  64. package/dist/filter-bar/types.d.ts +1 -0
  65. package/dist/filter-bar.js +20 -14
  66. package/dist/hooks/use-audio-recorder.js +12 -6
  67. package/dist/hooks/use-chat-composer.d.ts +19 -7
  68. package/dist/hooks/use-chat-composer.js +32 -5
  69. package/dist/hooks/use-chat-message.d.ts +28 -2
  70. package/dist/hooks/use-chat-message.js +41 -10
  71. package/dist/hooks/use-chat-thread-scroll.js +43 -7
  72. package/dist/hooks/use-color-area.d.ts +3 -3
  73. package/dist/hooks/use-color-area.js +13 -12
  74. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -1
  75. package/dist/hooks/use-copy-to-clipboard.js +20 -20
  76. package/dist/hooks/use-dynamic-notification.d.ts +6 -2
  77. package/dist/hooks/use-dynamic-notification.js +26 -10
  78. package/dist/hooks/use-mobile.d.ts +3 -2
  79. package/dist/hooks/use-mobile.js +8 -4
  80. package/dist/hooks/use-textarea-trigger-menu.js +2 -1
  81. package/dist/hooks/use-trigger-menu.d.ts +54 -0
  82. package/dist/hooks/use-trigger-menu.js +102 -47
  83. package/dist/hooks/use-user-ask.d.ts +2 -0
  84. package/dist/hooks/use-user-ask.js +35 -41
  85. package/dist/inline-attachment.d.ts +6 -2
  86. package/dist/inline-attachment.js +36 -15
  87. package/dist/inline-citation.d.ts +12 -5
  88. package/dist/inline-citation.js +26 -17
  89. package/dist/knob-contracts/audio-recorder-knobs.d.ts +1 -1
  90. package/dist/knob-contracts/audio-recorder-knobs.js +2 -1
  91. package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
  92. package/dist/knob-contracts/audio-visualizer-knobs.js +2 -1
  93. package/dist/knob-contracts/avatar-knobs.d.ts +1 -1
  94. package/dist/knob-contracts/avatar-knobs.js +6 -1
  95. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  96. package/dist/knob-contracts/badge-knobs.js +2 -1
  97. package/dist/knob-contracts/breadcrumb-knobs.d.ts +4 -0
  98. package/dist/knob-contracts/breadcrumb-knobs.js +8 -0
  99. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  100. package/dist/knob-contracts/button-knobs.js +1 -0
  101. package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
  102. package/dist/knob-contracts/chat-message-knobs.js +8 -1
  103. package/dist/knob-contracts/code-diff-knobs.d.ts +1 -1
  104. package/dist/knob-contracts/code-diff-knobs.js +2 -0
  105. package/dist/knob-contracts/code-knobs.d.ts +1 -1
  106. package/dist/knob-contracts/code-knobs.js +2 -1
  107. package/dist/knob-contracts/dynamic-notification-knobs.d.ts +1 -1
  108. package/dist/knob-contracts/dynamic-notification-knobs.js +2 -0
  109. package/dist/knob-contracts/emoji-picker-knobs.d.ts +4 -0
  110. package/dist/knob-contracts/emoji-picker-knobs.js +10 -0
  111. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  112. package/dist/knob-contracts/field-knobs.js +5 -1
  113. package/dist/knob-contracts/filter-bar-knobs.d.ts +1 -1
  114. package/dist/knob-contracts/filter-bar-knobs.js +1 -2
  115. package/dist/knob-contracts/markdown-knobs.d.ts +1 -1
  116. package/dist/knob-contracts/markdown-knobs.js +3 -1
  117. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  118. package/dist/knob-contracts/page-layout-knobs.js +2 -1
  119. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  120. package/dist/knob-contracts/popup-knobs.js +27 -0
  121. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  122. package/dist/knob-contracts/range-knobs.js +1 -0
  123. package/dist/knob-contracts/rich-tooltip-knobs.d.ts +1 -1
  124. package/dist/knob-contracts/rich-tooltip-knobs.js +2 -1
  125. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  126. package/dist/knob-contracts/sidebar-knobs.js +27 -2
  127. package/dist/knob-contracts/spinner-knobs.d.ts +1 -1
  128. package/dist/knob-contracts/spinner-knobs.js +1 -1
  129. package/dist/knob-contracts/stepper-knobs.d.ts +1 -1
  130. package/dist/knob-contracts/stepper-knobs.js +4 -1
  131. package/dist/knob-contracts/switch-knobs.d.ts +1 -1
  132. package/dist/knob-contracts/switch-knobs.js +5 -0
  133. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  134. package/dist/knob-contracts/table-of-contents-knobs.js +2 -1
  135. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  136. package/dist/knob-contracts/tabs-knobs.js +1 -0
  137. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  138. package/dist/knob-contracts/tree-knobs.js +2 -1
  139. package/dist/lib/cn.js +0 -4
  140. package/dist/lib/contrast.d.ts +1 -0
  141. package/dist/lib/contrast.js +17 -5
  142. package/dist/lib/dropzone-validation.js +41 -28
  143. package/dist/lib/env-file.d.ts +1 -1
  144. package/dist/lib/env-file.js +5 -5
  145. package/dist/lib/motion.d.ts +4 -0
  146. package/dist/lib/motion.js +15 -0
  147. package/dist/lib/phone-input-format.js +1 -1
  148. package/dist/lib/trigger-detect.js +6 -8
  149. package/dist/markdown-block.js +2 -1
  150. package/dist/popup-parts.d.ts +8 -0
  151. package/dist/popup-parts.js +43 -0
  152. package/dist/source-badge.js +3 -1
  153. package/dist/styles/code.css +0 -2
  154. package/dist/styles/effects.css +6 -32
  155. package/dist/styles/index.css +10 -5
  156. package/dist/styles/recipes/accordion.css +9 -6
  157. package/dist/styles/recipes/action-bar.css +0 -15
  158. package/dist/styles/recipes/activity.css +5 -11
  159. package/dist/styles/recipes/alert.css +4 -4
  160. package/dist/styles/recipes/audio-recorder.css +15 -3
  161. package/dist/styles/recipes/audio-visualizer.css +13 -2
  162. package/dist/styles/recipes/avatar.css +78 -1
  163. package/dist/styles/recipes/badge.css +14 -4
  164. package/dist/styles/recipes/breadcrumb.css +77 -0
  165. package/dist/styles/recipes/button-group.css +5 -7
  166. package/dist/styles/recipes/button-states.css +66 -0
  167. package/dist/styles/recipes/button.css +24 -83
  168. package/dist/styles/recipes/calendar.css +17 -23
  169. package/dist/styles/recipes/card.css +2 -2
  170. package/dist/styles/recipes/chat-composer-attachment.css +9 -3
  171. package/dist/styles/recipes/chat-composer.css +7 -10
  172. package/dist/styles/recipes/chat-layout.css +35 -0
  173. package/dist/styles/recipes/chat-message-social.css +123 -0
  174. package/dist/styles/recipes/chat-message.css +157 -37
  175. package/dist/styles/recipes/choice.css +18 -21
  176. package/dist/styles/recipes/code-diff.css +46 -33
  177. package/dist/styles/recipes/code.css +36 -16
  178. package/dist/styles/recipes/collapsible.css +7 -2
  179. package/dist/styles/recipes/color-picker-details.css +3 -4
  180. package/dist/styles/recipes/color-picker-values.css +9 -8
  181. package/dist/styles/recipes/color-picker.css +11 -2
  182. package/dist/styles/recipes/context.css +3 -3
  183. package/dist/styles/recipes/dockable-panel.css +7 -4
  184. package/dist/styles/recipes/dropzone.css +7 -8
  185. package/dist/styles/recipes/dynamic-notification-input.css +8 -5
  186. package/dist/styles/recipes/dynamic-notification-motion.css +12 -21
  187. package/dist/styles/recipes/dynamic-notification.css +40 -26
  188. package/dist/styles/recipes/emoji-picker.css +132 -0
  189. package/dist/styles/recipes/empty.css +5 -4
  190. package/dist/styles/recipes/environment-variables.css +4 -15
  191. package/dist/styles/recipes/field-parts.css +30 -24
  192. package/dist/styles/recipes/field.css +61 -26
  193. package/dist/styles/recipes/filter-bar.css +18 -31
  194. package/dist/styles/recipes/gradient-editor.css +18 -7
  195. package/dist/styles/recipes/infinite-canvas.css +0 -1
  196. package/dist/styles/recipes/inline-attachment.css +3 -3
  197. package/dist/styles/recipes/inline-citation.css +10 -4
  198. package/dist/styles/recipes/item.css +23 -9
  199. package/dist/styles/recipes/markdown-block.css +5 -4
  200. package/dist/styles/recipes/markdown.css +68 -26
  201. package/dist/styles/recipes/morphing-panel.css +8 -8
  202. package/dist/styles/recipes/page-layout.css +20 -12
  203. package/dist/styles/recipes/pagination.css +4 -5
  204. package/dist/styles/recipes/phone-input.css +12 -8
  205. package/dist/styles/recipes/popup-controls.css +166 -33
  206. package/dist/styles/recipes/popup-drawer.css +3 -14
  207. package/dist/styles/recipes/popup-lists.css +128 -27
  208. package/dist/styles/recipes/popup-motion.css +4 -45
  209. package/dist/styles/recipes/popup-toast.css +55 -26
  210. package/dist/styles/recipes/popup.css +139 -141
  211. package/dist/styles/recipes/range.css +54 -18
  212. package/dist/styles/recipes/resizable.css +2 -7
  213. package/dist/styles/recipes/rich-tooltip.css +24 -34
  214. package/dist/styles/recipes/scroll-area.css +8 -1
  215. package/dist/styles/recipes/sidebar-menu.css +149 -34
  216. package/dist/styles/recipes/sidebar-parts.css +154 -0
  217. package/dist/styles/recipes/sidebar.css +187 -128
  218. package/dist/styles/recipes/source-badge.css +1 -1
  219. package/dist/styles/recipes/spinner.css +8 -1
  220. package/dist/styles/recipes/stepper.css +31 -13
  221. package/dist/styles/recipes/switch.css +68 -23
  222. package/dist/styles/recipes/table-of-contents.css +9 -1
  223. package/dist/styles/recipes/table.css +14 -10
  224. package/dist/styles/recipes/tabs.css +17 -12
  225. package/dist/styles/recipes/task-list.css +7 -14
  226. package/dist/styles/recipes/thread-rail.css +42 -19
  227. package/dist/styles/recipes/timeline.css +2 -0
  228. package/dist/styles/recipes/toolbar.css +27 -25
  229. package/dist/styles/recipes/track-highlight.css +10 -7
  230. package/dist/styles/recipes/tree.css +31 -4
  231. package/dist/styles/recipes/user-ask-details.css +0 -1
  232. package/dist/styles/recipes/user-ask.css +4 -4
  233. package/dist/styles/theme.css +37 -16
  234. package/dist/task-list.d.ts +4 -1
  235. package/dist/task-list.js +24 -8
  236. package/dist/thread-rail.d.ts +1 -1
  237. package/dist/thread-rail.js +61 -19
  238. package/dist/transcript-divider.js +2 -1
  239. package/dist/ui/alert-dialog.js +1 -1
  240. package/dist/ui/alert.d.ts +3 -1
  241. package/dist/ui/alert.js +14 -8
  242. package/dist/ui/autocomplete.js +4 -2
  243. package/dist/ui/avatar.d.ts +8 -0
  244. package/dist/ui/avatar.js +23 -3
  245. package/dist/ui/badge.js +1 -1
  246. package/dist/ui/breadcrumb.d.ts +27 -0
  247. package/dist/ui/breadcrumb.js +88 -0
  248. package/dist/ui/button.d.ts +2 -1
  249. package/dist/ui/button.js +3 -3
  250. package/dist/ui/calendar.js +2 -2
  251. package/dist/ui/card.d.ts +3 -1
  252. package/dist/ui/card.js +12 -7
  253. package/dist/ui/checkbox.d.ts +2 -0
  254. package/dist/ui/code-diff.d.ts +1 -1
  255. package/dist/ui/code-diff.js +72 -28
  256. package/dist/ui/code.d.ts +5 -3
  257. package/dist/ui/code.js +28 -29
  258. package/dist/ui/collapsible.js +1 -1
  259. package/dist/ui/color-picker.d.ts +5 -2
  260. package/dist/ui/color-picker.js +85 -37
  261. package/dist/ui/combobox-disabled-selection.d.ts +1 -2
  262. package/dist/ui/combobox-disabled-selection.js +7 -9
  263. package/dist/ui/combobox.js +14 -6
  264. package/dist/ui/command.d.ts +8 -2
  265. package/dist/ui/command.js +30 -14
  266. package/dist/ui/context-menu.js +4 -1
  267. package/dist/ui/dialog.d.ts +2 -1
  268. package/dist/ui/dialog.js +4 -23
  269. package/dist/ui/dockable-panel-geometry.d.ts +1 -0
  270. package/dist/ui/dockable-panel-geometry.js +7 -1
  271. package/dist/ui/dockable-panel.d.ts +9 -6
  272. package/dist/ui/dockable-panel.js +63 -23
  273. package/dist/ui/drawer.js +1 -1
  274. package/dist/ui/dropdown-menu.js +5 -4
  275. package/dist/ui/dropzone.d.ts +2 -2
  276. package/dist/ui/dropzone.js +75 -16
  277. package/dist/ui/emoji-picker.d.ts +18 -0
  278. package/dist/ui/emoji-picker.js +136 -0
  279. package/dist/ui/empty.d.ts +3 -1
  280. package/dist/ui/empty.js +12 -7
  281. package/dist/ui/gradient-editor.d.ts +1 -1
  282. package/dist/ui/gradient-editor.js +37 -21
  283. package/dist/ui/hover-card.js +1 -1
  284. package/dist/ui/infinite-canvas.d.ts +3 -2
  285. package/dist/ui/infinite-canvas.js +63 -19
  286. package/dist/ui/input-group.d.ts +0 -3
  287. package/dist/ui/input-group.js +4 -14
  288. package/dist/ui/input-otp.d.ts +1 -1
  289. package/dist/ui/input-otp.js +32 -15
  290. package/dist/ui/input.js +4 -4
  291. package/dist/ui/item.d.ts +2 -1
  292. package/dist/ui/item.js +12 -8
  293. package/dist/ui/live-status.d.ts +7 -0
  294. package/dist/ui/live-status.js +17 -0
  295. package/dist/ui/markdown-elements.d.ts +6 -0
  296. package/dist/ui/markdown-elements.js +31 -1
  297. package/dist/ui/menubar.js +3 -3
  298. package/dist/ui/morphing-panel.js +3 -2
  299. package/dist/ui/native-select.d.ts +1 -1
  300. package/dist/ui/native-select.js +24 -11
  301. package/dist/ui/navigation-menu.js +1 -1
  302. package/dist/ui/page-layout.d.ts +2 -2
  303. package/dist/ui/page-layout.js +2 -4
  304. package/dist/ui/pagination.d.ts +7 -5
  305. package/dist/ui/pagination.js +19 -13
  306. package/dist/ui/phone-input.d.ts +1 -0
  307. package/dist/ui/phone-input.js +58 -60
  308. package/dist/ui/popover.js +1 -1
  309. package/dist/ui/radio-group.d.ts +2 -0
  310. package/dist/ui/resizable.d.ts +3 -2
  311. package/dist/ui/resizable.js +5 -3
  312. package/dist/ui/responsive-dialog.d.ts +1 -1
  313. package/dist/ui/responsive-dialog.js +4 -21
  314. package/dist/ui/rich-tooltip.d.ts +10 -4
  315. package/dist/ui/rich-tooltip.js +82 -34
  316. package/dist/ui/scroll-area.d.ts +1 -1
  317. package/dist/ui/scroll-area.js +43 -28
  318. package/dist/ui/select.js +1 -1
  319. package/dist/ui/sheet.js +1 -1
  320. package/dist/ui/sidebar-menu.d.ts +5 -1
  321. package/dist/ui/sidebar-menu.js +32 -34
  322. package/dist/ui/sidebar-provider.d.ts +10 -1
  323. package/dist/ui/sidebar-provider.js +39 -14
  324. package/dist/ui/sidebar-resize-rail.js +8 -4
  325. package/dist/ui/sidebar.d.ts +11 -6
  326. package/dist/ui/sidebar.js +47 -24
  327. package/dist/ui/slider.js +31 -22
  328. package/dist/ui/spinner.d.ts +3 -2
  329. package/dist/ui/spinner.js +3 -2
  330. package/dist/ui/stepper.d.ts +8 -1
  331. package/dist/ui/stepper.js +74 -25
  332. package/dist/ui/switch.d.ts +1 -0
  333. package/dist/ui/table-of-contents.d.ts +2 -2
  334. package/dist/ui/table-of-contents.js +20 -8
  335. package/dist/ui/table.js +4 -2
  336. package/dist/ui/textarea.d.ts +1 -1
  337. package/dist/ui/textarea.js +20 -9
  338. package/dist/ui/timeline.d.ts +3 -1
  339. package/dist/ui/timeline.js +17 -9
  340. package/dist/ui/toast.d.ts +11 -5
  341. package/dist/ui/toast.js +101 -55
  342. package/dist/ui/toolbar.d.ts +3 -2
  343. package/dist/ui/toolbar.js +4 -2
  344. package/dist/ui/tooltip.js +4 -21
  345. package/dist/ui/tree.js +121 -81
  346. package/dist/ui/trigger-menu.js +2 -1
  347. package/dist/user-ask.d.ts +10 -5
  348. package/dist/user-ask.js +32 -12
  349. package/package.json +5 -1
  350. package/dist/hooks/use-keyboard-navigation.d.ts +0 -3
  351. package/dist/hooks/use-keyboard-navigation.js +0 -22
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { createContext, useContext, useId, useState } from "react";
3
+ import { createContext, useContext, useEffect, useId, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { CheckIcon, CircleAlertIcon } from "lucide-react";
6
6
  //#region src/ui/stepper.tsx
@@ -16,25 +16,48 @@ function useStepperItem() {
16
16
  if (!context) throw new Error("Stepper item parts must be used within <StepperItem>.");
17
17
  return context;
18
18
  }
19
+ function stepPartId(baseId, step, part) {
20
+ return `${baseId}-step-${step}-${part}`;
21
+ }
22
+ function useRegisteredId(id, rendered = true) {
23
+ const { registerId } = useStepper();
24
+ useEffect(() => rendered ? registerId(id) : void 0, [
25
+ id,
26
+ rendered,
27
+ registerId
28
+ ]);
29
+ }
30
+ function renderedIdRefs(renderedIds, ids) {
31
+ const refs = ids.filter((id) => renderedIds.has(id));
32
+ return refs.length > 0 ? refs.join(" ") : void 0;
33
+ }
19
34
  function stateForStep(value, step) {
20
35
  if (value === null) return "neutral";
21
36
  if (step < value) return "complete";
22
37
  if (step === value) return "current";
23
38
  return "upcoming";
24
39
  }
25
- function indicatorStateLabel(state, invalid) {
40
+ function statusStateLabel(state, invalid) {
26
41
  if (invalid) return "invalid";
27
42
  if (state === "neutral") return null;
28
43
  return state;
29
44
  }
45
+ function defaultStatusLabel({ step, state, invalid, disabled }) {
46
+ const stateLabel = statusStateLabel(state, invalid);
47
+ return [
48
+ `Step ${step + 1}`,
49
+ stateLabel,
50
+ disabled ? "disabled" : null
51
+ ].filter(Boolean).join(", ");
52
+ }
30
53
  function defaultIndicatorContent(step, state, invalid) {
31
54
  if (invalid) return /* @__PURE__ */ jsx(CircleAlertIcon, { className: "size-4" });
32
55
  if (state === "complete") return /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" });
33
56
  return step + 1;
34
57
  }
35
58
  function itemLayout(orientation, responsive) {
36
- if (orientation === "vertical") return "grid min-w-0 grid-cols-[2rem_minmax(0,1fr)]";
37
- return cn("relative grid min-w-0 flex-1 grid-cols-1 justify-items-center", responsive && "@max-md/stepper:w-full @max-md/stepper:flex-none @max-md/stepper:grid-cols-[2rem_minmax(0,1fr)] @max-md/stepper:justify-items-stretch");
59
+ if (orientation === "vertical") return "grid min-w-0 grid-cols-[var(--cui-stepper-indicator-size)_minmax(0,1fr)]";
60
+ return cn("relative grid min-w-0 flex-1 grid-cols-1 justify-items-center", responsive && "@max-md/stepper:w-full @max-md/stepper:flex-none @max-md/stepper:grid-cols-[var(--cui-stepper-indicator-size)_minmax(0,1fr)] @max-md/stepper:justify-items-stretch");
38
61
  }
39
62
  function partLayout(orientation, responsive, part) {
40
63
  const vertical = {
@@ -56,9 +79,19 @@ function partLayout(orientation, responsive, part) {
56
79
  }[part];
57
80
  return cn(horizontal, narrow);
58
81
  }
59
- function Stepper({ value, defaultValue = null, onValueChange, orientation = "horizontal", contentMode = "current", responsive = true, id, className, children, ...props }) {
82
+ function Stepper({ value, defaultValue = null, onValueChange, orientation = "horizontal", contentMode = "current", responsive = true, getStatusLabel = defaultStatusLabel, id, className, children, ...props }) {
60
83
  const generatedId = useId();
61
84
  const [internalValue, setInternalValue] = useState(defaultValue);
85
+ const [renderedIds, setRenderedIds] = useState(() => /* @__PURE__ */ new Set());
86
+ const [registerId] = useState(() => (renderedId) => {
87
+ setRenderedIds((current) => current.has(renderedId) ? current : new Set(current).add(renderedId));
88
+ return () => setRenderedIds((current) => {
89
+ if (!current.has(renderedId)) return current;
90
+ const next = new Set(current);
91
+ next.delete(renderedId);
92
+ return next;
93
+ });
94
+ });
62
95
  const controlled = value !== void 0;
63
96
  const currentValue = value !== void 0 ? value : internalValue;
64
97
  const selectStep = (step) => {
@@ -72,7 +105,10 @@ function Stepper({ value, defaultValue = null, onValueChange, orientation = "hor
72
105
  contentMode,
73
106
  responsive,
74
107
  baseId: id ?? generatedId,
75
- selectStep
108
+ selectStep,
109
+ getStatusLabel,
110
+ renderedIds,
111
+ registerId
76
112
  },
77
113
  children: /* @__PURE__ */ jsx("div", {
78
114
  ...props,
@@ -107,8 +143,10 @@ function StepperItem({ step, disabled = false, invalid = false, className, child
107
143
  state,
108
144
  disabled,
109
145
  invalid,
110
- titleId: `${baseId}-step-${step}-title`,
111
- contentId: `${baseId}-step-${step}-content`
146
+ titleId: stepPartId(baseId, step, "title"),
147
+ descriptionId: stepPartId(baseId, step, "description"),
148
+ statusId: stepPartId(baseId, step, "status"),
149
+ contentId: stepPartId(baseId, step, "content")
112
150
  };
113
151
  return /* @__PURE__ */ jsx(StepperItemContext.Provider, {
114
152
  value: contextValue,
@@ -128,8 +166,8 @@ function StepperItem({ step, disabled = false, invalid = false, className, child
128
166
  });
129
167
  }
130
168
  function StepperTrigger({ disabled: disabledProp, className, onClick, type = "button", ...props }) {
131
- const { orientation, responsive, selectStep } = useStepper();
132
- const { step, state, disabled, invalid, contentId } = useStepperItem();
169
+ const { orientation, responsive, selectStep, renderedIds } = useStepper();
170
+ const { step, state, disabled, invalid, titleId, descriptionId, statusId, contentId } = useStepperItem();
133
171
  const isDisabled = disabled || Boolean(disabledProp);
134
172
  return /* @__PURE__ */ jsx("button", {
135
173
  ...props,
@@ -140,8 +178,11 @@ function StepperTrigger({ disabled: disabledProp, className, onClick, type = "bu
140
178
  "data-invalid": invalid ? "true" : void 0,
141
179
  type,
142
180
  disabled: isDisabled,
143
- "aria-controls": contentId,
144
- className: cn("group/stepper-trigger col-span-full row-span-3 row-start-1 grid w-full min-w-0 grid-cols-1 justify-items-center disabled:pointer-events-none disabled:cursor-not-allowed", orientation === "vertical" && "row-span-2 grid-cols-[2rem_minmax(0,1fr)] justify-items-stretch", orientation === "horizontal" && responsive && "@max-md/stepper:row-span-2 @max-md/stepper:grid-cols-[2rem_minmax(0,1fr)] @max-md/stepper:justify-items-stretch", className),
181
+ "aria-current": state === "current" ? "step" : void 0,
182
+ "aria-labelledby": renderedIdRefs(renderedIds, [titleId]),
183
+ "aria-describedby": renderedIdRefs(renderedIds, [statusId, descriptionId]),
184
+ "aria-controls": renderedIdRefs(renderedIds, [contentId]),
185
+ className: cn("group/stepper-trigger col-span-full row-span-3 row-start-1 grid w-full min-w-0 grid-cols-1 justify-items-center disabled:pointer-events-none disabled:cursor-not-allowed", orientation === "vertical" && "row-span-2 grid-cols-[var(--cui-stepper-indicator-size)_minmax(0,1fr)] justify-items-stretch", orientation === "horizontal" && responsive && "@max-md/stepper:row-span-2 @max-md/stepper:grid-cols-[var(--cui-stepper-indicator-size)_minmax(0,1fr)] @max-md/stepper:justify-items-stretch", className),
145
186
  onClick: (event) => {
146
187
  onClick?.(event);
147
188
  if (!event.defaultPrevented && !isDisabled) selectStep(step);
@@ -149,14 +190,9 @@ function StepperTrigger({ disabled: disabledProp, className, onClick, type = "bu
149
190
  });
150
191
  }
151
192
  function StepperIndicator({ className, children, ...props }) {
152
- const { orientation, responsive } = useStepper();
153
- const { step, state, disabled, invalid } = useStepperItem();
154
- const stateLabel = indicatorStateLabel(state, invalid);
155
- const status = [
156
- `Step ${step + 1}`,
157
- stateLabel,
158
- disabled ? "disabled" : null
159
- ].filter(Boolean).join(", ");
193
+ const { orientation, responsive, getStatusLabel } = useStepper();
194
+ const { step, state, disabled, invalid, statusId } = useStepperItem();
195
+ useRegisteredId(statusId);
160
196
  const indicatorContent = children ?? defaultIndicatorContent(step, state, invalid);
161
197
  return /* @__PURE__ */ jsxs("span", {
162
198
  ...props,
@@ -170,8 +206,14 @@ function StepperIndicator({ className, children, ...props }) {
170
206
  "aria-hidden": "true",
171
207
  children: indicatorContent
172
208
  }), /* @__PURE__ */ jsx("span", {
209
+ id: statusId,
173
210
  className: "sr-only",
174
- children: status
211
+ children: getStatusLabel({
212
+ step,
213
+ state,
214
+ invalid,
215
+ disabled
216
+ })
175
217
  })]
176
218
  });
177
219
  }
@@ -186,12 +228,13 @@ function StepperSeparator({ className, ...props }) {
186
228
  "data-state": state,
187
229
  "data-invalid": invalid ? "true" : void 0,
188
230
  "aria-hidden": "true",
189
- className: cn("absolute", orientation === "horizontal" && "top-4 right-[calc(-50%+1rem)] left-[calc(50%+1rem)]", orientation === "vertical" && "top-8 bottom-0 left-4", orientation === "horizontal" && responsive && "@max-md/stepper:top-8 @max-md/stepper:right-auto @max-md/stepper:bottom-0 @max-md/stepper:left-4", className)
231
+ className: cn("absolute", orientation === "horizontal" && "top-[calc(var(--cui-stepper-indicator-size)/2)] start-[calc(50%_+_var(--cui-stepper-indicator-size)/2)] end-[calc(var(--cui-stepper-indicator-size)/2_-_50%)]", orientation === "vertical" && "top-(--cui-stepper-indicator-size) bottom-0 start-[calc(var(--cui-stepper-indicator-size)/2)]", orientation === "horizontal" && responsive && "@max-md/stepper:top-(--cui-stepper-indicator-size) @max-md/stepper:end-auto @max-md/stepper:bottom-0 @max-md/stepper:start-[calc(var(--cui-stepper-indicator-size)/2)]", className)
190
232
  });
191
233
  }
192
234
  function StepperTitle({ className, ...props }) {
193
235
  const { orientation, responsive } = useStepper();
194
236
  const { titleId } = useStepperItem();
237
+ useRegisteredId(titleId);
195
238
  return /* @__PURE__ */ jsx("span", {
196
239
  ...props,
197
240
  id: titleId,
@@ -203,8 +246,11 @@ function StepperTitle({ className, ...props }) {
203
246
  }
204
247
  function StepperDescription({ className, ...props }) {
205
248
  const { orientation, responsive } = useStepper();
249
+ const { descriptionId } = useStepperItem();
250
+ useRegisteredId(descriptionId);
206
251
  return /* @__PURE__ */ jsx("span", {
207
252
  ...props,
253
+ id: descriptionId,
208
254
  "data-control-ui": "stepper",
209
255
  "data-control-family": "stepper",
210
256
  "data-slot": "description",
@@ -215,16 +261,19 @@ function StepperContent({ step, keepMounted = true, className, ...props }) {
215
261
  const { value, contentMode, baseId } = useStepper();
216
262
  const active = value === step;
217
263
  const hidden = contentMode === "current" && !active;
218
- if (hidden && !keepMounted) return null;
264
+ const rendered = !hidden || keepMounted;
265
+ const contentId = stepPartId(baseId, step, "content");
266
+ useRegisteredId(contentId, rendered);
267
+ if (!rendered) return null;
219
268
  return /* @__PURE__ */ jsx("section", {
220
269
  ...props,
221
- id: `${baseId}-step-${step}-content`,
270
+ id: contentId,
222
271
  "data-control-ui": "stepper",
223
272
  "data-control-family": "stepper",
224
273
  "data-slot": "content",
225
274
  "data-state": active ? "active" : "inactive",
226
275
  hidden,
227
- "aria-labelledby": `${baseId}-step-${step}-title`,
276
+ "aria-labelledby": stepPartId(baseId, step, "title"),
228
277
  className
229
278
  });
230
279
  }
@@ -18,6 +18,7 @@ export type SwitchProps = Omit<{
18
18
  "aria-label"?: string;
19
19
  "aria-labelledby"?: string;
20
20
  "aria-describedby"?: string;
21
+ "aria-invalid"?: boolean | "true" | "false";
21
22
  }, "style"> & {
22
23
  style?: CSSProperties & SwitchKnobStyle;
23
24
  };
@@ -1,5 +1,5 @@
1
1
  import { TableOfContentsKnobStyle } from "../knob-contracts/table-of-contents-knobs.js";
2
- import { CSSProperties, ComponentProps, ReactNode } from "react";
2
+ import { CSSProperties, ComponentProps, ReactNode, RefObject } from "react";
3
3
  //#region src/ui/table-of-contents.d.ts
4
4
  export type TocItem = {
5
5
  href: string;
@@ -17,6 +17,6 @@ export type TableOfContentsProps = Omit<Omit<ComponentProps<"nav">, "children">,
17
17
  variant?: TableOfContentsVariant;
18
18
  indicator?: ReactNode;
19
19
  };
20
- export declare function useVisibleSections(ids: string[]): string[];
20
+ export declare function useVisibleSections(ids: string[], knobSourceRef: RefObject<HTMLElement | null>): string[];
21
21
  export declare function TableOfContents({ items, label, variant, indicator, className, style, ...props }: TableOfContentsProps): import("react").JSX.Element | null;
22
22
  //#endregion
@@ -1,10 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { useEffect, useRef, useState, useSyncExternalStore } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/ui/table-of-contents.tsx
6
6
  const tableOfContentsVariants = ["range", "progress"];
7
- const DETECTION_MARGIN = "-80px 0px -20% 0px";
8
7
  function getScrollContainer(el) {
9
8
  let node = el.parentElement;
10
9
  while (node) {
@@ -13,7 +12,7 @@ function getScrollContainer(el) {
13
12
  }
14
13
  return null;
15
14
  }
16
- function useVisibleSections(ids) {
15
+ function useVisibleSections(ids, knobSourceRef) {
17
16
  const [visibleState, setVisibleState] = useState({
18
17
  idsKey: "",
19
18
  visibleIds: []
@@ -23,6 +22,8 @@ function useVisibleSections(ids) {
23
22
  const elements = (idsKey ? idsKey.split("|") : []).map((id) => document.getElementById(id)).filter((el) => el !== null);
24
23
  const firstElement = elements[0];
25
24
  if (!firstElement) return;
25
+ const knobSource = knobSourceRef.current;
26
+ const scrollInset = knobSource ? readLengthKnob(getComputedStyle(knobSource), "--cui-table-of-contents-scroll-inset") : 0;
26
27
  const order = new Map(elements.map((el, index) => [el.id, index]));
27
28
  const visible = /* @__PURE__ */ new Set();
28
29
  const observer = new IntersectionObserver((entries) => {
@@ -34,14 +35,21 @@ function useVisibleSections(ids) {
34
35
  });
35
36
  }, {
36
37
  root: getScrollContainer(firstElement),
37
- rootMargin: DETECTION_MARGIN,
38
+ rootMargin: `-${scrollInset}px 0px -20% 0px`,
38
39
  threshold: 0
39
40
  });
40
41
  for (const el of elements) observer.observe(el);
41
42
  return () => observer.disconnect();
42
- }, [idsKey]);
43
+ }, [idsKey, knobSourceRef]);
43
44
  return visibleState.idsKey === idsKey ? visibleState.visibleIds : [];
44
45
  }
46
+ function subscribeToHash(onChange) {
47
+ window.addEventListener("hashchange", onChange);
48
+ return () => window.removeEventListener("hashchange", onChange);
49
+ }
50
+ function useLocationHash() {
51
+ return useSyncExternalStore(subscribeToHash, () => window.location.hash, () => "");
52
+ }
45
53
  function collectLevels(items, fallbackLevel = 2) {
46
54
  return items.flatMap((item) => {
47
55
  const level = item.level ?? fallbackLevel;
@@ -151,8 +159,10 @@ function TableOfContents({ items, label = "On this page", variant = "range", ind
151
159
  const normalizedItems = normalizeItems(items, Math.min(...collectLevels(items), 2));
152
160
  const flatItems = flattenItems(normalizedItems);
153
161
  const targetIds = flatItems.map((item) => item.href.replace(/^#/, ""));
154
- const activeItems = findActiveItems(useVisibleSections(targetIds), flatItems, targetIds);
162
+ const activeItems = findActiveItems(useVisibleSections(targetIds, trackRef), flatItems, targetIds);
155
163
  const activeHrefs = new Set(activeItems.map((item) => item.href));
164
+ const locationHash = useLocationHash();
165
+ const currentHref = activeHrefs.has(locationHash) ? locationHash : activeItems[0]?.href;
156
166
  const rail = useRailGeometry(trackRef, itemElements);
157
167
  const hasActiveSection = activeItems.length > 0;
158
168
  if (items.length === 0) return null;
@@ -197,6 +207,7 @@ function TableOfContents({ items, label = "On this page", variant = "range", ind
197
207
  /* @__PURE__ */ jsx(TocList, {
198
208
  items: normalizedItems,
199
209
  activeHrefs,
210
+ currentHref,
200
211
  itemElements,
201
212
  root: true
202
213
  }),
@@ -214,7 +225,7 @@ function TableOfContents({ items, label = "On this page", variant = "range", ind
214
225
  })]
215
226
  });
216
227
  }
217
- function TocList({ items, activeHrefs, itemElements, root = false }) {
228
+ function TocList({ items, activeHrefs, currentHref, itemElements, root = false }) {
218
229
  return /* @__PURE__ */ jsx("ul", {
219
230
  "data-control-ui": "table-of-contents",
220
231
  "data-control-family": "table-of-contents",
@@ -237,7 +248,7 @@ function TocList({ items, activeHrefs, itemElements, root = false }) {
237
248
  "data-active": isActive || void 0,
238
249
  "data-level": item.level,
239
250
  "data-depth": item.depth,
240
- "aria-current": isActive ? "location" : void 0,
251
+ "aria-current": item.href === currentHref ? "location" : void 0,
241
252
  href: item.href,
242
253
  className: "block",
243
254
  style: itemStyle,
@@ -245,6 +256,7 @@ function TocList({ items, activeHrefs, itemElements, root = false }) {
245
256
  }), item.children && /* @__PURE__ */ jsx(TocList, {
246
257
  items: item.children,
247
258
  activeHrefs,
259
+ currentHref,
248
260
  itemElements
249
261
  })] }, item.href);
250
262
  })
package/dist/ui/table.js CHANGED
@@ -10,6 +10,8 @@ function Table({ className, ...props }) {
10
10
  className: "relative w-full",
11
11
  children: /* @__PURE__ */ jsx(ScrollArea, {
12
12
  lockAxis: "y",
13
+ "aria-label": props["aria-label"],
14
+ "aria-labelledby": props["aria-labelledby"],
13
15
  children: /* @__PURE__ */ jsx("table", {
14
16
  "data-control-ui": "table",
15
17
  "data-control-family": "table",
@@ -61,7 +63,7 @@ function TableHead({ className, ...props }) {
61
63
  "data-control-ui": "table",
62
64
  "data-control-family": "table",
63
65
  "data-slot": "head",
64
- className: cn("whitespace-nowrap align-middle [&:has([role=checkbox])]:pr-0", className),
66
+ className: cn("whitespace-nowrap align-middle [&:has([role=checkbox])]:pe-0", className),
65
67
  ...props
66
68
  });
67
69
  }
@@ -70,7 +72,7 @@ function TableCell({ className, ...props }) {
70
72
  "data-control-ui": "table",
71
73
  "data-control-family": "table",
72
74
  "data-slot": "cell",
73
- className: cn("whitespace-nowrap align-middle [&:has([role=checkbox])]:pr-0", className),
75
+ className: cn("whitespace-nowrap align-middle [&:has([role=checkbox])]:pe-0", className),
74
76
  ...props
75
77
  });
76
78
  }
@@ -4,5 +4,5 @@ import { CSSProperties, ComponentProps } from "react";
4
4
  export type TextareaProps = Omit<ComponentProps<"textarea">, "style"> & {
5
5
  style?: CSSProperties & FieldKnobStyle;
6
6
  };
7
- export declare function Textarea({ className, ...props }: TextareaProps): import("react").JSX.Element;
7
+ export declare function Textarea({ ref, id, name, value, defaultValue, disabled, autoFocus, className, ...props }: TextareaProps): import("react").JSX.Element;
8
8
  //#endregion
@@ -1,15 +1,26 @@
1
+ "use client";
1
2
  import { cn } from "../lib/cn.js";
2
3
  import { jsx } from "react/jsx-runtime";
4
+ import { Input } from "@base-ui/react/input";
3
5
  //#region src/ui/textarea.tsx
4
- function Textarea({ className, ...props }) {
5
- return /* @__PURE__ */ jsx("textarea", {
6
- "data-control-ui": "textarea",
7
- "data-field-kind": "textarea",
8
- "data-slot": "root",
9
- "data-control-family": "field",
10
- "data-control": "true",
11
- className: cn("field-sizing-content w-full min-w-0 resize-none", className),
12
- ...props
6
+ function Textarea({ ref, id, name, value, defaultValue, disabled, autoFocus, className, ...props }) {
7
+ return /* @__PURE__ */ jsx(Input, {
8
+ ref,
9
+ id,
10
+ name,
11
+ value,
12
+ defaultValue,
13
+ disabled,
14
+ autoFocus,
15
+ render: /* @__PURE__ */ jsx("textarea", {
16
+ ...props,
17
+ "data-control-ui": "textarea",
18
+ "data-field-kind": "textarea",
19
+ "data-slot": "root",
20
+ "data-control-family": "field",
21
+ "data-control": "true",
22
+ className: cn("field-sizing-content w-full min-w-0 resize-none", className)
23
+ })
13
24
  });
14
25
  }
15
26
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { RenderProp } from "../control-props.js";
1
2
  import { TimelineKnobStyle } from "../knob-contracts/timeline-knobs.js";
2
3
  import { CSSProperties, ComponentProps } from "react";
3
4
  //#region src/ui/timeline.d.ts
@@ -20,6 +21,7 @@ export type TimelineContentProps = ComponentProps<"div"> & {
20
21
  style?: CSSProperties & TimelineKnobStyle;
21
22
  };
22
23
  export type TimelineTitleProps = Omit<ComponentProps<"div">, "style"> & {
24
+ render?: RenderProp<ComponentProps<"div">>;
23
25
  style?: CSSProperties & TimelineKnobStyle;
24
26
  };
25
27
  export type TimelineDescriptionProps = Omit<ComponentProps<"div">, "style"> & {
@@ -33,7 +35,7 @@ export declare function TimelineItem({ state, className, ...props }: TimelineIte
33
35
  export declare function TimelineIndicator({ className, ...props }: TimelineIndicatorProps): import("react").JSX.Element;
34
36
  export declare function TimelineSeparator({ className, ...props }: TimelineSeparatorProps): import("react").JSX.Element;
35
37
  export declare function TimelineContent({ className, ...props }: TimelineContentProps): import("react").JSX.Element;
36
- export declare function TimelineTitle({ className, ...props }: TimelineTitleProps): import("react").JSX.Element;
38
+ export declare function TimelineTitle({ render, className, ...props }: TimelineTitleProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
37
39
  export declare function TimelineDescription({ className, ...props }: TimelineDescriptionProps): import("react").JSX.Element;
38
40
  export declare function TimelineMeta({ className, ...props }: TimelineMetaProps): import("react").JSX.Element;
39
41
  //#endregion
@@ -1,4 +1,6 @@
1
+ "use client";
1
2
  import { cn } from "../lib/cn.js";
3
+ import { useRender } from "@base-ui/react/use-render";
2
4
  import { jsx } from "react/jsx-runtime";
3
5
  //#region src/ui/timeline.tsx
4
6
  function Timeline({ className, ...props }) {
@@ -16,13 +18,15 @@ function TimelineItem({ state = "neutral", className, ...props }) {
16
18
  "data-control-family": "timeline",
17
19
  "data-slot": "item",
18
20
  "data-state": state,
21
+ "aria-current": state === "running" ? "step" : void 0,
19
22
  ...props,
20
23
  className: cn("group/timeline-item relative grid min-w-0 grid-cols-[1rem_minmax(0,1fr)]", className)
21
24
  });
22
25
  }
23
26
  function TimelineIndicator({ className, ...props }) {
24
27
  return /* @__PURE__ */ jsx("span", {
25
- "aria-hidden": "true",
28
+ role: props["aria-label"] ? "img" : void 0,
29
+ "aria-hidden": props["aria-label"] ? void 0 : true,
26
30
  "data-control-ui": "timeline",
27
31
  "data-control-family": "timeline",
28
32
  "data-slot": "indicator",
@@ -37,7 +41,7 @@ function TimelineSeparator({ className, ...props }) {
37
41
  "data-control-family": "timeline",
38
42
  "data-slot": "separator",
39
43
  ...props,
40
- className: cn("absolute top-5 bottom-0 left-[calc(0.5rem-0.5px)] col-start-1 w-px group-last/timeline-item:hidden", className)
44
+ className: cn("absolute top-5 bottom-0 start-[calc(0.5rem-0.5px)] col-start-1 w-px group-last/timeline-item:hidden", className)
41
45
  });
42
46
  }
43
47
  function TimelineContent({ className, ...props }) {
@@ -49,13 +53,17 @@ function TimelineContent({ className, ...props }) {
49
53
  className: cn("col-start-2 row-start-1 grid min-w-0", className)
50
54
  });
51
55
  }
52
- function TimelineTitle({ className, ...props }) {
53
- return /* @__PURE__ */ jsx("div", {
54
- "data-control-ui": "timeline",
55
- "data-control-family": "timeline",
56
- "data-slot": "title",
57
- ...props,
58
- className: cn("min-w-0", className)
56
+ function TimelineTitle({ render, className, ...props }) {
57
+ return useRender({
58
+ defaultTagName: "div",
59
+ render,
60
+ props: {
61
+ ...props,
62
+ "data-control-ui": "timeline",
63
+ "data-control-family": "timeline",
64
+ "data-slot": "title",
65
+ className: cn("min-w-0", className)
66
+ }
59
67
  });
60
68
  }
61
69
  function TimelineDescription({ className, ...props }) {
@@ -1,7 +1,7 @@
1
1
  import { ButtonProps } from "./button.js";
2
2
  import { PopupKnobStyle } from "../knob-contracts/popup-knobs.js";
3
3
  import { CSSProperties, ReactNode } from "react";
4
- import { Toast } from "@base-ui/react/toast";
4
+ import { Toast, ToastManagerAddOptions, ToastManagerPromiseOptions } from "@base-ui/react/toast";
5
5
  //#region src/ui/toast.d.ts
6
6
  export type ToasterProps = {
7
7
  className?: string;
@@ -11,18 +11,24 @@ export type ToasterProps = {
11
11
  indicatorStyle?: CSSProperties & PopupKnobStyle;
12
12
  actionStyle?: ButtonProps["style"];
13
13
  closeStyle?: ButtonProps["style"];
14
+ closeLabel?: string;
15
+ successLabel?: string;
16
+ errorLabel?: string;
17
+ warningLabel?: string;
18
+ infoLabel?: string;
14
19
  };
15
20
  export declare const toastManager: import("@base-ui/react").ToastManager<any>;
16
- type ToastOptions = Omit<Parameters<typeof toastManager.add>[0], "title">;
17
- export declare const toast: ((title: ReactNode, options?: ToastOptions) => string) & {
21
+ type ToastOptions = Omit<ToastManagerAddOptions<object>, "title">;
22
+ declare function show(title: ReactNode, options?: ToastOptions): string;
23
+ export declare const toast: typeof show & {
18
24
  success: (title: ReactNode, options?: ToastOptions) => string;
19
25
  error: (title: ReactNode, options?: ToastOptions) => string;
20
26
  warning: (title: ReactNode, options?: ToastOptions) => string;
21
27
  info: (title: ReactNode, options?: ToastOptions) => string;
22
28
  message: (title: ReactNode, options?: ToastOptions) => string;
23
- promise: (...args: Parameters<typeof toastManager.promise>) => Promise<unknown>;
29
+ promise: <Value>(promise: Promise<Value>, options: ToastManagerPromiseOptions<Value, object>) => Promise<Value>;
24
30
  dismiss: (id?: string) => void;
25
31
  };
26
32
  export declare const useToast: typeof Toast.useToastManager;
27
- export declare function Toaster({ className, timeout, limit, rootStyle, indicatorStyle, actionStyle, closeStyle }: ToasterProps): import("react").JSX.Element;
33
+ export declare function Toaster({ className, timeout, limit, rootStyle, indicatorStyle, actionStyle, closeStyle, closeLabel, successLabel, errorLabel, warningLabel, infoLabel }: ToasterProps): import("react").JSX.Element;
28
34
  //#endregion