diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..003e397 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,772 @@ +/* === Reset & Base === */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +:root { + --color-bg: #f4f6f9; + --color-surface: #ffffff; + --color-primary: #2c6e49; + --color-primary-light: #4c956c; + --color-primary-dark: #1b4332; + --color-accent: #d4a843; + --color-danger: #c0392b; + --color-warning: #e67e22; + --color-info: #2980b9; + --color-medical: #8e44ad; + --color-pregnant: #e91e90; + --color-text: #2d3436; + --color-text-light: #636e72; + --color-border: #dfe6e9; + --radius: 8px; + --shadow: 0 2px 8px rgba(0,0,0,0.08); + --shadow-lg: 0 4px 16px rgba(0,0,0,0.12); + --transition: 0.2s ease; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--color-bg); + color: var(--color-text); + line-height: 1.5; + min-height: 100vh; +} + +/* === Header === */ +header { + background: var(--color-primary-dark); + color: white; + padding: 16px 24px; + display: flex; + align-items: center; + justify-content: space-between; + box-shadow: var(--shadow); +} + +header h1 { + font-size: 1.4rem; + font-weight: 700; + letter-spacing: -0.02em; +} + +.subtitle { + font-size: 0.85rem; + opacity: 0.8; + margin-left: 4px; +} + +.header-right { + display: flex; + align-items: center; + gap: 12px; +} + +/* === Navigation === */ +nav#main-nav { + background: var(--color-surface); + border-bottom: 1px solid var(--color-border); + display: flex; + gap: 0; + padding: 0 24px; + overflow-x: auto; +} + +.nav-tab { + padding: 12px 20px; + border: none; + background: none; + font-size: 0.9rem; + font-weight: 500; + color: var(--color-text-light); + cursor: pointer; + border-bottom: 3px solid transparent; + transition: var(--transition); + white-space: nowrap; +} + +.nav-tab:hover { + color: var(--color-primary); + background: rgba(44, 110, 73, 0.05); +} + +.nav-tab.active { + color: var(--color-primary); + border-bottom-color: var(--color-primary); +} + +/* === Buttons === */ +.btn { + padding: 8px 16px; + border: 1px solid var(--color-border); + border-radius: var(--radius); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: var(--transition); + background: var(--color-surface); + color: var(--color-text); + display: inline-flex; + align-items: center; + gap: 6px; +} + +.btn:hover { + box-shadow: var(--shadow); +} + +.btn-primary { + background: var(--color-primary); + color: white; + border-color: var(--color-primary); +} + +.btn-primary:hover { + background: var(--color-primary-light); +} + +.btn-secondary { + background: var(--color-surface); + color: var(--color-text); +} + +.btn-danger { + background: var(--color-danger); + color: white; + border-color: var(--color-danger); +} + +.btn-sm { + padding: 4px 10px; + font-size: 0.8rem; +} + +.btn-icon { + background: transparent; + border: none; + color: white; + font-size: 1.2rem; + position: relative; + padding: 6px; + cursor: pointer; +} + +.badge { + position: absolute; + top: -2px; + right: -4px; + background: var(--color-danger); + color: white; + font-size: 0.7rem; + font-weight: 700; + padding: 1px 5px; + border-radius: 10px; + min-width: 18px; + text-align: center; +} + +.hidden { + display: none !important; +} + +/* === Views === */ +.view { + display: none; + padding: 24px; + max-width: 1400px; + margin: 0 auto; +} + +.view.active { + display: block; +} + +/* === Summary Cards === */ +.summary-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 16px; + margin-bottom: 24px; +} + +.summary-card { + background: var(--color-surface); + border-radius: var(--radius); + padding: 20px; + box-shadow: var(--shadow); + text-align: center; + border-top: 4px solid var(--color-primary); +} + +.summary-card.card-danger { border-top-color: var(--color-danger); } +.summary-card.card-warning { border-top-color: var(--color-warning); } +.summary-card.card-info { border-top-color: var(--color-info); } +.summary-card.card-medical { border-top-color: var(--color-medical); } +.summary-card.card-pregnant { border-top-color: var(--color-pregnant); } +.summary-card.card-accent { border-top-color: var(--color-accent); } + +.summary-card .card-value { + font-size: 2rem; + font-weight: 700; + color: var(--color-primary-dark); + line-height: 1.2; +} + +.summary-card .card-label { + font-size: 0.8rem; + color: var(--color-text-light); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-top: 4px; +} + +/* === Lots Grid === */ +.lots-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 16px; +} + +.lot-card { + background: var(--color-surface); + border-radius: var(--radius); + box-shadow: var(--shadow); + overflow: hidden; + cursor: pointer; + transition: var(--transition); +} + +.lot-card:hover { + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.lot-card-header { + padding: 16px 20px; + background: var(--color-primary); + color: white; + display: flex; + justify-content: space-between; + align-items: center; +} + +.lot-card-header h3 { + font-size: 1.1rem; +} + +.lot-card-header .lot-count { + font-size: 0.85rem; + opacity: 0.9; +} + +.lot-card-body { + padding: 16px 20px; +} + +.capacity-bar { + height: 12px; + background: var(--color-border); + border-radius: 6px; + overflow: hidden; + margin-bottom: 12px; +} + +.capacity-fill { + height: 100%; + border-radius: 6px; + transition: width 0.4s ease; + background: var(--color-primary-light); +} + +.capacity-fill.high { + background: var(--color-warning); +} + +.capacity-fill.full { + background: var(--color-danger); +} + +.lot-stats { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + font-size: 0.85rem; +} + +.lot-stat { + display: flex; + justify-content: space-between; + padding: 4px 0; + border-bottom: 1px solid var(--color-border); +} + +.lot-stat .stat-label { + color: var(--color-text-light); +} + +.lot-stat .stat-value { + font-weight: 600; +} + +/* === Lot Detail === */ +.lot-selector { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 20px; +} + +.lot-selector select { + padding: 8px 12px; + border-radius: var(--radius); + border: 1px solid var(--color-border); + font-size: 0.9rem; +} + +.lot-detail-header { + background: var(--color-surface); + border-radius: var(--radius); + padding: 20px; + box-shadow: var(--shadow); + margin-bottom: 20px; +} + +.lot-detail-header h2 { + margin-bottom: 12px; +} + +.lot-detail-stats { + display: flex; + gap: 24px; + flex-wrap: wrap; +} + +.lot-detail-stat { + text-align: center; +} + +.lot-detail-stat .value { + font-size: 1.5rem; + font-weight: 700; + color: var(--color-primary-dark); +} + +.lot-detail-stat .label { + font-size: 0.8rem; + color: var(--color-text-light); + text-transform: uppercase; +} + +/* === Tables === */ +.data-table { + width: 100%; + background: var(--color-surface); + border-radius: var(--radius); + box-shadow: var(--shadow); + border-collapse: collapse; + overflow: hidden; +} + +.data-table th { + background: var(--color-primary-dark); + color: white; + padding: 12px 16px; + text-align: left; + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.05em; + font-weight: 600; + cursor: pointer; + user-select: none; + white-space: nowrap; +} + +.data-table th:hover { + background: var(--color-primary); +} + +.data-table td { + padding: 10px 16px; + border-bottom: 1px solid var(--color-border); + font-size: 0.875rem; +} + +.data-table tr:last-child td { + border-bottom: none; +} + +.data-table tr:hover td { + background: rgba(44, 110, 73, 0.03); +} + +/* === Status Badges === */ +.status-badge { + display: inline-block; + padding: 3px 10px; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.03em; +} + +.status-active { background: #d4edda; color: #155724; } +.status-processing { background: #fff3cd; color: #856404; } +.status-deceased { background: #f8d7da; color: #721c24; } +.status-medical { background: #e8daef; color: #6c3483; } +.status-pregnant { background: #fdedfa; color: #c2185b; } + +/* === Toolbar === */ +.toolbar { + display: flex; + gap: 12px; + margin-bottom: 16px; + flex-wrap: wrap; + align-items: center; +} + +.toolbar input[type="text"] { + flex: 1; + min-width: 200px; + padding: 8px 14px; + border: 1px solid var(--color-border); + border-radius: var(--radius); + font-size: 0.9rem; +} + +.toolbar select { + padding: 8px 12px; + border: 1px solid var(--color-border); + border-radius: var(--radius); + font-size: 0.9rem; +} + +/* === Alerts === */ +.alert-item { + background: var(--color-surface); + border-radius: var(--radius); + padding: 16px 20px; + margin-bottom: 8px; + box-shadow: var(--shadow); + display: flex; + align-items: flex-start; + gap: 14px; + border-left: 4px solid var(--color-border); + transition: var(--transition); +} + +.alert-item.unread { + border-left-color: var(--color-primary); + background: #f0faf4; +} + +.alert-item.alert-processing { border-left-color: var(--color-warning); } +.alert-item.alert-processing.unread { background: #fef9f0; } +.alert-item.alert-death { border-left-color: var(--color-danger); } +.alert-item.alert-death.unread { background: #fef0f0; } +.alert-item.alert-medical { border-left-color: var(--color-medical); } +.alert-item.alert-medical.unread { background: #f8f0fe; } +.alert-item.alert-pregnancy { border-left-color: var(--color-pregnant); } +.alert-item.alert-pregnancy.unread { background: #fef0fa; } +.alert-item.alert-capacity { border-left-color: var(--color-info); } +.alert-item.alert-capacity.unread { background: #f0f6fe; } + +.alert-icon { + font-size: 1.5rem; + line-height: 1; + flex-shrink: 0; +} + +.alert-body { + flex: 1; +} + +.alert-body .alert-message { + font-size: 0.9rem; + margin-bottom: 4px; +} + +.alert-body .alert-time { + font-size: 0.75rem; + color: var(--color-text-light); +} + +.alert-actions { + flex-shrink: 0; +} + +.empty-state { + text-align: center; + padding: 60px 20px; + color: var(--color-text-light); +} + +.empty-state .empty-icon { + font-size: 3rem; + margin-bottom: 12px; +} + +.empty-state p { + font-size: 1rem; +} + +/* === Reports === */ +.report-section { + background: var(--color-surface); + border-radius: var(--radius); + box-shadow: var(--shadow); + padding: 24px; + margin-bottom: 20px; +} + +.report-section h2 { + font-size: 1.1rem; + margin-bottom: 16px; + color: var(--color-primary-dark); +} + +.report-table { + width: 100%; + border-collapse: collapse; +} + +.report-table th { + text-align: left; + padding: 10px 14px; + border-bottom: 2px solid var(--color-primary); + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--color-text-light); +} + +.report-table td { + padding: 10px 14px; + border-bottom: 1px solid var(--color-border); + font-size: 0.875rem; +} + +.report-table tr:last-child td { + border-bottom: none; +} + +.report-table tfoot td { + font-weight: 700; + border-top: 2px solid var(--color-primary-dark); + color: var(--color-primary-dark); +} + +/* === Modals === */ +.modal { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 20px; +} + +.modal.hidden { + display: none !important; +} + +.modal-content { + background: var(--color-surface); + border-radius: var(--radius); + width: 100%; + max-width: 560px; + max-height: 90vh; + overflow-y: auto; + box-shadow: var(--shadow-lg); +} + +.modal-sm { + max-width: 420px; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + border-bottom: 1px solid var(--color-border); +} + +.modal-header h2 { + font-size: 1.1rem; +} + +.modal-close { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--color-text-light); + padding: 4px; + line-height: 1; +} + +.modal-close:hover { + color: var(--color-danger); +} + +/* === Forms === */ +form { + padding: 20px; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +.form-group { + margin-bottom: 16px; +} + +.form-group label { + display: block; + font-size: 0.8rem; + font-weight: 600; + color: var(--color-text-light); + margin-bottom: 4px; + text-transform: uppercase; + letter-spacing: 0.03em; +} + +.form-group input, +.form-group select, +.form-group textarea { + width: 100%; + padding: 8px 12px; + border: 1px solid var(--color-border); + border-radius: var(--radius); + font-size: 0.9rem; + font-family: inherit; + transition: var(--transition); +} + +.form-group input:focus, +.form-group select:focus, +.form-group textarea:focus { + outline: none; + border-color: var(--color-primary); + box-shadow: 0 0 0 3px rgba(44, 110, 73, 0.15); +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 8px; +} + +/* === Toast Notifications === */ +#toast-container { + position: fixed; + top: 20px; + right: 20px; + z-index: 2000; + display: flex; + flex-direction: column; + gap: 8px; +} + +.toast { + background: var(--color-surface); + border-radius: var(--radius); + padding: 14px 20px; + box-shadow: var(--shadow-lg); + min-width: 280px; + max-width: 400px; + border-left: 4px solid var(--color-primary); + animation: slideIn 0.3s ease; + display: flex; + align-items: center; + gap: 10px; +} + +.toast.toast-danger { border-left-color: var(--color-danger); } +.toast.toast-warning { border-left-color: var(--color-warning); } +.toast.toast-info { border-left-color: var(--color-info); } + +.toast-icon { font-size: 1.2rem; } +.toast-message { flex: 1; font-size: 0.875rem; } + +.toast-close { + background: none; + border: none; + cursor: pointer; + color: var(--color-text-light); + font-size: 1.1rem; + padding: 2px; +} + +@keyframes slideIn { + from { transform: translateX(100%); opacity: 0; } + to { transform: translateX(0); opacity: 1; } +} + +@keyframes slideOut { + from { transform: translateX(0); opacity: 1; } + to { transform: translateX(100%); opacity: 0; } +} + +/* === Action buttons in tables === */ +.action-btns { + display: flex; + gap: 4px; +} + +.action-btns .btn-sm { + white-space: nowrap; +} + +/* === Responsive === */ +@media (max-width: 768px) { + header { + flex-direction: column; + gap: 10px; + text-align: center; + } + + .form-row { + grid-template-columns: 1fr; + } + + .lots-grid { + grid-template-columns: 1fr; + } + + .summary-cards { + grid-template-columns: repeat(2, 1fr); + } + + .toolbar { + flex-direction: column; + } + + .data-table { + display: block; + overflow-x: auto; + } +} + +@media (max-width: 480px) { + .summary-cards { + grid-template-columns: 1fr; + } + + nav#main-nav { + padding: 0 8px; + } + + .nav-tab { + padding: 10px 12px; + font-size: 0.8rem; + } +} diff --git a/index.html b/index.html index d968dd5..a824742 100755 --- a/index.html +++ b/index.html @@ -1,129 +1,209 @@ - - - Lil Beans - Grow Every Day! - + + + Cattle Feed Lot Monitor + -
- -
- - -
-
-
-

Planet of the
Lil Beans

-
-
-
-
-
-
-
-
-
-
-
-
-

Grow your mind & body every day!

-
- - -
- -
-
- - -