├── docker-compose.yml
├── public
├── bg.jpg
├── 404.webp
├── avatar.jpg
├── vercel.svg
├── window.svg
├── file.svg
├── Apple_logo.svg
├── Lumix_logo.svg
├── globe.svg
├── DJI_logo.svg
└── next.svg
├── src
├── app
│ ├── favicon.ico
│ ├── api
│ │ ├── auth
│ │ │ └── [...all]
│ │ │ │ └── route.ts
│ │ └── trpc
│ │ │ └── [trpc]
│ │ │ └── route.ts
│ ├── (dashboard)
│ │ ├── dashboard
│ │ │ ├── posts
│ │ │ │ ├── new
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── page.tsx
│ │ │ │ └── [slug]
│ │ │ │ │ └── page.tsx
│ │ │ ├── cities
│ │ │ │ ├── [city]
│ │ │ │ │ └── page.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── profile
│ │ │ │ └── page.tsx
│ │ │ ├── photos
│ │ │ │ ├── [id]
│ │ │ │ │ └── page.tsx
│ │ │ │ └── page.tsx
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ ├── (home)
│ │ ├── layout.tsx
│ │ ├── discover
│ │ │ └── page.tsx
│ │ ├── blog
│ │ │ ├── page.tsx
│ │ │ └── [slug]
│ │ │ │ └── page.tsx
│ │ └── travel
│ │ │ ├── page.tsx
│ │ │ └── [city]
│ │ │ └── page.tsx
│ ├── (auth)
│ │ ├── layout.tsx
│ │ └── sign-in
│ │ │ └── page.tsx
│ ├── (photograph)
│ │ ├── screensaver
│ │ │ └── page.tsx
│ │ └── p
│ │ │ └── [id]
│ │ │ └── page.tsx
│ └── layout.tsx
├── modules
│ ├── auth
│ │ ├── lib
│ │ │ ├── auth-types.ts
│ │ │ ├── auth-client.ts
│ │ │ ├── get-session.ts
│ │ │ ├── auth.ts
│ │ │ └── utils.ts
│ │ └── ui
│ │ │ └── components
│ │ │ └── user-button.tsx
│ ├── discover
│ │ ├── ui
│ │ │ └── components
│ │ │ │ ├── index.ts
│ │ │ │ ├── photo-popup.tsx
│ │ │ │ ├── photo-marker.tsx
│ │ │ │ └── cluster-marker.tsx
│ │ ├── types.ts
│ │ ├── server
│ │ │ └── procedures.ts
│ │ └── hooks
│ │ │ └── use-photo-clustering.ts
│ ├── blog
│ │ ├── types.ts
│ │ ├── ui
│ │ │ └── components
│ │ │ │ ├── latest-travel-card.tsx
│ │ │ │ ├── latest-blog-section.tsx
│ │ │ │ └── blog-items.tsx
│ │ └── server
│ │ │ └── procedures.ts
│ ├── travel
│ │ ├── types.ts
│ │ ├── ui
│ │ │ └── components
│ │ │ │ ├── introduction.tsx
│ │ │ │ ├── cover-photo.tsx
│ │ │ │ └── city-item.tsx
│ │ └── server
│ │ │ └── procedures.ts
│ ├── photos
│ │ ├── types.ts
│ │ ├── params.ts
│ │ ├── ui
│ │ │ └── components
│ │ │ │ ├── create-photo-modal.tsx
│ │ │ │ ├── photos-search-filter.tsx
│ │ │ │ ├── multi-step-form
│ │ │ │ └── components
│ │ │ │ │ ├── progress-bar.tsx
│ │ │ │ │ ├── success-screen.tsx
│ │ │ │ │ └── step-indicator.tsx
│ │ │ │ ├── photo-uploader.tsx
│ │ │ │ ├── photo-upload-modal.tsx
│ │ │ │ ├── delete-photo-button.tsx
│ │ │ │ └── favorite-toggle.tsx
│ │ └── hooks
│ │ │ └── use-photos-filters.ts
│ ├── s3
│ │ └── lib
│ │ │ ├── key-to-url.ts
│ │ │ └── server-client.ts
│ ├── posts
│ │ ├── ui
│ │ │ ├── views
│ │ │ │ ├── new-post-view.tsx
│ │ │ │ ├── post-view.tsx
│ │ │ │ └── dashboard-post-view.tsx
│ │ │ └── components
│ │ │ │ ├── posts-search-filter.tsx
│ │ │ │ ├── dashboard-post-view-header.tsx
│ │ │ │ ├── columns.tsx
│ │ │ │ ├── posts-list-header.tsx
│ │ │ │ └── delete-post-button.tsx
│ │ ├── types.ts
│ │ ├── hooks
│ │ │ └── use-posts-filters.ts
│ │ ├── params.ts
│ │ ├── schemas.ts
│ │ └── lib
│ │ │ └── utils.ts
│ ├── dashboard
│ │ ├── types.ts
│ │ └── ui
│ │ │ └── components
│ │ │ └── dashboard-sidebar
│ │ │ ├── icon-map.tsx
│ │ │ └── nav-secondary.tsx
│ ├── cities
│ │ ├── types.ts
│ │ └── ui
│ │ │ ├── components
│ │ │ └── city-card.tsx
│ │ │ └── views
│ │ │ └── city-list-view.tsx
│ ├── home
│ │ ├── ui
│ │ │ ├── components
│ │ │ │ ├── header
│ │ │ │ │ ├── logo.tsx
│ │ │ │ │ ├── navbar.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── mobile-menu-button.tsx
│ │ │ │ ├── camera-card.tsx
│ │ │ │ ├── latest-travel-card.tsx
│ │ │ │ ├── vector-top-left-animation.tsx
│ │ │ │ ├── about-card.tsx
│ │ │ │ ├── city-card.tsx
│ │ │ │ └── word-rotate.tsx
│ │ │ └── views
│ │ │ │ └── cities-view.tsx
│ │ └── server
│ │ │ └── procedures.ts
│ └── mapbox
│ │ └── hooks
│ │ └── use-get-address.ts
├── constants.ts
├── components
│ ├── ui
│ │ ├── aspect-ratio.tsx
│ │ ├── skeleton.tsx
│ │ ├── spinner.tsx
│ │ ├── label.tsx
│ │ ├── separator.tsx
│ │ ├── textarea.tsx
│ │ ├── progress.tsx
│ │ ├── input.tsx
│ │ ├── collapsible.tsx
│ │ ├── kbd.tsx
│ │ ├── sonner.tsx
│ │ ├── switch.tsx
│ │ ├── avatar.tsx
│ │ ├── checkbox.tsx
│ │ ├── radio-group.tsx
│ │ ├── hover-card.tsx
│ │ ├── toggle.tsx
│ │ ├── badge.tsx
│ │ ├── popover.tsx
│ │ ├── alert.tsx
│ │ ├── scroll-area.tsx
│ │ ├── password-input.tsx
│ │ ├── tooltip.tsx
│ │ ├── tabs.tsx
│ │ ├── resizable.tsx
│ │ └── slider.tsx
│ ├── theme-provider.tsx
│ ├── card-container.tsx
│ ├── footer
│ │ └── footer-nav.tsx
│ ├── editor
│ │ ├── toolbars
│ │ │ ├── toolbar-provider.tsx
│ │ │ ├── hard-break.tsx
│ │ │ ├── horizontal-rule.tsx
│ │ │ ├── undo.tsx
│ │ │ ├── redo.tsx
│ │ │ ├── image-placeholder-toolbar.tsx
│ │ │ ├── code.tsx
│ │ │ ├── code-block.tsx
│ │ │ ├── bold.tsx
│ │ │ ├── bullet-list.tsx
│ │ │ ├── blockquote.tsx
│ │ │ ├── italic.tsx
│ │ │ ├── ordered-list.tsx
│ │ │ └── strikethrough.tsx
│ │ └── extensions
│ │ │ └── font-size.ts
│ ├── graphic.tsx
│ ├── marquee-card.tsx
│ ├── data-pagination.tsx
│ ├── vector-combined.tsx
│ ├── empty-state.tsx
│ ├── link-rotate.tsx
│ ├── responsive-modal.tsx
│ ├── framed-photo.tsx
│ ├── flip-link.tsx
│ ├── theme-toggle.tsx
│ ├── contact-card.tsx
│ ├── blur-image.tsx
│ └── tech-marquee.tsx
├── hooks
│ ├── use-modal.ts
│ ├── use-mobile.ts
│ └── use-confirm.tsx
├── db
│ └── index.ts
├── trpc
│ ├── query-client.ts
│ ├── server.tsx
│ ├── init.ts
│ └── routers
│ │ └── _app.ts
├── proxy.ts
└── lib
│ ├── cloudflare-image-loader.ts
│ └── get-strict-context.ts
├── postcss.config.mjs
├── drizzle.config.ts
├── components.json
├── .env.example
├── eslint.config.mjs
├── .gitignore
├── Dockerfile
├── tsconfig.json
├── next.config.ts
├── scripts
└── seed-user.ts
├── docker-compose.cloud.yml
├── LICENSE
└── CHANGELOG.md
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | docker-compose.standalone.yml
--------------------------------------------------------------------------------
/public/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ECarry/photography-website/HEAD/public/bg.jpg
--------------------------------------------------------------------------------
/public/404.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ECarry/photography-website/HEAD/public/404.webp
--------------------------------------------------------------------------------
/public/avatar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ECarry/photography-website/HEAD/public/avatar.jpg
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ECarry/photography-website/HEAD/src/app/favicon.ico
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: {
3 | "@tailwindcss/postcss": {},
4 | },
5 | };
6 |
7 | export default config;
8 |
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/modules/auth/lib/auth-types.ts:
--------------------------------------------------------------------------------
1 | import type { auth } from "./auth";
2 |
3 | export type Session = typeof auth.$Infer.Session;
4 | export type User = typeof auth.$Infer.Session.user;
5 |
--------------------------------------------------------------------------------
/src/modules/discover/ui/components/index.ts:
--------------------------------------------------------------------------------
1 | export { PhotoMarker } from "./photo-marker";
2 | export { ClusterMarker } from "./cluster-marker";
3 | export { PhotoPopup } from "./photo-popup";
4 |
--------------------------------------------------------------------------------
/src/app/api/auth/[...all]/route.ts:
--------------------------------------------------------------------------------
1 | import { auth } from "@/modules/auth/lib/auth";
2 | import { toNextJsHandler } from "better-auth/next-js";
3 |
4 | export const { GET, POST } = toNextJsHandler(auth.handler);
5 |
--------------------------------------------------------------------------------
/src/app/(dashboard)/dashboard/posts/new/page.tsx:
--------------------------------------------------------------------------------
1 | import { NewPostView } from "@/modules/posts/ui/views/new-post-view";
2 |
3 | const page = () => {
4 | return
9 | Exploring the world one step at a time, capturing life through street 10 | photography and city walks. From bustling urban corners to hidden 11 | alleyways, every journey tells a unique story through the lens. 12 |
13 |14 | I have a passion for photography and camera lenses. I use a variety 15 | of lenses to capture the beauty of nature and people in their 16 | different moments. 17 |
18 |{photo.title}
21 |Latest Travel
9 |Latest Travel
9 |{title}
14 |22 | Your photo has been uploaded successfully. 23 |
24 | 25 |10 | With a focus on both candid moments and stunning landscapes, I 11 | strive to evoke emotion and tell stories through my work. My 12 | photography blends the rawness of everyday life with the artistry of 13 | fine art, allowing viewers to connect with each image on a deeper 14 | level. 15 |
16 | 17 |18 | Whether I'm exploring urban environments or venturing into 19 | nature, my goal is to highlight the extraordinary in the ordinary. 20 | Through my lens, I invite you to join me on this visual journey of 21 | discovery and inspiration. 22 |
23 |27 | Manage your profile, password, and active sessions 28 |
29 |27 | Explore your photos organized by cities you've visited 28 |
29 |{title}
25 | 26 | ) : ( 27 |{title}
28 | )} 29 |{description}
56 | )} 57 |{city.city}
20 |28 | Here's a list of your posts 29 |
30 |37 | {city} 38 |
39 |44 | {photoCount} 45 |
46 |{title}
38 | 39 |33 | See your photos, travel history, and more. 34 |
35 |No blog available
20 |19 | Upload photos with location data to see your city collection 20 |
21 |Failed to load cities
52 |53 | Please try refreshing the page 54 |
55 |