|
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