aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.css63
-rw-r--r--src/lib/server/db/groceries.test.ts7
-rw-r--r--src/lib/server/db/ondelete.test.ts7
-rw-r--r--src/lib/server/db/test-helper.ts2
-rw-r--r--src/lib/server/services/categories.test.ts7
-rw-r--r--src/lib/server/services/groceries.test.ts7
-rw-r--r--src/lib/server/services/references.test.ts7
-rw-r--r--src/routes/+page.svelte12
-rw-r--r--src/routes/groceries/+page.svelte5
-rw-r--r--src/routes/groceries/catalog/+page.svelte5
-rw-r--r--src/routes/groceries/categories/+page.svelte5
-rw-r--r--src/routes/grocery/[id]/+page.svelte37
-rw-r--r--src/routes/projects/[id]/+page.svelte33
-rw-r--r--src/routes/projects/[projectId]/routine/[routineId]/+page.svelte57
14 files changed, 82 insertions, 172 deletions
diff --git a/src/app.css b/src/app.css
index 7b8464f..1c25c93 100644
--- a/src/app.css
+++ b/src/app.css
@@ -212,6 +212,8 @@ button {
background: var(--surface);
border-radius: 0.75rem;
box-shadow: 0 1px 2px var(--shadow);
+ margin-top: 1rem;
+ padding: 2rem;
}
/* Error */
@@ -398,3 +400,64 @@ button {
font-weight: 600;
white-space: nowrap;
}
+
+/* Shared route scaffolding */
+.page-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.25rem 0;
+}
+
+.back-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.375rem;
+ margin-top: 1rem;
+ color: var(--text-secondary);
+ text-decoration: none;
+ font-size: 0.875rem;
+ font-weight: 500;
+ transition: color 0.2s;
+}
+
+.back-link:hover {
+ color: var(--accent);
+}
+
+.input-invalid {
+ border-color: var(--danger);
+}
+
+.save-status {
+ font-size: 0.875rem;
+ color: var(--success);
+ font-weight: 500;
+ margin-top: -0.25rem;
+ visibility: hidden;
+ opacity: 0;
+ transition: opacity 0.2s ease;
+ min-height: 1.25rem;
+}
+
+.save-status.visible {
+ visibility: visible;
+ opacity: 1;
+}
+
+.btn-done {
+ flex-shrink: 0;
+ padding: 0.5rem 0.875rem;
+ border: none;
+ border-radius: 0.625rem;
+ background: var(--success);
+ color: var(--white);
+ font-size: 0.875rem;
+ font-weight: 500;
+ transition: all 0.2s ease;
+}
+
+.btn-done:hover {
+ filter: brightness(1.05);
+ transform: translateY(-1px);
+}
diff --git a/src/lib/server/db/groceries.test.ts b/src/lib/server/db/groceries.test.ts
index 2f8baed..143e4da 100644
--- a/src/lib/server/db/groceries.test.ts
+++ b/src/lib/server/db/groceries.test.ts
@@ -1,14 +1,13 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, categories } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { createTestDb } from './test-helper';
+import { createTestDb, type TestDb } from './test-helper';
describe('groceries add', () => {
- let db: Awaited<ReturnType<typeof createTestDb>>['db'];
+ let db: TestDb['db'];
beforeEach(async () => {
- const testDb = await createTestDb();
- db = testDb.db;
+ db = (await createTestDb()).db;
});
async function addItem(name: string, categoryId?: number | null) {
diff --git a/src/lib/server/db/ondelete.test.ts b/src/lib/server/db/ondelete.test.ts
index c2c86de..347bb92 100644
--- a/src/lib/server/db/ondelete.test.ts
+++ b/src/lib/server/db/ondelete.test.ts
@@ -1,14 +1,13 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, categories } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { createTestDb } from './test-helper';
+import { createTestDb, type TestDb } from './test-helper';
describe('category delete behavior', () => {
- let db: Awaited<ReturnType<typeof createTestDb>>['db'];
+ let db: TestDb['db'];
beforeEach(async () => {
- const testDb = await createTestDb();
- db = testDb.db;
+ db = (await createTestDb()).db;
});
it('sets category_id to null when a referenced category is deleted', async () => {
diff --git a/src/lib/server/db/test-helper.ts b/src/lib/server/db/test-helper.ts
index 5bae681..2b8c173 100644
--- a/src/lib/server/db/test-helper.ts
+++ b/src/lib/server/db/test-helper.ts
@@ -11,3 +11,5 @@ export async function createTestDb() {
return { db, client };
}
+
+export type TestDb = Awaited<ReturnType<typeof createTestDb>>;
diff --git a/src/lib/server/services/categories.test.ts b/src/lib/server/services/categories.test.ts
index cfde1da..a89b816 100644
--- a/src/lib/server/services/categories.test.ts
+++ b/src/lib/server/services/categories.test.ts
@@ -1,15 +1,14 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, categories } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { createTestDb } from '$lib/server/db/test-helper';
+import { createTestDb, type TestDb } from '$lib/server/db/test-helper';
import { loadAll, add, deleteCategory } from './categories';
describe('categories service', () => {
- let db: Awaited<ReturnType<typeof createTestDb>>['db'];
+ let db: TestDb['db'];
beforeEach(async () => {
- const testDb = await createTestDb();
- db = testDb.db;
+ db = (await createTestDb()).db;
});
it('loadAll returns categories sorted by name', async () => {
diff --git a/src/lib/server/services/groceries.test.ts b/src/lib/server/services/groceries.test.ts
index 83f8d95..a704b57 100644
--- a/src/lib/server/services/groceries.test.ts
+++ b/src/lib/server/services/groceries.test.ts
@@ -1,7 +1,7 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, categories, references } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { createTestDb } from '$lib/server/db/test-helper';
+import { createTestDb, type TestDb } from '$lib/server/db/test-helper';
import {
loadUnchecked,
loadAll,
@@ -11,11 +11,10 @@ import {
} from './groceries';
describe('groceries service', () => {
- let db: Awaited<ReturnType<typeof createTestDb>>['db'];
+ let db: TestDb['db'];
beforeEach(async () => {
- const testDb = await createTestDb();
- db = testDb.db;
+ db = (await createTestDb()).db;
});
it('loadUnchecked returns only unchecked items', async () => {
diff --git a/src/lib/server/services/references.test.ts b/src/lib/server/services/references.test.ts
index c02f9e6..1ec3fdb 100644
--- a/src/lib/server/services/references.test.ts
+++ b/src/lib/server/services/references.test.ts
@@ -1,15 +1,14 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, references } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { createTestDb } from '$lib/server/db/test-helper';
+import { createTestDb, type TestDb } from '$lib/server/db/test-helper';
import { loadForGrocery, add, deleteReference } from './references';
describe('references service', () => {
- let db: Awaited<ReturnType<typeof createTestDb>>['db'];
+ let db: TestDb['db'];
beforeEach(async () => {
- const testDb = await createTestDb();
- db = testDb.db;
+ db = (await createTestDb()).db;
});
it('loadForGrocery returns refs for the given grocery', async () => {
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 35ff5d7..5214bd6 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -46,13 +46,6 @@
</main>
<style>
- .page-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 1.25rem 0;
- }
-
.project-row {
padding: 0.875rem 1rem;
}
@@ -67,9 +60,4 @@
.project-link:hover {
color: var(--accent);
}
-
- .empty {
- margin-top: 1rem;
- padding: 2rem;
- }
</style>
diff --git a/src/routes/groceries/+page.svelte b/src/routes/groceries/+page.svelte
index df1b97b..3646ba7 100644
--- a/src/routes/groceries/+page.svelte
+++ b/src/routes/groceries/+page.svelte
@@ -177,9 +177,4 @@
.error {
margin-bottom: 1rem;
}
-
- .empty {
- margin-top: 1rem;
- padding: 2rem;
- }
</style>
diff --git a/src/routes/groceries/catalog/+page.svelte b/src/routes/groceries/catalog/+page.svelte
index 74a82e8..59e2018 100644
--- a/src/routes/groceries/catalog/+page.svelte
+++ b/src/routes/groceries/catalog/+page.svelte
@@ -168,11 +168,6 @@
margin-bottom: 1rem;
}
- .empty {
- margin-top: 1rem;
- padding: 2rem;
- }
-
.search-input {
width: 100%;
padding: 0.75rem 1rem;
diff --git a/src/routes/groceries/categories/+page.svelte b/src/routes/groceries/categories/+page.svelte
index 48de2da..af85adf 100644
--- a/src/routes/groceries/categories/+page.svelte
+++ b/src/routes/groceries/categories/+page.svelte
@@ -119,9 +119,4 @@
margin-top: -0.25rem;
margin-bottom: 0.5rem;
}
-
- .empty {
- margin-top: 1rem;
- padding: 2rem;
- }
</style>
diff --git a/src/routes/grocery/[id]/+page.svelte b/src/routes/grocery/[id]/+page.svelte
index 531fbf7..4a96f32 100644
--- a/src/routes/grocery/[id]/+page.svelte
+++ b/src/routes/grocery/[id]/+page.svelte
@@ -214,33 +214,12 @@
margin-bottom: 0.5rem;
}
- .empty {
- margin-top: 0.75rem;
- padding: 1.5rem;
- }
-
hr {
border: none;
border-top: 1.5px solid var(--border);
margin: 1.5rem 0;
}
- .back-link {
- display: inline-flex;
- align-items: center;
- gap: 0.375rem;
- margin-top: 1.5rem;
- color: var(--text-secondary);
- text-decoration: none;
- font-size: 0.875rem;
- font-weight: 500;
- transition: color 0.2s;
- }
-
- .back-link:hover {
- color: var(--accent);
- }
-
.delete-item-btn {
margin-top: 1.5rem;
padding: 0.625rem 1.25rem;
@@ -258,20 +237,4 @@
background: var(--danger-bg);
transform: translateY(-1px);
}
-
- .save-status {
- font-size: 0.875rem;
- color: var(--success);
- font-weight: 500;
- margin-top: -0.25rem;
- visibility: hidden;
- opacity: 0;
- transition: opacity 0.2s ease;
- min-height: 1.25rem;
- }
-
- .save-status.visible {
- visibility: visible;
- opacity: 1;
- }
</style>
diff --git a/src/routes/projects/[id]/+page.svelte b/src/routes/projects/[id]/+page.svelte
index e324f45..f1c2ab4 100644
--- a/src/routes/projects/[id]/+page.svelte
+++ b/src/routes/projects/[id]/+page.svelte
@@ -250,13 +250,6 @@
</main>
<style>
- .page-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 1.25rem 0;
- }
-
.routine-row {
flex-wrap: wrap;
padding: 0.75rem 1rem;
@@ -307,27 +300,6 @@
flex-shrink: 0;
}
- .input-invalid {
- border-color: var(--danger);
- }
-
- .btn-done {
- flex-shrink: 0;
- padding: 0.5rem 0.875rem;
- border: none;
- border-radius: 0.625rem;
- background: var(--success);
- color: var(--white);
- font-size: 0.875rem;
- font-weight: 500;
- transition: all 0.2s ease;
- }
-
- .btn-done:hover {
- filter: brightness(1.05);
- transform: translateY(-1px);
- }
-
.page-footer {
margin-top: 2rem;
display: flex;
@@ -412,9 +384,4 @@
.archived-empty {
padding: 1rem 0;
}
-
- .empty {
- margin-top: 1rem;
- padding: 2rem;
- }
</style>
diff --git a/src/routes/projects/[projectId]/routine/[routineId]/+page.svelte b/src/routes/projects/[projectId]/routine/[routineId]/+page.svelte
index 19713ae..bcdca79 100644
--- a/src/routes/projects/[projectId]/routine/[routineId]/+page.svelte
+++ b/src/routes/projects/[projectId]/routine/[routineId]/+page.svelte
@@ -221,7 +221,7 @@
placeholder="Note (optionnel)"
autocomplete="off"
/>
- <button class="btn-done" type="submit">Fait</button>
+ <button class="btn-done btn-done-lg" type="submit">Fait</button>
</form>
{/if}
@@ -244,29 +244,6 @@
</main>
<style>
- .back-link {
- display: inline-flex;
- align-items: center;
- gap: 0.375rem;
- margin-top: 1rem;
- color: var(--text-secondary);
- text-decoration: none;
- font-size: 0.875rem;
- font-weight: 500;
- transition: color 0.2s;
- }
-
- .back-link:hover {
- color: var(--accent);
- }
-
- .page-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 1rem 0;
- }
-
.page-header h1 {
overflow-wrap: anywhere;
}
@@ -275,31 +252,12 @@
max-width: 8rem;
}
- .input-invalid {
- border-color: var(--danger);
- }
-
.desc {
width: 100%;
resize: vertical;
font-family: inherit;
}
- .save-status {
- font-size: 0.875rem;
- color: var(--success);
- font-weight: 500;
- visibility: hidden;
- opacity: 0;
- transition: opacity 0.2s ease;
- min-height: 1.25rem;
- }
-
- .save-status.visible {
- visibility: visible;
- opacity: 1;
- }
-
.section-title {
font-size: 0.75rem;
font-weight: 700;
@@ -368,21 +326,10 @@
flex: 1;
}
- .btn-done {
- flex-shrink: 0;
+ .btn-done-lg {
padding: 0.75rem 1.25rem;
- border: none;
border-radius: 0.75rem;
- background: var(--success);
- color: var(--white);
font-size: 0.9375rem;
- font-weight: 500;
- transition: all 0.2s ease;
- }
-
- .btn-done:hover {
- filter: brightness(1.05);
- transform: translateY(-1px);
}
.completion-row {