Sid Gifari File Manager
🏠 Root
/
home
/
genremedia08
/
musicjukebox.overlookedtracks.com
/
public
/
build
/
assets
/
Editing: TrendingUp-bcf21998.js.map
{"version":3,"file":"TrendingUp-bcf21998.js","sources":["../../../common/resources/client/ui/layout/dashboard-layout-context.ts","../../../common/resources/client/utils/hooks/use-block-body-overflow.ts","../../../common/resources/client/ui/layout/dashboard-layout.tsx","../../../common/resources/client/ui/layout/dashboard-content.tsx","../../../common/resources/client/ui/layout/dashboard-sidenav.tsx","../../../common/resources/client/datatable/column-templates/name-with-avatar.tsx","../../../common/resources/client/http/backend-response/pagination-response.ts","../../../common/resources/client/uploads/utils/download-file-from-url.ts","../../../node_modules/zustand/esm/middleware.mjs","../../../common/resources/client/utils/hooks/use-previous.ts","../../../common/resources/client/ui/forms/slider/base-slider.tsx","../../../common/resources/client/ui/forms/slider/use-slider.ts","../../../common/resources/client/ui/forms/slider/slider-thumb.tsx","../../../common/resources/client/ui/forms/slider/slider.tsx","../../../common/resources/client/auth/user.ts","../../../common/resources/client/icons/material/MoreVert.tsx","../../../resources/client/web-player/artists/artist-page-tabs.ts","../../../node_modules/@tanstack/react-virtual/build/lib/_virtual/_rollupPluginBabelHelpers.mjs","../../../node_modules/@tanstack/virtual-core/build/lib/_virtual/_rollupPluginBabelHelpers.mjs","../../../node_modules/@tanstack/virtual-core/build/lib/utils.mjs","../../../node_modules/@tanstack/virtual-core/build/lib/index.mjs","../../../node_modules/@tanstack/react-virtual/build/lib/index.mjs","../../../common/resources/client/ui/overlays/dialog/image-zoom-dialog.tsx","../../../common/resources/client/icons/material/Pause.tsx","../../../resources/client/web-player/tracks/track.ts","../../../resources/client/web-player/channels/channel.ts","../../../resources/client/web-player/playlists/playlist.ts","../../../common/resources/client/utils/hooks/is-touch-device.ts","../../../resources/client/web-player/search/requests/use-search-results.ts","../../../resources/client/web-player/channels/requests/use-channel.ts","../../../resources/client/web-player/genres/genre-link.tsx","../../../resources/client/web-player/playlists/playlist-link.tsx","../../../common/resources/client/icons/material/Image.tsx","../../../resources/client/web-player/playlists/crupdate-dialog/crupdate-playlist-fields.tsx","../../../resources/client/web-player/playlists/requests/use-update-playlist.ts","../../../resources/client/web-player/playlists/crupdate-dialog/update-playlist-dialog.tsx","../../../resources/client/web-player/playlists/requests/use-create-playlist.ts","../../../resources/client/web-player/playlists/crupdate-dialog/create-playlist-dialog.tsx","../../../common/resources/client/comments/requests/use-delete-comments.ts","../../../common/resources/client/icons/material/TrendingUp.tsx"],"sourcesContent":["import {createContext} from 'react';\n\nexport type DashboardSidenavStatus = 'open' | 'closed' | 'compact';\n\nexport interface DashboardContextValue {\n leftSidenavStatus: DashboardSidenavStatus;\n setLeftSidenavStatus: (status: DashboardSidenavStatus) => void;\n rightSidenavStatus: DashboardSidenavStatus;\n setRightSidenavStatus: (status: DashboardSidenavStatus) => void;\n isMobileMode: boolean | null;\n leftSidenavCanBeCompact?: boolean;\n name: string;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardContextValue>(\n null!\n);\n","import {useEffect} from 'react';\n\nexport function useBlockBodyOverflow() {\n useEffect(() => {\n document.documentElement.classList.add('no-page-overflow');\n return () => {\n document.documentElement.classList.remove('no-page-overflow');\n };\n }, []);\n}\n","import {ComponentPropsWithoutRef, useCallback, useMemo} from 'react';\nimport {\n DashboardLayoutContext,\n DashboardSidenavStatus,\n} from './dashboard-layout-context';\nimport {Underlay} from '../overlays/underlay';\nimport {AnimatePresence} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {useMediaQuery} from '../../utils/hooks/use-media-query';\nimport {\n getFromLocalStorage,\n setInLocalStorage,\n} from '../../utils/hooks/local-storage';\nimport {useBlockBodyOverflow} from '../../utils/hooks/use-block-body-overflow';\nimport clsx from 'clsx';\n\ninterface DashboardLayoutProps extends ComponentPropsWithoutRef<'div'> {\n name: string;\n leftSidenavCanBeCompact?: boolean;\n leftSidenavStatus?: DashboardSidenavStatus;\n onLeftSidenavChange?: (status: DashboardSidenavStatus) => void;\n rightSidenavStatus?: DashboardSidenavStatus;\n initialRightSidenavStatus?: DashboardSidenavStatus;\n onRightSidenavChange?: (status: DashboardSidenavStatus) => void;\n height?: string;\n}\nexport function DashboardLayout({\n children,\n leftSidenavStatus: leftSidenav,\n onLeftSidenavChange,\n rightSidenavStatus: rightSidenav,\n initialRightSidenavStatus,\n onRightSidenavChange,\n name,\n leftSidenavCanBeCompact,\n height = 'h-full',\n ...domProps\n}: DashboardLayoutProps) {\n useBlockBodyOverflow();\n const isMobile = useMediaQuery('(max-width: 1024px)');\n\n const isCompactModeInitially = useMemo(() => {\n return !name ? false : getFromLocalStorage(`${name}.sidenav.compact`);\n }, [name]);\n const defaultLeftSidenavStatus = isCompactModeInitially ? 'compact' : 'open';\n const [leftSidenavStatus, setLeftSidenavStatus] = useControlledState(\n leftSidenav,\n isMobile ? 'closed' : defaultLeftSidenavStatus,\n onLeftSidenavChange\n );\n\n const rightSidenavStatusDefault = useMemo(() => {\n if (isMobile) {\n return 'closed';\n }\n if (initialRightSidenavStatus != null) {\n return initialRightSidenavStatus;\n }\n const userSelected = getFromLocalStorage(\n `${name}.sidenav.right.position`,\n 'open'\n );\n if (userSelected != null) {\n return userSelected;\n }\n return initialRightSidenavStatus || 'closed';\n }, [isMobile, name, initialRightSidenavStatus]);\n const [rightSidenavStatus, _setRightSidenavStatus] = useControlledState(\n rightSidenav,\n rightSidenavStatusDefault,\n onRightSidenavChange\n );\n const setRightSidenavStatus = useCallback(\n (status: DashboardSidenavStatus) => {\n _setRightSidenavStatus(status);\n setInLocalStorage(`${name}.sidenav.right.position`, status);\n },\n [_setRightSidenavStatus, name]\n );\n\n const shouldShowUnderlay =\n isMobile && (leftSidenavStatus === 'open' || rightSidenavStatus === 'open');\n\n return (\n <DashboardLayoutContext.Provider\n value={{\n leftSidenavStatus,\n setLeftSidenavStatus,\n rightSidenavStatus,\n setRightSidenavStatus,\n leftSidenavCanBeCompact,\n name,\n isMobileMode: isMobile,\n }}\n >\n <div\n {...domProps}\n className={clsx(\n 'dashboard-grid test-overflow relative isolate',\n height\n )}\n >\n {children}\n <AnimatePresence>\n {shouldShowUnderlay && (\n <Underlay\n position=\"fixed\"\n key=\"dashboard-underlay\"\n onClick={() => {\n setLeftSidenavStatus('closed');\n setRightSidenavStatus('closed');\n }}\n />\n )}\n </AnimatePresence>\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import {cloneElement, ReactElement} from 'react';\nimport clsx from 'clsx';\n\ninterface DashboardContentProps {\n children: ReactElement<{className: string}>;\n}\nexport function DashboardContent({children}: DashboardContentProps) {\n return cloneElement(children, {\n className: clsx(\n children.props.className,\n 'dashboard-grid-content overflow-y-auto stable-scrollbar'\n ),\n });\n}\n","import clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {cloneElement, ReactElement, useContext} from 'react';\nimport {DashboardLayoutContext} from './dashboard-layout-context';\n\nexport interface SidenavProps {\n className?: string;\n children: ReactElement<{className: string; isCompactMode?: boolean}>;\n position?: 'left' | 'right';\n size?: 'sm' | 'md' | 'lg' | string;\n mode?: 'overlay';\n // absolute will place sidenav between navbar/footer, fixed will overlay it over nav/footer.\n overlayPosition?: 'absolute' | 'fixed';\n display?: 'flex' | 'block';\n forceClosed?: boolean;\n}\nexport function DashboardSidenav({\n className,\n position,\n children,\n size = 'md',\n mode,\n overlayPosition = 'fixed',\n display = 'flex',\n forceClosed = false,\n}: SidenavProps) {\n const {\n isMobileMode,\n leftSidenavStatus,\n setLeftSidenavStatus,\n rightSidenavStatus,\n setRightSidenavStatus,\n } = useContext(DashboardLayoutContext);\n const status = position === 'left' ? leftSidenavStatus : rightSidenavStatus;\n const isOverlayMode = isMobileMode || mode === 'overlay';\n\n const variants = {\n open: {display, width: null as any},\n compact: {\n display,\n width: null as any,\n },\n closed: {\n width: 0,\n transitionEnd: {\n display: 'none',\n },\n },\n };\n\n const sizeClassName = getSize(status === 'compact' ? 'compact' : size);\n\n return (\n <m.div\n variants={variants}\n initial={false}\n animate={forceClosed ? 'closed' : status}\n transition={{type: 'tween', duration: 0.15}}\n onClick={e => {\n // close sidenav when user clicks a link or button on mobile\n const target = e.target as HTMLElement;\n if (isMobileMode && (target.closest('button') || target.closest('a'))) {\n setLeftSidenavStatus('closed');\n setRightSidenavStatus('closed');\n }\n }}\n className={clsx(\n className,\n position === 'left'\n ? 'dashboard-grid-sidenav-left'\n : 'dashboard-grid-sidenav-right',\n 'overflow-hidden will-change-[width]',\n sizeClassName,\n isOverlayMode && `${overlayPosition} top-0 bottom-0 z-20 shadow-2xl`,\n isOverlayMode && position === 'left' && 'left-0',\n isOverlayMode && position === 'right' && 'right-0'\n )}\n >\n {cloneElement(children, {\n className: clsx(\n children.props.className,\n 'w-full h-full',\n status === 'compact' && 'compact-scrollbar'\n ),\n isCompactMode: status === 'compact',\n })}\n </m.div>\n );\n}\n\nfunction getSize(size: SidenavProps['size'] | 'compact'): string {\n switch (size) {\n case 'compact':\n return 'w-80';\n case 'sm':\n return 'w-224';\n case 'md':\n return 'w-240';\n case 'lg':\n return 'w-288';\n default:\n return size || '';\n }\n}\n","import React, {ReactNode} from 'react';\nimport {Avatar, AvatarProps} from '../../ui/images/avatar';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport clsx from 'clsx';\n\ninterface Props {\n image?: string;\n label: ReactNode;\n description?: ReactNode;\n labelClassName?: string;\n avatarSize?: AvatarProps['size'];\n}\nexport function NameWithAvatar({\n image,\n label,\n description,\n labelClassName,\n avatarSize = 'md',\n}: Props) {\n return (\n <div className=\"flex items-center gap-12\">\n {image && (\n <Avatar size={avatarSize} className=\"flex-shrink-0\" src={image} />\n )}\n <div className=\"overflow-hidden min-w-0\">\n <div\n className={clsx(labelClassName, 'overflow-hidden overflow-ellipsis')}\n >\n {label}\n </div>\n {description && (\n <div className=\"text-muted text-xs overflow-hidden overflow-ellipsis\">\n {description}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function NameWithAvatarPlaceholder({\n labelClassName,\n showDescription,\n}: Partial<Props> & {\n showDescription?: boolean;\n}) {\n return (\n <div className=\"flex items-center gap-12 w-full max-w-4/5\">\n <Skeleton size=\"w-32 h-32\" />\n <div className=\"flex-auto\">\n <div className={clsx(labelClassName, 'leading-3')}>\n <Skeleton />\n </div>\n {showDescription && (\n <div className=\"text-muted leading-3 mt-4\">{<Skeleton />}</div>\n )}\n </div>\n </div>\n );\n}\n","import {BackendResponse} from './backend-response';\n\nexport interface LengthAwarePaginationResponse<T> {\n data: T[];\n from: number;\n to: number;\n total: number;\n per_page: number;\n current_page: number;\n last_page: number;\n next_page: number;\n prev_page: number;\n}\n\ninterface SimplePaginationResponse<T> {\n data: T[];\n from: number;\n to: number;\n per_page: number;\n current_page: number;\n}\n\ninterface CursorPaginationResponse<T> {\n data: T[];\n next_cursor: string | null;\n per_page: number;\n prev_cursor: string | null;\n}\n\nexport type PaginationResponse<T> =\n | LengthAwarePaginationResponse<T>\n | SimplePaginationResponse<T>\n | CursorPaginationResponse<T>;\n\nexport const EMPTY_PAGINATION_RESPONSE = {\n pagination: {data: [], from: 0, to: 0, per_page: 15, current_page: 1},\n};\n\nexport interface PaginatedBackendResponse<T> extends BackendResponse {\n pagination: PaginationResponse<T>;\n}\n\nexport function hasNextPage(pagination: PaginationResponse<unknown>): boolean {\n if ('next_cursor' in pagination) {\n return pagination.next_cursor != null;\n }\n\n if ('last_page' in pagination) {\n return pagination.current_page < pagination.last_page;\n }\n\n return (\n pagination.data.length > 0 && pagination.data.length >= pagination.per_page\n );\n}\n","export function downloadFileFromUrl(url: string, name?: string) {\n const link = document.createElement('a');\n link.href = url;\n if (name) link.download = name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api)\n return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && enabled) {\n console.warn(\n \"[zustand devtools middleware] Please install/enable Redux devtools extension\"\n );\n }\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording)\n return r;\n const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...a) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...a);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format. \n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools)\n return;\n if (typeof api.dispatch !== \"function\")\n return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState)\n return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0)\n f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst oldImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n getStorage: () => localStorage,\n serialize: JSON.stringify,\n deserialize: JSON.parse,\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage;\n try {\n storage = options.getStorage();\n } catch (e) {\n }\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const thenableSerialize = toThenable(options.serialize);\n const setItem = () => {\n const state = options.partialize({ ...get() });\n let errorInSync;\n const thenable = thenableSerialize({ state, version: options.version }).then(\n (serializedValue) => storage.setItem(options.name, serializedValue)\n ).catch((e) => {\n errorInSync = e;\n });\n if (errorInSync) {\n throw errorInSync;\n }\n return thenable;\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n let stateFromStorage;\n const hydrate = () => {\n var _a;\n if (!storage)\n return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => cb(get()));\n const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {\n if (storageValue) {\n return options.deserialize(storageValue);\n }\n }).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return deserializedStorageValue.state;\n }\n }\n }).then((migratedState) => {\n var _a2;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n return setItem();\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.getStorage) {\n storage = newOptions.getStorage();\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n hydrate();\n return stateFromStorage || configResult;\n};\nconst newImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n let stateFromStorage;\n const hydrate = () => {\n var _a;\n if (!storage)\n return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => cb(get()));\n const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return deserializedStorageValue.state;\n }\n }\n }).then((migratedState) => {\n var _a2;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n return setItem();\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n hydrate();\n return stateFromStorage || configResult;\n};\nconst persistImpl = (config, baseOptions) => {\n if (\"getStorage\" in baseOptions || \"serialize\" in baseOptions || \"deserialize\" in baseOptions) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.\"\n );\n }\n return oldImpl(config, baseOptions);\n }\n return newImpl(config, baseOptions);\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","import {useEffect, useRef} from 'react';\n\nexport function usePrevious(value: any) {\n const ref = useRef();\n // Store current value in ref\n useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {UseSliderProps, UseSliderReturn} from './use-slider';\n\nexport interface BaseSliderProps extends UseSliderProps {\n slider: UseSliderReturn;\n children: ReactNode;\n}\n\nexport function BaseSlider(props: BaseSliderProps) {\n const {\n size = 'md',\n inline,\n label,\n showValueLabel = !!label,\n className,\n width = 'w-full',\n slider,\n children,\n trackColor = 'primary',\n fillColor = 'primary',\n } = props;\n\n const {\n domProps,\n trackRef,\n getThumbPercent,\n getThumbValueLabel,\n labelId,\n groupId,\n thumbIds,\n isDisabled,\n numberFormatter,\n minValue,\n maxValue,\n step,\n values,\n getValueLabel,\n } = slider;\n\n let outputValue = '';\n let maxLabelLength = Math.max(\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length,\n [...numberFormatter.format(step)].length\n );\n\n if (getValueLabel) {\n outputValue = getValueLabel(values[0]);\n } else if (values.length === 1) {\n outputValue = getThumbValueLabel(0);\n } else if (values.length === 2) {\n // This should really use the NumberFormat#formatRange proposal...\n // https://github.com/tc39/ecma402/issues/393\n // https://github.com/tc39/proposal-intl-numberformat-v3#formatrange-ecma-402-393\n outputValue = `${getThumbValueLabel(0)} – ${getThumbValueLabel(1)}`;\n maxLabelLength =\n 3 +\n 2 *\n Math.max(\n maxLabelLength,\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length\n );\n }\n const style = getInputFieldClassNames({\n size,\n disabled: isDisabled,\n labelDisplay: 'flex',\n });\n\n const wrapperClassname = clsx('touch-none', className, width, {\n 'flex items-center': inline,\n });\n\n return (\n <div className={wrapperClassname} role=\"group\" id={groupId}>\n {(label || showValueLabel) && (\n <div className={clsx(style.label, 'select-none')}>\n {label && (\n <label\n onClick={() => {\n // Safari does not focus <input type=\"range\"> elements when clicking on an associated <label>,\n // so do it manually. In addition, make sure we show the focus ring.\n document.getElementById(thumbIds[0])?.focus();\n }}\n id={labelId}\n htmlFor={groupId}\n >\n {label}\n </label>\n )}\n {showValueLabel && (\n <output\n htmlFor={thumbIds[0]}\n className=\"ml-auto text-right\"\n aria-live=\"off\"\n style={\n !maxLabelLength\n ? undefined\n : {\n width: `${maxLabelLength}ch`,\n minWidth: `${maxLabelLength}ch`,\n }\n }\n >\n {outputValue}\n </output>\n )}\n </div>\n )}\n <div\n ref={trackRef}\n className=\"h-30 relative\"\n {...domProps}\n role=\"presentation\"\n >\n <div\n className={`absolute inset-0 m-auto h-4 rounded ${getTrackColor(\n trackColor,\n isDisabled\n )}`}\n />\n <div\n className={`absolute inset-0 my-auto h-4 rounded ${getFillColor(\n fillColor,\n isDisabled\n )}`}\n style={{width: `${getThumbPercent(0) * 100}%`}}\n />\n {children}\n </div>\n </div>\n );\n}\n\nfunction getTrackColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled/60';\n case 'primary':\n return 'bg-primary-light';\n case 'neutral':\n return 'bg-divider';\n default:\n return color;\n }\n}\n\nfunction getFillColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled';\n case 'primary':\n return 'bg-primary';\n default:\n return color;\n }\n}\n","import {\n mergeProps,\n snapValueToStep,\n useGlobalListeners,\n} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport React, {\n HTMLAttributes,\n ReactNode,\n RefObject,\n useId,\n useRef,\n useState,\n} from 'react';\nimport {clamp} from '@common/utils/number/clamp';\nimport {usePointerEvents} from '../../interactions/use-pointer-events';\nimport {useNumberFormatter} from '@common/i18n/use-number-formatter';\nimport type {NumberFormatOptions} from '@internationalized/number';\nimport {InputSize} from '../input-field/input-size';\n\nexport interface UseSliderProps<T = number[]> {\n formatOptions?: NumberFormatOptions;\n onPointerDown?: () => void;\n onChange?: (value: T) => void;\n onChangeEnd?: (value: T) => void;\n value?: T;\n defaultValue?: T;\n getValueLabel?: (value: number) => string;\n minValue?: number;\n maxValue?: number;\n step?: number;\n isDisabled?: boolean;\n size?: InputSize;\n label?: ReactNode;\n inline?: boolean;\n className?: string;\n width?: string;\n showValueLabel?: boolean;\n fillColor?: 'primary' | string;\n trackColor?: 'primary' | 'neutral' | string;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n}\n\nexport interface UseSliderReturn {\n domProps: HTMLAttributes<HTMLElement>;\n trackRef: RefObject<HTMLDivElement>;\n isPointerOver: boolean;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n step: number;\n isDisabled: boolean;\n values: number[];\n minValue: number;\n maxValue: number;\n focusedThumb: number | undefined;\n labelId: string | undefined;\n groupId: string;\n thumbIds: string[];\n numberFormatter: Intl.NumberFormat;\n getThumbPercent: (index: number) => number;\n getThumbMinValue: (index: number) => number;\n getThumbMaxValue: (index: number) => number;\n getThumbValueLabel: (index: number) => string;\n setThumbValue: (index: number, value: number) => void;\n updateDraggedThumbs: (index: number, dragging: boolean) => void;\n isThumbDragging: (index: number) => boolean;\n setThumbEditable: (index: number, editable: boolean) => void;\n setFocusedThumb: (index: number | undefined) => void;\n getValueLabel?: (value: number) => string;\n}\n\nexport function useSlider({\n minValue = 0,\n maxValue = 100,\n isDisabled = false,\n step = 1,\n formatOptions,\n onChangeEnd,\n onPointerDown,\n label,\n getValueLabel,\n showThumbOnHoverOnly,\n thumbSize,\n ...props\n}: UseSliderProps): UseSliderReturn {\n const [isPointerOver, setIsPointerOver] = useState(false);\n const numberFormatter = useNumberFormatter(formatOptions);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n const trackRef = useRef<HTMLDivElement>(null);\n\n // values will be stored in internal state as an array for both slider and range slider\n const [values, setValues] = useControlledState<number[]>(\n props.value ? props.value : undefined,\n props.defaultValue ?? ([minValue] as any),\n props.onChange as any\n );\n // need to also store values in ref, because state value would\n // lag behind by one between pointer down and move callbacks\n const valuesRef = useRef<number[] | null>(null);\n valuesRef.current = values;\n\n // indices of thumbs that are being dragged currently (state and ref for same reasons as above)\n const [draggedThumbs, setDraggedThumbs] = useState<boolean[]>(\n new Array(values.length).fill(false)\n );\n const draggedThumbsRef = useRef<boolean[] | null>(null);\n draggedThumbsRef.current = draggedThumbs;\n\n // formatted value for <output> and thumb aria labels\n function getFormattedValue(value: number) {\n return numberFormatter.format(value);\n }\n\n const isThumbDragging = (index: number) => {\n return draggedThumbsRef.current?.[index] || false;\n };\n\n const getThumbValueLabel = (index: number) =>\n getFormattedValue(values[index]);\n\n const getThumbMinValue = (index: number) =>\n index === 0 ? minValue : values[index - 1];\n const getThumbMaxValue = (index: number) =>\n index === values.length - 1 ? maxValue : values[index + 1];\n\n const setThumbValue = (index: number, value: number) => {\n if (isDisabled || !isThumbEditable(index) || !valuesRef.current) {\n return;\n }\n const thisMin = getThumbMinValue(index);\n const thisMax = getThumbMaxValue(index);\n\n // Round value to multiple of step, clamp value between min and max\n value = snapValueToStep(value, thisMin, thisMax, step);\n valuesRef.current = replaceIndex(valuesRef.current, index, value);\n setValues(valuesRef.current);\n };\n\n // update \"dragging\" status of specified thumb\n const updateDraggedThumbs = (index: number, dragging: boolean) => {\n if (isDisabled || !isThumbEditable(index)) {\n return;\n }\n\n const wasDragging = draggedThumbsRef.current?.[index];\n draggedThumbsRef.current = replaceIndex(\n draggedThumbsRef.current || [],\n index,\n dragging\n );\n setDraggedThumbs(draggedThumbsRef.current);\n\n // Call onChangeEnd if no handles are dragging.\n if (onChangeEnd && wasDragging && !draggedThumbsRef.current.some(Boolean)) {\n onChangeEnd(valuesRef.current || []);\n }\n };\n\n const [focusedThumb, setFocusedThumb] = useState<number | undefined>(\n undefined\n );\n\n const getValuePercent = (value: number) => {\n const x = Math.min(1, (value - minValue) / (maxValue - minValue));\n if (isNaN(x)) {\n return 0;\n }\n return x;\n };\n\n const getThumbPercent = (index: number) =>\n getValuePercent(valuesRef.current![index]);\n\n const setThumbPercent = (index: number, percent: number) => {\n setThumbValue(index, getPercentValue(percent));\n };\n\n const getRoundedValue = (value: number) =>\n Math.round((value - minValue) / step) * step + minValue;\n\n const getPercentValue = (percent: number) => {\n const val = percent * (maxValue - minValue) + minValue;\n return clamp(getRoundedValue(val), minValue, maxValue);\n };\n\n // allows disabling individual thumbs in range slider, instead of disable the whole slider\n const editableThumbsRef = useRef<boolean[]>(\n new Array(values.length).fill(true)\n );\n const isThumbEditable = (index: number) => editableThumbsRef.current[index];\n const setThumbEditable = (index: number, editable: boolean) => {\n editableThumbsRef.current[index] = editable;\n };\n\n // When the user clicks or drags the track, we want the motion to set and drag the\n // closest thumb. Hence, we also need to install useMove() on the track element.\n // Here, we keep track of which index is the \"closest\" to the drag start point.\n // It is set onMouseDown/onTouchDown; see trackProps below.\n const realTimeTrackDraggingIndex = useRef<number | null>(null);\n\n const currentPointer = useRef<number | null | undefined>(undefined);\n const handlePointerDown = (e: React.PointerEvent) => {\n if (\n e.pointerType === 'mouse' &&\n (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey)\n ) {\n return;\n }\n\n onPointerDown?.();\n\n // We only trigger track-dragging if the user clicks on the track itself and nothing is currently being dragged.\n if (\n trackRef.current &&\n !isDisabled &&\n values.every((_, i) => !draggedThumbs[i])\n ) {\n const size = trackRef.current.offsetWidth;\n // Find the closest thumb\n const trackPosition = trackRef.current.getBoundingClientRect().left;\n const offset = e.clientX - trackPosition;\n const percent = offset / size;\n const value = getPercentValue(percent);\n\n // to find the closet thumb we split the array based on the first thumb position to the \"right/end\" of the click.\n let closestThumb;\n const split = values.findIndex(v => value - v < 0);\n if (split === 0) {\n // If the index is zero then the closest thumb is the first one\n closestThumb = split;\n } else if (split === -1) {\n // If no index is found they've clicked past all the thumbs\n closestThumb = values.length - 1;\n } else {\n const lastLeft = values[split - 1];\n const firstRight = values[split];\n // Pick the last left/start thumb, unless they are stacked on top of each other, then pick the right/end one\n if (Math.abs(lastLeft - value) < Math.abs(firstRight - value)) {\n closestThumb = split - 1;\n } else {\n closestThumb = split;\n }\n }\n\n // Confirm that the found closest thumb is editable, not disabled, and move it\n if (closestThumb >= 0 && isThumbEditable(closestThumb)) {\n // Don't un-focus anything\n e.preventDefault();\n\n realTimeTrackDraggingIndex.current = closestThumb;\n setFocusedThumb(closestThumb);\n currentPointer.current = e.pointerId;\n\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, true);\n setThumbValue(closestThumb, value);\n\n addGlobalListener(window, 'pointerup', onUpTrack, false);\n } else {\n realTimeTrackDraggingIndex.current = null;\n }\n }\n };\n\n const currentPosition = useRef<number | null>(null);\n const {domProps: moveDomProps} = usePointerEvents({\n onPointerDown: handlePointerDown,\n onMoveStart() {\n currentPosition.current = null;\n },\n onMove(e, deltaX) {\n const size = trackRef.current?.offsetWidth || 0;\n\n if (currentPosition.current == null) {\n currentPosition.current =\n getThumbPercent(realTimeTrackDraggingIndex.current || 0) * size;\n }\n\n currentPosition.current += deltaX;\n\n if (realTimeTrackDraggingIndex.current != null && trackRef.current) {\n const percent = clamp(currentPosition.current / size, 0, 1);\n setThumbPercent(realTimeTrackDraggingIndex.current, percent);\n }\n },\n onMoveEnd() {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n },\n });\n\n const domProps = mergeProps(moveDomProps, {\n onPointerEnter: () => {\n setIsPointerOver(true);\n },\n onPointerLeave: () => {\n setIsPointerOver(false);\n },\n });\n\n const onUpTrack = (e: PointerEvent) => {\n const id = e.pointerId;\n if (id === currentPointer.current) {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n\n removeGlobalListener(window, 'pointerup', onUpTrack, false);\n }\n };\n\n const id = useId();\n const labelId = label ? `${id}-label` : undefined;\n const groupId = `${id}-group`;\n const thumbIds = [...Array(values.length)].map((v, i) => {\n return `${id}-thumb-${i}`;\n });\n\n return {\n domProps,\n trackRef,\n isDisabled,\n step,\n values,\n minValue,\n maxValue,\n focusedThumb,\n labelId,\n groupId,\n thumbIds,\n numberFormatter,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n isThumbDragging,\n setThumbValue,\n updateDraggedThumbs,\n setThumbEditable,\n setFocusedThumb,\n getValueLabel,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize,\n };\n}\n\nfunction replaceIndex<T>(array: T[], index: number, value: T) {\n if (array[index] === value) {\n return array;\n }\n\n return [...array.slice(0, index), value, ...array.slice(index + 1)];\n}\n","import React, {Ref, useCallback, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {UseSliderReturn} from './use-slider';\nimport {useGlobalListeners, useObjectRef} from '@react-aria/utils';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {BaseSliderProps} from '@common/ui/forms/slider/base-slider';\n\ninterface SliderThumb {\n index: number;\n slider: UseSliderReturn;\n isDisabled?: boolean;\n ariaLabel?: string;\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nexport function SliderThumb({\n index,\n slider,\n isDisabled: isThumbDisabled,\n ariaLabel,\n inputRef,\n onBlur,\n fillColor = 'primary',\n}: SliderThumb) {\n const inputObjRef = useObjectRef(inputRef);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const {\n step,\n values,\n focusedThumb,\n labelId,\n thumbIds,\n isDisabled: isSliderDisabled,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n setThumbValue,\n updateDraggedThumbs,\n isThumbDragging,\n setThumbEditable,\n setFocusedThumb,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize = 'w-18 h-18',\n } = slider;\n\n const isDragging = isThumbDragging(index);\n const value = values[index];\n\n // Immediately register editability with the state\n setThumbEditable(index, !isThumbDisabled);\n const isDisabled = isThumbDisabled || isSliderDisabled;\n\n const focusInput = useCallback(() => {\n if (inputObjRef.current) {\n inputObjRef.current.focus({preventScroll: true});\n }\n }, [inputObjRef]);\n\n // we will focus the native range input when slider is clicked or thumb is\n // focused in some other way, and let browser handle keyboard interactions\n const isFocused = focusedThumb === index;\n useEffect(() => {\n if (isFocused) {\n focusInput();\n }\n }, [isFocused, focusInput]);\n\n const currentPointer = useRef<number | undefined>(undefined);\n const handlePointerUp = (e: PointerEvent) => {\n if (e.pointerId === currentPointer.current) {\n focusInput();\n updateDraggedThumbs(index, false);\n removeGlobalListener(window, 'pointerup', handlePointerUp, false);\n }\n };\n\n const className = clsx(\n 'outline-none rounded-full top-1/2 -translate-y-1/2 -translate-x-1/2 absolute inset-0 transition-button duration-200',\n thumbSize,\n !isDisabled && 'shadow-md',\n thumbColor({fillColor, isDisabled, isDragging: isDragging}),\n // show thumb on hover and while dragging, otherwise \"blur\" event will fire on thumb and dragging will stop\n (showThumbOnHoverOnly && isDragging) || isPointerOver\n ? 'visible'\n : 'invisible'\n );\n\n return (\n <div\n role=\"presentation\"\n className={className}\n style={{\n left: `${Math.max(getThumbPercent(index) * 100, 0)}%`,\n }}\n onPointerDown={e => {\n if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) {\n return;\n }\n focusInput();\n currentPointer.current = e.pointerId;\n updateDraggedThumbs(index, true);\n\n addGlobalListener(window, 'pointerup', handlePointerUp, false);\n }}\n >\n <input\n id={thumbIds[index]}\n onKeyDown={createEventHandler(() => {\n updateDraggedThumbs(index, true);\n })}\n onKeyUp={createEventHandler(() => {\n // make sure \"onChangeEnd\" is fired on keyboard navigation\n updateDraggedThumbs(index, false);\n })}\n ref={inputObjRef}\n tabIndex={!isDisabled ? 0 : undefined}\n min={getThumbMinValue(index)}\n max={getThumbMaxValue(index)}\n step={step}\n value={value}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-labelledby={labelId}\n aria-orientation=\"horizontal\"\n aria-valuetext={getThumbValueLabel(index)}\n onFocus={() => {\n setFocusedThumb(index);\n }}\n onBlur={e => {\n setFocusedThumb(undefined);\n updateDraggedThumbs(index, false);\n onBlur?.(e);\n }}\n onChange={e => {\n setThumbValue(index, parseFloat(e.target.value));\n }}\n type=\"range\"\n className=\"sr-only\"\n />\n </div>\n );\n}\n\ninterface SliderThumbColorProps {\n isDisabled?: boolean;\n isDragging: boolean;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nfunction thumbColor({\n isDisabled,\n isDragging,\n fillColor,\n}: SliderThumbColorProps): string {\n if (isDisabled) {\n return 'bg-slider-disabled cursor-default';\n }\n\n if (fillColor && fillColor !== 'primary') {\n return fillColor;\n }\n\n return clsx(\n 'hover:bg-primary-dark',\n isDragging ? 'bg-primary-dark' : 'bg-primary'\n );\n}\n","import {BaseSlider} from './base-slider';\nimport {useSlider, UseSliderProps} from './use-slider';\nimport React, {Ref} from 'react';\nimport {SliderThumb} from './slider-thumb';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\n\ninterface SliderProps extends UseSliderProps<number> {\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n}\nexport function Slider({inputRef, onBlur, ...props}: SliderProps) {\n const {onChange, onChangeEnd, value, defaultValue, ...otherProps} = props;\n\n const baseProps: UseSliderProps = {\n ...otherProps,\n // Normalize `value: number[]` to `value: number`\n value: value != null ? [value] : undefined,\n defaultValue: defaultValue != null ? [defaultValue] : undefined,\n onChange: (v: number[]): void => {\n onChange?.(v[0]);\n },\n onChangeEnd: (v: number[]): void => {\n onChangeEnd?.(v[0]);\n },\n };\n\n const slider = useSlider(baseProps);\n\n return (\n <BaseSlider {...baseProps} slider={slider}>\n <SliderThumb\n fillColor={props.fillColor}\n index={0}\n slider={slider}\n inputRef={inputRef}\n onBlur={onBlur}\n />\n </BaseSlider>\n );\n}\n\nexport interface FormSliderProps extends SliderProps {\n name: string;\n}\n\nexport function FormSlider({name, ...props}: FormSliderProps) {\n const {\n field: {onChange, onBlur, value = '', ref},\n } = useController({\n name,\n });\n\n const formProps: SliderProps = {\n onChange,\n onBlur,\n value: value || '', // avoid issues with \"null\" value when setting form defaults from backend model\n };\n\n return <Slider inputRef={ref} {...mergeProps(formProps, props)} />;\n}\n","import {Permission} from './permission';\nimport {Subscription} from '../billing/subscription';\nimport {Role} from './role';\nimport {SocialProfile} from './social-profile';\nimport {AccessToken} from './access-token';\n\nexport const USER_MODEL = 'user';\n\nexport interface User {\n id: number;\n display_name: string;\n username?: string;\n first_name?: string;\n last_name?: string;\n avatar?: string;\n email_verified_at: string;\n permissions?: Permission[];\n email: string;\n password: string;\n language: string;\n timezone: string;\n country: string;\n created_at: string;\n updated_at: string;\n subscriptions?: Omit<Subscription, 'user'>[];\n roles: Role[];\n social_profiles: SocialProfile[];\n tokens?: AccessToken[];\n has_password: boolean;\n available_space: number | null;\n unread_notifications_count?: number;\n card_last_four?: number;\n card_brand?: string;\n card_expires?: string;\n model_type: typeof USER_MODEL;\n banned_at?: string;\n followed_users?: this[];\n followers_count?: number;\n followed_users_count?: number;\n followers?: this[];\n bans?: {\n id: number;\n comment: string;\n expired_at?: string;\n }[];\n two_factor_confirmed_at?: string;\n two_factor_recovery_codes?: string[];\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreVertIcon = createSvgIcon(\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n, 'MoreVertOutlined');\n","export const artistPageTabs = {\n discography: 1,\n similar: 2,\n about: 3,\n tracks: 4,\n albums: 5,\n followers: 6,\n} as const;\n","/**\n * react-virtual\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.mjs.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.mjs.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction memo(getDeps, fn, opts) {\n var _opts$initialDeps;\n var deps = (_opts$initialDeps = opts.initialDeps) != null ? _opts$initialDeps : [];\n var result;\n return function () {\n var depTime;\n if (opts.key && opts.debug != null && opts.debug()) depTime = Date.now();\n var newDeps = getDeps();\n var depsChanged = newDeps.length !== deps.length || newDeps.some(function (dep, index) {\n return deps[index] !== dep;\n });\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n var resultTime;\n if (opts.key && opts.debug != null && opts.debug()) resultTime = Date.now();\n result = fn.apply(void 0, newDeps);\n if (opts.key && opts.debug != null && opts.debug()) {\n var depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n var resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n var resultFpsPercentage = resultEndTime / 16;\n var pad = function pad(str, num) {\n str = String(str);\n while (str.length < num) {\n str = ' ' + str;\n }\n return str;\n };\n console.info(\"%c\\u23F1 \" + pad(resultEndTime, 5) + \" /\" + pad(depEndTime, 5) + \" ms\", \"\\n font-size: .6rem;\\n font-weight: bold;\\n color: hsl(\" + Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120)) + \"deg 100% 31%);\", opts == null ? void 0 : opts.key);\n }\n opts == null ? void 0 : opts.onChange == null ? void 0 : opts.onChange(result);\n return result;\n };\n}\nfunction notUndefined(value, msg) {\n if (value === undefined) {\n throw new Error(\"Unexpected undefined\" + (msg ? \": \" + msg : ''));\n } else {\n return value;\n }\n}\nvar approxEqual = function approxEqual(a, b) {\n return Math.abs(a - b) < 1;\n};\n\nexport { approxEqual, memo, notUndefined };\n//# sourceMappingURL=utils.mjs.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.mjs';\nimport { memo, notUndefined, approxEqual } from './utils.mjs';\nexport { approxEqual, memo, notUndefined } from './utils.mjs';\n\n//\n\n//\n\nvar defaultKeyExtractor = function defaultKeyExtractor(index) {\n return index;\n};\nvar defaultRangeExtractor = function defaultRangeExtractor(range) {\n var start = Math.max(range.startIndex - range.overscan, 0);\n var end = Math.min(range.endIndex + range.overscan, range.count - 1);\n var arr = [];\n for (var _i = start; _i <= end; _i++) {\n arr.push(_i);\n }\n return arr;\n};\nvar observeElementRect = function observeElementRect(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler(rect) {\n var width = rect.width,\n height = rect.height;\n cb({\n width: Math.round(width),\n height: Math.round(height)\n });\n };\n handler(element.getBoundingClientRect());\n var observer = new ResizeObserver(function (entries) {\n var entry = entries[0];\n if (entry != null && entry.borderBoxSize) {\n var box = entry.borderBoxSize[0];\n if (box) {\n handler({\n width: box.inlineSize,\n height: box.blockSize\n });\n return;\n }\n }\n handler(element.getBoundingClientRect());\n });\n observer.observe(element, {\n box: 'border-box'\n });\n return function () {\n observer.unobserve(element);\n };\n};\nvar observeWindowRect = function observeWindowRect(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb({\n width: element.innerWidth,\n height: element.innerHeight\n });\n };\n handler();\n element.addEventListener('resize', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('resize', handler);\n };\n};\nvar observeElementOffset = function observeElementOffset(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb(element[instance.options.horizontal ? 'scrollLeft' : 'scrollTop']);\n };\n handler();\n element.addEventListener('scroll', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('scroll', handler);\n };\n};\nvar observeWindowOffset = function observeWindowOffset(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb(element[instance.options.horizontal ? 'scrollX' : 'scrollY']);\n };\n handler();\n element.addEventListener('scroll', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('scroll', handler);\n };\n};\nvar measureElement = function measureElement(element, entry, instance) {\n if (entry != null && entry.borderBoxSize) {\n var box = entry.borderBoxSize[0];\n if (box) {\n var size = Math.round(box[instance.options.horizontal ? 'inlineSize' : 'blockSize']);\n return size;\n }\n }\n return Math.round(element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height']);\n};\nvar windowScroll = function windowScroll(offset, _ref, instance) {\n var _instance$scrollEleme, _instance$scrollEleme2;\n var _ref$adjustments = _ref.adjustments,\n adjustments = _ref$adjustments === void 0 ? 0 : _ref$adjustments,\n behavior = _ref.behavior;\n var toOffset = offset + adjustments;\n (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo((_instance$scrollEleme2 = {}, _instance$scrollEleme2[instance.options.horizontal ? 'left' : 'top'] = toOffset, _instance$scrollEleme2.behavior = behavior, _instance$scrollEleme2));\n};\nvar elementScroll = function elementScroll(offset, _ref2, instance) {\n var _instance$scrollEleme3, _instance$scrollEleme4;\n var _ref2$adjustments = _ref2.adjustments,\n adjustments = _ref2$adjustments === void 0 ? 0 : _ref2$adjustments,\n behavior = _ref2.behavior;\n var toOffset = offset + adjustments;\n (_instance$scrollEleme3 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme3.scrollTo == null ? void 0 : _instance$scrollEleme3.scrollTo((_instance$scrollEleme4 = {}, _instance$scrollEleme4[instance.options.horizontal ? 'left' : 'top'] = toOffset, _instance$scrollEleme4.behavior = behavior, _instance$scrollEleme4));\n};\nvar Virtualizer = function Virtualizer(_opts) {\n var _this = this;\n this.unsubs = [];\n this.scrollElement = null;\n this.isScrolling = false;\n this.isScrollingTimeoutId = null;\n this.scrollToIndexTimeoutId = null;\n this.measurementsCache = [];\n this.itemSizeCache = new Map();\n this.pendingMeasuredCacheIndexes = [];\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this.measureElementCache = new Map();\n this.observer = function () {\n var _ro = null;\n var get = function get() {\n if (_ro) {\n return _ro;\n } else if (typeof ResizeObserver !== 'undefined') {\n return _ro = new ResizeObserver(function (entries) {\n entries.forEach(function (entry) {\n _this._measureElement(entry.target, entry);\n });\n });\n } else {\n return null;\n }\n };\n return {\n disconnect: function disconnect() {\n var _get;\n return (_get = get()) == null ? void 0 : _get.disconnect();\n },\n observe: function observe(target) {\n var _get2;\n return (_get2 = get()) == null ? void 0 : _get2.observe(target, {\n box: 'border-box'\n });\n },\n unobserve: function unobserve(target) {\n var _get3;\n return (_get3 = get()) == null ? void 0 : _get3.unobserve(target);\n }\n };\n }();\n this.range = {\n startIndex: 0,\n endIndex: 0\n };\n this.setOptions = function (opts) {\n Object.entries(opts).forEach(function (_ref3) {\n var key = _ref3[0],\n value = _ref3[1];\n if (typeof value === 'undefined') delete opts[key];\n });\n _this.options = _extends({\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: function onChange() {},\n measureElement: measureElement,\n initialRect: {\n width: 0,\n height: 0\n },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n lanes: 1\n }, opts);\n };\n this.notify = function () {\n _this.options.onChange == null ? void 0 : _this.options.onChange(_this);\n };\n this.cleanup = function () {\n _this.unsubs.filter(Boolean).forEach(function (d) {\n return d();\n });\n _this.unsubs = [];\n _this.scrollElement = null;\n };\n this._didMount = function () {\n _this.measureElementCache.forEach(_this.observer.observe);\n return function () {\n _this.observer.disconnect();\n _this.cleanup();\n };\n };\n this._willUpdate = function () {\n var scrollElement = _this.options.getScrollElement();\n if (_this.scrollElement !== scrollElement) {\n _this.cleanup();\n _this.scrollElement = scrollElement;\n _this._scrollToOffset(_this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined\n });\n _this.unsubs.push(_this.options.observeElementRect(_this, function (rect) {\n var prev = _this.scrollRect;\n _this.scrollRect = rect;\n if (_this.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {\n _this.maybeNotify();\n }\n }));\n _this.unsubs.push(_this.options.observeElementOffset(_this, function (offset) {\n _this.scrollAdjustments = 0;\n if (_this.scrollOffset === offset) {\n return;\n }\n if (_this.isScrollingTimeoutId !== null) {\n clearTimeout(_this.isScrollingTimeoutId);\n _this.isScrollingTimeoutId = null;\n }\n _this.isScrolling = true;\n _this.scrollDirection = _this.scrollOffset < offset ? 'forward' : 'backward';\n _this.scrollOffset = offset;\n _this.maybeNotify();\n _this.isScrollingTimeoutId = setTimeout(function () {\n _this.isScrollingTimeoutId = null;\n _this.isScrolling = false;\n _this.scrollDirection = null;\n _this.maybeNotify();\n }, _this.options.scrollingDelay);\n }));\n }\n };\n this.getSize = function () {\n return _this.scrollRect[_this.options.horizontal ? 'width' : 'height'];\n };\n this.memoOptions = memo(function () {\n return [_this.options.count, _this.options.paddingStart, _this.options.scrollMargin, _this.options.getItemKey];\n }, function (count, paddingStart, scrollMargin, getItemKey) {\n _this.pendingMeasuredCacheIndexes = [];\n return {\n count: count,\n paddingStart: paddingStart,\n scrollMargin: scrollMargin,\n getItemKey: getItemKey\n };\n }, {\n key: false\n });\n this.getFurthestMeasurement = function (measurements, index) {\n var furthestMeasurementsFound = new Map();\n var furthestMeasurements = new Map();\n for (var m = index - 1; m >= 0; m--) {\n var measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n var previousFurthestMeasurement = furthestMeasurements.get(measurement.lane);\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === _this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === _this.options.lanes ? Array.from(furthestMeasurements.values()).sort(function (a, b) {\n return a.end - b.end;\n })[0] : undefined;\n };\n this.getMeasurements = memo(function () {\n return [_this.memoOptions(), _this.itemSizeCache];\n }, function (_ref4, itemSizeCache) {\n var count = _ref4.count,\n paddingStart = _ref4.paddingStart,\n scrollMargin = _ref4.scrollMargin,\n getItemKey = _ref4.getItemKey;\n var min = _this.pendingMeasuredCacheIndexes.length > 0 ? Math.min.apply(Math, _this.pendingMeasuredCacheIndexes) : 0;\n _this.pendingMeasuredCacheIndexes = [];\n var measurements = _this.measurementsCache.slice(0, min);\n for (var _i2 = min; _i2 < count; _i2++) {\n var key = getItemKey(_i2);\n var furthestMeasurement = _this.options.lanes === 1 ? measurements[_i2 - 1] : _this.getFurthestMeasurement(measurements, _i2);\n var start = furthestMeasurement ? furthestMeasurement.end : paddingStart + scrollMargin;\n var measuredSize = itemSizeCache.get(key);\n var size = typeof measuredSize === 'number' ? measuredSize : _this.options.estimateSize(_i2);\n var end = start + size;\n var lane = furthestMeasurement ? furthestMeasurement.lane : _i2 % _this.options.lanes;\n measurements[_i2] = {\n index: _i2,\n start: start,\n size: size,\n end: end,\n key: key,\n lane: lane\n };\n }\n _this.measurementsCache = measurements;\n return measurements;\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.calculateRange = memo(function () {\n return [_this.getMeasurements(), _this.getSize(), _this.scrollOffset];\n }, function (measurements, outerSize, scrollOffset) {\n return _this.range = calculateRange({\n measurements: measurements,\n outerSize: outerSize,\n scrollOffset: scrollOffset\n });\n }, {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.maybeNotify = memo(function () {\n var range = _this.calculateRange();\n return [range.startIndex, range.endIndex, _this.isScrolling];\n }, function () {\n _this.notify();\n }, {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: function debug() {\n return _this.options.debug;\n },\n initialDeps: [this.range.startIndex, this.range.endIndex, this.isScrolling]\n });\n this.getIndexes = memo(function () {\n return [_this.options.rangeExtractor, _this.calculateRange(), _this.options.overscan, _this.options.count];\n }, function (rangeExtractor, range, overscan, count) {\n return rangeExtractor(_extends({}, range, {\n overscan: overscan,\n count: count\n }));\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.indexFromElement = function (node) {\n var attributeName = _this.options.indexAttribute;\n var indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\"Missing attribute name '\" + attributeName + \"={index}' on measured element.\");\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this._measureElement = function (node, entry) {\n var _this$itemSizeCache$g;\n var index = _this.indexFromElement(node);\n var item = _this.measurementsCache[index];\n if (!item) {\n return;\n }\n var prevNode = _this.measureElementCache.get(item.key);\n if (!node.isConnected) {\n _this.observer.unobserve(node);\n if (node === prevNode) {\n _this.measureElementCache[\"delete\"](item.key);\n }\n return;\n }\n if (prevNode !== node) {\n if (prevNode) {\n _this.observer.unobserve(prevNode);\n }\n _this.observer.observe(node);\n _this.measureElementCache.set(item.key, node);\n }\n var measuredItemSize = _this.options.measureElement(node, entry, _this);\n var itemSize = (_this$itemSizeCache$g = _this.itemSizeCache.get(item.key)) != null ? _this$itemSizeCache$g : item.size;\n var delta = measuredItemSize - itemSize;\n if (delta !== 0) {\n if (item.start < _this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && _this.options.debug) {\n console.info('correction', delta);\n }\n _this._scrollToOffset(_this.scrollOffset, {\n adjustments: _this.scrollAdjustments += delta,\n behavior: undefined\n });\n }\n _this.pendingMeasuredCacheIndexes.push(index);\n _this.itemSizeCache = new Map(_this.itemSizeCache.set(item.key, measuredItemSize));\n _this.notify();\n }\n };\n this.measureElement = function (node) {\n if (!node) {\n return;\n }\n _this._measureElement(node, undefined);\n };\n this.getVirtualItems = memo(function () {\n return [_this.getIndexes(), _this.getMeasurements()];\n }, function (indexes, measurements) {\n var virtualItems = [];\n for (var k = 0, len = indexes.length; k < len; k++) {\n var _i3 = indexes[k];\n var measurement = measurements[_i3];\n virtualItems.push(measurement);\n }\n return virtualItems;\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.getVirtualItemForOffset = function (offset) {\n var measurements = _this.getMeasurements();\n return notUndefined(measurements[findNearestBinarySearch(0, measurements.length - 1, function (index) {\n return notUndefined(measurements[index]).start;\n }, offset)]);\n };\n this.getOffsetForAlignment = function (toOffset, align) {\n var size = _this.getSize();\n if (align === 'auto') {\n if (toOffset <= _this.scrollOffset) {\n align = 'start';\n } else if (toOffset >= _this.scrollOffset + size) {\n align = 'end';\n } else {\n align = 'start';\n }\n }\n if (align === 'start') {\n toOffset = toOffset;\n } else if (align === 'end') {\n toOffset = toOffset - size;\n } else if (align === 'center') {\n toOffset = toOffset - size / 2;\n }\n var scrollSizeProp = _this.options.horizontal ? 'scrollWidth' : 'scrollHeight';\n var scrollSize = _this.scrollElement ? 'document' in _this.scrollElement ? _this.scrollElement.document.documentElement[scrollSizeProp] : _this.scrollElement[scrollSizeProp] : 0;\n var maxOffset = scrollSize - _this.getSize();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = function (index, align) {\n if (align === void 0) {\n align = 'auto';\n }\n index = Math.max(0, Math.min(index, _this.options.count - 1));\n var measurement = notUndefined(_this.getMeasurements()[index]);\n if (align === 'auto') {\n if (measurement.end >= _this.scrollOffset + _this.getSize() - _this.options.scrollPaddingEnd) {\n align = 'end';\n } else if (measurement.start <= _this.scrollOffset + _this.options.scrollPaddingStart) {\n align = 'start';\n } else {\n return [_this.scrollOffset, align];\n }\n }\n var toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;\n return [_this.getOffsetForAlignment(toOffset, align), align];\n };\n this.isDynamicMode = function () {\n return _this.measureElementCache.size > 0;\n };\n this.cancelScrollToIndex = function () {\n if (_this.scrollToIndexTimeoutId !== null) {\n clearTimeout(_this.scrollToIndexTimeoutId);\n _this.scrollToIndexTimeoutId = null;\n }\n };\n this.scrollToOffset = function (toOffset, _temp) {\n var _ref5 = _temp === void 0 ? {} : _temp,\n _ref5$align = _ref5.align,\n align = _ref5$align === void 0 ? 'start' : _ref5$align,\n behavior = _ref5.behavior;\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n _this._scrollToOffset(_this.getOffsetForAlignment(toOffset, align), {\n adjustments: undefined,\n behavior: behavior\n });\n };\n this.scrollToIndex = function (index, _temp2) {\n var _ref6 = _temp2 === void 0 ? {} : _temp2,\n _ref6$align = _ref6.align,\n initialAlign = _ref6$align === void 0 ? 'auto' : _ref6$align,\n behavior = _ref6.behavior;\n index = Math.max(0, Math.min(index, _this.options.count - 1));\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n var _this$getOffsetForInd = _this.getOffsetForIndex(index, initialAlign),\n toOffset = _this$getOffsetForInd[0],\n align = _this$getOffsetForInd[1];\n _this._scrollToOffset(toOffset, {\n adjustments: undefined,\n behavior: behavior\n });\n if (behavior !== 'smooth' && _this.isDynamicMode()) {\n _this.scrollToIndexTimeoutId = setTimeout(function () {\n _this.scrollToIndexTimeoutId = null;\n var elementInDOM = _this.measureElementCache.has(_this.options.getItemKey(index));\n if (elementInDOM) {\n var _this$getOffsetForInd2 = _this.getOffsetForIndex(index, align),\n _toOffset = _this$getOffsetForInd2[0];\n if (!approxEqual(_toOffset, _this.scrollOffset)) {\n _this.scrollToIndex(index, {\n align: align,\n behavior: behavior\n });\n }\n } else {\n _this.scrollToIndex(index, {\n align: align,\n behavior: behavior\n });\n }\n });\n }\n };\n this.scrollBy = function (delta, _temp3) {\n var _ref7 = _temp3 === void 0 ? {} : _temp3,\n behavior = _ref7.behavior;\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n _this._scrollToOffset(_this.scrollOffset + delta, {\n adjustments: undefined,\n behavior: behavior\n });\n };\n this.getTotalSize = function () {\n var _this$getMeasurements;\n return (((_this$getMeasurements = _this.getMeasurements()[_this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || _this.options.paddingStart) - _this.options.scrollMargin + _this.options.paddingEnd;\n };\n this._scrollToOffset = function (offset, _ref8) {\n var adjustments = _ref8.adjustments,\n behavior = _ref8.behavior;\n _this.options.scrollToFn(offset, {\n behavior: behavior,\n adjustments: adjustments\n }, _this);\n };\n this.measure = function () {\n _this.itemSizeCache = new Map();\n _this.notify();\n };\n this.setOptions(_opts);\n this.scrollRect = this.options.initialRect;\n this.scrollOffset = this.options.initialOffset;\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach(function (item) {\n _this.itemSizeCache.set(item.key, item.size);\n });\n this.maybeNotify();\n};\nvar findNearestBinarySearch = function findNearestBinarySearch(low, high, getCurrentValue, value) {\n while (low <= high) {\n var middle = (low + high) / 2 | 0;\n var currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange(_ref9) {\n var measurements = _ref9.measurements,\n outerSize = _ref9.outerSize,\n scrollOffset = _ref9.scrollOffset;\n var count = measurements.length - 1;\n var getOffset = function getOffset(index) {\n return measurements[index].start;\n };\n var startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);\n var endIndex = startIndex;\n while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n return {\n startIndex: startIndex,\n endIndex: endIndex\n };\n}\n\nexport { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };\n//# sourceMappingURL=index.mjs.map\n","/**\n * react-virtual\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.mjs';\nimport * as React from 'react';\nimport { observeElementRect, observeElementOffset, elementScroll, observeWindowRect, observeWindowOffset, windowScroll, Virtualizer } from '@tanstack/virtual-core';\nexport * from '@tanstack/virtual-core';\n\n//\n\nvar useIsomorphicLayoutEffect = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase(options) {\n var rerender = React.useReducer(function () {\n return {};\n }, {})[1];\n var resolvedOptions = _extends({}, options, {\n onChange: function onChange(instance) {\n rerender();\n options.onChange == null ? void 0 : options.onChange(instance);\n }\n });\n var _React$useState = React.useState(function () {\n return new Virtualizer(resolvedOptions);\n }),\n instance = _React$useState[0];\n instance.setOptions(resolvedOptions);\n React.useEffect(function () {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(function () {\n return instance._willUpdate();\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase(_extends({\n observeElementRect: observeElementRect,\n observeElementOffset: observeElementOffset,\n scrollToFn: elementScroll\n }, options));\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase(_extends({\n getScrollElement: function getScrollElement() {\n return typeof document !== 'undefined' ? window : null;\n },\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll\n }, options));\n}\n\nexport { useVirtualizer, useWindowVirtualizer };\n//# sourceMappingURL=index.mjs.map\n","import React from 'react';\nimport {useDialogContext} from './dialog-context';\nimport {Dialog} from './dialog';\nimport {DialogBody} from './dialog-body';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {useControlledState} from '@react-stately/utils';\n\ninterface Props {\n image?: string;\n images?: string[];\n activeIndex?: number;\n onActiveIndexChange?: (index: number) => void;\n defaultActiveIndex?: number;\n}\nexport function ImageZoomDialog(props: Props) {\n const {close} = useDialogContext();\n const {image, images} = props;\n const [activeIndex, setActiveIndex] = useControlledState(\n props.activeIndex,\n props.defaultActiveIndex,\n props.onActiveIndexChange\n );\n const src = image || images?.[activeIndex];\n\n return (\n <Dialog size=\"fullscreenTakeover\" background=\"bg-black/80\">\n <DialogBody padding=\"p-0\" className=\"w-full h-full\">\n <IconButton\n size=\"lg\"\n color=\"paper\"\n className=\"absolute top-0 right-0 text-white z-20\"\n onClick={() => {\n close();\n }}\n >\n <CloseIcon />\n </IconButton>\n <div className=\"relative p-40 flex items-center justify-center w-full h-full\">\n {images?.length ? (\n <IconButton\n size=\"lg\"\n color=\"white\"\n variant=\"flat\"\n className=\"absolute my-auto top-0 bottom-0 left-20\"\n radius=\"rounded\"\n disabled={activeIndex < 1}\n onClick={() => {\n setActiveIndex(activeIndex - 1);\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n ) : null}\n <img\n src={src}\n alt=\"\"\n className=\"max-h-full w-auto shadow object-contain\"\n />\n {images?.length ? (\n <IconButton\n size=\"lg\"\n color=\"white\"\n variant=\"flat\"\n className=\"absolute my-auto top-0 bottom-0 right-20\"\n radius=\"rounded\"\n disabled={activeIndex + 1 === images?.length}\n onClick={() => {\n setActiveIndex(activeIndex + 1);\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n ) : null}\n </div>\n </DialogBody>\n </Dialog>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PauseIcon = createSvgIcon(\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n, 'PauseOutlined');\n","import {Album} from '../albums/album';\nimport {Lyric} from './lyrics/lyric';\nimport {Genre} from '../genres/genre';\nimport {Artist} from '../artists/artist';\nimport {Tag} from '@common/tags/tag';\n\nexport const TRACK_MODEL = 'track';\n\nexport interface Track {\n id: number;\n name: string;\n duration?: number;\n artists?: Artist[];\n plays?: number;\n popularity?: number;\n src?: string;\n image?: string;\n lyric?: Lyric;\n album?: Album;\n owner_id?: number;\n description?: string;\n tags: Tag[];\n genres?: Genre[];\n likes_count?: number;\n reposts_count?: number;\n comments_count?: number;\n updated_at?: string;\n created_at?: string;\n // available in library tracks page only\n added_at?: string;\n model_type: 'track';\n}\n","import {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {User} from '@common/auth/user';\nimport {Track} from '@app/web-player/tracks/track';\nimport {Artist} from '@app/web-player/artists/artist';\nimport {Playlist} from '@app/web-player/playlists/playlist';\nimport {Genre} from '@app/web-player/genres/genre';\nimport {Album} from '@app/web-player/albums/album';\n\nexport const CHANNEL_MODEL = 'channel';\n\nexport type ChannelContentItem = (\n | Track\n | Album\n | Artist\n | Playlist\n | User\n | Channel\n | Genre\n) & {\n channelable_id?: number;\n channelable_order?: number;\n};\n\nexport interface Channel<T = ChannelContentItem> {\n id: number;\n name: string;\n slug: string;\n genre?: Genre;\n config: {\n carouselWhenNested: boolean;\n autoUpdateMethod?: string;\n disablePagination?: boolean;\n disablePlayback?: boolean;\n connectToGenreViaUrl?: boolean;\n contentModel?: string;\n contentType?: 'listAll' | 'manual' | 'autoUpdate';\n contentOrder?: string;\n layout: 'trackList' | 'trackTable' | 'grid';\n hideTitle?: boolean;\n lockSlug?: boolean;\n actions?: {tooltip: string; icon: string; route: string}[];\n };\n model_type: 'channel';\n updated_at?: string;\n content?: PaginationResponse<T>;\n}\n","import {Track} from '../tracks/track';\nimport {User} from '@common/auth/user';\n\nexport const PLAYLIST_MODEL = 'playlist';\n\nexport interface Playlist {\n id: number;\n name: string;\n public: boolean;\n collaborative: boolean;\n image: string;\n description: string;\n created_at: string;\n updated_at: string;\n owner_id: number;\n owner?: User;\n editors?: User[];\n tracks_count?: number;\n tracks?: Track[];\n model_type: typeof PLAYLIST_MODEL;\n views: number;\n}\n","import {useMediaQuery} from './use-media-query';\n\nexport function useIsTouchDevice() {\n return useMediaQuery('((pointer: coarse))');\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Artist} from '@app/web-player/artists/artist';\nimport {Track} from '@app/web-player/tracks/track';\nimport {Playlist} from '@app/web-player/playlists/playlist';\nimport {User} from '@common/auth/user';\nimport {Channel} from '@app/web-player/channels/channel';\nimport {Genre} from '@app/web-player/genres/genre';\nimport {Tag} from '@common/tags/tag';\nimport {Album} from '@app/web-player/albums/album';\n\nexport interface SearchResponse extends BackendResponse {\n query: string;\n results: {\n artists?: Artist[];\n albums?: Album[];\n tracks?: Track[];\n playlists?: Playlist[];\n users?: User[];\n channels?: Channel[];\n genres?: Genre[];\n tags?: Tag[];\n };\n}\n\ninterface SearchParams {\n query?: string;\n limit?: number;\n flatten?: boolean;\n types: string[];\n localOnly?: boolean;\n normalize?: boolean;\n}\n\nexport function useSearchResults(params: SearchParams) {\n return useQuery(['search', params], () => search(params), {\n enabled: !!params.query,\n keepPreviousData: !!params.query,\n });\n}\n\nfunction search(_params: SearchParams) {\n const params = {\n ..._params,\n types: _params.types.join(','),\n };\n return apiClient\n .get<SearchResponse>(`search`, {params})\n .then(response => response.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useParams} from 'react-router-dom';\nimport {Channel} from '@app/web-player/channels/channel';\n\ninterface Response extends BackendResponse {\n channel: Channel;\n}\n\ntype UserParams = Record<string, string | boolean>;\n\nexport function channelQueryKey(slugOrId: number | string, params: UserParams) {\n return ['channel', `${slugOrId}`, params];\n}\n\nexport function channelEndpoint(slugOrId: number | string) {\n return `channel/${slugOrId}`;\n}\n\nexport function useChannel(\n slugOrId?: string | number,\n userParams?: UserParams\n) {\n const params = useParams();\n slugOrId = slugOrId || params.slugOrId;\n const queryParams = {\n ...userParams,\n filter: params.filter || '',\n paginate: 'simple',\n };\n return useQuery(channelQueryKey(slugOrId!, queryParams), () =>\n fetchChannel(slugOrId!, queryParams)\n );\n}\n\nfunction fetchChannel(\n slugOrId: number | string,\n params: Record<string, string | number | undefined> = {}\n): Promise<Response> {\n return apiClient\n .get(channelEndpoint(slugOrId), {params})\n .then(response => response.data);\n}\n","import {Link, LinkProps} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {useMemo} from 'react';\nimport {slugifyString} from '@common/utils/string/slugify-string';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {Genre} from '@app/web-player/genres/genre';\n\ninterface GenreLinkProps extends Omit<LinkProps, 'to'> {\n genre: Genre;\n className?: string;\n}\nexport function GenreLink({genre, className, ...linkProps}: GenreLinkProps) {\n const uri = useMemo(() => {\n return getGenreLink(genre);\n }, [genre]);\n\n return (\n <Link\n {...linkProps}\n className={clsx(\n 'block first-letter:capitalize hover:underline outline-none focus-visible:underline',\n className\n )}\n to={uri}\n >\n {genre.display_name || genre.name}\n </Link>\n );\n}\n\nexport function getGenreLink(\n genre: Genre,\n {absolute}: {absolute?: boolean} = {}\n) {\n const genreName = slugifyString(genre.name);\n let link = `/channel/genre/${genreName}`;\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import {Link} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {useMemo} from 'react';\nimport {slugifyString} from '@common/utils/string/slugify-string';\nimport {Playlist} from '@app/web-player/playlists/playlist';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\ninterface AlbumLinkProps {\n playlist: Playlist;\n className?: string;\n}\nexport function PlaylistLink({playlist, className}: AlbumLinkProps) {\n const uri = useMemo(() => {\n return getPlaylistLink(playlist);\n }, [playlist.id]);\n\n return (\n <Link className={clsx('capitalize hover:underline', className)} to={uri}>\n {playlist.name}\n </Link>\n );\n}\n\nexport function getPlaylistLink(\n playlist: Playlist,\n {absolute}: {absolute?: boolean} = {}\n) {\n const playlistName = slugifyString(playlist.name);\n let link = `/playlist/${playlist.id}/${playlistName}`;\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\n, 'ImageOutlined');\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {Fragment} from 'react';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {ImageIcon} from '@common/icons/material/Image';\n\nexport function CrupdatePlaylistFields() {\n const {trans} = useTrans();\n return (\n <Fragment>\n <div className=\"md:flex gap-28\">\n <FileUploadProvider>\n <FormImageSelector\n name=\"image\"\n diskPrefix=\"playlist_media\"\n variant=\"square\"\n previewSize=\"w-160 h-160\"\n className=\"mb-24 md:mb-0\"\n placeholderIcon={<ImageIcon />}\n showRemoveButton\n stretchPreview\n />\n </FileUploadProvider>\n <div className=\"flex-auto mb-34\">\n <FormTextField\n autoFocus\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n />\n <FormSwitch\n name=\"collaborative\"\n description={<Trans message=\"Invite other users to add tracks.\" />}\n className=\"mb-24\"\n >\n <Trans message=\"Collaborative\" />\n </FormSwitch>\n <FormSwitch\n name=\"public\"\n description={<Trans message=\"Everyone can see public playlists.\" />}\n >\n <Trans message=\"Public\" />\n </FormSwitch>\n </div>\n </div>\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={4}\n placeholder={trans(message('Give your playlist a catchy description.'))}\n />\n </Fragment>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Playlist} from '@app/web-player/playlists/playlist';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CreatePlaylistPayload} from '@app/web-player/playlists/requests/use-create-playlist';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {\n playlist: Playlist;\n}\n\ninterface UseUpdatePlaylistProps {\n form?: UseFormReturn<CreatePlaylistPayload>;\n playlistId?: number | string;\n}\nexport function useUpdatePlaylist({\n form,\n playlistId,\n}: UseUpdatePlaylistProps = {}) {\n const params = useParams();\n if (params.playlistId && !playlistId) {\n playlistId = params.playlistId;\n }\n return useMutation(\n (props: Partial<CreatePlaylistPayload>) =>\n updatePlaylist(playlistId!, props),\n {\n onSuccess: () => {\n toast(message('Playlist updated'));\n queryClient.invalidateQueries(['playlists']);\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n }\n );\n}\n\nfunction updatePlaylist(\n playlistId: number | string,\n payload: Partial<CreatePlaylistPayload>\n): Promise<Response> {\n return apiClient.put(`playlists/${playlistId}`, payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {CrupdatePlaylistFields} from '@app/web-player/playlists/crupdate-dialog/crupdate-playlist-fields';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {CreatePlaylistPayload} from '@app/web-player/playlists/requests/use-create-playlist';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {useUpdatePlaylist} from '@app/web-player/playlists/requests/use-update-playlist';\nimport {Playlist} from '@app/web-player/playlists/playlist';\n\ninterface UpdatePlaylistDialogProps {\n playlist: Playlist;\n}\nexport function UpdatePlaylistDialog({playlist}: UpdatePlaylistDialogProps) {\n const {close, formId} = useDialogContext();\n const form = useForm<CreatePlaylistPayload>({\n defaultValues: {\n name: playlist.name,\n public: playlist.public,\n collaborative: playlist.collaborative,\n image: playlist.image,\n description: playlist.description,\n },\n });\n const updatePlaylist = useUpdatePlaylist({form, playlistId: playlist.id});\n\n return (\n <Dialog size=\"xl\">\n <DialogHeader>\n <Trans message=\"Update playlist\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n updatePlaylist.mutate(values, {\n onSuccess: response => {\n close(response.playlist);\n },\n });\n }}\n >\n <CrupdatePlaylistFields />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updatePlaylist.isLoading}\n >\n <Trans message=\"Update\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Playlist} from '@app/web-player/playlists/playlist';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n playlist: Playlist;\n}\n\nexport interface CreatePlaylistPayload {\n name: string;\n public: boolean;\n collaborative: boolean;\n image: string;\n description: string;\n}\n\nexport function useCreatePlaylist(form: UseFormReturn<CreatePlaylistPayload>) {\n return useMutation((props: CreatePlaylistPayload) => createPlaylist(props), {\n onSuccess: () => {\n toast(message('Playlist created'));\n queryClient.invalidateQueries(['playlists']);\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createPlaylist(payload: CreatePlaylistPayload): Promise<Response> {\n return apiClient.post('playlists', payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {CrupdatePlaylistFields} from '@app/web-player/playlists/crupdate-dialog/crupdate-playlist-fields';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n CreatePlaylistPayload,\n useCreatePlaylist,\n} from '@app/web-player/playlists/requests/use-create-playlist';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\n\nexport function CreatePlaylistDialog() {\n const {close, formId} = useDialogContext();\n const form = useForm<CreatePlaylistPayload>();\n const createPlaylist = useCreatePlaylist(form);\n\n return (\n <Dialog size=\"xl\">\n <DialogHeader>\n <Trans message=\"New playlist\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n createPlaylist.mutate(values, {\n onSuccess: response => {\n close(response.playlist);\n },\n });\n }}\n >\n <CrupdatePlaylistFields />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={createPlaylist.isLoading}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n commentIds: number[];\n}\n\nexport function useDeleteComments() {\n return useMutation((payload: Payload) => deleteComments(payload), {\n onSuccess: (response, payload) => {\n toast(\n message('[one Comment deleted|other Deleted :count comments]', {\n values: {count: payload.commentIds.length},\n })\n );\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction deleteComments({commentIds}: Payload): Promise<Response> {\n return apiClient.delete(`comment/${commentIds.join(',')}`).then(r => r.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TrendingUpIcon = createSvgIcon(\n <path d=\"m16 6 2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6h-6z\" />\n, 'TrendingUpOutlined');\n"],"names":["DashboardLayoutContext","createContext","useBlockBodyOverflow","useEffect","DashboardLayout","children","leftSidenav","onLeftSidenavChange","rightSidenav","initialRightSidenavStatus","onRightSidenavChange","name","leftSidenavCanBeCompact","height","domProps","isMobile","useMediaQuery","defaultLeftSidenavStatus","useMemo","getFromLocalStorage","leftSidenavStatus","setLeftSidenavStatus","useControlledState","rightSidenavStatusDefault","userSelected","rightSidenavStatus","_setRightSidenavStatus","setRightSidenavStatus","useCallback","status","setInLocalStorage","shouldShowUnderlay","jsx","jsxs","clsx","AnimatePresence","Underlay","DashboardContent","cloneElement","DashboardSidenav","className","position","size","mode","overlayPosition","display","forceClosed","isMobileMode","useContext","isOverlayMode","variants","sizeClassName","getSize","m","e","target","NameWithAvatar","image","label","description","labelClassName","avatarSize","Avatar","NameWithAvatarPlaceholder","showDescription","Skeleton","EMPTY_PAGINATION_RESPONSE","hasNextPage","pagination","downloadFileFromUrl","url","link","subscribeWithSelectorImpl","fn","set","get","api","origSubscribe","selector","optListener","options","listener","equalityFn","currentSlice","state","nextSlice","previousSlice","subscribeWithSelector","usePrevious","value","ref","useRef","BaseSlider","props","inline","showValueLabel","width","slider","trackColor","fillColor","trackRef","getThumbPercent","getThumbValueLabel","labelId","groupId","thumbIds","isDisabled","numberFormatter","minValue","maxValue","step","values","getValueLabel","outputValue","maxLabelLength","style","getInputFieldClassNames","wrapperClassname","_a","getTrackColor","getFillColor","color","useSlider","formatOptions","onChangeEnd","onPointerDown","showThumbOnHoverOnly","thumbSize","isPointerOver","setIsPointerOver","useState","useNumberFormatter","addGlobalListener","removeGlobalListener","useGlobalListeners","setValues","valuesRef","draggedThumbs","setDraggedThumbs","draggedThumbsRef","getFormattedValue","isThumbDragging","index","getThumbMinValue","getThumbMaxValue","setThumbValue","isThumbEditable","thisMin","thisMax","snapValueToStep","replaceIndex","updateDraggedThumbs","dragging","wasDragging","focusedThumb","setFocusedThumb","getValuePercent","x","setThumbPercent","percent","getPercentValue","getRoundedValue","val","clamp","editableThumbsRef","setThumbEditable","editable","realTimeTrackDraggingIndex","currentPointer","handlePointerDown","_","i","trackPosition","closestThumb","split","v","lastLeft","firstRight","onUpTrack","currentPosition","moveDomProps","usePointerEvents","deltaX","mergeProps","id","useId","array","SliderThumb","isThumbDisabled","ariaLabel","inputRef","onBlur","inputObjRef","useObjectRef","isSliderDisabled","isDragging","focusInput","isFocused","handlePointerUp","thumbColor","createEventHandler","Slider","onChange","defaultValue","otherProps","baseProps","FormSlider","useController","formProps","USER_MODEL","MoreVertIcon","createSvgIcon","artistPageTabs","_extends","source","key","memo","getDeps","opts","_opts$initialDeps","deps","result","depTime","newDeps","depsChanged","dep","resultTime","depEndTime","resultEndTime","resultFpsPercentage","pad","str","num","notUndefined","msg","approxEqual","a","b","defaultKeyExtractor","defaultRangeExtractor","range","start","end","arr","_i","observeElementRect","instance","cb","element","handler","rect","observer","entries","entry","box","observeElementOffset","measureElement","elementScroll","offset","_ref2","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","adjustments","behavior","toOffset","Virtualizer","_opts","_this","_ro","_get","_get2","_get3","_ref3","d","scrollElement","prev","count","paddingStart","scrollMargin","getItemKey","measurements","furthestMeasurementsFound","furthestMeasurements","measurement","previousFurthestMeasurement","_ref4","itemSizeCache","min","_i2","furthestMeasurement","measuredSize","lane","outerSize","scrollOffset","calculateRange","rangeExtractor","overscan","node","attributeName","indexStr","_this$itemSizeCache$g","item","prevNode","measuredItemSize","itemSize","delta","indexes","virtualItems","k","len","_i3","findNearestBinarySearch","align","scrollSizeProp","scrollSize","maxOffset","_temp","_ref5","_ref5$align","_temp2","_ref6","_ref6$align","initialAlign","_this$getOffsetForInd","elementInDOM","_this$getOffsetForInd2","_toOffset","_temp3","_ref7","_this$getMeasurements","_ref8","low","high","getCurrentValue","middle","currentValue","_ref9","getOffset","startIndex","endIndex","useIsomorphicLayoutEffect","React.useLayoutEffect","React.useEffect","useVirtualizerBase","rerender","React.useReducer","resolvedOptions","_React$useState","React.useState","useVirtualizer","ImageZoomDialog","close","useDialogContext","images","activeIndex","setActiveIndex","src","Dialog","DialogBody","IconButton","CloseIcon","KeyboardArrowLeftIcon","KeyboardArrowRightIcon","PauseIcon","TRACK_MODEL","CHANNEL_MODEL","PLAYLIST_MODEL","useIsTouchDevice","useSearchResults","params","useQuery","search","_params","apiClient","response","channelQueryKey","slugOrId","channelEndpoint","useChannel","userParams","useParams","queryParams","fetchChannel","GenreLink","genre","linkProps","uri","getGenreLink","Link","absolute","slugifyString","getBootstrapData","PlaylistLink","playlist","getPlaylistLink","playlistName","ImageIcon","CrupdatePlaylistFields","trans","useTrans","Fragment","FileUploadProvider","FormImageSelector","FormTextField","Trans","FormSwitch","message","useUpdatePlaylist","form","playlistId","useMutation","updatePlaylist","toast","queryClient","onFormQueryError","r","showHttpErrorToast","payload","UpdatePlaylistDialog","formId","useForm","DialogHeader","Form","DialogFooter","Button","useCreatePlaylist","createPlaylist","CreatePlaylistDialog","useDeleteComments","deleteComments","err","commentIds","TrendingUpIcon"],"mappings":"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","x_google_ignoreList":[8,17,18,19,20,21]}
Save
Cancel