@underverse-ui/underverse 1.0.84 → 1.0.86

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/dist/index.d.cts CHANGED
@@ -448,6 +448,7 @@ interface Toast {
448
448
  onClick: () => void;
449
449
  };
450
450
  dismissible?: boolean;
451
+ overflowHidden?: boolean;
451
452
  }
452
453
  interface ToastContextType {
453
454
  addToast: (toast: Omit<Toast, "id">) => void;
@@ -542,8 +543,9 @@ interface AlertProps {
542
543
  onClose?: () => void;
543
544
  actions?: ReactNode;
544
545
  closeAriaLabel?: string;
546
+ overflowHidden?: boolean;
545
547
  }
546
- declare const Alert: ({ title, description, variant, className, icon, dismissible, onClose, actions, closeAriaLabel }: AlertProps) => react_jsx_runtime.JSX.Element | null;
548
+ declare const Alert: ({ title, description, variant, className, icon, dismissible, onClose, actions, closeAriaLabel, overflowHidden, }: AlertProps) => react_jsx_runtime.JSX.Element | null;
547
549
 
548
550
  interface GlobalLoadingProps {
549
551
  className?: string;
@@ -1378,6 +1380,8 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1378
1380
  monthEventStyle?: "span" | "compact";
1379
1381
  /** Month view only (when `monthEventStyle="compact"`): max visual width (px). */
1380
1382
  monthEventMaxWidth?: number;
1383
+ /** Clip overflow at the outer surface. Disable when child hover shadows or focus rings should escape the timeline card. Default: true. */
1384
+ overflowHidden?: boolean;
1381
1385
  dayTimeStepMinutes?: number;
1382
1386
  /** Render tooltips on events (can be expensive for large datasets). Default: true. */
1383
1387
  enableEventTooltips?: boolean;
@@ -1468,7 +1472,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1468
1472
  virtualization?: CalendarTimelineVirtualization;
1469
1473
  }
1470
1474
 
1471
- declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, eventSheetOverlayOpacity, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, onlyView, view, defaultView, onViewChange, dueDateSprint, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, hideResourceColumn, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, adaptiveSlotWidths, dayEventStyle, dayEventMaxWidth, monthEventStyle, monthEventMaxWidth, dayTimeStepMinutes, enableEventTooltips, dayHeaderMode, daySlotCompression, columnVirtualization, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1475
+ declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, eventSheetOverlayOpacity, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, onlyView, view, defaultView, onViewChange, dueDateSprint, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, hideResourceColumn, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, adaptiveSlotWidths, dayEventStyle, dayEventMaxWidth, monthEventStyle, monthEventMaxWidth, overflowHidden, dayTimeStepMinutes, enableEventTooltips, dayHeaderMode, daySlotCompression, columnVirtualization, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1472
1476
 
1473
1477
  type ComboboxOption = string | {
1474
1478
  label: string;
@@ -2105,6 +2109,7 @@ interface MusicPlayerProps {
2105
2109
  autoPlay?: boolean;
2106
2110
  showPlaylist?: boolean;
2107
2111
  className?: string;
2112
+ overflowHidden?: boolean;
2108
2113
  }
2109
2114
  declare const MusicPlayer: React__default.FC<MusicPlayerProps>;
2110
2115
 
@@ -2416,8 +2421,9 @@ interface AccessDeniedProps {
2416
2421
  }>;
2417
2422
  className?: string;
2418
2423
  children?: React__default.ReactNode;
2424
+ overflowHidden?: boolean;
2419
2425
  }
2420
- declare function AccessDenied({ title, description, variant, icon: Icon, className, children, }: AccessDeniedProps): react_jsx_runtime.JSX.Element;
2426
+ declare function AccessDenied({ title, description, variant, icon: Icon, className, children, overflowHidden, }: AccessDeniedProps): react_jsx_runtime.JSX.Element;
2421
2427
 
2422
2428
  type ThemeMode = "light" | "dark" | "system";
2423
2429
  interface ThemeToggleHeadlessProps {
package/dist/index.d.ts CHANGED
@@ -448,6 +448,7 @@ interface Toast {
448
448
  onClick: () => void;
449
449
  };
450
450
  dismissible?: boolean;
451
+ overflowHidden?: boolean;
451
452
  }
452
453
  interface ToastContextType {
453
454
  addToast: (toast: Omit<Toast, "id">) => void;
@@ -542,8 +543,9 @@ interface AlertProps {
542
543
  onClose?: () => void;
543
544
  actions?: ReactNode;
544
545
  closeAriaLabel?: string;
546
+ overflowHidden?: boolean;
545
547
  }
546
- declare const Alert: ({ title, description, variant, className, icon, dismissible, onClose, actions, closeAriaLabel }: AlertProps) => react_jsx_runtime.JSX.Element | null;
548
+ declare const Alert: ({ title, description, variant, className, icon, dismissible, onClose, actions, closeAriaLabel, overflowHidden, }: AlertProps) => react_jsx_runtime.JSX.Element | null;
547
549
 
548
550
  interface GlobalLoadingProps {
549
551
  className?: string;
@@ -1378,6 +1380,8 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1378
1380
  monthEventStyle?: "span" | "compact";
1379
1381
  /** Month view only (when `monthEventStyle="compact"`): max visual width (px). */
1380
1382
  monthEventMaxWidth?: number;
1383
+ /** Clip overflow at the outer surface. Disable when child hover shadows or focus rings should escape the timeline card. Default: true. */
1384
+ overflowHidden?: boolean;
1381
1385
  dayTimeStepMinutes?: number;
1382
1386
  /** Render tooltips on events (can be expensive for large datasets). Default: true. */
1383
1387
  enableEventTooltips?: boolean;
@@ -1468,7 +1472,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1468
1472
  virtualization?: CalendarTimelineVirtualization;
1469
1473
  }
1470
1474
 
1471
- declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, eventSheetOverlayOpacity, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, onlyView, view, defaultView, onViewChange, dueDateSprint, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, hideResourceColumn, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, adaptiveSlotWidths, dayEventStyle, dayEventMaxWidth, monthEventStyle, monthEventMaxWidth, dayTimeStepMinutes, enableEventTooltips, dayHeaderMode, daySlotCompression, columnVirtualization, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1475
+ declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, eventSheetOverlayOpacity, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, onlyView, view, defaultView, onViewChange, dueDateSprint, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, hideResourceColumn, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, adaptiveSlotWidths, dayEventStyle, dayEventMaxWidth, monthEventStyle, monthEventMaxWidth, overflowHidden, dayTimeStepMinutes, enableEventTooltips, dayHeaderMode, daySlotCompression, columnVirtualization, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1472
1476
 
1473
1477
  type ComboboxOption = string | {
1474
1478
  label: string;
@@ -2105,6 +2109,7 @@ interface MusicPlayerProps {
2105
2109
  autoPlay?: boolean;
2106
2110
  showPlaylist?: boolean;
2107
2111
  className?: string;
2112
+ overflowHidden?: boolean;
2108
2113
  }
2109
2114
  declare const MusicPlayer: React__default.FC<MusicPlayerProps>;
2110
2115
 
@@ -2416,8 +2421,9 @@ interface AccessDeniedProps {
2416
2421
  }>;
2417
2422
  className?: string;
2418
2423
  children?: React__default.ReactNode;
2424
+ overflowHidden?: boolean;
2419
2425
  }
2420
- declare function AccessDenied({ title, description, variant, icon: Icon, className, children, }: AccessDeniedProps): react_jsx_runtime.JSX.Element;
2426
+ declare function AccessDenied({ title, description, variant, icon: Icon, className, children, overflowHidden, }: AccessDeniedProps): react_jsx_runtime.JSX.Element;
2421
2427
 
2422
2428
  type ThemeMode = "light" | "dark" | "system";
2423
2429
  interface ThemeToggleHeadlessProps {
package/dist/index.js CHANGED
@@ -5308,9 +5308,10 @@ var ToastComponent = ({ toast, onRemove }) => {
5308
5308
  "div",
5309
5309
  {
5310
5310
  className: cn(
5311
- "relative w-80 rounded-xl border backdrop-blur-md transition-all duration-300 pointer-events-auto overflow-hidden",
5311
+ "relative w-80 rounded-xl border backdrop-blur-md transition-all duration-300 pointer-events-auto",
5312
5312
  "bg-card shadow-xl",
5313
5313
  "animate-in slide-in-from-right-full",
5314
+ toast.overflowHidden !== false && "overflow-hidden",
5314
5315
  config.containerClassName,
5315
5316
  isVisible ? "opacity-100 translate-x-0" : "opacity-0 translate-x-full"
5316
5317
  ),
@@ -6156,7 +6157,18 @@ var variantConfig = {
6156
6157
  accentBarClassName: "bg-destructive"
6157
6158
  }
6158
6159
  };
6159
- var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions, closeAriaLabel }) => {
6160
+ var Alert = ({
6161
+ title,
6162
+ description,
6163
+ variant = "default",
6164
+ className,
6165
+ icon,
6166
+ dismissible = false,
6167
+ onClose,
6168
+ actions,
6169
+ closeAriaLabel,
6170
+ overflowHidden = true
6171
+ }) => {
6160
6172
  const [open, setOpen] = useState12(true);
6161
6173
  const t = useSmartTranslations("Common");
6162
6174
  if (!open) return null;
@@ -6170,9 +6182,10 @@ var Alert = ({ title, description, variant = "default", className, icon, dismiss
6170
6182
  "div",
6171
6183
  {
6172
6184
  className: cn(
6173
- "relative w-full rounded-r-xl border border-l-0 overflow-hidden",
6185
+ "relative w-full rounded-r-xl border border-l-0",
6174
6186
  "flex items-start gap-3 p-4 pl-5",
6175
6187
  "backdrop-blur-md",
6188
+ overflowHidden && "overflow-hidden",
6176
6189
  config.containerClassName,
6177
6190
  className
6178
6191
  ),
@@ -13552,6 +13565,7 @@ function CalendarTimeline({
13552
13565
  dayEventMaxWidth,
13553
13566
  monthEventStyle = "span",
13554
13567
  monthEventMaxWidth,
13568
+ overflowHidden = true,
13555
13569
  dayTimeStepMinutes = 60,
13556
13570
  enableEventTooltips = true,
13557
13571
  dayHeaderMode = "full",
@@ -14614,9 +14628,10 @@ function CalendarTimeline({
14614
14628
  "div",
14615
14629
  {
14616
14630
  className: cn(
14617
- "rounded-2xl md:rounded-3xl overflow-hidden bg-card text-card-foreground backdrop-blur-sm",
14631
+ "rounded-2xl md:rounded-3xl bg-card text-card-foreground backdrop-blur-sm",
14618
14632
  "border border-border/50 shadow-sm md:hover:shadow-md",
14619
14633
  "transition-[transform,box-shadow,border-color,background-color] duration-300 ease-soft",
14634
+ overflowHidden && "overflow-hidden",
14620
14635
  densityClass,
14621
14636
  className
14622
14637
  ),
@@ -20180,7 +20195,8 @@ var MusicPlayer = ({
20180
20195
  playlist = DEFAULT_PLAYLIST,
20181
20196
  autoPlay = false,
20182
20197
  showPlaylist: initialShowPlaylist = true,
20183
- className = ""
20198
+ className = "",
20199
+ overflowHidden = true
20184
20200
  }) => {
20185
20201
  const [currentSongIndex, setCurrentSongIndex] = useState38(0);
20186
20202
  const [isPlaying, setIsPlaying] = useState38(false);
@@ -20282,108 +20298,116 @@ var MusicPlayer = ({
20282
20298
  }
20283
20299
  }
20284
20300
  }, [currentSongIndex, currentSong.startTime, isPlaying]);
20285
- return /* @__PURE__ */ jsxs48("div", { className: `underverse-music-player bg-card dark:bg-card border border-border/50 rounded-2xl shadow-2xl overflow-hidden ${className}`, children: [
20286
- /* @__PURE__ */ jsx58("audio", { ref: audioRef, src: currentSong.audioUrl, onTimeUpdate: handleTimeUpdate, onLoadedMetadata: handleLoadedMetadata, onEnded: playNext }),
20287
- /* @__PURE__ */ jsxs48("div", { className: "p-6", children: [
20288
- /* @__PURE__ */ jsxs48("div", { className: "text-center mb-6", children: [
20289
- /* @__PURE__ */ jsx58("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__ */ jsx58("div", { className: "text-6xl", children: "\u{1F3B5}" }) }),
20290
- /* @__PURE__ */ jsx58("h2", { className: "text-2xl font-bold text-foreground mb-1", children: currentSong.title }),
20291
- currentSong.artist && /* @__PURE__ */ jsx58("p", { className: "text-muted-foreground", children: currentSong.artist })
20292
- ] }),
20293
- /* @__PURE__ */ jsxs48("div", { className: "mb-4", children: [
20294
- /* @__PURE__ */ jsx58(
20295
- "input",
20296
- {
20297
- type: "range",
20298
- min: "0",
20299
- max: duration || 0,
20300
- value: currentTime,
20301
- onChange: handleSeek,
20302
- className: "w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"
20303
- }
20304
- ),
20305
- /* @__PURE__ */ jsxs48("div", { className: "flex justify-between text-sm text-muted-foreground mt-1", children: [
20306
- /* @__PURE__ */ jsx58("span", { children: formatTime3(currentTime) }),
20307
- /* @__PURE__ */ jsx58("span", { children: formatTime3(duration) })
20308
- ] })
20309
- ] }),
20310
- /* @__PURE__ */ jsxs48("div", { className: "flex items-center justify-center gap-4 mb-6", children: [
20311
- /* @__PURE__ */ jsx58(
20312
- "button",
20313
- {
20314
- onClick: playPrevious,
20315
- className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20316
- children: /* @__PURE__ */ jsx58(SkipBack, { size: 24 })
20317
- }
20318
- ),
20319
- /* @__PURE__ */ jsx58(
20320
- "button",
20321
- {
20322
- onClick: togglePlay,
20323
- 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",
20324
- children: isPlaying ? /* @__PURE__ */ jsx58(Pause2, { size: 32 }) : /* @__PURE__ */ jsx58(Play2, { size: 32, className: "ml-1" })
20325
- }
20326
- ),
20327
- /* @__PURE__ */ jsx58(
20328
- "button",
20329
- {
20330
- onClick: playNext,
20331
- className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20332
- children: /* @__PURE__ */ jsx58(SkipForward, { size: 24 })
20333
- }
20334
- )
20335
- ] }),
20336
- /* @__PURE__ */ jsxs48("div", { className: "flex items-center gap-3 mb-4", children: [
20337
- /* @__PURE__ */ jsx58("button", { onClick: toggleMute, className: "text-foreground hover:text-primary transition-colors", children: isMuted || volume === 0 ? /* @__PURE__ */ jsx58(VolumeX2, { size: 20 }) : /* @__PURE__ */ jsx58(Volume22, { size: 20 }) }),
20338
- /* @__PURE__ */ jsx58(
20339
- "input",
20340
- {
20341
- type: "range",
20342
- min: "0",
20343
- max: "1",
20344
- step: "0.01",
20345
- value: volume,
20346
- onChange: handleVolumeChange,
20347
- className: "flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer"
20348
- }
20349
- )
20350
- ] }),
20351
- /* @__PURE__ */ jsx58("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxs48(
20352
- "button",
20353
- {
20354
- onClick: () => setShowPlaylist(!showPlaylist),
20355
- className: "flex items-center gap-2 px-4 py-2 bg-secondary hover:bg-secondary/80 rounded-lg text-secondary-foreground transition-colors",
20356
- children: [
20357
- showPlaylist ? /* @__PURE__ */ jsx58(X17, { size: 20 }) : /* @__PURE__ */ jsx58(List2, { size: 20 }),
20358
- /* @__PURE__ */ jsx58("span", { children: showPlaylist ? "Hide Playlist" : "Show Playlist" })
20359
- ]
20360
- }
20361
- ) })
20362
- ] }),
20363
- showPlaylist && /* @__PURE__ */ jsx58("div", { className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border/50", children: /* @__PURE__ */ jsxs48("div", { className: "p-4", children: [
20364
- /* @__PURE__ */ jsxs48("h3", { className: "text-lg font-semibold text-foreground mb-3", children: [
20365
- "Playlist (",
20366
- playlist.length,
20367
- " songs)"
20368
- ] }),
20369
- /* @__PURE__ */ jsx58("div", { className: "space-y-2", children: playlist.map((song, index) => /* @__PURE__ */ jsxs48(
20370
- "div",
20371
- {
20372
- onClick: () => playSong(index),
20373
- 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"}`,
20374
- children: [
20375
- /* @__PURE__ */ jsx58("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 }),
20376
- /* @__PURE__ */ jsxs48("div", { className: "flex-1 min-w-0", children: [
20377
- /* @__PURE__ */ jsx58("p", { className: "text-foreground font-medium truncate", children: song.title }),
20378
- song.artist && /* @__PURE__ */ jsx58("p", { className: "text-muted-foreground text-sm truncate", children: song.artist })
20379
- ] }),
20380
- /* @__PURE__ */ jsx58("div", { className: "text-muted-foreground text-sm shrink-0", children: song.duration })
20381
- ]
20382
- },
20383
- song.id
20384
- )) })
20385
- ] }) }),
20386
- /* @__PURE__ */ jsx58("style", { children: `
20301
+ return /* @__PURE__ */ jsxs48(
20302
+ "div",
20303
+ {
20304
+ className: [
20305
+ "underverse-music-player bg-card dark:bg-card border border-border/50 rounded-2xl shadow-2xl",
20306
+ overflowHidden ? "overflow-hidden" : "",
20307
+ className
20308
+ ].filter(Boolean).join(" "),
20309
+ children: [
20310
+ /* @__PURE__ */ jsx58("audio", { ref: audioRef, src: currentSong.audioUrl, onTimeUpdate: handleTimeUpdate, onLoadedMetadata: handleLoadedMetadata, onEnded: playNext }),
20311
+ /* @__PURE__ */ jsxs48("div", { className: "p-6", children: [
20312
+ /* @__PURE__ */ jsxs48("div", { className: "text-center mb-6", children: [
20313
+ /* @__PURE__ */ jsx58("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__ */ jsx58("div", { className: "text-6xl", children: "\u{1F3B5}" }) }),
20314
+ /* @__PURE__ */ jsx58("h2", { className: "text-2xl font-bold text-foreground mb-1", children: currentSong.title }),
20315
+ currentSong.artist && /* @__PURE__ */ jsx58("p", { className: "text-muted-foreground", children: currentSong.artist })
20316
+ ] }),
20317
+ /* @__PURE__ */ jsxs48("div", { className: "mb-4", children: [
20318
+ /* @__PURE__ */ jsx58(
20319
+ "input",
20320
+ {
20321
+ type: "range",
20322
+ min: "0",
20323
+ max: duration || 0,
20324
+ value: currentTime,
20325
+ onChange: handleSeek,
20326
+ className: "w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"
20327
+ }
20328
+ ),
20329
+ /* @__PURE__ */ jsxs48("div", { className: "flex justify-between text-sm text-muted-foreground mt-1", children: [
20330
+ /* @__PURE__ */ jsx58("span", { children: formatTime3(currentTime) }),
20331
+ /* @__PURE__ */ jsx58("span", { children: formatTime3(duration) })
20332
+ ] })
20333
+ ] }),
20334
+ /* @__PURE__ */ jsxs48("div", { className: "flex items-center justify-center gap-4 mb-6", children: [
20335
+ /* @__PURE__ */ jsx58(
20336
+ "button",
20337
+ {
20338
+ onClick: playPrevious,
20339
+ className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20340
+ children: /* @__PURE__ */ jsx58(SkipBack, { size: 24 })
20341
+ }
20342
+ ),
20343
+ /* @__PURE__ */ jsx58(
20344
+ "button",
20345
+ {
20346
+ onClick: togglePlay,
20347
+ 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",
20348
+ children: isPlaying ? /* @__PURE__ */ jsx58(Pause2, { size: 32 }) : /* @__PURE__ */ jsx58(Play2, { size: 32, className: "ml-1" })
20349
+ }
20350
+ ),
20351
+ /* @__PURE__ */ jsx58(
20352
+ "button",
20353
+ {
20354
+ onClick: playNext,
20355
+ className: "w-12 h-12 flex items-center justify-center rounded-full bg-secondary hover:bg-secondary/80 transition-colors text-secondary-foreground",
20356
+ children: /* @__PURE__ */ jsx58(SkipForward, { size: 24 })
20357
+ }
20358
+ )
20359
+ ] }),
20360
+ /* @__PURE__ */ jsxs48("div", { className: "flex items-center gap-3 mb-4", children: [
20361
+ /* @__PURE__ */ jsx58("button", { onClick: toggleMute, className: "text-foreground hover:text-primary transition-colors", children: isMuted || volume === 0 ? /* @__PURE__ */ jsx58(VolumeX2, { size: 20 }) : /* @__PURE__ */ jsx58(Volume22, { size: 20 }) }),
20362
+ /* @__PURE__ */ jsx58(
20363
+ "input",
20364
+ {
20365
+ type: "range",
20366
+ min: "0",
20367
+ max: "1",
20368
+ step: "0.01",
20369
+ value: volume,
20370
+ onChange: handleVolumeChange,
20371
+ className: "flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer"
20372
+ }
20373
+ )
20374
+ ] }),
20375
+ /* @__PURE__ */ jsx58("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxs48(
20376
+ "button",
20377
+ {
20378
+ onClick: () => setShowPlaylist(!showPlaylist),
20379
+ className: "flex items-center gap-2 px-4 py-2 bg-secondary hover:bg-secondary/80 rounded-lg text-secondary-foreground transition-colors",
20380
+ children: [
20381
+ showPlaylist ? /* @__PURE__ */ jsx58(X17, { size: 20 }) : /* @__PURE__ */ jsx58(List2, { size: 20 }),
20382
+ /* @__PURE__ */ jsx58("span", { children: showPlaylist ? "Hide Playlist" : "Show Playlist" })
20383
+ ]
20384
+ }
20385
+ ) })
20386
+ ] }),
20387
+ showPlaylist && /* @__PURE__ */ jsx58("div", { className: "bg-muted/50 backdrop-blur-sm max-h-96 overflow-y-auto border-t border-border/50", children: /* @__PURE__ */ jsxs48("div", { className: "p-4", children: [
20388
+ /* @__PURE__ */ jsxs48("h3", { className: "text-lg font-semibold text-foreground mb-3", children: [
20389
+ "Playlist (",
20390
+ playlist.length,
20391
+ " songs)"
20392
+ ] }),
20393
+ /* @__PURE__ */ jsx58("div", { className: "space-y-2", children: playlist.map((song, index) => /* @__PURE__ */ jsxs48(
20394
+ "div",
20395
+ {
20396
+ onClick: () => playSong(index),
20397
+ 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"}`,
20398
+ children: [
20399
+ /* @__PURE__ */ jsx58("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 }),
20400
+ /* @__PURE__ */ jsxs48("div", { className: "flex-1 min-w-0", children: [
20401
+ /* @__PURE__ */ jsx58("p", { className: "text-foreground font-medium truncate", children: song.title }),
20402
+ song.artist && /* @__PURE__ */ jsx58("p", { className: "text-muted-foreground text-sm truncate", children: song.artist })
20403
+ ] }),
20404
+ /* @__PURE__ */ jsx58("div", { className: "text-muted-foreground text-sm shrink-0", children: song.duration })
20405
+ ]
20406
+ },
20407
+ song.id
20408
+ )) })
20409
+ ] }) }),
20410
+ /* @__PURE__ */ jsx58("style", { children: `
20387
20411
  .underverse-music-player input[type="range"]::-webkit-slider-thumb {
20388
20412
  -webkit-appearance: none;
20389
20413
  appearance: none;
@@ -20409,7 +20433,9 @@ var MusicPlayer = ({
20409
20433
  background: linear-gradient(to right, hsl(var(--primary)) var(--progress, 0%), hsl(var(--muted)) var(--progress, 0%));
20410
20434
  }
20411
20435
  ` })
20412
- ] });
20436
+ ]
20437
+ }
20438
+ );
20413
20439
  };
