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 @@
+
+
+
+

+
+ {#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}
+