From 7fa99a298fa74d05714188a2136293293fe5a144 Mon Sep 17 00:00:00 2001 From: Andrew Brower Date: Sun, 7 Jul 2024 00:28:17 +0200 Subject: [PATCH] feat: redesign now playing thing --- .neoconf.json | 13 ++ .prettierrc | 3 +- bun.lockb | Bin 176044 -> 176916 bytes package.json | 86 +++++++------- src/app.css | 6 +- src/app.html | 2 +- src/lib/components/Intro.svelte | 112 ------------------ src/lib/components/NowPlaying.svelte | 62 ++++++++++ src/lib/types.ts | 19 +-- .../{+page.server.ts => +layout.server.ts} | 4 +- src/routes/+layout.svelte | 23 ++-- src/routes/+page.svelte | 97 ++++++++++++++- src/routes/api/spotify/np/+server.ts | 36 +++--- svelte.config.js | 18 +-- tailwind.config.js | 15 +-- vite.config.ts | 20 ++-- 16 files changed, 290 insertions(+), 226 deletions(-) create mode 100644 .neoconf.json delete mode 100644 src/lib/components/Intro.svelte create mode 100644 src/lib/components/NowPlaying.svelte rename src/routes/{+page.server.ts => +layout.server.ts} (64%) diff --git a/.neoconf.json b/.neoconf.json new file mode 100644 index 0000000..5ec653f --- /dev/null +++ b/.neoconf.json @@ -0,0 +1,13 @@ +{ + "svelte": { + "plugin": { + "svelte": { + "format": { + "config": { + "svelteBracketNewLine": false + } + } + } + } + } +} diff --git a/.prettierrc b/.prettierrc index a77fdde..0f0f8a8 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,8 +2,9 @@ "useTabs": true, "singleQuote": true, "trailingComma": "none", + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "ignore", "printWidth": 100, "plugins": ["prettier-plugin-svelte"], - "pluginSearchDirs": ["."], "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] } diff --git a/bun.lockb b/bun.lockb index 64d2e84fdab6f34459c09c41dedb73f4e6bfbd01..da2e9728aaf22b215f7e05a2e101a72ac4650387 100755 GIT binary patch delta 32434 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 LBg6E9O-xGwH^1Z8 diff --git a/package.json b/package.json index ac8f0da..b027bd2 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,45 @@ { - "name": "home", - "version": "0.0.1", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write ." - }, - "devDependencies": { - "@iconify-json/carbon": "^1.1.36", - "@iconify/svelte": "^4.0.2", - "@iconify/utils": "^2.1.25", - "@sveltejs/adapter-cloudflare": "^4.6.1", - "@sveltejs/kit": "^2.5.18", - "@tailwindcss/vite": "^4.0.0-alpha.17", - "@types/node": "^20.14.10", - "@typescript-eslint/eslint-plugin": "^7.15.0", - "@typescript-eslint/parser": "^7.15.0", - "eslint": "^9.6.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte3": "^4.0.0", - "prettier": "^3.3.2", - "prettier-plugin-svelte": "^3.2.5", - "svelte": "^5.0.0-next.175", - "svelte-check": "^3.8.4", - "tailwindcss": "^4.0.0-alpha.17", - "tslib": "^2.6.3", - "typescript": "^5.5.3", - "unplugin-icons": "^0.19.0", - "vite": "^5.3.3", - "vite-imagetools": "^7.0.2" - }, - "type": "module", - "trustedDependencies": [ - "@sveltejs/kit", - "esbuild", - "sharp", - "svelte-preprocess", - "workerd" - ] + "name": "home", + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --plugin-search-dir . --check . && eslint .", + "format": "prettier --plugin-search-dir . --write ." + }, + "devDependencies": { + "@iconify-json/carbon": "^1.1.36", + "@iconify/svelte": "^4.0.2", + "@iconify/utils": "^2.1.25", + "@sveltejs/adapter-cloudflare": "^4.6.1", + "@sveltejs/enhanced-img": "^0.3.0", + "@sveltejs/kit": "^2.5.18", + "@tailwindcss/vite": "^4.0.0-alpha.17", + "@types/node": "^20.14.10", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "eslint": "^9.6.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte3": "^4.0.0", + "prettier": "^3.3.2", + "prettier-plugin-svelte": "^3.2.5", + "svelte": "^5.0.0-next.175", + "svelte-check": "^3.8.4", + "tailwindcss": "^4.0.0-alpha.17", + "tslib": "^2.6.3", + "typescript": "^5.5.3", + "unplugin-icons": "^0.19.0", + "vite": "^5.3.3" + }, + "type": "module", + "trustedDependencies": [ + "@sveltejs/kit", + "esbuild", + "sharp", + "svelte-preprocess", + "workerd" + ] } diff --git a/src/app.css b/src/app.css index f1d8c73..8dbec2c 100644 --- a/src/app.css +++ b/src/app.css @@ -1 +1,5 @@ -@import "tailwindcss"; +@import 'tailwindcss'; + +.link-underline { + @apply underline decoration-white/0 hover:decoration-white transition-all duration-200; +} diff --git a/src/app.html b/src/app.html index 6769ed5..77a5ff5 100644 --- a/src/app.html +++ b/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/src/lib/components/Intro.svelte b/src/lib/components/Intro.svelte deleted file mode 100644 index 95848ad..0000000 --- a/src/lib/components/Intro.svelte +++ /dev/null @@ -1,112 +0,0 @@ - - - -
-
-
- -
- Profile - -
-

Hey! I'm Andrew.

-

- I'm a Full-Stack web developer. -

