diff --git a/src/app.css b/src/app.css index 122c8d9..57f9aae 100644 --- a/src/app.css +++ b/src/app.css @@ -19,6 +19,7 @@ -webkit-box-shadow: 2px 2px 0px 0px #000000; } + .hovers-above, .hovers:focus, .hovers:hover { box-shadow: 3px 3px 0 #000000; diff --git a/src/lib/Foundation.svelte b/src/lib/Foundation.svelte deleted file mode 100644 index e66d0bb..0000000 --- a/src/lib/Foundation.svelte +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/src/lib/foundation/Button.svelte b/src/lib/components/Button/Button.svelte similarity index 96% rename from src/lib/foundation/Button.svelte rename to src/lib/components/Button/Button.svelte index e0c933d..b1e2512 100644 --- a/src/lib/foundation/Button.svelte +++ b/src/lib/components/Button/Button.svelte @@ -37,9 +37,9 @@ - \ No newline at end of file diff --git a/src/lib/components/Chooser/ChooserItem.svelte b/src/lib/components/Chooser/ChooserItem.svelte new file mode 100644 index 0000000..558b84f --- /dev/null +++ b/src/lib/components/Chooser/ChooserItem.svelte @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/src/lib/components/Chooser/index.ts b/src/lib/components/Chooser/index.ts new file mode 100644 index 0000000..64760d6 --- /dev/null +++ b/src/lib/components/Chooser/index.ts @@ -0,0 +1 @@ +export { default as Chooser } from "./Chooser.svelte"; \ No newline at end of file diff --git a/src/lib/foundation/Column.svelte b/src/lib/components/Column.svelte similarity index 100% rename from src/lib/foundation/Column.svelte rename to src/lib/components/Column.svelte diff --git a/src/lib/Head.svelte b/src/lib/components/Head.svelte similarity index 100% rename from src/lib/Head.svelte rename to src/lib/components/Head.svelte diff --git a/src/lib/LoadingIndicator.svelte b/src/lib/components/LoadingIndicator.svelte similarity index 85% rename from src/lib/LoadingIndicator.svelte rename to src/lib/components/LoadingIndicator.svelte index 533380a..f2cc2c0 100644 --- a/src/lib/LoadingIndicator.svelte +++ b/src/lib/components/LoadingIndicator.svelte @@ -1,5 +1,5 @@
diff --git a/src/lib/foundation/Row.svelte b/src/lib/components/Row.svelte similarity index 100% rename from src/lib/foundation/Row.svelte rename to src/lib/components/Row.svelte diff --git a/src/lib/foundation/TextInput.svelte b/src/lib/components/TextInput.svelte similarity index 87% rename from src/lib/foundation/TextInput.svelte rename to src/lib/components/TextInput.svelte index a89b626..5f780f9 100644 --- a/src/lib/foundation/TextInput.svelte +++ b/src/lib/components/TextInput.svelte @@ -20,7 +20,7 @@ on:change on:keyup={keyReleased} class:invalid - class="px-4 py-2 brutal hovers outline-none {customClass}" + class="w-full px-4 py-2 pl-10 brutal hovers outline-none {customClass}" /> \ No newline at end of file diff --git a/src/lib/icons/check.svg b/src/lib/icons/check.svg new file mode 100644 index 0000000..66c0f29 --- /dev/null +++ b/src/lib/icons/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/lib/icons/chevron.svg b/src/lib/icons/chevron.svg new file mode 100644 index 0000000..5de9afe --- /dev/null +++ b/src/lib/icons/chevron.svg @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/lib/icons/magnifying-glass.svg b/src/lib/icons/magnifying-glass.svg new file mode 100644 index 0000000..19b91c5 --- /dev/null +++ b/src/lib/icons/magnifying-glass.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/lib/language/translations.ts b/src/lib/language/translations.ts index bcf827c..b53277d 100644 --- a/src/lib/language/translations.ts +++ b/src/lib/language/translations.ts @@ -2,13 +2,27 @@ export default { en: { "Button.Home": "Home", "Button.WishList": "Wish List", - "Chooser.CategoryPrompt": "Choose a category:", + "Category": "Category", "Input.Search": "Search...", "No Results": "No Results", "Donate": "Donate", "Click to Donate": "Click to Donate", "Available": "Available", "Unavailable": "Unavailable", + "All": "All", + "DIY": "DIY", + "Media": "Media", + "Games": "Games", + "Outdoors": "Outdoors", + "Sports": "Sports", + "Entertainment": "Entertainment", + "Yard": "Yard", + "Cleaning": "Cleaning", + "Cooking": "Cooking", + "Crafts": "Crafts", + "Pet": "Pet", + "Automotive": "Automotive", + "Health": "Health", "How to Borrow": "How to Borrow", "How to Borrow.Step1": "Purchase a PVD Things membership and pay annual dues.", "How to Borrow.Step2": "Visit us at 12 Library Court in Providence.", @@ -22,7 +36,7 @@ export default { "Button.Home": "Inicio", "Button.Donate": "Donar", "Button.WishList": "Donaciones", - "Chooser.CategoryPrompt": "Elija una categoría:", + "Category": "Categoría", "Input.Search": "Buscar...", "No Results": "No hay resultados", "Donate": "Donar", diff --git a/src/lib/stores/catalog.ts b/src/lib/stores/catalog.ts new file mode 100644 index 0000000..ea227cd --- /dev/null +++ b/src/lib/stores/catalog.ts @@ -0,0 +1,23 @@ +import { defaultFilterCategory, filter } from "$lib/utils/filters"; +import { derived, writable } from "svelte/store"; + +export const categoryFilter = writable(defaultFilterCategory); + +export const searchFilter = writable(''); + +export const wishListFilter = writable(false); + +export const things = writable<[]>(undefined); + +export const filteredThings = derived( + [things, categoryFilter, searchFilter, wishListFilter], + ([$things, $categoryFilter, $searchFilter, $wishListFilter]) => { + return filter($things, { + keyword: $searchFilter, + onlyWishList: $wishListFilter, + category: $categoryFilter + }); + } +); + +export const categories = writable<[]>(undefined); \ No newline at end of file diff --git a/src/lib/filters.ts b/src/lib/utils/filters.ts similarity index 96% rename from src/lib/filters.ts rename to src/lib/utils/filters.ts index 60619a6..f67c824 100644 --- a/src/lib/filters.ts +++ b/src/lib/utils/filters.ts @@ -2,7 +2,7 @@ export const defaultFilterCategory = "All"; export const filter = (things, { keyword, onlyWishList, category }) => { - let filtered = things; + let filtered = things ?? []; if (category && category.toLowerCase() !== "all") filtered = filtered.filter(thing => thing.categories.includes(category)); diff --git a/src/lib/shuffle.ts b/src/lib/utils/shuffle.ts similarity index 100% rename from src/lib/shuffle.ts rename to src/lib/utils/shuffle.ts diff --git a/src/lib/views/CategoryChooserView.svelte b/src/lib/views/CategoryChooserView.svelte new file mode 100644 index 0000000..6f88d19 --- /dev/null +++ b/src/lib/views/CategoryChooserView.svelte @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/src/lib/views/SearchInputView.svelte b/src/lib/views/SearchInputView.svelte new file mode 100644 index 0000000..ec599d5 --- /dev/null +++ b/src/lib/views/SearchInputView.svelte @@ -0,0 +1,21 @@ + + +
+ searchIcon + + {#if $searchFilter.length > 0} + + {/if} +
diff --git a/src/lib/views/ThingsView.svelte b/src/lib/views/ThingsView.svelte new file mode 100644 index 0000000..dadc050 --- /dev/null +++ b/src/lib/views/ThingsView.svelte @@ -0,0 +1,6 @@ + + + diff --git a/src/lib/views/WishListButtonView.svelte b/src/lib/views/WishListButtonView.svelte new file mode 100644 index 0000000..7dc9cf4 --- /dev/null +++ b/src/lib/views/WishListButtonView.svelte @@ -0,0 +1,30 @@ + + + + +{#key $wishListFilter} + +{/key} \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 560f643..5a6d8bb 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,7 +1,7 @@ - import { onMount } from "svelte"; - import { defaultFilterCategory, filter } from "$lib/filters"; - import Things from "$lib/things/Things.svelte"; - import { Button, TextInput } from "$lib/Foundation.svelte"; - import { ButtonTheme } from "$lib/foundation/button"; - import LoadingIndicator from "$lib/LoadingIndicator.svelte"; - import Chooser from "$lib/foundation/Chooser.svelte"; - import EyeOffIcon from "$lib/icons/eye-off.svg"; - import EyeIcon from "$lib/icons/eye.svg"; - import { t } from "$lib/language/translate"; - import { goto } from '$app/navigation'; - import BorrowModal from "$lib/things/BorrowModal.svelte"; + import { onMount } from 'svelte'; + import { LoadingIndicator, TextInput } from '$lib/components'; + import { t } from '$lib/language/translate'; + import { BorrowModal } from '$lib/components/things/BorrowModal'; + import { categories, filteredThings, searchFilter, things, wishListFilter } from '$lib/stores/catalog'; + import ThingsView from '$lib/views/ThingsView.svelte'; + import WishListButtonView from '$lib/views/WishListButtonView.svelte'; + import CategoryChooserView from '$lib/views/CategoryChooserView.svelte'; + import SearchInputView from '$lib/views/SearchInputView.svelte'; - export let data; + export let data; - let shownThings = data.things; - let shownCategory = defaultFilterCategory; - let searchText = ""; - let showingOnlyWishList = false; + $things = data.things; + $categories = data.categories; - onMount(() => { - const urlParams = new URLSearchParams(window.location.search); - showingOnlyWishList = urlParams.get('showWishList') === 'true'; - filterThings(); - }); - - const filterThings = () => { - shownThings = filter(data.things, { - keyword: searchText, - onlyWishList: showingOnlyWishList, - category: shownCategory - }); - } - - const filterThingsByCategory = (event) => { - shownCategory = event.detail; - filterThings(); - } - - const toggleWishList = () => { - showingOnlyWishList = !showingOnlyWishList; - goto(`?showWishList=${showingOnlyWishList}`); - filterThings(); - } + onMount(() => { + const urlParams = new URLSearchParams(window.location.search); + $wishListFilter = urlParams.get('showWishList') === 'true'; + });
- {#if !data} - - {:else} - -
-
- - {#key showingOnlyWishList} - - {/key} -
- -
-
- {#if shownThings.length > 0} - - {:else} -
{$t("No Results")}
- {/if} -
- {/if} -
\ No newline at end of file + {#if !data} + + {:else} + +
+
+ + +
+ +
+
+ {#if $filteredThings.length > 0} + + {:else} +
{$t('No Results')}
+ {/if} +
+ {/if} +