diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index b3f385b..706f94d 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -8,6 +8,8 @@ permissions: contents: read pages: write id-token: write + issues: write + pull-requests: write concurrency: group: "pages-preview-${{ github.event.pull_request.number }}" diff --git a/package.json b/package.json index f753101..f077d36 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.0.12", - "devicon": "^2.16.0", + "devicon": "^2.17.0", "tailwindcss": "^4.0.12" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4749b4..9d58db4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^4.0.12 version: 4.0.12(vite@6.3.6(jiti@2.4.2)(lightningcss@1.29.2)) devicon: - specifier: ^2.16.0 - version: 2.16.0 + specifier: ^2.17.0 + version: 2.17.0 tailwindcss: specifier: ^4.0.12 version: 4.0.12 @@ -505,8 +505,8 @@ packages: devalue@5.3.2: resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} - devicon@2.16.0: - resolution: {integrity: sha512-PE5a2HBNeN4av+Iu975OiiWEwS8LJPw5HAvlv0JUHb62jZTdYxTpz4ga+cQyvdtb3x1side2P9Sr1mmOmUkO/g==} + devicon@2.17.0: + resolution: {integrity: sha512-2nKUdjobJlmRSaCHa50PGsVq0VDURnq9gVzQoJggsM/NKN0tLhC/Uq2zmy2pH36Q/1q3gvYwp/GjTgv/R0Ysbg==} enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} @@ -1081,7 +1081,7 @@ snapshots: devalue@5.3.2: {} - devicon@2.16.0: {} + devicon@2.17.0: {} enhanced-resolve@5.18.1: dependencies: diff --git a/src/lib/stores/iconStore.js b/src/lib/stores/iconStore.js index 8ebac0f..7f5eeca 100644 --- a/src/lib/stores/iconStore.js +++ b/src/lib/stores/iconStore.js @@ -9,21 +9,50 @@ export const isDarkMode = writable(false); export const selectedIcon = writable(null); export const isModalOpen = writable(false); -// Initialize store with data from server -export function initializeStore(initialIcons, initialTags) { - icons.set(initialIcons); - availableTags.set(initialTags); - - // Check local storage for dark mode preference - if (typeof window !== 'undefined') { - const storedDarkMode = localStorage.getItem('darkMode') === 'true'; - isDarkMode.set(storedDarkMode); - - // Apply theme to document - if (storedDarkMode) { - document.documentElement.classList.add('dark'); - } +// Load icons data from GitHub API +export async function loadIconsData() { + try { + const response = await fetch('https://raw.githubusercontent.com/devicons/devicon/master/devicon.json'); + + if (!response.ok) { + throw new Error(`Failed to fetch icons: ${response.statusText}`); + } + + const iconsData = await response.json(); + + // Extract all available tags + const availableTagsData = new Set(); + iconsData.forEach(icon => { + if (icon.tags && Array.isArray(icon.tags)) { + icon.tags.forEach(tag => availableTagsData.add(tag)); } + }); + + // Set the data in stores + icons.set(iconsData); + availableTags.set(Array.from(availableTagsData).sort()); + + return { icons: iconsData, availableTags: Array.from(availableTagsData).sort() }; + } catch (error) { + console.error('Error fetching icons:', error); + icons.set([]); + availableTags.set([]); + throw error; + } +} + +// Initialize store with dark mode preference +export function initializeStore() { + // Check local storage for dark mode preference + if (typeof window !== 'undefined') { + const storedDarkMode = localStorage.getItem('darkMode') === 'true'; + isDarkMode.set(storedDarkMode); + + // Apply theme to document + if (storedDarkMode) { + document.documentElement.classList.add('dark'); + } + } } // Derived store for filtered icons diff --git a/src/routes/+page.server.js b/src/routes/+page.server.js deleted file mode 100644 index 2232f1b..0000000 --- a/src/routes/+page.server.js +++ /dev/null @@ -1,31 +0,0 @@ -export async function load() { - try { - const response = await fetch('https://raw.githubusercontent.com/devicons/devicon/master/devicon.json'); - - if (!response.ok) { - throw new Error(`Failed to fetch icons: ${response.statusText}`); - } - - const icons = await response.json(); - - // Extract all available tags - const availableTags = new Set(); - icons.forEach(icon => { - if (icon.tags && Array.isArray(icon.tags)) { - icon.tags.forEach(tag => availableTags.add(tag)); - } - }); - - return { - icons, - availableTags: Array.from(availableTags).sort() - }; - } catch (error) { - console.error('Error fetching icons:', error); - return { - icons: [], - availableTags: [], - error: error.message - }; - } - } \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index f423849..a8b37b6 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -5,15 +5,26 @@ import IconModal from "../components/IconModal.svelte"; import { initializeStore, + loadIconsData, filteredIcons, isModalOpen, } from "$lib/stores/iconStore"; - export let data; + let isLoading = true; + let error = null; - onMount(() => { - // Initialize store with server-fetched data - initializeStore(data.icons, data.availableTags); + onMount(async () => { + // Initialize store with dark mode preference + initializeStore(); + + try { + // Load icons data from GitHub API + await loadIconsData(); + isLoading = false; + } catch (err) { + error = err.message; + isLoading = false; + } }); @@ -22,9 +33,16 @@ >
- {#if data.error} + {#if isLoading} +
+
+
+

Loading icons...

+
+
+ {:else if error}
-

Error: {data.error}

+

Error: {error}

{:else}