- - {#if data.song.isPlaying} - - - Now Playing: - {data.song.artist} - {data.song.title} - - - {/if} - -
- {#each skills as skill, index} - - {skill.alt} - - {#if skillsHalfwayPoint === index + 1} - - {/if} - {/each} -
- - -
- {#each links as link} - {#if link.icon} - - - - {/if} - {/each} -
-
-
- - diff --git a/src/lib/components/NowPlaying.svelte b/src/lib/components/NowPlaying.svelte new file mode 100644 index 0000000..5740273 --- /dev/null +++ b/src/lib/components/NowPlaying.svelte @@ -0,0 +1,62 @@ + + +
+
+ + Album cover for {song.song.title} + +
+ + {song.song.title} + + + + by  + {#each song.artists as artist, i} + + {artist.name} + + + {#if i !== song.artists.length - 1 && song.artists.length > 2}, {/if}{#if song.artists.length === 2} {/if}{#if i === song.artists.length - 2}and {/if} + + {/each} + +
+
+
diff --git a/src/lib/types.ts b/src/lib/types.ts index a357173..ef97531 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,10 +1,15 @@ -export type HomeLoadData = { - song: Song; -}; - export type Song = { - artist: string; isPlaying: boolean; - songUrl: string; - title: string; + artists: { + name: string; + url: string; + }[]; + song: { + title: string; + url: string; + }; + album: { + coverUrl: string; + url: string; + }; }; diff --git a/src/routes/+page.server.ts b/src/routes/+layout.server.ts similarity index 64% rename from src/routes/+page.server.ts rename to src/routes/+layout.server.ts index a3d3d8b..143afcb 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+layout.server.ts @@ -1,9 +1,9 @@ -import type { PageServerLoad } from './$types'; +import type { LayoutServerLoad } from './$types'; import { dev } from '$app/environment'; export const csr = dev; // homepage doesn't have any interactivity -export const load: PageServerLoad = async ({ fetch }) => { +export const load: LayoutServerLoad = async ({ fetch }) => { const song = await fetch('/api/spotify/np').then((r) => r.json()); return { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 727c8e4..f42ae2d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,18 +1,23 @@ - -
+
-
- + {#if data.song.isPlaying || dev} + + {/if} +
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 06f461d..bb626a3 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,10 +1,34 @@ @@ -14,7 +38,68 @@
-
- +
+ +
+
+
+
+ +
+ + + +
+

+ Hey! I'm Andrew + . +

+

+ I'm a Full-Stack + web developer. +

+ +
+ {#each skills as skill, index} + + {skill.alt} + + {#if skillsHalfwayPoint === index + 1} + + {/if} + {/each} +
+ + +
+ {#each links as link} + {#if link.icon} + + + + {/if} + {/each} +
+
+
+ + diff --git a/src/routes/api/spotify/np/+server.ts b/src/routes/api/spotify/np/+server.ts index dcb469e..5c005eb 100644 --- a/src/routes/api/spotify/np/+server.ts +++ b/src/routes/api/spotify/np/+server.ts @@ -40,14 +40,6 @@ const getNowPlaying = async () => { }); }; -const artistString = (artists: Artist[]): string => { - const combined = artists.map((a) => a.name).join(', '); - - // we only want the first artist's name if both combined are over 20 chars - if (combined.length > 20) return artists[0].name; - return combined; -}; - export async function GET() { const response = await getNowPlaying(); @@ -71,20 +63,32 @@ export async function GET() { } const isPlaying = song.is_playing; - let title = song.item.name; - const artist = artistString(song.item.artists); - const songUrl = song.item.external_urls.spotify; - if (title.length > 25) { - title = title.substring(0, 25) + '...'; + const artists = song.item.artists.map((a: Artist) => ({ + name: a.name, + url: a.external_urls.spotify + })); + + const songData = { + title: song.item.name, + url: song.item.external_urls.spotify + }; + + const album = { + coverUrl: song.item.album.images[0].url, + url: song.item.album.external_urls.spotify + }; + + if (songData.title.length > 25) { + songData.title = songData.title.substring(0, 25) + '...'; } return new Response( JSON.stringify({ - artist, isPlaying, - songUrl, - title + song, + artists, + album }), { headers: { diff --git a/svelte.config.js b/svelte.config.js index c87daf2..5eee040 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -3,16 +3,16 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors - // for more information about preprocessors - preprocess: vitePreprocess(), + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: vitePreprocess(), - kit: { - // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. - // If your environment is not supported or you settled on a specific environment, switch out the adapter. - // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter(), - } + kit: { + // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. + // If your environment is not supported or you settled on a specific environment, switch out the adapter. + // See https://kit.svelte.dev/docs/adapters for more information about adapters. + adapter: adapter() + } }; export default config; diff --git a/tailwind.config.js b/tailwind.config.js index 046bf83..bfe0bc2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,11 +1,8 @@ /** @type {import('tailwindcss').Config} */ export default { - content: [ - './src/**/*.{html,js,svelte,ts}', - ], - theme: { - extend: {}, - }, - plugins: [], -} - + content: ['./src/**/*.{html,js,svelte,ts}'], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/vite.config.ts b/vite.config.ts index 6d170a3..1d0a90d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,16 +1,16 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; -import { imagetools } from 'vite-imagetools'; -import tailwindcss from "@tailwindcss/vite"; +import tailwindcss from '@tailwindcss/vite'; +import { enhancedImages } from '@sveltejs/enhanced-img'; import Icons from 'unplugin-icons/vite'; export default defineConfig({ - plugins: [ - Icons({ - compiler: 'svelte' - }), - imagetools(), - sveltekit(), - tailwindcss(), - ] + plugins: [ + Icons({ + compiler: 'svelte' + }), + sveltekit(), + tailwindcss(), + enhancedImages() + ] }); -- 2.51.2