Daniel Bohry 1 månad sedan
förälder
incheckning
1dd00b5fdf

+ 1 - 0
.gitignore

@@ -35,3 +35,4 @@ out/
 
 ### VS Code ###
 .vscode/
+.DS_Store

+ 9 - 3
src/main/java/com/lhamacorp/knotes/domain/Note.java

@@ -4,20 +4,26 @@ import com.lhamacorp.knotes.util.CompressionUtils;
 import org.bson.types.Binary;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
 
 import java.time.Instant;
 
 @Document("notes")
-public record Note(@Id String id, Binary compressedContent, Instant createdAt, Instant modifiedAt) {
+public record Note(
+    @Id String id,
+    @Field("content") Binary compressedData,
+    Instant createdAt,
+    Instant modifiedAt
+) {
 
     public Note(String id, String content, Instant createdAt, Instant modifiedAt) {
         this(id, content != null ? new Binary(CompressionUtils.compress(content)) : null, createdAt, modifiedAt);
     }
 
     public String content() {
-        if (compressedContent == null) {
+        if (compressedData == null) {
             return null;
         }
-        return CompressionUtils.decompress(compressedContent.getData());
+        return CompressionUtils.decompress(compressedData.getData());
     }
 }

+ 20 - 20
src/main/resources/static/index.html

@@ -13,31 +13,31 @@
     <link rel="stylesheet" href="style.css">
 </head>
 <body>
-    <div class="header">
-        <div class="title">KNotes</div>
-        <div class="header-right">
-            <span class="note-id" id="noteIdDisplay" style="display: none;"></span>
-            <div class="theme-switch" id="themeSwitch" onclick="toggleTheme()" title="Toggle dark/light theme"></div>
-            <button class="new-btn" onclick="showIdInput()">Open</button>
-            <button class="new-btn" onclick="newNote()">New</button>
-        </div>
+<div class="header">
+    <div class="title"><img src="logo.png" alt="kNotes logo"/> kNotes</div>
+    <div class="header-right">
+        <span class="note-id" id="noteIdDisplay" style="display: none;"></span>
+        <div class="theme-switch" id="themeSwitch" onclick="toggleTheme()" title="Toggle dark/light theme"></div>
+        <button class="new-btn" onclick="showIdInput()">Open</button>
+        <button class="new-btn" onclick="newNote()">New</button>
     </div>
+</div>
 
-    <div class="content">
-        <textarea class="note-area" id="noteContent" placeholder="Start typing your note..."></textarea>
-    </div>
+<div class="content">
+    <textarea class="note-area" id="noteContent" placeholder="Start typing your note..."></textarea>
+</div>
 
-    <div id="idInputOverlay" class="id-input-overlay hidden">
-        <div class="id-input-dialog">
-            <h3>Open Note</h3>
-            <input type="text" id="noteIdInput" class="id-input" placeholder="Enter note ID" />
-            <div class="dialog-buttons">
-                <button class="dialog-btn secondary" onclick="hideIdInput()">Cancel</button>
-                <button class="dialog-btn primary" onclick="loadNoteFromInput()">Open</button>
-            </div>
+<div id="idInputOverlay" class="id-input-overlay hidden">
+    <div class="id-input-dialog">
+        <h3>Open Note</h3>
+        <input type="text" id="noteIdInput" class="id-input" placeholder="Enter note ID"/>
+        <div class="dialog-buttons">
+            <button class="dialog-btn secondary" onclick="hideIdInput()">Cancel</button>
+            <button class="dialog-btn primary" onclick="loadNoteFromInput()">Open</button>
         </div>
     </div>
+</div>
 
-    <script src="script.js"></script>
+<script src="script.js"></script>
 </body>
 </html>

BIN
src/main/resources/static/logo.png


+ 59 - 0
src/main/resources/static/style.css

@@ -67,6 +67,30 @@ body {
     font-size: 18px;
     color: var(--text-primary);
     font-weight: 500;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+}
+
+.title img {
+    height: 28px;
+    width: 28px;
+    border-radius: 6px;
+    vertical-align: middle;
+    flex-shrink: 0;
+    object-fit: contain;
+    background: var(--bg-tertiary);
+    transition: all 0.3s ease;
+}
+
+/* Fallback when logo fails to load */
+.title img[alt]:empty::before,
+.title img[alt]:not([src])::before {
+    content: "📝";
+    display: block;
+    font-size: 16px;
+    text-align: center;
+    line-height: 28px;
 }
 
 .note-id {
@@ -249,6 +273,13 @@ body {
     .title {
         font-size: 16px;
         font-weight: 600;
+        gap: 6px;
+    }
+
+    .title img {
+        height: 24px;
+        width: 24px;
+        border-radius: 4px;
     }
 
     .header-right {
@@ -358,6 +389,13 @@ body {
 
     .title {
         font-size: 18px;
+        gap: 7px;
+    }
+
+    .title img {
+        height: 26px;
+        width: 26px;
+        border-radius: 5px;
     }
 
     .note-area {
@@ -395,6 +433,13 @@ body {
 
     .title {
         font-size: 20px;
+        gap: 8px;
+    }
+
+    .title img {
+        height: 28px;
+        width: 28px;
+        border-radius: 6px;
     }
 
     .note-area {
@@ -417,6 +462,13 @@ body {
 
     .title {
         font-size: 22px;
+        gap: 10px;
+    }
+
+    .title img {
+        height: 32px;
+        width: 32px;
+        border-radius: 7px;
     }
 
     .note-area {
@@ -486,6 +538,13 @@ body {
 
     .title {
         font-size: 14px;
+        gap: 4px;
+    }
+
+    .title img {
+        height: 20px;
+        width: 20px;
+        border-radius: 3px;
     }
 
     .new-btn {

+ 3 - 3
src/test/java/com/lhamacorp/knotes/domain/NoteTest.java

@@ -23,8 +23,8 @@ class NoteTest {
         assertEquals(now, note.modifiedAt());
 
         // Verify that content is actually stored compressed
-        assertNotNull(note.compressedContent());
-        assertTrue(note.compressedContent().getData().length > 0);
+        assertNotNull(note.compressedData());
+        assertTrue(note.compressedData().getData().length > 0);
     }
 
     @Test
@@ -39,7 +39,7 @@ class NoteTest {
         // Then
         assertEquals(id, note.id());
         assertNull(note.content());
-        assertNull(note.compressedContent());
+        assertNull(note.compressedData());
     }
 
     @Test