makiolaj
11ff1eb1dd
docs(state): record phase 38 context session
2026-04-19 21:50:56 +02:00
makiolaj
9e49e52bc0
docs(38): capture phase context
2026-04-19 21:50:37 +02:00
makiolaj
45eaeb0462
docs(37): add code review report
2026-04-19 21:36:14 +02:00
makiolaj
821c61f912
docs(37): add plan execution summaries for 37-01 and 37-02
2026-04-19 21:35:22 +02:00
makiolaj
6931c33f73
feat(37-02): admin global items client — list, edit, sidebar activation
...
- Add useAdminGlobalItems hooks: infinite query, detail query, update/delete mutations
- Activate Items sidebar link in admin.tsx (replace disabled div with active Link)
- Create /admin/items list page with table, infinite scroll, search, tag filters, skeleton
- Create /admin/items/$itemId edit page with all fields, manufacturer dropdown, TagInput chip component
- Delete confirmation dialog shows ownerCount impact message
- routeTree.gen.ts updated with /admin/items and /admin/items/$itemId routes
Closes ADMN-02, ADMN-03, ADMN-04 (client side)
2026-04-19 21:34:53 +02:00
makiolaj
db471001fa
feat(37-01): admin global item services, routes, and unit tests
...
- Add listGlobalItemsForAdmin: paginated with batched tag/ownerCount queries
- Add updateGlobalItemById: partial update in transaction, syncs tags
- Add deleteGlobalItem: nullifies FK refs, removes tag associations before delete
- Create src/server/routes/admin-items.ts with GET/GET:id/PUT/DELETE endpoints
- Mount adminItemRoutes at /items in admin.ts (protected by requireAuth+requireAdmin)
- Extend global-item.service.test.ts with 13 new tests (all passing)
Closes ADMN-02, ADMN-03, ADMN-04 (server side)
2026-04-19 21:32:42 +02:00
makiolaj and Claude Sonnet 4.6
3c79b7eb9a
docs(state): record phase 37 planning complete
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 21:28:52 +02:00
makiolaj and Claude Sonnet 4.6
eabfca475c
docs(37): write wave plan files for admin global item management
...
Plans 37-01 (server: services + admin-items routes) and 37-02 (client:
hooks, list page, edit page, sidebar) with full acceptance criteria and
read_first blocks per phase context, research, and UI-SPEC artifacts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 21:28:46 +02:00
makiolaj and Claude Sonnet 4.6
2f2fc1e681
docs(37): add research, validation strategy, and UI design contract
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 21:04:03 +02:00
makiolaj
298da6da85
docs(37): capture phase context
2026-04-19 20:57:32 +02:00
makiolaj
868aed4f10
docs(36): add code review report
2026-04-19 20:50:57 +02:00
makiolaj
70a3e159ba
docs(phase-36): update ROADMAP and STATE after wave execution
2026-04-19 20:49:56 +02:00
makiolaj
8e76fe35dc
docs(36-02): create SUMMARY.md for plan 36-02 completion
2026-04-19 20:49:40 +02:00
makiolaj
72473bc5c5
chore(36-02): regenerate routeTree.gen.ts with /admin and /admin/ routes
2026-04-19 20:49:19 +02:00
makiolaj
8f62edc91d
feat(36-02): add conditional Admin link to UserMenu for admin users
2026-04-19 20:49:03 +02:00
makiolaj
7a3dca768a
feat(36-02): add /admin layout route and placeholder index
...
- admin.tsx: createFileRoute('/admin') with sidebar shell (Items, Tags disabled with Soon badge)
- admin/index.tsx: createFileRoute('/admin/') placeholder with shield icon
- useEffect guard redirects non-admin users to /
2026-04-19 20:48:53 +02:00
makiolaj
080838ecb5
feat(36-02): add isAdmin to AuthState interface in useAuth.ts
2026-04-19 20:48:30 +02:00
makiolaj
488fdbb568
docs(36-01): create SUMMARY.md for plan 36-01 completion
2026-04-19 20:48:14 +02:00
makiolaj
d3c5a8945b
feat(36-01): add scripts/grant-admin.ts for granting/revoking admin status
2026-04-19 20:47:49 +02:00
makiolaj
48381105b5
feat(36-01): add /api/admin placeholder route with requireAuth + requireAdmin middleware
2026-04-19 20:47:36 +02:00
makiolaj
18883fb9f0
feat(36-01): surface isAdmin in /api/auth/me response
2026-04-19 20:47:12 +02:00
makiolaj
34c7d27ee5
feat(36-01): add requireAdmin middleware to auth.ts
...
- Import eq from drizzle-orm and users from schema
- Export requireAdmin(c, next) that returns 401 if userId not in context, 403 if user.isAdmin is falsy
2026-04-19 20:47:06 +02:00
makiolaj
23cdb25063
feat(36-01): add isAdmin column to users table schema and generate migration
...
- Add isAdmin boolean(is_admin) NOT NULL DEFAULT false to users table
- Generate migration 0009_spotty_lord_tyger.sql
- NOTE: db:push requires DATABASE_URL with correct credentials to apply
2026-04-19 20:46:51 +02:00
makiolaj and Claude Sonnet 4.6
94e2a8c019
plan(36): admin role & panel foundation — 2 plans ready
...
- 36-RESEARCH.md: schema migration, requireAdmin middleware, /api/auth/me
surface, client routing patterns, grant script, wave breakdown
- 36-UI-SPEC.md: admin shell layout, sidebar disabled nav items, UserMenu
admin link, palette and responsive notes
- 36-01-PLAN.md (wave 1): isAdmin schema column + Drizzle migration,
requireAdmin middleware, /api/auth/me isAdmin field, /api/admin placeholder
route, scripts/grant-admin.ts
- 36-02-PLAN.md (wave 2): AuthState isAdmin type, /admin client route with
sidebar shell, admin/index.tsx placeholder, UserMenu admin link
- STATE.md: updated to Phase 36, ready to execute, 2 plans
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 20:43:12 +02:00
makiolaj
e8cdeafba2
docs(state): record phase 36 context session .planning/STATE.md
2026-04-19 20:34:26 +02:00
makiolaj
38c0382f64
docs(36): capture phase context .planning/phases/36-admin-role-panel-foundation/36-CONTEXT.md .planning/phases/36-admin-role-panel-foundation/36-DISCUSSION-LOG.md
2026-04-19 20:34:10 +02:00
makiolaj
8f4bb5096d
docs(35): add code review fix report
2026-04-19 20:15:00 +02:00
makiolaj and Claude Sonnet 4.6
7e684176ab
fix(35): WR-04 use startsWith/slice for brand-stripping to avoid mid-string matches
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 20:14:28 +02:00
makiolaj and Claude Sonnet 4.6
93c273d266
fix(35): WR-03 add onError to GearImage to dismiss skeleton on broken images
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 20:14:07 +02:00
makiolaj and Claude Sonnet 4.6
65f25e5964
fix(35): WR-02 close FAB menu before opening catalog search overlay
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 20:13:33 +02:00
makiolaj
b984e8c72f
docs(35): add code review report
2026-04-19 19:55:17 +02:00
makiolaj
9d41400faa
docs(35-03): complete cursor-pointer audit plan
...
- Add 35-03-SUMMARY.md with task commits, deviations, and verification results
- Update STATE.md: plan 3/3 complete, progress 100%, FIX-05 decision recorded
- Update ROADMAP.md: phase 35 marked Complete (3/3 plans)
- Update REQUIREMENTS.md: FIX-05 marked complete
2026-04-19 19:52:41 +02:00
makiolaj
d58f7fab40
fix(35-03): add cursor-pointer to FabMenu and BottomTabBar buttons
...
- Add cursor-pointer to FabMenu menu item buttons (motion.button)
- Add cursor-pointer to FabMenu main FAB button (motion.button)
- Add cursor-pointer to BottomTabBar anonymous collection tab button
- Add cursor-pointer to BottomTabBar anonymous setups tab button
- Add cursor-pointer to BottomTabBar search tab button
2026-04-19 19:50:38 +02:00
makiolaj
e1d516cfe8
fix(35-03): add cursor-pointer to ItemCard navigable case
...
- Add cursor-pointer to the non-null linkTo branch of the outer button
- Preserve cursor-default for the null linkTo branch (setup cards)
2026-04-19 19:49:44 +02:00
makiolaj
2d45b9024d
docs(35-02): complete image lazy loading and skeleton plan
...
- SUMMARY.md created for 35-02 (FIX-03)
- STATE.md advanced to plan 2 of 3 complete, added 35-02 decisions
- ROADMAP.md updated (2 of 3 summaries)
- REQUIREMENTS.md marked FIX-03 complete
2026-04-19 19:49:04 +02:00
makiolaj
88db308a16
feat(35-02): add image skeleton loading states to all card types
...
- Add useState(false) loaded state to ItemCard, CandidateCard, GlobalItemCard
- Show bg-gray-100 animate-pulse skeleton overlay while image loads
- Fade in image via transition-opacity duration-200 on onLoad callback
- No-image placeholders (icon on bg-gray-50) unchanged
- Add import { useState } from react to all three files with correct Biome import order
2026-04-19 19:47:11 +02:00
makiolaj
2d2259a0db
feat(35-02): add loading=lazy and onLoad prop to GearImage
...
- Add optional onLoad prop to GearImageProps interface
- Destructure onLoad in function signature
- Forward loading="lazy" and onLoad to all three img render paths (cover, hasCrop, default)
2026-04-19 19:45:01 +02:00
makiolaj
58d6b47c6f
docs(35-01): complete plan 01 — type/wiring fixes (FIX-01, FIX-02, FIX-04)
...
- SUMMARY.md: 3 tasks, all passing, 464 tests green
- STATE.md: plan 1/3 complete, decisions recorded
- ROADMAP.md: phase 35 progress updated (1 of 3 summaries)
- REQUIREMENTS.md: FIX-01, FIX-02, FIX-04 marked complete
2026-04-19 19:44:05 +02:00
makiolaj
053d56236f
fix(35-01): replace login page card UI with immediate useEffect redirect (FIX-04)
...
- Remove auth check, useNavigate, useTranslation, and full card UI
- LoginPage now renders only "Signing in..." and immediately navigates to server /login
- Server /login route handles Logto OIDC redirect; no client-side logic needed
2026-04-19 19:41:57 +02:00
makiolaj
b43a932217
fix(35-01): extend ItemWithCategory with image and currency fields (FIX-02)
...
- Add imageUrl, dominantColor, cropZoom, cropX, cropY, priceCurrency to interface
- Server already returns these fields via withImageUrls(); type was just incomplete
2026-04-19 19:41:44 +02:00
makiolaj
7fca92985a
fix(35-01): wire Add Candidate button to CatalogSearchOverlay, delete AddCandidateModal
...
- Replace setAddCandidateOpen(true) with openCatalogSearch("thread") + setCatalogSessionThreadId
- Remove addCandidateOpen useState
- Delete entire AddCandidateModal component (~300 lines of dead code)
- Remove imports only used by the deleted modal: useCreateCandidate, useCurrency, ImageUpload, CategoryPicker
2026-04-19 19:41:33 +02:00
makiolaj and Claude Sonnet 4.6
44392e8583
docs(35): create phase 35 bug-fix plans (3 plans, wave 1 parallel)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 19:35:31 +02:00
makiolaj and Claude Sonnet 4.6
d216c80892
docs(35): fix UI-SPEC typography and spacing checker violations
...
Collapse font weights from 3 to 2 (remove 500/medium, map Label to 600/semibold).
Remove non-multiple-of-4 Tailwind class references from spacing Usage column.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 19:24:57 +02:00
makiolaj and Claude Sonnet 4.6
805b306516
docs(35): UI design contract for bug-fixes phase
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 19:22:56 +02:00
makiolaj
8202a0088b
docs(state): record phase 35 context session
2026-04-19 19:13:04 +02:00
makiolaj
8220cf84ab
docs(35): capture phase context
2026-04-19 19:12:37 +02:00
makiolaj and Claude Sonnet 4.6
2ebf3a37e8
docs: create milestone v2.4 roadmap (4 phases)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 18:43:48 +02:00
makiolaj and Claude Sonnet 4.6
4548780e5f
docs: start milestone v2.4 Admin Foundation
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 18:40:49 +02:00
makiolaj and Claude Sonnet 4.6
13c48731ea
chore: remove REQUIREMENTS.md for v2.3 milestone
...
Fresh requirements file will be created with /gsd-new-milestone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 17:05:24 +02:00
makiolaj and Claude Sonnet 4.6
1733fe8cfb
chore: archive v2.3 milestone files
...
Archive setup sharing, currency system, and i18n foundation milestone.
Reorganize ROADMAP.md with v2.3 details block, update PROJECT.md,
MILESTONES.md, STATE.md deferred items, and RETROSPECTIVE.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 17:05:21 +02:00
makiolaj and Claude Sonnet 4.6
beaea46e92
fix: use CategoryPicker in AddToThreadModal new-thread create mode
...
Replaces plain <select> with CategoryPicker for consistency with
ManualEntryForm, CreateThreadModal, and other thread creation flows.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 17:00:03 +02:00
makiolaj and Claude Sonnet 4.6
9649ef2514
fix: close PGlite handle after tests to resolve exit code 100
...
CI / ci (push) Successful in 1m40s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 58s
PGlite's WASM worker kept an open async handle, causing Bun to detect
a resource leak and exit with code 100 despite all tests passing.
Adds a preload script that closes the cached client via afterAll.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 16:43:11 +02:00
makiolaj and Claude Sonnet 4.6
5f63e6f75d
fix: resolve Bun mock isolation contamination across test files
...
CI / ci (push) Failing after 1m35s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
- storage.service.ts: use dynamic import() inside each function so the
current @aws-sdk mock is always picked up regardless of module load order
- images.test.ts + image.service.test.ts: replace module-level storage.service
mock with @aws-sdk/client-s3 mock to avoid contaminating storage.service.test.ts
- routes/auth.test.ts: remove unnecessary oauth.service mock (no test uses
verifyAccessToken) which was contaminating oauth.service.test.ts
- middleware/auth.test.ts: complete oauth.service mock shape with all exports
All 464 tests now pass in a single bun test run.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 16:19:39 +02:00
makiolaj and Claude Sonnet 4.6
4ccbb2b070
fix: wire catalog add buttons, fix Trans bold rendering, lint cleanup
...
CI / ci (push) Failing after 1m44s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
- CatalogSearchOverlay: replace handleAddStub with real openAddToCollection/openAddToThread routing based on catalogSearchMode
- ConfirmDialog + __root.tsx: swap t() for Trans component on deleteItemMessage, deleteCandidateMessage, pickWinnerMessage — fixes <bold> rendering as literal text
- Biome format pass: fix 23 lint/format errors across scripts, services, tests
- Planning: mark all UAT and verification gaps resolved for phases 07, 11, 16, 20, 21, 22, 24, 32, 34; close debug sessions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-19 15:36:16 +02:00
makiolaj and Claude Sonnet 4.6
16058d0f4d
chore: update bun.lock for @anthropic-ai/sdk
...
CI / ci (push) Failing after 15s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:49:33 +02:00
makiolaj
065b262b5b
chore: add db:crawl and db:crawl-all npm scripts
2026-04-18 16:45:54 +02:00
makiolaj
44602d409e
feat: crawl-all batch runner — iterate active manufacturers by tier
2026-04-18 16:45:39 +02:00
makiolaj
3d2911cedc
feat: crawl-manufacturer agent script — Haiku tool-use loop + bulk upsert
2026-04-18 16:45:17 +02:00
makiolaj
b2a725a646
feat: canonical taxonomy — categories and tags for ingestion
2026-04-18 16:44:32 +02:00
makiolaj and Claude Sonnet 4.6
44b1eac0ba
feat(catalog): migrate dev seed data to manufacturer-slug-based global items
...
Replace brand text field with manufacturerSlug in DEV_GLOBAL_ITEMS,
global-items-seed.json, and seed-global-items.ts. Add DEV_MANUFACTURERS
for dev-only brands not in SEED_MANUFACTURERS. Expand SEED_MANUFACTURERS
with 8 additional manufacturers referenced by seed JSON (Nemo, Therm-a-Rest,
Toaks, Katadyn, HydraPak, Nitecore, Outdoor Research, Exposure Lights).
Update dev-seed.ts to resolve slug→id before insert and use manufacturerId
as the deduplication key.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:37:27 +02:00
makiolaj
0b4715b80c
fix: update all tests and MCP catalog tool for manufacturerId schema migration
2026-04-18 16:30:11 +02:00
makiolaj
a508773809
feat: all services join manufacturers for global item brand display
2026-04-18 16:24:24 +02:00
makiolaj
2924c2269c
feat: item service joins manufacturers for brand display
2026-04-18 16:22:10 +02:00
makiolaj
12b3f8e380
feat: upsertGlobalItemSchema — brand → manufacturerSlug
2026-04-18 16:21:32 +02:00
makiolaj
5037350aa0
feat: global-item service uses manufacturerSlug, joins manufacturers for brand
2026-04-18 16:21:25 +02:00
makiolaj
8ff680ef92
feat: migrate globalItems — drop brand text, add manufacturerId FK
2026-04-18 16:19:31 +02:00
makiolaj and Claude Sonnet 4.6
f868bbdecf
feat: seed manufacturers list, update seedGlobalItems to resolve by name
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:16:52 +02:00
makiolaj and Claude Sonnet 4.6
ec27df1d0f
feat: manufacturers route — list, get, create
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:16:27 +02:00
makiolaj and Claude Sonnet 4.6
8c1b19f07d
feat: manufacturer service with list, get, create
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:15:40 +02:00
makiolaj and Claude Sonnet 4.6
7de3e9e957
feat: add manufacturers table to schema
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 14:54:23 +02:00
makiolaj
2cb83a63f1
docs: catalog population implementation plans (schema migration + ingestion script)
2026-04-18 14:49:34 +02:00
makiolaj and Claude Opus 4.6
bea386e7db
style(i18n): fix lint — formatting and import ordering across 21 files
...
CI / ci (push) Successful in 1m21s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m15s
Biome auto-fix for formatting (line length, ternary wrapping) and
import organization in files touched by phase 34 i18n work.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-18 14:49:10 +02:00
makiolaj
1b2ddcd0bd
docs(phase-34): evolve PROJECT.md after phase completion
CI / ci (push) Failing after 27s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-18 14:42:16 +02:00
makiolaj
be5b318041
docs(phase-34): complete phase execution
2026-04-18 14:41:42 +02:00
makiolaj and Claude Opus 4.6
dbab84ef2a
fix(i18n): wire useTranslation into SetupsView — close verification gap
...
Replace hardcoded English strings in SetupsView.tsx with t() calls
using existing setups namespace keys. Closes the 1 gap found during
phase 34 verification.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-18 14:41:23 +02:00
makiolaj
fefef38e9b
docs: add agent execution model to catalog population spec
2026-04-18 14:39:59 +02:00
makiolaj
4ba42f521c
docs(34): add code review report
2026-04-18 14:13:08 +02:00
makiolaj
26e20bd0d2
docs: catalog population design spec
2026-04-18 14:11:50 +02:00
makiolaj
fd874a3ff2
docs(34-05): complete German translations plan summary
...
- All 6 German locale namespaces verified complete and passing
- Key parity test passes (22/22)
- Build passes with both locales
2026-04-18 14:09:20 +02:00
makiolaj
31297a3921
fix(34-05): add missing German translation keys to collection namespace
...
- Add form.msrp, form.purchasePrice, form.itemNamePlaceholder, form.optionalNotes
- Fixes key parity test failure in tests/i18n/locales.test.ts
2026-04-18 14:08:51 +02:00
makiolaj
0570ee3ed5
chore: merge executor worktree (worktree-agent-a3da6e62 — plan 34-04)
2026-04-18 14:07:22 +02:00
makiolaj
a1ffcf3061
docs(34-03): complete locale-aware formatter integration plan summary
...
- All 5 tasks verified complete: useLanguage hook, formatPrice/formatWeight
with Intl.NumberFormat, useFormatters locale wiring, formatter tests
- 15 tests passing, build clean, CURRENCY_SYMBOLS removed
2026-04-18 14:07:09 +02:00
makiolaj
d08a49e8ab
docs(34-04): complete language picker and i18n sync plan summary
...
- Language picker in settings using pill-toggle pattern (English/Deutsch)
- i18n sync with DB setting on load via useEffect in RootLayout
- Both tasks verified complete at commit 46715cc
2026-04-18 14:06:48 +02:00
makiolaj
bf64b8f6a5
chore: merge executor worktree (worktree-agent-a1291d63 — plan 34-02)
2026-04-18 14:04:14 +02:00
makiolaj
3ff3ff4cb9
chore: merge executor worktree (worktree-agent-a5cefc89 — plan 34-08)
2026-04-18 14:03:25 +02:00
makiolaj and Claude Sonnet 4.6
f91417a24b
docs(34-02): complete extract hardcoded strings plan summary
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 14:02:41 +02:00
makiolaj
2aa156a6b7
feat(34-02): extract hardcoded strings from modals, routes, and catalog
...
- AddToCollectionModal: all labels, placeholders, toast messages
- collection/index.tsx: tab labels (Gear/Planning)
- threads/$threadId/index.tsx: thread detail page and AddCandidateModal
- items/$itemId.tsx: back links, action buttons, field labels, metadata
- setups/$setupId.tsx: all setup detail strings and confirm dialog
- users/$userId.tsx: public profile page strings
- global-items/index.tsx: discover/catalog filter UI strings
- Added catalog.json namespace (en + de) and registered in i18n.ts
- Extended en/de threads, setups, collection, common locales with missing keys
2026-04-18 14:01:09 +02:00
makiolaj
6fd8874970
feat(34-02): extract hardcoded strings from thread/candidate components
...
- CandidateCard: replace all hardcoded titles and badge text with t()
- CandidateListItem: add useTranslation, replace winner/delete/open labels and +/- Notes badge
- CandidateForm: add useTranslation, replace all form labels, placeholders, validation errors, submit button
- ComparisonTable: move STATUS_LABELS inside component with t(), replace all ATTRIBUTE_ROWS labels, View button, impact row labels
- StatusBadge: refactor STATUS_CONFIG to STATUS_ICONS + runtime STATUS_LABELS via t()
- CreateThreadModal: replace title, thread name label, category label, placeholder, cancel/submit buttons, error messages
- AddToThreadModal: replace modal titles, labels, placeholders, back/cancel/submit buttons, error messages
- threads.json: extend candidateForm with category, notes, pros, cons, product link labels and all placeholders
2026-04-18 13:44:26 +02:00
makiolaj
c5af1247c0
feat(34-02): i18n collection and item components
...
- CollectionView: t() for empty state, stats labels, filter text
- ItemCard: t() for tooltip title attributes
- ItemForm: t() for all form labels, placeholders, error messages, buttons
- CategoryPicker: t() for search placeholder, create button, no results
- CategoryFilterDropdown: t() for all categories label, search placeholder
- CategoryHeader: t() for save/cancel buttons, item count
- WeightSummaryCard: t() for title, legend labels, view mode toggle
- ItemPicker: t() for panel title, empty state, action buttons
- ManualEntryForm: t() for all form labels, error messages, submit button
- LinkToGlobalItem: t() for all UI chrome strings
- ProfileSection: t() for all form labels, messages, buttons
- collection.json: added new keys for categoryPicker, categoryFilter, weightSummary, itemPicker, categoryHeader, linkToGlobal, manualEntry, profileSection, itemCard
2026-04-18 13:35:59 +02:00
makiolaj
f4e93bf554
docs(34-08): complete German translation gap closure plan summary
...
- 58 missing German keys added across 5 de/*.json files
- 19/19 i18n parity tests pass
- 1 deviation: fixed JSON syntax error from smart quotes
2026-04-18 13:29:38 +02:00
makiolaj
23172f794f
fix(34-08): add 58 missing German translations to 5 de/*.json locale files
...
- de/common.json: add home, imageUpload, profile sections (34 keys)
- de/settings.json: add currency.suggestion, currency.switch, showConversions (4 keys)
- de/threads.json: add card.candidates, card.candidates_one, planning section (11 keys)
- de/setups.json: add card.by, card.anonymous, impact.compareWith (3 keys)
- de/collection.json: add tabs.setups, totals, classificationBadge (6 keys)
- Fixed JSON syntax error: replaced smart quotes in dangerZoneDescription with single quotes
- All German text uses proper Unicode umlauts throughout
- bun test tests/i18n/locales.test.ts: 19 pass, 0 fail
2026-04-18 13:29:12 +02:00
makiolaj
e27c919430
docs(34-01): complete i18n foundation plan summary
...
- Install react-i18next, i18next, i18next-browser-languagedetector
- Create 6 English namespace JSON files from component string extraction
- Initialize i18n with LanguageDetector before React rendering
2026-04-18 13:28:35 +02:00
makiolaj and Claude Opus 4.6
8634ca41c1
docs(34-08): gap closure plan for 58 missing German translations
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-18 13:22:25 +02:00
makiolaj
95c0ab4037
test(34): gap closure verification — 2 gaps found (missing German keys)
CI / ci (push) Failing after 21s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-17 20:38:39 +02:00
makiolaj
6376cfcb8d
docs(34): add code review report
2026-04-17 20:34:56 +02:00
makiolaj
3c973e8ec1
docs(34-07): complete German umlaut correction plan summary
2026-04-17 20:31:24 +02:00
makiolaj
1963faea84
fix(34-07): replace ASCII umlaut fallbacks with proper Unicode in all German locale files
...
- common.json: Löschen, Schließen, Zurück, Bestätigen, Änderungen, Überspringen, Gegenstände, etc.
- collection.json: Ausrüstung, Gegenstände, Zusätzliche, Hinzufügen
- threads.json: wählen, Kategorie, hinzufügen, Sammlung, hinzugefügt
- setups.json: Ausrüstung, Gegenstände, Öffentlich, Läuft, können, Zurückschalten
- onboarding.json: Ausrüstung, Gegenstände, wählen, fügen, überspringen, prüfen, Stöbern
- settings.json: Schlüssel, Währung, Wählen, Ändern, Gegenstände, Ausrüstung
2026-04-17 20:30:48 +02:00
makiolaj
4a23904c3f
docs(34-06): complete i18n gap closure — routes and components plan summary
2026-04-17 20:27:39 +02:00
makiolaj
480abdd17f
feat(34-06): wire useTranslation into 10 remaining components
...
- ThreadTabs: tab labels (gear, planning, setups) via collection namespace
- PlanningView: section title, tab labels, empty state steps, CTAs via threads namespace
- TotalsBar: 'Sign in' link via common.auth.signIn
- ThreadCard: resolved badge and candidate count (plural) via threads namespace
- PublicSetupCard: by/anonymous and item count (plural) via setups namespace
- SetupImpactSelector: compare dropdown placeholder via setups.impact.compareWith
- ClassificationBadge: base/worn/consumable labels via collection.classificationBadge
- ImpactDeltaBadge: add mode label via setups.impact.adding
- ImageUpload: click-to-add, error messages via common.imageUpload
- DashboardCard: skipped (renders props only, no hardcoded UI strings)
- Add card, planning keys to en/de threads.json
- Add classificationBadge, tabs, totals keys to en/de collection.json
- Add card.by, card.anonymous, impact.compareWith to en/de setups.json
- Add imageUpload keys to en/de common.json
- Build passes, all 19 i18n parity tests pass
2026-04-17 20:26:50 +02:00
makiolaj
755c0ab89f
feat(34-06): wire useTranslation into routes and settings currency suggestion
...
- Add useTranslation to routes/index.tsx: home section headings use t()
- Add useTranslation to routes/profile.tsx: all profile/security/danger zone strings use t()
- Wire currency suggestion banner in settings.tsx with t() interpolation
- Wire showConversions section title/description in settings.tsx
- Add home and profile keys to en/common.json
- Add currency.suggestion, currency.switch, showConversions to en/settings.json
- Add corresponding German translations with proper umlauts to de/common.json and de/settings.json
2026-04-17 20:21:54 +02:00