20414
20440
  var MusicPlayer_default = MusicPlayer;
20415
20441
 
@@ -22360,18 +22386,26 @@ function AccessDenied({
22360
22386
  variant = "destructive",
22361
22387
  icon: Icon,
22362
22388
  className,
22363
- children
22389
+ children,
22390
+ overflowHidden = true
22364
22391
  }) {
22365
22392
  const styles = VARIANT_STYLES[variant];
22366
22393
  const UsedIcon = Icon || DEFAULT_ICONS[variant];
22367
- return /* @__PURE__ */ jsx70(Card_default, { className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className), children: /* @__PURE__ */ jsxs59("div", { className: "flex flex-col items-center gap-4", children: [
22368
- /* @__PURE__ */ jsx70("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ jsx70(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
22369
- /* @__PURE__ */ jsxs59("div", { children: [
22370
- /* @__PURE__ */ jsx70("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
22371
- /* @__PURE__ */ jsx70("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
22372
- ] }),
22373
- children && /* @__PURE__ */ jsx70("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
22374
- ] }) });
22394
+ return /* @__PURE__ */ jsx70(
22395
+ Card_default,
22396
+ {
22397
+ className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className),
22398
+ innerClassName: !overflowHidden ? "overflow-visible" : void 0,
22399
+ children: /* @__PURE__ */ jsxs59("div", { className: "flex flex-col items-center gap-4", children: [
22400
+ /* @__PURE__ */ jsx70("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ jsx70(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
22401
+ /* @__PURE__ */ jsxs59("div", { children: [
22402
+ /* @__PURE__ */ jsx70("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
22403
+ /* @__PURE__ */ jsx70("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
22404
+ ] }),
22405
+ children && /* @__PURE__ */ jsx70("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
22406
+ ] })
22407
+ }
22408
+ );
22375
22409
  }
22376
22410
 
22377
22411
  // src/components/ThemeToggleHeadless.tsx