@@ -117,9 +123,10 @@
@@ -432,160 +652,208 @@ onUnmounted(() => {
opacity: 0.95;
}
-/* ========== QUEUE GRID CONTAINER ========== */
-.queue-grid-container {
+/* ========== LOKET GRID CONTAINER ========== */
+.loket-grid-container {
flex: 1 1 auto;
display: flex;
flex-direction: column;
margin-bottom: 24px;
- background: #FFFFFF;
- border-radius: 20px;
- border: 2px solid var(--color-primary-200);
- overflow: auto;
- padding: 24px;
min-height: 0;
- max-height: calc(100vh - 280px);
box-sizing: border-box;
- box-shadow: 0 4px 16px rgba(25, 118, 210, 0.08);
}
-.loket-header {
- background: linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-primary-700) 100%);
- padding: 16px 20px;
- text-align: center;
- border-radius: 12px;
- margin-bottom: 20px;
- flex-shrink: 0;
- height: 70px;
+.lokets-grid {
+ display: grid;
+ gap: 16px;
+ width: 100%;
+ box-sizing: border-box;
+ /* grid-template-columns is set dynamically via :style binding */
+}
+
+.loket-card {
+ background: #FFFFFF;
+ border-radius: 8px;
+ border: 1px solid #E0E0E0;
+ overflow: hidden;
display: flex;
- align-items: center;
- justify-content: center;
- box-sizing: border-box;
+ flex-direction: column;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ min-height: 400px;
+ /* Calculate: viewport - header (~120px) - footer (100px) - container padding (48px) - margins (44px) */
+ max-height: calc(100vh - 312px);
}
-.loket-header .loket-title {
- font-size: 36px;
- font-weight: 800;
- color: #FFFFFF;
- margin: 0;
+/* Loket Header */
+.loket-header-bar {
+ background: #FFFFFF;
+ padding: 16px 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-bottom: 3px solid #FF9B1B;
+ flex-shrink: 0;
+}
+
+.loket-name {
+ font-size: 20px;
+ font-weight: 700;
+ color: #212121;
letter-spacing: 0.5px;
text-transform: uppercase;
-}
-
-/* Patient Cards Grid - Fixed for 1920x1080, 5 columns */
-.patient-cards-grid {
- display: grid;
- grid-template-columns: repeat(5, 1fr);
- gap: 20px;
flex: 1;
- overflow: hidden;
- padding: 0;
- width: 100%;
- box-sizing: border-box;
- align-content: start;
- height: 100%;
}
-.patient-card-display {
- position: relative;
- border-radius: 16px;
- border: 2px solid var(--color-primary-200);
- background: #FFFFFF;
- transition: all 0.3s ease;
- height: 100%;
- min-height: 280px;
- display: flex;
- flex-direction: column;
- box-shadow: 0 4px 16px rgba(25, 118, 210, 0.08);
- width: 100%;
- box-sizing: border-box;
-}
-
-.patient-card-display:hover {
- box-shadow: 0 8px 24px rgba(25, 118, 210, 0.15);
- transform: translateY(-2px);
- border-color: var(--color-primary-600);
-}
-
-.card-text-content {
- padding: 20px !important;
- height: 100%;
- display: flex;
- box-sizing: border-box;
-}
-
-.card-content {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- flex: 1;
- gap: 12px;
- text-align: center;
- width: 100%;
-}
-
-.queue-number-large {
- font-size: 72px;
- font-weight: 900;
- color: #212121;
- letter-spacing: 2px;
- line-height: 1;
-}
-
-.fast-track-badge {
+.queue-count {
display: flex;
align-items: center;
+ gap: 6px;
+ background: var(--color-primary-600);
+ padding: 6px 12px;
+ border-radius: 20px;
+ min-width: 50px;
justify-content: center;
}
-.fast-track-icon {
- animation: pulse 2s ease-in-out infinite;
+.queue-count .v-icon {
+ color: white !important;
}
-@keyframes pulse {
- 0%, 100% {
- opacity: 1;
- transform: scale(1);
- }
- 50% {
- opacity: 0.7;
- transform: scale(1.1);
- }
-}
-
-.klinik-info {
- margin-top: 8px;
-}
-
-.klinik-chip-large {
- font-size: 14px;
+.count-number {
+ font-size: 16px;
font-weight: 700;
- padding: 6px 14px;
- border: 2px solid var(--color-primary-600);
- color: var(--color-primary-600);
- height: auto;
- white-space: nowrap;
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- background: rgba(25, 118, 210, 0.05);
+ color: #FFFFFF;
}
-.empty-state {
+/* Queue Display - Vertical Scrollable */
+.queue-display {
+ flex: 1;
+ padding: 20px;
+ padding-bottom: 120px; /* Extra padding to prevent footer overlap */
+ overflow-y: auto;
+ overflow-x: hidden;
+ background: #FFFFFF;
+ min-height: 0;
+ scroll-behavior: smooth;
+ box-sizing: border-box;
+}
+
+.queue-display.has-scroll {
+ max-height: calc(100vh - 400px);
+}
+
+/* Hide scrollbar */
+.queue-display {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+.queue-display::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+}
+
+.ticket-cards-list {
+ display: grid;
+ gap: 10px;
+ width: 100%;
+ padding-bottom: 20px; /* Additional bottom padding for last card */
+ /* grid-template-columns is set dynamically via :style binding */
+}
+
+.ticket-card {
+ background: #F5F7FA ;
+ border: 1px solid #E0E0E0;
+ border-radius: 8px;
+ padding: 12px 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ transition: all 0.2s ease;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ min-height: 80px;
+ position: relative; /* Untuk absolute positioning fast track icon */
+}
+
+.ticket-card-fast-track {
+ background: rgba(255, 132, 65, 0.4) !important; /* #FF8441 dengan 40% opacity (66 hex = 102/255) */
+}
+
+.ticket-card:hover {
+ box-shadow: 0 2px 6px rgba(25, 118, 210, 0.2);
+ border-color: var(--color-primary-600);
+ transform: translateY(-1px);
+}
+
+.ticket-number {
+ font-size: 28px;
+ font-weight: 800;
+ color: #3556AE;
+ letter-spacing: 1px;
+ line-height: 1.2;
+}
+
+.ticket-klinik {
+ font-size: 11px;
+ font-weight: 500;
+ color: #717171;
+ text-align: center;
+ margin-top: 4px;
+}
+
+.ticket-fast-track {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(239, 83, 80, 0.15); /* Red background dengan opacity */
+ border: 2px solid rgba(229, 57, 53, 0.4); /* Red border */
+ transition: all 0.2s ease;
+ z-index: 10;
+ box-shadow: 0 2px 8px rgba(229, 57, 53, 0.2);
+}
+
+.ticket-fast-track:hover {
+ background: #E53935; /* Solid red on hover */
+ border-color: #E53935;
+ transform: scale(1.1);
+ box-shadow: 0 4px 12px rgba(229, 57, 53, 0.4);
+}
+
+.ticket-fast-track .v-icon {
+ color: #E53935 !important;
+ transition: all 0.2s ease;
+}
+
+.ticket-fast-track:hover .v-icon {
+ color: white !important;
+}
+
+.empty-queue {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
+ min-height: 300px;
+}
+
+.empty-queue .v-icon {
+ color: #BDBDBD !important;
+ margin-bottom: 12px;
}
.empty-text {
- font-size: 18px;
+ font-size: 14px;
color: #89939E;
- margin-top: 12px;
- font-weight: 600;
+ margin-top: 8px;
+ font-weight: 500;
}
/* ========== FOOTER STATS ========== */
@@ -759,27 +1027,19 @@ onUnmounted(() => {
font-size: 28px;
}
- .loket-header-bar {
- padding: 20px 24px;
+ .lokets-grid {
+ gap: 12px;
+ /* grid-template-columns is set dynamically via :style binding */
}
- .loket-title {
+ .loket-name {
+ font-size: 20px;
+ }
+
+ .ticket-number {
font-size: 28px;
}
- .loket-content {
- padding: 32px;
- }
-
- .current-number {
- font-size: 96px;
- }
-
- .next-item {
- font-size: 24px;
- padding: 10px 20px;
- }
-
.footer-stats-bar {
padding: 16px 32px;
}
@@ -842,53 +1102,41 @@ onUnmounted(() => {
}
@media (max-width: 960px) {
- .patient-cards-grid {
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 16px;
+ .lokets-grid {
+ gap: 12px;
+ /* grid-template-columns is set dynamically via :style binding */
}
- .queue-number-large {
- font-size: 64px;
+ .ticket-number {
+ font-size: 20px;
+ color: #3556AE;
}
- .patient-card-display {
- min-height: 240px;
+ .ticket-card {
+ min-height: 70px;
+ padding: 10px;
}
}
@media (min-width: 961px) and (max-width: 1400px) {
- .patient-cards-grid {
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- }
-
- .queue-number-large {
- font-size: 80px;
+ .lokets-grid {
+ gap: 12px;
+ /* grid-template-columns is set dynamically via :style binding */
}
}
@media (min-width: 1401px) and (max-width: 1919px) {
- .patient-cards-grid {
- grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
- }
-
- .queue-number-large {
- font-size: 96px;
+ .lokets-grid {
+ gap: 14px;
+ /* grid-template-columns is set dynamically via :style binding */
}
}
-/* Fixed layout for 1920x1080 */
+/* Fixed layout for 1920x1080 and above */
@media (min-width: 1920px) {
- .patient-cards-grid {
- grid-template-columns: repeat(5, 1fr);
- gap: 20px;
- }
-
- .queue-number-large {
- font-size: 72px;
- }
-
- .patient-card-display {
- min-height: 280px;
+ .lokets-grid {
+ gap: 16px;
+ /* grid-template-columns is set dynamically via :style binding */
}
}
@@ -901,12 +1149,13 @@ onUnmounted(() => {
font-size: 36px;
}
- .loket-header .loket-title {
- font-size: 28px;
+ .loket-name {
+ font-size: 18px;
}
- .queue-grid-container {
- padding: 16px;
+ .ticket-number {
+ font-size: 20px;
+ color: #3556AE;
}
}
diff --git a/pages/Anjungan/AntreanMasuk/index.vue b/pages/Anjungan/AntreanMasuk/index.vue
index 451464a..002c95d 100644
--- a/pages/Anjungan/AntreanMasuk/index.vue
+++ b/pages/Anjungan/AntreanMasuk/index.vue
@@ -1,56 +1,56 @@
-