Conversation
and ManyParametersBuilder
sendMessageToFakeServer
Merge model branch into main
that triggers sendMessage. Improve user interaction for sending messages.
adds validation for text in message formatting text and time
WalkthroughThis PR introduces a chat client application featuring messaging infrastructure with an HTTP-based implementation of a NtfyConnection interface, UI components for displaying and sending messages through a ListView and TextField, new dependencies for HTTP client and environment management, and corresponding tests with WireMock for validation. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant UI as HelloController
participant Model as HelloModel
participant Conn as NtfyConnectionImpl
participant HTTP as HTTP Server
User->>UI: Types message and clicks Send
UI->>UI: Validates input
UI->>Model: sendMessage()
Model->>Conn: send(messageToSend)
Conn->>HTTP: POST /mytopic with message
HTTP->>Conn: 200 OK
Conn->>Model: return true
Model->>Model: Clear messageToSend
UI->>UI: Update ListView with sent message
par Async Receive
Note over Model: receiveMessage() runs on background
Model->>Conn: receive(messageHandler)
Conn->>HTTP: GET /mytopic/json?since=...
HTTP->>Conn: Streaming JSON lines
Conn->>Conn: Parse & filter "message" events
Conn->>Model: Call Consumer with NtfyMessageDto
Model->>Model: Schedule UI update on JavaFX thread
UI->>UI: Add message to ListView
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Areas requiring extra attention:
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 9
🧹 Nitpick comments (4)
src/main/java/com/example/ManyParametersBuilder.java (1)
10-33: Consider adding validation to setter methods.The builder accepts values without validation. For example,
timeoutandsizecould be negative, andcomputerNameormethodcould be null, which may lead to invalidManyParametersinstances.Consider adding validation, for example:
public ManyParametersBuilder setTimeout(int timeout) { + if (timeout < 0) { + throw new IllegalArgumentException("Timeout cannot be negative"); + } this.timeout = timeout; return this; }src/main/java/com/example/HelloFX.java (1)
16-16: Consider standardizing the spelling to "Chat Client".The title uses "Chatt Client" - if this is intended to be English, consider changing it to "Chat Client". If "Chatt" is intentional (e.g., Swedish), this can be ignored.
src/main/java/com/example/NtfyConnection.java (1)
6-8: Consider removing redundantpublicmodifiers.Interface methods are implicitly public in Java, so the explicit
publicmodifiers are redundant. However, this is a style preference and some teams prefer explicit modifiers for clarity.If you prefer the more concise style:
public interface NtfyConnection { - public boolean send(String message); + boolean send(String message); - public void receive(Consumer<NtfyMessageDto> messageHandler); + void receive(Consumer<NtfyMessageDto> messageHandler); }src/test/java/com/example/HelloModelTest.java (1)
31-43: LGTM! Good integration test with WireMock.The test effectively verifies the HTTP communication layer. Consider adding a
@DisplayNameannotation for consistency with the first test.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (16)
.gitignore(1 hunks)pom.xml(1 hunks)src/main/java/com/example/HelloController.java(1 hunks)src/main/java/com/example/HelloFX.java(1 hunks)src/main/java/com/example/HelloModel.java(1 hunks)src/main/java/com/example/ManyParameters.java(1 hunks)src/main/java/com/example/ManyParametersBuilder.java(1 hunks)src/main/java/com/example/NtfyConnection.java(1 hunks)src/main/java/com/example/NtfyConnectionImpl.java(1 hunks)src/main/java/com/example/NtfyMessageDto.java(1 hunks)src/main/java/com/example/Singelton.java(1 hunks)src/main/java/module-info.java(1 hunks)src/main/resources/com/example/hello-view.fxml(1 hunks)src/main/resources/com/example/style.css(1 hunks)src/test/java/com/example/HelloModelTest.java(1 hunks)src/test/java/com/example/NtfyConnectionSpy.java(1 hunks)
🧰 Additional context used
🪛 Biome (2.1.2)
src/main/resources/com/example/style.css
[error] 30-30: Expected a declaration, or an at rule but instead found '/'.
Expected a declaration, or an at rule here.
(parse)
[error] 2-2: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 3-3: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 4-4: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 5-5: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 6-6: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 7-7: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 10-10: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 11-11: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 14-14: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 15-15: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 16-16: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 17-17: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 20-20: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 24-24: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 25-25: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 26-26: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 27-27: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 28-28: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 29-29: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 30-30: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 31-31: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 32-32: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 32-32: Unexpected unknown function: dropshadow
Use a known function instead.
See MDN web docs for more details.
(lint/correctness/noUnknownFunction)
[error] 33-33: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 37-37: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 40-40: Unexpected unknown pseudo-class pressed
See MDN web docs for more details.
(lint/correctness/noUnknownPseudoClass)
[error] 41-41: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
[error] 42-42: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
🔇 Additional comments (9)
.gitignore (1)
3-4: Verify ifpackage-lock.jsonis needed in a Java project.The
.envaddition is appropriate and follows best practices for excluding environment variables and secrets. However,package-lock.jsonis an npm artifact typically used in JavaScript/Node.js projects. Clarify whether this project uses npm for build tooling, frontend dependencies, or other purposes—otherwise, this pattern may be unnecessary or indicate a copy-paste oversight.pom.xml (2)
48-52: The groupIdtools.jackson.coreis correct for Jackson 3.0.1. Jackson 3.0.1 uses the Maven groupIdtools.jackson.core, which represents a change from Jackson 2.x that usedcom.fasterxml.jackson.core. The pom.xml dependency is correct as written.
58-63: Use WireMock's latest stable release instead of the beta version.WireMock 4.0.0-beta.15 is a pre-release version that may introduce stability issues in tests. The latest stable WireMock release is 3.13.1, which should be used instead.
src/main/java/module-info.java (1)
4-7: LGTM! Module dependencies align with the chat client functionality.The added dependencies appropriately support the HTTP-based messaging infrastructure, JSON processing, environment configuration, and JavaFX UI components introduced in this PR.
src/main/java/com/example/HelloFX.java (1)
15-15: LGTM! Stylesheet loading is correctly implemented.The CSS file is properly loaded using the resource path.
src/main/resources/com/example/hello-view.fxml (1)
7-20: LGTM! FXML layout is well-structured.The UI layout is clean and properly configured with appropriate bindings, spacing, and constraints for a chat interface.
src/main/java/com/example/NtfyMessageDto.java (1)
5-6: LGTM! Clean DTO design with appropriate Jackson annotation.Using a record for the immutable DTO is idiomatic, and the
@JsonIgnoreProperties(ignoreUnknown = true)annotation provides resilience against API changes.src/test/java/com/example/NtfyConnectionSpy.java (1)
5-18: LGTM! Test spy implementation is appropriate.The spy correctly captures sent messages for test verification while providing a minimal implementation of the
receivemethod. This is a clean test utility.src/test/java/com/example/HelloModelTest.java (1)
15-29: LGTM! Well-structured unit test.The test clearly verifies that
HelloModel.sendMessage()delegates to the connection with the correct message. Good use of arrange-act-assert pattern and descriptive display name.
| model.messageToSendProperty().bind(messageField.textProperty()); | ||
|
|
There was a problem hiding this comment.
Fix binding to avoid IllegalStateException.
Line 57 binds the model's messageToSend property to the TextField, turning it into a read-only binding. Any later call to HelloModel.setMessageToSend(...) will now throw RuntimeException: A bound value cannot be set once the view is initialized. Use a bidirectional binding so both the control and model can update the value safely.
- model.messageToSendProperty().bind(messageField.textProperty());
+ messageField.textProperty().bindBidirectional(model.messageToSendProperty());📝 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.
| model.messageToSendProperty().bind(messageField.textProperty()); | |
| messageField.textProperty().bindBidirectional(model.messageToSendProperty()); |
🤖 Prompt for AI Agents
In src/main/java/com/example/HelloController.java around lines 57-58, the code
currently does a unidirectional bind:
model.messageToSendProperty().bind(messageField.textProperty()); which makes the
model property read-only and causes IllegalStateException when
HelloModel.setMessageToSend(...) is called later; replace this with a
bidirectional binding by removing the bind(...) call and using
bindBidirectional(...) between model.messageToSendProperty() and
messageField.textProperty() so both view and model can update the value safely.
| public ManyParameters(String computerName, int timeout, String method, int size, byte[] data){ | ||
|
|
||
| } |
There was a problem hiding this comment.
Constructor body is empty—parameters are not stored.
The constructor accepts five parameters but doesn't assign them to any fields or perform any operations. This means instances of ManyParameters won't retain the provided values.
If this class is meant to store these parameters, add corresponding fields and assignments:
public class ManyParameters {
+ private final String computerName;
+ private final int timeout;
+ private final String method;
+ private final int size;
+ private final byte[] data;
+
public ManyParameters(String computerName, int timeout, String method, int size, byte[] data){
-
+ this.computerName = computerName;
+ this.timeout = timeout;
+ this.method = method;
+ this.size = size;
+ this.data = data;
}Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In src/main/java/com/example/ManyParameters.java around lines 5 to 7, the
constructor accepts five parameters but has an empty body so none of the values
are stored; add private final fields for computerName (String), timeout (int),
method (String), size (int) and data (byte[]) to the class and assign each
constructor parameter to its corresponding field (defensive-copy the byte[] into
a new array and store that) so the instance retains the provided values and
remains immutable.
| static void main(){ | ||
| ManyParametersBuilder builder = new ManyParametersBuilder(); | ||
| builder | ||
| .setComputerName("localhost") // Fluent API | ||
| .setTimeout(10) | ||
| .setSize(0) | ||
| .createManyParameters(); | ||
| } |
There was a problem hiding this comment.
Non-standard main method signature.
The main method lacks the required String[] args parameter and is package-private. This method cannot serve as a Java application entry point.
Apply this diff to make it a valid entry point:
- static void main(){
+ public static void main(String[] args){
ManyParametersBuilder builder = new ManyParametersBuilder();📝 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.
| static void main(){ | |
| ManyParametersBuilder builder = new ManyParametersBuilder(); | |
| builder | |
| .setComputerName("localhost") // Fluent API | |
| .setTimeout(10) | |
| .setSize(0) | |
| .createManyParameters(); | |
| } | |
| public static void main(String[] args){ | |
| ManyParametersBuilder builder = new ManyParametersBuilder(); | |
| builder | |
| .setComputerName("localhost") // Fluent API | |
| .setTimeout(10) | |
| .setSize(0) | |
| .createManyParameters(); | |
| } |
🤖 Prompt for AI Agents
In src/main/java/com/example/ManyParameters.java around lines 9 to 16, the main
method is declared as package-private and takes no parameters, so it cannot be
used as a Java application entry point; change its signature to public static
void main(String[] args) and keep the existing body so the JVM can invoke it;
ensure any references to args are added only if needed and adjust method
visibility to public.
| // TODO: handle long blocking send requests to not freeze the JavaFX thread | ||
| // 1. Use thread send message? | ||
| // 2. Use async? | ||
| var response = http.send(httpRequest, HttpResponse.BodyHandlers.ofString()); | ||
| return true; | ||
| } catch (IOException e) { |
There was a problem hiding this comment.
Return false when the server rejects the message.
Line 38 returns true for any response that doesn’t throw, so 4xx/5xx replies are misreported as success and the UI will clear the message even though the server discarded it. Please inspect the status code and only report success on 2xx responses.
- var response = http.send(httpRequest, HttpResponse.BodyHandlers.ofString());
- return true;
+ var response = http.send(httpRequest, HttpResponse.BodyHandlers.ofString());
+ int status = response.statusCode();
+ return status >= 200 && status < 300;🤖 Prompt for AI Agents
In src/main/java/com/example/NtfyConnectionImpl.java around lines 34 to 39, the
method currently returns true for any HTTP response that doesn't throw an
exception, which misreports 4xx/5xx replies as success; change the logic to
inspect the HttpResponse status code after http.send(...) and only return true
for 2xx responses (e.g., statusCode >= 200 && statusCode < 300), otherwise log
the non-2xx status and return false so the UI does not clear the message on
server rejection.
| .thenAccept(response -> response.body() | ||
| .map(s-> | ||
| mapper.readValue(s, NtfyMessageDto.class)) | ||
| .filter(message -> message.event().equals("message")) | ||
| .peek(System.out::println) | ||
| .forEach(messageHandler)); |
There was a problem hiding this comment.
Handle checked exceptions inside the stream pipeline.
Line 57 calls mapper.readValue, which declares throws IOException; placing it directly in the map lambda produces a compile-time error (Unhandled exception type IOException). Wrap the call and rethrow as an unchecked exception (and add import java.io.UncheckedIOException;) so the code compiles and surfaces parsing failures.
- .map(s->
- mapper.readValue(s, NtfyMessageDto.class))
+ .map(s -> {
+ try {
+ return mapper.readValue(s, NtfyMessageDto.class);
+ } catch (IOException e) {
+ throw new UncheckedIOException("Failed to parse Ntfy message", e);
+ }
+ })📝 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.
| .thenAccept(response -> response.body() | |
| .map(s-> | |
| mapper.readValue(s, NtfyMessageDto.class)) | |
| .filter(message -> message.event().equals("message")) | |
| .peek(System.out::println) | |
| .forEach(messageHandler)); | |
| .thenAccept(response -> response.body() | |
| .map(s -> { | |
| try { | |
| return mapper.readValue(s, NtfyMessageDto.class); | |
| } catch (IOException e) { | |
| throw new UncheckedIOException("Failed to parse Ntfy message", e); | |
| } | |
| }) | |
| .filter(message -> message.event().equals("message")) | |
| .peek(System.out::println) | |
| .forEach(messageHandler)); |
🤖 Prompt for AI Agents
In src/main/java/com/example/NtfyConnectionImpl.java around lines 55 to 60, the
stream lambda calls mapper.readValue which throws IOException and causes a
compile error; catch IOException inside the map lambda and rethrow it wrapped in
an UncheckedIOException, and add import java.io.UncheckedIOException; so the
stream compiles and parsing failures surface as unchecked exceptions.
| public class Singelton { | ||
| private final static Singelton instance = new Singelton(); | ||
|
|
||
| private Singelton() { | ||
|
|
||
| } | ||
|
|
||
| public static Singelton getInstance() { | ||
| return instance; | ||
| } | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
Verify the purpose and usage of this class.
This singleton class appears to be unused and unrelated to the PR objectives (adding message input functionality). The class has no state or behavior, and according to the PR summary, no other files reference it.
Run the following script to verify if this class is referenced anywhere in the codebase:
If the class is indeed unused, consider removing it to keep the codebase clean and aligned with YAGNI principles. If it's intended for future use, please add a comment explaining its purpose or defer its addition until it's actually needed.
🏁 Script executed:
#!/bin/bash
# Description: Search for any references to Singelton class in the codebase
# Search for class usage (accounting for the typo)
rg -n --type=java -C3 '\bSingelton\b'Length of output: 784
Remove this unused class.
The verification confirms that Singelton is completely unused—it only references itself and has zero external dependencies in the codebase. This is dead code unrelated to the PR objectives and should be removed.
Additionally, note the typo in the class name: "Singelton" should be "Singleton".
🤖 Prompt for AI Agents
In src/main/java/com/example/Singelton.java lines 3-13: this class is dead code
and should be removed; delete the entire Singelton.java file from the codebase
(or move to archive) to eliminate the unused singleton, and if a correct
singleton implementation is needed elsewhere, create a properly named Singleton
class with correct spelling and intended usage in a separate change instead of
keeping this unused file.
| public class Singelton { | ||
| private final static Singelton instance = new Singelton(); |
There was a problem hiding this comment.
Fix the class name typo: "Singelton" should be "Singleton".
The class name contains a spelling error that affects the class name, filename, and all type references throughout the codebase. This impacts code professionalism and maintainability.
Apply this diff to correct the spelling:
-public class Singelton {
- private final static Singelton instance = new Singelton();
+public class Singleton {
+ private final static Singleton instance = new Singleton();Also rename the file from Singelton.java to Singleton.java.
📝 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.
| public class Singelton { | |
| private final static Singelton instance = new Singelton(); | |
| public class Singleton { | |
| private final static Singleton instance = new Singleton(); |
🤖 Prompt for AI Agents
In src/main/java/com/example/Singelton.java around lines 3-4, the class name is
misspelled as "Singelton"; rename the class to "Singleton" and update the
filename to Singleton.java, then update all references across the codebase
(imports, variable types, constructors, factory methods, tests, and any build
configs) to use the corrected name; ensure the constructor and any static
INSTANCE variable or accessor keep the same behavior but use the new identifier,
run a compile to catch remaining references, and update package-level Javadoc or
comments if they mention the old name.
| -fx-font-size: 12px; | ||
| -fx-font-weight: bold; | ||
| -fx-padding: 8 24 8 24; | ||
| -fx-cursor: hand;/ |
There was a problem hiding this comment.
Fix syntax error: remove trailing slash.
Line 30 contains a syntax error with a trailing slash after the semicolon, which will cause CSS parsing issues.
Apply this diff:
- -fx-cursor: hand;/
+ -fx-cursor: hand;📝 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.
| -fx-cursor: hand;/ | |
| -fx-cursor: hand; |
🧰 Tools
🪛 Biome (2.1.2)
[error] 30-30: Expected a declaration, or an at rule but instead found '/'.
Expected a declaration, or an at rule here.
(parse)
[error] 30-30: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
🤖 Prompt for AI Agents
In src/main/resources/com/example/style.css around line 30, there is a trailing
slash after the semicolon in the rule "-fx-cursor: hand;/" which causes a CSS
syntax error; remove the trailing slash so the line reads "-fx-cursor: hand;"
ensuring the rule ends with just the semicolon and no extra characters.
| -fx-cursor: hand;/ | ||
| -fx-border-color: transparent; | ||
| -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.25), 8, 0, 0, 3); | ||
| -fx-transition: all 0.3s ease; |
There was a problem hiding this comment.
JavaFX CSS doesn't support transitions.
The -fx-transition property is not supported by JavaFX. While this won't cause errors, it will be silently ignored. JavaFX animations need to be implemented programmatically using Timeline or Transition classes instead of CSS.
🧰 Tools
🪛 Biome (2.1.2)
[error] 33-33: Unknown property is not allowed.
See CSS Specifications and browser specific properties for more details.
To resolve this issue, replace the unknown property with a valid CSS property.
(lint/correctness/noUnknownProperty)
🤖 Prompt for AI Agents
In src/main/resources/com/example/style.css around line 33 the CSS uses the
unsupported -fx-transition property which JavaFX will ignore; remove this
property from the stylesheet and implement the intended animation
programmatically in the Java code using JavaFX's Timeline or one of the
Transition subclasses (e.g., FadeTransition, TranslateTransition) to animate the
node(s) with the same duration and easing, or add a CSS comment explaining that
transitions are not supported if you want to keep a placeholder.
adds message input field to enable sending messages in the gui.
adds some styling for the app
Summary by CodeRabbit
Release Notes
New Features
Style