/* Global Styles & Reset */
body {
font-family: 'Kanit', sans-serif;
/* ใช้ฟอนต์ Kanit หรือฟอนต์อื่นที่คุณชอบ */
margin: 0;
padding: 0;
background-color: #f0f2f5;
/* สีพื้นหลังโดยรวม */
color: #333;
font-size: 14px;
}
.container {
display: flex;
min-height: 100vh;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
a {
text-decoration: none;
color: inherit;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 10px;
font-weight: 500;
}
.card {
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
padding: 20px;
margin-bottom: 20px;
}
/* Status Tags & Colors */
.status-tag {
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: 600;
color: #fff;
display: inline-block;
}
.green-bg {
background-color: #28a745;
}
/* Operational, Excellent */
.blue-bg {
background-color: #007bff;
}
/* Good, Active */
.orange-bg {
background-color: #ffc107;
color: #333;
}
/* Maintenance, Needs Attention */
.red-bg {
background-color: #dc3545;
}
/* Offline, Critical */
.green-text {
color: #28a745;
}
.blue-text {
color: #007bff;
}
.orange-text {
color: #ffc107;
}
.red-text {
color: #dc3545;
}
.green-dot {
color: #28a745;
font-size: 8px;
vertical-align: middle;
margin-right: 5px;
}
.blue-dot {
color: #007bff;
font-size: 8px;
vertical-align: middle;
margin-right: 5px;
}
.orange-dot {
color: #ffc107;
font-size: 8px;
vertical-align: middle;
margin-right: 5px;
}
.red-dot {
color: #dc3545;
font-size: 8px;
vertical-align: middle;
margin-right: 5px;
}
/* Sidebar */
.sidebar {
width: 250px;
background-color: #ffffff;
/* เปลี่ยนเป็นสีขาว */
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.05);
padding: 20px;
display: flex;
flex-direction: column;
border-right: 1px solid #e0e0e0;
/* เพิ่มเส้นแบ่ง */
}
.sidebar-header {
display: flex;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.sidebar-header .logo {
font-size: 30px;
color: #007bff;
margin-right: 10px;
}
.sidebar-header .platform-name p {
margin: 0;
font-weight: 600;
font-size: 18px;
color: #333;
}
.sidebar-header .platform-name small {
display: block;
font-size: 12px;
color: #666;
}
.sidebar-summary {
display: flex;
justify-content: space-between;
margin-bottom: 25px;
}
.sidebar-summary .summary-item {
text-align: center;
padding: 10px 5px;
border-radius: 5px;
font-weight: 600;
width: 30%;
/* ปรับความกว้าง */
box-sizing: border-box;
}
.sidebar-summary .summary-item span {
display: block;
font-size: 20px;
margin-bottom: 5px;
}
.sidebar-summary .summary-item small {
font-size: 10px;
display: block;
}
.sidebar-summary .summary-item.red {
background-color: #ffe8e8;
color: #dc3545;
}
.sidebar-summary .summary-item.green {
background-color: #e8f8e8;
color: #28a745;
}
.sidebar-summary .summary-item.blue {
background-color: #e8f3ff;
color: #007bff;
}
.main-navigation h5, .system-status h5 {
font-size: 11px;
color: #888;
margin-top: 20px;
margin-bottom: 10px;
text-transform: uppercase;
padding-left: 5px;
}
.main-navigation ul li, .system-status ul li {
margin-bottom: 5px;
padding: 8px 5px;
display: flex;
align-items: center;
position: relative;
border-radius: 5px;
}
.main-navigation ul li a {
display: flex;
align-items: center;
color: #555;
font-weight: 500;
flex-grow: 1;
}
.main-navigation ul li a i {
margin-right: 10px;
font-size: 16px;
color: #888;
}
.main-navigation ul li small {
font-size: 11px;
color: #888;
margin-left: 10px;
position: absolute;
/* เพื่อจัดตำแหน่ง */
left: 40px;
/* ให้มันอยู่ใต้ชื่อเมนู */
top: 28px;
}
.main-navigation ul li.nav-item {
flex-wrap: wrap;
/* เพื่อให้ small ลงบรรทัดใหม่ */
align-items: flex-start;
height: 45px;
/* กำหนดความสูง เพื่อให้ small มีที่อยู่ */
padding-top: 5px;
padding-bottom: 5px;
}
.main-navigation ul li.nav-item a {
width: 100%;
/* ให้ link กินพื้นที่เต็ม */
line-height: 1;
/* ปรับ line-height */
}
.main-navigation ul li.nav-item small {
position: static;
/* ไม่ใช้ absolute สำหรับ small ใน nav-item */
display: block;
/* ให้ small อยู่บรรทัดใหม่ */
margin-left: 30px;
/* เยื้องเล็กน้อย */
}
.main-navigation ul li.active {
background-color: #e8f3ff;
color: #007bff;
font-weight: 600;
}
.main-navigation ul li.active a {
color: #007bff;
}
.main-navigation ul li.active a i {
color: #007bff;
}
.sidebar .status-tag {
margin-left: auto;
/* ชิดขวา */
background-color: #eee;
color: #666;
padding: 2px 6px;
font-size: 10px;
font-weight: 500;
}
.system-status ul li {
font-size: 13px;
color: #555;
}
.sidebar-user-info {
display: flex;
align-items: center;
margin-top: auto;
/* ยึดไปด้านล่าง */
padding-top: 20px;
border-top: 1px solid #eee;
}
.sidebar-user-info .user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background-color: #007bff;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
margin-right: 10px;
font-size: 16px;
}
.sidebar-user-info .user-details p {
margin: 0;
font-weight: 600;
}
.sidebar-user-info .user-details small {
display: block;
font-size: 11px;
color: #777;
}
/* Main Content */
.main-content {
flex-grow: 1;
padding: 30px;
}
/* Topbar */
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #fff;
padding: 15px 30px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
margin-bottom: 30px;
}
.topbar-left {
display: flex;
align-items: center;
}
.topbar-left h1 {
font-size: 24px;
font-weight: 600;
margin: 0;
color: #333;
}
.topbar-left .subtitle {
margin-left: 15px;
font-size: 14px;
color: #777;
}
.topbar-left .system-status-indicator {
margin-left: 20px;
padding: 5px 10px;
border-radius: 5px;
font-weight: 500;
font-size: 13px;
}
.topbar-left .system-status-indicator.online {
background-color: #e8f8e8;
color: #28a745;
}
.topbar-left .system-status-indicator i {
font-size: 8px;
vertical-align: middle;
margin-right: 5px;
}
.topbar-left .last-sync {
margin-left: 15px;
font-size: 13px;
color: #888;
}
.topbar-left .last-sync i {
margin-right: 5px;
}
.topbar-right {
display: flex;
align-items: center;
}
.search-box {
position: relative;
margin-right: 20px;
}
.search-box i {
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: #aaa;
}
.search-box input {
border: 1px solid #ddd;
border-radius: 20px;
padding: 8px 12px 8px 35px;
width: 250px;
font-size: 13px;
outline: none;
transition: border-color 0.2s;
}
.search-box input:focus {
border-color: #007bff;
}
.topbar-right .uptime {
font-weight: 600;
color: #28a745;
margin-right: 20px;
font-size: 14px;
}
.topbar-right .uptime i {
margin-right: 5px;
}
.icon-group {
display: flex;
align-items: center;
margin-right: 20px;
}
.icon-group i {
font-size: 18px;
color: #777;
margin-left: 15px;
position: relative;
}
.icon-group .badge {
position: absolute;
top: -5px;
right: -5px;
background-color: #dc3545;
color: #fff;
border-radius: 50%;
width: 15px;
height: 15px;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
font-weight: 600;
}
.icon-group i:first-child {
margin-left: 0;
}
.topbar .user-profile {
display: flex;
align-items: center;
margin-left: 20px;
border-left: 1px solid #eee;
padding-left: 20px;
}
.topbar .user-profile .user-avatar {
width: 35px;
height: 35px;
font-size: 14px;
}
.topbar .user-profile .user-details {
margin-left: 10px;
}
.topbar .user-profile .user-details p {
font-weight: 600;
margin: 0;
}
.topbar .user-profile .user-details small {
font-size: 11px;
color: #777;
}
/* Action Buttons */
.action-buttons {
margin-bottom: 20px;
display: flex;
gap: 10px;
/* ระยะห่างระหว่างปุ่ม */
}
.btn {
padding: 10px 18px;
border-radius: 5px;
border: none;
cursor: pointer;
font-size: 14px;
font-weight: 600;
transition: background-color 0.2s;
}
.btn i {
margin-right: 8px;
}
.btn-primary {
background-color: #007bff;
color: #fff;
}
.btn-primary:hover {
background-color: #0056b3;
}
.btn-secondary {
background-color: #e9ecef;
color: #333;
}
.btn-secondary:hover {
background-color: #dee2e6;
}
/* Metric Cards */
.metric-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
/* ปรับตามขนาดหน้าจอ */
gap: 20px;
margin-bottom: 20px;
}
.metric-card {
padding: 15px 20px;
/* ปรับ padding */
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 120px;
/* กำหนดความสูงขั้นต่ำ */
}
.metric-card h5 {
font-size: 14px;
color: #666;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.metric-card h5 i {
color: #ccc;
font-size: 12px;
}
.metric-card .card-content {
display: flex;
justify-content: space-between;
align-items: flex-end;
/* จัดให้ไอคอนอยู่ด้านล่างขวา */
margin-bottom: 10px;
}
.metric-card .main-value {
font-size: 32px;
font-weight: 700;
color: #333;
line-height: 1;
}
.metric-card .chart-icon {
font-size: 40px;
color: #e0e0e0;
}
.metric-card .sub-text {
font-size: 12px;
color: #888;
margin-bottom: 15px;
}
.metric-card .sub-text .green-text i {
margin-right: 3px;
}
.metric-card .progress-bar-label {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 10px;
border-top: 1px solid #eee;
}
.metric-card .progress-bar-label .label {
font-size: 12px;
color: #666;
}
.metric-card .progress-bar-label .status {
padding: 3px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
color: #fff;
}
/* Dashboard Sections - Layout for Equipment and Alerts */
.dashboard-sections {
display: grid;
grid-template-columns: 2fr 1fr;
/* Equipment takes 2/3, Alerts takes 1/3 */
gap: 20px;
}
/* Equipment Status Section */
.equipment-status {
padding: 20px;
}
.equipment-status .card-header {
display: flex;
flex-wrap: wrap;
/* เพื่อให้สามารถจัดองค์ประกอบได้หลายบรรทัด */
justify-content: space-between;
align-items: flex-start;
/* จัดให้อยู่ด้านบน */
margin-bottom: 15px;
border-bottom: 1px solid #eee;
padding-bottom: 15px;
}
.equipment-status .card-header h3 {
font-size: 18px;
font-weight: 600;
margin: 0;
display: flex;
align-items: center;
width: 100%;
/* ให้ h3 กินเต็มความกว้าง */
}
.equipment-status .card-header h3 i {
margin-right: 10px;
color: #007bff;
}
.equipment-status .card-header p {
font-size: 13px;
color: #777;
margin-top: 5px;
margin-bottom: 10px;
width: 100%;
/* ให้ p กินเต็มความกว้าง */
}
.equipment-status .card-header .search-and-filter {
display: flex;
align-items: center;
gap: 10px;
margin-top: 10px;
/* ขยับลงมาเล็กน้อย */
width: 100%;
/* ให้ search and filter กินเต็มความกว้าง */
justify-content: flex-end;
/* ชิดขวา */
}
.equipment-status .card-header .search-and-filter i {
color: #aaa;
font-size: 16px;
}
.search-box-small {
position: relative;
}
.search-box-small i {
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: #aaa;
}
.search-box-small input {
border: 1px solid #ddd;
border-radius: 20px;
padding: 6px 10px 6px 30px;
width: 180px;
font-size: 13px;
outline: none;
}
.filter-dropdown {
display: flex;
align-items: center;
border: 1px solid #ddd;
border-radius: 20px;
padding: 6px 12px;
font-size: 13px;
color: #555;
cursor: pointer;
}
.filter-dropdown i {
margin-left: 8px;
font-size: 12px;
}
/* Equipment Status Section*/
.equipment-status .status-summary {
display: flex;
justify-content: space-around;
align-items: center;
margin-bottom: 20px;
background-color: #f8f9fa;
/* สีพื้นหลังอ่อนๆ */
border-radius: 8px;
padding: 15px 10px;
border: 1px solid #eee;
}
.equipment-status .status-summary .status-item {
text-align: center;
padding: 5px 10px;
border-right: 1px solid #eee;
}
.equipment-status .status-summary .status-item:last-child {
border-right: none;
}
.equipment-status .status-summary .status-item span {
display: block;
font-size: 24px;
font-weight: 700;
margin-bottom: 5px;
}
.equipment-status .status-summary .status-item small {
font-size: 12px;
color: #777;
display: block;
}
.equipment-status .status-summary .status-item.total span {
color: #333;
}
.equipment-status .status-summary .status-item.operational span {
color: #28a745;
}
.equipment-status .status-summary .status-item.maintenance span {
color: #ffc107;
}
.equipment-status .status-summary .status-item.offline span {
color: #dc3545;
}
.equipment-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* 3 คอลัมน์สำหรับภาพตัวอย่าง */
gap: 15px;
}
.equipment-card {
display: flex;
align-items: center;
border: 1px solid #eee;
border-radius: 8px;
padding: 10px;
background-color: #fff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
}
.equipment-card img {
width: 80px;
height: 60px;
object-fit: cover;
border-radius: 4px;
margin-right: 15px;
}
.equipment-card .equipment-details p {
margin: 0;
font-weight: 600;
font-size: 14px;
color: #333;
}
.equipment-card .equipment-details .status-tag {
font-size: 11px;
padding: 3px 7px;
margin-top: 5px;
}
/* System Alerts Section */
.system-alerts .card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
border-bottom: 1px solid #eee;
padding-bottom: 15px;
}
.system-alerts .card-header h3 {
font-size: 18px;
font-weight: 600;
margin: 0;
}
.system-alerts .card-header p {
font-size: 13px;
color: #777;
margin: 0;
flex-grow: 1;
/* ให้ p กินพื้นที่ */
padding-left: 10px;
/* เว้นระยะจาก h3 */
}
.system-alerts .card-header i.fa-ellipsis-v {
font-size: 16px;
color: #aaa;
cursor: pointer;
}
.alert-list {
display: flex;
flex-direction: column;
}
.alert-item {
display: flex;
align-items: flex-start;
/* จัดให้อยู่ด้านบนสำหรับข้อความหลายบรรทัด */
padding: 15px 0;
border-bottom: 1px solid #eee;
}
.alert-item:last-child {
border-bottom: none;
}
.alert-item i {
font-size: 20px;
margin-right: 15px;
margin-top: 3px;
/* จัดให้อยู่ตรงกลางตามแนวตั้งเล็กน้อย */
}
.alert-item .alert-details {
flex-grow: 1;
}
.alert-item .alert-details p {
margin: 0;
font-weight: 600;
font-size: 14px;
color: #333;
line-height: 1.4;
}
.alert-item .alert-details small {
display: block;
font-size: 12px;
color: #777;
margin-top: 3px;
line-height: 1.3;
}
.alert-item .alert-details small:last-of-type {
color: #999;
}
.alert-item .status-tag {
margin-left: 15px;
padding: 3px 8px;
font-size: 10px;
align-self: flex-start;
/* จัดให้อยู่ด้านบน */
}
.alert-item .time-ago {
font-size: 11px;
color: #999;
margin-left: 10px;
white-space: nowrap;
/* ไม่ให้ขึ้นบรรทัดใหม่ */
align-self: flex-start;
/* จัดให้อยู่ด้านบน */
margin-top: 3px;
/* ให้มันอยู่แนวเดียวกับไอคอน */
}
/* Responsive Design (ขั้นพื้นฐาน) */
@media (max-width: 1200px) {
.dashboard-sections {
grid-template-columns: 1fr;
/* Stack on smaller screens */
}
.topbar {
flex-wrap: wrap;
/* ให้ Topbar สามารถขึ้นบรรทัดใหม่ได้ */
padding: 15px 20px;
}
.topbar-right {
margin-top: 15px;
width: 100%;
justify-content: flex-end;
/* ชิดขวา */
}
.topbar-left .subtitle,
.topbar-left .system-status-indicator,
.topbar-left .last-sync {
margin-left: 10px;
}
}
@media (max-width: 992px) {
.sidebar {
width: 200px;
/* ลดขนาด sidebar */
padding: 15px;
}
.main-content {
padding: 20px;
}
.metric-cards {
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.topbar-left h1 {
font-size: 20px;
}
.topbar .user-profile {
margin-left: 10px;
padding-left: 10px;
}
.search-box input {
width: 200px;
}
.action-buttons {
flex-wrap: wrap;
/* ปุ่ม action buttons ขึ้นบรรทัดใหม่ */
}
.action-buttons button {
flex-grow: 1;
/* ให้ปุ่มขยายเต็มพื้นที่ */
}
.equipment-status .card-header .search-and-filter {
flex-wrap: wrap;
justify-content: flex-start;
/* ชิดซ้าย */
width: auto;
}
}
@media (max-width: 768px) {
.container {
flex-direction: column;
/* Sidebar อยู่ด้านบนของ content */
}
.sidebar {
width: 100%;
height: auto;
padding: 15px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
border-right: none;
border-bottom: 1px solid #e0e0e0;
}
.sidebar-header {
justify-content: center;
border-bottom: none;
/* ลบเส้นแบ่ง */
margin-bottom: 10px;
}
.sidebar-summary {
display: none;
/* ซ่อนสรุปด้านบนในมือถือ */
}
.main-navigation, .system-status {
display: none;
/* ซ่อนเมนูนำทางในมือถือ */
}
.sidebar-user-info {
margin-top: 10px;
justify-content: center;
/* จัดให้อยู่ตรงกลาง */
padding-top: 10px;
}
.topbar {
flex-direction: column;
/* topbar เรียงเป็นคอลัมน์ */
align-items: flex-start;
padding: 15px;
}
.topbar-left, .topbar-right {
width: 100%;
flex-wrap: wrap;
margin-bottom: 10px;
}
.topbar-left h1 {
width: 100%;
margin-bottom: 10px;
}
.topbar-left .subtitle,
.topbar-left .system-status-indicator,
.topbar-left .last-sync {
margin-left: 0;
margin-right: 10px;
margin-bottom: 5px;
}
.topbar-right {
justify-content: space-between;
margin-top: 0;
border-top: 1px solid #eee;
padding-top: 10px;
}
.search-box {
margin-right: 0;
margin-bottom: 10px;
width: 100%;
}
.search-box input {
width: calc(100% - 40px);
}
.topbar-right .uptime {
margin-right: auto;
/* ชิดซ้าย */
}
.icon-group {
margin-right: 0;
}
.topbar .user-profile {
display: none;
/* ซ่อน user profile บน topbar ในมือถือ */
}
.metric-cards {
grid-template-columns: 1fr;
/* การ์ดเรียงเป็นคอลัมน์เดียว */
}
.equipment-status .card-header .search-and-filter {
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.search-box-small input {
width: calc(100% - 40px);
}
}
@media (max-width: 480px) {
body {
font-size: 13px;
}
.main-content {
padding: 15px;
}
.topbar-left h1 {
font-size: 18px;
}
.btn {
padding: 8px 12px;
font-size: 13px;
}
.metric-card .main-value {
font-size: 28px;
}
.metric-card .chart-icon {
font-size: 35px;
}
.equipment-card img {
width: 60px;
height: 45px;
}
.equipment-card .equipment-details p {
font-size: 13px;
}
.alert-item i {
font-size: 18px;
}
.alert-item .alert-details p {
font-size: 13px;
}
.alert-item .alert-details small, .alert-item .time-ago {
font-size: 11px;
}
}