From 85307b799581160c600140ce414b31da44dd5c8a Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Thu, 13 Nov 2025 16:40:31 -0700 Subject: [PATCH 1/3] store with downloads only --- webapp/src/App.vue | 1 + webapp/src/layouts/DefaultLayout.vue | 17 ++ webapp/src/router/index.ts | 8 + webapp/src/views/Store.vue | 315 +++++++++++++++++++++++++++ 4 files changed, 341 insertions(+) create mode 100644 webapp/src/layouts/DefaultLayout.vue create mode 100644 webapp/src/views/Store.vue diff --git a/webapp/src/App.vue b/webapp/src/App.vue index 37d26af..c9ba146 100644 --- a/webapp/src/App.vue +++ b/webapp/src/App.vue @@ -37,6 +37,7 @@ const items = [ { title: 'Home', icon: 'mdi-home', to: '/' }, { title: 'Map', icon: 'mdi-map', to: '/map' }, { title: 'Learn', icon: 'mdi-school', to: '/what-is-an-alpr' }, + { title: 'Store', icon: 'mdi-shopping', to: '/store' }, ] const contributeItems = [ diff --git a/webapp/src/layouts/DefaultLayout.vue b/webapp/src/layouts/DefaultLayout.vue new file mode 100644 index 0000000..2fa21ca --- /dev/null +++ b/webapp/src/layouts/DefaultLayout.vue @@ -0,0 +1,17 @@ + + + diff --git a/webapp/src/router/index.ts b/webapp/src/router/index.ts index 66770c1..d8b42c7 100644 --- a/webapp/src/router/index.ts +++ b/webapp/src/router/index.ts @@ -155,6 +155,14 @@ const router = createRouter({ title: 'Press | DeFlock' } }, + { + path: '/store', + name: 'store', + component: () => import('../views/Store.vue'), + meta: { + title: 'Store | DeFlock' + } + }, { path: '/:pathMatch(.*)*', name: 'not-found', diff --git a/webapp/src/views/Store.vue b/webapp/src/views/Store.vue new file mode 100644 index 0000000..ca1134a --- /dev/null +++ b/webapp/src/views/Store.vue @@ -0,0 +1,315 @@ + + + + + \ No newline at end of file From 89e7a587533ddf2a42986767a20f71bbeba76b9b Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Thu, 13 Nov 2025 18:16:46 -0700 Subject: [PATCH 2/3] add upload link --- webapp/src/views/Store.vue | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/webapp/src/views/Store.vue b/webapp/src/views/Store.vue index ca1134a..9a55565 100644 --- a/webapp/src/views/Store.vue +++ b/webapp/src/views/Store.vue @@ -179,6 +179,26 @@

No printables available

Check back later for new content!

+ + + +
+ + Submit Your Artwork + +

+ Have anti-ALPR artwork? Share it with the community! +

+
From a3321908a89c127367e7305fcdfaf12539225636 Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Thu, 13 Nov 2025 21:45:13 -0700 Subject: [PATCH 3/3] minor store fixes --- webapp/src/views/Store.vue | 44 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/webapp/src/views/Store.vue b/webapp/src/views/Store.vue index 9a55565..eb26488 100644 --- a/webapp/src/views/Store.vue +++ b/webapp/src/views/Store.vue @@ -29,7 +29,10 @@
-

Printables

+

Printables

+

+ Signs, stickers, zines, and more! +

@@ -81,6 +84,7 @@ :src="getImageUrl(printable.preview)" :alt="`${printable.title} preview`" aspect-ratio="1.414" + class="mt-4 mx-2" contain > - - - - {{ getTypeIcon(printable.type) }} - {{ printable.type }} -
@@ -110,6 +103,16 @@

{{ printable.title }}

+ + + + {{ getTypeIcon(printable.type) }} + {{ deCamel(printable.type) }} +
mdi-account @@ -133,10 +136,6 @@
-

- Download options: -

-
- Front Side + Front Side + Download => { } }; +const deCamel = (str: string): string => { + return str.replace(/([a-z])([A-Z])/g, '$1 $2'); +}; + const getImageUrl = (imageId: string): string => { if (!imageId) return ''; return `https://cms.deflock.me/assets/${imageId}`; @@ -277,21 +281,23 @@ const getImageUrl = (imageId: string): string => { const getTypeColor = (type: string): string => { const colors: Record = { poster: 'primary', + zine: 'success', yardSign: 'secondary', sticker: 'accent', bumperSticker: 'info' }; - return colors[type.toLowerCase()] || 'grey'; + return colors[type] || 'grey'; }; const getTypeIcon = (type: string): string => { const icons: Record = { poster: 'mdi-post', + zine: 'mdi-book-open-page-variant', yardSign: 'mdi-sign-real-estate', sticker: 'mdi-sticker-circle-outline', bumperSticker: 'mdi-rectangle-outline', }; - return icons[type.toLowerCase()] || 'mdi-file'; + return icons[type] || 'mdi-file'; }; const formatDate = (dateString: string): string => {