From a2677129b2d3841a4596763e9a114f65e5ce8000 Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 10:03:04 +0200 Subject: [PATCH 1/7] fix: center login and sign in --- .../ntnu/idatt1005/group03/UI/LoginScreen.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java index a3bbd21..df54fee 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java @@ -9,6 +9,7 @@ import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.Parent; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.text.Text; @@ -84,7 +85,7 @@ public void start(Stage primaryStage) { } // -------- SCENE 1 (Sign Up) -------- - private GridPane createSignUpRoot() { + private Parent createSignUpRoot() { GridPane root1 = createBaseGrid(); Label nameLabel = new Label("Email address"); @@ -127,11 +128,11 @@ private GridPane createSignUpRoot() { accountBox.setAlignment(Pos.CENTER); root1.add(accountBox, 1, 9, 3, 1); - return root1; + return wrapCentered(root1); } // -------- SCENE 2 (Log In) -------- - private GridPane createLoginRoot() { + private Parent createLoginRoot() { GridPane root2 = createBaseGrid(); Label usernameLabel2 = new Label("Email address or username"); @@ -170,7 +171,7 @@ private GridPane createLoginRoot() { GridPane.setHalignment(forgot, HPos.CENTER); - return root2; + return wrapCentered(root2); } // -------- REUSABLE COMPONENTS -------- @@ -189,6 +190,14 @@ private GridPane createBaseGrid() { return grid; } + private StackPane wrapCentered(GridPane content) { + content.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); + StackPane wrapper = new StackPane(content); + wrapper.setAlignment(Pos.TOP_CENTER); + StackPane.setMargin(content, new Insets(100, 0, 0, 0)); + return wrapper; + } + private void addHeader(GridPane grid, boolean isScene2) { Image image = new Image(getClass().getResourceAsStream("/images/donate2.png")); ImageView imageView = new ImageView(image); From 2e99375ba842d72faa5478491ed4447d2b29cc18 Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 11:03:13 +0200 Subject: [PATCH 2/7] refactor: improve organization list layout, size and row alignment --- .../java/no/ntnu/idatt1005/group03/App.java | 12 +++- .../group03/UI/OrganizationsScreen.java | 60 ++++++++++-------- src/main/resources/fonts/Inter-Regular.ttf | Bin 0 -> 67952 bytes src/main/resources/fonts/Inter-SemiBold.ttf | Bin 0 -> 68060 bytes src/main/resources/styles/app.css | 15 +++-- 5 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/fonts/Inter-Regular.ttf create mode 100644 src/main/resources/fonts/Inter-SemiBold.ttf diff --git a/src/main/java/no/ntnu/idatt1005/group03/App.java b/src/main/java/no/ntnu/idatt1005/group03/App.java index 872a56f..ded5f58 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/App.java +++ b/src/main/java/no/ntnu/idatt1005/group03/App.java @@ -1,6 +1,7 @@ package no.ntnu.idatt1005.group03; import javafx.application.Application; +import javafx.scene.text.Font; import javafx.stage.Stage; import no.ntnu.idatt1005.group03.DAO.DatabaseConnection; import no.ntnu.idatt1005.group03.UI.LoginScreen; @@ -29,6 +30,7 @@ public class App extends Application { public void start(Stage primaryStage) { // 1. Initialize the database so it is ready for the rest of the app DatabaseConnection.initializeDatabase(); + loadFonts(); // 2. Create and launch the LoginScreen LoginScreen loginScreen = new LoginScreen(); @@ -47,4 +49,12 @@ public void start(Stage primaryStage) { public static void main(String[] args) { launch(args); } -} \ No newline at end of file + + /** + * Loads bundled fonts so they are available to the shared stylesheet. + */ + private void loadFonts() { + Font.loadFont(getClass().getResource("/fonts/Inter-Regular.ttf").toExternalForm(), 14); + Font.loadFont(getClass().getResource("/fonts/Inter-SemiBold.ttf").toExternalForm(), 14); + } +} diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java index 4091ef0..14a8103 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java @@ -3,16 +3,11 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; -import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; -import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.layout.*; @@ -71,18 +66,19 @@ public void start(Stage stage) { VBox content = new VBox(15); content.setPadding(new Insets(10)); content.setAlignment(Pos.TOP_CENTER); + content.setFillWidth(true); - GridPane orgGrid = new GridPane(); - setupGrid(orgGrid); + VBox orgList = new VBox(15); + setupList(orgList); content.getChildren().addAll( createHeaderSection(), - createSearchBox(orgGrid), + createSearchBox(orgList), createFavoriteSection(), - orgGrid + orgList ); - refreshOrgGrid(orgGrid, orgController.getOrganizations()); + refreshOrgList(orgList, orgController.getOrganizations()); ScrollPane scrollPane = wrapInScrollPane(content); mainLayout.setCenter(scrollPane); @@ -100,7 +96,7 @@ private Text createHeaderSection() { return charity; } - private StackPane createSearchBox(GridPane orgGrid) { + private StackPane createSearchBox(VBox orgList) { StackPane searchPane = new StackPane(); searchPane.setMaxWidth(Double.MAX_VALUE); @@ -111,7 +107,7 @@ private StackPane createSearchBox(GridPane orgGrid) { search.textProperty().addListener((obs, previousText, currentText) -> { List searchresults = orgController.searchOrganizations(currentText); - refreshOrgGrid(orgGrid, searchresults); + refreshOrgList(orgList, searchresults); }); Button searchClick = new Button("Search"); @@ -119,7 +115,7 @@ private StackPane createSearchBox(GridPane orgGrid) { searchClick.setOnAction(e -> { String query = search.getText(); List searchresults = orgController.searchOrganizations(query); - refreshOrgGrid(orgGrid, searchresults); + refreshOrgList(orgList, searchresults); }); StackPane.setAlignment(searchClick, Pos.CENTER_RIGHT); @@ -133,6 +129,9 @@ private StackPane createSearchBox(GridPane orgGrid) { private VBox createFavoriteSection() { List favorites = user.getFavoriteOrganizations(); VBox favoritesBox = new VBox(10); + favoritesBox.setFillWidth(true); + favoritesBox.setMaxWidth(Double.MAX_VALUE); + favoritesBox.setPadding(new Insets(20)); if (favorites != null && !favorites.isEmpty()) { Text favTitle = new Text("Favorites"); @@ -149,7 +148,7 @@ private VBox createFavoriteSection() { } private HBox createOrgRow(Organization org, String styleClass) { - Label orgLabel = new Label(org.getName() + " (" + org.getOrgNumber() + ")"); + Label orgLabel = new Label(org.getName()); orgLabel.getStyleClass().add("org-label"); orgLabel.setWrapText(true); orgLabel.setMaxWidth(Double.MAX_VALUE); @@ -177,30 +176,39 @@ private HBox createOrgRow(Organization org, String styleClass) { ScreenManager.showHomeScreen(); }); - HBox row; + Region spacer = new Region(); + HBox.setHgrow(spacer, Priority.ALWAYS); + + HBox rightBox; if (org.isApprovedByIK()) { - row = new HBox(10, donateNow, orgLabel, approvedLabel, favoriteButton); + rightBox = new HBox(10, approvedLabel, favoriteButton); } else { - row = new HBox(10, donateNow, orgLabel, favoriteButton); + rightBox = new HBox(10, favoriteButton); } - row.setPadding(new Insets(10)); + rightBox.setAlignment(Pos.CENTER_RIGHT); + + HBox row = new HBox(10, donateNow, orgLabel, spacer, rightBox); + row.setAlignment(Pos.CENTER_LEFT); + row.setMinHeight(64); + row.setPadding(new Insets(8, 16, 8, 16)); row.getStyleClass().add(styleClass); + row.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(orgLabel, Priority.ALWAYS); return row; } - private void refreshOrgGrid(GridPane orgGrid, List organizations) { - orgGrid.getChildren().clear(); - int row = 0; + private void refreshOrgList(VBox orgList, List organizations) { + orgList.getChildren().clear(); for (Organization org : organizations) { - orgGrid.add(createOrgRow(org, "org-box"), 0, row++); + orgList.getChildren().add(createOrgRow(org, "org-box")); } } - private void setupGrid(GridPane grid) { - grid.setPadding(new Insets(20)); - grid.setHgap(10); - grid.setVgap(15); + private void setupList(VBox list) { + list.setPadding(new Insets(20)); + list.setSpacing(15); + list.setFillWidth(true); + list.setMaxWidth(Double.MAX_VALUE); } private ScrollPane wrapInScrollPane(VBox content) { diff --git a/src/main/resources/fonts/Inter-Regular.ttf b/src/main/resources/fonts/Inter-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1e228ab9ab1c9efb809768523af885b03f728007 GIT binary patch literal 67952 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%0Ax5=Ejs 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/fonts/Inter-SemiBold.ttf b/src/main/resources/fonts/Inter-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e9535350e1234ccc2af2e378968a4f36d412d1ae GIT binary patch literal 68060 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/styles/app.css b/src/main/resources/styles/app.css index fbc2b29..3a69499 100644 --- a/src/main/resources/styles/app.css +++ b/src/main/resources/styles/app.css @@ -1,5 +1,9 @@ /* -- app.css -- */ +.root { + -fx-font-family: "Inter"; +} + /* -------- BUTTON BASE AND VARIANTS -------- */ /* Base button */ @@ -106,20 +110,21 @@ } .org-label { -fx-text-fill: black; + -fx-font-size: 16px; } .approved-badge { -fx-background-color: #00d000; -fx-text-fill: black; - -fx-background-radius: 12; - -fx-padding: 3 10; - -fx-font-size: 11px; + -fx-background-radius: 14; + -fx-padding: 4 12; + -fx-font-size: 12px; -fx-font-weight: bold; } .favorite-star { -fx-background-color: transparent; -fx-border-color: transparent; -fx-padding: 0 6 0 6; - -fx-font-size: 18px; + -fx-font-size: 22px; -fx-text-fill: #ffd602; } @@ -138,4 +143,4 @@ .dark-scroll-pane { -fx-background-color: #0B1D26; -fx-background: #0B1D26; -} \ No newline at end of file +} From 5e1f86f07650db73d1fcdf9a20b91bf6b4e727b6 Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 12:25:46 +0200 Subject: [PATCH 3/7] refactor: improve donation screen layout and size --- .../idatt1005/group03/UI/DonationScreen.java | 26 ++++++++++++++----- src/main/resources/styles/app.css | 5 ++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/DonationScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/DonationScreen.java index e7d1eac..0d993ab 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/DonationScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/DonationScreen.java @@ -1,10 +1,12 @@ package no.ntnu.idatt1005.group03.UI; import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Stage; @@ -57,7 +59,11 @@ public DonationScreen(Organization organization, User user) { public void start(Stage stage) { VBox layout = new VBox(15); - layout.setPadding(new Insets(20)); + layout.setPadding(new Insets(30)); + layout.setPrefWidth(920); + layout.setMaxWidth(920); + layout.setFillWidth(true); + layout.setAlignment(Pos.TOP_CENTER); Label orgName = createOrgNameLabel(); Label websiteFeedbackLabel = new Label(); @@ -65,6 +71,7 @@ public void start(Stage stage) { Button favoriteButton = createFavoriteButton(); HBox actionButtons = new HBox(10); + actionButtons.setAlignment(Pos.CENTER); actionButtons.getChildren().addAll( favoriteButton, websiteButton @@ -73,6 +80,10 @@ public void start(Stage stage) { Label amountLabel = new Label("Amount"); TextField amountInput = new TextField(); amountInput.setPromptText("Enter amount"); + amountInput.setPrefWidth(420); + amountInput.setMaxWidth(420); + VBox amountSection = new VBox(8, amountLabel, amountInput); + amountSection.setAlignment(Pos.CENTER); Label feedbackLabel = new Label(); feedbackLabel.setWrapText(true); @@ -84,23 +95,26 @@ public void start(Stage stage) { orgName, actionButtons, websiteFeedbackLabel, - amountLabel, - amountInput, + amountSection, feedbackLabel, donateButton, backButton); + StackPane centeredLayout = new StackPane(layout); + centeredLayout.setAlignment(Pos.CENTER); + StackPane.setMargin(layout, new Insets(100, 0, 0, 0)); + ScreenManager.showRoot( stage, - layout, + centeredLayout, "Donation", getClass().getResource("/styles/app.css").toExternalForm() ); } private Label createOrgNameLabel() { - Label orgName = new Label("Donate to: " + organization.getName()); - orgName.getStyleClass().add("title-text"); + Label orgName = new Label(organization.getName()); + orgName.getStyleClass().add("donation-title"); return orgName; } diff --git a/src/main/resources/styles/app.css b/src/main/resources/styles/app.css index 3a69499..b3c42cd 100644 --- a/src/main/resources/styles/app.css +++ b/src/main/resources/styles/app.css @@ -102,6 +102,11 @@ -fx-font-size: 18px; -fx-font-weight: bold; } +.donation-title { + -fx-font-family: "Inter SemiBold"; + -fx-font-size: 22px; + -fx-text-fill: #040404; +} .bold-text { -fx-font-weight: bold; } From 000c565e3ed8c4fce95f38f9cd4b2daf79c37294 Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 12:41:53 +0200 Subject: [PATCH 4/7] refactor: made login boxes a bit bigger --- .../ntnu/idatt1005/group03/UI/LoginScreen.java | 16 ++++++++-------- src/main/resources/styles/app.css | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java index df54fee..e6eb48d 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java @@ -178,13 +178,13 @@ private Parent createLoginRoot() { private GridPane createBaseGrid() { GridPane grid = new GridPane(); - grid.setPadding(new Insets(10)); - grid.setHgap(10); - grid.setVgap(10); + grid.setPadding(new Insets(12)); + grid.setHgap(12); + grid.setVgap(12); - ColumnConstraints col0 = new ColumnConstraints(50); - ColumnConstraints col1 = new ColumnConstraints(150); - ColumnConstraints col2 = new ColumnConstraints(150); + ColumnConstraints col0 = new ColumnConstraints(58); + ColumnConstraints col1 = new ColumnConstraints(175); + ColumnConstraints col2 = new ColumnConstraints(175); grid.getColumnConstraints().addAll(col0, col1, col2); return grid; @@ -201,8 +201,8 @@ private StackPane wrapCentered(GridPane content) { private void addHeader(GridPane grid, boolean isScene2) { Image image = new Image(getClass().getResourceAsStream("/images/donate2.png")); ImageView imageView = new ImageView(image); - imageView.setFitWidth(40); - imageView.setFitHeight(40); + imageView.setFitWidth(48); + imageView.setFitHeight(48); imageView.setPreserveRatio(true); Button signloginButton = new Button("Sign In"); diff --git a/src/main/resources/styles/app.css b/src/main/resources/styles/app.css index b3c42cd..7631ec6 100644 --- a/src/main/resources/styles/app.css +++ b/src/main/resources/styles/app.css @@ -42,11 +42,11 @@ -fx-font-weight: bold; } .btn-toggle { - -fx-padding: 2 40; + -fx-padding: 4 48; -fx-background-radius: 0; } .btn-super-wide { - -fx-padding: 5 100; + -fx-padding: 7 118; } /* -------- BOXES, PANELS AND LAYOUTS -------- */ From 16fe307ebf990c1f4a14e5d50727a2f9d3004f91 Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 13:01:44 +0200 Subject: [PATCH 5/7] refactor: enhance account screen and scaled it up --- .../idatt1005/group03/UI/AccountScreen.java | 44 ++++++++----------- src/main/resources/styles/app.css | 18 ++++++++ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/AccountScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/AccountScreen.java index 5013d8d..ba202d0 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/AccountScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/AccountScreen.java @@ -5,13 +5,11 @@ import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import javafx.scene.layout.VBox; -import javafx.scene.layout.Priority; import javafx.geometry.Insets; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import no.ntnu.idatt1005.group03.Model.User; -import javafx.scene.layout.Region; import no.ntnu.idatt1005.group03.Model.Donation; /** @@ -49,9 +47,9 @@ public void start(Stage stage) { BorderPane accountLayout = new BorderPane(); accountLayout.setTop(new TopMenu("Account")); - VBox mainContent = new VBox(20); + VBox mainContent = new VBox(28); mainContent.setAlignment(Pos.CENTER); - mainContent.setPadding(new Insets(15)); + mainContent.setPadding(new Insets(24)); mainContent.getChildren().addAll( createProfileSection(), @@ -70,47 +68,44 @@ public void start(Stage stage) { } private VBox createProfileSection() { - VBox profileBox = new VBox(10); - profileBox.setPadding(new Insets(20)); + VBox profileBox = new VBox(14); + profileBox.setPadding(new Insets(28)); profileBox.getStyleClass().add("profile-box"); - profileBox.setPrefSize(300, 150); - profileBox.setMaxSize(300, 150); + profileBox.setPrefSize(380, 220); + profileBox.setMaxSize(380, 220); profileBox.setAlignment(Pos.CENTER); Image profile = new Image(getClass().getResourceAsStream("/images/profile.png")); ImageView profileView = new ImageView(profile); - profileView.setFitWidth(60); - profileView.setFitHeight(60); + profileView.setFitWidth(84); + profileView.setFitHeight(84); profileView.setPreserveRatio(true); Label usernameLabel = new Label(user.getUsername()); - // CSS: Large title text - usernameLabel.getStyleClass().add("title-text"); + usernameLabel.getStyleClass().add("account-name"); Label emailLabel = new Label(user.getEmail()); - // CSS: Muted/grey text - emailLabel.getStyleClass().add("muted-text"); + emailLabel.getStyleClass().add("account-email"); Button editProfileButton = new Button("Edit Profile"); - // CSS: Outline button - editProfileButton.getStyleClass().addAll("btn", "btn-outline"); + editProfileButton.getStyleClass().addAll("btn", "btn-outline", "btn-large"); profileBox.getChildren().addAll(profileView, usernameLabel, emailLabel, editProfileButton); return profileBox; } private VBox createDonationLog() { - VBox donationsBox = new VBox(); + VBox donationsBox = new VBox(8); donationsBox.setAlignment(Pos.CENTER); Label recentTitle = new Label("Donations"); - recentTitle.getStyleClass().add("bold-text"); + recentTitle.getStyleClass().add("account-section-title"); donationsBox.getChildren().add(recentTitle); if (user.getDonations() == null || user.getDonations().isEmpty()) { Label noDonations = new Label("No donations yet."); - noDonations.getStyleClass().add("muted-text"); + noDonations.getStyleClass().add("account-email"); donationsBox.getChildren().add(noDonations); } else { for (Donation donation : user.getDonations()) { @@ -119,6 +114,7 @@ private VBox createDonationLog() { " - " + donation.getAmount() + " kr" + " (" + donation.getDate() + ")" ); + donationLabel.getStyleClass().add("account-donation-text"); donationsBox.getChildren().add(donationLabel); } @@ -130,17 +126,13 @@ private VBox createDonationLog() { private VBox createLogoutSection() { VBox logoutBox = new VBox(); logoutBox.setAlignment(Pos.CENTER); - - // The Region acts like an invisible spring, pushing the logout button to the bottom! - Region spacer = new Region(); - VBox.setVgrow(spacer, Priority.ALWAYS); + logoutBox.setPadding(new Insets(14, 0, 0, 0)); Button logoutButton = new Button("Log out"); - logoutButton.getStyleClass().addAll("btn", "btn-primary"); + logoutButton.getStyleClass().addAll("btn", "btn-primary", "btn-large"); logoutButton.setOnAction(e -> ScreenManager.logout()); - logoutBox.getChildren().addAll(spacer, logoutButton); - VBox.setVgrow(logoutBox, Priority.ALWAYS); + logoutBox.getChildren().add(logoutButton); return logoutBox; } } diff --git a/src/main/resources/styles/app.css b/src/main/resources/styles/app.css index 7631ec6..6613b2a 100644 --- a/src/main/resources/styles/app.css +++ b/src/main/resources/styles/app.css @@ -102,6 +102,24 @@ -fx-font-size: 18px; -fx-font-weight: bold; } +.account-name { + -fx-font-family: "Inter SemiBold"; + -fx-font-size: 26px; + -fx-text-fill: #040404; +} +.account-email { + -fx-font-size: 18px; + -fx-text-fill: #4a4949; +} +.account-section-title { + -fx-font-family: "Inter SemiBold"; + -fx-font-size: 22px; + -fx-text-fill: #040404; +} +.account-donation-text { + -fx-font-size: 17px; + -fx-text-fill: #040404; +} .donation-title { -fx-font-family: "Inter SemiBold"; -fx-font-size: 22px; From 08e5fa57b4056ea59c2545064783c37583b9e2ba Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 13:21:40 +0200 Subject: [PATCH 6/7] refactor: enhance colors in organization screen according to wcag --- src/main/resources/styles/app.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/resources/styles/app.css b/src/main/resources/styles/app.css index 6613b2a..2d51a4a 100644 --- a/src/main/resources/styles/app.css +++ b/src/main/resources/styles/app.css @@ -136,8 +136,8 @@ -fx-font-size: 16px; } .approved-badge { - -fx-background-color: #00d000; - -fx-text-fill: black; + -fx-background-color: #21a129; + -fx-text-fill: white; -fx-background-radius: 14; -fx-padding: 4 12; -fx-font-size: 12px; @@ -148,13 +148,14 @@ -fx-border-color: transparent; -fx-padding: 0 6 0 6; -fx-font-size: 22px; - -fx-text-fill: #ffd602; + -fx-text-fill: #b68a1e; } /* -------- INPUTS AND SCROLL PANES -------- */ .search-field { - -fx-text-box-border: #a09b9b; + -fx-text-box-border: #6f6f6f; + -fx-prompt-text-fill: #666666; -fx-padding: 7 50; -fx-background-radius: 25; -fx-border-radius: 25; From 0ee0a44aa590e6facd18c95fe60b93d071bed3fc Mon Sep 17 00:00:00 2001 From: Aksel Kirkhorn Date: Thu, 23 Apr 2026 13:31:15 +0200 Subject: [PATCH 7/7] feat: update javadoc for the ui changes --- .../no/ntnu/idatt1005/group03/UI/AboutUsScreen.java | 10 ---------- .../no/ntnu/idatt1005/group03/UI/LoginScreen.java | 11 ++++++----- .../idatt1005/group03/UI/OrganizationsScreen.java | 5 +++-- .../no/ntnu/idatt1005/group03/UI/ScreenManager.java | 9 ++++++++- .../java/no/ntnu/idatt1005/group03/UI/TopMenu.java | 6 +++--- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/AboutUsScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/AboutUsScreen.java index 5f24826..a562154 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/AboutUsScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/AboutUsScreen.java @@ -9,8 +9,6 @@ import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import javafx.stage.Stage; -import no.ntnu.idatt1005.group03.Model.User; - /** * Displays the "About Us" screen in the application. @@ -25,14 +23,6 @@ */ public class AboutUsScreen { - /** - * Constructs a new {@code AboutUsScreen} instance. - * - * @param user the current user context for the screen - */ - public AboutUsScreen(User user) { - } - /** * Builds and displays the About Us screen on the provided stage. * diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java index e6eb48d..8949060 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/LoginScreen.java @@ -25,9 +25,10 @@ * Displays the login and sign-up screen for the application. * *

