@underverse-ui/underverse 1.0.32 → 1.0.33

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.
package/AGENTS.md CHANGED
@@ -51,13 +51,19 @@ import { OverlayScrollbarProvider } from "@underverse-ui/underverse";
51
51
  export function App() {
52
52
  return (
53
53
  <>
54
- <OverlayScrollbarProvider />
54
+ <OverlayScrollbarProvider enabled theme="os-theme-underverse" autoHide="leave" />
55
55
  {/* app */}
56
56
  </>
57
57
  );
58
58
  }
59
59
  ```
60
60
 
61
+ Behavior:
62
+
63
+ - Provider initializes only on `[data-os-scrollbar]`.
64
+ - Underverse components already mark their internal scroll containers.
65
+ - Use `data-os-ignore` on a node to opt out.
66
+
61
67
  ## i18n Notes
62
68
 
63
69
  - Components work without `next-intl` using fallback translations.
package/README.md CHANGED
@@ -146,13 +146,31 @@ import { OverlayScrollbarProvider } from "@underverse-ui/underverse";
146
146
  function App() {
147
147
  return (
148
148
  <>
149
- <OverlayScrollbarProvider />
149
+ <OverlayScrollbarProvider
150
+ enabled
151
+ theme="os-theme-underverse"
152
+ autoHide="leave"
153
+ autoHideDelay={600}
154
+ />
150
155
  {/* your app */}
151
156
  </>
152
157
  );
153
158
  }
154
159
  ```
155
160
 
161
+ Provider behavior:
162
+
163
+ - Initializes **only** on elements marked with `data-os-scrollbar`.
164
+ - Does **not** initialize on `document.body` / `document.documentElement`.
165
+ - Skips portal/dialog trees (`[data-radix-portal]`, `[role="dialog"]`, `[aria-modal="true"]`, `[data-sonner-toaster]`).
166
+ - Per-node opt-out is available via `data-os-ignore`.
167
+
168
+ Migration notes:
169
+
170
+ - Remove any local DOM-scanning scrollbar provider in your app.
171
+ - Keep a single `OverlayScrollbarProvider` mounted once at app root.
172
+ - If you have custom app-level scroll containers outside Underverse components, add `data-os-scrollbar` to those nodes.
173
+
156
174
  ### Standalone React (Vite, CRA, etc.)
157
175
 
