mirror of
https://github.com/BradNut/boredgame
synced 2025-09-08 17:40:22 +00:00
Adding media query plugin for showing skeletons and lazy image loading plugin.
This commit is contained in:
parent
87b8e5c073
commit
704ae0a541
11 changed files with 40 additions and 22 deletions
|
|
@ -45,6 +45,7 @@
|
||||||
"@types/feather-icons": "^4.7.0",
|
"@types/feather-icons": "^4.7.0",
|
||||||
"cookie": "^0.5.0",
|
"cookie": "^0.5.0",
|
||||||
"feather-icons": "^4.29.0",
|
"feather-icons": "^4.29.0",
|
||||||
|
"svelte-lazy-loader": "^1.0.0",
|
||||||
"svelte-media-query-store": "^1.0.0",
|
"svelte-media-query-store": "^1.0.0",
|
||||||
"zod": "^3.19.1",
|
"zod": "^3.19.1",
|
||||||
"zod-to-json-schema": "^3.18.1"
|
"zod-to-json-schema": "^3.18.1"
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ specifiers:
|
||||||
sass: ^1.56.0
|
sass: ^1.56.0
|
||||||
svelte: ^3.52.0
|
svelte: ^3.52.0
|
||||||
svelte-check: ^2.9.2
|
svelte-check: ^2.9.2
|
||||||
|
svelte-lazy-loader: ^1.0.0
|
||||||
svelte-media-query-store: ^1.0.0
|
svelte-media-query-store: ^1.0.0
|
||||||
svelte-preprocess: ^4.10.7
|
svelte-preprocess: ^4.10.7
|
||||||
tslib: ^2.4.1
|
tslib: ^2.4.1
|
||||||
|
|
@ -42,6 +43,7 @@ dependencies:
|
||||||
'@types/feather-icons': 4.7.0
|
'@types/feather-icons': 4.7.0
|
||||||
cookie: 0.5.0
|
cookie: 0.5.0
|
||||||
feather-icons: 4.29.0
|
feather-icons: 4.29.0
|
||||||
|
svelte-lazy-loader: 1.0.0
|
||||||
svelte-media-query-store: 1.0.0
|
svelte-media-query-store: 1.0.0
|
||||||
zod: 3.19.1
|
zod: 3.19.1
|
||||||
zod-to-json-schema: 3.18.1_zod@3.19.1
|
zod-to-json-schema: 3.18.1_zod@3.19.1
|
||||||
|
|
@ -2281,6 +2283,10 @@ packages:
|
||||||
svelte: 3.52.0
|
svelte: 3.52.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/svelte-lazy-loader/1.0.0:
|
||||||
|
resolution: {integrity: sha512-AZD6R60vksyojn21FgXLglmBiBB9K5Dkdu0hdGrLbCaRCYT68IsWkZfRUqKhMx1IfzqWcZQ8X9y/f+Ih0oNQkQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/svelte-media-query-store/0.0.3:
|
/svelte-media-query-store/0.0.3:
|
||||||
resolution: {integrity: sha512-LxM2AEyE4BqVHNdEb8aZOwcSf5oyJcZWSRlSkQPxnQyp6ytGwQs3gsmaZ1udEBeL7jHldWwNrbaFwAG5W7eTXw==}
|
resolution: {integrity: sha512-LxM2AEyE4BqVHNdEb8aZOwcSf5oyJcZWSRlSkQPxnQyp6ytGwQs3gsmaZ1udEBeL7jHldWwNrbaFwAG5W7eTXw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { createEventDispatcher } from 'svelte';
|
import { createEventDispatcher } from 'svelte';
|
||||||
|
import { Image } from 'svelte-lazy-loader';
|
||||||
import { fade } from 'svelte/transition';
|
import { fade } from 'svelte/transition';
|
||||||
import { MinusCircleIcon, PlusCircleIcon } from '@rgossiaux/svelte-heroicons/outline';
|
import { MinusCircleIcon, PlusCircleIcon } from '@rgossiaux/svelte-heroicons/outline';
|
||||||
import type { GameType, SavedGameType } from '$lib/types';
|
import type { GameType, SavedGameType } from '$lib/types';
|
||||||
|
|
@ -46,8 +47,14 @@
|
||||||
|
|
||||||
<article class="game-container" transition:fade>
|
<article class="game-container" transition:fade>
|
||||||
<h2>{game.name}</h2>
|
<h2>{game.name}</h2>
|
||||||
<a class="thumbnail" href={`/game/${game.id}`}>
|
<a
|
||||||
<img src={game.thumb_url} alt={`Image of ${game.name}`} />
|
class="thumbnail"
|
||||||
|
href={`/game/${game.id}`}
|
||||||
|
title={`View ${game.name}`}
|
||||||
|
data-sveltekit-prefetch
|
||||||
|
>
|
||||||
|
<Image src={game.thumb_url} alt={`Image of ${game.name}`} />
|
||||||
|
<!-- <img src={game.thumb_url} alt={`Image of ${game.name}`} /> -->
|
||||||
<!-- loading="lazy" decoding="async" -->
|
<!-- loading="lazy" decoding="async" -->
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
import { boredState } from '$lib/stores/boredState';
|
import { boredState } from '$lib/stores/boredState';
|
||||||
|
|
||||||
export let form: ActionData;
|
export let form: ActionData;
|
||||||
console.log('advanced search form data', form);
|
|
||||||
let submitting = $boredState?.loading;
|
let submitting = $boredState?.loading;
|
||||||
let minAge = +form?.minAge || 1;
|
let minAge = +form?.minAge || 1;
|
||||||
let minPlayers = +form?.minPlayers || 1;
|
let minPlayers = +form?.minPlayers || 1;
|
||||||
|
|
@ -78,9 +77,7 @@
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<!-- <button type="submit" disabled={submitting}>Submit</button> -->
|
|
||||||
|
|
||||||
<!-- </form> -->
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
fieldset {
|
fieldset {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,6 @@
|
||||||
boredState.update((n) => ({ ...n, loading: true }));
|
boredState.update((n) => ({ ...n, loading: true }));
|
||||||
return async ({ result }) => {
|
return async ({ result }) => {
|
||||||
boredState.update((n) => ({ ...n, loading: false }));
|
boredState.update((n) => ({ ...n, loading: false }));
|
||||||
// console.log('result main page search', result);
|
|
||||||
// `result` is an `ActionResult` object
|
// `result` is an `ActionResult` object
|
||||||
if (result.type === 'success') {
|
if (result.type === 'success') {
|
||||||
// console.log('In success');
|
// console.log('In success');
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
import { fade } from 'svelte/transition';
|
import { fade } from 'svelte/transition';
|
||||||
import { Disclosure, DisclosureButton, DisclosurePanel } from '@rgossiaux/svelte-headlessui';
|
import { Disclosure, DisclosureButton, DisclosurePanel } from '@rgossiaux/svelte-headlessui';
|
||||||
import { ChevronRightIcon } from '@rgossiaux/svelte-heroicons/solid';
|
import { ChevronRightIcon } from '@rgossiaux/svelte-heroicons/solid';
|
||||||
|
import { xl, md } from '$lib/stores/mediaQueryStore';
|
||||||
import { boredState } from '$lib/stores/boredState';
|
import { boredState } from '$lib/stores/boredState';
|
||||||
import AdvancedSearch from '$lib/components/search/advancedSearch/index.svelte';
|
import AdvancedSearch from '$lib/components/search/advancedSearch/index.svelte';
|
||||||
import { applyAction, enhance } from '$app/forms';
|
import { applyAction, enhance } from '$app/forms';
|
||||||
|
|
@ -34,13 +35,25 @@
|
||||||
let pageSize = 10;
|
let pageSize = 10;
|
||||||
let page = +form?.data?.page || 1;
|
let page = +form?.data?.page || 1;
|
||||||
let totalItems = form?.totalCount || data?.totalCount || 0;
|
let totalItems = form?.totalCount || data?.totalCount || 0;
|
||||||
|
let submitting = $boredState?.loading;
|
||||||
|
let name = form?.name || '';
|
||||||
|
let disclosureOpen = false;
|
||||||
|
|
||||||
$: skip = (page - 1) * pageSize;
|
$: skip = (page - 1) * pageSize;
|
||||||
$: console.log('submit button', submitButton);
|
$: console.log('submit button', submitButton);
|
||||||
$: showPagination = $gameStore?.length > 1;
|
$: showPagination = $gameStore?.length > 1;
|
||||||
|
|
||||||
let submitting = $boredState?.loading;
|
if ($xl) {
|
||||||
let name = form?.name || '';
|
numberOfGameSkeleton = 8;
|
||||||
let disclosureOpen = false;
|
} else if ($md) {
|
||||||
|
numberOfGameSkeleton = 3;
|
||||||
|
} else {
|
||||||
|
numberOfGameSkeleton = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let placeholderList = [...Array(numberOfGameSkeleton).keys()];
|
||||||
|
console.log(placeholderList);
|
||||||
|
|
||||||
if (form?.error) {
|
if (form?.error) {
|
||||||
disclosureOpen = true;
|
disclosureOpen = true;
|
||||||
}
|
}
|
||||||
|
|
@ -95,6 +108,7 @@
|
||||||
action="/search"
|
action="/search"
|
||||||
method="post"
|
method="post"
|
||||||
use:enhance={() => {
|
use:enhance={() => {
|
||||||
|
gameStore.removeAll();
|
||||||
boredState.update((n) => ({ ...n, loading: true }));
|
boredState.update((n) => ({ ...n, loading: true }));
|
||||||
return async ({ result }) => {
|
return async ({ result }) => {
|
||||||
boredState.update((n) => ({ ...n, loading: false }));
|
boredState.update((n) => ({ ...n, loading: false }));
|
||||||
|
|
@ -200,7 +214,7 @@
|
||||||
<div class="games">
|
<div class="games">
|
||||||
<h1>Games Found:</h1>
|
<h1>Games Found:</h1>
|
||||||
<div class="games-list">
|
<div class="games-list">
|
||||||
{#each [...Array(numberOfGameSkeleton).keys()] as game, i}
|
{#each placeholderList as game, i}
|
||||||
<SkeletonPlaceholder
|
<SkeletonPlaceholder
|
||||||
style="width: 100%; height: 500px; border-radius: var(--borderRadius);"
|
style="width: 100%; height: 500px; border-radius: var(--borderRadius);"
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,6 @@
|
||||||
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
export let form: ActionData;
|
export let form: ActionData;
|
||||||
// if ($xl) {
|
|
||||||
// numberOfGameSkeleton = 8;
|
|
||||||
// } else if ($md) {
|
|
||||||
// numberOfGameSkeleton = 3;
|
|
||||||
// } else {
|
|
||||||
// numberOfGameSkeleton = 1;
|
|
||||||
// }
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handlePerPageEvent(event: CustomEvent) {
|
async function handlePerPageEvent(event: CustomEvent) {
|
||||||
console.log('Per Page Event called', event.detail);
|
|
||||||
page = 1;
|
page = 1;
|
||||||
pageSize = event.detail.pageSize;
|
pageSize = event.detail.pageSize;
|
||||||
await tick();
|
await tick();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { fade, fly } from 'svelte/transition';
|
import { fade, fly } from 'svelte/transition';
|
||||||
|
import { Image } from 'svelte-lazy-loader';
|
||||||
import {
|
import {
|
||||||
ExternalLinkIcon,
|
ExternalLinkIcon,
|
||||||
MinusCircleIcon,
|
MinusCircleIcon,
|
||||||
|
|
@ -57,7 +58,8 @@
|
||||||
<section class="game">
|
<section class="game">
|
||||||
<div>
|
<div>
|
||||||
<a class="thumbnail" href={game.url}>
|
<a class="thumbnail" href={game.url}>
|
||||||
<img src={game.image_url} alt={`Image of ${game.name}`} />
|
<Image src={game.thumb_url} alt={`Image of ${game.name}`} />
|
||||||
|
<!-- <img src={game.image_url} alt={`Image of ${game.name}`} /> -->
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div style="display: grid; place-items: center; gap: 2rem;">
|
<div style="display: grid; place-items: center; gap: 2rem;">
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,10 @@ export const actions: Actions = {
|
||||||
if (minPlayers && maxPlayers) {
|
if (minPlayers && maxPlayers) {
|
||||||
if (+minPlayers > +maxPlayers) {
|
if (+minPlayers > +maxPlayers) {
|
||||||
return invalid(400, { minPlayers, error: { id: 'minPlayers', message: 'Min must be less than max' } });
|
return invalid(400, { minPlayers, error: { id: 'minPlayers', message: 'Min must be less than max' } });
|
||||||
} else if (maxPlayers < minPlayers) {
|
|
||||||
return invalid(400, { maxPlayers, error: { id: 'maxPlayers', message: 'Max must be greater than min' } });
|
|
||||||
}
|
}
|
||||||
|
// else if (+maxPlayers < +minPlayers) {
|
||||||
|
// return invalid(400, { maxPlayers, error: { id: 'maxPlayers', message: 'Max must be greater than min' } });
|
||||||
|
// }
|
||||||
if (exactMinPlayers) {
|
if (exactMinPlayers) {
|
||||||
queryParams.min_players = +minPlayers;
|
queryParams.min_players = +minPlayers;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handlePerPageEvent(event: CustomEvent) {
|
async function handlePerPageEvent(event: CustomEvent) {
|
||||||
console.log('Per Page Event called', event.detail);
|
|
||||||
page = 1;
|
page = 1;
|
||||||
pageSize = event.detail.pageSize;
|
pageSize = event.detail.pageSize;
|
||||||
await tick();
|
await tick();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue