Benjamin Sutter
6aa4f96bd2
feat: responsive layout + Reminder Manager redesign
...
- Auto-collapse sidebar at <1536px (all laptops), expand at ≥1536px
- Responsive drawer/panel widths across Pipeline, Properties, MyListings, Anfragen, MatchDetail, AISearch
- Reminder Manager: dot+label priority badge, Fläche column removed, status only for non-active rows
- ReminderKpiBar: focal Überfällig card, three secondary KPIs
- ReminderDetailDrawer: Task Panel redesign — Finanzen removed, Notiz promoted, Pre-Market as inline badge, full create form
- useCreateReminder hook wired to reminderService.create with cache invalidation
- Mock data: contract-derived reminders (LEASE_EXPIRY, BREAK_OPTION, RENT_REVIEW, INSURANCE_RENEWAL, SCHATTENMARKT_RELEASE) now show auto-creation note in Verlauf
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-16 14:30:06 +02:00
Benjamin Sutter
da50f3b5ea
feat: premium redesign — DM Serif, refined palette, flat score badges
...
- Design tokens (ds.ts, theme.ts, scoreTheme.ts): new warm palette
(#152642 navy, #f9f8f6 warm white, #e8e7e4 borders, #b8975a gold accent),
flat score tier badges replacing CSS gradients, Inter + DM Serif Display typography
- Card components: white-background cards, DM Serif score numbers, max-2 badge
chips with +N overflow tooltip, editorial score badge positioning
- Layout shell: gold left-accent nav active state, 64px top bar, outlined
workspace chip, DM Serif page titles
- Shared atoms: GenericBadge (outlined/solid variants), ResultFilterBar
(simplified chip styles), DecisionContextPanel (dot metrics, no left accent)
- Global replacement (118 files): #1e3a5f→#152642, #e2e8f0→#e8e7e4,
#f4f6f9→#f9f8f6 — all handled via Node.js for proper UTF-8 safety
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-09 22:26:30 +02:00
Benjamin Sutter
36570c5bdc
fix: resolve all TypeScript errors and refactor oversized components
...
- Fix MUI v9 API: PaperProps/InputLabelProps/inputProps → slotProps in 6 components
- Add ExternalMarketResult alias, PropertyUnit import, OPERATIONS workspace config
- Fix TradeOff.description → .concern, ScoreFactor.label → .criterion
- Make schattenmarktRelease.leadTimeMonths optional, fix mock-data enum values
- Fix useMatchDetailData query typing, weightingService missing WeightProfile keys
- Split Pipeline/Compare/MatchDetail/IntelligenceMatchCard into sub-components
- Fix all test fixtures (CreateNeedInput, CreatePropertyInput, TradeOffInput, etc.)
- Add vercel.json for deployment, zero tsc errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-26 00:08:35 +02:00
Benjamin Sutter
f2edc3b2ef
feat: Mietvertrag hinterlegen pro Objekt (Link + Bezeichnung)
...
- Property.leaseContractUrl? + leaseContractName? im Domain
- PropertyDetailOverview: Mietvertrag-Block in "Miet- & Mieterinformationen"
— View-Modus: Öffnen-Button oder "Noch kein Vertrag"-Hinweis
— Edit-Modus: URL-Feld + Bezeichnungsfeld (gespeichert via updateProperty)
- ReminderDetailDrawer: Mietvertrag-Link im "Objekt"-Abschnitt
(lädt Property über usePropertyById)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 22:18:02 +02:00
Benjamin Sutter
a3fc213916
refactor: extract helpers from ReminderDetailDrawer + OfferCreationWizard
...
- ReminderDetailDrawer (340→257 lines): constants + SectionTitle/DateRow/ActivityEntry → reminderDetailHelpers.tsx
- OfferCreationWizard (350→276 lines): PDF step JSX → OfferWizardPdfStep.tsx
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 01:10:31 +02:00
Benjamin Sutter
69b96f293a
refactor: remove Schattenmarkt from all user-visible UI strings
...
- Pipeline.tsx: FUTURE_AVAILABILITY label → 'Future Availability'
- ReminderTypeBadge: SCHATTENMARKT_RELEASE label → 'Pre-Market'
- ReminderFilterBar: SCHATTENMARKT_RELEASE label → 'Pre-Market'
- ReminderKpiBar: 'Schattenmarkt-Risiko' → 'Pre-Market Risiko'
- ReminderDetailDrawer: section title + switch label → 'Pre-Market'
- mock-data/matches: explainabilitySummary → 'Pre-Market freigegeben'
- mock-data/reminders: notes → 'Pre-Market Freigabe'
Internal identifiers (schattenmarktRelease field, useSchattenmarktSignals hook,
signal ID prefix schattenmarkt-*) are unchanged — renaming them touches too many
call sites for no user-visible gain.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 00:11:35 +02:00
Benjamin Sutter
9f391d17cb
feat: Reminder Manager + Schattenmarkt-Freigabe + mock data overhaul
...
- Add Reminder Manager page (/supply/reminder-manager) with KPI bar,
filter bar, list/card feed, and detail drawer (7 sections incl.
activity log, snooze, complete, dismiss actions)
- Add Schattenmarkt-Freigabe toggle on PropertyDetailView: Verwaltung
can opt-in properties for early market exposure before contract expiry
- Auto-generate FutureSignal cards via useSchattenmarktSignals hook
when leaseEndDate - leadTimeMonths <= MOCK_TODAY
- Fix useUnifiedResults: use property.resultType as fallback (was
defaulting everything to VERIFIED_PORTFOLIO)
- Fix demand Results: hide VERIFIED_PORTFOLIO from non-manager users
even when showOwnProperties toggle was previously enabled
- Fix AppShell: redirect to allowed workspace on user role switch
- Fix 3 wrong match scores (match-002: 93→62, match-009: 86→55,
match-017: 87→52)
- Add 7 new match records (match-050–056) for need-001, need-002,
need-011
- Add need-011 (Retail Bern Innenstadt)
- Add prop-031–036 (EXTERNAL_MARKET / MAISON_WORK / FUTURE_AVAILABILITY)
- Fix duplicate image URLs across all properties
- Add signal-011 (Bern Altstadt, Mode Boutique) + propertyId to
signal-001
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 11:52:24 +02:00