diff --git a/pom.xml b/pom.xml
index 5bcaba1..dd0601b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,8 +51,8 @@
maven-compiler-plugin
3.13.0
- 21
- 21
+ 17
+ 17
diff --git a/src/main/java/org/example/se302/controller/MainController.java b/src/main/java/org/example/se302/controller/MainController.java
index ea05026..a0a9a2e 100644
--- a/src/main/java/org/example/se302/controller/MainController.java
+++ b/src/main/java/org/example/se302/controller/MainController.java
@@ -1,6 +1,7 @@
package org.example.se302.controller;
import javafx.fxml.FXML;
+import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
@@ -8,7 +9,7 @@ import org.example.se302.service.DataManager;
/**
* Main controller for the application window.
- * Manages the TabPane and status bar.
+ * Manages the TabPane, status bar, and theme toggling.
*/
public class MainController {
@@ -33,7 +34,11 @@ public class MainController {
@FXML
private Label statusLabel;
+ @FXML
+ private Button themeToggleButton;
+
private DataManager dataManager;
+ private boolean isDarkMode = false;
@FXML
public void initialize() {
@@ -78,8 +83,28 @@ public class MainController {
"Loaded: %d Students, %d Courses, %d Classrooms",
dataManager.getTotalStudents(),
dataManager.getTotalCourses(),
- dataManager.getTotalClassrooms()
- ));
+ dataManager.getTotalClassrooms()));
+ }
+ }
+
+ /**
+ * Toggle between light and dark themes.
+ */
+ @FXML
+ private void onToggleTheme() {
+ var root = mainTabPane.getScene().getRoot();
+ var styleClass = root.getStyleClass();
+
+ if (isDarkMode) {
+ // Switch to light mode
+ styleClass.remove("dark");
+ themeToggleButton.setText("🌙 Dark Mode");
+ isDarkMode = false;
+ } else {
+ // Switch to dark mode
+ styleClass.add("dark");
+ themeToggleButton.setText("☀️ Light Mode");
+ isDarkMode = true;
}
}
}
diff --git a/src/main/resources/org/example/se302/css/application.css b/src/main/resources/org/example/se302/css/application.css
index 130b109..7b16e30 100644
--- a/src/main/resources/org/example/se302/css/application.css
+++ b/src/main/resources/org/example/se302/css/application.css
@@ -1,70 +1,228 @@
-/* ===== Root Color Palette ===== */
+/* ========================================
+ ExamFlow v2.0 - Modern UI Stylesheet
+ Based on Tailwind-inspired design system
+ ======================================== */
+
+/* ===== Root Color Palette (Indigo & Slate) ===== */
.root {
- -fx-primary-color: #2196F3;
- -fx-primary-dark: #1976D2;
- -fx-accent-color: #FFC107;
- -fx-success-color: #4CAF50;
- -fx-error-color: #F44336;
- -fx-background: #FAFAFA;
- -fx-text-base-color: #212121;
+ /* Primary Colors (Indigo) */
+ -fx-primary: #4F46E5;
+ /* indigo-600 */
+ -fx-primary-dark: #4338CA;
+ /* indigo-700 */
+ -fx-primary-light: #6366F1;
+ /* indigo-500 */
+ -fx-primary-50: #EEF2FF;
+ /* indigo-50 */
+ -fx-primary-100: #E0E7FF;
+ /* indigo-100 */
+
+ /* Slate Grays */
+ -fx-slate-50: #F8FAFC;
+ -fx-slate-100: #F1F5F9;
+ -fx-slate-200: #E2E8F0;
+ -fx-slate-300: #CBD5E1;
+ -fx-slate-400: #94A3B8;
+ -fx-slate-500: #64748B;
+ -fx-slate-600: #475569;
+ -fx-slate-700: #334155;
+ -fx-slate-800: #1E293B;
+ -fx-slate-900: #0F172A;
+
+ /* Semantic Colors */
+ -fx-success: #10B981;
+ /* emerald-500 */
+ -fx-success-light: #D1FAE5;
+ /* emerald-100 */
+ -fx-warning: #F59E0B;
+ /* amber-500 */
+ -fx-warning-light: #FEF3C7;
+ /* amber-100 */
+ -fx-error: #EF4444;
+ /* red-500 */
+ -fx-error-light: #FEE2E2;
+ /* red-100 */
+ -fx-info: #3B82F6;
+ /* blue-500 */
+ -fx-info-light: #DBEAFE;
+ /* blue-100 */
+
+ /* Background & Surface */
+ -fx-background: #F8FAFC;
+ /* slate-50 */
+ -fx-surface: #FFFFFF;
+
+ /* Text Colors */
+ -fx-text-primary: #0F172A;
+ /* slate-900 */
+ -fx-text-secondary: #475569;
+ /* slate-600 */
+ -fx-text-tertiary: #94A3B8;
+ /* slate-400 */
+
+ /* Shadows */
+ -fx-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
+ -fx-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
+ -fx-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ -fx-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
+
+ /* Font Settings */
+ -fx-font-family: "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;
+ -fx-font-size: 14px;
}
-/* ===== General Styling ===== */
+/* ===== Dark Mode Color Palette ===== */
+.root.dark {
+ /* Primary Colors (Same indigo, but brighter for dark bg) */
+ -fx-primary: #6366F1;
+ /* indigo-500 - brighter */
+ -fx-primary-dark: #4F46E5;
+ /* indigo-600 */
+ -fx-primary-light: #818CF8;
+ /* indigo-400 */
+ -fx-primary-50: #312E81;
+ /* indigo-900 - inverted */
+ -fx-primary-100: #3730A3;
+ /* indigo-800 - inverted */
+
+ /* Dark Slate Palette (inverted) */
+ -fx-slate-50: #0F172A;
+ /* slate-900 */
+ -fx-slate-100: #1E293B;
+ /* slate-800 */
+ -fx-slate-200: #334155;
+ /* slate-700 */
+ -fx-slate-300: #475569;
+ /* slate-600 */
+ -fx-slate-400: #64748B;
+ /* slate-500 */
+ -fx-slate-500: #94A3B8;
+ /* slate-400 */
+ -fx-slate-600: #CBD5E1;
+ /* slate-300 */
+ -fx-slate-700: #E2E8F0;
+ /* slate-200 */
+ -fx-slate-800: #F1F5F9;
+ /* slate-100 */
+ -fx-slate-900: #F8FAFC;
+ /* slate-50 */
+
+ /* Semantic Colors (brighter for dark) */
+ -fx-success: #34D399;
+ /* emerald-400 */
+ -fx-success-light: #064E3B;
+ /* emerald-900 */
+ -fx-warning: #FBBF24;
+ /* amber-400 */
+ -fx-warning-light: #78350F;
+ /* amber-900 */
+ -fx-error: #F87171;
+ /* red-400 */
+ -fx-error-light: #7F1D1D;
+ /* red-900 */
+ -fx-info: #60A5FA;
+ /* blue-400 */
+ -fx-info-light: #1E3A8A;
+ /* blue-900 */
+
+ /* Background & Surface (dark) */
+ -fx-background: #0F172A;
+ /* slate-900 */
+ -fx-surface: #1E293B;
+ /* slate-800 */
+
+ /* Text Colors (inverted) */
+ -fx-text-primary: #F8FAFC;
+ /* slate-50 */
+ -fx-text-secondary: #CBD5E1;
+ /* slate-300 */
+ -fx-text-tertiary: #64748B;
+ /* slate-500 */
+
+ /* Shadows (more pronounced in dark) */
+ -fx-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
+ -fx-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);
+ -fx-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
+ -fx-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6);
+}
+
+/* ===== General Layouts ===== */
.content-pane {
- -fx-background-color: white;
+ -fx-background-color: -fx-slate-50;
+ -fx-padding: 40;
}
-/* ===== Header Styling ===== */
-.header {
- -fx-background-color: -fx-primary-color;
- -fx-padding: 15;
-}
-
-.title-label {
- -fx-font-size: 24px;
- -fx-font-weight: bold;
- -fx-text-fill: white;
-}
-
-/* ===== Section Titles ===== */
+/* ===== Typography ===== */
.section-title {
- -fx-font-size: 20px;
- -fx-font-weight: bold;
- -fx-text-fill: -fx-primary-dark;
+ -fx-font-size: 28px;
+ -fx-font-weight: 900;
+ /* black */
+ -fx-text-fill: -fx-text-primary;
+ -fx-padding: 0 0 16 0;
}
.subsection-title {
- -fx-font-size: 14px;
- -fx-font-weight: bold;
- -fx-text-fill: #424242;
+ -fx-font-size: 16px;
+ -fx-font-weight: 700;
+ /* bold */
+ -fx-text-fill: -fx-slate-800;
+ -fx-padding: 0 0 8 0;
}
.info-title {
- -fx-font-size: 18px;
- -fx-font-weight: bold;
- -fx-text-fill: #616161;
+ -fx-font-size: 20px;
+ -fx-font-weight: 700;
+ -fx-text-fill: -fx-slate-700;
}
-/* ===== Button Styling ===== */
+.description-label {
+ -fx-font-size: 16px;
+ -fx-text-fill: -fx-slate-600;
+ -fx-padding: 0 0 8 0;
+}
+
+.stat-value {
+ -fx-font-size: 28px;
+ -fx-font-weight: 900;
+ -fx-text-fill: -fx-primary;
+}
+
+.stat-label {
+ -fx-font-size: 11px;
+ -fx-font-weight: 700;
+ -fx-text-fill: -fx-slate-400;
+ -fx-padding: 4 0 0 0;
+}
+
+/* ===== Buttons ===== */
.button {
- -fx-background-color: white;
- -fx-border-color: -fx-primary-color;
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
-fx-border-width: 1px;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
- -fx-text-fill: -fx-primary-color;
- -fx-padding: 8 16 8 16;
+ -fx-border-radius: 12px;
+ -fx-background-radius: 12px;
+ -fx-text-fill: -fx-slate-600;
+ -fx-padding: 10 20;
-fx-cursor: hand;
+ -fx-font-weight: 700;
+ /* bold */
+ -fx-font-size: 13px;
+ -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.05), 2, 0, 0, 1);
}
.button:hover {
- -fx-background-color: #E3F2FD;
+ -fx-background-color: -fx-slate-100;
+ -fx-border-color: -fx-slate-300;
}
.primary-button {
- -fx-background-color: -fx-primary-color;
+ -fx-background-color: -fx-primary;
-fx-text-fill: white;
- -fx-border-color: -fx-primary-color;
+ -fx-border-color: -fx-primary;
+ -fx-font-weight: 900;
+ /* black */
+ -fx-padding: 12 24;
+ -fx-effect: dropshadow(gaussian, derive(-fx-primary, -20%), 10, 0.3, 0, 4);
}
.primary-button:hover {
@@ -72,243 +230,386 @@
-fx-border-color: -fx-primary-dark;
}
-.small-button {
- -fx-font-size: 11px;
- -fx-padding: 4 12 4 12;
+.secondary-button {
+ -fx-background-color: -fx-slate-900;
+ -fx-text-fill: white;
+ -fx-border-color: -fx-slate-900;
+ -fx-font-weight: 700;
}
-/* ===== Table View Styling ===== */
-.table-view {
- -fx-background-color: white;
- -fx-border-color: #E0E0E0;
+.secondary-button:hover {
+ -fx-background-color: -fx-slate-800;
+ -fx-border-color: -fx-slate-800;
+}
+
+.small-button {
+ -fx-font-size: 11px;
+ -fx-padding: 6 12;
+ -fx-border-radius: 8px;
+ -fx-background-radius: 8px;
+}
+
+/* ===== Card & Panel Styling ===== */
+.card {
+ -fx-background-color: -fx-surface;
+ -fx-background-radius: 24px;
+ -fx-border-color: -fx-slate-200;
-fx-border-width: 1px;
+ -fx-border-radius: 24px;
+ -fx-padding: 32;
+ -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.05), 4, 0, 0, 2);
+}
+
+.config-panel {
+ -fx-background-color: -fx-surface;
+ -fx-background-radius: 20px;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 20px;
+ -fx-padding: 24;
+}
+
+.summary-row {
+ -fx-background-color: -fx-primary-50;
+ -fx-background-radius: 12px;
+ -fx-padding: 12 16;
+}
+
+.summary-value {
+ -fx-font-weight: 700;
+ -fx-text-fill: -fx-primary;
+}
+
+.stats-panel {
+ -fx-background-color: -fx-surface;
+ -fx-background-radius: 20px;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 20px;
+ -fx-padding: 24;
+}
+
+/* ===== Tables ===== */
+.table-view {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 24px;
+ -fx-background-radius: 24px;
+ -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.05), 4, 0, 0, 2);
}
.table-view .column-header {
- -fx-background-color: -fx-primary-color;
- -fx-text-fill: white;
- -fx-font-weight: bold;
- -fx-padding: 10;
+ -fx-background-color: derive(-fx-slate-50, 20%);
+ -fx-text-fill: -fx-slate-500;
+ -fx-font-weight: 900;
+ /* black */
+ -fx-font-size: 10px;
+ -fx-padding: 16 24;
}
.table-view .column-header-background {
- -fx-background-color: -fx-primary-color;
+ -fx-background-color: derive(-fx-slate-50, 20%);
+}
+
+.table-view .column-header .label {
+ -fx-text-fill: -fx-slate-500;
+ -fx-font-weight: 900;
}
.table-view .table-cell {
- -fx-padding: 8;
+ -fx-padding: 20 24;
-fx-border-color: transparent;
+ -fx-text-fill: -fx-slate-800;
+ -fx-font-size: 14px;
}
-.table-row-cell:odd {
- -fx-background-color: white;
+.table-row-cell {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-100;
+ -fx-border-width: 0 0 1 0;
}
-.table-row-cell:even {
- -fx-background-color: #F5F5F5;
+.table-row-cell:filled:hover {
+ -fx-background-color: derive(-fx-primary-50, 30%);
}
-.table-row-cell:selected {
- -fx-background-color: #BBDEFB;
+.table-row-cell:filled:selected {
+ -fx-background-color: -fx-primary-50;
+ -fx-text-fill: -fx-primary-dark;
}
-.table-row-cell:hover {
- -fx-background-color: #E3F2FD;
-}
-
-/* ===== Text Field Styling ===== */
-.text-field {
- -fx-border-color: #BDBDBD;
- -fx-border-width: 1px;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
- -fx-padding: 8;
-}
-
-.text-field:focused {
- -fx-border-color: -fx-primary-color;
- -fx-border-width: 2px;
-}
-
-/* ===== Text Area Styling ===== */
+/* ===== Text Inputs ===== */
+.text-field,
.text-area {
- -fx-border-color: #BDBDBD;
+ -fx-background-color: -fx-slate-100;
+ -fx-border-color: transparent;
-fx-border-width: 1px;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
+ -fx-border-radius: 12px;
+ -fx-background-radius: 12px;
+ -fx-padding: 10 16;
+ -fx-font-size: 13px;
+ -fx-text-fill: -fx-slate-800;
}
+.text-field:focused,
.text-area:focused {
- -fx-border-color: -fx-primary-color;
+ -fx-border-color: -fx-primary;
-fx-border-width: 2px;
+ -fx-background-color: -fx-surface;
+ -fx-effect: dropshadow(gaussian, derive(-fx-primary, -20%), 4, 0.3, 0, 0);
}
.text-area .content {
- -fx-background-color: white;
+ -fx-background-color: transparent;
}
-/* ===== Combo Box Styling ===== */
-.combo-box {
- -fx-border-color: #BDBDBD;
+/* ===== Spinner ===== */
+.spinner {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
-fx-border-width: 1px;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
+ -fx-border-radius: 12px;
+ -fx-background-radius: 12px;
+}
+
+.spinner .text-field {
+ -fx-background-color: transparent;
+ -fx-border-width: 0;
+ -fx-background-radius: 12px;
+}
+
+/* ===== ComboBox ===== */
+.combo-box {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 12px;
+ -fx-background-radius: 12px;
+ -fx-padding: 4;
}
.combo-box:focused {
- -fx-border-color: -fx-primary-color;
+ -fx-border-color: -fx-primary;
+ -fx-border-width: 2px;
}
-/* ===== Tab Pane Styling ===== */
-.tab-pane {
+.combo-box .list-cell {
+ -fx-background-color: transparent;
+ -fx-text-fill: -fx-slate-800;
+ -fx-padding: 8 12;
+}
+
+/* ===== DatePicker ===== */
+.date-picker {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 12px;
+ -fx-background-radius: 12px;
+}
+
+.date-picker:focused {
+ -fx-border-color: -fx-primary;
+ -fx-border-width: 2px;
+}
+
+.date-picker .text-field {
+ -fx-background-color: transparent;
+ -fx-border-width: 0;
+}
+
+/* ===== CheckBox ===== */
+.check-box {
+ -fx-text-fill: -fx-slate-700;
+ -fx-font-weight: 600;
+}
+
+.check-box .box {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-300;
+ -fx-border-width: 2px;
+ -fx-border-radius: 6px;
+ -fx-background-radius: 6px;
+}
+
+.check-box:selected .box {
+ -fx-background-color: -fx-primary;
+ -fx-border-color: -fx-primary;
+}
+
+.check-box:selected .mark {
-fx-background-color: white;
}
-.tab {
- -fx-background-color: #F5F5F5;
- -fx-background-radius: 0;
- -fx-padding: 10 20 10 20;
+/* ===== Progress Bar & Indicator ===== */
+.progress-bar {
+ -fx-background-color: -fx-slate-100;
+ -fx-background-radius: 12px;
}
-.tab:selected {
- -fx-background-color: white;
- -fx-border-color: -fx-primary-color transparent transparent transparent;
- -fx-border-width: 3px 0 0 0;
+.progress-bar .bar {
+ -fx-background-color: -fx-primary;
+ -fx-background-radius: 12px;
+ -fx-padding: 4px;
}
-.tab:hover {
- -fx-background-color: #EEEEEE;
+.progress-indicator {
+ -fx-progress-color: -fx-primary;
}
-.tab .tab-label {
- -fx-text-fill: #616161;
- -fx-font-weight: normal;
+/* ===== Scroll Pane & Scroll Bars ===== */
+.scroll-pane {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
}
-.tab:selected .tab-label {
- -fx-text-fill: -fx-primary-dark;
- -fx-font-weight: bold;
+.scroll-pane .viewport {
+ -fx-background-color: transparent;
}
-/* ===== Status Bar Styling ===== */
-.status-bar {
- -fx-background-color: #EEEEEE;
- -fx-border-color: #BDBDBD transparent transparent transparent;
- -fx-border-width: 1px 0 0 0;
+.scroll-bar {
+ -fx-background-color: transparent;
+ -fx-padding: 2;
}
-/* ===== Detail Panel Styling ===== */
-.detail-panel {
- -fx-background-color: #F5F5F5;
- -fx-border-color: #E0E0E0;
- -fx-border-width: 0 0 0 1px;
- -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.1), 10, 0, -2, 0);
+.scroll-bar .thumb {
+ -fx-background-color: -fx-slate-300;
+ -fx-background-radius: 8px;
}
-/* ===== Summary Box Styling ===== */
-.summary-box {
- -fx-background-color: #E3F2FD;
- -fx-padding: 10;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
+.scroll-bar .thumb:hover {
+ -fx-background-color: -fx-slate-400;
}
-.summary-label {
- -fx-font-weight: bold;
- -fx-text-fill: -fx-primary-dark;
+.scroll-bar .track {
+ -fx-background-color: -fx-slate-100;
+ -fx-background-radius: 8px;
+}
+
+/* ===== Schedule Grid ===== */
+.schedule-grid {
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px;
+ -fx-border-radius: 24px;
+ -fx-background-radius: 24px;
+ -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.05), 4, 0, 0, 2);
+}
+
+.grid-header {
+ -fx-background-color: derive(-fx-slate-50, 20%);
+ -fx-font-weight: 900;
+ -fx-font-size: 11px;
+ -fx-text-fill: -fx-slate-500;
+ -fx-padding: 16;
+ -fx-alignment: center;
+}
+
+.grid-cell {
+ -fx-background-color: -fx-surface;
+ -fx-padding: 12;
+ -fx-alignment: top-left;
+ -fx-border-color: -fx-slate-100;
+ -fx-border-width: 0 1 1 0;
+}
+
+.placeholder-text {
+ -fx-font-size: 14px;
+ -fx-text-fill: -fx-slate-400;
+ -fx-font-style: italic;
+ -fx-padding: 40;
}
/* ===== Status Labels ===== */
.status-label {
- -fx-font-size: 12px;
- -fx-font-style: italic;
+ -fx-font-size: 13px;
+ -fx-font-weight: 600;
+ -fx-text-fill: -fx-slate-600;
}
-/* ===== Separator Styling ===== */
+/* ===== Separators ===== */
.separator {
- -fx-background-color: #E0E0E0;
+ -fx-background-color: -fx-slate-200;
}
-/* ===== Date Picker Styling ===== */
-.date-picker {
- -fx-border-color: #BDBDBD;
- -fx-border-width: 1px;
- -fx-border-radius: 4px;
- -fx-background-radius: 4px;
+.separator .line {
+ -fx-border-color: -fx-slate-200;
+ -fx-border-width: 1px 0 0 0;
}
-.date-picker:focused {
- -fx-border-color: -fx-primary-color;
+/* ===== Tab Pane (if used) ===== */
+.tab-pane {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
}
-/* ===== Grid Pane for Calendar ===== */
-.schedule-grid {
- -fx-background-color: white;
- -fx-border-color: #BDBDBD;
- -fx-border-width: 1px;
+.tab {
+ -fx-background-color: transparent;
+ -fx-background-radius: 12px 12px 0 0;
+ -fx-padding: 12 24;
+ -fx-border-width: 0;
}
-.grid-header {
- -fx-background-color: #E3F2FD;
- -fx-font-weight: bold;
- -fx-padding: 10;
- -fx-alignment: center;
- -fx-min-width: 100;
- -fx-min-height: 40;
+.tab:selected {
+ -fx-background-color: -fx-primary-50;
+ -fx-border-color: -fx-primary;
+ -fx-border-width: 0 0 3 0;
}
-.grid-cell {
- -fx-padding: 10;
- -fx-alignment: center;
- -fx-min-width: 100;
- -fx-min-height: 60;
- -fx-background-color: white;
+.tab .tab-label {
+ -fx-text-fill: -fx-slate-500;
+ -fx-font-weight: 600;
+ -fx-font-size: 13px;
}
-/* ===== List View Styling ===== */
+.tab:selected .tab-label {
+ -fx-text-fill: -fx-primary;
+ -fx-font-weight: 900;
+}
+
+.tab:hover {
+ -fx-background-color: -fx-slate-100;
+}
+
+/* ===== Tooltips ===== */
+.tooltip {
+ -fx-background-color: -fx-slate-900;
+ -fx-text-fill: white;
+ -fx-font-size: 12px;
+ -fx-font-weight: 600;
+ -fx-padding: 8 12;
+ -fx-background-radius: 8px;
+ -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.3), 8, 0.2, 0, 4);
+}
+
+/* ===== List View ===== */
.list-view {
- -fx-border-color: #E0E0E0;
+ -fx-background-color: -fx-surface;
+ -fx-border-color: -fx-slate-200;
-fx-border-width: 1px;
+ -fx-border-radius: 16px;
+ -fx-background-radius: 16px;
}
.list-cell {
- -fx-padding: 8;
+ -fx-background-color: transparent;
+ -fx-text-fill: -fx-slate-800;
+ -fx-padding: 12 16;
+ -fx-font-size: 14px;
}
.list-cell:filled:selected {
- -fx-background-color: -fx-primary-color;
+ -fx-background-color: -fx-primary;
-fx-text-fill: white;
+ -fx-font-weight: 700;
}
.list-cell:filled:hover {
- -fx-background-color: #E3F2FD;
+ -fx-background-color: -fx-primary-50;
}
-/* ===== Scroll Bar Styling ===== */
-.scroll-bar {
- -fx-background-color: transparent;
-}
-
-.scroll-bar .thumb {
- -fx-background-color: #BDBDBD;
- -fx-background-radius: 4px;
-}
-
-.scroll-bar .thumb:hover {
- -fx-background-color: #9E9E9E;
-}
-
-/* ===== Progress Bar ===== */
-.progress-bar {
- -fx-accent: -fx-primary-color;
-}
-
-/* ===== Label Link Style ===== */
-.label-link {
- -fx-text-fill: -fx-primary-color;
- -fx-cursor: hand;
-}
-
-.label-link:hover {
- -fx-underline: true;
-}
+/* ===== Animations & Transitions ===== */
+* {
+ -fx-transition: all 0.2s ease-in-out;
+}
\ No newline at end of file
diff --git a/src/main/resources/org/example/se302/view/import-view.fxml b/src/main/resources/org/example/se302/view/import-view.fxml
index 3e7a95b..f1056c0 100644
--- a/src/main/resources/org/example/se302/view/import-view.fxml
+++ b/src/main/resources/org/example/se302/view/import-view.fxml
@@ -9,71 +9,108 @@
fx:controller="org.example.se302.controller.ImportController"
fitToWidth="true" fitToHeight="true"
hbarPolicy="AS_NEEDED" vbarPolicy="AS_NEEDED">
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ prefHeight="200"
+ promptText="Validation messages and import results will appear here..."
+ style="-fx-font-family: 'Consolas', 'Monaco', monospace; -fx-font-size: 12px;"/>
-
-
+
+
diff --git a/src/main/resources/org/example/se302/view/main-view.fxml b/src/main/resources/org/example/se302/view/main-view.fxml
index 747f3f3..c4e21de 100644
--- a/src/main/resources/org/example/se302/view/main-view.fxml
+++ b/src/main/resources/org/example/se302/view/main-view.fxml
@@ -9,10 +9,17 @@
fx:controller="org.example.se302.controller.MainController"
prefHeight="800.0" prefWidth="1200.0">
-
+
-
+
+
+
+
+
+
+
@@ -21,27 +28,27 @@
-
+
-
+
-
+
-
+
-
+
@@ -51,9 +58,11 @@
-
+
-
+
+
+
diff --git a/src/main/resources/org/example/se302/view/schedule-calendar-view.fxml b/src/main/resources/org/example/se302/view/schedule-calendar-view.fxml
index 0e16ced..1957d14 100644
--- a/src/main/resources/org/example/se302/view/schedule-calendar-view.fxml
+++ b/src/main/resources/org/example/se302/view/schedule-calendar-view.fxml
@@ -12,125 +12,131 @@
-
+
-
+
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
-
+
-
-
-
-
-
-
+
+
+ onAction="#onGenerateSchedule" styleClass="primary-button"/>
+ disable="true"/>
-
-
-
-
-
+
+
+
+
+
-
+ style="-fx-font-weight: 700; -fx-font-size: 14px;"/>
+
+ style="-fx-text-fill: -fx-slate-600; -fx-font-size: 12px;"/>
-
+
-
+
-
-
+
+
+
+
+
+
+
+ style="-fx-background: -fx-surface; -fx-border-color: -fx-slate-200; -fx-border-width: 1; -fx-border-radius: 24; -fx-background-radius: 24;">
-
@@ -138,23 +144,23 @@
-
-
+
+
-
+
-
+
-
+