@botiverse/raft-ui 0.72.0 → 0.74.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 (59) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/components/activity-inbox/activity-inbox-shell.d.mts +6 -3
  3. package/dist/components/activity-inbox/activity-inbox-shell.mjs +33 -14
  4. package/dist/components/activity-inbox/activity-inbox-shell.recipe.mjs +6 -1
  5. package/dist/components/announcement-dialog/announcement-dialog.d.mts +2 -1
  6. package/dist/components/announcement-dialog/announcement-dialog.mjs +5 -4
  7. package/dist/components/choice-list/choice-list.mjs +4 -1
  8. package/dist/components/choice-list/choice-list.recipe.mjs +2 -2
  9. package/dist/components/combobox-select/combobox-select.css +2 -0
  10. package/dist/components/composer/composer-suggestion-list.d.mts +5 -2
  11. package/dist/components/composer/composer-suggestion-list.mjs +10 -8
  12. package/dist/components/composer/composer.recipe.mjs +1 -1
  13. package/dist/components/dialog/dialog.d.mts +5 -3
  14. package/dist/components/dialog/dialog.mjs +16 -10
  15. package/dist/components/files/files.d.mts +5 -2
  16. package/dist/components/files/files.mjs +11 -2
  17. package/dist/components/files/files.recipe.mjs +1 -1
  18. package/dist/components/filter-chip/filter-chip.mjs +2 -1
  19. package/dist/components/markdown/markdown-parts.d.mts +1 -1
  20. package/dist/components/markdown/markdown-parts.mjs +1 -1
  21. package/dist/components/message-action-card/message-action-card-content.recipe.mjs +2 -1
  22. package/dist/components/message-action-card/message-action-card.d.mts +6 -4
  23. package/dist/components/message-action-card/message-action-card.mjs +14 -27
  24. package/dist/components/message-list/message-list.mjs +3 -3
  25. package/dist/components/mobile-nav/mobile-nav-server.d.mts +4 -2
  26. package/dist/components/mobile-nav/mobile-nav-server.mjs +9 -5
  27. package/dist/components/notification-center/notification-center.d.mts +5 -2
  28. package/dist/components/notification-center/notification-center.mjs +10 -8
  29. package/dist/components/panel/panel-action.mjs +1 -1
  30. package/dist/components/panel/panel.d.mts +10 -2
  31. package/dist/components/panel/panel.mjs +26 -3
  32. package/dist/components/panel/panel.recipe.mjs +2 -1
  33. package/dist/components/scroll-area/scroll-area.css +27 -10
  34. package/dist/components/scroll-area/types.d.mts +3 -1
  35. package/dist/components/scroll-area/use-scroll-area-container.d.mts +2 -1
  36. package/dist/components/search/search.d.mts +5 -3
  37. package/dist/components/search/search.mjs +9 -10
  38. package/dist/components/search/search.recipe.mjs +1 -1
  39. package/dist/components/segmented-control/segmented-control.mjs +1 -1
  40. package/dist/components/sidebar/sidebar.mjs +1 -1
  41. package/dist/components/tabs/tabs.mjs +1 -1
  42. package/dist/components/tasks/tasks-panel.d.mts +6 -2
  43. package/dist/components/tasks/tasks-panel.mjs +10 -7
  44. package/dist/components/tasks/tasks-panel.recipe.mjs +1 -1
  45. package/dist/components/toggle-group/toggle-group.mjs +1 -1
  46. package/dist/components/virtual-list/styles/virtual-list.css +3 -0
  47. package/dist/index.d.mts +1 -1
  48. package/dist/index.mjs +4 -4
  49. package/dist/lib/use-scrollbar-size.d.mts +3 -0
  50. package/dist/lib/use-scrollbar-size.mjs +3 -0
  51. package/dist/lint/prefer-scroll-area.d.mts +75 -0
  52. package/dist/lint/prefer-scroll-area.mjs +157 -0
  53. package/dist/lint/recommended.json +6 -0
  54. package/dist/lint.d.mts +22 -0
  55. package/dist/lint.mjs +29 -0
  56. package/dist/styles.css +3 -2
  57. package/package.json +6 -1
  58. package/skills/raft-ui-guide/SKILL.md +1 -0
  59. package/skills/raft-ui-guide/rules/technical-overview.md +1 -0
@@ -1,4 +1,5 @@
1
1
  import { tv } from "../../lib/tv.mjs";
2
+ import { ScrollArea } from "../scroll-area/scroll-area.mjs";
2
3
  import { MobileNavItem } from "./mobile-nav.mjs";
3
4
  import "../../lib/touch-drag.mjs";
4
5
  import { PopoverContent } from "../popover/popover.mjs";