This class is part of the UI layer in the MVC architecture and serves as the - * entry point for user authentication. It provides two scenes: one for user registration - * and one for user login. The class coordinates user input with the authentication - * controller and handles navigation to the home screen after successful authentication.

+ * entry point for user authentication. It provides both user registration and user login + * flows, reusing a single JavaFX scene while swapping between different root layouts. + * The class coordinates user input with the authentication controller and handles + * navigation to the home screen after successful authentication.

* *

The class extends {@link Application} and is responsible for initializing the * primary stage used for login and registration.

@@ -45,8 +46,8 @@ public class LoginScreen extends Application { // homepage * Initializes and displays the login screen on the provided primary stage. * *

This method creates the authentication controller and favorite controller, - * initializes feedback labels, builds both the sign-up and login scenes, - * and displays the initial scene.

+ * initializes feedback labels, prepares the shared authentication scene, + * and displays the initial sign-up view.

* * @param primaryStage the primary JavaFX stage for the application */ diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java b/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java index 14a8103..4697a25 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/OrganizationsScreen.java @@ -26,8 +26,9 @@ * *

This class is part of the UI layer in the MVC architecture and is responsible * for presenting available organizations to the user. It allows the user to browse - * organizations, search by name or category, view favorite organizations, mark or unmark - * favorites, and navigate to the donation screen for a selected organization.

+ * organizations, search through the available organization list, view favorite + * organizations, mark or unmark favorites, and navigate to the donation screen for a + * selected organization.

* *

The screen retrieves organization data through the {@link OrganizationController} * and favorite-related actions through the {@link FavoriteController}.

diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/ScreenManager.java b/src/main/java/no/ntnu/idatt1005/group03/UI/ScreenManager.java index da2795f..334c763 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/ScreenManager.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/ScreenManager.java @@ -57,6 +57,13 @@ public static User getCurrentUser() { return currentUser; } + /** + * Shows the given scene on the stage while reusing the existing scene when possible. + * + * @param stage the stage to update + * @param scene the scene to display, or whose root and stylesheet should be reused + * @param title the window title + */ public static void showScene(Stage stage, Scene scene, String title) { Scene currentScene = stage.getScene(); stage.setTitle(title); @@ -103,7 +110,7 @@ public static void showHomeScreen() { * Displays the About Us screen for the current user. */ public static void showAboutUsScreen() { - new AboutUsScreen(currentUser).start(mainStage); + new AboutUsScreen().start(mainStage); } /** diff --git a/src/main/java/no/ntnu/idatt1005/group03/UI/TopMenu.java b/src/main/java/no/ntnu/idatt1005/group03/UI/TopMenu.java index 673710e..cb2d874 100644 --- a/src/main/java/no/ntnu/idatt1005/group03/UI/TopMenu.java +++ b/src/main/java/no/ntnu/idatt1005/group03/UI/TopMenu.java @@ -18,7 +18,7 @@ * It includes a clickable logo, navigation links, and an account button.

* *

The menu highlights the currently active screen and disables navigation for that - * screen by showing it as styled text instead of an active link or button.

+ * screen by keeping its control visible while omitting the navigation action.

*/ public class TopMenu extends HBox { @@ -27,7 +27,7 @@ public class TopMenu extends HBox { * *

The menu adapts its navigation behavior depending on which screen is currently * displayed. The active screen is visually highlighted, while navigation controls - * for other screens remain available.

+ * for other screens remain available and clickable.

* * @param currentScreen the name of the currently active screen */ @@ -80,4 +80,4 @@ public TopMenu(String currentScreen) { this.getChildren().add(accountButton); } } -} \ No newline at end of file +}