Skip to content

feature/frontend-structure, added navbar, sidenavbar laout, booking, application#2

Closed
JohanHiths wants to merge 6 commits intomainfrom
feature/frontend-structure
Closed

feature/frontend-structure, added navbar, sidenavbar laout, booking, application#2
JohanHiths wants to merge 6 commits intomainfrom
feature/frontend-structure

Conversation

@JohanHiths
Copy link
Copy Markdown
Contributor

@JohanHiths JohanHiths commented Mar 30, 2026

Added navbar, sidenavbar, layout, booking, application

Summary by CodeRabbit

  • New Features

    • Added user-facing pages: Home, Applications, Booking, Contact, Profile, and Admin with a shared site layout and layout fragments (header/aside).
    • Introduced top navigation (search + links) and a sidebar for consistent navigation.
  • Style

    • Added comprehensive CSS for global reset, layout containers, cards, navbar, and side-nav with interactive hover states.
  • UX

    • Added application and booking call-to-action blocks and links (some open in a new tab).

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 30, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d26f814c-5933-4a4b-8c06-89e39e5a86f4

📥 Commits

Reviewing files that changed from the base of the PR and between 5673775 and 279f8d8.

📒 Files selected for processing (7)
  • pom.xml
  • src/main/resources/static/css/admin.css
  • src/main/resources/templates/admin.html
  • src/main/resources/templates/booking.html
  • src/main/resources/templates/dashboard.html
  • src/main/resources/templates/layout.html
  • src/main/resources/templates/profile.html
✅ Files skipped from review due to trivial changes (4)
  • src/main/resources/templates/admin.html
  • src/main/resources/templates/profile.html
  • src/main/resources/templates/layout.html
  • src/main/resources/templates/booking.html
🚧 Files skipped from review as they are similar to previous changes (1)
  • pom.xml

📝 Walkthrough

Walkthrough

Adds Thymeleaf and the Thymeleaf Layout Dialect to Maven; introduces a layout template with header/aside fragments; adds several page templates (application, booking, contact, home, profile, admin) and five CSS files under static/css for styling and layout.

Changes

Cohort / File(s) Summary
Build Configuration
pom.xml
Added runtime dependencies: org.springframework.boot:spring-boot-starter-thymeleaf, nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect; minor XML reformatting and EOF newline removal.
Layout & Fragments
src/main/resources/templates/layout.html, src/main/resources/templates/navbar.html, src/main/resources/templates/side-navbar.html
New Thymeleaf layout (layout.html) with layout:fragment="content" and fragment templates: th:fragment="header" (navbar) and th:fragment="aside" (side-navbar). Fragments include CSS via th:href and Font Awesome.
Page Templates
src/main/resources/templates/application.html, src/main/resources/templates/booking.html, src/main/resources/templates/contact.html, src/main/resources/templates/home.html, src/main/resources/templates/profile.html, src/main/resources/templates/admin.html
New page templates, many decorated with layout:decorate="~{layout}" and providing layout:fragment="content"; include basic markup and Thymeleaf URL bindings (th:href, th:action).
Static CSS
src/main/resources/static/css/application.css, src/main/resources/static/css/booking.css, src/main/resources/static/css/home.css, src/main/resources/static/css/navbar.css, src/main/resources/static/css/side-navbar.css
Added five stylesheets (global reset, layout containers, card components, navbar and side-navbar styling, interactive states). Note: .container is defined in multiple files—review cascade/load order for collisions.

Sequence Diagram(s)