@@ -17,7 +18,7 @@ const mobileNavServer = tv({ slots: {
17
18
  "w-[calc(var(--anchor-width)-16px)] min-w-0",
18
19
  "max-h-[min(60dvh,calc(var(--available-height)-env(safe-area-inset-top,0px)))]"
19
20
  ],
20
- list: ["flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-contain p-1"],
21
+ list: ["flex min-h-0 flex-1 flex-col p-1"],
21
22
  group: ["flex shrink-0 flex-col p-1"],
22
23
  row: [
23
24
  "flex w-full shrink-0 cursor-default select-none items-center",
@@ -187,13 +188,16 @@ function MobileNavServerPopoverContent({ anchor, side = "top", align = "center",
187
188
  ...props
188
189
  });
189
190
  }
190
- /** The server list: takes the room left in the popover and scrolls inside it. */
191
+ /** The server list: takes the room left in the popover and scrolls inside it,
192
+ * a ScrollArea (a column with no gap, so its gutters move nothing). */
191
193
  function MobileNavServerPopoverList({ className, ...props }) {
192
194
  const { list } = mobileNavServer();
193
- return /* @__PURE__ */ jsx("div", {
195
+ return /* @__PURE__ */ jsx(ScrollArea, {
194
196
  "data-slot": "mobile-nav-server-popover-list",
195
- className: list({ className }),
196
- ...props
197
+ overscroll: "contain",
198
+ tabIndex: -1,
199
+ ...props,
200
+ className: list({ className })
197
201
  });
198
202
  }
199
203
  /** Rows that always stay in view, such as the footer actions. */
@@ -1,6 +1,7 @@
1
1
  import { StyledProps } from "../../lib/styled-props.mjs";
2
2
  import { VariantProps } from "../../lib/tv.mjs";
3
3
  import { ButtonProps } from "../button/button.mjs";
4
+ import { ScrollAreaProps } from "../scroll-area/types.mjs";
4
5
  import { EmptyStateProps } from "../empty-state/empty-state.mjs";
5
6
  import { useRender } from "@base-ui/react/use-render";
6
7
  import { Popover } from "@base-ui/react/popover";
@@ -198,8 +199,10 @@ export type NotificationCenterTitleProps = useRender.ComponentProps<"span">;
198
199
  export declare function NotificationCenterTitle({ render, className, ...props }: NotificationCenterTitleProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
199
200
  export type NotificationCenterCountProps = useRender.ComponentProps<"span">;
200
201
  export declare function NotificationCenterCount({ render, className, ...props }: NotificationCenterCountProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
201
- export type NotificationCenterScrollerProps = useRender.ComponentProps<"div">;
202
- export declare function NotificationCenterScroller({ render, className, ...props }: NotificationCenterScrollerProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
202
+ export type NotificationCenterScrollerProps = ScrollAreaProps;
203
+ /** The notices' scroller, a ScrollArea: `ref`, `className`, `render` and the
204
+ * native props are the scrolling element's. */
205
+ export declare function NotificationCenterScroller({ className, ...props }: NotificationCenterScrollerProps): import("react").JSX.Element;
203
206
  export type NotificationCenterListProps = useRender.ComponentProps<"ul">;
204
207
  export declare function NotificationCenterList({ render, className, ...props }: NotificationCenterListProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
205
208
  export type NotificationCenterItemProps = useRender.ComponentProps<"li"> & Pick<VariantProps<typeof notificationCenter>, "read">;
@@ -2,6 +2,7 @@ import { headEdgePull } from "../../lib/head-edges.mjs";
2
2
  import { tv } from "../../lib/tv.mjs";
3
3
  import { useThemeScopeProps } from "../../lib/theme/theme-scope.mjs";
4
4
  import { Button } from "../button/button.mjs";
5
+ import { ScrollArea } from "../scroll-area/scroll-area.mjs";
5
6
  import { Status } from "../status/status.mjs";
6
7
  import { usePopupCollision } from "../../lib/frame-insets.mjs";
7
8
  import { EmptyState } from "../empty-state/empty-state.mjs";
@@ -36,7 +37,7 @@ const notificationCenter = tv({
36
37
  ],
37
38
  title: ["font-sans text-headline text-foreground"],
38
39
  count: ["ml-auto", "font-mono text-mono-meta text-foreground-hint"],
39
- scroller: ["min-h-0 flex-1 overflow-y-auto overscroll-contain"],
40
+ scroller: ["min-h-0 flex-1"],
40
41
  list: [],
41
42
  item: [
42
43
  "group/notification-center-item relative px-4 py-3",
@@ -204,14 +205,15 @@ function NotificationCenterCount({ render, className, ...props }) {
204
205
  state: { slot: "notification-center-count" }
205
206
  });
206
207
  }
207
- function NotificationCenterScroller({ render, className, ...props }) {
208
+ /** The notices' scroller, a ScrollArea: `ref`, `className`, `render` and the
209
+ * native props are the scrolling element's. */
210
+ function NotificationCenterScroller({ className, ...props }) {
208
211
  const { scroller } = notificationCenter();
209
- const defaultProps = { className: scroller({ className }) };
210
- return useRender({
211
- defaultTagName: "div",
212
- render,
213
- props: mergeProps(defaultProps, props),
214
- state: { slot: "notification-center-scroller" }
212
+ return /* @__PURE__ */ jsx(ScrollArea, {
213
+ "data-slot": "notification-center-scroller",
214
+ overscroll: "contain",
215
+ ...props,
216
+ className: scroller({ className })
215
217
  });
216
218
  }
217
219
  function NotificationCenterList({ render, className, ...props }) {
@@ -1,6 +1,6 @@
1
1
  import { defaultNativeButton } from "../../lib/default-native-button.mjs";
2
- import { useTapActivation } from "../../lib/tap-activation.mjs";
3
2
  import { useMergedRef } from "../../lib/use-merged-ref.mjs";
3
+ import { useTapActivation } from "../../lib/tap-activation.mjs";
4
4
  import { panelAction } from "./panel-action.recipe.mjs";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { Button } from "@base-ui/react/button";
@@ -1,3 +1,4 @@
1
+ import { ScrollAreaProps } from "../scroll-area/types.mjs";
1
2
  import { useRender } from "@base-ui/react/use-render";
2
3
  //#region src/components/panel/panel.d.ts
3
4
  export type PanelEdge = "attached" | "inset";
@@ -14,8 +15,15 @@ export type PanelHeaderRootProps = useRender.ComponentProps<"div">;
14
15
  export declare function PanelHeaderRoot({ className, render, ...props }: PanelHeaderRootProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
15
16
  export type PanelBodyProps = useRender.ComponentProps<"div">;
16
17
  export declare function PanelBody({ className, render, ...props }: PanelBodyProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
17
- export type PanelScrollViewportProps = useRender.ComponentProps<"div">;
18
- export declare function PanelScrollViewport({ className, render, ...props }: PanelScrollViewportProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
18
+ export type PanelScrollViewportProps = ScrollAreaProps;
19
+ /**
20
+ * The panel's one scroll container, a ScrollArea: its overlay scrollbar takes
21
+ * no room and looks the same on every platform, and a scroll that reaches the
22
+ * end stops there (`overscroll="contain"`). `ref`, `className`, `render` and
23
+ * the native props are the scrolling element's; ScrollArea's options pass
24
+ * through.
25
+ */
26
+ export declare function PanelScrollViewport({ className, ...props }: PanelScrollViewportProps): import("react").JSX.Element;
19
27
  export type PanelScrollContentProps = useRender.ComponentProps<"div">;
20
28
  export declare function PanelScrollContent({ className, render, ...props }: PanelScrollContentProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
21
29
  export type PanelSectionProps = useRender.ComponentProps<"section">;
@@ -1,4 +1,6 @@
1
+ import { ScrollArea } from "../scroll-area/scroll-area.mjs";
1
2
  import { panel } from "./panel.recipe.mjs";
3
+ import { jsx } from "react/jsx-runtime";
2
4
  import { mergeProps } from "@base-ui/react/merge-props";
3
5
  import { useRender } from "@base-ui/react/use-render";
4
6
  //#region src/components/panel/panel.tsx
@@ -44,11 +46,32 @@ function PanelBody({ className, render, ...props }) {
44
46
  props: mergeProps(defaultProps, props)
45
47
  });
46
48
  }
47
- function PanelScrollViewport({ className, render, ...props }) {
49
+ /**
50
+ * The panel's one scroll container, a ScrollArea: its overlay scrollbar takes
51
+ * no room and looks the same on every platform, and a scroll that reaches the
52
+ * end stops there (`overscroll="contain"`). `ref`, `className`, `render` and
53
+ * the native props are the scrolling element's; ScrollArea's options pass
54
+ * through.
55
+ */
56
+ function PanelScrollViewport({ className, ...props }) {
48
57
  const { scrollViewport } = panel();
49
- const defaultProps = {
58
+ return /* @__PURE__ */ jsx(ScrollArea, {
50
59
  "data-slot": "panel-scroll-viewport",
60
+ overscroll: "contain",
61
+ ...props,
51
62
  className: scrollViewport({ className })
63
+ });
64
+ }
65
+ /**
66
+ * The panel's native scroller, for MessageList's phone path only, which
67
+ * scrolls natively below 768px (message-list.md#behavior). Not exported from
68
+ * the package.
69
+ */
70
+ function PanelNativeScrollViewport({ className, render, ...props }) {
71
+ const { nativeScrollViewport } = panel();
72
+ const defaultProps = {
73
+ "data-slot": "panel-scroll-viewport",
74
+ className: nativeScrollViewport({ className })
52
75
  };
53
76
  return useRender({
54
77
  defaultTagName: "div",
@@ -93,4 +116,4 @@ function PanelFooter({ className, render, ...props }) {
93
116
  });
94
117
  }
95
118
  //#endregion
96
- export { Panel, PanelBody, PanelFooter, PanelHeaderRoot, PanelScrollContent, PanelScrollViewport, PanelSection };
119
+ export { Panel, PanelBody, PanelFooter, PanelHeaderRoot, PanelNativeScrollViewport, PanelScrollContent, PanelScrollViewport, PanelSection };
@@ -5,7 +5,8 @@ const panel = tv({
5
5
  root: ["[--panel-footer-clearance:10rem]", "bg-layer-canvas text-foreground"],
6
6
  header: ["[@media(max-height:600px)]:h-(--header-height-short)"],
7
7
  body: ["relative min-h-0 flex-1 overflow-hidden"],
8
- scrollViewport: ["h-full min-h-0 overflow-y-auto overscroll-contain", "[overflow-anchor:auto] [-webkit-overflow-scrolling:touch]"],
8
+ scrollViewport: ["h-full min-h-0", "[overflow-anchor:auto]"],
9
+ nativeScrollViewport: ["h-full min-h-0 overflow-y-auto overscroll-contain", "[overflow-anchor:auto] [-webkit-overflow-scrolling:touch]"],
9
10
  scrollContent: ["min-h-full"],
10
11
  section: ["border-t px-(--surface-inset) py-4", "border-line-hairline"],
11
12
  footer: [
@@ -24,8 +24,8 @@
24
24
  * `--overflow-{y,x}-{start,end}` (more content past that edge; `x` is
25
25
  * inline; these and `--rtl` are set by the script with `classList`, never
26
26
  * rendered) and `--textarea`; `__container` (with absolute gutters, the
27
- * container), `__viewport` (ScrollArea's own `<div>` container: its
28
- * overflow), `__content`, `__textarea`, `__gutters` (with `--scrolling`,
27
+ * container), `__viewport` (ScrollArea's own `<div>` container),
28
+ * `__content`, `__textarea`, `__gutters` (with `--scrolling`,
29
29
  * from the first scroll until `hideDelay` after the last, and `--dragging`,
30
30
  * both set by the script: on the layer, so toggling them restyles only the
31
31
  * gutters, not the content under the root), `__gutter` (`--vertical`,
@@ -216,9 +216,9 @@
216
216
  }
217
217
 
218
218
  /*
219
- * The container. Its own overflow, layout and focus are its own (a list,
220
- * a textarea); the overlay scrollbars replace its native ones. With sticky
221
- * gutters it is the root.
219
+ * The container. Its layout and focus are its own (a list, a textarea);
220
+ * its overflow is the orientation's (below), and the overlay scrollbars
221
+ * replace its native ones. With sticky gutters it is the root.
222
222
  */
223
223
  .r-scroll-area.r-scroll-area--sticky-gutters,
224
224
  .r-scroll-area.r-scroll-area--absolute-gutters > .r-scroll-area__container {
@@ -242,17 +242,34 @@
242
242
  position: relative;
243
243
  }
244
244
 
245
- /* ScrollArea's own `<div>` container (always sticky) scrolls in the orientation. */
246
- .r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area__viewport {
245
+ /*
246
+ * Every container scrolls in the orientation: ScrollArea's own `<div>` and
247
+ * a `useScrollAreaContainer` element alike, so a caller never writes the
248
+ * overflow. With no specificity (`:where`), so a component's own rule for
249
+ * its scroller (VirtualList's) or an overflow in the caller's `className`
250
+ * still wins over it.
251
+ */
252
+ :where(.r-scroll-area.r-scroll-area--sticky-gutters),
253
+ :where(.r-scroll-area.r-scroll-area--absolute-gutters > .r-scroll-area__container) {
247
254
  overflow: hidden auto;
248
- position: relative;
249
255
  }
250
- .r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area--horizontal-orientation.r-scroll-area__viewport {
256
+ :where(.r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area--horizontal-orientation),
257
+ :where(
258
+ .r-scroll-area.r-scroll-area--absolute-gutters.r-scroll-area--horizontal-orientation
259
+ > .r-scroll-area__container
260
+ ) {
251
261
  overflow: auto hidden;
252
262
  }
253
- .r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area--both-orientation.r-scroll-area__viewport {
263
+ :where(.r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area--both-orientation),
264
+ :where(
265
+ .r-scroll-area.r-scroll-area--absolute-gutters.r-scroll-area--both-orientation
266
+ > .r-scroll-area__container
267
+ ) {
254
268
  overflow: auto;
255
269
  }
270
+ .r-scroll-area.r-scroll-area--sticky-gutters.r-scroll-area__viewport {
271
+ position: relative;
272
+ }
256
273
 
257
274
  /*
258
275
  * A scroll that reaches the end stops there instead of scrolling the page:
@@ -116,7 +116,9 @@ export type ScrollAreaContainerProps<E extends HTMLElement = HTMLElement> = {
116
116
  ref: RefCallback<E>;
117
117
  /**
118
118
  * Before your own classes. With sticky gutters the container is the root, so these are the
119
- * root's classes and modifiers; with absolute gutters, `r-scroll-area__container`.
119
+ * root's classes and modifiers; with absolute gutters, `r-scroll-area__container`. They give the
120
+ * element the orientation's overflow (vertical: `overflow-y: auto`, `overflow-x: hidden`), so
121
+ * it needs no overflow class of its own; one of yours still wins over it.
120
122
  */
121
123
  className: string;
122
124
  /** With sticky gutters, the root's variables (`railInset`, the timelines); merge your style after it. */
@@ -6,7 +6,8 @@ import { ScrollAreaContainer, ScrollAreaContainerOptions, ScrollAreaFrameProps }
6
6
  * its scroll, and keeps the state; you render the elements.
7
7
  *
8
8
  * Spread `containerProps` on the element that scrolls (a `<ul>`, a `<textarea>`, VirtualList's
9
- * scroller through `domRef`), merging your own `className` and `style` with them (pass your own
9
+ * scroller through `domRef`), merging your own `className` and `style` with them; its classes give
10
+ * the element the orientation's overflow, so it needs no overflow class (pass your own
10
11
  * refs as `containerRef` and `frameRef`: the returned `ref`s already forward to them), and render
11
12
  * `<ScrollAreaGutters {...guttersProps} />` where `guttersPosition` says:
12
13
  *
@@ -9,9 +9,11 @@ export declare function SearchShellRoot({ className, edge, render, ...props }: S
9
9
  export type SearchShellFiltersProps = ComponentPropsWithRef<"div">;
10
10
  export declare function SearchShellFilters({ className, ...props }: SearchShellFiltersProps): import("react").JSX.Element;
11
11
  export type SearchShellViewportProps = ComponentPropsWithRef<"div">;
12
- /** The results' scroller. It publishes its scrollbar's width for the result
13
- * cells (useScrollbarSize), so their fills sit 8px from both edges. */
14
- export declare function SearchShellViewport({ className, ref, ...props }: SearchShellViewportProps): import("react").JSX.Element;
12
+ /** The results' scroller, a ScrollArea: its overlay scrollbar takes no room,
13
+ * so the result cells' fills sit 8px from both edges with or without it
14
+ * (design/patterns/lists.md). `ref`, `className` and the native props are the
15
+ * scrolling element's. */
16
+ export declare function SearchShellViewport({ className, ...props }: SearchShellViewportProps): import("react").JSX.Element;
15
17
  export type SearchResultsSummaryProps = useRender.ComponentProps<"span">;
16
18
  export declare function SearchResultsSummary({ className, render, ...props }: SearchResultsSummaryProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
17
19
  export type SearchResultsSectionProps = useRender.ComponentProps<"div">;
@@ -1,6 +1,5 @@
1
- import { useMergedRef } from "../../lib/use-merged-ref.mjs";
1
+ import { ScrollArea } from "../scroll-area/scroll-area.mjs";
2
2
  import { Panel } from "../panel/panel.mjs";
3
- import { useScrollbarSize } from "../../lib/use-scrollbar-size.mjs";
4
3
  import { search } from "./search.recipe.mjs";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -23,17 +22,17 @@ function SearchShellFilters({ className, ...props }) {
23
22
  ...props
24
23
  });
25
24
  }
26
- /** The results' scroller. It publishes its scrollbar's width for the result
27
- * cells (useScrollbarSize), so their fills sit 8px from both edges. */
28
- function SearchShellViewport({ className, ref, ...props }) {
25
+ /** The results' scroller, a ScrollArea: its overlay scrollbar takes no room,
26
+ * so the result cells' fills sit 8px from both edges with or without it
27
+ * (design/patterns/lists.md). `ref`, `className` and the native props are the
28
+ * scrolling element's. */
29
+ function SearchShellViewport({ className, ...props }) {
29
30
  const { viewport } = search();
30
- const scrollbarRef = useScrollbarSize();
31
- const [setRef] = useMergedRef(ref, scrollbarRef);
32
- return /* @__PURE__ */ jsx("div", {
31
+ return /* @__PURE__ */ jsx(ScrollArea, {
33
32
  "data-slot": "search-shell-viewport",
34
- className: viewport({ className }),
33
+ overscroll: "contain",
35
34
  ...props,
36
- ref: setRef
35
+ className: viewport({ className })
37
36
  });
38
37
  }
39
38
  function SearchResultsSummary({ className, render, ...props }) {
@@ -12,7 +12,7 @@ const search = tv({ slots: {
12
12
  "border-b border-line-seam bg-layer-canvas px-(--column-margin) py-3",
13
13
  "md:pointer-fine:py-[calc((var(--header-height)-1px-var(--control-height))/2)]"
14
14
  ],
15
- viewport: ["min-h-0 flex-1 overflow-y-auto scrollbar-list p-4", "bg-layer-canvas px-0 pt-0 pb-4"],
15
+ viewport: ["min-h-0 flex-1 p-4", "bg-layer-canvas px-0 pt-0 pb-4"],
16
16
  summary: ["block", "mb-0 px-(--surface-inset) pt-2 font-sans text-footnote text-foreground-hint"],
17
17
  section: ["mb-0"],
18
18
  sectionHeading: [
@@ -1,6 +1,6 @@
1
1
  import { tv } from "../../lib/tv.mjs";
2
- import { useTapActivation } from "../../lib/tap-activation.mjs";
3
2
  import { useMergedRef } from "../../lib/use-merged-ref.mjs";
3
+ import { useTapActivation } from "../../lib/tap-activation.mjs";
4
4
  import { Tooltip, TooltipContent, TooltipTrigger } from "../tooltip/tooltip.mjs";
5
5
  import { createContext, use, useCallback, useLayoutEffect, useRef, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import { useMobileViewport } from "../../lib/use-mobile-viewport.mjs";
2
1
  import { ScrollArea } from "../scroll-area/scroll-area.mjs";
2
+ import { useMobileViewport } from "../../lib/use-mobile-viewport.mjs";
3
3
  import { sidebarRecipe } from "./sidebar.recipe.mjs";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -1,6 +1,6 @@
1
1
  import { tv } from "../../lib/tv.mjs";
2
- import { useTapActivation } from "../../lib/tap-activation.mjs";
3
2
  import { useMergedRef } from "../../lib/use-merged-ref.mjs";
3
+ import { useTapActivation } from "../../lib/tap-activation.mjs";
4
4
  import { createDragAnnouncements, dragInstructions } from "../drag/drag-announcements.mjs";
5
5
  import { DragLift, useDragSiblingTransition, useLiftContainer } from "../drag/drag-lift.mjs";
6
6
  import { useDragSensors } from "../drag/drag-sensors.mjs";
@@ -1,3 +1,4 @@
1
+ import { ScrollAreaProps } from "../scroll-area/types.mjs";
1
2
  import { useRender } from "@base-ui/react/use-render";
2
3
  //#region src/components/tasks/tasks-panel.d.ts
3
4
  export type TasksPanelRootProps = useRender.ComponentProps<"section">;
@@ -15,8 +16,11 @@ export type TasksPanelToolbarViewProps = useRender.ComponentProps<"div">;
15
16
  export declare function TasksPanelToolbarView({ className, render, ...props }: TasksPanelToolbarViewProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
16
17
  export type TasksPanelToolbarLabelProps = useRender.ComponentProps<"span">;
17
18
  export declare function TasksPanelToolbarLabel({ className, render, ...props }: TasksPanelToolbarLabelProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
18
- export type TasksPanelViewportProps = useRender.ComponentProps<"div">;
19
- export declare function TasksPanelViewport({ className, render, ...props }: TasksPanelViewportProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
19
+ export type TasksPanelViewportProps = ScrollAreaProps;
20
+ /** The tasks' scroller, a ScrollArea in both directions (a board is wider
21
+ * than the panel): `ref`, `className`, `render` and the native props are the
22
+ * scrolling element's. */
23
+ export declare function TasksPanelViewport({ className, ...props }: TasksPanelViewportProps): import("react").JSX.Element;
20
24
  export type TasksPanelEmptyProps = useRender.ComponentProps<"div">;
21
25
  export declare function TasksPanelEmpty({ className, render, ...props }: TasksPanelEmptyProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
22
26
  //#endregion
@@ -1,4 +1,6 @@
1
+ import { ScrollArea } from "../scroll-area/scroll-area.mjs";
1
2
  import { tasksPanel } from "./tasks-panel.recipe.mjs";
3
+ import { jsx } from "react/jsx-runtime";
2
4
  import { mergeProps } from "@base-ui/react/merge-props";
3
5
  import { useRender } from "@base-ui/react/use-render";
4
6
  //#region src/components/tasks/tasks-panel.tsx
@@ -86,16 +88,17 @@ function TasksPanelToolbarLabel({ className, render, ...props }) {
86
88
  props: mergeProps(defaultProps, props)
87
89
  });
88
90
  }
89
- function TasksPanelViewport({ className, render, ...props }) {
91
+ /** The tasks' scroller, a ScrollArea in both directions (a board is wider
92
+ * than the panel): `ref`, `className`, `render` and the native props are the
93
+ * scrolling element's. */
94
+ function TasksPanelViewport({ className, ...props }) {
90
95
  const { viewport } = tasksPanel();
91
- const defaultProps = {
96
+ return /* @__PURE__ */ jsx(ScrollArea, {
92
97
  "data-slot": "tasks-panel-viewport",
98
+ orientation: "both",
99
+ overscroll: "contain",
100
+ ...props,
93
101
  className: viewport({ className })
94
- };
95
- return useRender({
96
- defaultTagName: "div",
97
- render,
98
- props: mergeProps(defaultProps, props)
99
102
  });
100
103
  }
101
104
  function TasksPanelEmpty({ className, render, ...props }) {
@@ -26,7 +26,7 @@ const tasksPanel = tv({ slots: {
26
26
  "font-sans text-footnote font-semibold text-foreground-muted whitespace-nowrap"
27
27
  ],
28
28
  viewport: [
29
- "min-h-0 flex-1 overflow-auto overscroll-contain p-4",
29
+ "min-h-0 flex-1 p-4",
30
30
  "pb-[calc(1rem+env(safe-area-inset-bottom,0px))]",
31
31
  "bg-layer-canvas px-(--surface-inset)",
32
32
  "@max-md/tasks:px-4"
@@ -1,7 +1,7 @@
1
1
  import { tv } from "../../lib/tv.mjs";
2
2
  import { defaultNativeButton } from "../../lib/default-native-button.mjs";
3
- import { useTapActivation } from "../../lib/tap-activation.mjs";
4
3
  import { useMergedRef } from "../../lib/use-merged-ref.mjs";
4
+ import { useTapActivation } from "../../lib/tap-activation.mjs";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { Toggle } from "@base-ui/react/toggle";
7
7
  import { ToggleGroup } from "@base-ui/react/toggle-group";
@@ -18,6 +18,9 @@
18
18
  * scroll would restyle every row. Content that must follow the rows' offset uses `onTransformChange`.
19
19
  */
20
20
  @layer components {
21
+ /* VirtualList renders its own scroller (scroll-area.md#native-scrolling): it
22
+ hides its scrollbar unless asked, and takes ScrollArea's through
23
+ useScrollAreaContainer. */
21
24
  .r-virtual-list {
22
25
  max-height: inherit;
23
26
  overflow-anchor: none;
package/dist/index.d.mts CHANGED
@@ -2,6 +2,7 @@ import { Button, ButtonProps, ButtonSize, DeprecatedButtonSize, buttonVariants }
2
2
  import "./components/button/index.mjs";
3
3
  import { AlertDialog, AlertDialogAction, AlertDialogActionProps, AlertDialogBody, AlertDialogBodyProps, AlertDialogCancel, AlertDialogCancelProps, AlertDialogClose, AlertDialogCloseProps, AlertDialogContent, AlertDialogContentProps, AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogFooter, AlertDialogFooterProps, AlertDialogHeader, AlertDialogHeaderProps, AlertDialogOverlay, AlertDialogOverlayProps, AlertDialogPortal, AlertDialogPortalProps, AlertDialogProps, AlertDialogTitle, AlertDialogTitleProps, AlertDialogTrigger, AlertDialogTriggerProps } from "./components/alert-dialog/alert-dialog.mjs";
4
4
  import "./components/alert-dialog/index.mjs";
5
+ import { ScrollAreaActions, ScrollAreaContainer, ScrollAreaContainerOptions, ScrollAreaContainerProps, ScrollAreaContentProps, ScrollAreaEdges, ScrollAreaFrameProps, ScrollAreaGuttersBinding, ScrollAreaGuttersPosition, ScrollAreaGuttersProps, ScrollAreaOptions, ScrollAreaOrientation, ScrollAreaOverscroll, ScrollAreaOwnProps, ScrollAreaProps, ScrollAreaRailInset, ScrollAreaScrollToElementOptions, ScrollAreaSize, ScrollAreaTextareaOwnProps, ScrollAreaTextareaProps, ScrollAreaTrigger } from "./components/scroll-area/types.mjs";
5
6
  import { PanelAction, PanelActionProps } from "./components/panel/panel-action.mjs";
6
7
  import { Dialog, DialogBody, DialogBodyProps, DialogClose, DialogCloseProps, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, DialogFooter, DialogFooterProps, DialogHeader, DialogHeaderProps, DialogNav, DialogNavProps, DialogOverlay, DialogOverlayProps, DialogPortal, DialogPortalProps, DialogProps, DialogSurface, DialogSurfaceProps, DialogTitle, DialogTitleProps, DialogTrigger, DialogTriggerProps } from "./components/dialog/dialog.mjs";
7
8
  import "./components/dialog/index.mjs";
@@ -92,7 +93,6 @@ import { CodeBlock, CodeBlockAction, CodeBlockActionProps, CodeBlockActions, Cod
92
93
  import "./components/code-block/index.mjs";
93
94
  import { InlineCode, InlineCodeProps } from "./components/inline-code/inline-code.mjs";
94
95
  import "./components/inline-code/index.mjs";
95
- import { ScrollAreaActions, ScrollAreaContainer, ScrollAreaContainerOptions, ScrollAreaContainerProps, ScrollAreaContentProps, ScrollAreaEdges, ScrollAreaFrameProps, ScrollAreaGuttersBinding, ScrollAreaGuttersPosition, ScrollAreaGuttersProps, ScrollAreaOptions, ScrollAreaOrientation, ScrollAreaOverscroll, ScrollAreaOwnProps, ScrollAreaProps, ScrollAreaRailInset, ScrollAreaScrollToElementOptions, ScrollAreaSize, ScrollAreaTextareaOwnProps, ScrollAreaTextareaProps, ScrollAreaTrigger } from "./components/scroll-area/types.mjs";
96
96
  import { MarkdownBlockquote, MarkdownBlockquoteProps, MarkdownCell, MarkdownCellProps, MarkdownCheckbox, MarkdownCheckboxProps, MarkdownHeaderCell, MarkdownHeaderCellProps, MarkdownHeading, MarkdownHeadingLevel, MarkdownHeadingProps, MarkdownImage, MarkdownImageProps, MarkdownInlineCode, MarkdownInlineCodeProps, MarkdownLink, MarkdownLinkProps, MarkdownList, MarkdownListItem, MarkdownListItemProps, MarkdownListProps, MarkdownMark, MarkdownMarkProps, MarkdownOrderedList, MarkdownOrderedListProps, MarkdownParagraph, MarkdownParagraphProps, MarkdownRule, MarkdownRuleProps, MarkdownTable, MarkdownTableProps, MarkdownTableRow, MarkdownTableRowProps, MarkdownTableScroll, MarkdownTableScrollProps } from "./components/markdown/markdown-parts.mjs";
97
97
  import "./components/markdown/index.mjs";
98
98
  import { MessageItem, MessageItemProps } from "./components/message-item/message-item-root.mjs";
package/dist/index.mjs CHANGED
@@ -4,6 +4,9 @@ import { useTheme } from "./lib/theme/use-theme.mjs";
4
4
  import { Spinner } from "./components/spinner/spinner.mjs";
5
5
  import { Button, buttonVariants } from "./components/button/button.mjs";
6
6
  import { AlertDialog, AlertDialogAction, AlertDialogBody, AlertDialogCancel, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from "./components/alert-dialog/alert-dialog.mjs";
7
+ import { ScrollAreaGutters } from "./components/scroll-area/scroll-area-gutters.mjs";
8
+ import { useScrollAreaContainer } from "./components/scroll-area/use-scroll-area-container.mjs";
9
+ import { ScrollArea, ScrollAreaContent } from "./components/scroll-area/scroll-area.mjs";
7
10
  import { TextLink, TextLinkExternalIcon, textLinkVariants } from "./components/text-link/text-link.mjs";
8
11
  import { PanelAction } from "./components/panel/panel-action.mjs";
9
12
  import { Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogNav, DialogOverlay, DialogPortal, DialogSurface, DialogTitle, DialogTrigger } from "./components/dialog/dialog.mjs";
@@ -19,9 +22,6 @@ import { AppRailFooter, AppRailHeader, AppRailItem, AppRailItemAttention, AppRai
19
22
  import { CopyableCode, CopyableCodeAction, CopyableCodeRoot } from "./components/copyable-code/copyable-code.mjs";
20
23
  import { CheckboxIndicator } from "./components/checkbox/checkbox-indicator.mjs";
21
24
  import { Checkbox } from "./components/checkbox/checkbox.mjs";
22
- import { ScrollAreaGutters } from "./components/scroll-area/scroll-area-gutters.mjs";
23
- import { useScrollAreaContainer } from "./components/scroll-area/use-scroll-area-container.mjs";
24
- import { ScrollArea, ScrollAreaContent } from "./components/scroll-area/scroll-area.mjs";
25
25
  import { ScrollAreaTextarea } from "./components/scroll-area/scroll-area-textarea.mjs";
26
26
  import { SidebarBody, SidebarContent, SidebarGroupLabel, SidebarHeader, SidebarHeaderTitle, SidebarRoot } from "./components/sidebar/sidebar.mjs";
27
27
  import { SidebarMenu, SidebarMenuAside, SidebarMenuCount, SidebarMenuIcon, SidebarMenuTitle } from "./components/sidebar/sidebar-menu.mjs";
@@ -125,7 +125,6 @@ import { TasksPanelEmpty, TasksPanelRoot, TasksPanelToolbar, TasksPanelToolbarFi
125
125
  import { TaskLoadingList, TaskLoadingRow } from "./components/tasks/task-loading.mjs";
126
126
  import { TaskChip } from "./components/tasks/task-chip.mjs";
127
127
  import { TaskStatusBadge } from "./components/tasks/task-status-badge.mjs";
128
- import { useScrollbarSize } from "./lib/use-scrollbar-size.mjs";
129
128
  import { ActivityInboxLoadingMore, ActivityInboxPanel, ActivityInboxViewport } from "./components/activity-inbox/activity-inbox-shell.mjs";
130
129
  import { ActivityInboxSidebar } from "./components/activity-inbox/activity-inbox-sidebar.mjs";
131
130
  import { ActivityInboxControls, ActivityInboxSelectionCount, ActivityInboxSelectionToolbar } from "./components/activity-inbox/activity-inbox-toolbar.mjs";
@@ -136,6 +135,7 @@ import { SearchMessageResult, SearchMessageResultBody, SearchMessageResultHeader
136
135
  import { SearchThreadResult, SearchThreadResultHeader, SearchThreadResultMessages, SearchThreadResultMeta, SearchThreadResultTimestamp, SearchThreadResultTitle } from "./components/search/search-thread.mjs";
137
136
  import { SearchTrigger, SearchTriggerLabel, SearchTriggerShortcut } from "./components/search/search-trigger.mjs";
138
137
  import { LOCATED_MS, useLocated } from "./lib/located.mjs";
138
+ import { useScrollbarSize } from "./lib/use-scrollbar-size.mjs";
139
139
  import { installInputModality } from "./lib/input-modality.mjs";
140
140
  import { ThemeProvider } from "./lib/theme/theme-provider.mjs";
141
141
  export { ActivityInboxControls, ActivityInboxLoadingMore, ActivityInboxPanel, ActivityInboxSelectionCount, ActivityInboxSelectionToolbar, ActivityInboxSidebar, ActivityInboxViewport, AddCommentIcon, AlertDialog, AlertDialogAction, AlertDialogBody, AlertDialogCancel, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppRailFooter, AppRailHeader, AppRailItem, AppRailItemAttention, AppRailItemBadge, AppRailItemIcon, AppRailItemIndicator, AppRailItemLabel, AppRailNav, AppRailRoot, AppShellMainSlot, AppShellOverlaySlot, AppShellPanelSlot, AppShellRailSlot, AppShellRoot, AppShellSidebarSlot, AppShellSidebarTrigger, ArtifactIcon, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Banner, BannerAction, BannerClose, BannerDescription, BannerTitle, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardLeading, CardTitle, CardTrailing, ChatIcon, Checkbox, CheckboxIndicator, CodeBlock, CodeBlockAction, CodeBlockActions, CodeBlockBody, CodeBlockHeader, CodeBlockPre, CodeBlockTitle, Combobox, ComboboxChip, ComboboxChipRemove, ComboboxChips, ComboboxClear, ComboboxCollection, ComboboxContent, ComboboxControl, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxHeader, ComboboxInput, ComboboxInputGroup, ComboboxItem, ComboboxItemIndicator, ComboboxLabel, ComboboxList, ComboboxPopup, ComboboxPortal, ComboboxRow, ComboboxSeparator, ComboboxTrigger, ComboboxTriggerCount, ComboboxTriggerIndicator, ComboboxValue, CommentIcon, Composer, ComposerActions, ComposerAttachment, ComposerAttachmentBody, ComposerAttachmentFailedOverlay, ComposerAttachmentFile, ComposerAttachmentImage, ComposerAttachmentMeta, ComposerAttachmentRemove, ComposerAttachmentTitle, ComposerAttachmentUploadProgressBar, ComposerAttachmentUploadingOverlay, ComposerAttachments, ComposerAttachmentsScrollArea, ComposerDropOverlay, ComposerDropOverlayLabel, ComposerDropOverlayPrompt, ComposerIconButton, ComposerInput, ComposerMeta, ComposerRoot, ComposerSubmit, ComposerSuggestionAside, ComposerSuggestionContent, ComposerSuggestionGroup, ComposerSuggestionGroupLabel, ComposerSuggestionIcon, ComposerSuggestionList, ComposerSuggestionMeta, ComposerSuggestionOption, ComposerSuggestionTitle, ComposerToolbar, ComposerToolbarLabel, ContextMenu, ContextMenuCheckboxItem, ContextMenuCheckboxItemIndicator, ContextMenuContent, ContextMenuFooter, ContextMenuItem, ContextMenuItemLabel, ContextMenuLabel, ContextMenuPopup, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRadioItemIndicator, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSubmenu, ContextMenuSubmenuTrigger, ContextMenuTrigger, ConversationPanelBody, ConversationPanelContent, ConversationPanelEmptyState, ConversationPanelEmptyStateBrand, ConversationPanelEmptyStateBrandMark, ConversationPanelFooter, ConversationPanelRoot, ConversationPanelTabs, CopyableCode, CopyableCodeAction, CopyableCodeRoot, DescriptionDetails, DescriptionItem, DescriptionList, DescriptionTerm, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogNav, DialogOverlay, DialogPortal, DialogSurface, DialogTitle, DialogTrigger, DirectMessageIcon, Drawer, DrawerActions, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuCheckboxItemIndicator, DropdownMenuContent, DropdownMenuFooter, DropdownMenuItem, DropdownMenuItemCount, DropdownMenuItemLabel, DropdownMenuLabel, DropdownMenuPopup, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuRadioItemIndicator, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSubmenu, DropdownMenuSubmenuTrigger, DropdownMenuTrigger, EmptyState, EmptyStateActions, EmptyStateContent, EmptyStateDescription, EmptyStateIcon, EmptyStateTitle, FeedbackIcon, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, FileAction, FileActions, FileContent, FileImage, FileMeta, FileMetaItem, FileName, FilePreview, FilePreviewBadge, FilePreviewCode, FilePreviewDocument, FilePreviewFile, FilePreviewMedia, FileRow, FileRowOpen, FileThumbnail, FilesList, FilesPanel, FilesViewport, FollowArtifactIcon, FollowThreadIcon, FormSection, IconTile, InboxItem, InboxItemActions, InboxItemBody, InboxItemContent, InboxItemContext, InboxItemHeading, InboxItemHoverTarget, InboxItemLeading, InboxItemMarks, InboxItemMessage, InboxItemMetadata, InboxItemSelection, InboxItemSender, InboxItemSubtitle, InboxItemTimestamp, InboxItemTitle, InboxItemTrailing, InboxItemTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupInput, JoinChannelIcon, JoinJointChannelIcon, JoinPrivateChannelIcon, Kbd, KbdGroup, LOCATED_MS, Label, LabelAsterisk, LabelOptional, LabelSub, LeaveChannelIcon, LeaveJointChannelIcon, LeavePrivateChannelIcon, Lightbox, LightboxActions, LightboxClose, LightboxContent, LightboxHeader, LightboxHeaderLabel, LightboxHeaderMeta, LightboxInfoActions, LightboxInfoBar, LightboxInfoDock, LightboxInfoTitle, LightboxMedia, LightboxNavigationButton, LightboxPortal, LightboxStage, LightboxThumbnail, LightboxThumbnailStrip, LightboxTitle, LightboxToolbar, LightboxTrigger, ListRow, ListRowBody, ListRowBottom, ListRowChevron, ListRowDescription, ListRowGroup, ListRowIcon, ListRowMeta, ListRowTitle, ListRowTop, ListRowValue, MarkdownBlockquote, MarkdownCell, MarkdownCheckbox, MarkdownHeaderCell, MarkdownHeading, MarkdownImage, MarkdownInlineCode, MarkdownLink, MarkdownList, MarkdownListItem, MarkdownMark, MarkdownOrderedList, MarkdownParagraph, MarkdownRule, MarkdownTable, MarkdownTableRow, MarkdownTableScroll, MessageActionCard, MessageActionCardActions, MessageActionCardActionsNote, MessageActionCardCollapseTrigger, MessageActionCardCompletion, MessageActionCardContent, MessageActionCardHeader, MessageActionCardHeaderDescription, MessageActionCardHeaderIcon, MessageActionCardHeaderStatus, MessageActionCardHeaderTitle, MessageActionCardHint, MessageActionCardHintLabel, MessageActionCardNotice, MessageActionCardProperties, MessageActionCardProperty, MessageActionCardPropertyLabel, MessageActionCardPropertyValue, MessageActionCardScope, MessageActionCardScopeDescription, MessageActionCardScopeList, MessageActionCardScopeListLabel, MessageActionCardScopeListViewport, MessageActionCardScopeName, MessageActionCardStatus, MessageAttachmentAction, MessageAttachmentCard, MessageAttachmentCommentSummary, MessageAttachmentDiffAddition, MessageAttachmentDiffDeletion, MessageAttachmentDiffSummary, MessageAttachmentGroup, MessageAttachmentMeta, MessageAttachmentMetaEnd, MessageAttachmentMetaStart, MessageAttachmentSummary, MessageAttachmentTitle, MessageEmbed, MessageEmbedContent, MessageEmbedFooter, MessageEmbedHeader, MessageForwardedBundle, MessageForwardedBundleAttachment, MessageForwardedBundleAttachmentMeta, MessageForwardedBundleAttachmentName, MessageForwardedBundleAttachments, MessageForwardedBundleFooter, MessageForwardedBundleFooterAction, MessageForwardedBundleGallery, MessageForwardedBundleGalleryTile, MessageForwardedBundleHeader, MessageForwardedBundleHeaderContent, MessageForwardedBundleHeaderCount, MessageForwardedBundleHeaderLabel, MessageForwardedBundleItem, MessageForwardedBundleItemAuthor, MessageForwardedBundleItemContent, MessageForwardedBundleItemMeta, MessageForwardedBundleItems, MessageForwardedBundleSource, MessageForwardedBundleSourceLabel, MessageIcon, MessageImageGallery, MessageImageGalleryAction, MessageImageGalleryItem, MessageImageGalleryMedia, MessageImageGalleryOverlay, MessageImageGalleryPreview, MessageImageGalleryRow, MessageItem, MessageItemAttachments, MessageItemAvatarSlot, MessageItemBadge, MessageItemBadgeSeparator, MessageItemBody, MessageItemContent, MessageItemContinuationTime, MessageItemEdited, MessageItemEmbedded, MessageItemFooter, MessageItemGutter, MessageItemHeader, MessageItemInlineStatus, MessageItemMeta, MessageItemReadReceipt, MessageItemSavedIndicator, MessageItemSearchMatch, MessageItemSender, MessageItemSenderBadges, MessageItemSenderButton, MessageItemSenderGroup, MessageItemTime, MessageItemToolbar, MessageItemToolbarButton, MessageItemTranslationAction, MessageItemTranslationFailedStatus, MessageItemTranslationOriginal, MessageItemTranslationOriginalLabel, MessageItemTranslationProgressTrack, MessageItemTranslationRetryAction, MessageItemTranslationStatus, MessageList, MessageListDateDivider, MessageListEndFade, MessageListHistoryLimited, MessageListNotice, MessageMultiSelect, MessageMultiSelectCheckbox, MessageMultiSelectToolbar, MessageMultiSelectToolbarActions, MessageQuotedPreview, MessageQuotedPreviewAttachment, MessageQuotedPreviewAttachments, MessageQuotedPreviewAuthor, MessageQuotedPreviewAuthorMeta, MessageQuotedPreviewAuthorName, MessageQuotedPreviewChannel, MessageQuotedPreviewContent, MessageQuotedPreviewHeader, MessageQuotedPreviewLoading, MessageQuotedPreviewText, MessageQuotedPreviewThread, MessageQuotedPreviewTimestamp, MessageQuotedPreviewUnavailable, MessageReactionAddButton, MessageReactionChip, MessageReactionCount, MessageReactionErrorIndicator, MessageReactionGlyph, MessageReactionPickerContent, MessageReactionPickerStatic, MessageReactionQuickButton, MessageReactionQuickRow, MessageReactionTooltipContent, MessageReactionTooltipMeta, MessageReactionTooltipName, MessageReactionTooltipNameText, MessageReactionTooltipNames, MessageReactionTooltipSeparator, MessageReferenceChip, MessageReferenceIndicator, MessageReferenceLabel, MessageReferencePending, MessageReferenceReadMark, MessageReferenceSuffix, MessageReferenceText, MessageReferenceUnavailable, MessageReplies, MessageRepliesItem, MessageRepliesItemContent, MessageRepliesItemSender, MessageRepliesItemTime, MessageRepliesSummary, MessageRepliesSummaryItem, MessageVideoPreview, MessageVideoPreviewAction, MessageVideoPreviewFailureAction, MessageVideoPreviewFailureContent, MessageVideoPreviewFailureIcon, MessageVideoPreviewFailureTitle, MessageVideoPreviewFallback, MessageVideoPreviewMedia, MobileNavItem, MobileNavLabel, MobileNavRoot, NotificationCenter, NotificationCenterActionButton, NotificationCenterCount, NotificationCenterEmptyState, NotificationCenterHeader, NotificationCenterItem, NotificationCenterItemActions, NotificationCenterItemBody, NotificationCenterItemContent, NotificationCenterItemIcon, NotificationCenterItemRow, NotificationCenterItemTitle, NotificationCenterList, NotificationCenterPopup, NotificationCenterScroller, NotificationCenterTitle, NotificationCenterTrigger, OtterIndicator, Panel, PanelAction, PanelActions, PanelActivity, PanelBody, PanelFooter, PanelHeader, PanelHeaderContent, PanelHeaderIcon, PanelHeaderRoot, PanelHeading, PanelMeta, PanelNotice, PanelNoticeActions, PanelNoticeContent, PanelScrollContent, PanelScrollViewport, PanelSection, PanelSectionHeader, PanelStatus, PanelTitle, PanelToggleAction, PickerTriggerButton, Popover, PopoverArrow, PopoverBackdrop, PopoverClose, PopoverContent, PopoverDescription, PopoverHeader, PopoverPopup, PopoverPortal, PopoverSeparator, PopoverTitle, PopoverTrigger, PopoverViewport, PreviewCard, PreviewCardArrow, PreviewCardContent, PreviewCardDescription, PreviewCardHeader, PreviewCardPopup, PreviewCardPortal, PreviewCardSeparator, PreviewCardTitle, PreviewCardTrigger, ProfilePanel, ProfilePanelBody, ProfilePanelHeader, ProfilePanelHeaderContent, ProfilePanelSection, Progress, ProgressHeader, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue, RadioGroup, RadioGroupIndicator, RadioGroupItem, RaftLogo, RaftLogoLockup, RaftWordmark, ReopenTaskIcon, ResizableGroup, ResizableHandle, ResizablePanel, SINGLE_IMAGE_MAX_HEIGHT, SINGLE_IMAGE_MAX_WIDTH, ScrollArea, ScrollAreaContent, ScrollAreaGutters, ScrollAreaTextarea, SearchEntityResult, SearchEntityResultActivity, SearchEntityResultContent, SearchEntityResultDescription, SearchEntityResultHeader, SearchEntityResultIcon, SearchEntityResultLeading, SearchEntityResultTitle, SearchMessageResult, SearchMessageResultBody, SearchMessageResultHeader, SearchMessageResultMatch, SearchMessageResultMeta, SearchMessageResultSender, SearchMessageResultThreadMeta, SearchMessageResultTimestamp, SearchResultsList, SearchResultsSection, SearchResultsSectionHeading, SearchResultsSummary, SearchShellFilters, SearchShellRoot, SearchShellViewport, SearchThreadMessageResult, SearchThreadResult, SearchThreadResultHeader, SearchThreadResultMessages, SearchThreadResultMeta, SearchThreadResultTimestamp, SearchThreadResultTitle, SearchTrigger, SearchTriggerLabel, SearchTriggerShortcut, SegmentedControl, SegmentedControlCount, SegmentedControlItem, SegmentedControlLabel, Select, SelectActionItem, SelectArrow, SelectContent, SelectGroup, SelectGroupLabel, SelectIcon, SelectItem, SelectItemDescription, SelectItemIndicator, SelectItemLeading, SelectItemText, SelectLabel, SelectList, SelectPopup, SelectPortal, SelectScrollDownArrow, SelectScrollUpArrow, SelectSeparator, SelectTrigger, SelectValue, Separator, SidebarBody, SidebarContent, SidebarControl, SidebarGroupLabel, SidebarHeader, SidebarHeaderTitle, SidebarItem, SidebarItemAside, SidebarItemChannelIcon, SidebarItemContent, SidebarItemCount, SidebarItemCountSeparator, SidebarItemIcon, SidebarItemIndicator, SidebarItemMeta, SidebarItemMetaIcon, SidebarItemStatus, SidebarItemSubtitle, SidebarItemThreadCount, SidebarItemTitle, SidebarList, SidebarMenu, SidebarMenuAside, SidebarMenuCount, SidebarMenuIcon, SidebarMenuTitle, SidebarRoot, SidebarSection, SidebarSectionAttention, SidebarSectionChevron, SidebarSectionControl, SidebarSectionControls, SidebarSectionCount, SidebarSectionDisclosure, SidebarSectionEmpty, SidebarSectionEndChevron, SidebarSectionHeader, SidebarSectionTitle, SidebarSectionTrailing, Skeleton, SortableComposerAttachment, SortableComposerAttachments, SortableComposerAttachmentsScroll, SortableTabsList, SortableTabsTab, Spinner, Status, Step, Steps, Switch, SwitchThumb, SystemMessage, SystemMessageContent, SystemMessageGroup, SystemMessageGroupChevron, SystemMessageGroupDisclosure, SystemMessageGroupHeader, SystemMessageGroupPanel, SystemMessageGroupSummary, SystemMessageTime, TASK_STATUS_IDS, Table, TableBody, TableCaption, TableCell, TableColgroup, TableColumn, TableHead, TableHeader, TableRow, Tabs, TabsLabel, TabsList, TabsPanel, TabsTab, TaskBacklogIcon, TaskBoardColumn, TaskBoardColumnBadge, TaskBoardColumnChevron, TaskBoardColumnCount, TaskBoardColumnEmpty, TaskBoardColumnEmptyAllowed, TaskBoardColumnEmptyBlocked, TaskBoardColumnEmptyIdle, TaskBoardColumnHeading, TaskBoardColumnItems, TaskBoardColumnPanel, TaskBoardColumnTrigger, TaskBoardRoot, TaskCard, TaskCardBody, TaskCardChannel, TaskCardDescription, TaskCardLegacy, TaskCardMeta, TaskCardNumber, TaskCardRow, TaskCardStatus, TaskCardTitle, TaskChip, TaskClosedIcon, TaskDndProvider, TaskDoneIcon, TaskDragOverlay, TaskDraggable, TaskDropPlaceholder, TaskDropZone, TaskInProgressIcon, TaskInReviewIcon, TaskListRoot, TaskLoadingList, TaskLoadingRow, TaskSection, TaskSectionBadge, TaskSectionChevron, TaskSectionCount, TaskSectionEmpty, TaskSectionHeading, TaskSectionItems, TaskSectionPanel, TaskSectionTrigger, TaskStatusBadge, TaskStatusIcon, TaskTodoIcon, TasksPanelEmpty, TasksPanelRoot, TasksPanelToolbar, TasksPanelToolbarFilters, TasksPanelToolbarGroup, TasksPanelToolbarLabel, TasksPanelToolbarNewTask, TasksPanelToolbarView, TasksPanelViewport, Text, TextHeading, TextLink, TextLinkExternalIcon, TextMono, TextSans, TextSelectionToolbar, TextSelectionToolbarButton, TextSelectionToolbarSeparator, Textarea, TextareaCounter, TextareaGroup, ThemeProvider, ThreadIcon, ThreadPanelActions, ThreadPanelBody, ThreadPanelContent, ThreadPanelFooter, ThreadPanelHeader, ThreadPanelOriginalMessage, ThreadPanelReplyCount, ThreadPanelReplySummary, ThreadPanelRoot, ThreadPanelSearch, ThreadPanelSearchCount, ThreadPanelSearchTrailing, ThreadPanelTitle, ThreadPanelTitleMeta, Timeline, TimelineContent, TimelineItem, TimelineTime, TimelineTitle, ToastAction, ToastActions, ToastArrow, ToastBody, ToastClose, ToastContent, ToastDescription, ToastIcon, ToastPortal, ToastPositioner, ToastProgress, ToastProvider, ToastRoot, ToastTitle, ToastViewport, ToggleGroup, ToggleGroupItem, ToggleGroupLabel, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, UnfollowArtifactIcon, UnfollowThreadIcon, VirtualList, WorkspaceButton, WorkspaceButtonName, buildMessageImageGalleryRows, buttonVariants, classifyMessageImageAspect, cn, createTextSelectionAnchor, createToastManager, getTextSelectionFocusRect, installInputModality, taskStatusSoft, taskStatusStrong, textLinkVariants, toast, useComposerSuggestions, useLocated, useOrderedTabs, useScrollAreaContainer, useScrollbarSize, useTheme, useToastManager };
@@ -10,6 +10,9 @@
10
10
  * deeper down that grows also grows the child that holds it. A child whose
11
11
  * box keeps its size while its content overflows it would not be seen.
12
12
  *
13
+ * For a native scroller that can't be a ScrollArea: a ScrollArea hides the
14
+ * native scrollbar and its own takes no room, so it needs none of this.
15
+ *
13
16
  * Returns a ref callback for the scroller.
14
17
  */
15
18
  export declare function useScrollbarSize<E extends HTMLElement>(): (el: E | null) => void;
@@ -11,6 +11,9 @@ import { useCallback, useRef } from "react";
11
11
  * deeper down that grows also grows the child that holds it. A child whose
12
12
  * box keeps its size while its content overflows it would not be seen.
13
13
  *
14
+ * For a native scroller that can't be a ScrollArea: a ScrollArea hides the
15
+ * native scrollbar and its own takes no room, so it needs none of this.
16
+ *
14
17
  * Returns a ref callback for the scroller.
15
18
  */
16
19
  function useScrollbarSize() {