diff --git a/src/lib/components/admin/AdminSegmentedController.svelte b/src/lib/components/admin/AdminSegmentedController.svelte deleted file mode 100644 index 54c6fc5..0000000 --- a/src/lib/components/admin/AdminSegmentedController.svelte +++ /dev/null @@ -1,205 +0,0 @@ - - - - - diff --git a/src/lib/components/admin/AlbumMetadataPopover.svelte b/src/lib/components/admin/AlbumMetadataPopover.svelte deleted file mode 100644 index b5c4ca3..0000000 --- a/src/lib/components/admin/AlbumMetadataPopover.svelte +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/src/lib/components/admin/BaseSegmentedController.svelte b/src/lib/components/admin/BaseSegmentedController.svelte deleted file mode 100644 index de3b904..0000000 --- a/src/lib/components/admin/BaseSegmentedController.svelte +++ /dev/null @@ -1,340 +0,0 @@ - - -
- {#if showPill && activeIndex >= 0} - - {/if} - - {#each items as item, index} - {@const isActive = index === activeIndex} - {@const isHovered = index === hoveredIndex} - - {#if variant === 'navigation' && item.href} - (hoveredIndex = index)} - onmouseleave={() => (hoveredIndex = -1)} - > - {#if children} - {@render children({ item, index, isActive, isHovered })} - {:else} - {item.label} - {/if} - - {:else} - - {/if} - {/each} -
- - diff --git a/src/lib/stores/album-stream.ts b/src/lib/stores/album-stream.ts deleted file mode 100644 index 41df658..0000000 --- a/src/lib/stores/album-stream.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { writable, derived, get, type Readable } from 'svelte/store' -import { browser } from '$app/environment' -import type { Album } from '$lib/types/lastfm' - -interface AlbumStreamState { - connected: boolean - albums: Album[] - lastUpdate: Date | null -} - -function createAlbumStream() { - const { subscribe, set, update } = writable({ - connected: false, - albums: [], - lastUpdate: null - }) - - let eventSource: EventSource | null = null - let reconnectTimeout: NodeJS.Timeout | null = null - let reconnectAttempts = 0 - - function connect() { - if (!browser || eventSource?.readyState === EventSource.OPEN) return - - // Don't connect in Storybook - if (typeof window !== 'undefined' && window.parent !== window) { - // We're in an iframe, likely Storybook - console.log('Album stream disabled in Storybook') - return - } - - // Clean up existing connection - disconnect() - - eventSource = new EventSource('/api/lastfm/stream') - - eventSource.addEventListener('connected', () => { - console.log('Album stream connected') - reconnectAttempts = 0 - update((state) => ({ ...state, connected: true })) - }) - - eventSource.addEventListener('albums', (event) => { - try { - const albums: Album[] = JSON.parse(event.data) - const nowPlayingAlbum = albums.find((a) => a.isNowPlaying) - console.log('Album stream received albums:', { - totalAlbums: albums.length, - nowPlayingAlbum: nowPlayingAlbum - ? `${nowPlayingAlbum.artist.name} - ${nowPlayingAlbum.name}` - : 'none' - }) - update((state) => ({ - ...state, - albums, - lastUpdate: new Date() - })) - } catch (error) { - console.error('Error parsing albums update:', error) - } - }) - - eventSource.addEventListener('heartbeat', () => { - // Heartbeat received, connection is healthy - }) - - eventSource.addEventListener('error', (error) => { - console.error('Album stream error:', error) - update((state) => ({ ...state, connected: false })) - - // Attempt to reconnect with exponential backoff - if (reconnectAttempts < 5) { - const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 30000) - reconnectTimeout = setTimeout(() => { - reconnectAttempts++ - connect() - }, delay) - } - }) - - eventSource.addEventListener('open', () => { - update((state) => ({ ...state, connected: true })) - }) - } - - function disconnect() { - if (eventSource) { - eventSource.close() - eventSource = null - } - - if (reconnectTimeout) { - clearTimeout(reconnectTimeout) - reconnectTimeout = null - } - - update((state) => ({ ...state, connected: false })) - } - - // Auto-connect in browser (but not in admin) - if (browser && !window.location.pathname.startsWith('/admin')) { - connect() - - // Reconnect on visibility change - document.addEventListener('visibilitychange', () => { - const currentState = get({ subscribe }) - if ( - document.visibilityState === 'visible' && - !currentState.connected && - !window.location.pathname.startsWith('/admin') - ) { - connect() - } - }) - } - - return { - subscribe, - connect, - disconnect, - // Derived store for just the albums - albums: derived({ subscribe }, ($state) => $state.albums) as Readable - } -} - -export const albumStream = createAlbumStream() diff --git a/src/routes/admin/buttons/+page.svelte b/src/routes/admin/buttons/+page.svelte deleted file mode 100644 index 64256de..0000000 --- a/src/routes/admin/buttons/+page.svelte +++ /dev/null @@ -1,155 +0,0 @@ - - - -
-
-

Variants

-
- - - - - -
-
- -
-

Sizes

-
- - - -
-
- -
-

Icon Buttons

-
- - - - -
-
- -
-

Buttons with Icons

-
- - -
-
- -
-

States

-
- - - -
-
- -
-

Square Buttons

-
- - - -
-
- -
-

Full Width

- -
-
-
- - diff --git a/src/routes/admin/form-components-test/+page.svelte b/src/routes/admin/form-components-test/+page.svelte deleted file mode 100644 index 3ebc1cb..0000000 --- a/src/routes/admin/form-components-test/+page.svelte +++ /dev/null @@ -1,293 +0,0 @@ - - - -
- -
-

MediaInput Component

-

Generic input component for media selection with preview.

- -
- - - - - -
-
- - -
-

ImagePicker Component

-

Specialized image picker with enhanced preview and aspect ratio support.

- -
- - - -
-
- - -
-

GalleryManager Component

-

Multiple image management with drag-and-drop reordering.

- -
- - - -
-
- - -
-

Form Actions

-
- - -
-
- - -
-

Current Values

-
-
-

Single Media:

-
{JSON.stringify(singleMedia?.filename || null, null, 2)}
-
- -
-

Multiple Media ({multipleMedia.length}):

-
{JSON.stringify(
-							multipleMedia.map((m) => m.filename),
-							null,
-							2
-						)}
-
- -
-

Featured Image:

-
{JSON.stringify(featuredImage?.filename || null, null, 2)}
-
- -
-

Gallery Images ({galleryImages.length}):

-
{JSON.stringify(
-							galleryImages.map((m) => m.filename),
-							null,
-							2
-						)}
-
- -
-

Project Gallery ({projectGallery.length}):

-
{JSON.stringify(
-							projectGallery.map((m) => m.filename),
-							null,
-							2
-						)}
-
-
-
-
-
- - diff --git a/src/routes/admin/image-uploader-test/+page.svelte b/src/routes/admin/image-uploader-test/+page.svelte deleted file mode 100644 index 222a9f0..0000000 --- a/src/routes/admin/image-uploader-test/+page.svelte +++ /dev/null @@ -1,272 +0,0 @@ - - - -
- -
-

Basic Image Upload

-

Standard image upload with alt text support.

- - -
- - -
-

Square Logo Upload

-

Image upload with 1:1 aspect ratio constraint.

- - -
- - -
-

Banner Image Upload

-

Wide banner image with 16:9 aspect ratio.

- - -
- - -
-

Actions

-
- - -
-
- - -
-

Current Values

-
-
-

Single Image:

-
{JSON.stringify(
-							singleImage
-								? {
-										id: singleImage.id,
-										filename: singleImage.filename,
-										altText: singleImage.altText,
-										description: singleImage.description
-									}
-								: null,
-							null,
-							2
-						)}
-
- -
-

Logo Image:

-
{JSON.stringify(
-							logoImage
-								? {
-										id: logoImage.id,
-										filename: logoImage.filename,
-										altText: logoImage.altText,
-										description: logoImage.description
-									}
-								: null,
-							null,
-							2
-						)}
-
- -
-

Banner Image:

-
{JSON.stringify(
-							bannerImage
-								? {
-										id: bannerImage.id,
-										filename: bannerImage.filename,
-										altText: bannerImage.altText,
-										description: bannerImage.description
-									}
-								: null,
-							null,
-							2
-						)}
-
-
-
-
-
- - diff --git a/src/routes/admin/inputs/+page.svelte b/src/routes/admin/inputs/+page.svelte deleted file mode 100644 index 47cb1c5..0000000 --- a/src/routes/admin/inputs/+page.svelte +++ /dev/null @@ -1,257 +0,0 @@ - - - -
-
-

Basic Inputs

-
- - - - - -
-
- -
-

Specialized Inputs

-
- - - - - - - - - - - - -
-
- -
-

Textarea

- -
- -
-

Input Sizes

-
- - - - - -
-
- -
-

Input States

-
- 0 && withErrorValue.length < 3 - ? 'Too short! Minimum 3 characters' - : ''} - /> - - - - -
-
- -
-

Input with Icons

-
- - - - - - - - - - - - - -
-
- -
-

Character Limit

- - - -
- -
-

Form Example

-
- - - - - - -
- - -
-
-
-
-
- - diff --git a/src/routes/admin/media-library-test/+page.svelte b/src/routes/admin/media-library-test/+page.svelte deleted file mode 100644 index bc3178c..0000000 --- a/src/routes/admin/media-library-test/+page.svelte +++ /dev/null @@ -1,258 +0,0 @@ - - - -
-
-

Single Selection Mode

-

Test selecting a single media item.

- - - - {#if selectedSingleMedia} -
-

Selected Media:

-
- {#if selectedSingleMedia.thumbnailUrl} - {selectedSingleMedia.filename} - {/if} -
-

Filename: {selectedSingleMedia.filename}

-

Size: {formatFileSize(selectedSingleMedia.size)}

-

Type: {selectedSingleMedia.mimeType}

- {#if selectedSingleMedia.width && selectedSingleMedia.height} -

- Dimensions: - {selectedSingleMedia.width}×{selectedSingleMedia.height} -

- {/if} -
-
-
- {/if} -
- -
-

Multiple Selection Mode

-

Test selecting multiple media items.

- - - - {#if selectedMultipleMedia.length > 0} -
-

Selected Media ({selectedMultipleMedia.length} items):

-
- {#each selectedMultipleMedia as media} -
- {#if media.thumbnailUrl} - {media.filename} - {/if} -
-

{media.filename}

-

{formatFileSize(media.size)}

-
-
- {/each} -
-
- {/if} -
- -
-

Image Only Selection

-

Test selecting only image files.

- - -
-
- - - - - -
- -