|
14 | 14 | import type { PetPanelData } from '$lib/types/Pet'; |
15 | 15 | import type { JournalEntry } from '$lib/types/JournalEntry'; |
16 | 16 |
|
| 17 | + // Inline placeholder avatar (rounded square with simple mark) |
| 18 | + const AVATAR_PLACEHOLDER = |
| 19 | + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHJ4PSIxNiIgZmlsbD0iI0Q2REM2RSIvPjx0ZXh0IHg9IjI0IiB5PSIyOSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFwcGxlIENvbG9yIEVtb2ppIiBmb250LXNpemU9IjE2IiBmaWxsPSIjRkZGIj7wn5i98J+YvTwvdGV4dD48L3N2Zz4='; |
| 20 | +
|
17 | 21 | let selectedPet: PetPanelData | null = null; |
18 | 22 | let selectedPetId: string | null = null; |
19 | 23 | let pets: PetPanelData[] = []; |
|
187 | 191 | <div class="flex items-center space-x-3"> |
188 | 192 | {#if selectedPet} |
189 | 193 | <img |
190 | | - src={selectedPet.profileImageUrl || '/images/default-pet.png'} |
| 194 | + src={selectedPet.profileImageUrl || AVATAR_PLACEHOLDER} |
191 | 195 | alt={selectedPet.name} |
192 | 196 | class="w-12 h-12 rounded-full object-cover" |
| 197 | + onerror={(e) => { |
| 198 | + (e.target as HTMLImageElement).src = AVATAR_PLACEHOLDER; |
| 199 | + }} |
193 | 200 | /> |
194 | 201 | {/if} |
195 | 202 | <div> |
|
217 | 224 | {#if currentView === 'memories' || currentView === 'dataManager'} |
218 | 225 | <div class="flex space-x-2"> |
219 | 226 | <button |
220 | | - on:click={() => { |
| 227 | + onclick={() => { |
221 | 228 | // return to dashboard; select first active pet if available |
222 | 229 | const firstActive = (pets || []).find((p) => !p.archived) || null; |
223 | 230 | if (firstActive) { |
|
238 | 245 | class="nav-button px-3 py-1 rounded-md text-sm" |
239 | 246 | data-active={currentView === 'dashboard'} |
240 | 247 | disabled={!selectedPet || isArchived(selectedPet)} |
241 | | - on:click={() => uiHelpers.setView('dashboard')} |
| 248 | + onclick={() => uiHelpers.setView('dashboard')} |
242 | 249 | > |
243 | 250 | Dashboard |
244 | 251 | </button> |
245 | 252 | <button |
246 | 253 | class="nav-button px-3 py-1 rounded-md text-sm" |
247 | 254 | data-active={currentView === 'journal'} |
248 | 255 | disabled={!selectedPet || isArchived(selectedPet)} |
249 | | - on:click={() => uiHelpers.setView('journal')} |
| 256 | + onclick={() => uiHelpers.setView('journal')} |
250 | 257 | > |
251 | 258 | New Entry |
252 | 259 | </button> |
253 | 260 | <button |
254 | 261 | class="nav-button px-3 py-1 rounded-md text-sm" |
255 | 262 | data-active={currentView === 'history'} |
256 | 263 | disabled={!selectedPet || isArchived(selectedPet)} |
257 | | - on:click={() => uiHelpers.setView('history')} |
| 264 | + onclick={() => uiHelpers.setView('history')} |
258 | 265 | > |
259 | 266 | History |
260 | 267 | </button> |
|
273 | 280 | </h3> |
274 | 281 | <p>Mark {selectedPet?.name} as passed away?</p> |
275 | 282 | <div class="flex justify-end gap-2"> |
276 | | - <button class="button-secondary" on:click={() => uiHelpers.setView('dashboard')} |
| 283 | + <button class="button-secondary" onclick={() => uiHelpers.setView('dashboard')} |
277 | 284 | >Cancel</button |
278 | 285 | > |
279 | 286 | <button |
280 | 287 | class="button" |
281 | | - on:click={() => { |
| 288 | + onclick={() => { |
282 | 289 | if (selectedPet) { |
283 | 290 | petHelpers.archive(selectedPet.id); |
284 | 291 | if (selectedPetId === selectedPet.id) { |
|
587 | 594 | <!-- Actions --> |
588 | 595 | <div class="flex justify-end space-x-3"> |
589 | 596 | <button |
590 | | - on:click={() => uiHelpers.setView('dashboard')} |
| 597 | + onclick={() => uiHelpers.setView('dashboard')} |
591 | 598 | class="button-secondary" |
592 | 599 | disabled={isSubmitting} |
593 | 600 | > |
594 | 601 | Cancel |
595 | 602 | </button> |
596 | 603 | <button |
597 | | - on:click={submitJournalEntry} |
| 604 | + onclick={submitJournalEntry} |
598 | 605 | class="button flex items-center space-x-2" |
599 | 606 | disabled={!journalInput.trim() || isSubmitting} |
600 | 607 | > |
|
623 | 630 | <div class="empty-state text-center py-12"> |
624 | 631 | <Calendar size={48} style="color: var(--petalytics-subtle);" class="mx-auto mb-4" /> |
625 | 632 | <p class="text-lg mb-2" style="color: var(--petalytics-text);">No entries yet</p> |
626 | | - <button on:click={() => uiHelpers.setView('journal')} class="button"> |
| 633 | + <button onclick={() => uiHelpers.setView('journal')} class="button"> |
627 | 634 | Write First Entry |
628 | 635 | </button> |
629 | 636 | </div> |
|
0 commit comments