diff --git a/src/lib/components/AddButton.svelte b/src/lib/components/AddButton.svelte index 382e829..756d472 100644 --- a/src/lib/components/AddButton.svelte +++ b/src/lib/components/AddButton.svelte @@ -1,6 +1,8 @@ - + diff --git a/src/lib/components/PaymentModal.svelte b/src/lib/components/PaymentModal.svelte index ede8566..c2e1088 100644 --- a/src/lib/components/PaymentModal.svelte +++ b/src/lib/components/PaymentModal.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; import ProfilePicture from './ProfilePicture.svelte'; + import EditButton from './EditButton.svelte'; import { getCategoryEmoji, getCategoryName } from '$lib/utils/categories'; export let paymentId; @@ -214,28 +215,31 @@
{#if payment && payment.createdBy === session?.user?.nickname} - Edit Payment {/if} - +
{/if} +{#if payment && payment.createdBy === session?.user?.nickname} + +{/if} + \ No newline at end of file + diff --git a/src/routes/cospend/payments/+page.svelte b/src/routes/cospend/payments/+page.svelte index faf82c9..17ea682 100644 --- a/src/routes/cospend/payments/+page.svelte +++ b/src/routes/cospend/payments/+page.svelte @@ -4,6 +4,7 @@ import ProfilePicture from '$lib/components/ProfilePicture.svelte'; import { getCategoryEmoji, getCategoryName } from '$lib/utils/categories'; import { isSettlementPayment, getSettlementIcon, getSettlementReceiver } from '$lib/utils/settlements'; + import AddButton from '$lib/components/AddButton.svelte'; export let data; @@ -19,7 +20,7 @@ onMount(async () => { // Mark that JavaScript is loaded for CSS document.body.classList.add('js-loaded'); - + // Only refresh if we don't have server data if (payments.length === 0) { await loadPayments(); @@ -30,22 +31,22 @@ try { loading = true; const response = await fetch(`/api/cospend/payments?limit=${limit}&offset=${page * limit}`); - + if (!response.ok) { throw new Error('Failed to load payments'); } const result = await response.json(); - + if (page === 0) { payments = result.payments; } else { payments = [...payments, ...result.payments]; } - + hasMore = result.payments.length === limit; currentPage = page; - + } catch (err) { error = err.message; } finally { @@ -97,7 +98,7 @@ function getSplitDescription(payment) { if (!payment.splits || payment.splits.length === 0) return 'No splits'; - + if (payment.splitMethod === 'equal') { return `Split equally among ${payment.splits.length} people`; } else if (payment.splitMethod === 'full') { @@ -118,12 +119,6 @@

All Payments

-

Manage your shared expenses

-
-
@@ -228,14 +223,14 @@ Created by {payment.createdBy} {#if payment.createdBy === data.session.user.nickname}
- - @@ -274,6 +269,8 @@ {/if} + + \ No newline at end of file + diff --git a/src/routes/cospend/payments/add/+page.svelte b/src/routes/cospend/payments/add/+page.svelte index c78120b..0ed3e1a 100644 --- a/src/routes/cospend/payments/add/+page.svelte +++ b/src/routes/cospend/payments/add/+page.svelte @@ -399,7 +399,7 @@

Add New Payment

- ← Back to Cospend +

Create a new shared expense or recurring payment

@@ -776,20 +776,30 @@ } .header { - display: flex; - justify-content: space-between; - align-items: center; + text-align: center; margin-bottom: 2rem; } .header h1 { - margin: 0; - color: #333; + margin: 0 0 0.5rem 0; + color: var(--nord0); + font-size: 2rem; } - .back-link { - color: #1976d2; - text-decoration: none; + .header p { + margin: 0; + color: var(--nord3); + font-size: 1.1rem; + } + + @media (prefers-color-scheme: dark) { + .header h1 { + color: var(--font-default-dark); + } + + .header p { + color: var(--nord4); + } } .payment-form { @@ -799,19 +809,31 @@ } .form-section { - background: white; + background: var(--nord6); padding: 1.5rem; border-radius: 0.75rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border: 1px solid var(--nord4); } .form-section h2 { margin-top: 0; margin-bottom: 1rem; - color: #333; + color: var(--nord0); font-size: 1.25rem; } + @media (prefers-color-scheme: dark) { + .form-section { + background: var(--nord1); + border-color: var(--nord2); + } + + .form-section h2 { + color: var(--font-default-dark); + } + } + .form-group { margin-bottom: 1rem; } @@ -826,36 +848,64 @@ display: block; margin-bottom: 0.5rem; font-weight: 500; - color: #555; + color: var(--nord2); + } + + @media (prefers-color-scheme: dark) { + label { + color: var(--nord5); + } } input, textarea, select { width: 100%; padding: 0.75rem; - border: 1px solid #ddd; + border: 1px solid var(--nord4); border-radius: 0.5rem; font-size: 1rem; box-sizing: border-box; + background-color: var(--nord6); + color: var(--nord0); } input:focus, textarea:focus, select:focus { outline: none; - border-color: #1976d2; - box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2); + border-color: var(--blue); + box-shadow: 0 0 0 2px rgba(94, 129, 172, 0.2); + } + + @media (prefers-color-scheme: dark) { + input, textarea, select { + background-color: var(--nord2); + color: var(--font-default-dark); + border-color: var(--nord3); + } } .image-upload { - border: 2px dashed #ddd; + border: 2px dashed var(--nord4); border-radius: 0.5rem; padding: 2rem; text-align: center; cursor: pointer; transition: all 0.2s; + background-color: var(--nord5); } .image-upload:hover { - border-color: #1976d2; - background-color: #f5f5f5; + border-color: var(--blue); + background-color: var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .image-upload { + background-color: var(--nord2); + border-color: var(--nord3); + } + + .image-upload:hover { + background-color: var(--nord3); + } } .upload-label { @@ -864,18 +914,32 @@ } .upload-content svg { - color: #666; + color: var(--nord3); margin-bottom: 1rem; } .upload-content p { margin: 0 0 0.5rem 0; font-weight: 500; - color: #333; + color: var(--nord0); } .upload-content small { - color: #666; + color: var(--nord3); + } + + @media (prefers-color-scheme: dark) { + .upload-content svg { + color: var(--nord4); + } + + .upload-content p { + color: var(--font-default-dark); + } + + .upload-content small { + color: var(--nord4); + } } .image-preview { @@ -890,12 +954,18 @@ } .remove-image { - background-color: #d32f2f; + background-color: var(--red); color: white; border: none; padding: 0.5rem 1rem; border-radius: 0.25rem; cursor: pointer; + transition: all 0.2s; + } + + .remove-image:hover { + background-color: var(--nord11); + transform: translateY(-1px); } .users-list { @@ -909,9 +979,17 @@ display: flex; align-items: center; gap: 0.5rem; - background-color: #f5f5f5; + background-color: var(--nord5); padding: 0.5rem 0.75rem; border-radius: 1rem; + border: 1px solid var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .user-item { + background-color: var(--nord2); + border-color: var(--nord3); + } } .user-item.with-profile { @@ -920,10 +998,11 @@ .user-item .username { font-weight: 500; + color: var(--nord0); } .you-badge { - background-color: #1976d2; + background-color: var(--blue); color: white; padding: 0.125rem 0.5rem; border-radius: 1rem; @@ -931,28 +1010,51 @@ font-weight: 500; } + @media (prefers-color-scheme: dark) { + .user-item .username { + color: var(--font-default-dark); + } + } + .predefined-users { - background-color: #f8f9fa; + background-color: var(--nord5); padding: 1rem; border-radius: 0.5rem; - border: 1px solid #e9ecef; + border: 1px solid var(--nord4); } .predefined-note { margin: 0 0 1rem 0; - color: #666; + color: var(--nord2); font-size: 0.9rem; font-style: italic; } + @media (prefers-color-scheme: dark) { + .predefined-users { + background-color: var(--nord2); + border-color: var(--nord3); + } + + .predefined-note { + color: var(--nord4); + } + } + .remove-user { - background-color: #d32f2f; + background-color: var(--red); color: white; border: none; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 0.75rem; cursor: pointer; + transition: all 0.2s; + } + + .remove-user:hover { + background-color: var(--nord11); + transform: translateY(-1px); } .add-user { @@ -965,20 +1067,34 @@ } .add-user button { - background-color: #1976d2; + background-color: var(--blue); color: white; border: none; padding: 0.75rem 1rem; border-radius: 0.5rem; cursor: pointer; + transition: all 0.2s; + } + + .add-user button:hover { + background-color: var(--nord10); + transform: translateY(-1px); } .proportional-splits { - border: 1px solid #ddd; + border: 1px solid var(--nord4); border-radius: 0.5rem; padding: 1rem; margin-bottom: 1rem; + background-color: var(--nord5); + } + + @media (prefers-color-scheme: dark) { + .proportional-splits { + border-color: var(--nord3); + background-color: var(--nord2); + } } .proportional-splits h3 { @@ -1003,9 +1119,17 @@ } .split-preview { - background-color: #f8f9fa; + background-color: var(--nord5); padding: 1rem; border-radius: 0.5rem; + border: 1px solid var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .split-preview { + background-color: var(--nord2); + border-color: var(--nord3); + } } .split-preview h3 { @@ -1027,21 +1151,28 @@ } .amount.positive { - color: #2e7d32; + color: var(--green); font-weight: 500; } .amount.negative { - color: #d32f2f; + color: var(--red); font-weight: 500; } .error { - background-color: #ffebee; - color: #d32f2f; + background-color: var(--nord6); + color: var(--red); padding: 1rem; border-radius: 0.5rem; margin-bottom: 1rem; + border: 1px solid var(--red); + } + + @media (prefers-color-scheme: dark) { + .error { + background-color: var(--accent-dark); + } } .form-actions { @@ -1059,13 +1190,15 @@ } .btn-primary { - background-color: #1976d2; + background-color: var(--blue); color: white; border: none; } .btn-primary:hover:not(:disabled) { - background-color: #1565c0; + background-color: var(--nord10); + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); } .btn-primary:disabled { @@ -1074,13 +1207,29 @@ } .btn-secondary { - background-color: #f5f5f5; - color: #333; - border: 1px solid #ddd; + background-color: var(--nord5); + color: var(--nord0); + border: 1px solid var(--nord4); + text-decoration: none; + display: inline-block; + text-align: center; } .btn-secondary:hover { - background-color: #e8e8e8; + background-color: var(--nord4); + text-decoration: none; + } + + @media (prefers-color-scheme: dark) { + .btn-secondary { + background-color: var(--nord2); + color: var(--font-default-dark); + border-color: var(--nord3); + } + + .btn-secondary:hover { + background-color: var(--nord3); + } } .personal-splits { @@ -1088,23 +1237,40 @@ } .personal-splits .description { - color: #666; + color: var(--nord2); font-size: 0.9rem; margin-bottom: 1rem; font-style: italic; } + @media (prefers-color-scheme: dark) { + .personal-splits .description { + color: var(--nord4); + } + } + .remainder-info { margin-top: 1rem; padding: 1rem; - background-color: #f8f9fa; + background-color: var(--nord5); border-radius: 0.5rem; - border: 1px solid #e9ecef; + border: 1px solid var(--nord4); } .remainder-info.error { - background-color: #fff5f5; - border-color: #fed7d7; + background-color: var(--nord6); + border-color: var(--red); + } + + @media (prefers-color-scheme: dark) { + .remainder-info { + background-color: var(--nord2); + border-color: var(--nord3); + } + + .remainder-info.error { + background-color: var(--accent-dark); + } } .remainder-info span { @@ -1114,7 +1280,7 @@ } .error-message { - color: #d32f2f; + color: var(--red); font-weight: 600; margin-top: 0.5rem; font-size: 0.9rem; @@ -1150,7 +1316,13 @@ .manual-users p { margin: 0 0 0.5rem 0; font-size: 0.9rem; - color: #666; + color: var(--nord2); + } + + @media (prefers-color-scheme: dark) { + .manual-users p { + color: var(--nord4); + } } /* Recurring payment styles */ @@ -1169,29 +1341,50 @@ .recurring-options { margin-top: 1rem; padding: 1rem; - background-color: #f8f9fa; + background-color: var(--nord5); border-radius: 0.5rem; - border: 1px solid #e9ecef; + border: 1px solid var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .recurring-options { + background-color: var(--nord2); + border-color: var(--nord3); + } } .help-text { display: block; margin-top: 0.25rem; font-size: 0.8rem; - color: #666; + color: var(--nord3); font-style: italic; } + @media (prefers-color-scheme: dark) { + .help-text { + color: var(--nord4); + } + } + .help-text p { margin: 0.5rem 0 0.25rem 0; } .help-text code { - background-color: #f5f5f5; + background-color: var(--nord5); padding: 0.125rem 0.25rem; border-radius: 0.25rem; font-family: monospace; font-size: 0.85em; + border: 1px solid var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .help-text code { + background-color: var(--nord2); + border-color: var(--nord3); + } } .help-text ul { @@ -1204,20 +1397,20 @@ } .field-error { - color: #d32f2f; + color: var(--red); font-size: 0.875rem; margin-top: 0.25rem; font-weight: 500; } input.error { - border-color: #d32f2f; - box-shadow: 0 0 0 2px rgba(211, 47, 47, 0.2); + border-color: var(--red); + box-shadow: 0 0 0 2px rgba(191, 97, 106, 0.2); } .execution-preview { - background-color: #e3f2fd; - border: 1px solid #2196f3; + background-color: var(--nord8); + border: 1px solid var(--blue); border-radius: 0.5rem; padding: 1rem; margin-top: 1rem; @@ -1225,24 +1418,34 @@ .execution-preview h3 { margin: 0 0 0.5rem 0; - color: #1976d2; + color: var(--blue); font-size: 1rem; } .next-execution { font-size: 1.1rem; font-weight: 600; - color: #1976d2; + color: var(--blue); margin: 0.5rem 0; } .frequency-description { - color: #666; + color: var(--nord2); font-size: 0.9rem; margin: 0; font-style: italic; } + @media (prefers-color-scheme: dark) { + .execution-preview { + background-color: var(--nord2); + } + + .frequency-description { + color: var(--nord4); + } + } + @media (max-width: 600px) { .add-payment { padding: 1rem; diff --git a/src/routes/cospend/payments/edit/[id]/+page.svelte b/src/routes/cospend/payments/edit/[id]/+page.svelte index 42446c7..1e2c020 100644 --- a/src/routes/cospend/payments/edit/[id]/+page.svelte +++ b/src/routes/cospend/payments/edit/[id]/+page.svelte @@ -138,7 +138,7 @@

Edit Payment

- ← Back to Payments +

Modify payment details and receipt image

{#if loading} @@ -299,20 +299,30 @@ } .header { - display: flex; - justify-content: space-between; - align-items: center; + text-align: center; margin-bottom: 2rem; } .header h1 { - margin: 0; - color: #333; + margin: 0 0 0.5rem 0; + color: var(--nord0); + font-size: 2rem; } - .back-link { - color: #1976d2; - text-decoration: none; + .header p { + margin: 0; + color: var(--nord3); + font-size: 1.1rem; + } + + @media (prefers-color-scheme: dark) { + .header h1 { + color: var(--font-default-dark); + } + + .header p { + color: var(--nord4); + } } .loading, .error { @@ -322,9 +332,16 @@ } .error { - color: #d32f2f; - background-color: #ffebee; + color: var(--red); + background-color: var(--nord6); border-radius: 0.5rem; + border: 1px solid var(--red); + } + + @media (prefers-color-scheme: dark) { + .error { + background-color: var(--accent-dark); + } } .payment-form { @@ -334,19 +351,31 @@ } .form-section { - background: white; + background: var(--nord6); padding: 1.5rem; border-radius: 0.75rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border: 1px solid var(--nord4); } .form-section h2 { margin-top: 0; margin-bottom: 1rem; - color: #333; + color: var(--nord0); font-size: 1.25rem; } + @media (prefers-color-scheme: dark) { + .form-section { + background: var(--nord1); + border-color: var(--nord2); + } + + .form-section h2 { + color: var(--font-default-dark); + } + } + .form-group { margin-bottom: 1rem; } @@ -361,29 +390,44 @@ display: block; margin-bottom: 0.5rem; font-weight: 500; - color: #555; + color: var(--nord2); + } + + @media (prefers-color-scheme: dark) { + label { + color: var(--nord5); + } } input, textarea, select { width: 100%; padding: 0.75rem; - border: 1px solid #ddd; + border: 1px solid var(--nord4); border-radius: 0.5rem; font-size: 1rem; box-sizing: border-box; + background-color: var(--nord6); + color: var(--nord0); } input:focus, textarea:focus, select:focus { outline: none; - border-color: #1976d2; - box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2); + border-color: var(--blue); + box-shadow: 0 0 0 2px rgba(94, 129, 172, 0.2); } select { - background-color: white; cursor: pointer; } + @media (prefers-color-scheme: dark) { + input, textarea, select { + background-color: var(--nord2); + color: var(--font-default-dark); + border-color: var(--nord3); + } + } + .splits-display { display: flex; flex-direction: column; @@ -396,27 +440,41 @@ justify-content: space-between; align-items: center; padding: 0.75rem; - background-color: #f8f9fa; + background-color: var(--nord5); border-radius: 0.5rem; + border: 1px solid var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .split-item { + background-color: var(--nord2); + border-color: var(--nord3); + } } .positive { - color: #2e7d32; + color: var(--green); font-weight: 500; } .negative { - color: #d32f2f; + color: var(--red); font-weight: 500; } .note { - color: #666; + color: var(--nord2); font-size: 0.9rem; font-style: italic; margin: 0; } + @media (prefers-color-scheme: dark) { + .note { + color: var(--nord4); + } + } + .form-actions { display: flex; justify-content: space-between; @@ -438,13 +496,15 @@ } .btn-primary { - background-color: #1976d2; + background-color: var(--blue); color: white; border: none; } .btn-primary:hover:not(:disabled) { - background-color: #1565c0; + background-color: var(--nord10); + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); } .btn-primary:disabled { @@ -453,23 +513,37 @@ } .btn-secondary { - background-color: #f5f5f5; - color: #333; - border: 1px solid #ddd; + background-color: var(--nord5); + color: var(--nord0); + border: 1px solid var(--nord4); } .btn-secondary:hover { - background-color: #e8e8e8; + background-color: var(--nord4); + transform: translateY(-1px); + } + + @media (prefers-color-scheme: dark) { + .btn-secondary { + background-color: var(--nord2); + color: var(--font-default-dark); + border-color: var(--nord3); + } + + .btn-secondary:hover { + background-color: var(--nord3); + } } .btn-danger { - background-color: #d32f2f; + background-color: var(--red); color: white; border: none; } .btn-danger:hover:not(:disabled) { - background-color: #c62828; + background-color: var(--nord11); + transform: translateY(-1px); } .btn-danger:disabled { @@ -487,20 +561,26 @@ max-height: 200px; object-fit: cover; border-radius: 0.5rem; - border: 1px solid #ddd; + border: 1px solid var(--nord4); margin-bottom: 0.75rem; display: block; margin-left: auto; margin-right: auto; } + @media (prefers-color-scheme: dark) { + .receipt-preview { + border-color: var(--nord2); + } + } + .image-actions { display: flex; justify-content: center; } .btn-remove { - background-color: #d32f2f; + background-color: var(--red); color: white; border: none; padding: 0.5rem 1rem; @@ -511,30 +591,48 @@ } .btn-remove:hover { - background-color: #c62828; + background-color: var(--nord11); + transform: translateY(-1px); } .upload-label { display: block; margin-bottom: 0.5rem; font-weight: 500; - color: #555; + color: var(--nord2); cursor: pointer; } + @media (prefers-color-scheme: dark) { + .upload-label { + color: var(--nord5); + } + } + .file-input { width: 100%; padding: 0.75rem; - border: 2px dashed #ddd; + border: 2px dashed var(--nord4); border-radius: 0.5rem; - background-color: #fafafa; + background-color: var(--nord5); cursor: pointer; transition: all 0.2s; } .file-input:hover { - border-color: #1976d2; - background-color: #f5f5f5; + border-color: var(--blue); + background-color: var(--nord4); + } + + @media (prefers-color-scheme: dark) { + .file-input { + background-color: var(--nord2); + border-color: var(--nord3); + } + + .file-input:hover { + background-color: var(--nord3); + } } .file-input:disabled { @@ -544,7 +642,7 @@ .upload-status { margin-top: 0.5rem; - color: #1976d2; + color: var(--blue); font-size: 0.9rem; text-align: center; } diff --git a/src/routes/cospend/payments/view/[id]/+page.svelte b/src/routes/cospend/payments/view/[id]/+page.svelte index 2abe016..31835c5 100644 --- a/src/routes/cospend/payments/view/[id]/+page.svelte +++ b/src/routes/cospend/payments/view/[id]/+page.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import ProfilePicture from '$lib/components/ProfilePicture.svelte'; import { getCategoryEmoji, getCategoryName } from '$lib/utils/categories'; + import EditButton from '$lib/components/EditButton.svelte'; export let data; @@ -96,24 +97,6 @@
-
-
- ← Back to Dashboard -
- {#if payment && payment.createdBy === data.session.user.nickname} - Edit - - {/if} - All Payments -
-
-
{#if loading}
Loading payment...
@@ -203,6 +186,10 @@ {/if}
+{#if payment && payment.createdBy === data.session.user.nickname} + +{/if} + \ No newline at end of file diff --git a/src/routes/rezepte/+page.svelte b/src/routes/rezepte/+page.svelte index 7bbcf36..c9b31c5 100644 --- a/src/routes/rezepte/+page.svelte +++ b/src/routes/rezepte/+page.svelte @@ -47,4 +47,4 @@ h1{ {/each} {/each} - + diff --git a/src/routes/rezepte/tips-and-tricks/+page.svelte b/src/routes/rezepte/tips-and-tricks/+page.svelte index a3c14a8..9faaa40 100644 --- a/src/routes/rezepte/tips-and-tricks/+page.svelte +++ b/src/routes/rezepte/tips-and-tricks/+page.svelte @@ -59,4 +59,4 @@ h1{

- +