From 0a6aec01f099f4fc9bb787ba835348243946c8bb Mon Sep 17 00:00:00 2001 From: Florian <45694132+flo-bit@users.noreply.github.com> Date: Sun, 1 Feb 2026 12:13:27 +0100 Subject: [PATCH 1/2] add apple music embed --- .../AppleMusicCard/AppleMusicCard.svelte | 22 ++++++ .../CreateAppleMusicCardModal.svelte | 52 ++++++++++++++ src/lib/cards/AppleMusicCard/index.ts | 70 +++++++++++++++++++ src/lib/cards/index.ts | 2 + src/lib/website/Context.svelte | 4 +- src/lib/website/EditableWebsite.svelte | 4 +- 6 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 src/lib/cards/AppleMusicCard/AppleMusicCard.svelte create mode 100644 src/lib/cards/AppleMusicCard/CreateAppleMusicCardModal.svelte create mode 100644 src/lib/cards/AppleMusicCard/index.ts diff --git a/src/lib/cards/AppleMusicCard/AppleMusicCard.svelte b/src/lib/cards/AppleMusicCard/AppleMusicCard.svelte new file mode 100644 index 0000000..8fd8f7d --- /dev/null +++ b/src/lib/cards/AppleMusicCard/AppleMusicCard.svelte @@ -0,0 +1,22 @@ + + +{#if item.cardData?.appleMusicType && item.cardData?.appleMusicId && item.cardData?.appleMusicStorefront} +
+ +
+{:else} +
+ Missing Apple Music data +
+{/if} diff --git a/src/lib/cards/AppleMusicCard/CreateAppleMusicCardModal.svelte b/src/lib/cards/AppleMusicCard/CreateAppleMusicCardModal.svelte new file mode 100644 index 0000000..ac0fd04 --- /dev/null +++ b/src/lib/cards/AppleMusicCard/CreateAppleMusicCardModal.svelte @@ -0,0 +1,52 @@ + + + + Enter an Apple Music album or playlist URL + { + if (e.key === 'Enter' && checkUrl()) oncreate(); + }} + /> + + {#if errorMessage} + {errorMessage} + {/if} + +
+ + +
+
diff --git a/src/lib/cards/AppleMusicCard/index.ts b/src/lib/cards/AppleMusicCard/index.ts new file mode 100644 index 0000000..43aa7cf --- /dev/null +++ b/src/lib/cards/AppleMusicCard/index.ts @@ -0,0 +1,70 @@ +import type { CardDefinition } from '../types'; +import CreateAppleMusicCardModal from './CreateAppleMusicCardModal.svelte'; +import AppleMusicCard from './AppleMusicCard.svelte'; + +const cardType = 'apple-music-embed'; + +export const AppleMusicCardDefinition = { + type: cardType, + contentComponent: AppleMusicCard, + creationModalComponent: CreateAppleMusicCardModal, + createNew: (item) => { + item.cardType = cardType; + item.cardData = {}; + item.w = 4; + item.mobileW = 8; + item.h = 5; + item.mobileH = 10; + }, + + onUrlHandler: (url, item) => { + const match = matchAppleMusicUrl(url); + if (!match) return null; + + item.cardData.appleMusicType = match.type; + item.cardData.appleMusicId = match.id; + item.cardData.appleMusicStorefront = match.storefront; + item.cardData.href = url; + + item.w = 4; + item.mobileW = 8; + item.h = 5; + item.mobileH = 10; + + return item; + }, + + urlHandlerPriority: 2, + + name: 'Apple Music Embed', + canResize: true, + minW: 4, + minH: 5, + + keywords: ['music', 'apple', 'playlist', 'album'], + groups: ['Media'], + icon: `` +} as CardDefinition & { type: typeof cardType }; + +// Match Apple Music album and playlist URLs +// Examples: +// https://music.apple.com/us/album/midnights/1649434004 +// https://music.apple.com/us/playlist/todays-hits/pl.f4d106fed2bd41149aaacabb233eb5eb +function matchAppleMusicUrl( + url: string | undefined +): { type: 'album' | 'playlist'; id: string; storefront: string } | null { + if (!url) return null; + + const pattern = /music\.apple\.com\/([a-z]{2})\/(album|playlist)\/[^/]+\/([a-zA-Z0-9.]+)/; + const match = url.match(pattern); + + if (match) { + return { + storefront: match[1], + type: match[2] as 'album' | 'playlist', + id: match[3] + }; + } + + return null; +} diff --git a/src/lib/cards/index.ts b/src/lib/cards/index.ts index 0e32989..92ebe92 100644 --- a/src/lib/cards/index.ts +++ b/src/lib/cards/index.ts @@ -32,6 +32,7 @@ import { TimerCardDefinition } from './TimerCard'; import { ClockCardDefinition } from './ClockCard'; import { CountdownCardDefinition } from './CountdownCard'; import { SpotifyCardDefinition } from './SpotifyCard'; +import { AppleMusicCardDefinition } from './AppleMusicCard'; import { ButtonCardDefinition } from './ButtonCard'; import { GuestbookCardDefinition } from './GuestbookCard'; import { FriendsCardDefinition } from './FriendsCard'; @@ -73,6 +74,7 @@ export const AllCardDefinitions = [ ClockCardDefinition, CountdownCardDefinition, SpotifyCardDefinition, + AppleMusicCardDefinition, // Model3DCardDefinition FriendsCardDefinition ] as const; diff --git a/src/lib/website/Context.svelte b/src/lib/website/Context.svelte index 8cadf44..5c4a577 100644 --- a/src/lib/website/Context.svelte +++ b/src/lib/website/Context.svelte @@ -19,7 +19,9 @@ // svelte-ignore state_referenced_locally setAdditionalUserData(data.additionalData); - setCanEdit(() => dev || (user.isLoggedIn && user.profile?.did === data.did && isEditing === true)); + setCanEdit( + () => dev || (user.isLoggedIn && user.profile?.did === data.did && isEditing === true) + ); // svelte-ignore state_referenced_locally setDidContext(data.did as Did); diff --git a/src/lib/website/EditableWebsite.svelte b/src/lib/website/EditableWebsite.svelte index 4c2ac3e..af920c6 100644 --- a/src/lib/website/EditableWebsite.svelte +++ b/src/lib/website/EditableWebsite.svelte @@ -201,9 +201,7 @@ document.body.style.removeProperty('padding-right'); document.body.style.removeProperty('margin-right'); // Remove any orphaned dialog overlay/content elements left by the portal - for (const el of document.querySelectorAll( - '[data-dialog-overlay], [data-dialog-content]' - )) { + for (const el of document.querySelectorAll('[data-dialog-overlay], [data-dialog-content]')) { el.remove(); } }; -- 2.54.0 From 28c6767f512160fa4bab5e46d7743ba66aba55df Mon Sep 17 00:00:00 2001 From: Florian <45694132+flo-bit@users.noreply.github.com> Date: Sun, 1 Feb 2026 14:30:15 +0100 Subject: [PATCH 2/2] update recently updated --- .../SpecialCards/UpdatedBlentos/UpdatedBlentosCard.svelte | 1 - src/lib/cards/SpecialCards/UpdatedBlentos/index.ts | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/cards/SpecialCards/UpdatedBlentos/UpdatedBlentosCard.svelte b/src/lib/cards/SpecialCards/UpdatedBlentos/UpdatedBlentosCard.svelte index 82134b6..a63f3a8 100644 --- a/src/lib/cards/SpecialCards/UpdatedBlentos/UpdatedBlentosCard.svelte +++ b/src/lib/cards/SpecialCards/UpdatedBlentos/UpdatedBlentosCard.svelte @@ -20,7 +20,6 @@
-
Recently updated blentos
{#each profiles as profile (profile.did)} ` } as CardDefinition & { type: 'updatedBlentos' }; -- 2.54.0