158
176
  ```tsx
@@ -26,7 +26,7 @@
26
26
  {
27
27
  "id": "overlay-scrollbar-provider",
28
28
  "title": "Enable overlay scrollbars",
29
- "code": "import \"overlayscrollbars/overlayscrollbars.css\";\nimport { OverlayScrollbarProvider } from \"@underverse-ui/underverse\";\n\nexport function App(){\n return <><OverlayScrollbarProvider />{/* app */}</>;\n}\n"
29
+ "code": "import \"overlayscrollbars/overlayscrollbars.css\";\nimport { OverlayScrollbarProvider } from \"@underverse-ui/underverse\";\n\nexport function App(){\n return <><OverlayScrollbarProvider enabled theme=\"os-theme-underverse\" autoHide=\"leave\" />{/* app */}</>;\n}\n"
30
30
  },
31
31
  {
32
32
  "id": "api-discovery-order",
@@ -39,4 +39,3 @@
39
39
  }
40
40
  ]
41
41
  }
42
-
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "package": "@underverse-ui/underverse",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "sourceEntry": "src/index.ts",
5
- "totalExports": 206,
5
+ "totalExports": 207,
6
6
  "exports": [
7
7
  {
8
8
  "name": "*",
@@ -862,6 +862,13 @@
862
862
  "local": false,
863
863
  "aliasOf": "default"
864
864
  },
865
+ {
866
+ "name": "OverlayScrollbarProviderProps",
867
+ "kind": "type",
868
+ "source": "../../../components/ui/OverlayScrollbarProvider",
869
+ "reexport": true,
870
+ "local": false
871
+ },
865
872
  {
866
873
  "name": "PageLoading",
867
874
  "kind": "value",
package/dist/index.cjs CHANGED
@@ -3820,6 +3820,8 @@ var Popover = ({
3820
3820
  children,
3821
3821
  className,
3822
3822
  contentClassName,
3823
+ contentProps,
3824
+ contentScrollable = false,
3823
3825
  placement = "bottom",
3824
3826
  modal = false,
3825
3827
  disabled = false,
@@ -3991,7 +3993,7 @@ var Popover = ({
3991
3993
  {
3992
3994
  ref: panelRef,
3993
3995
  "data-state": "open",
3994
- role: "dialog",
3996
+ role: modal ? "dialog" : void 0,
3995
3997
  "aria-modal": modal || void 0,
3996
3998
  style: {
3997
3999
  transformOrigin: getTransformOrigin2(initialPlacement.side, initialPlacement.align)
@@ -4004,12 +4006,15 @@ var Popover = ({
4004
4006
  children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4005
4007
  "div",
4006
4008
  {
4009
+ ...contentProps,
4010
+ "data-os-scrollbar": contentScrollable ? true : void 0,
4007
4011
  className: cn(
4008
4012
  "rounded-2xl md:rounded-3xl border bg-popover text-popover-foreground shadow-md",
4009
4013
  "backdrop-blur-sm bg-popover/95 border-border/60 p-4",
4014
+ contentProps?.className,
4010
4015
  contentClassName
4011
4016
  ),
4012
- tabIndex: -1,
4017
+ tabIndex: contentProps?.tabIndex ?? -1,
4013
4018
  children
4014
4019
  }
4015
4020
  )
@@ -4222,6 +4227,7 @@ var Sheet = ({
4222
4227
  /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4223
4228
  "div",
4224
4229
  {
4230
+ "data-os-scrollbar": true,
4225
4231
  className: "flex-1 overflow-auto p-4",
4226
4232
  style: {
4227
4233
  opacity: open && !isAnimating ? 1 : 0,
@@ -4685,7 +4691,7 @@ var Tabs = ({
4685
4691
  );
4686
4692
  const activeTab = tabs.find((tab) => tab.value === active);
4687
4693
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: cn("w-full", orientation === "vertical" && "flex gap-6"), children: [
4688
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: containerClasses, role: "tablist", "aria-orientation": orientation, children: [
4694
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: containerClasses, role: "tablist", "aria-orientation": orientation, "data-os-scrollbar": orientation === "horizontal" ? true : void 0, children: [
4689
4695
  tabs.map((tab, index) => {
4690
4696
  const isActive = active === tab.value;
4691
4697
  const Icon = tab.icon;
@@ -5235,7 +5241,7 @@ var Combobox = ({
5235
5241
  }
5236
5242
  )
5237
5243
  ] }) }),
5238
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "overflow-y-auto overscroll-contain", style: { maxHeight }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: cn(size === "sm" ? "p-1" : size === "lg" ? "p-2" : "p-1.5"), children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "px-3 py-10 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
5244
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { "data-os-scrollbar": true, className: "overflow-y-auto overscroll-contain", style: { maxHeight }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: cn(size === "sm" ? "p-1" : size === "lg" ? "p-2" : "p-1.5"), children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "px-3 py-10 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
5239
5245
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "relative", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "w-10 h-10 rounded-full border-2 border-primary/20 border-t-primary animate-spin" }) }),
5240
5246
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-sm text-muted-foreground", children: loadingText })
5241
5247
  ] }) }) : filteredOptions.length > 0 ? groupedOptions ? (
@@ -6291,6 +6297,7 @@ var DatePicker = ({
6291
6297
  sizeStyles8[size].contentPadding,
6292
6298
  "animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-300"
6293
6299
  ),
6300
+ contentScrollable: true,
6294
6301
  trigger: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
6295
6302
  "button",
6296
6303
  {
@@ -6646,6 +6653,7 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
6646
6653
  size === "sm" ? "p-3" : "p-5",
6647
6654
  "animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-300"
6648
6655
  ),
6656
+ contentScrollable: true,
6649
6657
  trigger: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
6650
6658
  "button",
6651
6659
  {
@@ -7096,6 +7104,7 @@ function WheelColumn({
7096
7104
  "div",
7097
7105
  {
7098
7106
  ref: scrollRef,
7107
+ "data-os-scrollbar": true,
7099
7108
  className: cn(
7100
7109
  "h-full overflow-y-auto overscroll-contain snap-y snap-mandatory",
7101
7110
  "select-none cursor-grab active:cursor-grabbing",
@@ -8519,6 +8528,7 @@ function WheelColumn2({
8519
8528
  "div",
8520
8529
  {
8521
8530
  ref: scrollRef,
8531
+ "data-os-scrollbar": true,
8522
8532
  className: cn(
8523
8533
  "h-full overflow-y-auto overscroll-contain snap-y snap-mandatory",
8524
8534
  "select-none cursor-grab active:cursor-grabbing",
@@ -9466,6 +9476,7 @@ var DateTimePicker = ({
9466
9476
  // Keep the popover usable on small viewports
9467
9477
  "max-w-[calc(100vw-1rem)] max-h-[calc(100vh-6rem)] overflow-auto"
9468
9478
  ),
9479
+ contentScrollable: true,
9469
9480
  placement: "bottom-end",
9470
9481
  children: [
9471
9482
  /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col lg:flex-row divide-y lg:divide-y-0 lg:divide-x divide-border", children: [
@@ -10137,7 +10148,7 @@ function CalendarTimelineHeader(props) {
10137
10148
  contentClassName: cn(
10138
10149
  "w-auto p-0 rounded-2xl md:rounded-3xl overflow-hidden"
10139
10150
  ),
10140
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "max-w-[calc(100vw-1rem)] max-h-[calc(100vh-6rem)] overflow-auto", children: [
10151
+ children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { "data-os-scrollbar": true, className: "max-w-[calc(100vw-1rem)] max-h-[calc(100vh-6rem)] overflow-auto", children: [
10141
10152
  /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex flex-col lg:flex-row divide-y lg:divide-y-0 lg:divide-x divide-border", children: [
10142
10153
  /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "p-2", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
10143
10154
  Calendar3,
@@ -10281,7 +10292,7 @@ function CalendarTimelineHeader(props) {
10281
10292
  ]
10282
10293
  }
10283
10294
  ) : null,
10284
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { ref: headerRef, className: "flex-1 min-w-0 overflow-x-auto overflow-y-hidden", children: slotHeaderNodes })
10295
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { ref: headerRef, "data-os-scrollbar": true, className: "flex-1 min-w-0 overflow-x-auto overflow-y-hidden", children: slotHeaderNodes })
10285
10296
  ] })
10286
10297
  ] });
10287
10298
  }
@@ -11872,6 +11883,7 @@ function CalendarTimeline({
11872
11883
  "div",
11873
11884
  {
11874
11885
  ref: leftRef,
11886
+ "data-os-scrollbar": true,
11875
11887
  className: "shrink-0 overflow-y-auto overflow-x-hidden",
11876
11888
  style: { width: effectiveResourceColumnWidth, minWidth: effectiveResourceColumnWidth },
11877
11889
  children: [
@@ -12497,6 +12509,7 @@ var MultiCombobox = ({
12497
12509
  id: listboxId,
12498
12510
  role: "listbox",
12499
12511
  "aria-multiselectable": "true",
12512
+ "data-os-scrollbar": true,
12500
12513
  style: { maxHeight },
12501
12514
  className: cn("overflow-y-auto p-1.5", size === "lg" ? "text-base" : size === "sm" ? "text-xs" : "text-sm"),
12502
12515
  children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("li", { className: "px-3 py-8 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
@@ -15133,6 +15146,7 @@ function Carousel({
15133
15146
  showThumbnails && totalSlides > slidesToShow && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
15134
15147
  "div",
15135
15148
  {
15149
+ "data-os-scrollbar": true,
15136
15150
  className: cn(
15137
15151
  "absolute bottom-0 left-0 right-0 flex gap-2 p-4 bg-linear-to-t from-black/50 to-transparent overflow-x-auto",
15138
15152
  isHorizontal ? "flex-row" : "flex-col"
@@ -16024,6 +16038,7 @@ var TimelineRoot = React43.forwardRef(
16024
16038
  "div",
16025
16039
  {
16026
16040
  ref,
16041
+ "data-os-scrollbar": mode === "horizontal" ? true : void 0,
16027
16042
  className: cn("relative", mode === "horizontal" && "flex gap-4 overflow-x-auto", mode === "vertical" && "space-y-0", className),
16028
16043
  ...rest,
16029
16044
  children: mode === "vertical" ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "space-y-0", children: content }) : content
@@ -17019,7 +17034,7 @@ var MusicPlayer = ({
17019
17034
  }
17020
17035
  ) })
17021
17036
  ] }),
17022
- showPlaylist && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "p-4", children: [
17037
+ showPlaylist && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { "data-os-scrollbar": true, className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "p-4", children: [
17023
17038
  /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("h3", { className: "text-lg font-semibold text-foreground mb-3", children: [
17024
17039
  "Playlist (",
17025
17040
  playlist.length,
@@ -19018,44 +19033,56 @@ var LoadingBar = ({
19018
19033
  // ../../components/ui/OverlayScrollbarProvider.tsx
19019
19034
  var import_react33 = require("react");
19020
19035
  var import_overlayscrollbars = require("overlayscrollbars");
19021
- var EXPLICIT_SELECTOR = [".thin-scrollbar", ".scrollbar-thin", ".custom-scrollbar", "[data-os-scrollbar]"].join(", ");
19036
+ var SCROLLABLE_SELECTOR = "[data-os-scrollbar]";
19022
19037
  var PORTAL_EXCLUDE_SELECTOR = [
19023
19038
  "[data-radix-portal]",
19024
19039
  "[role='dialog']",
19025
19040
  "[aria-modal='true']",
19026
19041
  "[data-sonner-toaster]"
19027
19042
  ].join(", ");
19028
- var OPTIONS = {
19029
- scrollbars: {
19030
- theme: "os-theme-underverse",
19031
- visibility: "auto",
19032
- autoHide: "leave",
19033
- autoHideDelay: 600,
19034
- dragScroll: true,
19035
- clickScroll: false
19036
- }
19037
- };
19038
19043
  function shouldSkip(element) {
19039
19044
  if (element === document.body || element === document.documentElement) return true;
19045
+ if (element.classList.contains("scrollbar-none")) return true;
19040
19046
  if (element.hasAttribute("data-os-ignore")) return true;
19041
19047
  if (element.hasAttribute("data-overlayscrollbars")) return true;
19042
19048
  if (element.closest(PORTAL_EXCLUDE_SELECTOR)) return true;
19043
19049
  return false;
19044
19050
  }
19045
- function OverlayScrollbarProvider() {
19051
+ function OverlayScrollbarProvider({
19052
+ enabled = true,
19053
+ theme = "os-theme-underverse",
19054
+ visibility = "auto",
19055
+ autoHide = "leave",
19056
+ autoHideDelay = 600,
19057
+ dragScroll = true,
19058
+ clickScroll = false
19059
+ } = {}) {
19046
19060
  (0, import_react33.useEffect)(() => {
19061
+ if (typeof window === "undefined") return;
19062
+ if (!enabled) return;
19063
+ const options = {
19064
+ scrollbars: {
19065
+ theme,
19066
+ visibility,
19067
+ autoHide,
19068
+ autoHideDelay,
19069
+ dragScroll,
19070
+ clickScroll
19071
+ }
19072
+ };
19047
19073
  const instances = /* @__PURE__ */ new Map();
19048
19074
  let rafId = 0;
19049
19075
  const init = (element) => {
19050
19076
  if (shouldSkip(element)) return;
19051
19077
  if (instances.has(element)) return;
19052
- instances.set(element, (0, import_overlayscrollbars.OverlayScrollbars)(element, OPTIONS));
19078
+ instances.set(element, (0, import_overlayscrollbars.OverlayScrollbars)(element, options));
19053
19079
  };
19054
19080
  const scan = (root) => {
19055
- if (root instanceof HTMLElement && root.matches(EXPLICIT_SELECTOR)) {
19081
+ if (root instanceof HTMLElement && root.matches(SCROLLABLE_SELECTOR)) {
19056
19082
  init(root);
19057
19083
  }
19058
- root.querySelectorAll(EXPLICIT_SELECTOR).forEach(init);
19084
+ if (!("querySelectorAll" in root)) return;
19085
+ root.querySelectorAll(SCROLLABLE_SELECTOR).forEach(init);
19059
19086
  };
19060
19087
  const cleanup = () => {
19061
19088
  instances.forEach((instance, element) => {
@@ -19092,7 +19119,7 @@ function OverlayScrollbarProvider() {
19092
19119
  instances.forEach((instance) => instance.destroy());
19093
19120
  instances.clear();
19094
19121
  };
19095
- }, []);
19122
+ }, [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll]);
19096
19123
  return null;
19097
19124
  }
19098
19125
  var OverlayScrollbarProvider_default = OverlayScrollbarProvider;
@@ -21645,7 +21672,7 @@ var CommandList = (0, import_react42.forwardRef)((props, ref) => {
21645
21672
  if (props.items.length === 0) {
21646
21673
  return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "w-72 p-4 text-center text-sm text-muted-foreground", children: "No results" });
21647
21674
  }
21648
- return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { ref: listRef, className: "w-72 max-h-80 overflow-y-auto bg-card border border-border rounded-2xl shadow-lg", children: [
21675
+ return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { ref: listRef, "data-os-scrollbar": true, className: "w-72 max-h-80 overflow-y-auto bg-card border border-border rounded-2xl shadow-lg", children: [
21649
21676
  /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "px-3 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: "Basic Blocks" }) }),
21650
21677
  /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "p-1", children: props.items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(
21651
21678
  "button",
@@ -22738,7 +22765,7 @@ var EmojiList = (0, import_react44.forwardRef)((props, ref) => {
22738
22765
  if (props.items.length === 0) {
22739
22766
  return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "w-80 p-4 text-center text-sm text-muted-foreground bg-card border border-border rounded-2xl shadow-lg", children: "No emoji found" });
22740
22767
  }
22741
- return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "w-80 max-h-80 overflow-y-auto bg-card border border-border rounded-2xl shadow-lg", children: [
22768
+ return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { "data-os-scrollbar": true, className: "w-80 max-h-80 overflow-y-auto bg-card border border-border rounded-2xl shadow-lg", children: [
22742
22769
  /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "px-3 py-2 border-b bg-muted/30", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "flex items-center gap-2", children: [
22743
22770
  /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_lucide_react41.Smile, { className: "w-4 h-4 text-primary" }),
22744
22771
  /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: "Emoji" })
@@ -23107,6 +23134,7 @@ function buildUEditorExtensions({
23107
23134
  import_extension_code_block_lowlight.default.configure({
23108
23135
  lowlight,
23109
23136
  HTMLAttributes: {
23137
+ "data-os-scrollbar": "true",
23110
23138
  class: "rounded-lg bg-[#1e1e1e] p-4 font-mono text-sm overflow-x-auto"
23111
23139
  }
23112
23140
  }),
@@ -23437,6 +23465,7 @@ var EmojiPicker = ({ onSelect, onClose }) => {
23437
23465
  "div",
23438
23466
  {
23439
23467
  ref: scrollContainerRef,
23468
+ "data-os-scrollbar": true,
23440
23469
  className: "overflow-y-auto px-3 py-2 shrink",
23441
23470
  style: { height: "20rem" },
23442
23471
  children: search ? (
@@ -24136,7 +24165,7 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
24136
24165
  if (commands.length === 0) {
24137
24166
  return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "w-72 p-4 text-center text-muted-foreground text-sm", children: t("slashCommand.noResults") });
24138
24167
  }
24139
- return /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { ref: menuRef, className: "w-72 max-h-80 overflow-y-auto", children: [
24168
+ return /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { ref: menuRef, "data-os-scrollbar": true, className: "w-72 max-h-80 overflow-y-auto", children: [
24140
24169
  /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "px-3 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: t("slashCommand.basicBlocks") }) }),
24141
24170
  /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "p-1", children: commands.map((cmd, index) => /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(
24142
24171
  "button",
@@ -24898,6 +24927,7 @@ var UEditor = import_react52.default.forwardRef(({
24898
24927
  import_react53.EditorContent,
24899
24928
  {
24900
24929
  editor,
24930
+ "data-os-scrollbar": true,
24901
24931
  className: "flex-1 overflow-y-auto",
24902
24932
  style: {
24903
24933
  minHeight,