-
Add Photo for {{this.title}}
+
Add Photos for {{this.title}}
{{#if this.error}}
@@ -222,38 +174,53 @@ export default class PlacePhotoUpload extends Component {
{{/if}}
-
- {{#if this.photoUrl}}
-
-
Photo Preview:
-

-
-
- {{else}}
-
-
- {{#if this.isUploading}}
-
Uploading...
- {{/if}}
- {{/if}}
+
+
+
+
+ {{#if this.files.length}}
+
+ {{#each this.files as |file|}}
+
+ {{/each}}
+
+
+
+ {{/if}}
}
diff --git a/app/styles/app.css b/app/styles/app.css
index 4416dad..9389054 100644
--- a/app/styles/app.css
+++ b/app/styles/app.css
@@ -210,6 +210,118 @@ body {
height: auto;
}
+.dropzone {
+ border: 2px dashed #3a4b5c;
+ border-radius: 8px;
+ padding: 30px 20px;
+ text-align: center;
+ transition: all 0.2s ease;
+ margin-bottom: 20px;
+ background-color: rgb(255 255 255 / 2%);
+ cursor: pointer;
+}
+
+.dropzone.is-dragging {
+ border-color: #61afef;
+ background-color: rgb(97 175 239 / 5%);
+}
+
+.dropzone-label {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 12px;
+ cursor: pointer;
+ color: #a0aec0;
+}
+
+.dropzone-label p {
+ margin: 0;
+ font-size: 1.1rem;
+}
+
+.file-input-hidden {
+ display: none;
+}
+
+.photo-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+ gap: 12px;
+ margin-bottom: 20px;
+}
+
+.photo-item {
+ position: relative;
+ aspect-ratio: 1 / 1;
+ border-radius: 6px;
+ overflow: hidden;
+ background: #1e262e;
+}
+
+.photo-item-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+}
+
+.photo-item-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgb(0 0 0 / 60%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.error-overlay {
+ background: rgb(224 108 117 / 80%);
+}
+
+.success-overlay {
+ background: rgb(152 195 121 / 60%);
+}
+
+.btn-remove-photo {
+ position: absolute;
+ top: 4px;
+ right: 4px;
+ background: rgb(0 0 0 / 70%);
+ border: none;
+ border-radius: 50%;
+ width: 24px;
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ color: white;
+ padding: 0;
+}
+
+.btn-remove-photo:hover {
+ background: rgb(224 108 117 / 90%);
+}
+
+.spin-animation {
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ from {
+ transform: rotate(0deg);
+ }
+
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.btn-publish {
+ width: 100%;
+}
+
/* User Menu Popover */
.user-menu-container {
position: relative;
diff --git a/app/utils/icons.js b/app/utils/icons.js
index 717b9e8..f2b3029 100644
--- a/app/utils/icons.js
+++ b/app/utils/icons.js
@@ -26,8 +26,12 @@ import search from 'feather-icons/dist/icons/search.svg?raw';
import server from 'feather-icons/dist/icons/server.svg?raw';
import settings from 'feather-icons/dist/icons/settings.svg?raw';
import target from 'feather-icons/dist/icons/target.svg?raw';
+import trash2 from 'feather-icons/dist/icons/trash-2.svg?raw';
+import uploadCloud from 'feather-icons/dist/icons/upload-cloud.svg?raw';
import user from 'feather-icons/dist/icons/user.svg?raw';
import x from 'feather-icons/dist/icons/x.svg?raw';
+import check from 'feather-icons/dist/icons/check.svg?raw';
+import alertCircle from 'feather-icons/dist/icons/alert-circle.svg?raw';
import zap from 'feather-icons/dist/icons/zap.svg?raw';
import angelfish from '@waysidemapping/pinhead/dist/icons/angelfish.svg?raw';
@@ -130,6 +134,8 @@ const ICONS = {
'check-square': checkSquare,
'cigarette-with-smoke-curl': cigaretteWithSmokeCurl,
climbing_wall: climbingWall,
+ check,
+ 'alert-circle': alertCircle,
'classical-building': classicalBuilding,
'classical-building-with-dome-and-flag': classicalBuildingWithDomeAndFlag,
'classical-building-with-flag': classicalBuildingWithFlag,
@@ -214,6 +220,8 @@ const ICONS = {
'tattoo-machine': tattooMachine,
toolbox,
target,
+ 'trash-2': trash2,
+ 'upload-cloud': uploadCloud,
'tree-and-bench-with-backrest': treeAndBenchWithBackrest,
user,
'village-buildings': villageBuildings,