sequenceDiagram
    participant Browser as Browser
    participant Server as SpringBoot App
    participant Thymeleaf as Thymeleaf Engine
    participant Static as Static Assets

    Browser->>Server: GET /application (or /booking, /home, ...)
    Server->>Thymeleaf: resolve template, layout, fragments
    Thymeleaf->>Static: include CSS links & CDN assets in rendered HTML
    Thymeleaf-->>Server: return rendered HTML
    Server-->>Browser: HTTP 200 + HTML
    Browser->>Static: GET /css/*.css and CDN assets
    Static-->>Browser: CSS files and assets
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰
I hopped through templates, stitch by stitch,
Fragments snug and styles to pitch,
CSS trails where footsteps roam,
Layouts built to call home,
A tiny hop — the pages stitch.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title partially describes the changeset—it mentions navbar, sidenavbar, layout, and booking/application components added—but is vague and lacks structure typical of professional PR titles, using informal phrasing and a comma-separated list format that reads more like a summary than a proper title. Refine the title to follow conventional PR naming: use a clear verb and subject (e.g., 'Add frontend structure with navbar, sidebar, layout, and booking templates') and avoid comma-separated lists for improved clarity.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/frontend-structure

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@JohanHiths JohanHiths changed the title html feature/frontend-structure, added navbar, sidenavbar laout, booking, application Mar 30, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🧹 Nitpick comments (6)
src/main/resources/static/css/home.css (1)

31-36: Duplicate .nav-links selector - merge declarations.

.nav-links is declared twice (lines 31-36 and lines 63-65). Merge float: right into the first declaration for maintainability.

♻️ Suggested merge
 .nav-links {
     list-style: none;
     display:flex;
     gap: 2rem;
     color:black;
+    float:right;
 }
-
-.nav-links  {
-    float:right;
-}

Also applies to: 63-65

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/home.css` around lines 31 - 36, The .nav-links
selector is declared twice; merge the duplicate declarations by moving the
float: right property from the second .nav-links block into the first .nav-links
block (the one with list-style, display, gap, color) and remove the redundant
second .nav-links rule so all styles for .nav-links live in a single
declaration.
src/main/resources/static/css/booking.css (1)

22-28: Redundant duplicate declarations for .section-calling and .section-booking.

Both selectors have identical border: 1px solid purple; - they could be combined into the shared rule block at lines 16-20, or merged into one selector here.

♻️ Suggested consolidation
 .section-booking, .section-calling {
     margin-top: 20px;
     padding: 20px;
-    border-bottom: 1px solid `#eee`;
+    border: 1px solid purple;
 }
-
-.section-calling {
-    border: 1px solid purple;
-}
-
-.section-booking {
-    border: 1px solid purple;
-}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/booking.css` around lines 22 - 28, The CSS
contains duplicate rules for .section-calling and .section-booking both setting
border: 1px solid purple; — remove these redundant blocks and consolidate the
style by adding the border to the shared selector (e.g., combine into the
existing shared rule or use a grouped selector like .section-calling,
.section-booking) so only one declaration controls the border for both classes;
update or remove the separate .section-calling and .section-booking blocks
accordingly.
src/main/resources/templates/home.html (1)

1-12: Consider using the shared layout system.

The template has an empty body and doesn't use layout:decorate to integrate with the shared layout containing the navbar and side-navbar. For consistency with other pages (like booking.html), consider using the layout dialect.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/home.html` around lines 1 - 12, The home.html
template currently has an empty body and doesn't use the shared layout; update
it to decorate the common layout by adding the layout:decorate attribute (as
used in booking.html) on the <html> tag and move page-specific content into the
layout:fragment sections (e.g., body/content fragment) so the navbar and
side-navbar from the shared layout are included; ensure the template declares
the layout dialect namespace (xmlns:layout) if not already present.
src/main/resources/templates/navbar.html (1)

10-23: Mixed language in UI strings.

Navigation uses English ("Home", "About") but buttons and placeholder use Swedish ("Logga in", "Registrera", "Sök ärende eller info..."). Consider standardizing to one language or implementing proper i18n with Thymeleaf message bundles.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/navbar.html` around lines 10 - 23, The navbar
mixes English and Swedish UI text; standardize by replacing the hardcoded
strings in this template (the input placeholder, the anchor texts with class
"nav-menu", and the buttons with classes "btn-login" and "btn-register") with
Thymeleaf message keys (use th:placeholder and th:text with #{...} keys) and add
corresponding entries in your messages.properties (or localized bundles) for the
chosen language(s); alternatively pick one language and update the literal
strings consistently across the input placeholder and all anchors/buttons.
src/main/resources/static/css/side-navbar.css (1)

17-37: Consolidate repeated padding rules for nav items.

Lines 17–37 repeat the same declaration across six selectors; merge them to reduce duplication.

Suggested refactor
-.home{
-    padding: 10px;
-}
-
-.application{
-    padding: 10px;
-}
-
-.profile{
-    padding: 10px;
-}
-.contact{
-    padding: 10px;
-}
-.logout{
-    padding: 10px;
-}
-
-.booking{
+.home,
+.application,
+.profile,
+.contact,
+.logout,
+.booking{
     padding: 10px;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/side-navbar.css` around lines 17 - 37,
Selectors .home, .application, .profile, .contact, .logout, and .booking all
repeat the same padding: 10px rule; replace the six duplicate blocks with a
single consolidated CSS rule combining those selectors (e.g., .home,
.application, .profile, .contact, .logout, .booking { padding: 10px; }) to
remove duplication and keep behavior identical.
src/main/resources/templates/side-navbar.html (1)

6-6: Consider using a proper fragment file structure for side-navbar.html.

The file contains a full HTML document (DOCTYPE, html, head, body) but is only used as a Thymeleaf fragment in layout.html via th:replace="~{fragments/side-navbar :: aside}". When a fragment is extracted, only the <aside th:fragment="aside"> element is included—the <head> section, including line 6, is never rendered.

Font Awesome is already loaded in layout.html, so there's no functional impact. However, the file structure is misleading. Remove the HTML document scaffolding and keep only the <aside> fragment, or create a separate fragment file in a fragments directory.

If you keep the full HTML structure, splitting the link tags on line 6 is still good practice to avoid mixing th:href and static href attributes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/side-navbar.html` at line 6, The
side-navbar.html currently contains a full HTML scaffold but is used only as a
Thymeleaf fragment (the <aside th:fragment="aside">) via layout.html's
th:replace; remove the DOCTYPE/html/head/body scaffolding and any head-only
assets so the file contains only the <aside th:fragment="aside"> fragment (or
move the fragment into a proper fragments/ file), ensuring layout.html remains
the single place that loads Font Awesome; if you decide to keep the full
document instead, split the <link> on line 6 so you do not mix th:href and a
static href (separate the Thymeleaf-managed href from any static attributes).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main/resources/static/css/application.css`:
- Around line 54-58: The CSS rule adding cursor: pointer to
.forth-container:hover (and .decision-container:hover) is misleading because the
<a> wrapper in application.html around .forth-container has no href; either make
the anchor a real link by adding a valid href or role+JS handler, or remove the
pointer affordance by deleting cursor: pointer from the .forth-container:hover
rule (or scope it only to elements that are actually clickable such as
.decision-container). Update the .forth-container:hover rule (or the anchor in
application.html) accordingly so the pointer only appears for genuinely
interactive elements.
- Around line 7-13: Remove the stray blank line inside the body selector and
change the font-family declaration to remove the quotes around Poppins;
specifically edit the body rule (background-color and font-family properties) so
there is no empty line before background-color and font-family reads Poppins,
sans-serif (unquoted) to satisfy Stylelint.

In `@src/main/resources/static/css/home.css`:
- Around line 10-13: The body selector currently sets background: `#e4e4e4` and
color: white which fails WCAG contrast; update the body rule (background and/or
color) so text meets at least 4.5:1 contrast (e.g., darken the background
significantly or switch text to a dark color) and verify with a contrast
checker; modify the body { background: ...; color: ...; } declarations
accordingly to restore readable contrast.

In `@src/main/resources/static/css/side-navbar.css`:
- Line 5: The font-family declaration in side-navbar.css currently uses quoted
'Poppins' which violates stylelint's font-family-name-quotes rule; update the
CSS rule (the font-family: declaration in side-navbar.css) to remove the quotes
around Poppins so it reads a bare identifier (keeping the fallback sans-serif)
to satisfy the linter.

In `@src/main/resources/templates/application.html`:
- Line 18: The anchor element in application.html (the lone <a> on line with the
empty anchor) is missing an href which breaks keyboard/navigation; update that
<a> to include a valid href pointing to the intended target (or if it is not a
navigation link, replace it with a <button> or add role="button" and proper
keyboard handlers), and ensure aria-label/text remains meaningful—locate the
anchor in application.html and either add the correct href attribute or convert
it to a button with appropriate accessibility attributes.
- Line 32: Update the anchor element with class "a-extend" (the <a ...
class="a-extend" title="Du vill förlänga" href="extend.html" target="_blank">
anchor) to include rel="noopener noreferrer"; ensure any other anchors using
target="_blank" in this template also have rel="noopener noreferrer" for
consistency and security hardening.
- Line 19: Fix the malformed HTML by correcting the invalid attribute and
balancing the divs: replace the invalid fragment "<div class=><div>" (found in
the sequence "<div class=\"third-container\"><div ><div class=><div>") with a
valid element (either supply a proper class value or remove the attribute) and
add the corresponding closing </div> tags so every opened <div> is closed before
the </body>; ensure the two unclosed <div> instances referenced in the comment
are closed (remove the premature body closing) so the DOM structure is balanced
and valid.
- Around line 1-10: The template application.html is missing integration with
the shared Thymeleaf layout; update the root html tag to use
layout:decorate="~{layout}" (matching how booking.html decorates layout.html)
and mark the main content container (the <div class="container">) with the
layout fragment attribute (e.g., layout:fragment="content") so the shared
navbar/sidenav/layout shell are applied; keep existing head elements but ensure
the decorate/fragment attributes are added to the html tag and the container div
respectively.

In `@src/main/resources/templates/booking.html`:
- Line 21: The anchor tag with text "Sök" currently uses a placeholder href="#"
which creates a dead link and breaks keyboard/screen-reader flow; replace it
with a real destination URL or, if it triggers JS behavior, convert it to a
semantic control (e.g., a <button type="button">Sök</button>) and wire the click
handler, and ensure the control has an accessible name/aria-label as needed so
the "Sök" link is keyboard-focusable and screen-reader friendly.
- Line 14: The anchor element with th:href="@{/link}" currently uses
target="_blank" without a rel attribute; update that <a> (the element using
th:href="@{/link}" and target="_blank") to include rel="noopener noreferrer" to
prevent reverse-tabnabbing by ensuring the opened page cannot access
window.opener.

In `@src/main/resources/templates/contact.html`:
- Around line 1-11: Update the contact.html template to replace the placeholder
<title> with a meaningful title like "Contact", add the missing page content
(e.g., a contact header and form or a th:replace/th:include to pull in the
contact fragment) instead of an empty <body>, and integrate the shared layout by
adding the layout:decorate attribute (matching how booking.html uses the shared
layout) so the navbar and site chrome are included; locate and modify the
<title>, <body>, and root <html> element in contact.html to implement these
changes.

In `@src/main/resources/templates/layout.html`:
- Line 3: The root HTML element currently has an empty lang attribute (seen as
lang="") alongside xmlns:layout; update the lang attribute on the root <html>
element in layout.html to a real language code (e.g., "sv") for
accessibility/SEO/assistive-technology correctness so that consumers and tools
properly interpret the document language.
- Around line 12-15: The template uses incorrect fragment paths/names in the
th:replace attributes: replace the current th:replace="~{fragments/navbar ::
header}" with the actual fragment name declared in navbar.html
(th:fragment="navbar") and update th:replace="~{fragments/side-navbar :: aside}"
to reference the correct template location/name (side-navbar.html at root) and
fragment name declared there; in short, change the fragment selectors to match
the declared fragment identifiers (e.g., use ~{navbar :: navbar} or
~{side-navbar :: <actual-fragment-name>} as appropriate) so Thymeleaf can locate
the fragments at runtime.

In `@src/main/resources/templates/navbar.html`:
- Line 1: The fragment name in the navbar template (th:fragment="navbar") does
not match the selector used in layout (th:replace="~{fragments/navbar ::
header}"); fix by either renaming the fragment to th:fragment="header" in the
navbar template or updating the layout reference to
th:replace="~{fragments/navbar :: navbar}" so the fragment selector matches the
fragment name (adjust whichever file contains th:fragment="navbar" or the layout
reference accordingly).

---

Nitpick comments:
In `@src/main/resources/static/css/booking.css`:
- Around line 22-28: The CSS contains duplicate rules for .section-calling and
.section-booking both setting border: 1px solid purple; — remove these redundant
blocks and consolidate the style by adding the border to the shared selector
(e.g., combine into the existing shared rule or use a grouped selector like
.section-calling, .section-booking) so only one declaration controls the border
for both classes; update or remove the separate .section-calling and
.section-booking blocks accordingly.

In `@src/main/resources/static/css/home.css`:
- Around line 31-36: The .nav-links selector is declared twice; merge the
duplicate declarations by moving the float: right property from the second
.nav-links block into the first .nav-links block (the one with list-style,
display, gap, color) and remove the redundant second .nav-links rule so all
styles for .nav-links live in a single declaration.

In `@src/main/resources/static/css/side-navbar.css`:
- Around line 17-37: Selectors .home, .application, .profile, .contact, .logout,
and .booking all repeat the same padding: 10px rule; replace the six duplicate
blocks with a single consolidated CSS rule combining those selectors (e.g.,
.home, .application, .profile, .contact, .logout, .booking { padding: 10px; })
to remove duplication and keep behavior identical.

In `@src/main/resources/templates/home.html`:
- Around line 1-12: The home.html template currently has an empty body and
doesn't use the shared layout; update it to decorate the common layout by adding
the layout:decorate attribute (as used in booking.html) on the <html> tag and
move page-specific content into the layout:fragment sections (e.g., body/content
fragment) so the navbar and side-navbar from the shared layout are included;
ensure the template declares the layout dialect namespace (xmlns:layout) if not
already present.

In `@src/main/resources/templates/navbar.html`:
- Around line 10-23: The navbar mixes English and Swedish UI text; standardize
by replacing the hardcoded strings in this template (the input placeholder, the
anchor texts with class "nav-menu", and the buttons with classes "btn-login" and
"btn-register") with Thymeleaf message keys (use th:placeholder and th:text with
#{...} keys) and add corresponding entries in your messages.properties (or
localized bundles) for the chosen language(s); alternatively pick one language
and update the literal strings consistently across the input placeholder and all
anchors/buttons.

In `@src/main/resources/templates/side-navbar.html`:
- Line 6: The side-navbar.html currently contains a full HTML scaffold but is
used only as a Thymeleaf fragment (the <aside th:fragment="aside">) via
layout.html's th:replace; remove the DOCTYPE/html/head/body scaffolding and any
head-only assets so the file contains only the <aside th:fragment="aside">
fragment (or move the fragment into a proper fragments/ file), ensuring
layout.html remains the single place that loads Font Awesome; if you decide to
keep the full document instead, split the <link> on line 6 so you do not mix
th:href and a static href (separate the Thymeleaf-managed href from any static
attributes).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3bf242e4-3049-43cc-993b-14b71c4ae2df

📥 Commits

Reviewing files that changed from the base of the PR and between d5b0526 and 5514942.

📒 Files selected for processing (17)
  • pom.xml
  • src/main/resources/static/css/application.css
  • src/main/resources/static/css/booking.css
  • src/main/resources/static/css/contact.css
  • src/main/resources/static/css/home.css
  • src/main/resources/static/css/layout.css
  • src/main/resources/static/css/navbar.css
  • src/main/resources/static/css/profile.css
  • src/main/resources/static/css/side-navbar.css
  • src/main/resources/templates/application.html
  • src/main/resources/templates/booking.html
  • src/main/resources/templates/contact.html
  • src/main/resources/templates/home.html
  • src/main/resources/templates/layout.html
  • src/main/resources/templates/navbar.html
  • src/main/resources/templates/profile.html
  • src/main/resources/templates/side-navbar.html

Comment on lines +7 to +13
body {

background-color: #f0f2f5;
font-family: 'Poppins', sans-serif;
color: #333;
line-height: 1.6;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix Stylelint issues: remove empty line and font-family quotes.

Per static analysis hints:

  • Line 9: Remove the empty line before background-color
  • Line 10: Remove quotes around Poppins (Stylelint expects unquoted generic font-family names unless they contain special characters)
🔧 Proposed fix
 body {
-
     background-color: `#f0f2f5`;
-    font-family: 'Poppins', sans-serif;
+    font-family: Poppins, sans-serif;
     color: `#333`;
     line-height: 1.6;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
body {
background-color: #f0f2f5;
font-family: 'Poppins', sans-serif;
color: #333;
line-height: 1.6;
}
body {
background-color: `#f0f2f5`;
font-family: Poppins, sans-serif;
color: `#333`;
line-height: 1.6;
}
🧰 Tools
🪛 Stylelint (17.5.0)

[error] 9-9: Unexpected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 10-10: Unexpected quotes around "Poppins" (font-family-name-quotes)

(font-family-name-quotes)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/application.css` around lines 7 - 13, Remove
the stray blank line inside the body selector and change the font-family
declaration to remove the quotes around Poppins; specifically edit the body rule
(background-color and font-family properties) so there is no empty line before
background-color and font-family reads Poppins, sans-serif (unquoted) to satisfy
Stylelint.

Comment on lines +54 to +58
.forth-container:hover, .decision-container:hover {
border-color: #38bdf8;
background-color: #f8fafc;
cursor: pointer;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

cursor: pointer on .forth-container is misleading without a click handler.

In application.html (lines 17-29), .forth-container is nested inside an <a> tag that has no href attribute. The pointer cursor suggests interactivity, but clicking does nothing. Either add a destination to the anchor or remove the pointer cursor for this element.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/application.css` around lines 54 - 58, The CSS
rule adding cursor: pointer to .forth-container:hover (and
.decision-container:hover) is misleading because the <a> wrapper in
application.html around .forth-container has no href; either make the anchor a
real link by adding a valid href or role+JS handler, or remove the pointer
affordance by deleting cursor: pointer from the .forth-container:hover rule (or
scope it only to elements that are actually clickable such as
.decision-container). Update the .forth-container:hover rule (or the anchor in
application.html) accordingly so the pointer only appears for genuinely
interactive elements.

Comment on lines +10 to +13
body{
background: #e4e4e4;
color:white;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Poor color contrast: white text on light gray background.

color: white on background: #e4e4e4`` (light gray) fails WCAG contrast requirements. White text will be nearly unreadable. Either darken the background significantly or use a dark text color.

🔧 Suggested fix
 body{
     background: `#e4e4e4`;
-    color:white;
+    color: `#333`;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
body{
background: #e4e4e4;
color:white;
}
body{
background: `#e4e4e4`;
color: `#333`;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/home.css` around lines 10 - 13, The body
selector currently sets background: `#e4e4e4` and color: white which fails WCAG
contrast; update the body rule (background and/or color) so text meets at least
4.5:1 contrast (e.g., darken the background significantly or switch text to a
dark color) and verify with a contrast checker; modify the body { background:
...; color: ...; } declarations accordingly to restore readable contrast.

Comment on lines +1 to +11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link th:href="@{/css/contact.css}" rel="stylesheet">
</head>
<body>

</body>
</html> No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Placeholder title and empty body - appears incomplete.

  • Line 5: Title is a generic placeholder; consider changing to "Contact" or similar.
  • Body is empty with no content.
  • Unlike booking.html, this template doesn't use layout:decorate for the shared layout with navbar. Consider integrating with the layout system for consistency.
🔧 Suggested title fix
-    <title>Title</title>
+    <title>Contact</title>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link th:href="@{/css/contact.css}" rel="stylesheet">
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact</title>
<link th:href="@{/css/contact.css}" rel="stylesheet">
</head>
<body>
</body>
</html>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/contact.html` around lines 1 - 11, Update the
contact.html template to replace the placeholder <title> with a meaningful title
like "Contact", add the missing page content (e.g., a contact header and form or
a th:replace/th:include to pull in the contact fragment) instead of an empty
<body>, and integrate the shared layout by adding the layout:decorate attribute
(matching how booking.html uses the shared layout) so the navbar and site chrome
are included; locate and modify the <title>, <body>, and root <html> element in
contact.html to implement these changes.

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" lang="">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Set a real document language value.

Line 3 has lang=""; set it (likely sv) for accessibility, SEO, and proper assistive-technology behavior.

Suggested fix
-      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" lang="">
+      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" lang="sv">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" lang="">
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" lang="sv">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/layout.html` at line 3, The root HTML element
currently has an empty lang attribute (seen as lang="") alongside xmlns:layout;
update the lang attribute on the root <html> element in layout.html to a real
language code (e.g., "sv") for accessibility/SEO/assistive-technology
correctness so that consumers and tools properly interpret the document
language.

Comment on lines +12 to +15
<header th:replace="~{fragments/navbar :: header}"></header>

<div class="main-wrapper" style="display: flex;">
<aside th:replace="~{fragments/side-navbar :: aside}"></aside>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify declared fragment names and replace targets
rg -n 'th:fragment=|th:replace=' src/main/resources/templates/layout.html src/main/resources/templates/navbar.html src/main/resources/templates/side-navbar.html

Repository: ithsjava25/project-backend-team4you

Length of output: 443


Fix fragment path and name mismatches in th:replace (runtime render failure).

Lines 12–15 reference fragments that do not match declared locations and names:

  • Line 12 targets fragments/navbar :: header but navbar.html declares th:fragment="navbar"
  • Line 15 targets fragments/side-navbar :: aside but both files are at root templates level, not in a fragments/ subdirectory
Suggested fix
-<header th:replace="~{fragments/navbar :: header}"></header>
+<header th:replace="~{navbar :: navbar}"></header>

-    <aside th:replace="~{fragments/side-navbar :: aside}"></aside>
+    <aside th:replace="~{side-navbar :: aside}"></aside>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<header th:replace="~{fragments/navbar :: header}"></header>
<div class="main-wrapper" style="display: flex;">
<aside th:replace="~{fragments/side-navbar :: aside}"></aside>
<header th:replace="~{navbar :: navbar}"></header>
<div class="main-wrapper" style="display: flex;">
<aside th:replace="~{side-navbar :: aside}"></aside>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/layout.html` around lines 12 - 15, The template
uses incorrect fragment paths/names in the th:replace attributes: replace the
current th:replace="~{fragments/navbar :: header}" with the actual fragment name
declared in navbar.html (th:fragment="navbar") and update
th:replace="~{fragments/side-navbar :: aside}" to reference the correct template
location/name (side-navbar.html at root) and fragment name declared there; in
short, change the fragment selectors to match the declared fragment identifiers
(e.g., use ~{navbar :: navbar} or ~{side-navbar :: <actual-fragment-name>} as
appropriate) so Thymeleaf can locate the fragments at runtime.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
src/main/resources/static/css/application.css (1)

8-9: ⚠️ Potential issue | 🟡 Minor

Remove the empty declaration gap in body block.

There’s an extra blank line before background-color (Line 9), which fails Stylelint.

Suggested fix
 body {
-
     background-color: `#f0f2f5`;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/application.css` around lines 8 - 9, Remove the
extra blank line inside the CSS body declaration so there are no empty
declaration gaps before properties; edit the body block (where the
background-color property is set) to place background-color immediately after
the opening brace or previous declaration with no blank line, ensuring the rule
in the body block (background-color: `#f0f2f5`;) is contiguous and Stylelint will
pass.
src/main/resources/templates/application.html (3)

35-35: ⚠️ Potential issue | 🟠 Major

Harden target="_blank" usage on Line 35.

Add rel="noopener noreferrer" to prevent window.opener access.

Suggested fix
-                    <a class="a-extend" title="Du vill förlänga" href="extend.html" target="_blank">
+                    <a class="a-extend" title="Du vill förlänga" href="extend.html" target="_blank" rel="noopener noreferrer">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/application.html` at line 35, The anchor element
with class "a-extend" and href "extend.html" uses target="_blank" and should be
hardened by adding rel="noopener noreferrer" to prevent window.opener access;
update the <a class="a-extend" title="Du vill förlänga" href="extend.html"
target="_blank"> element to include rel="noopener noreferrer".

22-57: ⚠️ Potential issue | 🟠 Major

Fix invalid and unbalanced HTML structure from Line 22 onward.

class=> is invalid syntax, and the trailing container structure is not properly closed (</div></div></section> missing). This can break DOM rendering/layout.

Suggested direction
-                    <div class="third-container"><div ><div class=><div>
+                    <div class="third-container"><div><div><div>
...
-<div>
-    <div>
-
-
-</body>
+    </div>
+</div>
+</section>
+</body>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/application.html` around lines 22 - 57, The HTML
has invalid/unbalanced markup starting at the anonymous container with
"class=>": replace the malformed attribute (remove the stray "=>") and ensure
all opened divs are properly closed; verify the structure around the elements
with class names third-container, forth-container and decision-container (and
the card with data-testid="ansok-extend") so each <div> opened has a matching
</div> and any missing closing tags (including the section wrapper referenced in
the review) are added in the correct nesting order to restore valid DOM
structure.

21-21: ⚠️ Potential issue | 🟠 Major

Add a real navigation target (or use a button) for the anchor on Line 21.

The <a> is not keyboard-navigable as a link without href, which is an accessibility blocker.

Suggested fix
-                <a>
+                <a th:href="@{/application/new}">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/application.html` at line 21, The bare <a> tag
in the template must be made keyboard-navigable: either give the <a> a valid
href that points to the real navigation target (or a valid fragment/route) and
meaningful link text, or replace the <a> with a <button> (or element with
role="button") if it triggers an action rather than navigation; if you use a
non-anchor interactive element, ensure proper keyboard support and ARIA
attributes (e.g., role, tabindex, and accessible label) so the element formerly
represented by <a> is operable by keyboard and screen readers.
src/main/resources/templates/navbar.html (1)

1-1: ⚠️ Potential issue | 🔴 Critical

Fix fragment name mismatch: layout expects header but fragment is named navbar.

The fragment is defined as th:fragment="navbar", but based on the relevant code snippet showing layout.html:12 uses th:replace="~{fragments/navbar :: header}", the layout is looking for a fragment named header. This mismatch will prevent the navbar from rendering.

Either rename the fragment to header or update the layout reference to use :: navbar.

🔧 Proposed fix options

Option 1: Rename fragment to match layout's expectation

-<header th:fragment="navbar">
+<header th:fragment="header">

Option 2: Update layout.html to match fragment name

In src/main/resources/templates/layout.html at line 12:

-<header th:replace="~{fragments/navbar :: header}"></header>
+<header th:replace="~{fragments/navbar :: navbar}"></header>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/navbar.html` at line 1, The fragment name in the
navbar template doesn't match the layout's reference: the template declares
th:fragment="navbar" but layout uses th:replace="~{fragments/navbar :: header}";
change the fragment declaration in the navbar template from "navbar" to "header"
(update th:fragment="navbar" → th:fragment="header") so the layout's
th:replace("~{fragments/navbar :: header}") finds and renders the fragment.
🧹 Nitpick comments (2)
src/main/resources/templates/application.html (1)

8-8: Remove duplicate Font Awesome include in this page.

layout.html already loads the same CDN stylesheet, so this page-level include is redundant.

Suggested fix
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/templates/application.html` at line 8, Remove the
redundant Font Awesome stylesheet include in application.html by deleting the
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
element (the same CDN is already loaded in layout.html); ensure no other
page-level code depends on that exact <link> element before removing.
src/main/resources/static/css/navbar.css (1)

53-59: Consider removing !important declarations.

The search button styles use multiple !important declarations, which is generally a code smell indicating specificity issues. If possible, restructure the CSS to achieve the desired styling without !important by increasing selector specificity or adjusting the cascade order.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/navbar.css` around lines 53 - 59, The
.search-btn rule uses multiple !important flags; remove the !important
declarations from background, width, color and any others in the .search-btn
block and instead make the selector more specific or place the rule later in the
cascade so it wins (for example change .search-btn to a more specific selector
like nav .search-btn or add a parent class/ID), and if necessary add a composed
utility class to apply the intended styles; ensure the final rule without
!important still sets background: none, width: auto, color: `#666`, cursor:
pointer, and border: none for the .search-btn element.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main/resources/static/css/navbar.css`:
- Around line 19-29: The li and li a selectors in navbar.css are global; scope
them by prefixing with .navbar (e.g., change li { ... } and li a { ... } to
.navbar li { ... } and .navbar li a { ... }) so styles only apply inside the
navbar component; update any related rules in the file that target bare li or li
a to use the .navbar prefix to avoid global conflicts.
- Around line 75-86: The global selectors `button` and `button a` are
unintentionally styling all buttons; scope them to the navbar by changing those
selectors to target only navbar buttons (e.g., use `.navbar button` and `.navbar
button a`) or move/merge these rules into the existing `.search-btn` /
`.nav-buttons a` rules so only navbar buttons receive the background, padding,
width, border-radius and color styles; update the CSS selectors and remove the
global `button` rules accordingly.
- Around line 1-3: The universal selector (*) in navbar.css is removing
text-decoration site-wide; restrict the rule to navbar-scoped selectors instead.
Replace the global rule with navbar-specific selectors (e.g., .navbar, nav,
.navbar a or .navbar .nav-link) so only elements inside the navbar lose
text-decoration, and keep link-specific rules (anchors) targeted rather than
every element; update the stylesheet where the original '*' rule is defined to
use those navbar selectors.

---

Duplicate comments:
In `@src/main/resources/static/css/application.css`:
- Around line 8-9: Remove the extra blank line inside the CSS body declaration
so there are no empty declaration gaps before properties; edit the body block
(where the background-color property is set) to place background-color
immediately after the opening brace or previous declaration with no blank line,
ensuring the rule in the body block (background-color: `#f0f2f5`;) is contiguous
and Stylelint will pass.

In `@src/main/resources/templates/application.html`:
- Line 35: The anchor element with class "a-extend" and href "extend.html" uses
target="_blank" and should be hardened by adding rel="noopener noreferrer" to
prevent window.opener access; update the <a class="a-extend" title="Du vill
förlänga" href="extend.html" target="_blank"> element to include rel="noopener
noreferrer".
- Around line 22-57: The HTML has invalid/unbalanced markup starting at the
anonymous container with "class=>": replace the malformed attribute (remove the
stray "=>") and ensure all opened divs are properly closed; verify the structure
around the elements with class names third-container, forth-container and
decision-container (and the card with data-testid="ansok-extend") so each <div>
opened has a matching </div> and any missing closing tags (including the section
wrapper referenced in the review) are added in the correct nesting order to
restore valid DOM structure.
- Line 21: The bare <a> tag in the template must be made keyboard-navigable:
either give the <a> a valid href that points to the real navigation target (or a
valid fragment/route) and meaningful link text, or replace the <a> with a
<button> (or element with role="button") if it triggers an action rather than
navigation; if you use a non-anchor interactive element, ensure proper keyboard
support and ARIA attributes (e.g., role, tabindex, and accessible label) so the
element formerly represented by <a> is operable by keyboard and screen readers.

In `@src/main/resources/templates/navbar.html`:
- Line 1: The fragment name in the navbar template doesn't match the layout's
reference: the template declares th:fragment="navbar" but layout uses
th:replace="~{fragments/navbar :: header}"; change the fragment declaration in
the navbar template from "navbar" to "header" (update th:fragment="navbar" →
th:fragment="header") so the layout's th:replace("~{fragments/navbar ::
header}") finds and renders the fragment.

---

Nitpick comments:
In `@src/main/resources/static/css/navbar.css`:
- Around line 53-59: The .search-btn rule uses multiple !important flags; remove
the !important declarations from background, width, color and any others in the
.search-btn block and instead make the selector more specific or place the rule
later in the cascade so it wins (for example change .search-btn to a more
specific selector like nav .search-btn or add a parent class/ID), and if
necessary add a composed utility class to apply the intended styles; ensure the
final rule without !important still sets background: none, width: auto, color:
`#666`, cursor: pointer, and border: none for the .search-btn element.

In `@src/main/resources/templates/application.html`:
- Line 8: Remove the redundant Font Awesome stylesheet include in
application.html by deleting the <link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
element (the same CDN is already loaded in layout.html); ensure no other
page-level code depends on that exact <link> element before removing.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d8630b10-312d-4bb7-adfb-1874cc0530d8

📥 Commits

Reviewing files that changed from the base of the PR and between 5514942 and 94fc4e6.

📒 Files selected for processing (5)
  • src/main/resources/static/css/application.css
  • src/main/resources/static/css/navbar.css
  • src/main/resources/static/css/side-navbar.css
  • src/main/resources/templates/application.html
  • src/main/resources/templates/navbar.html
✅ Files skipped from review due to trivial changes (1)
  • src/main/resources/static/css/side-navbar.css

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/main/resources/static/css/navbar.css (1)

77-79: Consolidate duplicate hover styling for .nav-buttons a.

You define hover background color twice. Keep a single hover rule and include the gold text there to reduce override coupling.

♻️ Proposed refactor
-.nav-buttons a:hover {
-    background-color: `#333`;
-}
@@
-.navbar .nav-buttons a:hover {
+.nav-buttons a:hover {
     background-color: `#333`;
     color: gold;
 }

Also applies to: 93-96

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/static/css/navbar.css` around lines 77 - 79, There are
duplicate hover rules for .nav-buttons a causing overrides; keep a single
.nav-buttons a:hover rule that sets both background-color: `#333` and color: gold,
remove the other duplicate hover block (the one referenced around the later
duplicate) and ensure no subsequent rules override the color so the gold text
and dark background apply consistently on hover.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main/resources/static/css/navbar.css`:
- Line 7: The font-family declaration in navbar.css currently quotes 'Poppins',
which triggers the stylelint rule font-family-name-quotes; update the
declaration in navbar.css (the font-family: 'Poppins', sans-serif; line) to
remove the quotes so it reads font-family: Poppins, sans-serif; to satisfy the
linter.

---

Nitpick comments:
In `@src/main/resources/static/css/navbar.css`:
- Around line 77-79: There are duplicate hover rules for .nav-buttons a causing
overrides; keep a single .nav-buttons a:hover rule that sets both
background-color: `#333` and color: gold, remove the other duplicate hover block
(the one referenced around the later duplicate) and ensure no subsequent rules
override the color so the gold text and dark background apply consistently on
hover.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c5a28f3b-8a8e-4b29-8156-cae090db05f7

📥 Commits

Reviewing files that changed from the base of the PR and between 94fc4e6 and 0422f88.

📒 Files selected for processing (2)
  • src/main/resources/static/css/navbar.css
  • src/main/resources/templates/navbar.html
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/resources/templates/navbar.html

@JohanHiths JohanHiths closed this Mar 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant