@behindthemusictree/app-kit-ui 40.1.0 → 42.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { ReactNode, ComponentType, ComponentProps } from 'react';
3
3
  import { z } from 'zod';
4
4
  import { GenreTreeProps, FocusChangeReason, GenreTreeNode, GenreTreeAction, GenreTreeViewMode, GenreTreeViewport, WheelZoomMode } from '@behindthemusictree/genre-tree-view';
5
5
  export { FocusChangeReason, GenreTreeAction, GenreTreeOutlineSkeleton, GenreTreeSkeleton, GenreTreeViewMode, GenreTreeViewSkeleton, GenreTreeViewSkeletonProps, GenreTreeViewport, GenreTreeWheelSkeleton } from '@behindthemusictree/genre-tree-view';
6
- import { TrackBase, CriteriaOverview, GenreUuid, CriteriaPlaylistMinimum, GenreMusicSelection, RenderArtistLink, RenderSongLink, CriteriaPlaylistSimple, ArtistSearchResult, SongSearchResult, UseGenreRemoteSearchOptions, GenreSearchResult, CriteriaMinimum, GenreCatalogueCounts, GenrePlaylistSummary } from '@behindthemusictree/app-kit/genre-tree';
6
+ import { TrackBase, CriteriaOverview, GenreUuid, CriteriaPlaylistMinimum, GenreMusicSelection, RenderArtistLink, RenderSongLink, CriteriaPlaylistSimple, ArtistSearchResult, SongSearchResult, UseGenreRemoteSearchOptions, GenreSearchResult, CriteriaMinimum, RenderPlaceLink, GenreCatalogueCounts, GenrePlaylistSummary } from '@behindthemusictree/app-kit/genre-tree';
7
7
  import { Scope } from '@behindthemusictree/app-kit/transport';
8
8
  import { DetailPanel } from '@behindthemusictree/ui';
9
9
 
@@ -250,8 +250,11 @@ type GenreTreeViewProps<O extends CriteriaOverview = CriteriaOverview> = {
250
250
  additionalActions?: (node: GenreTreeNode) => GenreTreeAction[];
251
251
  /** Controlled view mode. When provided, the internal Stacked/Wheel toggle is not rendered — the consumer owns that UI. */
252
252
  viewMode?: GenreTreeViewMode;
253
- /** Selected genre entity, including genres outside the rendered tree. */
254
- selectedGenreUuid?: GenreUuid | null;
253
+ /**
254
+ * Selected genre entity, including genres outside the rendered tree. A raw URL value is accepted as is:
255
+ * one that names no genre opens a "not found" panel.
256
+ */
257
+ selectedGenreUuid?: string | null;
255
258
  /** Called on every user-driven selection change (tree click, search pick, search clear). */
256
259
  onSelectedGenreUuidChange?: (genreUuid: GenreUuid | null) => void;
257
260
  /** Mount-only seed for the pan/zoom (wheel, pop-core and stacked views), replacing the initial fit. */
@@ -318,6 +321,8 @@ type GenreTreeViewProps<O extends CriteriaOverview = CriteriaOverview> = {
318
321
  /** When set, song titles in the info panel's track list render through it (e.g. a router `Link` to the song).
319
322
  * By default they are buttons that open the song panel. */
320
323
  renderSongLink?: RenderSongLink;
324
+ /** When set, the artist panel renders the artist's origin through it (e.g. a router `Link` to the map region). */
325
+ renderPlaceLink?: RenderPlaceLink;
321
326
  /** Resolves a selected genre, artist or song to a share URL using the host app's routes. */
322
327
  getShareUrl?: GetGenreTreeShareUrl;
323
328
  } & ArtistSearchProps & GenreDetailSlots<O> & GenrePlaylistTracksSlots & GenreFocusProps & {
@@ -333,7 +338,7 @@ type GenreTreeViewProps<O extends CriteriaOverview = CriteriaOverview> = {
333
338
  collapsed?: boolean;
334
339
  onCollapsedChange?: (collapsed: boolean) => void;
335
340
  };
336
- declare function GenreTreeView<O extends CriteriaOverview = CriteriaOverview>({ scope, handleGenreCreationAction, handleGenreRenameAction, onParentChanged, getBackendBaseUrl, additionalActions, viewMode: controlledViewMode, selectedGenreUuid: controlledSelectedGenreUuid, onSelectedGenreUuidChange, defaultViewport, viewportRestore, onViewportChange, readOnly, className, showDisplayOptions, showAddRoot, allowWheelRotation: controlledAllowWheelRotation, criteriaOverviewSchema, renderGenreDetailExtras, floatingControlsLeading, sizeMetric: controlledSizeMetric, onSizeMetricChange, renderArtistLink, artistUuid: controlledArtistUuid, onArtistUuidChange, artistExpanded: controlledArtistExpanded, onArtistExpandedChange, getShareUrl, extraSearchGroups, SearchGroups, onSearchQueryChange, onSearchFocus, artistSearch, onArtistSelect, artistSearchBaseUrl, songUuid: controlledSongUuid, onSongUuidChange, songExpanded: controlledSongExpanded, onSongExpandedChange, songSearch, onSongSelect, renderSongLink, renderSummary, renderEssentialTracks, renderSongLeading, renderSongActions, renderTracksToolbar, renderDangerZone, expanded, onExpandedChange, collapsed, onCollapsedChange, overlayPanel, placement, ...focus }: GenreTreeViewProps<O>): react.JSX.Element;
341
+ declare function GenreTreeView<O extends CriteriaOverview = CriteriaOverview>({ scope, handleGenreCreationAction, handleGenreRenameAction, onParentChanged, getBackendBaseUrl, additionalActions, viewMode: controlledViewMode, selectedGenreUuid: controlledSelectedGenreUuid, onSelectedGenreUuidChange, defaultViewport, viewportRestore, onViewportChange, readOnly, className, showDisplayOptions, showAddRoot, allowWheelRotation: controlledAllowWheelRotation, criteriaOverviewSchema, renderGenreDetailExtras, floatingControlsLeading, sizeMetric: controlledSizeMetric, onSizeMetricChange, renderArtistLink, artistUuid: controlledArtistUuid, onArtistUuidChange, artistExpanded: controlledArtistExpanded, onArtistExpandedChange, getShareUrl, extraSearchGroups, SearchGroups, onSearchQueryChange, onSearchFocus, artistSearch, onArtistSelect, artistSearchBaseUrl, songUuid: controlledSongUuid, onSongUuidChange, songExpanded: controlledSongExpanded, onSongExpandedChange, songSearch, onSongSelect, renderSongLink, renderPlaceLink, renderSummary, renderEssentialTracks, renderSongLeading, renderSongActions, renderTracksToolbar, renderDangerZone, expanded, onExpandedChange, collapsed, onCollapsedChange, overlayPanel, placement, ...focus }: GenreTreeViewProps<O>): react.JSX.Element;
337
342
 
338
343
  type GenreActionBandProps = {
339
344
  node: GenreTreeNode;
@@ -389,7 +394,8 @@ type GenreInfoPanelBodyProps<O extends CriteriaOverview> = {
389
394
  declare function GenreInfoPanelBody<O extends CriteriaOverview>({ toolbar, family, genreUuid, genrePlaylist, catalogue, wikidataId, scope, getBackendBaseUrl, playback, band, extras, }: GenreInfoPanelBodyProps<O>): react.JSX.Element;
390
395
 
391
396
  type GenreDetailPanelProps<O extends CriteriaOverview> = {
392
- genreUuid: GenreUuid;
397
+ /** May be a raw URL value: one that names no genre renders "Genre not found". */
398
+ genreUuid: string;
393
399
  scope: Scope;
394
400
  getBackendBaseUrl: () => string;
395
401
  onClose: () => void;
@@ -525,11 +531,12 @@ type EntityPanelOptions = {
525
531
  getShareUrl?: GetGenreTreeShareUrl;
526
532
  renderArtistLink: RenderArtistLink;
527
533
  renderSongLink: RenderSongLink;
534
+ renderPlaceLink?: RenderPlaceLink;
528
535
  song: EntityPanelState;
529
536
  artist: EntityPanelState;
530
537
  } & SongGenreNavigation;
531
538
  /** The song or artist detail overlay panel; a song takes precedence over an artist, undefined when neither is set. */
532
- declare function useEntityPanel({ scope, getBackendBaseUrl, getArtistBackendBaseUrl, getShareUrl, renderArtistLink, renderSongLink, song, artist, ...navigation }: EntityPanelOptions): OverlayPanel | undefined;
539
+ declare function useEntityPanel({ scope, getBackendBaseUrl, getArtistBackendBaseUrl, getShareUrl, renderArtistLink, renderSongLink, renderPlaceLink, song, artist, ...navigation }: EntityPanelOptions): OverlayPanel | undefined;
533
540
 
534
541
  type EntityDetailPanelProps = {
535
542
  scope: Scope;
@@ -544,11 +551,12 @@ type EntityDetailPanelProps = {
544
551
  renderArtistLink?: RenderArtistLink;
545
552
  /** Titles render as buttons that open the song by default. */
546
553
  renderSongLink?: RenderSongLink;
554
+ renderPlaceLink?: RenderPlaceLink;
547
555
  collapsed?: boolean;
548
556
  edgeTab?: ComponentProps<typeof DetailPanel>["edgeTab"];
549
557
  } & SongGenreNavigation;
550
558
  /** The song or artist detail in the shared left DetailPanel, for a host that has no genre tree. Renders nothing
551
559
  * while neither is set; a song takes precedence over an artist. */
552
- declare function EntityDetailPanel({ scope, getBackendBaseUrl, getArtistBackendBaseUrl, getShareUrl, songUuid, onSongUuidChange, artistUuid, onArtistUuidChange, renderArtistLink, renderSongLink, collapsed, edgeTab, ...navigation }: EntityDetailPanelProps): react.JSX.Element | null;
560
+ declare function EntityDetailPanel({ scope, getBackendBaseUrl, getArtistBackendBaseUrl, getShareUrl, songUuid, onSongUuidChange, artistUuid, onArtistUuidChange, renderArtistLink, renderSongLink, renderPlaceLink, collapsed, edgeTab, ...navigation }: EntityDetailPanelProps): react.JSX.Element | null;
553
561
 
554
562
  export { type ArtistSearchProps, EntityDetailPanel, type EntityDetailPanelProps, type EntityPanelOptions, type EntityPanelState, GenreDetailPanel, type GenreDetailPanelProps, type GenreDetailSlots, type GenreFocusProps, GenreInfoPanelBody, type GenreInfoPanelBodyProps, GenreNodeActionBand, type GenrePlaylistPlayback, type GenrePlaylistTracksSlots, GenrePlaylistTreePerRoot, type GenrePlaylistTreePerRootProps, GenreSearch, type GenreSearchExtraGroup, type GenreSearchGroupsProps, type GenreSearchProps, type GenreTreeShareTarget, GenreTreeView, type GenreTreeViewProps, type GetGenreTreeShareUrl, type ParentChange, type PlayableGenrePlaylist, PlayerPanel, type PlayerPanelProps, Rating, type RatingProps, SEARCH_FAILED_STATUS, SearchBox, type SearchBoxProps, type SearchGroup, type SearchGroupItem, type SongGenreNavigation, TrackItem, type TrackItemProps, TrackListSidebar, type TrackListSidebarProps, TrackPositionPlayPause, type TrackPositionPlayPauseProps, type UseGenrePlaylistPlaybackOptions, type UseGenreRemoteSearchGroupOptions, searchStatus, useArtistSearchGroup, useEntityPanel, useGenrePlaylistPlayback, useGenreRemoteSearchGroup, useSongSearchGroup };
@@ -23,7 +23,7 @@ import {
23
23
  useGenrePlaylistPlayback,
24
24
  useGenreRemoteSearchGroup,
25
25
  useSongSearchGroup
26
- } from "../chunk-DPYUE6WD.js";
26
+ } from "../chunk-PVYUC2PN.js";
27
27
  import "../chunk-2GH7CSCE.js";
28
28
  export {
29
29
  EntityDetailPanel,