@underverse-ui/underverse 1.0.31 → 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 +7 -1
- package/README.md +19 -1
- package/agent-recipes.json +1 -2
- package/api-reference.json +9 -2
- package/dist/index.cjs +79 -66
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.js +79 -66
- package/dist/index.js.map +1 -1
- package/llms.txt +4 -1
- package/package.json +1 -1
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
|
package/agent-recipes.json
CHANGED
|
@@ -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
|
-
|
package/api-reference.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@underverse-ui/underverse",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.33",
|
|
4
4
|
"sourceEntry": "src/index.ts",
|
|
5
|
-
"totalExports":
|
|
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
|
@@ -107,7 +107,7 @@ __export(index_exports, {
|
|
|
107
107
|
NotificationModal: () => NotificationModal_default,
|
|
108
108
|
NumberInput: () => NumberInput,
|
|
109
109
|
OverlayControls: () => OverlayControls,
|
|
110
|
-
OverlayScrollbarProvider: () =>
|
|
110
|
+
OverlayScrollbarProvider: () => OverlayScrollbarProvider_default,
|
|
111
111
|
PageLoading: () => PageLoading,
|
|
112
112
|
Pagination: () => Pagination,
|
|
113
113
|
PasswordInput: () => PasswordInput,
|
|
@@ -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,61 +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
|
|
19022
|
-
var
|
|
19023
|
-
"
|
|
19024
|
-
"
|
|
19025
|
-
"
|
|
19026
|
-
"
|
|
19027
|
-
".overflow-x-scroll",
|
|
19028
|
-
".overflow-y-scroll"
|
|
19036
|
+
var SCROLLABLE_SELECTOR = "[data-os-scrollbar]";
|
|
19037
|
+
var PORTAL_EXCLUDE_SELECTOR = [
|
|
19038
|
+
"[data-radix-portal]",
|
|
19039
|
+
"[role='dialog']",
|
|
19040
|
+
"[aria-modal='true']",
|
|
19041
|
+
"[data-sonner-toaster]"
|
|
19029
19042
|
].join(", ");
|
|
19030
|
-
|
|
19031
|
-
|
|
19032
|
-
|
|
19033
|
-
|
|
19034
|
-
|
|
19035
|
-
|
|
19036
|
-
|
|
19037
|
-
|
|
19038
|
-
|
|
19039
|
-
|
|
19040
|
-
|
|
19043
|
+
function shouldSkip(element) {
|
|
19044
|
+
if (element === document.body || element === document.documentElement) return true;
|
|
19045
|
+
if (element.classList.contains("scrollbar-none")) return true;
|
|
19046
|
+
if (element.hasAttribute("data-os-ignore")) return true;
|
|
19047
|
+
if (element.hasAttribute("data-overlayscrollbars")) return true;
|
|
19048
|
+
if (element.closest(PORTAL_EXCLUDE_SELECTOR)) return true;
|
|
19049
|
+
return false;
|
|
19050
|
+
}
|
|
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
|
+
} = {}) {
|
|
19041
19060
|
(0, import_react33.useEffect)(() => {
|
|
19042
|
-
|
|
19043
|
-
|
|
19044
|
-
const
|
|
19045
|
-
|
|
19046
|
-
|
|
19047
|
-
|
|
19048
|
-
|
|
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
|
+
}
|
|
19049
19072
|
};
|
|
19050
|
-
const
|
|
19073
|
+
const instances = /* @__PURE__ */ new Map();
|
|
19074
|
+
let rafId = 0;
|
|
19075
|
+
const init = (element) => {
|
|
19051
19076
|
if (shouldSkip(element)) return;
|
|
19052
19077
|
if (instances.has(element)) return;
|
|
19053
|
-
instances.set(element, (0, import_overlayscrollbars.OverlayScrollbars)(element,
|
|
19054
|
-
};
|
|
19055
|
-
const collectCandidates = (root, selector) => {
|
|
19056
|
-
const candidates = [];
|
|
19057
|
-
if (root instanceof HTMLElement && root.matches(selector)) {
|
|
19058
|
-
candidates.push(root);
|
|
19059
|
-
}
|
|
19060
|
-
if ("querySelectorAll" in root) {
|
|
19061
|
-
root.querySelectorAll(selector).forEach((element) => {
|
|
19062
|
-
candidates.push(element);
|
|
19063
|
-
});
|
|
19064
|
-
}
|
|
19065
|
-
return candidates.filter((element, index) => candidates.indexOf(element) === index);
|
|
19078
|
+
instances.set(element, (0, import_overlayscrollbars.OverlayScrollbars)(element, options));
|
|
19066
19079
|
};
|
|
19067
19080
|
const scan = (root) => {
|
|
19068
|
-
|
|
19069
|
-
|
|
19070
|
-
|
|
19071
|
-
|
|
19072
|
-
|
|
19073
|
-
);
|
|
19074
|
-
const leafGeneric = filteredGeneric.filter((element) => !filteredGeneric.some((other) => other !== element && element.contains(other)));
|
|
19075
|
-
leafGeneric.forEach(initElement);
|
|
19081
|
+
if (root instanceof HTMLElement && root.matches(SCROLLABLE_SELECTOR)) {
|
|
19082
|
+
init(root);
|
|
19083
|
+
}
|
|
19084
|
+
if (!("querySelectorAll" in root)) return;
|
|
19085
|
+
root.querySelectorAll(SCROLLABLE_SELECTOR).forEach(init);
|
|
19076
19086
|
};
|
|
19077
19087
|
const cleanup = () => {
|
|
19078
19088
|
instances.forEach((instance, element) => {
|
|
@@ -19083,14 +19093,13 @@ function OverlayScrollbarProvider() {
|
|
|
19083
19093
|
});
|
|
19084
19094
|
};
|
|
19085
19095
|
scan(document.body);
|
|
19086
|
-
let rafId = 0;
|
|
19087
19096
|
const observer = new MutationObserver((mutations) => {
|
|
19088
19097
|
if (rafId) return;
|
|
19089
|
-
rafId =
|
|
19098
|
+
rafId = requestAnimationFrame(() => {
|
|
19090
19099
|
rafId = 0;
|
|
19091
19100
|
const scanRoots = /* @__PURE__ */ new Set();
|
|
19092
19101
|
mutations.forEach((mutation) => {
|
|
19093
|
-
if (mutation.target instanceof
|
|
19102
|
+
if (mutation.target instanceof HTMLElement || mutation.target instanceof Document || mutation.target instanceof DocumentFragment) {
|
|
19094
19103
|
scanRoots.add(mutation.target);
|
|
19095
19104
|
}
|
|
19096
19105
|
mutation.addedNodes.forEach((node) => {
|
|
@@ -19103,16 +19112,17 @@ function OverlayScrollbarProvider() {
|
|
|
19103
19112
|
cleanup();
|
|
19104
19113
|
});
|
|
19105
19114
|
});
|
|
19106
|
-
observer.observe(document.body, { childList: true, subtree: true });
|
|
19115
|
+
observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ["class"] });
|
|
19107
19116
|
return () => {
|
|
19108
|
-
if (rafId)
|
|
19117
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
19109
19118
|
observer.disconnect();
|
|
19110
19119
|
instances.forEach((instance) => instance.destroy());
|
|
19111
|
-
|
|
19120
|
+
instances.clear();
|
|
19112
19121
|
};
|
|
19113
|
-
}, []);
|
|
19122
|
+
}, [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll]);
|
|
19114
19123
|
return null;
|
|
19115
19124
|
}
|
|
19125
|
+
var OverlayScrollbarProvider_default = OverlayScrollbarProvider;
|
|
19116
19126
|
|
|
19117
19127
|
// ../../components/ui/Table.tsx
|
|
19118
19128
|
var import_react34 = __toESM(require("react"), 1);
|
|
@@ -21662,7 +21672,7 @@ var CommandList = (0, import_react42.forwardRef)((props, ref) => {
|
|
|
21662
21672
|
if (props.items.length === 0) {
|
|
21663
21673
|
return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "w-72 p-4 text-center text-sm text-muted-foreground", children: "No results" });
|
|
21664
21674
|
}
|
|
21665
|
-
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: [
|
|
21666
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" }) }),
|
|
21667
21677
|
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "p-1", children: props.items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(
|
|
21668
21678
|
"button",
|
|
@@ -22755,7 +22765,7 @@ var EmojiList = (0, import_react44.forwardRef)((props, ref) => {
|
|
|
22755
22765
|
if (props.items.length === 0) {
|
|
22756
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" });
|
|
22757
22767
|
}
|
|
22758
|
-
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: [
|
|
22759
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: [
|
|
22760
22770
|
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_lucide_react41.Smile, { className: "w-4 h-4 text-primary" }),
|
|
22761
22771
|
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: "Emoji" })
|
|
@@ -23124,6 +23134,7 @@ function buildUEditorExtensions({
|
|
|
23124
23134
|
import_extension_code_block_lowlight.default.configure({
|
|
23125
23135
|
lowlight,
|
|
23126
23136
|
HTMLAttributes: {
|
|
23137
|
+
"data-os-scrollbar": "true",
|
|
23127
23138
|
class: "rounded-lg bg-[#1e1e1e] p-4 font-mono text-sm overflow-x-auto"
|
|
23128
23139
|
}
|
|
23129
23140
|
}),
|
|
@@ -23454,6 +23465,7 @@ var EmojiPicker = ({ onSelect, onClose }) => {
|
|
|
23454
23465
|
"div",
|
|
23455
23466
|
{
|
|
23456
23467
|
ref: scrollContainerRef,
|
|
23468
|
+
"data-os-scrollbar": true,
|
|
23457
23469
|
className: "overflow-y-auto px-3 py-2 shrink",
|
|
23458
23470
|
style: { height: "20rem" },
|
|
23459
23471
|
children: search ? (
|
|
@@ -24153,7 +24165,7 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
24153
24165
|
if (commands.length === 0) {
|
|
24154
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") });
|
|
24155
24167
|
}
|
|
24156
|
-
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: [
|
|
24157
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") }) }),
|
|
24158
24170
|
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "p-1", children: commands.map((cmd, index) => /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(
|
|
24159
24171
|
"button",
|
|
@@ -24915,6 +24927,7 @@ var UEditor = import_react52.default.forwardRef(({
|
|
|
24915
24927
|
import_react53.EditorContent,
|
|
24916
24928
|
{
|
|
24917
24929
|
editor,
|
|
24930
|
+
"data-os-scrollbar": true,
|
|
24918
24931
|
className: "flex-1 overflow-y-auto",
|
|
24919
24932
|
style: {
|
|
24920
24933
|
minHeight,
|