From 2a49018c5ea06fbffbb4c880abc53fd8d880a61e Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sun, 5 Jul 2026 14:51:06 +0700 Subject: [PATCH] refactor: update MediaDropzone and ProductModal components for improved layout and responsiveness; adjust styles for placeholders, overlays, and modal elements to enhance user experience across different screen sizes --- .../js/components/media/MediaDropzone.vue | 62 ++++++++++++++----- .../js/components/modal/ProductModal.vue | 51 +++++++-------- resources/js/pages/Home.vue | 3 +- .../form/PurchasePosAddVariantDialog.vue | 2 +- .../form/PurchasePosCartDetailDialog.vue | 2 +- 5 files changed, 78 insertions(+), 42 deletions(-) diff --git a/resources/js/components/media/MediaDropzone.vue b/resources/js/components/media/MediaDropzone.vue index cf15dec..8f460b3 100644 --- a/resources/js/components/media/MediaDropzone.vue +++ b/resources/js/components/media/MediaDropzone.vue @@ -505,23 +505,37 @@ watch( /* === Placeholder inside slot === */ .dz-placeholder { display: flex; - flex-direction: row; + flex-direction: column; align-items: center; - gap: 0.75rem; - padding: 0.75rem 1rem; + justify-content: center; + text-align: center; + gap: 0.5rem; + padding: 1rem; width: 100%; min-width: 0; cursor: pointer; overflow: hidden; } +@media (min-width: 640px) { + .dz-placeholder { + flex-direction: row; + align-items: center; + text-align: left; + gap: 0.75rem; + padding: 0.75rem 1rem; + } +} + /* === Overlay (shown when previews exist) === */ .dz-overlay { display: flex; - flex-direction: row; + flex-direction: column; align-items: center; - gap: 0.75rem; - padding: 0.75rem 1rem; + justify-content: center; + text-align: center; + gap: 0.5rem; + padding: 1rem; width: 100%; cursor: pointer; border: 2px dashed var(--border); @@ -533,6 +547,16 @@ watch( box-sizing: border-box; } +@media (min-width: 640px) { + .dz-overlay { + flex-direction: row; + align-items: center; + text-align: left; + gap: 0.75rem; + padding: 0.75rem 1rem; + } +} + .dz-overlay:hover { border-color: var(--primary); background: color-mix(in oklch, var(--muted) 80%, transparent); @@ -549,43 +573,53 @@ watch( font-size: 0.875rem; font-weight: 500; color: var(--foreground); - white-space: nowrap; flex-shrink: 0; } +@media (min-width: 640px) { + .dz-placeholder-primary { + white-space: nowrap; + } +} + .dz-placeholder-secondary { font-size: 0.75rem; color: var(--muted-foreground); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; min-width: 0; flex: 1; } +@media (min-width: 640px) { + .dz-placeholder-secondary { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + /* ---- Preview grid — multiple mode (default) ---- */ .preview-grid { display: grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; margin-top: 0.75rem; } @media (min-width: 400px) { .preview-grid { - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(4, minmax(0, 1fr)); } } @media (min-width: 560px) { .preview-grid { - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(5, minmax(0, 1fr)); } } @media (min-width: 720px) { .preview-grid { - grid-template-columns: repeat(6, 1fr); + grid-template-columns: repeat(6, minmax(0, 1fr)); } } diff --git a/resources/js/components/modal/ProductModal.vue b/resources/js/components/modal/ProductModal.vue index df1b1eb..ebde542 100644 --- a/resources/js/components/modal/ProductModal.vue +++ b/resources/js/components/modal/ProductModal.vue @@ -2,7 +2,8 @@ import { X } from '@lucide/vue'; import { ref, computed, watch } from 'vue'; import { formatRupiah } from '@/lib/rupiah'; -import type { Product, Variant, Price, MediaItem } from '@/types/product'; +import type { Product, Variant, Price } from '@/types/product'; +import type { MediaItem } from '@/types/media'; const props = defineProps<{ product: Product | null; @@ -95,21 +96,27 @@ const handleAddToCart = () => {