@underverse-ui/underverse 1.0.83 → 1.0.85

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,7 +51,7 @@ import { OverlayScrollbarProvider, ScrollArea, DataTable } from "@underverse-ui/
51
51
  export function App() {
52
52
  return (
53
53
  <OverlayScrollbarProvider theme="os-theme-underverse" autoHide="leave">
54
- <ScrollArea className="h-56" useOverlayScrollbar />
54
+ <ScrollArea className="h-56 rounded-xl border border-border" useOverlayScrollbar />
55
55
  <DataTable columns={columns} data={rows} useOverlayScrollbar />
56
56
  </OverlayScrollbarProvider>
57
57
  );
package/README.md CHANGED
@@ -147,7 +147,7 @@ import { OverlayScrollbarProvider, ScrollArea, DataTable } from "@underverse-ui/
147
147
  function App() {
148
148
  return (
149
149
  <OverlayScrollbarProvider theme="os-theme-underverse" autoHide="leave">
150
- <ScrollArea className="h-56" useOverlayScrollbar>
150
+ <ScrollArea className="h-56 rounded-xl border border-border" useOverlayScrollbar>
151
151
  {/* long content */}
152
152
  </ScrollArea>
153
153
 
@@ -183,6 +183,9 @@ Provider props:
183
183
  Component-level enable flags:
184
184
 
185
185
  - `ScrollArea`: `useOverlayScrollbar?: boolean` (default `false`)
186
+ - `className` styles the outer wrapper
187
+ - `contentClassName` styles the scroll viewport
188
+ - set border/radius explicitly; the primitive no longer hardcodes rounded corners
186
189
  - `Table`: `useOverlayScrollbar?: boolean` (default `false`)
187
190
  - `DataTable`: `useOverlayScrollbar?: boolean` (default `false`)
188
191
  - `Combobox`: `useOverlayScrollbar?: boolean` (default `false`)
@@ -26,7 +26,7 @@
26
26
  {
27
27
  "id": "overlay-scrollbar-provider",
28
28
  "title": "Enable overlay scrollbars (opt-in)",
29
- "code": "import \"overlayscrollbars/overlayscrollbars.css\";\nimport { OverlayScrollbarProvider, ScrollArea } from \"@underverse-ui/underverse\";\n\nexport function App(){\n return (\n <OverlayScrollbarProvider theme=\"os-theme-underverse\" autoHide=\"leave\">\n <ScrollArea className=\"h-56\" useOverlayScrollbar>{/* content */}</ScrollArea>\n </OverlayScrollbarProvider>\n );\n}\n"
29
+ "code": "import \"overlayscrollbars/overlayscrollbars.css\";\nimport { OverlayScrollbarProvider, ScrollArea } from \"@underverse-ui/underverse\";\n\nexport function App(){\n return (\n <OverlayScrollbarProvider theme=\"os-theme-underverse\" autoHide=\"leave\">\n <ScrollArea className=\"h-56 rounded-xl border border-border\" useOverlayScrollbar>{/* content */}</ScrollArea>\n </OverlayScrollbarProvider>\n );\n}\n"
30
30
  },
31
31
  {
32
32
  "id": "overlay-scrollbar-custom-component",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@underverse-ui/underverse",
3
- "version": "1.0.83",
3
+ "version": "1.0.85",
4
4
  "sourceEntry": "src/index.ts",
5
5
  "totalExports": 225,
6
6
  "exports": [
package/dist/index.cjs CHANGED
@@ -5493,9 +5493,10 @@ var ToastComponent = ({ toast, onRemove }) => {
5493
5493
  "div",
5494
5494
  {
5495
5495
  className: cn(
5496
- "relative w-80 rounded-xl border backdrop-blur-md transition-all duration-300 pointer-events-auto overflow-hidden",
5496
+ "relative w-80 rounded-xl border backdrop-blur-md transition-all duration-300 pointer-events-auto",
5497
5497
  "bg-card shadow-xl",
5498
5498
  "animate-in slide-in-from-right-full",
5499
+ toast.overflowHidden !== false && "overflow-hidden",
5499
5500
  config.containerClassName,
5500
5501
  isVisible ? "opacity-100 translate-x-0" : "opacity-0 translate-x-full"
5501
5502
  ),
@@ -6341,7 +6342,18 @@ var variantConfig = {
6341
6342
  accentBarClassName: "bg-destructive"
6342
6343
  }
6343
6344
  };
6344
- var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions, closeAriaLabel }) => {
6345
+ var Alert = ({
6346
+ title,
6347
+ description,
6348
+ variant = "default",
6349
+ className,
6350
+ icon,
6351
+ dismissible = false,
6352
+ onClose,
6353
+ actions,
6354
+ closeAriaLabel,
6355
+ overflowHidden = true
6356
+ }) => {
6345
6357
  const [open, setOpen] = (0, import_react12.useState)(true);
6346
6358
  const t = useSmartTranslations("Common");
6347
6359
  if (!open) return null;
@@ -6355,9 +6367,10 @@ var Alert = ({ title, description, variant = "default", className, icon, dismiss
6355
6367
  "div",
6356
6368
  {
6357
6369
  className: cn(
6358
- "relative w-full rounded-r-xl border border-l-0 overflow-hidden",
6370
+ "relative w-full rounded-r-xl border border-l-0",
6359
6371
  "flex items-start gap-3 p-4 pl-5",
6360
6372
  "backdrop-blur-md",
6373
+ overflowHidden && "overflow-hidden",
6361
6374
  config.containerClassName,
6362
6375
  className
6363
6376
  ),
@@ -7934,19 +7947,23 @@ var variantClasses2 = {
7934
7947
  accent: "bg-accent/10"
7935
7948
  };
7936
7949
  var ScrollArea = (0, import_react17.forwardRef)(
7937
- ({ className, contentClassName, children, variant = "default", outlined = false, useOverlayScrollbar = false, ...props }, ref) => {
7950
+ ({
7951
+ className,
7952
+ contentClassName,
7953
+ children,
7954
+ variant = "default",
7955
+ outlined = false,
7956
+ overflowHidden = true,
7957
+ useOverlayScrollbar = false,
7958
+ ...props
7959
+ }, ref) => {
7938
7960
  const viewportRef = (0, import_react17.useRef)(null);
7939
7961
  useOverlayScrollbarTarget(viewportRef, { enabled: useOverlayScrollbar });
7940
7962
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
7941
7963
  "div",
7942
7964
  {
7943
7965
  ref,
7944
- className: cn(
7945
- "relative overflow-hidden rounded-2xl md:rounded-3xl",
7946
- variantClasses2[variant],
7947
- outlined && "border border-border/60",
7948
- className
7949
- ),
7966
+ className: cn("relative", variantClasses2[variant], outlined && "border border-border/60", overflowHidden && "overflow-hidden", className),
7950
7967
  ...props,
7951
7968
  children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { ref: viewportRef, className: cn("h-full w-full overflow-y-auto scroll-area-viewport", contentClassName), children })
7952
7969
  }
@@ -7959,13 +7976,13 @@ ScrollArea.displayName = "ScrollArea";
7959
7976
  var import_react18 = require("react");
7960
7977
  var import_jsx_runtime33 = require("react/jsx-runtime");
7961
7978
  var OverlayScrollArea = (0, import_react18.forwardRef)(
7962
- ({ className, viewportClassName, viewportProps, enabled = true, overlayScrollbarOptions, children, ...props }, ref) => {
7979
+ ({ className, viewportClassName, viewportProps, enabled = true, overflowHidden = true, overlayScrollbarOptions, children, ...props }, ref) => {
7963
7980
  const viewportRef = (0, import_react18.useRef)(null);
7964
7981
  useOverlayScrollbarTarget(viewportRef, {
7965
7982
  enabled,
7966
7983
  ...overlayScrollbarOptions
7967
7984
  });
7968
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { ref, className: cn("relative overflow-hidden", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
7985
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { ref, className: cn("relative", overflowHidden && "overflow-hidden", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
7969
7986
  "div",
7970
7987
  {
7971
7988
  ref: viewportRef,
@@ -13733,6 +13750,7 @@ function CalendarTimeline({
13733
13750
  dayEventMaxWidth,
13734
13751
  monthEventStyle = "span",
13735
13752
  monthEventMaxWidth,
13753
+ overflowHidden = true,
13736
13754
  dayTimeStepMinutes = 60,
13737
13755
  enableEventTooltips = true,
13738
13756
  dayHeaderMode = "full",
@@ -14795,9 +14813,10 @@ function CalendarTimeline({
14795
14813
  "div",
14796
14814
  {
14797
14815
  className: cn(
14798
- "rounded-2xl md:rounded-3xl overflow-hidden bg-card text-card-foreground backdrop-blur-sm",
14816
+ "rounded-2xl md:rounded-3xl bg-card text-card-foreground backdrop-blur-sm",
14799
14817
  "border border-border/50 shadow-sm md:hover:shadow-md",
14800
14818
  "transition-[transform,box-shadow,border-color,background-color] duration-300 ease-soft",
14819
+ overflowHidden && "overflow-hidden",
14801
14820
  densityClass,
14802
14821
  className
14803
14822
  ),
@@ -18962,6 +18981,7 @@ var ListRoot = React46.forwardRef(
18962
18981
  className,
18963
18982
  itemClassName,
18964
18983
  // New prop
18984
+ overflowHidden = true,
18965
18985
  children,
18966
18986
  ...rest
18967
18987
  }, ref) => {
@@ -18975,21 +18995,36 @@ var ListRoot = React46.forwardRef(
18975
18995
  bordered: "border border-border/50 rounded-2xl md:rounded-3xl max-md:rounded-xl",
18976
18996
  card: "rounded-2xl md:rounded-3xl bg-card shadow-md border border-border/50 max-md:rounded-xl max-md:shadow-sm",
18977
18997
  flush: "",
18978
- striped: "rounded-2xl md:rounded-3xl border border-border/50 overflow-hidden max-md:rounded-xl"
18998
+ striped: "rounded-2xl md:rounded-3xl border border-border/50 max-md:rounded-xl"
18979
18999
  };
18980
19000
  if (loading2) {
18981
19001
  return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
18982
19002
  Comp,
18983
19003
  {
18984
19004
  ref,
18985
- className: cn("group/list", variantClasses3[variant], inset && "p-1.5 md:p-2 max-md:p-1", divided && "divide-y divide-border/60", className),
19005
+ className: cn(
19006
+ "group/list",
19007
+ variantClasses3[variant],
19008
+ variant === "striped" && overflowHidden && "overflow-hidden",
19009
+ inset && "p-1.5 md:p-2 max-md:p-1",
19010
+ divided && "divide-y divide-border/60",
19011
+ className
19012
+ ),
18986
19013
  ...rest,
18987
19014
  children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ListItemSkeleton, { size }, i))
18988
19015
  }
18989
19016
  );
18990
19017
  }
18991
19018
  if (!hasChildren && emptyText) {
18992
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Comp, { ref, className: cn("group/list", variantClasses3[variant], inset && "p-1.5 md:p-2 max-md:p-1", className), ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "text-center py-8 text-muted-foreground text-sm", children: emptyText }) });
19019
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
19020
+ Comp,
19021
+ {
19022
+ ref,
19023
+ className: cn("group/list", variantClasses3[variant], variant === "striped" && overflowHidden && "overflow-hidden", inset && "p-1.5 md:p-2 max-md:p-1", className),
19024
+ ...rest,
19025
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "text-center py-8 text-muted-foreground text-sm", children: emptyText })
19026
+ }
19027
+ );
18993
19028
  }
18994
19029
  return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
18995
19030
  Comp,
@@ -18998,6 +19033,7 @@ var ListRoot = React46.forwardRef(
18998
19033
  className: cn(
18999
19034
  "group/list",
19000
19035
  variantClasses3[variant],
19036
+ variant === "striped" && overflowHidden && "overflow-hidden",
19001
19037
  inset && "p-1.5 md:p-2 max-md:p-1",
19002
19038
  divided && "divide-y divide-border/60",
19003
19039
  variant === "striped" && "[&>*:nth-child(even)]:bg-muted/30",
@@ -20328,7 +20364,8 @@ var MusicPlayer = ({
20328
20364
  playlist = DEFAULT_PLAYLIST,
20329
20365
  autoPlay = false,
20330
20366
  showPlaylist: initialShowPlaylist = true,
20331
- className = ""
20367
+ className = "",
20368
+ overflowHidden = true
20332
20369
  }) => {
20333
20370
  const [currentSongIndex, setCurrentSongIndex] = (0, import_react26.useState)(0);
20334
20371
  const [isPlaying, setIsPlaying] = (0, import_react26.useState)(false);
@@ -20430,108 +20467,116 @@ var MusicPlayer = ({
20430
20467
  }
20431
20468
  }
20432
20469
  }, [currentSongIndex, currentSong.startTime, isPlaying]);
20433
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: `underverse-music-player bg-card dark:bg-card border border-border/50 rounded-2xl shadow-2xl overflow-hidden ${className}`, children: [
20434
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("audio", { ref: audioRef, src: currentSong.audioUrl, onTimeUpdate: handleTimeUpdate, onLoadedMetadata: handleLoadedMetadata, onEnded: playNext }),
20435
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "p-6", children: [
20436
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "text-center mb-6", children: [
20437
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "w-48 h-48 mx-auto mb-4 bg-primary/10 dark:bg-primary/20 border border-primary/30 rounded-2xl shadow-lg flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-6xl", children: "\u{1F3B5}" }) }),
20438
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h2", { className: "text-2xl font-bold text-foreground mb-1", children: currentSong.title }),
20439
- currentSong.artist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-muted-foreground", children: currentSong.artist })
20440
- ] }),
20441
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "mb-4", children: [
20442
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20443
- "input",
20444
- {
20445
- type: "range",
20446
- min: "0",
20447
- max: duration || 0,
20448
- value: currentTime,
20449
- onChange: handleSeek,
20450
- className: "w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"
20451
- }
20452
- ),
20453
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex justify-between text-sm text-muted-foreground mt-1", children: [
20454
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: formatTime3(currentTime) }),
20455
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: formatTime3(duration) })
20456
- ] })
20457
- ] }),
20458
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center justify-center gap-4 mb-6", children: [
20459
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20460
- "button",
20461
- {
20462
- onClick: playPrevious,
20463
- className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20464
- children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.SkipBack, { size: 24 })
20465
- }
20466
- ),
20467
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20468
- "button",
20469
- {
20470
- onClick: togglePlay,
20471
- className: "w-16 h-16 flex items-center justify-center rounded-full bg-primary hover:bg-primary/90 transition-colors text-primary-foreground shadow-lg",
20472
- children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Pause, { size: 32 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Play, { size: 32, className: "ml-1" })
20473
- }
20474
- ),
20475
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20476
- "button",
20477
- {
20478
- onClick: playNext,
20479
- className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20480
- children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.SkipForward, { size: 24 })
20481
- }
20482
- )
20483
- ] }),
20484
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center gap-3 mb-4", children: [
20485
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("button", { onClick: toggleMute, className: "text-foreground hover:text-primary transition-colors", children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.VolumeX, { size: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Volume2, { size: 20 }) }),
20486
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20487
- "input",
20488
- {
20489
- type: "range",
20490
- min: "0",
20491
- max: "1",
20492
- step: "0.01",
20493
- value: volume,
20494
- onChange: handleVolumeChange,
20495
- className: "flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer"
20496
- }
20497
- )
20498
- ] }),
20499
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "flex justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20500
- "button",
20501
- {
20502
- onClick: () => setShowPlaylist(!showPlaylist),
20503
- className: "flex items-center gap-2 px-4 py-2 bg-secondary hover:bg-secondary/80 rounded-lg text-secondary-foreground transition-colors",
20504
- children: [
20505
- showPlaylist ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.X, { size: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.List, { size: 20 }),
20506
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: showPlaylist ? "Hide Playlist" : "Show Playlist" })
20507
- ]
20508
- }
20509
- ) })
20510
- ] }),
20511
- showPlaylist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border/50", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "p-4", children: [
20512
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("h3", { className: "text-lg font-semibold text-foreground mb-3", children: [
20513
- "Playlist (",
20514
- playlist.length,
20515
- " songs)"
20516
- ] }),
20517
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "space-y-2", children: playlist.map((song, index) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20518
- "div",
20519
- {
20520
- onClick: () => playSong(index),
20521
- className: `flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-all ${index === currentSongIndex ? "bg-primary/20 border border-primary shadow-lg" : "bg-secondary/30 hover:bg-secondary/50"}`,
20522
- children: [
20523
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "shrink-0 w-8 h-8 flex items-center justify-center rounded-full bg-primary text-primary-foreground text-sm font-semibold", children: index === currentSongIndex && isPlaying ? "\u25B6" : index + 1 }),
20524
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex-1 min-w-0", children: [
20525
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-foreground font-medium truncate", children: song.title }),
20526
- song.artist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-muted-foreground text-sm truncate", children: song.artist })
20527
- ] }),
20528
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-muted-foreground text-sm shrink-0", children: song.duration })
20529
- ]
20530
- },
20531
- song.id
20532
- )) })
20533
- ] }) }),
20534
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("style", { children: `
20470
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20471
+ "div",
20472
+ {
20473
+ className: [
20474
+ "underverse-music-player bg-card dark:bg-card border border-border/50 rounded-2xl shadow-2xl",
20475
+ overflowHidden ? "overflow-hidden" : "",
20476
+ className
20477
+ ].filter(Boolean).join(" "),
20478
+ children: [
20479
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("audio", { ref: audioRef, src: currentSong.audioUrl, onTimeUpdate: handleTimeUpdate, onLoadedMetadata: handleLoadedMetadata, onEnded: playNext }),
20480
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "p-6", children: [
20481
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "text-center mb-6", children: [
20482
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "w-48 h-48 mx-auto mb-4 bg-primary/10 dark:bg-primary/20 border border-primary/30 rounded-2xl shadow-lg flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-6xl", children: "\u{1F3B5}" }) }),
20483
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h2", { className: "text-2xl font-bold text-foreground mb-1", children: currentSong.title }),
20484
+ currentSong.artist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-muted-foreground", children: currentSong.artist })
20485
+ ] }),
20486
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "mb-4", children: [
20487
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20488
+ "input",
20489
+ {
20490
+ type: "range",
20491
+ min: "0",
20492
+ max: duration || 0,
20493
+ value: currentTime,
20494
+ onChange: handleSeek,
20495
+ className: "w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"
20496
+ }
20497
+ ),
20498
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex justify-between text-sm text-muted-foreground mt-1", children: [
20499
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: formatTime3(currentTime) }),
20500
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: formatTime3(duration) })
20501
+ ] })
20502
+ ] }),
20503
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center justify-center gap-4 mb-6", children: [
20504
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20505
+ "button",
20506
+ {
20507
+ onClick: playPrevious,
20508
+ className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20509
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.SkipBack, { size: 24 })
20510
+ }
20511
+ ),
20512
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20513
+ "button",
20514
+ {
20515
+ onClick: togglePlay,
20516
+ className: "w-16 h-16 flex items-center justify-center rounded-full bg-primary hover:bg-primary/90 transition-colors text-primary-foreground shadow-lg",
20517
+ children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Pause, { size: 32 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Play, { size: 32, className: "ml-1" })
20518
+ }
20519
+ ),
20520
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20521
+ "button",
20522
+ {
20523
+ onClick: playNext,
20524
+ className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20525
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.SkipForward, { size: 24 })
20526
+ }
20527
+ )
20528
+ ] }),
20529
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center gap-3 mb-4", children: [
20530
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("button", { onClick: toggleMute, className: "text-foreground hover:text-primary transition-colors", children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.VolumeX, { size: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.Volume2, { size: 20 }) }),
20531
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
20532
+ "input",
20533
+ {
20534
+ type: "range",
20535
+ min: "0",
20536
+ max: "1",
20537
+ step: "0.01",
20538
+ value: volume,
20539
+ onChange: handleVolumeChange,
20540
+ className: "flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer"
20541
+ }
20542
+ )
20543
+ ] }),
20544
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "flex justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20545
+ "button",
20546
+ {
20547
+ onClick: () => setShowPlaylist(!showPlaylist),
20548
+ className: "flex items-center gap-2 px-4 py-2 bg-secondary hover:bg-secondary/80 rounded-lg text-secondary-foreground transition-colors",
20549
+ children: [
20550
+ showPlaylist ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.X, { size: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react33.List, { size: 20 }),
20551
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: showPlaylist ? "Hide Playlist" : "Show Playlist" })
20552
+ ]
20553
+ }
20554
+ ) })
20555
+ ] }),
20556
+ showPlaylist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border/50", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "p-4", children: [
20557
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("h3", { className: "text-lg font-semibold text-foreground mb-3", children: [
20558
+ "Playlist (",
20559
+ playlist.length,
20560
+ " songs)"
20561
+ ] }),
20562
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "space-y-2", children: playlist.map((song, index) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
20563
+ "div",
20564
+ {
20565
+ onClick: () => playSong(index),
20566
+ className: `flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-all ${index === currentSongIndex ? "bg-primary/20 border border-primary shadow-lg" : "bg-secondary/30 hover:bg-secondary/50"}`,
20567
+ children: [
20568
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "shrink-0 w-8 h-8 flex items-center justify-center rounded-full bg-primary text-primary-foreground text-sm font-semibold", children: index === currentSongIndex && isPlaying ? "\u25B6" : index + 1 }),
20569
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex-1 min-w-0", children: [
20570
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-foreground font-medium truncate", children: song.title }),
20571
+ song.artist && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-muted-foreground text-sm truncate", children: song.artist })
20572
+ ] }),
20573
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-muted-foreground text-sm shrink-0", children: song.duration })
20574
+ ]
20575
+ },
20576
+ song.id
20577
+ )) })
20578
+ ] }) }),
20579
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("style", { children: `
20535
20580
  .underverse-music-player input[type="range"]::-webkit-slider-thumb {
20536
20581
  -webkit-appearance: none;
20537
20582
  appearance: none;
@@ -20557,7 +20602,9 @@ var MusicPlayer = ({
20557
20602
  background: linear-gradient(to right, hsl(var(--primary)) var(--progress, 0%), hsl(var(--muted)) var(--progress, 0%));
20558
20603
  }
20559
20604
  ` })
20560
- ] });
20605
+ ]
20606
+ }
20607
+ );
20561
20608
  };
20562
20609
  var MusicPlayer_default = MusicPlayer;
20563
20610
 
@@ -22092,6 +22139,7 @@ function DataTable({
22092
22139
  storageKey,
22093
22140
  stickyHeader = true,
22094
22141
  maxHeight = 500,
22142
+ overflowHidden = true,
22095
22143
  useOverlayScrollbar = false,
22096
22144
  enableHeaderAutoFit = true,
22097
22145
  labels
@@ -22225,7 +22273,8 @@ function DataTable({
22225
22273
  "div",
22226
22274
  {
22227
22275
  className: cn(
22228
- "relative rounded-2xl md:rounded-3xl border border-border/50 bg-card overflow-hidden",
22276
+ "relative rounded-2xl md:rounded-3xl border border-border/50 bg-card",
22277
+ overflowHidden && "overflow-hidden",
22229
22278
  loading2 && "opacity-60 pointer-events-none"
22230
22279
  ),
22231
22280
  children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(