Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0f8a8ecd2f |
@@ -1,35 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(npm run *)",
|
||||
"Bash(git add *)",
|
||||
"Bash(git push *)",
|
||||
"Bash(npx tsc *)",
|
||||
"Bash(grep -E \"\\\\.\\(ts|tsx\\)$\")",
|
||||
"Bash(find c:\\\\\\\\Users\\\\\\\\beni_\\\\\\\\OneDrive\\\\\\\\Desktop\\\\\\\\property-match -name \"Dashboard.tsx\" -type f)",
|
||||
"Bash(awk '{print $NF}')",
|
||||
"Bash(start http://localhost:5173)",
|
||||
"Bash(npm install *)",
|
||||
"Bash(git pull *)",
|
||||
"Bash(node scripts/check-tokens.js)",
|
||||
"Bash(echo \"EXIT:$?\")",
|
||||
"Bash(echo \"EXIT_CODE:$?\")",
|
||||
"Bash(Get-ChildItem \"c:\\\\Users\\\\beni_\\\\AppData\\\\Local\\\\Temp\\\\docx-gen\\\\node_modules\\\\docx\" -Recurse -Name)",
|
||||
"Bash(start \"C:\\\\Users\\\\beni_\\\\OneDrive\\\\Desktop\\\\property-match\\\\Aenderungsprotokoll_Meeting_26052026.docx\")",
|
||||
"Bash(start http://localhost:5176)",
|
||||
"Bash(start http://localhost:5176/demand/ai-search)",
|
||||
"Bash(node -e ' *)",
|
||||
"Skill(run)",
|
||||
"Skill(run:*)",
|
||||
"Bash(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:5173)",
|
||||
"Bash(powershell.exe -Command \"Start-Process 'http://localhost:5173'\")",
|
||||
"Bash(findstr \"LISTENING\")",
|
||||
"Bash(findstr \":517\")",
|
||||
"Bash(findstr \"LISTEN\")",
|
||||
"Bash(findstr \":5\")",
|
||||
"Bash(echo \"Exit: $?\")",
|
||||
"Bash(npx vercel *)",
|
||||
"Bash(Start-Process \"http://localhost:5180\")"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(git commit -m ' *)",
|
||||
"Bash(git commit *)",
|
||||
"Bash(node -e ' *)",
|
||||
"Bash(git stash *)",
|
||||
"Read(//c/Users/beni_/.claude/projects/c--Users-beni--OneDrive-Desktop-property-match/8e388ddd-e02e-47fe-8bb9-cdb8164c9fc3/tool-results/**)",
|
||||
"Bash(pandoc --version)",
|
||||
"Bash(npm list *)",
|
||||
"Read(//c/Program Files/LibreOffice/program/**)",
|
||||
"Read(//c/Program Files/Microsoft Office/**)",
|
||||
"Read(//c/Program Files \\(x86\\)/**)",
|
||||
"Bash(mkdir -p /tmp/docx-gen)",
|
||||
"Read(//tmp/**)",
|
||||
"Bash(npm init *)",
|
||||
"Bash(node generate.js)",
|
||||
"Bash(timeout 8 bash -c \"until curl -s http://localhost:5173 > /dev/null; do sleep 1; done\")",
|
||||
"Bash(dir \"c:\\\\Users\\\\beni_\\\\OneDrive\\\\Desktop\\\\property-match\\\\src\" -Depth 2)",
|
||||
"Bash(start \"\" \"http://localhost:5178/demand/results\")",
|
||||
"Bash(start \"\" \"http://localhost:5178/supply/properties\")"
|
||||
],
|
||||
"additionalDirectories": [
|
||||
"c:\\Users\\beni_\\AppData\\Local\\Temp\\docx-gen"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -16,9 +16,6 @@ dist-ssr
|
||||
desktop.ini
|
||||
Thumbs.db
|
||||
|
||||
# Claude Code agent worktrees (transient copies of src/ — never commit)
|
||||
.claude/worktrees/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
> Why do I have a folder named ".vercel" in my project?
|
||||
The ".vercel" folder is created when you link a directory to a Vercel project.
|
||||
|
||||
> What does the "project.json" file contain?
|
||||
The "project.json" file contains:
|
||||
- The ID of the Vercel project that you linked ("projectId")
|
||||
- The ID of the user or team your Vercel project is owned by ("orgId")
|
||||
|
||||
> Should I commit the ".vercel" folder?
|
||||
No, you should not share the ".vercel" folder with anyone.
|
||||
Upon creation, it will be automatically added to your ".gitignore" file.
|
||||
@@ -1 +0,0 @@
|
||||
{"projectId":"prj_0UhtBM4Jg83OXPDkzhOM6x0gYfEY","orgId":"team_Quh2pScdkVSiGHkdwh6ntKZ5","projectName":"property-match"}
|
||||
@@ -1,476 +0,0 @@
|
||||
# Property Match — Architecture Reference
|
||||
|
||||
> This document describes the architecture of the Property Match platform.
|
||||
> For coding rules see [CLAUDE.md](./CLAUDE.md).
|
||||
> For state management patterns see [STATE_MANAGEMENT.md](./STATE_MANAGEMENT.md).
|
||||
|
||||
---
|
||||
|
||||
## 1. Folder Structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── assets/ Static images, icons
|
||||
│
|
||||
├── domain/ TypeScript types & enums (single source of truth)
|
||||
│ ├── enums.ts AssetType, ResultType, MatchStatus, UserRole, WorkspaceType
|
||||
│ ├── match.ts Match, ScoreBreakdown, ScoreFactor, TradeOff, Risk
|
||||
│ ├── property.ts Property, Location, ContactPerson
|
||||
│ ├── need.ts Need, AreaRange, BudgetRange, WeightingProfile
|
||||
│ ├── unifiedResult.ts UnifiedMatchResult (discriminated union)
|
||||
│ ├── scoring.ts ScoringWeightProfile, MatchEngineOutput
|
||||
│ ├── aiOutput.ts AI scoring, extraction, monitoring types
|
||||
│ ├── futureSignal.ts Future availability signals
|
||||
│ ├── pipeline.ts Pipeline stages & items
|
||||
│ ├── inquiry.ts Demand-side inquiry records
|
||||
│ ├── reminder.ts Reminder & DueDate
|
||||
│ └── index.ts Barrel re-exports
|
||||
│
|
||||
├── features/ Business logic algorithms (pure TypeScript)
|
||||
│ └── matching/
|
||||
│ ├── scoreCalculator.ts Hard/soft scoring, confidence & DQ modifiers
|
||||
│ ├── rankingEngine.ts Match ranking, unified result assembly
|
||||
│ ├── mustHaveScorer.ts Must-have criteria evaluation
|
||||
│ ├── tradeOffAnalyzer.ts Tradeoff, risk, and missing-data analysis
|
||||
│ └── matchCardAdapter.ts Match → MatchCardViewModel adapter
|
||||
│
|
||||
├── provider/ Data access layer (interface + mock per entity)
|
||||
│ ├── IPropertyProvider.ts
|
||||
│ ├── MockupPropertyProvider.ts
|
||||
│ ├── INeedProvider.ts
|
||||
│ ├── MockupNeedProvider.ts
|
||||
│ └── ... (one pair per entity)
|
||||
│
|
||||
├── services/ Business logic services
|
||||
│ ├── ai/
|
||||
│ │ ├── IAIService.ts AI capability interface
|
||||
│ │ ├── MockAIService.ts Deterministic mock (dev/CI)
|
||||
│ │ ├── OpenRouterAIService.ts Real LLM calls (production)
|
||||
│ │ └── prompts/ Structured prompt templates
|
||||
│ ├── matchService.ts
|
||||
│ ├── needService.ts
|
||||
│ ├── propertyService.ts
|
||||
│ ├── aiMonitoringService.ts
|
||||
│ ├── governanceService.ts
|
||||
│ ├── types.ts ListResponse<T>, ItemResponse<T>
|
||||
│ └── errors.ts throwServiceError()
|
||||
│
|
||||
├── hooks/ React Query wrappers
|
||||
│ ├── useProperties.ts
|
||||
│ ├── useMatches.ts
|
||||
│ ├── useUnifiedResults.ts Aggregates all result types for demand feed
|
||||
│ └── ... (one file per entity)
|
||||
│
|
||||
├── stores/ Zustand UI stores (global UI state only)
|
||||
│ ├── sessionStore.ts Auth, currentUser, workspace
|
||||
│ ├── compareStore.ts Compare tray items (max 4)
|
||||
│ ├── pipelineStore.ts Pipeline items + add-dialog
|
||||
│ ├── assistantStore.ts AI assistant drawer conversation
|
||||
│ ├── offerWizardStore.ts Multi-step offer wizard
|
||||
│ ├── layoutStore.ts Sidebar, right panel, active workspace
|
||||
│ ├── matchCenterStore.ts Supply match center selection
|
||||
│ ├── reminderStore.ts Reminder filters + drawer
|
||||
│ ├── shortlistStore.ts Shortlist selection + add-dialog
|
||||
│ └── toastStore.ts Toast notification queue
|
||||
│
|
||||
├── lib/ Shared utilities & design system
|
||||
│ ├── constants.ts All thresholds, labels, stale times, routes
|
||||
│ ├── ds.ts DS_COLORS, RESULT_TYPE_META, score → level converters
|
||||
│ ├── utils.ts matchScoreHex, confidenceHex, dataQualityColor, formatters
|
||||
│ ├── theme.ts MUI theme
|
||||
│ ├── queryClient.ts TanStack Query client config
|
||||
│ ├── permissions.ts Role-based access helpers
|
||||
│ ├── locationIntelligence.ts Location scoring
|
||||
│ └── propertyHeat.ts Market heat analysis
|
||||
│
|
||||
├── components/ UI components (organized by feature)
|
||||
│ ├── layout/ AppShell, PageHeader, RightContextPanel
|
||||
│ ├── ui/ ErrorBoundary, EmptyState, Toast, DecisionContextPanel
|
||||
│ ├── shared/ LocationPreview, ViewToggle (cross-feature)
|
||||
│ ├── match-card/ MatchCard variants (compact/expanded/review/compare-mini)
|
||||
│ ├── match-detail/ MatchDetailHero, ScoreBreakdownPanel, CriterionRow
|
||||
│ ├── compare/ CompareMetricRow, CompareColumn, compareUtils
|
||||
│ ├── pipeline/ PipelineCard, PipelineColumn, pipelineConstants, pipelineUtils
|
||||
│ ├── results/ UnifiedResultFeed, ResultFilterBar, ResultTypeBadge
|
||||
│ ├── supply/ PropertyIntelligenceCard, ReminderFeed, ReminderListRow, ...
|
||||
│ ├── demand/ NeedInput, WeightingEditor, CriteriaReviewPanel, ...
|
||||
│ ├── future-signals/ SignalCard, SignalFilterBar, FutureAvailabilityPanel, ...
|
||||
│ ├── data-quality/ DataQualityPanel, FreshnessIndicator, ProvenancePanel, ...
|
||||
│ ├── badges/ ConfidenceBadge, RiskBadge, FreshnessBadge, ...
|
||||
│ ├── ai-monitoring/ AI audit log UI
|
||||
│ └── ...
|
||||
│
|
||||
├── pages/ Route-level page components
|
||||
│ ├── auth/LoginScreen.tsx
|
||||
│ ├── supply/ SupplyDashboard, Properties, MatchCenter, ...
|
||||
│ ├── demand/ AISearch, Results, MatchDetail, Compare, Pipeline, ...
|
||||
│ └── ops/ MarketIntelligence
|
||||
│
|
||||
├── mock-data/ Seed data for mock providers
|
||||
│
|
||||
├── App.tsx React Router setup (all routes, lazy-loaded)
|
||||
└── index.css Tailwind layer imports (no project styles here)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Data Flow Overview
|
||||
|
||||
The core data flow is **unidirectional** across four layers.
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ Component / Page │
|
||||
│ │
|
||||
│ Reads: useQuery hook Writes: useMutation hook │
|
||||
│ UI state: Zustand selector Side effects: useEffect │
|
||||
└────────────────┬──────────────────────────┬────────────────────────────┘
|
||||
│ calls │ calls
|
||||
▼ ▼
|
||||
┌────────────────────────────────────────────────────────────────────────┐
|
||||
│ Hook Layer │
|
||||
│ src/hooks/*.ts │
|
||||
│ │
|
||||
│ useQuery({ queryFn: () => service.getAll() }) │
|
||||
│ useMutation({ mutationFn: (data) => service.create(data) }) │
|
||||
└────────────────────────────────┬───────────────────────────────────────┘
|
||||
│ calls
|
||||
▼
|
||||
┌────────────────────────────────────────────────────────────────────────┐
|
||||
│ Service Layer │
|
||||
│ src/services/*.ts │
|
||||
│ │
|
||||
│ Business logic, error handling, response standardization │
|
||||
│ Reads session via sessionStore.getState() │
|
||||
│ Calls scoring engine (features/matching/) as needed │
|
||||
└────────────────────────────────┬───────────────────────────────────────┘
|
||||
│ calls
|
||||
▼
|
||||
┌────────────────────────────────────────────────────────────────────────┐
|
||||
│ Provider Layer │
|
||||
│ src/provider/*.ts │
|
||||
│ │
|
||||
│ IPropertyProvider (interface) │
|
||||
│ MockupPropertyProvider (in-memory, dev) ← swap → RestPropertyProvider (prod)
|
||||
└────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Provider Swap Flow
|
||||
|
||||
Swapping from mock to real requires **one file change** — the service import. No hooks, components, or tests change.
|
||||
|
||||
```
|
||||
Dev / CI Production
|
||||
───────────────────────────────────── ─────────────────────────────────────
|
||||
propertyService.ts propertyService.ts
|
||||
import provider from import provider from
|
||||
'./MockupPropertyProvider' './RestPropertyProvider'
|
||||
↑
|
||||
One line change — nothing else
|
||||
```
|
||||
|
||||
Provider interfaces enforce the contract. All methods are `async`. Mock providers hold in-memory seed data from `src/mock-data/`.
|
||||
|
||||
---
|
||||
|
||||
## 4. State Architecture
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────┐
|
||||
│ React Query Cache │
|
||||
│ │
|
||||
│ ['properties'] ── 5 min stale │
|
||||
│ ['matches', needId] ── 2 min stale │
|
||||
│ ['signals'] ── 5 min stale │
|
||||
│ ['review-queue'] ── 30 s stale │
|
||||
│ │
|
||||
│ ← server data, cached, invalidated │
|
||||
│ on mutation success → │
|
||||
└──────────────────────────────────────────┘
|
||||
|
||||
┌──────────────────────────────────────────┐
|
||||
│ Zustand Stores │
|
||||
│ │
|
||||
│ sessionStore ← auth, currentUser │
|
||||
│ layoutStore ← sidebar, workspace │
|
||||
│ compareStore ← compare tray items │
|
||||
│ pipelineStore ← pipeline + dialog │
|
||||
│ assistantStore ← AI chat conversation │
|
||||
│ offerWizardStore← multi-step wizard │
|
||||
│ reminderStore ← filter + drawer │
|
||||
│ toastStore ← notification queue │
|
||||
│ │
|
||||
│ ← UI state only, no server data → │
|
||||
└──────────────────────────────────────────┘
|
||||
|
||||
┌──────────────────────────────────────────┐
|
||||
│ Component Local State │
|
||||
│ │
|
||||
│ useState ← form inputs, toggles │
|
||||
│ useMemo ← derived / filtered lists │
|
||||
│ useCallback ← stable callbacks │
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Matching & Scoring Flow
|
||||
|
||||
The matching engine (`src/features/matching/`) produces all scores. Components never compute scores — they display them.
|
||||
|
||||
```
|
||||
Need (criteria) + Property (attributes)
|
||||
│ │
|
||||
└───────────┬────────────┘
|
||||
▼
|
||||
┌─────────────────────┐
|
||||
│ scoreCalculator │
|
||||
│ │
|
||||
│ 1. Hard filters │ ← Exclusions (wrong type, out of area, etc.)
|
||||
│ 2. Hard scoring │ ← Area, location, budget, timing, asset type (0–100 each)
|
||||
│ 3. Soft scoring │ ← Prestige, accessibility, ESG, footfall, etc. (0–100 each)
|
||||
│ 4. Modifiers │ ← confidenceModifier (-20→+5) + dataQualityModifier (-15→0)
|
||||
│ 5. totalScore │ ← Weighted average + modifiers (0–100)
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────┐
|
||||
│ tradeOffAnalyzer │ ← TradeOff[], Risk[], MissingDataItem[]
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────┐
|
||||
│ rankingEngine │ ← Builds Match[], ranks, adds NextBestAction[]
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────┐
|
||||
│ matchCardAdapter │ ← Match → MatchCardViewModel (UI props)
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
▼
|
||||
MatchCard / MatchDetail / Compare
|
||||
```
|
||||
|
||||
**ScoreBreakdown shape:**
|
||||
|
||||
```ts
|
||||
{
|
||||
hardMatchScore: number // 0–100: area, location, budget, timing, usage
|
||||
softFactorScore: number // 0–100: prestige, accessibility, ESG, etc.
|
||||
confidenceModifier: number // –20 → +5
|
||||
dataQualityModifier: number // –15 → 0
|
||||
totalScore: number // 0–100 final score
|
||||
positiveFactors: ScoreFactor[] // top reasons this is a good match
|
||||
negativeFactors: ScoreFactor[] // top concerns
|
||||
tradeOffs: TradeOff[] // explicit trade-off explanations
|
||||
risks: Risk[] // risk categories
|
||||
missingData: MissingDataItem[] // fields that would improve the score
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. AI Flow
|
||||
|
||||
```
|
||||
User input (text / voice)
|
||||
│
|
||||
▼
|
||||
NeedInput component
|
||||
│ calls
|
||||
▼
|
||||
aiService.parseNeed(text)
|
||||
│ routes to
|
||||
├── MockAIService (dev) ──────────────► deterministic ParsedNeed
|
||||
└── OpenRouterAIService (prod) ────────► LLM API call
|
||||
│
|
||||
│ validates with Zod
|
||||
▼
|
||||
ParseNeedResult
|
||||
{ need: Partial<Need>, confidence: number, followUpQuestions: string[] }
|
||||
│
|
||||
▼
|
||||
CriteriaReviewPanel
|
||||
(user confirms / overrides AI-extracted criteria)
|
||||
│
|
||||
▼
|
||||
Need saved → Results feed runs
|
||||
```
|
||||
|
||||
**AI Governance loop:**
|
||||
|
||||
```
|
||||
Every AI call
|
||||
│
|
||||
├─► aiMonitoringService.log({ modelId, promptHash, responseDigest, userId, ... })
|
||||
│
|
||||
└─► Visible in /ops/ai-monitoring (review queue for ops team)
|
||||
```
|
||||
|
||||
**AI never speaks directly to the UI.** All AI outputs go through:
|
||||
1. `IAIService` interface method
|
||||
2. Zod validation
|
||||
3. Typed domain object
|
||||
4. Component that renders it with explainability metadata
|
||||
|
||||
---
|
||||
|
||||
## 7. Unified Result Feed Flow (Demand)
|
||||
|
||||
The demand workspace shows a unified feed that merges three result types.
|
||||
|
||||
```
|
||||
useUnifiedResults(needId)
|
||||
│
|
||||
├─► matchService.getForNeed(needId)
|
||||
│ └─► VERIFIED_PORTFOLIO matches (own properties)
|
||||
│ └─► EXTERNAL_MARKET matches (partner/scraped)
|
||||
│
|
||||
├─► aiService.getMaisonWorkResults(needId)
|
||||
│ └─► MAISON_WORK matches (AI-suggested)
|
||||
│
|
||||
└─► futureSignalService.getForNeed(needId)
|
||||
└─► FUTURE_AVAILABILITY signals (AI-predicted)
|
||||
├── probabilityScore (0–1)
|
||||
├── signalBasis (string)
|
||||
└── expectedAvailabilityDate
|
||||
|
||||
All merged into UnifiedMatchResult[]
|
||||
Sorted by matchScore desc (default)
|
||||
│
|
||||
▼
|
||||
UnifiedResultFeed
|
||||
├── MatchCard (VERIFIED_PORTFOLIO, EXTERNAL_MARKET, MAISON_WORK)
|
||||
└── FutureAvailabilityCard (FUTURE_AVAILABILITY — different visual treatment)
|
||||
```
|
||||
|
||||
**Future Availability signals are probabilistic** — they must always show `probabilityScore` and a basis explanation. They are never presented as confirmed availability.
|
||||
|
||||
---
|
||||
|
||||
## 8. Three-Workspace Architecture
|
||||
|
||||
```
|
||||
App.tsx
|
||||
│
|
||||
├── /auth/login → LoginScreen
|
||||
│
|
||||
├── /supply/* ──────────────────────────────────► SUPPLY workspace
|
||||
│ Protected: WorkspaceType.SUPPLY (PropertyManager, OrgAdmin)
|
||||
│ Pages: SupplyDashboard, Properties,
|
||||
│ MatchCenter, Anfragencenter,
|
||||
│ FutureAvailability, DataQuality,
|
||||
│ ReminderManager, MarketLeads,
|
||||
│ NewListing, MyListings
|
||||
│
|
||||
├── /demand/* ──────────────────────────────────► DEMAND workspace
|
||||
│ Protected: WorkspaceType.DEMAND (Tenant, CompanyAdmin)
|
||||
│ Pages: AISearch, Results, MatchDetail,
|
||||
│ Compare, Pipeline, Anfragen,
|
||||
│ PropertyDetail, Shortlists
|
||||
│
|
||||
└── /ops/* ────────────────────────────────────► OPERATIONS workspace
|
||||
Protected: WorkspaceType.OPERATIONS (Internal staff)
|
||||
Pages: MarketIntelligence
|
||||
```
|
||||
|
||||
Route protection enforced by `<ProtectedRoute workspace={...} />`. Each workspace has distinct data flows and does not share components with other workspaces unless through `src/components/shared/` or `src/components/ui/`.
|
||||
|
||||
---
|
||||
|
||||
## 9. Decision Screen Design Pattern
|
||||
|
||||
Every page is built around **one user decision**. The `DecisionContextPanel` component surfaces this explicitly at the top of each page.
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ PageHeader — title, subtitle, secondary actions (ViewToggle) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ DecisionContextPanel │
|
||||
│ decision: "Which matches are ready to shortlist?" │
|
||||
│ context: "Search: OFFICE · 200–500 m² · Zürich" │
|
||||
│ metrics: [strongMatches: 3 ✓] [withGaps: 2 ⚠] │
|
||||
│ risks: ["2 results have missing floor plan data"] │
|
||||
│ actions: [Open Compare] [Refine Search] │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ FilterBar / Controls │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Content (list / grid / table / kanban) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
If a screen cannot answer "what decision does this help the user make?", the design is wrong.
|
||||
|
||||
---
|
||||
|
||||
## 10. Error Boundary Architecture
|
||||
|
||||
```
|
||||
App.tsx
|
||||
└── AppErrorBoundary (top-level catch-all)
|
||||
└── Route components
|
||||
└── Feature-level try/catch in services
|
||||
└── Error state passed via useQuery error prop
|
||||
└── <ErrorState message={...} /> or <UnauthorizedState />
|
||||
```
|
||||
|
||||
Every page handles three states: loading (`<FeedSkeleton />`), error (`<ErrorState />`), and empty (`<FeedEmptyState />`). These are never omitted.
|
||||
|
||||
---
|
||||
|
||||
## 11. Component Dependency Rules
|
||||
|
||||
```
|
||||
pages/ can import from components/, hooks/, stores/, lib/, domain/
|
||||
components/ can import from components/, hooks/, stores/, lib/, domain/
|
||||
hooks/ can import from services/, lib/, domain/
|
||||
services/ can import from provider/, features/, lib/, domain/
|
||||
features/ can import from lib/, domain/
|
||||
provider/ can import from domain/, mock-data/
|
||||
lib/ can import from (nothing in src — pure utilities)
|
||||
domain/ can import from (nothing — types only)
|
||||
stores/ can import from domain/, lib/
|
||||
```
|
||||
|
||||
**Forbidden imports:**
|
||||
- `services/` must not import React hooks
|
||||
- `domain/` must not import anything from `src/`
|
||||
- `lib/constants.ts` must not import from components or services
|
||||
- Circular imports of any kind
|
||||
|
||||
---
|
||||
|
||||
## 12. Key Design System Tokens
|
||||
|
||||
```
|
||||
Scores (0–100 scale)
|
||||
≥ 80 → STRONG → DS_COLORS.confidence.high (#1a7a4a)
|
||||
≥ 60 → MODERATE → DS_COLORS.confidence.medium (#d97706)
|
||||
< 60 → WEAK → DS_COLORS.confidence.low (#c0392b)
|
||||
|
||||
Confidence (0–1 scale)
|
||||
≥ 0.85 → HIGH → DS_COLORS.confidence.high
|
||||
≥ 0.65 → MEDIUM → DS_COLORS.confidence.medium
|
||||
< 0.65 → LOW → DS_COLORS.confidence.low
|
||||
|
||||
Data Quality (0–1 scale)
|
||||
≥ 0.80 → HIGH
|
||||
≥ 0.60 → MEDIUM
|
||||
< 0.60 → LOW
|
||||
|
||||
Result Types
|
||||
VERIFIED_PORTFOLIO → label 'Plattform' color #1e3a5f
|
||||
EXTERNAL_MARKET → label 'Plattform' color #1e3a5f
|
||||
MAISON_WORK → label 'Maison Work' color #0369a1
|
||||
FUTURE_AVAILABILITY → label 'Zukunftssignal' color #7c3aed
|
||||
|
||||
Freshness
|
||||
FRESH → DS_COLORS.freshness.fresh (#1a7a4a)
|
||||
STALE → DS_COLORS.freshness.stale (#d97706)
|
||||
OUTDATED → DS_COLORS.freshness.outdated (#dc2626)
|
||||
```
|
||||
|
||||
All tokens from `src/lib/ds.ts`. All thresholds from `src/lib/constants.ts`.
|
||||
@@ -1,99 +1,40 @@
|
||||
# property-match — Engineering Guidelines
|
||||
# property-match — Development Guidelines
|
||||
|
||||
> **This file is read by Claude Code on every session.** All rules here are binding.
|
||||
> For architecture diagrams and data flows see [ARCHITECTURE.md](./ARCHITECTURE.md).
|
||||
> For the pre-commit review checklist see [CODE_REVIEW_CHECKLIST.md](./CODE_REVIEW_CHECKLIST.md).
|
||||
> For state management patterns see [STATE_MANAGEMENT.md](./STATE_MANAGEMENT.md).
|
||||
## Stack
|
||||
|
||||
---
|
||||
- **Vite 8** + **React 19** + **TypeScript 6**
|
||||
- **MUI v9** (`@mui/material`) — primary component library
|
||||
- **Tailwind CSS v4** — utility classes via `@tailwindcss/vite` (no `tailwind.config.js`)
|
||||
- **React Router v7** — import from `react-router`, not `react-router-dom`
|
||||
|
||||
## 1. Project Vision
|
||||
## Components
|
||||
|
||||
Property Match is a **Decision Intelligence Platform** — not a real estate portal.
|
||||
Always reach for an existing MUI component before writing a custom one. Check the [MUI component list](https://mui.com/material-ui/all-components/) first. Only build a custom component when MUI has no equivalent or the required behavior diverges significantly from what MUI provides.
|
||||
|
||||
The distinction matters for every design decision:
|
||||
## Styling
|
||||
|
||||
| Classical Portal | Decision Intelligence |
|
||||
|---|---|
|
||||
| Show listings, let the user decide | Surface scored matches with explainability |
|
||||
| Generic SaaS listing UI | Every screen is designed around one user decision |
|
||||
| More filters = better | Fewer, smarter signals = better |
|
||||
| Trust by volume | Trust by transparency |
|
||||
Use Tailwind utility classes for all layout and styling. Do not write plain CSS rules or add styles to `.css` files. The only CSS file is `src/index.css`, which holds the Tailwind layer imports — do not add project styles there.
|
||||
|
||||
**Three design principles that override everything else:**
|
||||
|
||||
1. **Explainability-first.** Every score, badge, and recommendation must be traceable. If the user cannot understand *why* a match is strong, the feature is not done. Score breakdowns, trade-off panels, risk indicators, and data provenance are first-class UI elements — not tooltips added at the end.
|
||||
## Providers
|
||||
|
||||
2. **Trust-first.** Confidence levels, data freshness, and missing-data warnings are shown proactively. We never surface a result that looks more certain than the underlying data supports. When data is stale or incomplete, we say so.
|
||||
All data access and data actions live in `src/provider/`.
|
||||
|
||||
3. **Better-than-Google.** A property search result that just shows "here are things that match your query" fails the user. Property Match should rank, explain trade-offs, surface future signals, and give the user a clear recommended next action — like a trusted advisor, not a search engine.
|
||||
### Naming
|
||||
|
||||
---
|
||||
| Rule | Example |
|
||||
|------|---------|
|
||||
| Every provider file/class is suffixed `Provider` | `PropertyProvider`, `UserProvider` |
|
||||
| Every provider backed by mock data is also prefixed `Mockup` | `MockupPropertyProvider`, `MockupUserProvider` |
|
||||
|
||||
## 2. Stack
|
||||
### Interface pattern
|
||||
|
||||
| Technology | Version | Role |
|
||||
|---|---|---|
|
||||
| Vite | 8 | Build tool & dev server |
|
||||
| React | 19 | UI framework |
|
||||
| TypeScript | 6 | Type safety |
|
||||
| MUI | v9 (`@mui/material`) | Component library |
|
||||
| Tailwind CSS | v4 | Utility classes (via `@tailwindcss/vite`) |
|
||||
| React Router | v7 | Routing — import from `react-router`, not `react-router-dom` |
|
||||
| TanStack Query | v5 | Server state & caching |
|
||||
| Zustand | v5 | Global UI state |
|
||||
| @dnd-kit | current | Drag-and-drop (Pipeline board) |
|
||||
| Zod | current | Schema validation |
|
||||
| Lucide React | current | Icon set (supplementary to MUI icons) |
|
||||
|
||||
**There is no `tailwind.config.js`.** Tailwind v4 uses `@tailwindcss/vite` — config is inline.
|
||||
|
||||
---
|
||||
|
||||
## 3. Three-Workspace Architecture
|
||||
|
||||
The app is organized into three protected workspaces. Every route lives in exactly one workspace.
|
||||
|
||||
| Workspace | Route prefix | Primary user | Core job-to-be-done |
|
||||
|---|---|---|---|
|
||||
| **SUPPLY** | `/supply/*` | Property manager / owner | Manage inventory, respond to demand, monitor market |
|
||||
| **DEMAND** | `/demand/*` | Tenant / company | Find, compare, and pipeline commercial space |
|
||||
| **OPERATIONS** | `/ops/*` | Internal staff | AI governance, market intelligence, audit logs |
|
||||
|
||||
Route protection is enforced at the router level via `<ProtectedRoute workspace={WorkspaceType.X} />`. Never add workspace-specific logic inside shared components — pass `isStaff`, `isOwner`, etc. as props.
|
||||
|
||||
---
|
||||
|
||||
## 4. Layered Architecture
|
||||
|
||||
Data and logic flow through four explicit layers. **Never skip a layer.**
|
||||
|
||||
```
|
||||
Provider → Service → Hook (React Query) → Component
|
||||
```
|
||||
|
||||
### 4.1 Provider Layer (`src/provider/`)
|
||||
|
||||
Providers are the **only** code that touches data storage. Everything else goes through them.
|
||||
|
||||
**Rules:**
|
||||
- Every entity has an interface: `I[Entity]Provider` (file: `I[Entity]Provider.ts`)
|
||||
- Every interface is implemented by a mockup: `Mockup[Entity]Provider` (file: `Mockup[Entity]Provider.ts`)
|
||||
- Every method is `async` and returns a `Promise` — even in the mockup
|
||||
- Mockups hold in-memory seed data from `src/mock-data/`
|
||||
- Real implementations swap in without changing any call sites
|
||||
|
||||
**Naming:**
|
||||
|
||||
| Pattern | Example |
|
||||
|---|---|
|
||||
| Interface | `IPropertyProvider` |
|
||||
| Mock implementation | `MockupPropertyProvider` |
|
||||
| Real implementation (future) | `RestPropertyProvider`, `SupabasePropertyProvider` |
|
||||
Define a TypeScript interface for each provider so the mockup and the real implementation are interchangeable:
|
||||
Every Interface should be prefixed with a capitalized I.
|
||||
|
||||
```ts
|
||||
// src/provider/IPropertyProvider.ts
|
||||
export interface IPropertyProvider {
|
||||
export interface PropertyProvider {
|
||||
getAll(): Promise<Property[]>
|
||||
getById(id: string): Promise<Property | null>
|
||||
create(data: CreatePropertyInput): Promise<Property>
|
||||
@@ -102,482 +43,38 @@ export interface IPropertyProvider {
|
||||
}
|
||||
```
|
||||
|
||||
### Async methods
|
||||
|
||||
Every method in a provider must be `async` and return a `Promise`, even in the mockup. This ensures the real provider can be swapped in without changing any call sites.
|
||||
|
||||
```ts
|
||||
// src/provider/MockupPropertyProvider.ts
|
||||
export const MockupPropertyProvider: IPropertyProvider = {
|
||||
async getAll() { return [...properties] },
|
||||
async getById(id) { return properties.find(p => p.id === id) ?? null },
|
||||
// ...
|
||||
import type { PropertyProvider } from './PropertyProvider'
|
||||
|
||||
const properties: Property[] = [ /* seed data */ ]
|
||||
|
||||
export const MockupPropertyProvider: PropertyProvider = {
|
||||
async getAll() {
|
||||
return [...properties]
|
||||
},
|
||||
async getById(id) {
|
||||
return properties.find(p => p.id === id) ?? null
|
||||
},
|
||||
async create(data) {
|
||||
const next: Property = { id: crypto.randomUUID(), ...data }
|
||||
properties.push(next)
|
||||
return next
|
||||
},
|
||||
async update(id, data) {
|
||||
const idx = properties.findIndex(p => p.id === id)
|
||||
properties[idx] = { ...properties[idx], ...data }
|
||||
return properties[idx]
|
||||
},
|
||||
async remove(id) {
|
||||
const idx = properties.findIndex(p => p.id === id)
|
||||
properties.splice(idx, 1)
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
**Anti-patterns:**
|
||||
- Never call a provider directly from a component — use a service
|
||||
- Never mutate provider state from outside the provider
|
||||
- Never share state across providers (cross-provider coupling creates hidden dependencies)
|
||||
|
||||
### 4.2 Service Layer (`src/services/`)
|
||||
|
||||
Services wrap providers with business logic, error handling, and response standardization.
|
||||
|
||||
**Rules:**
|
||||
- Named `[entity]Service` (e.g., `matchService`, `needService`)
|
||||
- Return standardized types: `ListResponse<T>` or `ItemResponse<T>` from `services/types.ts`
|
||||
- Errors are thrown via `throwServiceError()` from `services/errors.ts`
|
||||
- Services never import React hooks — they are plain TypeScript
|
||||
- Services access Zustand stores via `getState()`, never via `useStore()` hooks
|
||||
|
||||
```ts
|
||||
// ✅ Service accessing auth — no hook
|
||||
const user = useSessionStore.getState().currentUser
|
||||
```
|
||||
|
||||
### 4.3 Hook Layer (`src/hooks/`)
|
||||
|
||||
Hooks wrap React Query around services.
|
||||
|
||||
**Rules:**
|
||||
- One hook file per entity: `useProperties.ts`, `useMatches.ts`, etc.
|
||||
- `useQuery` for reads, `useMutation` for writes
|
||||
- Query keys follow the convention in STATE_MANAGEMENT.md
|
||||
- Stale times are imported from `src/lib/constants.ts` — never defined locally in hooks
|
||||
- Mutations call `queryClient.invalidateQueries` on success
|
||||
|
||||
```ts
|
||||
// ✅ Stale time from constants — never local
|
||||
import { STALE_PROPERTIES } from '../lib/constants'
|
||||
export function useProperties() {
|
||||
return useQuery({ queryKey: ['properties'], queryFn: () => propertyService.getAll(), staleTime: STALE_PROPERTIES })
|
||||
}
|
||||
```
|
||||
|
||||
### 4.4 Component Layer (`src/components/` + `src/pages/`)
|
||||
|
||||
Components are **pure UI**. They render data, dispatch mutations, and show state. They do not contain business logic.
|
||||
|
||||
---
|
||||
|
||||
## 5. Component Rules
|
||||
|
||||
### 5.1 Size Limits
|
||||
|
||||
| File type | Hard limit | Soft target |
|
||||
|---|---|---|
|
||||
| Page component (`src/pages/`) | 300 lines | 150–200 lines |
|
||||
| Feature component | 250 lines | 100–150 lines |
|
||||
| Atom/shared component | 150 lines | 50–100 lines |
|
||||
|
||||
When a component exceeds its soft target, split it. Extract sub-components, move constants to a `*Constants.ts` file, move pure helpers to a `*Utils.ts` file (`.tsx` if it returns JSX).
|
||||
|
||||
### 5.2 No Business Logic in JSX
|
||||
|
||||
The render body is for presentation only. All logic belongs upstream.
|
||||
|
||||
```tsx
|
||||
// ❌ Business logic in JSX
|
||||
{matches.filter(m => m.score > 70 && m.status !== 'DISMISSED').map(...)}
|
||||
|
||||
// ✅ Logic in useMemo, computed before the return
|
||||
const visibleMatches = useMemo(
|
||||
() => matches.filter(m => m.score > 70 && m.status !== 'DISMISSED'),
|
||||
[matches]
|
||||
)
|
||||
// then:
|
||||
{visibleMatches.map(...)}
|
||||
```
|
||||
|
||||
### 5.3 No Magic Strings
|
||||
|
||||
Every label, status, color, and route string has a named constant.
|
||||
|
||||
```ts
|
||||
// ❌
|
||||
if (user.role === 'PROPERTY_MANAGER') { ... }
|
||||
navigate('/supply/properties')
|
||||
|
||||
// ✅
|
||||
import { UserRole } from '../domain/enums'
|
||||
import { ROUTES } from '../lib/constants'
|
||||
if (user.role === UserRole.PROPERTY_MANAGER) { ... }
|
||||
navigate(ROUTES.SUPPLY.PROPERTIES)
|
||||
```
|
||||
|
||||
All German UI labels for enums live in `src/lib/constants.ts` (e.g., `ASSET_TYPE_LABELS`, `AVAILABILITY_LABELS`).
|
||||
|
||||
### 5.4 No `any` Casts
|
||||
|
||||
`any` disables TypeScript. Use `unknown` with type guards, or fix the type properly.
|
||||
|
||||
```ts
|
||||
// ❌
|
||||
const result = response as any
|
||||
const { data } = result
|
||||
|
||||
// ✅
|
||||
const result: ItemResponse<Property> = response
|
||||
const { data } = result
|
||||
```
|
||||
|
||||
The one allowed exception: third-party library types that don't ship proper types. Wrap the cast in a type-safe adapter so the `any` is isolated.
|
||||
|
||||
### 5.5 No Duplicated State
|
||||
|
||||
If a value can be computed from existing state, compute it. Do not store it.
|
||||
|
||||
```ts
|
||||
// ❌ Duplicated — sync bugs guaranteed
|
||||
const [overdueCount, setOverdueCount] = useState(0)
|
||||
useEffect(() => setOverdueCount(reminders.filter(r => isPast(r.dueDate)).length), [reminders])
|
||||
|
||||
// ✅ Derived inline
|
||||
const overdueCount = reminders.filter(r => isPast(r.dueDate)).length
|
||||
```
|
||||
|
||||
See STATE_MANAGEMENT.md for the full decision tree.
|
||||
|
||||
### 5.6 Component Library First
|
||||
|
||||
Before writing a custom component, check the [MUI component list](https://mui.com/material-ui/all-components/). Only build custom when:
|
||||
- MUI has no equivalent, or
|
||||
- The required behavior diverges significantly from what MUI provides
|
||||
|
||||
### 5.7 Styling
|
||||
|
||||
Use Tailwind utility classes for all layout and spacing. Use MUI's `sx` prop for component-specific overrides and theme values. **Never add styles to `.css` files.** The only CSS file is `src/index.css` (Tailwind layer imports) — do not add project styles there.
|
||||
|
||||
---
|
||||
|
||||
## 6. State Management
|
||||
|
||||
Full rules in [STATE_MANAGEMENT.md](./STATE_MANAGEMENT.md). Summary:
|
||||
|
||||
| Data type | Where it lives |
|
||||
|---|---|
|
||||
| Server data (fetched from provider) | React Query (`useQuery`) |
|
||||
| Write operations | React Query (`useMutation`) |
|
||||
| Global UI state (dialog open/close, compare tray, wizard steps) | Zustand store |
|
||||
| Auth session | `sessionStore` (Zustand, also read by services via `getState()`) |
|
||||
| Component-local state (form inputs, hover, toggle) | `useState` |
|
||||
| Values derived from existing state | Computed inline — never stored |
|
||||
|
||||
**Critical rules:**
|
||||
- Never copy React Query data into a Zustand store
|
||||
- Never call `useStore()` without a selector (use `s => s.field`)
|
||||
- Services read Zustand via `getState()`, never via hooks
|
||||
- Side effects (cache invalidation, analytics) go in `useEffect`, never in the render body
|
||||
|
||||
---
|
||||
|
||||
## 7. Domain & Types
|
||||
|
||||
### 7.1 Single Source of Truth
|
||||
|
||||
All domain types live in `src/domain/`. Never duplicate a type or interface.
|
||||
|
||||
| File | Contents |
|
||||
|---|---|
|
||||
| `enums.ts` | All enums: `AssetType`, `ResultType`, `MatchStatus`, `UserRole`, `WorkspaceType`, etc. |
|
||||
| `property.ts` | `Property`, `Location`, `ContactPerson` |
|
||||
| `match.ts` | `Match`, `ScoreBreakdown`, `ScoreFactor`, `TradeOff`, `Risk` |
|
||||
| `need.ts` | `Need`, `AreaRange`, `BudgetRange`, `WeightingProfile` |
|
||||
| `unifiedResult.ts` | `UnifiedMatchResult` (the discriminated union for result feeds) |
|
||||
| `scoring.ts` | `ScoringWeightProfile`, `HardFilterResult`, `MatchEngineOutput` |
|
||||
| `aiOutput.ts` | AI scoring, extraction, monitoring types |
|
||||
| ... | See `/domain/index.ts` for full list |
|
||||
|
||||
### 7.2 No Inline Type Duplication
|
||||
|
||||
```ts
|
||||
// ❌ Redefining a type locally
|
||||
interface LocalProperty { id: string; title: string; ... }
|
||||
|
||||
// ✅ Import from domain
|
||||
import type { Property } from '../../domain/property'
|
||||
```
|
||||
|
||||
### 7.3 Response Types
|
||||
|
||||
All service responses use the standardized wrapper from `src/services/types.ts`:
|
||||
|
||||
```ts
|
||||
type ListResponse<T> = { data: T[]; total: number }
|
||||
type ItemResponse<T> = { data: T }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Design System
|
||||
|
||||
All visual constants are centralized. **Never hardcode a color, spacing multiplier, or border-radius in a component.**
|
||||
|
||||
### 8.1 Color Tokens (`src/lib/ds.ts`)
|
||||
|
||||
```ts
|
||||
DS_COLORS.confidence.high // '#1a7a4a'
|
||||
DS_COLORS.confidence.medium // '#d97706'
|
||||
DS_COLORS.confidence.low // '#c0392b'
|
||||
DS_COLORS.risk.critical // '#dc2626'
|
||||
DS_COLORS.risk.warning // '#d97706'
|
||||
DS_COLORS.freshness.stale // '#d97706'
|
||||
DS_COLORS.freshness.outdated// '#dc2626'
|
||||
```
|
||||
|
||||
### 8.2 Score → Color Helpers (`src/lib/utils.ts`)
|
||||
|
||||
| Function | Input | Output | Use for |
|
||||
|---|---|---|---|
|
||||
| `matchScoreHex(score)` | 0–100 | hex string | Overall match score color |
|
||||
| `confidenceHex(score)` | 0–1 | hex string | Confidence score color |
|
||||
| `dataQualityColor(score)` | 0–1 | hex string | Data quality color |
|
||||
| `criterionScoreColor(score)` | 0–100 | MUI color token | Individual criterion badge |
|
||||
| `criterionScoreTextColor(score)` | 0–100 | hex string | Criterion text color |
|
||||
|
||||
### 8.3 Result Type Metadata (`src/lib/ds.ts`)
|
||||
|
||||
Use `RESULT_TYPE_META[resultType]` for label, color, and background. Never define these inline.
|
||||
|
||||
```ts
|
||||
// ❌
|
||||
label="Verified Portfolio"
|
||||
bgcolor="#1e3a5f"
|
||||
|
||||
// ✅
|
||||
import { RESULT_TYPE_META } from '../../lib/ds'
|
||||
label={RESULT_TYPE_META[result.resultType]?.label}
|
||||
bgcolor={RESULT_TYPE_META[result.resultType]?.color}
|
||||
```
|
||||
|
||||
### 8.4 Thresholds (`src/lib/constants.ts`)
|
||||
|
||||
```ts
|
||||
SCORE_STRONG = 80 // match score considered "strong"
|
||||
SCORE_MODERATE = 60 // match score considered "moderate"
|
||||
CONF_HIGH = 0.85 // confidence considered "high"
|
||||
CONF_MEDIUM = 0.65 // confidence considered "medium"
|
||||
DQ_HIGH = 0.8 // data quality considered "high"
|
||||
DQ_MEDIUM = 0.6 // data quality considered "medium"
|
||||
```
|
||||
|
||||
These thresholds are used by `scoreToConfidenceLevel()`, `scoreToDataQualityLevel()`, and all badge logic. Never re-define them locally.
|
||||
|
||||
---
|
||||
|
||||
## 9. AI Integration Rules
|
||||
|
||||
Property Match integrates AI as a **service**, not as a feature bolted onto the UI.
|
||||
|
||||
### 9.1 Model-Agnostic Interface
|
||||
|
||||
AI is accessed exclusively through `IAIService` (`src/services/ai/IAIService.ts`). The interface defines capabilities (parseNeed, compareProperties, generateDecisionBrief, etc.). No component imports an LLM client directly.
|
||||
|
||||
```ts
|
||||
// ❌ Never in a component or hook
|
||||
import OpenAI from 'openai'
|
||||
const client = new OpenAI(...)
|
||||
|
||||
// ✅ Always via service
|
||||
import { aiService } from '../services/aiService'
|
||||
const result = await aiService.parseNeed(text)
|
||||
```
|
||||
|
||||
### 9.2 Implementations
|
||||
|
||||
| Implementation | File | Used when |
|
||||
|---|---|---|
|
||||
| `MockAIService` | `src/services/ai/MockAIService.ts` | Dev / CI — deterministic, no API calls |
|
||||
| `OpenRouterAIService` | `src/services/ai/OpenRouterAIService.ts` | Production — OpenRouter API |
|
||||
|
||||
Swap implementations by changing the export in `src/services/aiService.ts`. No other file changes required.
|
||||
|
||||
### 9.3 Structured Responses
|
||||
|
||||
AI calls must return typed, structured objects — never raw strings passed into JSX.
|
||||
|
||||
```ts
|
||||
// ❌ Raw LLM output in JSX
|
||||
<Typography>{llmResponse}</Typography>
|
||||
|
||||
// ✅ Parsed, validated, typed output
|
||||
const result: ParsedNeed = await aiService.parseNeed(text)
|
||||
<NeedCardPreview need={result.need} confidence={result.confidence} />
|
||||
```
|
||||
|
||||
All AI response schemas are validated with Zod before use.
|
||||
|
||||
### 9.4 Explainable Outputs
|
||||
|
||||
Every AI output that influences a user decision must be accompanied by an explanation.
|
||||
|
||||
- Match scores include `ScoreFactor[]` (positive & negative)
|
||||
- Trade-off analysis includes `TradeOff[]` with severity
|
||||
- Future availability signals include `probabilityScore` + `signalBasis`
|
||||
- AI-parsed needs include `confidence` + which fields were inferred vs. stated
|
||||
|
||||
### 9.5 Human-in-the-Loop
|
||||
|
||||
AI suggestions are always proposals — the user confirms or overrides.
|
||||
|
||||
- Need parsing: user reviews extracted criteria before search runs
|
||||
- AI recommendations: presented with confidence, not as commands
|
||||
- Review queue (`/ops`): all AI-generated content can be reviewed and corrected
|
||||
- Governance: `aiMonitoringService` logs every AI output with model version, prompt hash, and response
|
||||
|
||||
### 9.6 Fallback Handling
|
||||
|
||||
Every AI call has a defined fallback. If the AI service fails or returns a low-confidence result:
|
||||
- The UI shows a manual entry path
|
||||
- Confidence badges reflect uncertainty
|
||||
- No AI failure should block a user workflow
|
||||
|
||||
---
|
||||
|
||||
## 10. Performance Rules
|
||||
|
||||
### 10.1 No Expensive Calculations in Render
|
||||
|
||||
Any computation over a list, aggregation, or filter runs in `useMemo`, not in the render body.
|
||||
|
||||
```tsx
|
||||
// ❌ Runs on every render — expensive if list is large
|
||||
return (
|
||||
<div>
|
||||
{properties
|
||||
.filter(p => p.confidenceScore >= 0.7)
|
||||
.sort((a, b) => b.areaSqm - a.areaSqm)
|
||||
.map(p => <PropertyCard key={p.id} property={p} />)}
|
||||
</div>
|
||||
)
|
||||
|
||||
// ✅ Runs only when dependencies change
|
||||
const visible = useMemo(
|
||||
() => properties.filter(p => p.confidenceScore >= 0.7).sort((a, b) => b.areaSqm - a.areaSqm),
|
||||
[properties]
|
||||
)
|
||||
return <div>{visible.map(p => <PropertyCard key={p.id} property={p} />)}</div>
|
||||
```
|
||||
|
||||
### 10.2 Memoize List Items
|
||||
|
||||
Components rendered in lists (feeds, tables, grids) must be wrapped in `React.memo` to prevent cascade re-renders when parent state changes (e.g., a filter toggle or `selectedId` update).
|
||||
|
||||
```ts
|
||||
// ✅ List item — always memo
|
||||
export const PropertyCard = memo(function PropertyCard({ property, onSelect }: Props) { ... })
|
||||
export const ReminderListRow = memo(function ReminderListRow({ reminder }: Props) { ... })
|
||||
```
|
||||
|
||||
### 10.3 Stable Callbacks for Memoized Children
|
||||
|
||||
When passing callbacks as props to memoized children, wrap them in `useCallback`. An unstable function reference breaks `React.memo`.
|
||||
|
||||
```ts
|
||||
// ✅ Stable reference — memo children won't re-render
|
||||
const handleSelect = useCallback((id: string) => setSelectedId(id), [])
|
||||
```
|
||||
|
||||
### 10.4 Single-Pass Aggregations
|
||||
|
||||
When computing multiple aggregates over the same list (e.g., count of matchReady + criticalGaps + lowConfidence), use a single `for` loop in one `useMemo` — not three separate `.filter()` calls.
|
||||
|
||||
### 10.5 Virtualization
|
||||
|
||||
The current page size (`DEFAULT_PAGE_SIZE = 25`) makes React virtualization unnecessary today. If paginated lists are removed or page size exceeds ~200 items, evaluate `@tanstack/virtual` for the result feed and property table.
|
||||
|
||||
### 10.6 Bundle Splitting
|
||||
|
||||
All routes are already lazy-loaded via `React.lazy()` in `App.tsx`. Keep it that way — do not import page components directly.
|
||||
|
||||
---
|
||||
|
||||
## 11. Security & Governance
|
||||
|
||||
### 11.1 Auth & Session
|
||||
|
||||
- Auth state lives in `sessionStore` (Zustand)
|
||||
- On logout, **clear the React Query cache**: `queryClient.clear()`
|
||||
- Role checks use `src/lib/permissions.ts` — never inline `role === 'PROPERTY_MANAGER'`
|
||||
- Workspace access is enforced by `<ProtectedRoute workspace={...} />` — never guard with `if` inside a component
|
||||
|
||||
### 11.2 Role-Based Rendering
|
||||
|
||||
```ts
|
||||
// ❌ Magic string role check
|
||||
if (user.role === 'PROPERTY_MANAGER') { ... }
|
||||
|
||||
// ✅ Permission helper
|
||||
import { canViewMatchCenter } from '../../lib/permissions'
|
||||
if (canViewMatchCenter(user)) { ... }
|
||||
```
|
||||
|
||||
### 11.3 No Sensitive Data in Client State
|
||||
|
||||
- Do not store tokens, passwords, or PII in Zustand stores beyond what is strictly needed for session identity
|
||||
- Do not log sensitive fields in console statements
|
||||
- Do not pass sensitive data as URL params (use navigation state instead)
|
||||
|
||||
### 11.4 AI Audit Logging
|
||||
|
||||
Every AI output that influences a business decision is logged via `aiMonitoringService`. Logs include:
|
||||
- Timestamp
|
||||
- Model ID and version
|
||||
- Prompt hash (not the full prompt — for privacy)
|
||||
- Response summary
|
||||
- User ID and workspace
|
||||
|
||||
### 11.5 Data Lineage
|
||||
|
||||
Every property record carries `DataSource` metadata (origin, freshness, last verified). Surface this data proactively — especially when `freshness === 'STALE'` or `freshness === 'OUTDATED'`.
|
||||
|
||||
---
|
||||
|
||||
## 12. Adding a New Feature — Checklist
|
||||
|
||||
Before writing any code, answer these questions:
|
||||
|
||||
1. **Which workspace does this belong to?** (SUPPLY / DEMAND / OPS)
|
||||
2. **What decision does this help the user make?** (If you can't answer this, reconsider the feature)
|
||||
3. **Does a provider already exist for this entity?** If not, create `I[Entity]Provider` + `Mockup[Entity]Provider` first
|
||||
4. **Does a service already exist?** If not, create `[entity]Service` that wraps the provider
|
||||
5. **Does a hook already exist?** If not, create `use[Entity]` in `src/hooks/`
|
||||
6. **Is this server state or UI state?** (see STATE_MANAGEMENT.md)
|
||||
7. **Does this show a score or confidence value?** Use `DS_COLORS` + helper functions from `lib/utils.ts`
|
||||
8. **Does this involve AI?** Go through `IAIService` — never call LLM APIs directly
|
||||
9. **Does this need explainability?** Add score factors, provenance, or reasoning before calling it done
|
||||
|
||||
**Do not** add business logic to components. **Do not** duplicate types from `/domain/`. **Do not** hardcode colors, labels, or thresholds.
|
||||
|
||||
---
|
||||
|
||||
## 13. File Naming & Organization
|
||||
|
||||
| Location | What goes there |
|
||||
|---|---|
|
||||
| `src/pages/[workspace]/` | Route-level page components |
|
||||
| `src/components/[feature]/` | Feature-specific components |
|
||||
| `src/components/shared/` | Components used across features |
|
||||
| `src/components/ui/` | Atomic UI: ErrorBoundary, EmptyState, Toast, DecisionContextPanel |
|
||||
| `src/components/layout/` | AppShell, PageHeader, RightContextPanel |
|
||||
| `src/hooks/` | React Query hooks |
|
||||
| `src/services/` | Business logic services |
|
||||
| `src/services/ai/` | AI service interface + implementations + prompts |
|
||||
| `src/provider/` | Data access interfaces + mock implementations |
|
||||
| `src/domain/` | TypeScript types and enums |
|
||||
| `src/features/matching/` | Scoring and ranking algorithms |
|
||||
| `src/stores/` | Zustand stores |
|
||||
| `src/lib/` | Shared utilities, theme, constants, design system |
|
||||
| `src/mock-data/` | Seed data for mock providers |
|
||||
|
||||
Each component folder has an `index.ts` barrel export. New components must be added to the barrel before use.
|
||||
|
||||
**File extension rule:** Any file that contains JSX must use `.tsx`. Plain TypeScript (no JSX) uses `.ts`. Violating this causes Vite parse errors.
|
||||
|
||||
---
|
||||
|
||||
## 14. TypeScript Rules
|
||||
|
||||
- `strict: true` is enforced — do not disable strict mode or individual checks
|
||||
- Prefer `interface` for object shapes (can be extended); use `type` for unions and aliases
|
||||
- Props interfaces are named `Props` (local) or `[ComponentName]Props` (exported)
|
||||
- Never use `@ts-ignore` — fix the type instead
|
||||
- `as unknown as T` is acceptable only when bridging genuinely untyped third-party code; wrap it in a named adapter function
|
||||
- Enums from `src/domain/enums.ts` are the source of truth — never redefine values locally
|
||||
Swap to a real implementation by replacing `MockupPropertyProvider` with a provider that calls an API — no other code changes required.
|
||||
|
||||
@@ -1,226 +0,0 @@
|
||||
# Code Review Checklist — Property Match
|
||||
|
||||
> Use this checklist before every PR review and before considering any implementation "done".
|
||||
> For architecture context see [ARCHITECTURE.md](./ARCHITECTURE.md).
|
||||
> For coding rules see [CLAUDE.md](./CLAUDE.md).
|
||||
|
||||
---
|
||||
|
||||
## A. Component Size & Structure
|
||||
|
||||
- [ ] **Is the component too large?**
|
||||
- Page component: hard limit 300 lines, target 150–200
|
||||
- Feature component: hard limit 250 lines, target 100–150
|
||||
- Atom/shared component: hard limit 150 lines
|
||||
- If over limit: extract sub-components, move constants to `*Constants.ts`, move helpers to `*Utils.ts` (`.tsx` if JSX)
|
||||
|
||||
- [ ] **Is business logic inside JSX?**
|
||||
- `.filter()`, `.sort()`, `.reduce()`, conditional rendering based on computed values — these belong in `useMemo`, not inline in the return
|
||||
- The render body should read computed values, not compute them
|
||||
|
||||
- [ ] **Are hardcoded strings present?**
|
||||
- Status labels (`'ACTIVE'`, `'Aktiv'`, `'PROPERTY_MANAGER'`) must come from `enums.ts` or `constants.ts`
|
||||
- Route paths must come from `ROUTES` constants, not string literals
|
||||
- German UI labels for enums live in `constants.ts` (e.g., `ASSET_TYPE_LABELS`)
|
||||
|
||||
- [ ] **Are hardcoded colors or thresholds present?**
|
||||
- Colors like `'#1a7a4a'`, `'#dc2626'` directly in `sx` props → use `DS_COLORS` from `lib/ds.ts`
|
||||
- Score thresholds like `score >= 80` → use `SCORE_STRONG` from `constants.ts`
|
||||
- Confidence thresholds like `conf >= 0.75` → use `CONF_HIGH` from `constants.ts`
|
||||
|
||||
- [ ] **Are duplicate result type labels/colors defined locally?**
|
||||
- `RESULT_TYPE_META` in `lib/ds.ts` is the single source of truth
|
||||
- `RESULT_TYPE_LABEL` / `RESULT_TYPE_COLOR` inline objects anywhere else → delete them
|
||||
|
||||
---
|
||||
|
||||
## B. State & Data
|
||||
|
||||
- [ ] **Is server data stored in Zustand?**
|
||||
- Any `useEffect(() => setFoo(data), [data])` pattern that mirrors React Query data into local/Zustand state → remove it, read directly from the query
|
||||
- Server data lives exclusively in the React Query cache
|
||||
|
||||
- [ ] **Is derived state stored in state?**
|
||||
- `const [count, setCount] = useState(0)` + `useEffect` to keep it in sync → compute inline or use `useMemo`
|
||||
- Exception: expensive computations may use `useMemo`
|
||||
|
||||
- [ ] **Is the full Zustand store subscribed to without a selector?**
|
||||
- `const { a, b, c } = useMyStore()` — re-renders on every store mutation
|
||||
- Use `useMyStore(s => s.a)` for single fields, `useShallow` for multiple fields
|
||||
|
||||
- [ ] **Is there a side effect in the render body?**
|
||||
- `queryClient.invalidateQueries(...)` called during render → must be in `useEffect`
|
||||
- Any `console.log`, analytics call, or mutation triggered directly in render body → `useEffect`
|
||||
|
||||
- [ ] **Are all hooks called before conditional early returns?**
|
||||
- React rules of hooks: all `useState`, `useMemo`, `useCallback`, `useQuery` calls must appear before any `if (isLoading) return ...`
|
||||
|
||||
---
|
||||
|
||||
## C. Type Safety
|
||||
|
||||
- [ ] **Are there `any` casts?**
|
||||
- `as any`, `: any`, `// @ts-ignore` — fix the type or use `unknown` with a type guard
|
||||
- One exception: bridging untyped third-party code — must be isolated in a named adapter
|
||||
|
||||
- [ ] **Are domain types re-defined locally?**
|
||||
- Any interface or type that duplicates something in `src/domain/` → import from domain instead
|
||||
|
||||
- [ ] **Are response types used?**
|
||||
- Service functions should return `ListResponse<T>` or `ItemResponse<T>` from `services/types.ts`
|
||||
|
||||
- [ ] **Do `.tsx` files contain JSX and `.ts` files not?**
|
||||
- Any file with JSX (`<Component />`, `<Box>`, `<Typography>`) must have `.tsx` extension
|
||||
- Plain TypeScript utilities use `.ts`
|
||||
|
||||
---
|
||||
|
||||
## D. Layering & Architecture
|
||||
|
||||
- [ ] **Is business logic in a component?**
|
||||
- Scoring calculations, ranking, filtering rules, AI calls, data transformation → move to service or `features/` layer
|
||||
- Components only render and dispatch
|
||||
|
||||
- [ ] **Is a provider called directly from a component or hook?**
|
||||
- `MockupPropertyProvider.getAll()` called in a hook → must go through `propertyService`
|
||||
- All provider access is mediated by a service
|
||||
|
||||
- [ ] **Is an LLM API called directly?**
|
||||
- Any `fetch` to an AI API, or direct `OpenAI` / `openrouter` SDK calls outside `src/services/ai/` → move behind `IAIService`
|
||||
|
||||
- [ ] **Are there cross-workspace component imports?**
|
||||
- A supply component importing from `components/demand/` or vice versa → use `components/shared/` or `components/ui/` instead
|
||||
|
||||
- [ ] **Are the import direction rules respected?**
|
||||
- `services/` must not import React hooks
|
||||
- `domain/` must not import anything from `src/`
|
||||
- `lib/constants.ts` must not import from components or services
|
||||
- No circular imports
|
||||
|
||||
---
|
||||
|
||||
## E. Loading, Error & Empty States
|
||||
|
||||
- [ ] **Does every data-dependent view handle loading?**
|
||||
- Every `useQuery` that drives a list or table must show a skeleton or spinner while `isLoading`
|
||||
- Use the appropriate skeleton component (`FeedSkeleton`, `ReminderSkeleton`, etc.)
|
||||
|
||||
- [ ] **Does every data-dependent view handle error?**
|
||||
- `isError` from `useQuery` must show `<ErrorState message={error.message} />`
|
||||
- Never leave an error state blank or silently swallowed
|
||||
|
||||
- [ ] **Does every list handle the empty state?**
|
||||
- Empty results after filtering → `<FeedEmptyState filtered={true} />` with a reset action
|
||||
- Empty because no data exists → `<FeedEmptyState filtered={false} />`
|
||||
|
||||
---
|
||||
|
||||
## F. Performance
|
||||
|
||||
- [ ] **Are list items wrapped in `React.memo`?**
|
||||
- Components rendered inside `.map()` in feeds, tables, or grids → should be `memo()`
|
||||
- Without memo, every parent state change (e.g., filter toggle, `selectedId`) re-renders the entire list
|
||||
|
||||
- [ ] **Are callbacks to memoized children wrapped in `useCallback`?**
|
||||
- Passing `() => setSelectedId(id)` inline as a prop to a `memo()`-wrapped child → the memo is broken
|
||||
- Wrap with `useCallback` and explicit dependency array
|
||||
|
||||
- [ ] **Are multiple aggregations over the same list collapsed into one pass?**
|
||||
- Three separate `useMemo` calls that each `.filter()` the same array → collapse into one `useMemo` with a `for` loop
|
||||
|
||||
- [ ] **Is `useMemo` used for expensive filters and sorts?**
|
||||
- `.filter()` + `.sort()` over 25+ items in the render body → `useMemo`
|
||||
- Decision aggregates (matchReady count, criticalGaps count, etc.) in `Properties.tsx` → already in `useMemo`
|
||||
|
||||
- [ ] **Are routes lazy-loaded?**
|
||||
- All page imports in `App.tsx` must use `React.lazy()` — never static imports for route components
|
||||
|
||||
---
|
||||
|
||||
## G. Explainability & Trust
|
||||
|
||||
- [ ] **Does every score shown have a breakdown path?**
|
||||
- A match score badge with no way to see *why* it's that score → add `ScoreBreakdownPanel` or link to MatchDetail
|
||||
|
||||
- [ ] **Are confidence levels shown proactively?**
|
||||
- Data with `confidenceScore < CONF_MEDIUM` or `freshness === 'STALE'` → must be visually flagged
|
||||
- `ConfidenceBadge`, `FreshnessIndicator`, `DataQualityBar` exist for this purpose
|
||||
|
||||
- [ ] **Are Future Availability signals clearly labeled as probabilistic?**
|
||||
- `FUTURE_AVAILABILITY` results must always show `probabilityScore` and `signalBasis`
|
||||
- They must never look identical to confirmed availability listings
|
||||
|
||||
- [ ] **Does AI output show its confidence?**
|
||||
- AI-extracted need criteria → shown with confidence indicator
|
||||
- AI match suggestions → shown with `MAISON_WORK` badge and probability
|
||||
|
||||
---
|
||||
|
||||
## H. Security
|
||||
|
||||
- [ ] **Is the React Query cache cleared on logout?**
|
||||
- Logout flow must call `queryClient.clear()` — otherwise stale data from previous user persists
|
||||
|
||||
- [ ] **Are role checks using `permissions.ts` helpers?**
|
||||
- `user.role === 'PROPERTY_MANAGER'` inline → use `canViewMatchCenter(user)` from `lib/permissions.ts`
|
||||
|
||||
- [ ] **Are workspace route guards in place?**
|
||||
- Every supply/demand/ops route wrapped in `<ProtectedRoute workspace={...} />`
|
||||
- Never guard with `if (user.workspace !== ...)` inside a component body
|
||||
|
||||
- [ ] **Is sensitive data stored in Zustand?**
|
||||
- PII, tokens, and sensitive fields beyond current-user identity should not persist in client state
|
||||
|
||||
---
|
||||
|
||||
## I. Backend-Readiness
|
||||
|
||||
- [ ] **Is the provider interface complete?**
|
||||
- Any new entity that creates a mock shortcut (array mutation inline, no interface) → add `I[Entity]Provider` and `Mockup[Entity]Provider`
|
||||
|
||||
- [ ] **Are async patterns consistent?**
|
||||
- All provider methods are `async` — if a new provider method is synchronous, fix it before it gets called from a service
|
||||
|
||||
- [ ] **Are query keys stable and specific?**
|
||||
- Query key `['properties']` is fine for list; `['properties', id]` for single item
|
||||
- Keys that include derived or computed objects (not primitives) will break cache lookup
|
||||
|
||||
- [ ] **Are stale times centralized?**
|
||||
- No `staleTime: 60_000` or `staleTime: 5 * 60 * 1000` inline in hook files
|
||||
- Use `STALE_PROPERTIES`, `STALE_MATCHES`, etc. from `src/lib/constants.ts`
|
||||
|
||||
---
|
||||
|
||||
## J. AI & Model Governance
|
||||
|
||||
- [ ] **Is the AI call going through `IAIService`?**
|
||||
- Direct fetch to AI API anywhere outside `src/services/ai/` → move it
|
||||
|
||||
- [ ] **Is the AI response validated with Zod before use?**
|
||||
- Raw LLM string parsed inline with `JSON.parse()` without a schema → add Zod validation
|
||||
|
||||
- [ ] **Is the AI output logged via `aiMonitoringService`?**
|
||||
- Any AI call that influences a business decision (need parsing, match recommendation, market signal) → log it
|
||||
|
||||
- [ ] **Does the AI flow have a fallback?**
|
||||
- If `aiService` throws or returns `confidence < threshold`, is there a manual entry path?
|
||||
- AI failures must never block the user workflow
|
||||
|
||||
---
|
||||
|
||||
## Quick Checklist — Pre-Commit
|
||||
|
||||
Before every commit, verify:
|
||||
|
||||
```
|
||||
[ ] npx tsc --noEmit → zero errors
|
||||
[ ] No new hardcoded colors, routes, or role strings
|
||||
[ ] No business logic added to a JSX return block
|
||||
[ ] No React Query data mirrored into Zustand or useState
|
||||
[ ] All hooks called before early returns
|
||||
[ ] New list-item components wrapped in React.memo
|
||||
[ ] New provider methods are async and match the interface
|
||||
[ ] New feature goes through Provider → Service → Hook → Component
|
||||
[ ] Loading, error, and empty states handled for any new data-fetching view
|
||||
[ ] File with JSX has .tsx extension
|
||||
```
|
||||
@@ -1,129 +1,73 @@
|
||||
# Property Match
|
||||
# React + TypeScript + Vite
|
||||
|
||||
Decision-Intelligence-Plattform für kommerziell genutzte Immobilien — kein Portal, sondern
|
||||
eine Oberfläche, die Treffer bewertet, Trade-offs erklärt und eine nächste Handlung empfiehlt.
|
||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||
|
||||
Verbindliche Entwicklungsregeln stehen in [CLAUDE.md](./CLAUDE.md), Architekturdiagramme in
|
||||
[ARCHITECTURE.md](./ARCHITECTURE.md), Zustandsregeln in [STATE_MANAGEMENT.md](./STATE_MANAGEMENT.md).
|
||||
Currently, two official plugins are available:
|
||||
|
||||
## Starten
|
||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
|
||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev # Entwicklungsserver auf http://localhost:5173
|
||||
## React Compiler
|
||||
|
||||
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
|
||||
|
||||
## Expanding the ESLint configuration
|
||||
|
||||
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
||||
|
||||
```js
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
// Other configs...
|
||||
|
||||
// Remove tseslint.configs.recommended and replace with this
|
||||
tseslint.configs.recommendedTypeChecked,
|
||||
// Alternatively, use this for stricter rules
|
||||
tseslint.configs.strictTypeChecked,
|
||||
// Optionally, add this for stylistic rules
|
||||
tseslint.configs.stylisticTypeChecked,
|
||||
|
||||
// Other configs...
|
||||
],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
// other options...
|
||||
},
|
||||
},
|
||||
])
|
||||
```
|
||||
|
||||
Es gibt kein Backend und keine Datenbank. Sämtliche Daten stammen aus TypeScript-Mockdaten
|
||||
unter `src/mock-data/` und werden über Mockup-Provider bereitgestellt.
|
||||
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
||||
|
||||
| Skript | Zweck |
|
||||
|---|---|
|
||||
| `npm run dev` | Entwicklungsserver mit HMR |
|
||||
| `npm run build` | Typecheck (`tsc -b`) und Produktionsbuild |
|
||||
| `npm run lint` | ESLint über das gesamte Projekt |
|
||||
| `npm test` | Vitest einmalig ausführen |
|
||||
| `npm run test:watch` | Vitest im Watch-Modus |
|
||||
| `npm run check:tokens` | Zählt rohe Hex-Farbwerte gegen einen Schwellwert |
|
||||
|
||||
## Architektur in vier Schichten
|
||||
```js
|
||||
// eslint.config.js
|
||||
import reactX from 'eslint-plugin-react-x'
|
||||
import reactDom from 'eslint-plugin-react-dom'
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
// Other configs...
|
||||
// Enable lint rules for React
|
||||
reactX.configs['recommended-typescript'],
|
||||
// Enable lint rules for React DOM
|
||||
reactDom.configs.recommended,
|
||||
],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
// other options...
|
||||
},
|
||||
},
|
||||
])
|
||||
```
|
||||
Provider → Service → Hook (React Query) → Component
|
||||
```
|
||||
|
||||
- **Provider** (`src/provider/`) sind der einzige Ort, der Datenhaltung berührt.
|
||||
- **Services** (`src/services/`) tragen die Fachlogik und liefern `ListResponse<T>` / `ItemResponse<T>`.
|
||||
- **Hooks** (`src/hooks/`) kapseln React Query; Stale-Zeiten kommen aus `src/lib/constants.ts`.
|
||||
- **Komponenten** (`src/components/`, `src/pages/`) sind reine Darstellung.
|
||||
|
||||
Drei geschützte Arbeitsbereiche: `/supply/*` (Bewirtschaftung), `/demand/*` (Suche),
|
||||
`/ops/*` (interner Betrieb).
|
||||
|
||||
---
|
||||
|
||||
## Property On — «Teamübersicht»
|
||||
|
||||
Property On ist als Funktionsbereich in Property Match eingebettet, nicht als eigene
|
||||
Anwendung. Es gibt keine zweite App-Shell, keine zweite Sidebar und kein eigenes Branding.
|
||||
Erreichbar über den Hauptreiter **Teamübersicht** in der Bewirtschaftungs-Navigation, mit den
|
||||
Subreitern **Personalverwaltung**, **Bearbeitungsverlauf** und **Kanäle & Systeme**.
|
||||
|
||||
Bedienprinzip: **human-led, agent-operated.** Sieben digitale Mitarbeiter führen Arbeiten aus,
|
||||
der Mensch gibt frei, passt an oder weist zurück. Jede Entscheidung erzeugt einen
|
||||
Protokolleintrag, aktualisiert die Kennzahlen und meldet sich mit einer Rückmeldung.
|
||||
|
||||
### Routen
|
||||
|
||||
```
|
||||
/supply/team Teamübersicht (Startseite)
|
||||
/supply/team/personalverwaltung Agentenliste + Dossier
|
||||
/supply/team/personalverwaltung/:agentId Personalblatt
|
||||
/supply/team/personalverwaltung/:agentId/:tab Dossier-Reiter, deep-linkbar
|
||||
tab: aufgaben | kanaele | systeme
|
||||
einstellungen | protokoll
|
||||
/supply/team/bearbeitungsverlauf Vorgänge
|
||||
/supply/team/bearbeitungsverlauf/:tab tab: pendente-anfragen | erledigte-auftraege
|
||||
/supply/team/kanaele-systeme Verbindungen der Organisation
|
||||
```
|
||||
|
||||
### Architekturentscheidungen
|
||||
|
||||
**Der Entitätstyp heisst `TeamAgent`, nicht `Agent`.** Im Repo existiert bereits `PowerOn` als
|
||||
Name des KI-Backend-Proxys, und Claude Code legt Arbeitskopien unter `agent-*` ab. Ein nackter
|
||||
Typ `Agent` wäre in Suchen praktisch nicht auffindbar. Alle Satellitentypen tragen das Präfix
|
||||
`Agent*` — `AgentStatus`, `AgentChannelType`, `AgentProtocolEntry` —, weil `src/domain/index.ts`
|
||||
per `export *` bündelt und generische Namen dort kollidieren würden.
|
||||
|
||||
**Eigener Protokolltyp statt `ActivityEvent`.** Den Namen gibt es im Repo dreifach und
|
||||
gegenseitig inkompatibel: in `domain/activityEvent.ts`, lokal in `services/governanceService.ts`
|
||||
und noch einmal in `components/supply/PropertyActivityLogPanel.tsx`. Ein Anschluss an einen
|
||||
dieser Typen hätte den Konflikt zementiert; `AgentProtocolEntry` steht bewusst daneben.
|
||||
|
||||
**Verbindungen sind von `DataSource` getrennt.** `DataSource`/`ConnectorRun` modelliert
|
||||
Crawler-Quellen mit AGB-Status und Crawl-Läufen. «Kanäle & Systeme» beschreibt angebundene
|
||||
Kommunikationskanäle und Fachsysteme — fachlich etwas anderes. Die Ops-Komponenten dienten als
|
||||
visuelles Vorbild, das Datenmodell ist eigenständig.
|
||||
|
||||
**Eine Demo-Uhr statt der Systemzeit** (`src/lib/teamClock.ts`). Die Mockdaten sind fachlich
|
||||
auf den 20.05.2026 verankert. Gegen die echte Systemzeit gerechnet wären die Zeitraumfilter
|
||||
«heute / diese Woche / dieser Monat» an jedem anderen Kalendertag leer, und die Auswertung
|
||||
sähe kaputt aus, obwohl sie korrekt arbeitet. Die Demo-Uhr startet am Anker und läuft ab
|
||||
Anwendungsstart in Echtzeit weiter — jede Freigabe während einer Vorführung landet damit
|
||||
verlässlich im Bucket «heute». Sie gilt ausschliesslich für Property On.
|
||||
|
||||
**Persistenz liegt in der Providerschicht.** Geänderte Einstellungen, Aufgabenschalter,
|
||||
erledigte Vorgänge, Verbindungsstatus und pausierte Mitarbeiter überleben einen Reload über
|
||||
den Local Storage. Die Bestände tragen eine Schemaversion (`TEAM_SCHEMA_VERSION`): passt sie
|
||||
nicht, greift wieder der Seed aus `src/mock-data/` — sonst überlagerte ein alter Eintrag
|
||||
stillschweigend geänderte Mockdaten. «Demo zurücksetzen» löscht genau diese Schlüssel.
|
||||
|
||||
**Subreiter sind echte Routen, keine lokalen Tabs.** Die Anwendung kannte bis dahin keine
|
||||
Feature-Route mit eigenem `<Outlet/>`, und Tabs werden sonst über lokalen `useState` gebaut.
|
||||
Hier war das nicht tragfähig: die drei Subreiter müssen in der Sidebar sichtbar sein und
|
||||
deep-linkbar bleiben. Das `NavItem`-Modell in `appShellConfig.ts` wurde deshalb um `children`
|
||||
erweitert; die Routen sind flache Geschwister, kein Outlet-Baum.
|
||||
|
||||
**Kein neuer Stack.** Der ursprüngliche Auftrag nannte shadcn/ui, React Hook Form, date-fns und
|
||||
Playwright. Nichts davon ist installiert, und die Vorgabe, die bestehenden Property-Match-Muster
|
||||
zu übernehmen, wiegt schwerer. Umgesetzt mit MUI v9, TanStack Query, Zustand und Zod;
|
||||
Datumsformatierung über `Intl` in `src/lib/utils.ts` und `src/lib/teamClock.ts`. Besonders
|
||||
relevant: Tailwind-Preflight ist bewusst nicht importiert — shadcn erwartet es und würde den
|
||||
`CssBaseline`-Reset von MUI überschreiben.
|
||||
|
||||
### Simulation
|
||||
|
||||
Alles ist Frontend-Simulation. Es gibt keine echten Systemverbindungen, keine echten
|
||||
Zugangsdaten und keine echten Modellaufrufe. Simulierte Ladezeiten liegen zwischen 300 und
|
||||
800 ms. Der Test einer Verbindung ist **deterministisch** und nicht zufällig: verbundene
|
||||
Kanäle gelingen, nicht verbundene und geplante scheitern reproduzierbar — ein Zufallsfehler
|
||||
würde eine Kundendemo unvorhersehbar machen.
|
||||
|
||||
### Bekannte Altlasten
|
||||
|
||||
- `npm run check:tokens` liegt bei 2249 rohen Hex-Werten über dem Schwellwert von 1958. Der
|
||||
Wert stammt vollständig aus dem Bestand; Property On hat null hinzugefügt. Der Schwellwert
|
||||
darf laut Skript nicht angehoben werden.
|
||||
- `npm run lint` meldet im Bestand weiterhin Fehler und Warnungen. Der Property-On-Code ist
|
||||
frei davon: `npx eslint src/components/team src/pages/supply/Teamuebersicht.tsx …` ist grün.
|
||||
- In `tsconfig` ist `strict` entgegen CLAUDE.md §14 nicht gesetzt; `strictNullChecks` fehlt
|
||||
damit projektweit.
|
||||
|
||||
@@ -1,223 +0,0 @@
|
||||
# State Management — Property Match
|
||||
|
||||
## Decision Tree
|
||||
|
||||
```
|
||||
Is it server data (fetched from an API or provider)?
|
||||
→ React Query (useQuery / useMutation)
|
||||
|
||||
Is it global UI state shared across unrelated components?
|
||||
→ Zustand store
|
||||
|
||||
Is it local to a single component or parent-child chain?
|
||||
→ useState / useReducer (local state)
|
||||
|
||||
Can it be computed from existing state/data?
|
||||
→ Derived state (compute inline — no separate store field)
|
||||
|
||||
Is it cross-cutting auth / session context accessed in non-React code?
|
||||
→ Zustand store read via getState() (not useStore hook)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## React Query — Server State
|
||||
|
||||
**Rule:** React Query owns all data that comes from a provider (mock or real).
|
||||
Never copy React Query data into a Zustand store.
|
||||
|
||||
### When to use
|
||||
|
||||
- Fetching lists or detail records (`useQuery`)
|
||||
- Creating, updating, deleting records (`useMutation`)
|
||||
- Anything that needs cache invalidation or background refetch
|
||||
|
||||
### Patterns
|
||||
|
||||
```ts
|
||||
// ✅ Correct — server data in React Query
|
||||
const { data: properties } = useProperties()
|
||||
|
||||
// ✅ Correct — mutation with cache invalidation
|
||||
const createProp = useCreateProperty()
|
||||
createProp.mutate(input, {
|
||||
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['properties'] })
|
||||
})
|
||||
|
||||
// ❌ Wrong — copying server data into a Zustand store
|
||||
const [properties, setProperties] = useState([])
|
||||
useEffect(() => { fetchProperties().then(setProperties) }, [])
|
||||
```
|
||||
|
||||
### staleTime constants
|
||||
|
||||
All stale times live in `src/lib/constants.ts` — never define them locally in hooks.
|
||||
|
||||
| Constant | Value | Used for |
|
||||
|----------|-------|---------|
|
||||
| `STALE_PROPERTIES` | 5 min | Property lists and details |
|
||||
| `STALE_MATCHES` | 2 min | Match results (change with need edits) |
|
||||
| `STALE_SIGNALS` | 5 min | Future availability signals |
|
||||
| `STALE_MARKET_SIGNALS` | 30 s | Market intelligence (ops team, real-time) |
|
||||
| `STALE_REVIEW_QUEUE` | 30 s | Review queue tasks (ops team, real-time) |
|
||||
|
||||
### Query key conventions
|
||||
|
||||
```ts
|
||||
['entity'] // list: ['properties'], ['matches'], ['reminders']
|
||||
['entity', id] // single: ['property', id], ['match', id]
|
||||
['entity', 'scope', id] // scoped: ['matches', 'need', needId]
|
||||
['entity', filters] // filtered: ['properties', { assetType: 'OFFICE' }]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Zustand — UI / Interaction State
|
||||
|
||||
**Rule:** Zustand owns UI state only. It must never hold data that belongs in React Query.
|
||||
|
||||
### When to use
|
||||
|
||||
- Multi-step wizard state (`offerWizardStore`)
|
||||
- Dialog open/close + pending item (`shortlistStore`, `pipelineStore`)
|
||||
- Sidebar / layout flags (`layoutStore`)
|
||||
- Auth session (`sessionStore` — special case, also read by services via `getState()`)
|
||||
- Toast queue (`toastStore`)
|
||||
- Active selection in a panel (`matchCenterStore`, `reminderStore`)
|
||||
|
||||
### When NOT to use
|
||||
|
||||
- Data fetched from a provider → use React Query
|
||||
- State used only inside one component → use `useState`
|
||||
- Values derived from existing state → compute inline
|
||||
|
||||
### Selector rules
|
||||
|
||||
Always use a selector. Subscribing to the full store causes re-renders on every state mutation.
|
||||
|
||||
```ts
|
||||
// ✅ Individual field selector — re-renders only when that field changes
|
||||
const isOpen = useLayoutStore(s => s.isRightPanelOpen)
|
||||
const close = useLayoutStore(s => s.closeRightPanel)
|
||||
|
||||
// ✅ useShallow for multiple fields from the same store
|
||||
import { useShallow } from 'zustand/react/shallow'
|
||||
const { filterType, filterStatus } = useReminderStore(
|
||||
useShallow(s => ({ filterType: s.filterType, filterStatus: s.filterStatus }))
|
||||
)
|
||||
|
||||
// ❌ No selector — subscribes to all store fields, re-renders on any change
|
||||
const { isOpen, close } = useLayoutStore()
|
||||
|
||||
// ✅ Non-React code (services, mutations) reads store via getState — no subscription
|
||||
const user = useSessionStore.getState().currentUser
|
||||
```
|
||||
|
||||
### Store inventory
|
||||
|
||||
| Store | Responsibility | Key state |
|
||||
|-------|---------------|-----------|
|
||||
| `layoutStore` | App shell layout | `activeWorkspace`, `sidebarCollapsed`, `isRightPanelOpen` |
|
||||
| `sessionStore` | Auth / current user | `currentUser`, `isAuthenticated`, `sessionStatus` |
|
||||
| `assistantStore` | AI drawer conversation | `isOpen`, `messages`, `context`, `isLoading` |
|
||||
| `compareStore` | Compare tray items | `compareItems[]` |
|
||||
| `pipelineStore` | Pipeline items + add-dialog | `items[]`, `dialogOpen`, `pendingItem` |
|
||||
| `shortlistStore` | Shortlist selection + add-dialog | `selectedShortlistId`, `dialogOpen`, `pendingItem` |
|
||||
| `offerWizardStore` | Multi-step offer wizard | `isOpen`, `currentStep`, `selectedPropertyIds`, `editableFields` |
|
||||
| `matchCenterStore` | Supply-side match center selection | `selectedPropertyId`, `selectedNeedId` |
|
||||
| `reminderStore` | Reminder list filters + drawer | `filterType`, `filterStatus`, `selectedId`, `drawerOpen` |
|
||||
| `toastStore` | Toast notification queue | `toasts[]` |
|
||||
|
||||
### Adding a new store field
|
||||
|
||||
Ask these questions first:
|
||||
1. Is this server data? → React Query instead.
|
||||
2. Is this only used in one component? → `useState` instead.
|
||||
3. Is this derived from existing state? → compute it, don't store it.
|
||||
|
||||
---
|
||||
|
||||
## Local State — Component-Scoped
|
||||
|
||||
**Rule:** Default to `useState`. Only escalate to Zustand when state genuinely needs to be shared across unrelated components.
|
||||
|
||||
### When to use
|
||||
|
||||
- Form input values
|
||||
- Toggle / accordion open state
|
||||
- Hover / focus effects
|
||||
- Step progress inside a self-contained wizard step
|
||||
- Any state that resets when the component unmounts
|
||||
|
||||
```ts
|
||||
// ✅ Local — form input, no other component needs this
|
||||
const [name, setName] = useState('')
|
||||
|
||||
// ✅ Local — dialog only opened from one place
|
||||
const [open, setOpen] = useState(false)
|
||||
|
||||
// ❌ Should be local — extracted to store unnecessarily
|
||||
// (e.g. a "confirmDialogOpen" only ever toggled from one parent)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Derived State — Compute, Don't Store
|
||||
|
||||
**Rule:** Never store a value that can be computed from existing state or query data. Compute it at render time.
|
||||
|
||||
```ts
|
||||
// ✅ Derived — compute from store
|
||||
const isFull = compareItems.length >= MAX_COMPARE_ITEMS // NOT stored
|
||||
|
||||
// ✅ Derived — compute from React Query data
|
||||
const overdueReminders = reminders.filter(r => isPastDue(r.dueDate)) // NOT stored
|
||||
|
||||
// ❌ Stored derived state — causes sync bugs
|
||||
const [overdueCount, setOverdueCount] = useState(0)
|
||||
useEffect(() => setOverdueCount(reminders.filter(...).length), [reminders])
|
||||
```
|
||||
|
||||
Exception: expensive computations (e.g. score calculation over thousands of items) may use `useMemo`.
|
||||
|
||||
---
|
||||
|
||||
## Context — When Neither React Query nor Zustand Fits
|
||||
|
||||
Use React Context for:
|
||||
- Dependency injection (swap provider implementations)
|
||||
- Tree-scoped state (e.g. a form context for nested inputs)
|
||||
- Auth abstraction (`AuthProvider` wraps `sessionStore` so components don't import the store directly)
|
||||
|
||||
Do NOT use Context as a replacement for React Query or Zustand — it causes cascading re-renders without cache or subscription granularity.
|
||||
|
||||
---
|
||||
|
||||
## Service / Non-React Code
|
||||
|
||||
Services must not import React hooks. They access Zustand state via `getState()`:
|
||||
|
||||
```ts
|
||||
// ✅ In a service — no hook, no subscription
|
||||
const user = useSessionStore.getState().currentUser
|
||||
|
||||
// ✅ In a React Query mutation onError
|
||||
onError: () => useToastStore.getState().showToast('Fehler aufgetreten', 'error')
|
||||
|
||||
// ❌ Services must never call useStore hooks
|
||||
import { useSessionStore } from '../stores/sessionStore'
|
||||
const { currentUser } = useSessionStore() // only valid inside a React component
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns to Avoid
|
||||
|
||||
| Anti-pattern | Why bad | Fix |
|
||||
|---|---|---|
|
||||
| `useStore()` without selector | Re-renders on every store mutation | Use `s => s.field` selector or `useShallow` |
|
||||
| Server data in Zustand | Duplicates cache, causes stale/sync bugs | React Query |
|
||||
| Derived state stored in state | Sync bugs, extra renders | Compute inline |
|
||||
| Local dialog state in global store | Bloats store, breaks encapsulation | `useState` |
|
||||
| Cross-store imports | Tight coupling, circular risk | Keep stores independent |
|
||||
| Hook-local `STALE_*` constants | Inconsistent cache behaviour | Use `src/lib/constants.ts` |
|
||||
@@ -6,9 +6,7 @@ import tseslint from 'typescript-eslint'
|
||||
import { defineConfig, globalIgnores } from 'eslint/config'
|
||||
|
||||
export default defineConfig([
|
||||
// `.claude/worktrees/` holds transient agent copies of src/ — linting them
|
||||
// produces thousands of duplicate parse errors and drowns out real findings.
|
||||
globalIgnores(['dist', '.claude/**']),
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
@@ -20,43 +18,5 @@ export default defineConfig([
|
||||
languageOptions: {
|
||||
globals: globals.browser,
|
||||
},
|
||||
rules: {
|
||||
// Der Unterstrich ist im Projekt die etablierte Kennzeichnung für
|
||||
// bewusst ungenutzte Parameter — etwa wenn eine Schnittstelle ein
|
||||
// Argument vorschreibt, das eine bestimmte Implementierung nicht
|
||||
// braucht. Ohne diese Ausnahme meldete die Regel genau die Fälle,
|
||||
// die der Autor bereits als «gewollt» markiert hat.
|
||||
'@typescript-eslint/no-unused-vars': ['error', {
|
||||
argsIgnorePattern: '^_',
|
||||
varsIgnorePattern: '^_',
|
||||
caughtErrorsIgnorePattern: '^_',
|
||||
destructuredArrayIgnorePattern: '^_',
|
||||
}],
|
||||
},
|
||||
},
|
||||
// ── Design Token Enforcement ────────────────────────────────────────────────
|
||||
// New hardcoded hex colors in components/pages are blocked (error).
|
||||
// Existing violations are tracked by: npm run check:tokens
|
||||
//
|
||||
// Use instead:
|
||||
// DS_TEXT.secondary, DS_SURFACE.success.bg (src/lib/ds.ts)
|
||||
// matchScoreHex(score), criterionScoreTextColor(score) (src/lib/utils.ts)
|
||||
// RESULT_TYPE_META[type].color (src/lib/ds.ts)
|
||||
// MUI theme tokens: "primary.main", "text.secondary"
|
||||
{
|
||||
files: ['src/components/**/*.{ts,tsx}', 'src/pages/**/*.{ts,tsx}'],
|
||||
rules: {
|
||||
'no-restricted-syntax': [
|
||||
'warn',
|
||||
{
|
||||
selector: [
|
||||
'Property[key.name=/^(bgcolor|color|borderColor|background|fill|stroke)$/]',
|
||||
' > Literal[value=/^#[0-9A-Fa-f]{3,8}$/]',
|
||||
].join(''),
|
||||
message:
|
||||
'No hardcoded hex colors in sx/style props. Use DS_TEXT, DS_SURFACE, DS_BORDER, DS_BG, BADGE_COLORS from src/lib/ds.ts, or helper functions from src/lib/utils.ts.',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
])
|
||||
|
||||
@@ -7,26 +7,17 @@
|
||||
"dev": "vite",
|
||||
"build": "tsc -b && vite build",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"test:coverage": "vitest run --coverage",
|
||||
"check:tokens": "node scripts/check-tokens.js"
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
"@mui/icons-material": "^9.0.1",
|
||||
"@mui/material": "^9.0.1",
|
||||
"@tanstack/react-query": "^5.75.2",
|
||||
"leaflet": "^1.9.4",
|
||||
"lucide-react": "^0.511.0",
|
||||
"react": "^19.2.6",
|
||||
"react-dom": "^19.2.6",
|
||||
"react-leaflet": "^5.0.0",
|
||||
"react-router": "^7.15.0",
|
||||
"zod": "^3.25.17",
|
||||
"zustand": "^5.0.5"
|
||||
@@ -34,24 +25,17 @@
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^10.0.1",
|
||||
"@tailwindcss/vite": "^4.3.0",
|
||||
"@testing-library/jest-dom": "^6.9.1",
|
||||
"@testing-library/react": "^16.3.2",
|
||||
"@types/leaflet": "^1.9.21",
|
||||
"@types/node": "^24.12.3",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@vitejs/plugin-react": "^6.0.1",
|
||||
"@vitest/coverage-v8": "^4.1.7",
|
||||
"eslint": "^10.3.0",
|
||||
"eslint-plugin-react-hooks": "^7.1.1",
|
||||
"eslint-plugin-react-refresh": "^0.5.2",
|
||||
"globals": "^17.6.0",
|
||||
"jsdom": "^29.1.1",
|
||||
"playwright": "^1.61.0",
|
||||
"tailwindcss": "^4.3.0",
|
||||
"typescript": "~6.0.2",
|
||||
"typescript-eslint": "^8.59.2",
|
||||
"vite": "^8.0.12",
|
||||
"vitest": "^4.1.7"
|
||||
"vite": "^8.0.12"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* check-tokens.js
|
||||
*
|
||||
* Counts hardcoded hex color literals in sx props / color attributes
|
||||
* across src/components and src/pages. Fails (exit 1) if count exceeds THRESHOLD.
|
||||
*
|
||||
* Usage:
|
||||
* node scripts/check-tokens.js — report + fail if > threshold
|
||||
* node scripts/check-tokens.js --report — report only, always exits 0
|
||||
*
|
||||
* Run via: npm run check:tokens
|
||||
*/
|
||||
|
||||
import { readdirSync, readFileSync, statSync } from 'node:fs'
|
||||
import { join, extname } from 'node:path'
|
||||
|
||||
// Hex literals allowed before CI blocks the build.
|
||||
// This is a ratchet — lower it as migration progresses. Never raise it.
|
||||
// Baseline after initial token migration (2026-05-24): 1958
|
||||
// Nach der Token-Migration aller Farb-Properties (bgcolor/color/borderColor/
|
||||
// background/fill/stroke): 925. Die verbleibenden Treffer stehen in
|
||||
// Farbverläufen, `rgba()`-Werten, Icon-Attributen und Datentabellen, die diese
|
||||
// Zählung mitnimmt, die ESLint-Regel aber nicht erfasst.
|
||||
const THRESHOLD = 925
|
||||
|
||||
const HEX_PATTERN = /#[0-9A-Fa-f]{3,8}\b/g
|
||||
|
||||
const SEARCH_DIRS = ['src/components', 'src/pages']
|
||||
|
||||
function walk(dir) {
|
||||
const files = []
|
||||
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
||||
const full = join(dir, entry.name)
|
||||
if (entry.isDirectory()) files.push(...walk(full))
|
||||
else if (entry.isFile() && ['.ts', '.tsx'].includes(extname(entry.name))) files.push(full)
|
||||
}
|
||||
return files
|
||||
}
|
||||
|
||||
const reportOnly = process.argv.includes('--report')
|
||||
const cwd = process.cwd()
|
||||
|
||||
let totalViolations = 0
|
||||
const fileViolations = []
|
||||
|
||||
for (const searchDir of SEARCH_DIRS) {
|
||||
const dir = join(cwd, searchDir)
|
||||
for (const file of walk(dir)) {
|
||||
const content = readFileSync(file, 'utf8')
|
||||
const matches = content.match(HEX_PATTERN)
|
||||
if (matches && matches.length > 0) {
|
||||
totalViolations += matches.length
|
||||
fileViolations.push({ file: file.replace(cwd + '\\', '').replace(cwd + '/', ''), count: matches.length })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fileViolations.sort((a, b) => b.count - a.count)
|
||||
|
||||
console.log('\n── Token Compliance Check ───────────────────────────────────────────')
|
||||
console.log(`Total hex violations: ${totalViolations} (threshold: ${THRESHOLD})`)
|
||||
console.log(`Status: ${totalViolations <= THRESHOLD ? '✅ PASS' : '❌ FAIL'}`)
|
||||
console.log('\nTop 15 offenders:')
|
||||
fileViolations.slice(0, 15).forEach(({ file, count }) => {
|
||||
console.log(` ${count.toString().padStart(3)} ${file}`)
|
||||
})
|
||||
console.log('─────────────────────────────────────────────────────────────────────\n')
|
||||
|
||||
if (!reportOnly && totalViolations > THRESHOLD) {
|
||||
console.error(`Error: ${totalViolations} hex violations exceed threshold of ${THRESHOLD}.`)
|
||||
console.error('Run `node scripts/check-tokens.js --report` to see the full list.')
|
||||
process.exit(1)
|
||||
}
|
||||
@@ -5,39 +5,40 @@ import { AppShell } from './components/layout'
|
||||
import { ProtectedRoute } from './components/auth'
|
||||
import { WorkspaceType } from './domain/enums'
|
||||
import { useSessionStore } from './stores/sessionStore'
|
||||
import { AGENT_SECTIONS, AGENT_SECTION_PARAM, ROUTES } from './lib/constants'
|
||||
|
||||
// Die Flächensuche ist entfernt — es bleibt ein einziger erreichbarer Einstieg.
|
||||
// Seit Runde 5 ist das die Startseite; die frühere «Übersicht» existiert nicht mehr.
|
||||
const WORKSPACE_HOME: Record<string, string> = {
|
||||
[WorkspaceType.SUPPLY]: ROUTES.SUPPLY.PROPERTIES,
|
||||
[WorkspaceType.SUPPLY]: '/supply/dashboard',
|
||||
[WorkspaceType.DEMAND]: '/demand/ai-search',
|
||||
[WorkspaceType.OPERATIONS]: '/ops/review-queue',
|
||||
}
|
||||
|
||||
function RoleRedirect() {
|
||||
const currentUser = useSessionStore(s => s.currentUser)
|
||||
const { currentUser } = useSessionStore()
|
||||
const first = currentUser?.allowedWorkspaces[0] ?? WorkspaceType.SUPPLY
|
||||
return <Navigate to={WORKSPACE_HOME[first] ?? ROUTES.SUPPLY.PROPERTIES} replace />
|
||||
return <Navigate to={WORKSPACE_HOME[first] ?? '/supply/dashboard'} replace />
|
||||
}
|
||||
|
||||
const LoginScreen = lazy(() => import('./pages/auth/LoginScreen'))
|
||||
|
||||
const SupplyDashboard = lazy(() => import('./pages/supply/SupplyDashboard'))
|
||||
const Properties = lazy(() => import('./pages/supply/Properties'))
|
||||
const MatchCenter = lazy(() => import('./pages/supply/MatchCenter'))
|
||||
const FutureAvailability = lazy(() => import('./pages/supply/FutureAvailability'))
|
||||
const DataQuality = lazy(() => import('./pages/supply/DataQuality'))
|
||||
const ReminderManager = lazy(() => import('./pages/supply/ReminderManager'))
|
||||
const MarketIntelligence = lazy(() => import('./pages/supply/MarketIntelligence'))
|
||||
const NewListing = lazy(() => import('./pages/supply/NewListing'))
|
||||
const MyListings = lazy(() => import('./pages/supply/MyListings'))
|
||||
const Besichtigungen = lazy(() => import('./pages/supply/Besichtigungen'))
|
||||
|
||||
// Property On — «Meine Agenten»
|
||||
const MeineAgenten = lazy(() => import('./pages/supply/MeineAgenten'))
|
||||
const AISearch = lazy(() => import('./pages/demand/AISearch'))
|
||||
const Results = lazy(() => import('./pages/demand/Results'))
|
||||
const MatchDetail = lazy(() => import('./pages/demand/MatchDetail'))
|
||||
const Compare = lazy(() => import('./pages/demand/Compare'))
|
||||
const Shortlists = lazy(() => import('./pages/demand/Shortlists'))
|
||||
|
||||
/** Alter Unterseitenpfad → Reiter der Hauptseite. Hält Lesezeichen am Leben. */
|
||||
function TeamSectionRedirect({ section }: { section: string }) {
|
||||
return <Navigate to={`${ROUTES.SUPPLY.TEAM}?${AGENT_SECTION_PARAM}=${section}`} replace />
|
||||
}
|
||||
const ReviewQueue = lazy(() => import('./pages/ops/ReviewQueue'))
|
||||
const AIMonitoring = lazy(() => import('./pages/ops/AIMonitoring'))
|
||||
const Governance = lazy(() => import('./pages/ops/Governance'))
|
||||
const MarketIntelligence = lazy(() => import('./pages/ops/MarketIntelligence'))
|
||||
const SourceMonitoring = lazy(() => import('./pages/ops/SourceMonitoring'))
|
||||
const ActivityTimeline = lazy(() => import('./pages/ops/ActivityTimeline'))
|
||||
const SignalPipeline = lazy(() => import('./pages/ops/SignalPipeline'))
|
||||
|
||||
function App() {
|
||||
return (
|
||||
@@ -54,43 +55,31 @@ function App() {
|
||||
|
||||
{/* Supply Workspace */}
|
||||
<Route element={<ProtectedRoute workspace={WorkspaceType.SUPPLY} />}>
|
||||
{/* Runde 5, §2.1: Die Hauptseite «Übersicht» ist entfernt. Der
|
||||
alte Pfad bleibt als Umleitung bestehen, damit Lesezeichen
|
||||
und Deep Links auf der Startseite landen statt im Nichts. */}
|
||||
<Route
|
||||
path={ROUTES.SUPPLY.LEGACY_DASHBOARD}
|
||||
element={<Navigate to={ROUTES.SUPPLY.PROPERTIES} replace />}
|
||||
/>
|
||||
<Route path="/supply/dashboard" element={<SupplyDashboard />} />
|
||||
<Route path="/supply/properties" element={<Properties />} />
|
||||
{/* Objekt-Detailroute — Ziel aller Objektlinks der Agentenseiten. */}
|
||||
<Route path="/supply/properties/:propertyId" element={<Properties />} />
|
||||
<Route path="/supply/match-center" element={<MatchCenter />} />
|
||||
<Route path="/supply/future-availability" element={<FutureAvailability />} />
|
||||
<Route path="/supply/new-listing" element={<NewListing />} />
|
||||
|
||||
{/* Die fünf Agentenseiten. Vier behalten den Pfad ihres Vorgängers. */}
|
||||
<Route path="/supply/reminder-manager" element={<ReminderManager />} />
|
||||
<Route path="/supply/besichtigungen" element={<Besichtigungen />} />
|
||||
<Route path="/supply/my-listings" element={<MyListings />} />
|
||||
<Route path="/supply/market-intelligence" element={<MarketIntelligence />} />
|
||||
<Route path="/supply/data-quality" element={<DataQuality />} />
|
||||
</Route>
|
||||
|
||||
{/* Property On — «Meine Agenten». Die drei Verwaltungsbereiche sind
|
||||
seit Runde 4 Reiter derselben Seite; die alten Unterseitenpfade
|
||||
leiten dorthin um, damit bestehende Lesezeichen nicht brechen. */}
|
||||
<Route path="/supply/team" element={<MeineAgenten />} />
|
||||
<Route
|
||||
path="/supply/team/personalverwaltung/*"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.PERSONNEL} />}
|
||||
/>
|
||||
<Route
|
||||
path="/supply/team/bearbeitungsverlauf/*"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.HISTORY} />}
|
||||
/>
|
||||
<Route
|
||||
path="/supply/team/kanaele-systeme"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.CHANNELS} />}
|
||||
/>
|
||||
{/* Demand Workspace */}
|
||||
<Route element={<ProtectedRoute workspace={WorkspaceType.DEMAND} />}>
|
||||
<Route path="/demand/ai-search" element={<AISearch />} />
|
||||
<Route path="/demand/results" element={<Results />} />
|
||||
<Route path="/demand/results/:matchId" element={<MatchDetail />} />
|
||||
<Route path="/demand/compare" element={<Compare />} />
|
||||
<Route path="/demand/shortlists" element={<Shortlists />} />
|
||||
</Route>
|
||||
|
||||
{/* Operations Workspace */}
|
||||
<Route element={<ProtectedRoute workspace={WorkspaceType.OPERATIONS} />}>
|
||||
<Route path="/ops/review-queue" element={<ReviewQueue />} />
|
||||
<Route path="/ops/ai-monitoring" element={<AIMonitoring />} />
|
||||
<Route path="/ops/governance" element={<Governance />} />
|
||||
<Route path="/ops/market-intelligence" element={<MarketIntelligence />} />
|
||||
<Route path="/ops/source-monitoring" element={<SourceMonitoring />} />
|
||||
<Route path="/ops/activity-timeline" element={<ActivityTimeline />} />
|
||||
<Route path="/ops/signal-pipeline" element={<SignalPipeline />} />
|
||||
</Route>
|
||||
</Route>
|
||||
</Route>
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="30" y="44" width="61" height="30" fill="#dfe3e1"/><rect x="177" y="146" width="86" height="39" fill="#dfe3e1"/><rect x="407" y="100" width="50" height="34" fill="#dfe3e1"/><rect x="240" y="85" width="41" height="50" fill="#dfe3e1"/><rect x="18" y="189" width="57" height="54" fill="#dfe3e1"/><rect x="413" y="119" width="40" height="57" fill="#dfe3e1"/><rect x="490" y="77" width="53" height="43" fill="#dfe3e1"/><rect x="114" y="140" width="65" height="33" fill="#dfe3e1"/><rect x="276" y="106" width="70" height="47" fill="#dfe3e1"/><rect x="413" y="205" width="40" height="53" fill="#dfe3e1"/><rect x="342" y="96" width="71" height="53" fill="#dfe3e1"/><rect x="348" y="221" width="68" height="62" fill="#dfe3e1"/><rect x="57" y="158" width="53" height="45" fill="#dfe3e1"/><rect x="212" y="22" width="44" height="64" fill="#dfe3e1"/><rect x="0" y="113" width="600" height="9" fill="#ffffff"/><rect x="0" y="91" width="600" height="8" fill="#ffffff"/><rect x="0" y="155" width="600" height="12" fill="#ffffff"/><rect x="0" y="201" width="600" height="7" fill="#ffffff"/><rect x="421" y="0" width="9" height="300" fill="#ffffff"/><rect x="242" y="0" width="7" height="300" fill="#ffffff"/><rect x="52" y="0" width="11" height="300" fill="#ffffff"/><rect x="155" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="159" y="75" width="42" height="57" fill="#dfe3e1"/><rect x="196" y="88" width="78" height="46" fill="#dfe3e1"/><rect x="379" y="178" width="60" height="64" fill="#dfe3e1"/><rect x="413" y="74" width="59" height="33" fill="#dfe3e1"/><rect x="119" y="102" width="75" height="34" fill="#dfe3e1"/><rect x="168" y="162" width="71" height="47" fill="#dfe3e1"/><rect x="328" y="229" width="65" height="66" fill="#dfe3e1"/><rect x="356" y="153" width="45" height="34" fill="#dfe3e1"/><rect x="122" y="220" width="69" height="54" fill="#dfe3e1"/><rect x="205" y="202" width="74" height="39" fill="#dfe3e1"/><rect x="22" y="134" width="84" height="36" fill="#dfe3e1"/><rect x="266" y="150" width="45" height="42" fill="#dfe3e1"/><rect x="410" y="47" width="73" height="56" fill="#dfe3e1"/><rect x="215" y="64" width="73" height="33" fill="#dfe3e1"/><rect x="0" y="52" width="600" height="10" fill="#ffffff"/><rect x="0" y="73" width="600" height="10" fill="#ffffff"/><rect x="0" y="274" width="600" height="9" fill="#ffffff"/><rect x="0" y="279" width="600" height="8" fill="#ffffff"/><rect x="54" y="0" width="8" height="300" fill="#ffffff"/><rect x="383" y="0" width="10" height="300" fill="#ffffff"/><rect x="120" y="0" width="13" height="300" fill="#ffffff"/><rect x="267" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="249" width="600" height="300" fill="#c8d9e4"/><rect x="131" y="204" width="47" height="45" fill="#dfe3e1"/><rect x="379" y="186" width="55" height="53" fill="#dfe3e1"/><rect x="235" y="112" width="61" height="59" fill="#dfe3e1"/><rect x="241" y="178" width="53" height="48" fill="#dfe3e1"/><rect x="153" y="87" width="70" height="49" fill="#dfe3e1"/><rect x="405" y="140" width="42" height="44" fill="#dfe3e1"/><rect x="253" y="68" width="86" height="30" fill="#dfe3e1"/><rect x="507" y="227" width="72" height="56" fill="#dfe3e1"/><rect x="111" y="43" width="76" height="32" fill="#dfe3e1"/><rect x="215" y="41" width="46" height="36" fill="#dfe3e1"/><rect x="356" y="109" width="86" height="58" fill="#dfe3e1"/><rect x="128" y="154" width="78" height="57" fill="#dfe3e1"/><rect x="312" y="143" width="87" height="49" fill="#dfe3e1"/><rect x="465" y="185" width="49" height="47" fill="#dfe3e1"/><rect x="0" y="49" width="600" height="13" fill="#ffffff"/><rect x="0" y="164" width="600" height="9" fill="#ffffff"/><rect x="0" y="135" width="600" height="10" fill="#ffffff"/><rect x="0" y="125" width="600" height="9" fill="#ffffff"/><rect x="399" y="0" width="13" height="300" fill="#ffffff"/><rect x="450" y="0" width="12" height="300" fill="#ffffff"/><rect x="515" y="0" width="13" height="300" fill="#ffffff"/><rect x="549" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="461" y="45" width="81" height="62" fill="#dfe3e1"/><rect x="293" y="91" width="84" height="49" fill="#dfe3e1"/><rect x="378" y="85" width="80" height="62" fill="#dfe3e1"/><rect x="251" y="212" width="79" height="34" fill="#dfe3e1"/><rect x="415" y="185" width="82" height="57" fill="#dfe3e1"/><rect x="351" y="181" width="66" height="39" fill="#dfe3e1"/><rect x="404" y="79" width="55" height="55" fill="#dfe3e1"/><rect x="423" y="52" width="74" height="46" fill="#dfe3e1"/><rect x="247" y="52" width="48" height="48" fill="#dfe3e1"/><rect x="15" y="80" width="73" height="60" fill="#dfe3e1"/><rect x="251" y="14" width="43" height="47" fill="#dfe3e1"/><rect x="342" y="6" width="77" height="56" fill="#dfe3e1"/><rect x="363" y="59" width="63" height="52" fill="#dfe3e1"/><rect x="46" y="226" width="76" height="65" fill="#dfe3e1"/><rect x="0" y="170" width="600" height="10" fill="#ffffff"/><rect x="0" y="33" width="600" height="13" fill="#ffffff"/><rect x="0" y="102" width="600" height="9" fill="#ffffff"/><rect x="0" y="27" width="600" height="9" fill="#ffffff"/><rect x="335" y="0" width="13" height="300" fill="#ffffff"/><rect x="155" y="0" width="11" height="300" fill="#ffffff"/><rect x="241" y="0" width="9" height="300" fill="#ffffff"/><rect x="30" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="197" width="600" height="300" fill="#c8d9e4"/><rect x="252" y="201" width="72" height="31" fill="#dfe3e1"/><rect x="492" y="195" width="52" height="33" fill="#dfe3e1"/><rect x="3" y="49" width="82" height="43" fill="#dfe3e1"/><rect x="108" y="179" width="44" height="42" fill="#dfe3e1"/><rect x="137" y="93" width="49" height="46" fill="#dfe3e1"/><rect x="205" y="202" width="58" height="31" fill="#dfe3e1"/><rect x="13" y="167" width="40" height="44" fill="#dfe3e1"/><rect x="199" y="201" width="63" height="64" fill="#dfe3e1"/><rect x="404" y="139" width="50" height="55" fill="#dfe3e1"/><rect x="492" y="3" width="68" height="66" fill="#dfe3e1"/><rect x="508" y="44" width="80" height="66" fill="#dfe3e1"/><rect x="364" y="38" width="78" height="48" fill="#dfe3e1"/><rect x="328" y="225" width="57" height="33" fill="#dfe3e1"/><rect x="226" y="13" width="83" height="49" fill="#dfe3e1"/><rect x="0" y="37" width="600" height="11" fill="#ffffff"/><rect x="0" y="257" width="600" height="8" fill="#ffffff"/><rect x="0" y="104" width="600" height="11" fill="#ffffff"/><rect x="0" y="122" width="600" height="10" fill="#ffffff"/><rect x="147" y="0" width="11" height="300" fill="#ffffff"/><rect x="296" y="0" width="10" height="300" fill="#ffffff"/><rect x="306" y="0" width="12" height="300" fill="#ffffff"/><rect x="104" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="198" width="600" height="300" fill="#c8d9e4"/><rect x="457" y="110" width="56" height="66" fill="#dfe3e1"/><rect x="288" y="109" width="86" height="57" fill="#dfe3e1"/><rect x="408" y="82" width="70" height="43" fill="#dfe3e1"/><rect x="262" y="51" width="79" height="59" fill="#dfe3e1"/><rect x="177" y="82" width="52" height="34" fill="#dfe3e1"/><rect x="444" y="228" width="68" height="53" fill="#dfe3e1"/><rect x="193" y="185" width="58" height="32" fill="#dfe3e1"/><rect x="95" y="163" width="59" height="65" fill="#dfe3e1"/><rect x="429" y="61" width="63" height="59" fill="#dfe3e1"/><rect x="105" y="69" width="44" height="32" fill="#dfe3e1"/><rect x="506" y="56" width="82" height="64" fill="#dfe3e1"/><rect x="467" y="223" width="75" height="41" fill="#dfe3e1"/><rect x="167" y="13" width="50" height="33" fill="#dfe3e1"/><rect x="8" y="159" width="71" height="40" fill="#dfe3e1"/><rect x="0" y="92" width="600" height="9" fill="#ffffff"/><rect x="0" y="221" width="600" height="8" fill="#ffffff"/><rect x="0" y="76" width="600" height="10" fill="#ffffff"/><rect x="0" y="204" width="600" height="7" fill="#ffffff"/><rect x="193" y="0" width="13" height="300" fill="#ffffff"/><rect x="285" y="0" width="8" height="300" fill="#ffffff"/><rect x="438" y="0" width="7" height="300" fill="#ffffff"/><rect x="397" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="417" y="225" width="78" height="39" fill="#dfe3e1"/><rect x="500" y="72" width="75" height="49" fill="#dfe3e1"/><rect x="283" y="103" width="51" height="60" fill="#dfe3e1"/><rect x="56" y="132" width="73" height="32" fill="#dfe3e1"/><rect x="18" y="90" width="44" height="49" fill="#dfe3e1"/><rect x="421" y="201" width="45" height="62" fill="#dfe3e1"/><rect x="477" y="24" width="68" height="32" fill="#dfe3e1"/><rect x="81" y="138" width="85" height="55" fill="#dfe3e1"/><rect x="23" y="162" width="43" height="57" fill="#dfe3e1"/><rect x="472" y="195" width="79" height="38" fill="#dfe3e1"/><rect x="123" y="7" width="42" height="39" fill="#dfe3e1"/><rect x="504" y="9" width="86" height="41" fill="#dfe3e1"/><rect x="319" y="220" width="83" height="44" fill="#dfe3e1"/><rect x="65" y="205" width="51" height="37" fill="#dfe3e1"/><rect x="0" y="240" width="600" height="8" fill="#ffffff"/><rect x="0" y="262" width="600" height="7" fill="#ffffff"/><rect x="0" y="132" width="600" height="7" fill="#ffffff"/><rect x="0" y="239" width="600" height="10" fill="#ffffff"/><rect x="304" y="0" width="13" height="300" fill="#ffffff"/><rect x="357" y="0" width="9" height="300" fill="#ffffff"/><rect x="186" y="0" width="7" height="300" fill="#ffffff"/><rect x="444" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="233" y="0" width="88" height="55" fill="#dfe3e1"/><rect x="434" y="22" width="74" height="30" fill="#dfe3e1"/><rect x="77" y="64" width="75" height="57" fill="#dfe3e1"/><rect x="480" y="84" width="83" height="33" fill="#dfe3e1"/><rect x="51" y="112" width="78" height="60" fill="#dfe3e1"/><rect x="338" y="155" width="62" height="32" fill="#dfe3e1"/><rect x="295" y="197" width="76" height="39" fill="#dfe3e1"/><rect x="507" y="125" width="65" height="59" fill="#dfe3e1"/><rect x="236" y="39" width="46" height="46" fill="#dfe3e1"/><rect x="170" y="185" width="56" height="55" fill="#dfe3e1"/><rect x="419" y="49" width="80" height="65" fill="#dfe3e1"/><rect x="451" y="143" width="65" height="41" fill="#dfe3e1"/><rect x="221" y="77" width="44" height="43" fill="#dfe3e1"/><rect x="453" y="24" width="82" height="60" fill="#dfe3e1"/><rect x="0" y="205" width="600" height="11" fill="#ffffff"/><rect x="0" y="152" width="600" height="11" fill="#ffffff"/><rect x="0" y="167" width="600" height="10" fill="#ffffff"/><rect x="0" y="79" width="600" height="10" fill="#ffffff"/><rect x="282" y="0" width="8" height="300" fill="#ffffff"/><rect x="181" y="0" width="9" height="300" fill="#ffffff"/><rect x="263" y="0" width="9" height="300" fill="#ffffff"/><rect x="465" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="302" y="44" width="45" height="42" fill="#dfe3e1"/><rect x="172" y="89" width="55" height="60" fill="#dfe3e1"/><rect x="138" y="150" width="76" height="43" fill="#dfe3e1"/><rect x="383" y="149" width="63" height="48" fill="#dfe3e1"/><rect x="337" y="174" width="76" height="36" fill="#dfe3e1"/><rect x="423" y="129" width="59" height="43" fill="#dfe3e1"/><rect x="12" y="84" width="53" height="62" fill="#dfe3e1"/><rect x="325" y="182" width="71" height="47" fill="#dfe3e1"/><rect x="480" y="51" width="67" height="41" fill="#dfe3e1"/><rect x="245" y="216" width="65" height="55" fill="#dfe3e1"/><rect x="77" y="89" width="84" height="58" fill="#dfe3e1"/><rect x="35" y="15" width="53" height="52" fill="#dfe3e1"/><rect x="419" y="14" width="45" height="63" fill="#dfe3e1"/><rect x="437" y="103" width="49" height="38" fill="#dfe3e1"/><rect x="0" y="225" width="600" height="7" fill="#ffffff"/><rect x="0" y="159" width="600" height="8" fill="#ffffff"/><rect x="0" y="52" width="600" height="7" fill="#ffffff"/><rect x="0" y="241" width="600" height="11" fill="#ffffff"/><rect x="495" y="0" width="9" height="300" fill="#ffffff"/><rect x="506" y="0" width="9" height="300" fill="#ffffff"/><rect x="466" y="0" width="11" height="300" fill="#ffffff"/><rect x="381" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="472" y="45" width="61" height="42" fill="#dfe3e1"/><rect x="96" y="67" width="58" height="32" fill="#dfe3e1"/><rect x="366" y="48" width="66" height="43" fill="#dfe3e1"/><rect x="163" y="203" width="41" height="37" fill="#dfe3e1"/><rect x="450" y="123" width="62" height="41" fill="#dfe3e1"/><rect x="188" y="43" width="75" height="34" fill="#dfe3e1"/><rect x="283" y="79" width="79" height="61" fill="#dfe3e1"/><rect x="296" y="206" width="54" height="41" fill="#dfe3e1"/><rect x="307" y="91" width="85" height="49" fill="#dfe3e1"/><rect x="52" y="196" width="76" height="38" fill="#dfe3e1"/><rect x="509" y="230" width="55" height="30" fill="#dfe3e1"/><rect x="364" y="222" width="59" height="40" fill="#dfe3e1"/><rect x="45" y="156" width="74" height="50" fill="#dfe3e1"/><rect x="55" y="224" width="79" height="32" fill="#dfe3e1"/><rect x="0" y="67" width="600" height="11" fill="#ffffff"/><rect x="0" y="210" width="600" height="10" fill="#ffffff"/><rect x="0" y="45" width="600" height="9" fill="#ffffff"/><rect x="0" y="237" width="600" height="12" fill="#ffffff"/><rect x="23" y="0" width="9" height="300" fill="#ffffff"/><rect x="229" y="0" width="11" height="300" fill="#ffffff"/><rect x="392" y="0" width="9" height="300" fill="#ffffff"/><rect x="199" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="234" width="600" height="300" fill="#c8d9e4"/><rect x="6" y="70" width="76" height="55" fill="#dfe3e1"/><rect x="213" y="96" width="78" height="66" fill="#dfe3e1"/><rect x="169" y="31" width="78" height="60" fill="#dfe3e1"/><rect x="59" y="54" width="59" height="63" fill="#dfe3e1"/><rect x="472" y="64" width="75" height="49" fill="#dfe3e1"/><rect x="304" y="178" width="55" height="41" fill="#dfe3e1"/><rect x="267" y="199" width="80" height="57" fill="#dfe3e1"/><rect x="34" y="133" width="82" height="52" fill="#dfe3e1"/><rect x="371" y="90" width="62" height="34" fill="#dfe3e1"/><rect x="188" y="45" width="85" height="38" fill="#dfe3e1"/><rect x="508" y="87" width="81" height="34" fill="#dfe3e1"/><rect x="316" y="76" width="83" height="56" fill="#dfe3e1"/><rect x="419" y="64" width="58" height="50" fill="#dfe3e1"/><rect x="236" y="220" width="60" height="37" fill="#dfe3e1"/><rect x="0" y="163" width="600" height="13" fill="#ffffff"/><rect x="0" y="103" width="600" height="7" fill="#ffffff"/><rect x="0" y="117" width="600" height="12" fill="#ffffff"/><rect x="0" y="67" width="600" height="9" fill="#ffffff"/><rect x="438" y="0" width="11" height="300" fill="#ffffff"/><rect x="165" y="0" width="7" height="300" fill="#ffffff"/><rect x="482" y="0" width="8" height="300" fill="#ffffff"/><rect x="46" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="341" y="112" width="87" height="34" fill="#dfe3e1"/><rect x="470" y="23" width="43" height="55" fill="#dfe3e1"/><rect x="301" y="39" width="80" height="33" fill="#dfe3e1"/><rect x="228" y="82" width="45" height="33" fill="#dfe3e1"/><rect x="4" y="97" width="75" height="57" fill="#dfe3e1"/><rect x="427" y="222" width="49" height="66" fill="#dfe3e1"/><rect x="445" y="108" width="79" height="31" fill="#dfe3e1"/><rect x="285" y="160" width="48" height="56" fill="#dfe3e1"/><rect x="502" y="96" width="44" height="60" fill="#dfe3e1"/><rect x="156" y="222" width="61" height="46" fill="#dfe3e1"/><rect x="69" y="148" width="60" height="41" fill="#dfe3e1"/><rect x="55" y="87" width="56" height="40" fill="#dfe3e1"/><rect x="449" y="39" width="78" height="66" fill="#dfe3e1"/><rect x="475" y="43" width="41" height="46" fill="#dfe3e1"/><rect x="0" y="145" width="600" height="7" fill="#ffffff"/><rect x="0" y="103" width="600" height="13" fill="#ffffff"/><rect x="0" y="86" width="600" height="8" fill="#ffffff"/><rect x="0" y="132" width="600" height="12" fill="#ffffff"/><rect x="79" y="0" width="9" height="300" fill="#ffffff"/><rect x="46" y="0" width="7" height="300" fill="#ffffff"/><rect x="429" y="0" width="8" height="300" fill="#ffffff"/><rect x="151" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="220" width="600" height="300" fill="#c8d9e4"/><rect x="322" y="163" width="86" height="31" fill="#dfe3e1"/><rect x="312" y="50" width="70" height="37" fill="#dfe3e1"/><rect x="405" y="113" width="40" height="34" fill="#dfe3e1"/><rect x="240" y="15" width="63" height="42" fill="#dfe3e1"/><rect x="489" y="105" width="53" height="54" fill="#dfe3e1"/><rect x="504" y="44" width="75" height="58" fill="#dfe3e1"/><rect x="445" y="113" width="70" height="49" fill="#dfe3e1"/><rect x="33" y="101" width="84" height="49" fill="#dfe3e1"/><rect x="341" y="137" width="48" height="49" fill="#dfe3e1"/><rect x="211" y="204" width="61" height="61" fill="#dfe3e1"/><rect x="212" y="160" width="59" height="43" fill="#dfe3e1"/><rect x="369" y="150" width="52" height="61" fill="#dfe3e1"/><rect x="348" y="107" width="82" height="58" fill="#dfe3e1"/><rect x="333" y="135" width="75" height="46" fill="#dfe3e1"/><rect x="0" y="223" width="600" height="10" fill="#ffffff"/><rect x="0" y="71" width="600" height="13" fill="#ffffff"/><rect x="0" y="220" width="600" height="7" fill="#ffffff"/><rect x="0" y="174" width="600" height="12" fill="#ffffff"/><rect x="356" y="0" width="13" height="300" fill="#ffffff"/><rect x="364" y="0" width="7" height="300" fill="#ffffff"/><rect x="147" y="0" width="7" height="300" fill="#ffffff"/><rect x="518" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="201" y="96" width="85" height="35" fill="#dfe3e1"/><rect x="301" y="59" width="76" height="38" fill="#dfe3e1"/><rect x="408" y="175" width="67" height="64" fill="#dfe3e1"/><rect x="289" y="86" width="65" height="43" fill="#dfe3e1"/><rect x="501" y="88" width="73" height="46" fill="#dfe3e1"/><rect x="30" y="62" width="57" height="44" fill="#dfe3e1"/><rect x="428" y="205" width="69" height="42" fill="#dfe3e1"/><rect x="76" y="163" width="57" height="58" fill="#dfe3e1"/><rect x="94" y="151" width="61" height="49" fill="#dfe3e1"/><rect x="232" y="163" width="52" height="43" fill="#dfe3e1"/><rect x="16" y="41" width="84" height="57" fill="#dfe3e1"/><rect x="490" y="124" width="67" height="32" fill="#dfe3e1"/><rect x="22" y="74" width="76" height="46" fill="#dfe3e1"/><rect x="282" y="230" width="64" height="66" fill="#dfe3e1"/><rect x="0" y="38" width="600" height="13" fill="#ffffff"/><rect x="0" y="280" width="600" height="8" fill="#ffffff"/><rect x="0" y="233" width="600" height="8" fill="#ffffff"/><rect x="0" y="203" width="600" height="8" fill="#ffffff"/><rect x="308" y="0" width="10" height="300" fill="#ffffff"/><rect x="443" y="0" width="13" height="300" fill="#ffffff"/><rect x="183" y="0" width="10" height="300" fill="#ffffff"/><rect x="261" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="240" width="600" height="300" fill="#c8d9e4"/><rect x="372" y="115" width="75" height="45" fill="#dfe3e1"/><rect x="74" y="194" width="72" height="58" fill="#dfe3e1"/><rect x="306" y="121" width="74" height="49" fill="#dfe3e1"/><rect x="200" y="108" width="42" height="56" fill="#dfe3e1"/><rect x="110" y="75" width="57" height="51" fill="#dfe3e1"/><rect x="81" y="101" width="53" height="45" fill="#dfe3e1"/><rect x="268" y="66" width="61" height="63" fill="#dfe3e1"/><rect x="471" y="56" width="75" height="36" fill="#dfe3e1"/><rect x="7" y="24" width="43" height="58" fill="#dfe3e1"/><rect x="173" y="22" width="85" height="30" fill="#dfe3e1"/><rect x="219" y="67" width="88" height="32" fill="#dfe3e1"/><rect x="73" y="23" width="40" height="39" fill="#dfe3e1"/><rect x="364" y="184" width="72" height="42" fill="#dfe3e1"/><rect x="142" y="188" width="80" height="40" fill="#dfe3e1"/><rect x="0" y="256" width="600" height="12" fill="#ffffff"/><rect x="0" y="174" width="600" height="13" fill="#ffffff"/><rect x="0" y="57" width="600" height="13" fill="#ffffff"/><rect x="0" y="208" width="600" height="8" fill="#ffffff"/><rect x="149" y="0" width="9" height="300" fill="#ffffff"/><rect x="211" y="0" width="11" height="300" fill="#ffffff"/><rect x="231" y="0" width="8" height="300" fill="#ffffff"/><rect x="29" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="56" y="24" width="50" height="49" fill="#dfe3e1"/><rect x="390" y="186" width="44" height="43" fill="#dfe3e1"/><rect x="380" y="76" width="82" height="60" fill="#dfe3e1"/><rect x="252" y="131" width="53" height="46" fill="#dfe3e1"/><rect x="446" y="137" width="65" height="35" fill="#dfe3e1"/><rect x="241" y="85" width="45" height="47" fill="#dfe3e1"/><rect x="66" y="102" width="55" height="45" fill="#dfe3e1"/><rect x="142" y="197" width="81" height="66" fill="#dfe3e1"/><rect x="424" y="48" width="79" height="33" fill="#dfe3e1"/><rect x="272" y="91" width="80" height="59" fill="#dfe3e1"/><rect x="136" y="205" width="80" height="64" fill="#dfe3e1"/><rect x="37" y="149" width="46" height="56" fill="#dfe3e1"/><rect x="446" y="138" width="78" height="33" fill="#dfe3e1"/><rect x="140" y="99" width="57" height="54" fill="#dfe3e1"/><rect x="0" y="278" width="600" height="7" fill="#ffffff"/><rect x="0" y="94" width="600" height="7" fill="#ffffff"/><rect x="0" y="195" width="600" height="13" fill="#ffffff"/><rect x="0" y="217" width="600" height="8" fill="#ffffff"/><rect x="357" y="0" width="12" height="300" fill="#ffffff"/><rect x="428" y="0" width="10" height="300" fill="#ffffff"/><rect x="361" y="0" width="10" height="300" fill="#ffffff"/><rect x="522" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="190" width="600" height="300" fill="#c8d9e4"/><rect x="301" y="65" width="63" height="37" fill="#dfe3e1"/><rect x="204" y="214" width="56" height="32" fill="#dfe3e1"/><rect x="498" y="6" width="57" height="61" fill="#dfe3e1"/><rect x="257" y="172" width="82" height="41" fill="#dfe3e1"/><rect x="366" y="6" width="77" height="57" fill="#dfe3e1"/><rect x="62" y="160" width="47" height="47" fill="#dfe3e1"/><rect x="320" y="131" width="75" height="54" fill="#dfe3e1"/><rect x="116" y="138" width="65" height="64" fill="#dfe3e1"/><rect x="107" y="145" width="40" height="65" fill="#dfe3e1"/><rect x="116" y="180" width="85" height="33" fill="#dfe3e1"/><rect x="72" y="186" width="77" height="53" fill="#dfe3e1"/><rect x="460" y="38" width="68" height="53" fill="#dfe3e1"/><rect x="333" y="230" width="54" height="63" fill="#dfe3e1"/><rect x="432" y="10" width="86" height="55" fill="#dfe3e1"/><rect x="0" y="240" width="600" height="7" fill="#ffffff"/><rect x="0" y="217" width="600" height="11" fill="#ffffff"/><rect x="0" y="243" width="600" height="9" fill="#ffffff"/><rect x="0" y="222" width="600" height="9" fill="#ffffff"/><rect x="232" y="0" width="7" height="300" fill="#ffffff"/><rect x="428" y="0" width="10" height="300" fill="#ffffff"/><rect x="76" y="0" width="7" height="300" fill="#ffffff"/><rect x="414" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="237" width="600" height="300" fill="#c8d9e4"/><rect x="297" y="112" width="59" height="33" fill="#dfe3e1"/><rect x="128" y="203" width="68" height="32" fill="#dfe3e1"/><rect x="142" y="162" width="58" height="53" fill="#dfe3e1"/><rect x="298" y="150" width="77" height="35" fill="#dfe3e1"/><rect x="44" y="217" width="75" height="33" fill="#dfe3e1"/><rect x="405" y="19" width="64" height="53" fill="#dfe3e1"/><rect x="209" y="185" width="78" height="65" fill="#dfe3e1"/><rect x="253" y="163" width="50" height="63" fill="#dfe3e1"/><rect x="277" y="166" width="88" height="59" fill="#dfe3e1"/><rect x="502" y="59" width="79" height="35" fill="#dfe3e1"/><rect x="220" y="26" width="40" height="60" fill="#dfe3e1"/><rect x="238" y="139" width="58" height="35" fill="#dfe3e1"/><rect x="225" y="119" width="84" height="52" fill="#dfe3e1"/><rect x="208" y="155" width="59" height="30" fill="#dfe3e1"/><rect x="0" y="53" width="600" height="7" fill="#ffffff"/><rect x="0" y="213" width="600" height="10" fill="#ffffff"/><rect x="0" y="35" width="600" height="11" fill="#ffffff"/><rect x="0" y="202" width="600" height="9" fill="#ffffff"/><rect x="489" y="0" width="8" height="300" fill="#ffffff"/><rect x="392" y="0" width="13" height="300" fill="#ffffff"/><rect x="536" y="0" width="10" height="300" fill="#ffffff"/><rect x="244" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="193" width="600" height="300" fill="#c8d9e4"/><rect x="73" y="60" width="64" height="61" fill="#dfe3e1"/><rect x="510" y="27" width="45" height="44" fill="#dfe3e1"/><rect x="45" y="73" width="47" height="62" fill="#dfe3e1"/><rect x="273" y="56" width="76" height="61" fill="#dfe3e1"/><rect x="466" y="91" width="66" height="58" fill="#dfe3e1"/><rect x="388" y="109" width="72" height="33" fill="#dfe3e1"/><rect x="448" y="190" width="66" height="30" fill="#dfe3e1"/><rect x="494" y="17" width="57" height="50" fill="#dfe3e1"/><rect x="355" y="77" width="57" height="64" fill="#dfe3e1"/><rect x="55" y="149" width="48" height="46" fill="#dfe3e1"/><rect x="47" y="143" width="83" height="63" fill="#dfe3e1"/><rect x="77" y="53" width="50" height="43" fill="#dfe3e1"/><rect x="445" y="224" width="68" height="52" fill="#dfe3e1"/><rect x="434" y="166" width="52" height="33" fill="#dfe3e1"/><rect x="0" y="41" width="600" height="7" fill="#ffffff"/><rect x="0" y="30" width="600" height="13" fill="#ffffff"/><rect x="0" y="234" width="600" height="11" fill="#ffffff"/><rect x="0" y="255" width="600" height="7" fill="#ffffff"/><rect x="364" y="0" width="13" height="300" fill="#ffffff"/><rect x="528" y="0" width="9" height="300" fill="#ffffff"/><rect x="50" y="0" width="8" height="300" fill="#ffffff"/><rect x="576" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="211" width="600" height="300" fill="#c8d9e4"/><rect x="325" y="180" width="71" height="43" fill="#dfe3e1"/><rect x="1" y="90" width="75" height="54" fill="#dfe3e1"/><rect x="113" y="169" width="48" height="59" fill="#dfe3e1"/><rect x="363" y="174" width="71" height="59" fill="#dfe3e1"/><rect x="360" y="42" width="61" height="48" fill="#dfe3e1"/><rect x="147" y="105" width="66" height="42" fill="#dfe3e1"/><rect x="442" y="169" width="49" height="59" fill="#dfe3e1"/><rect x="370" y="35" width="43" height="60" fill="#dfe3e1"/><rect x="447" y="186" width="51" height="62" fill="#dfe3e1"/><rect x="382" y="99" width="88" height="36" fill="#dfe3e1"/><rect x="33" y="69" width="69" height="54" fill="#dfe3e1"/><rect x="8" y="173" width="55" height="43" fill="#dfe3e1"/><rect x="262" y="34" width="65" height="34" fill="#dfe3e1"/><rect x="72" y="199" width="72" height="50" fill="#dfe3e1"/><rect x="0" y="94" width="600" height="11" fill="#ffffff"/><rect x="0" y="161" width="600" height="8" fill="#ffffff"/><rect x="0" y="62" width="600" height="13" fill="#ffffff"/><rect x="0" y="208" width="600" height="9" fill="#ffffff"/><rect x="528" y="0" width="13" height="300" fill="#ffffff"/><rect x="459" y="0" width="10" height="300" fill="#ffffff"/><rect x="160" y="0" width="10" height="300" fill="#ffffff"/><rect x="176" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="217" y="205" width="42" height="59" fill="#dfe3e1"/><rect x="497" y="206" width="48" height="56" fill="#dfe3e1"/><rect x="126" y="52" width="52" height="65" fill="#dfe3e1"/><rect x="410" y="23" width="67" height="61" fill="#dfe3e1"/><rect x="106" y="148" width="55" height="66" fill="#dfe3e1"/><rect x="350" y="192" width="73" height="58" fill="#dfe3e1"/><rect x="129" y="103" width="40" height="34" fill="#dfe3e1"/><rect x="288" y="75" width="82" height="46" fill="#dfe3e1"/><rect x="229" y="41" width="77" height="54" fill="#dfe3e1"/><rect x="406" y="16" width="58" height="46" fill="#dfe3e1"/><rect x="330" y="43" width="57" height="30" fill="#dfe3e1"/><rect x="172" y="184" width="57" height="34" fill="#dfe3e1"/><rect x="480" y="41" width="72" height="37" fill="#dfe3e1"/><rect x="24" y="34" width="49" height="56" fill="#dfe3e1"/><rect x="0" y="25" width="600" height="8" fill="#ffffff"/><rect x="0" y="28" width="600" height="12" fill="#ffffff"/><rect x="0" y="205" width="600" height="9" fill="#ffffff"/><rect x="0" y="227" width="600" height="13" fill="#ffffff"/><rect x="313" y="0" width="11" height="300" fill="#ffffff"/><rect x="558" y="0" width="13" height="300" fill="#ffffff"/><rect x="472" y="0" width="13" height="300" fill="#ffffff"/><rect x="397" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="231" width="600" height="300" fill="#c8d9e4"/><rect x="226" y="181" width="79" height="59" fill="#dfe3e1"/><rect x="369" y="170" width="46" height="30" fill="#dfe3e1"/><rect x="118" y="95" width="58" height="65" fill="#dfe3e1"/><rect x="467" y="118" width="55" height="37" fill="#dfe3e1"/><rect x="502" y="44" width="78" height="46" fill="#dfe3e1"/><rect x="166" y="91" width="41" height="61" fill="#dfe3e1"/><rect x="257" y="120" width="53" height="30" fill="#dfe3e1"/><rect x="282" y="105" width="45" height="65" fill="#dfe3e1"/><rect x="163" y="123" width="77" height="52" fill="#dfe3e1"/><rect x="278" y="144" width="82" height="52" fill="#dfe3e1"/><rect x="277" y="189" width="83" height="32" fill="#dfe3e1"/><rect x="350" y="172" width="88" height="41" fill="#dfe3e1"/><rect x="124" y="202" width="73" height="33" fill="#dfe3e1"/><rect x="135" y="106" width="50" height="49" fill="#dfe3e1"/><rect x="0" y="75" width="600" height="9" fill="#ffffff"/><rect x="0" y="248" width="600" height="12" fill="#ffffff"/><rect x="0" y="220" width="600" height="13" fill="#ffffff"/><rect x="0" y="240" width="600" height="9" fill="#ffffff"/><rect x="151" y="0" width="7" height="300" fill="#ffffff"/><rect x="557" y="0" width="8" height="300" fill="#ffffff"/><rect x="186" y="0" width="10" height="300" fill="#ffffff"/><rect x="115" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="208" width="600" height="300" fill="#c8d9e4"/><rect x="298" y="198" width="51" height="62" fill="#dfe3e1"/><rect x="136" y="83" width="86" height="53" fill="#dfe3e1"/><rect x="375" y="121" width="45" height="53" fill="#dfe3e1"/><rect x="335" y="52" width="65" height="66" fill="#dfe3e1"/><rect x="95" y="39" width="54" height="59" fill="#dfe3e1"/><rect x="7" y="195" width="45" height="30" fill="#dfe3e1"/><rect x="402" y="150" width="40" height="33" fill="#dfe3e1"/><rect x="33" y="167" width="62" height="36" fill="#dfe3e1"/><rect x="395" y="180" width="87" height="59" fill="#dfe3e1"/><rect x="415" y="54" width="70" height="33" fill="#dfe3e1"/><rect x="499" y="22" width="56" height="66" fill="#dfe3e1"/><rect x="136" y="45" width="44" height="58" fill="#dfe3e1"/><rect x="470" y="13" width="81" height="51" fill="#dfe3e1"/><rect x="459" y="90" width="45" height="45" fill="#dfe3e1"/><rect x="0" y="277" width="600" height="9" fill="#ffffff"/><rect x="0" y="164" width="600" height="7" fill="#ffffff"/><rect x="0" y="162" width="600" height="8" fill="#ffffff"/><rect x="0" y="265" width="600" height="10" fill="#ffffff"/><rect x="370" y="0" width="7" height="300" fill="#ffffff"/><rect x="74" y="0" width="8" height="300" fill="#ffffff"/><rect x="309" y="0" width="8" height="300" fill="#ffffff"/><rect x="61" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="218" width="600" height="300" fill="#c8d9e4"/><rect x="387" y="106" width="40" height="35" fill="#dfe3e1"/><rect x="442" y="81" width="61" height="41" fill="#dfe3e1"/><rect x="153" y="229" width="78" height="33" fill="#dfe3e1"/><rect x="327" y="77" width="43" height="66" fill="#dfe3e1"/><rect x="121" y="197" width="75" height="46" fill="#dfe3e1"/><rect x="500" y="110" width="43" height="51" fill="#dfe3e1"/><rect x="338" y="41" width="75" height="61" fill="#dfe3e1"/><rect x="63" y="128" width="65" height="65" fill="#dfe3e1"/><rect x="285" y="119" width="65" height="52" fill="#dfe3e1"/><rect x="367" y="49" width="75" height="62" fill="#dfe3e1"/><rect x="42" y="223" width="48" height="60" fill="#dfe3e1"/><rect x="104" y="203" width="76" height="37" fill="#dfe3e1"/><rect x="135" y="16" width="81" height="62" fill="#dfe3e1"/><rect x="324" y="82" width="88" height="49" fill="#dfe3e1"/><rect x="0" y="48" width="600" height="13" fill="#ffffff"/><rect x="0" y="36" width="600" height="12" fill="#ffffff"/><rect x="0" y="75" width="600" height="8" fill="#ffffff"/><rect x="0" y="182" width="600" height="7" fill="#ffffff"/><rect x="201" y="0" width="11" height="300" fill="#ffffff"/><rect x="432" y="0" width="7" height="300" fill="#ffffff"/><rect x="171" y="0" width="12" height="300" fill="#ffffff"/><rect x="90" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="363" y="152" width="76" height="52" fill="#dfe3e1"/><rect x="142" y="168" width="40" height="40" fill="#dfe3e1"/><rect x="457" y="85" width="79" height="61" fill="#dfe3e1"/><rect x="109" y="131" width="76" height="34" fill="#dfe3e1"/><rect x="245" y="186" width="66" height="63" fill="#dfe3e1"/><rect x="19" y="165" width="55" height="30" fill="#dfe3e1"/><rect x="108" y="14" width="72" height="57" fill="#dfe3e1"/><rect x="101" y="62" width="73" height="39" fill="#dfe3e1"/><rect x="195" y="76" width="68" height="61" fill="#dfe3e1"/><rect x="164" y="56" width="85" height="59" fill="#dfe3e1"/><rect x="441" y="115" width="44" height="37" fill="#dfe3e1"/><rect x="50" y="73" width="68" height="44" fill="#dfe3e1"/><rect x="331" y="51" width="73" height="33" fill="#dfe3e1"/><rect x="279" y="119" width="77" height="48" fill="#dfe3e1"/><rect x="0" y="270" width="600" height="13" fill="#ffffff"/><rect x="0" y="78" width="600" height="13" fill="#ffffff"/><rect x="0" y="245" width="600" height="13" fill="#ffffff"/><rect x="0" y="110" width="600" height="9" fill="#ffffff"/><rect x="286" y="0" width="13" height="300" fill="#ffffff"/><rect x="57" y="0" width="12" height="300" fill="#ffffff"/><rect x="96" y="0" width="9" height="300" fill="#ffffff"/><rect x="35" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="340" y="86" width="85" height="62" fill="#dfe3e1"/><rect x="243" y="80" width="69" height="63" fill="#dfe3e1"/><rect x="244" y="193" width="54" height="65" fill="#dfe3e1"/><rect x="47" y="0" width="49" height="54" fill="#dfe3e1"/><rect x="145" y="197" width="44" height="55" fill="#dfe3e1"/><rect x="357" y="32" width="65" height="37" fill="#dfe3e1"/><rect x="151" y="121" width="80" height="38" fill="#dfe3e1"/><rect x="8" y="160" width="70" height="61" fill="#dfe3e1"/><rect x="0" y="189" width="82" height="63" fill="#dfe3e1"/><rect x="233" y="129" width="65" height="53" fill="#dfe3e1"/><rect x="412" y="110" width="41" height="63" fill="#dfe3e1"/><rect x="392" y="181" width="78" height="62" fill="#dfe3e1"/><rect x="425" y="115" width="45" height="45" fill="#dfe3e1"/><rect x="434" y="79" width="57" height="63" fill="#dfe3e1"/><rect x="0" y="263" width="600" height="7" fill="#ffffff"/><rect x="0" y="40" width="600" height="8" fill="#ffffff"/><rect x="0" y="75" width="600" height="11" fill="#ffffff"/><rect x="0" y="81" width="600" height="7" fill="#ffffff"/><rect x="375" y="0" width="10" height="300" fill="#ffffff"/><rect x="190" y="0" width="9" height="300" fill="#ffffff"/><rect x="575" y="0" width="8" height="300" fill="#ffffff"/><rect x="556" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="199" width="600" height="300" fill="#c8d9e4"/><rect x="84" y="35" width="70" height="50" fill="#dfe3e1"/><rect x="366" y="205" width="88" height="61" fill="#dfe3e1"/><rect x="199" y="205" width="77" height="47" fill="#dfe3e1"/><rect x="352" y="161" width="72" height="58" fill="#dfe3e1"/><rect x="417" y="210" width="55" height="41" fill="#dfe3e1"/><rect x="43" y="195" width="42" height="35" fill="#dfe3e1"/><rect x="88" y="127" width="87" height="36" fill="#dfe3e1"/><rect x="23" y="21" width="75" height="47" fill="#dfe3e1"/><rect x="331" y="19" width="69" height="44" fill="#dfe3e1"/><rect x="90" y="222" width="87" height="40" fill="#dfe3e1"/><rect x="96" y="15" width="64" height="58" fill="#dfe3e1"/><rect x="466" y="33" width="47" height="64" fill="#dfe3e1"/><rect x="474" y="124" width="66" height="55" fill="#dfe3e1"/><rect x="292" y="2" width="73" height="37" fill="#dfe3e1"/><rect x="0" y="82" width="600" height="12" fill="#ffffff"/><rect x="0" y="58" width="600" height="10" fill="#ffffff"/><rect x="0" y="70" width="600" height="13" fill="#ffffff"/><rect x="0" y="21" width="600" height="11" fill="#ffffff"/><rect x="305" y="0" width="10" height="300" fill="#ffffff"/><rect x="241" y="0" width="11" height="300" fill="#ffffff"/><rect x="556" y="0" width="8" height="300" fill="#ffffff"/><rect x="74" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="212" width="600" height="300" fill="#c8d9e4"/><rect x="283" y="121" width="59" height="47" fill="#dfe3e1"/><rect x="165" y="212" width="55" height="42" fill="#dfe3e1"/><rect x="272" y="125" width="83" height="43" fill="#dfe3e1"/><rect x="203" y="29" width="70" height="44" fill="#dfe3e1"/><rect x="88" y="99" width="69" height="62" fill="#dfe3e1"/><rect x="364" y="205" width="77" height="34" fill="#dfe3e1"/><rect x="185" y="123" width="53" height="35" fill="#dfe3e1"/><rect x="12" y="212" width="42" height="58" fill="#dfe3e1"/><rect x="489" y="181" width="48" height="47" fill="#dfe3e1"/><rect x="197" y="161" width="68" height="39" fill="#dfe3e1"/><rect x="15" y="148" width="67" height="33" fill="#dfe3e1"/><rect x="196" y="105" width="55" height="46" fill="#dfe3e1"/><rect x="6" y="25" width="61" height="62" fill="#dfe3e1"/><rect x="435" y="121" width="57" height="31" fill="#dfe3e1"/><rect x="0" y="258" width="600" height="12" fill="#ffffff"/><rect x="0" y="250" width="600" height="10" fill="#ffffff"/><rect x="0" y="153" width="600" height="11" fill="#ffffff"/><rect x="0" y="255" width="600" height="13" fill="#ffffff"/><rect x="567" y="0" width="8" height="300" fill="#ffffff"/><rect x="310" y="0" width="10" height="300" fill="#ffffff"/><rect x="183" y="0" width="13" height="300" fill="#ffffff"/><rect x="100" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="301" y="102" width="51" height="51" fill="#dfe3e1"/><rect x="379" y="16" width="51" height="33" fill="#dfe3e1"/><rect x="51" y="108" width="60" height="48" fill="#dfe3e1"/><rect x="292" y="50" width="80" height="38" fill="#dfe3e1"/><rect x="47" y="214" width="85" height="31" fill="#dfe3e1"/><rect x="412" y="119" width="82" height="30" fill="#dfe3e1"/><rect x="178" y="150" width="43" height="49" fill="#dfe3e1"/><rect x="290" y="37" width="79" height="39" fill="#dfe3e1"/><rect x="274" y="74" width="73" height="40" fill="#dfe3e1"/><rect x="28" y="168" width="67" height="57" fill="#dfe3e1"/><rect x="175" y="25" width="77" height="36" fill="#dfe3e1"/><rect x="197" y="52" width="83" height="31" fill="#dfe3e1"/><rect x="310" y="59" width="50" height="51" fill="#dfe3e1"/><rect x="215" y="215" width="43" height="61" fill="#dfe3e1"/><rect x="0" y="81" width="600" height="13" fill="#ffffff"/><rect x="0" y="83" width="600" height="13" fill="#ffffff"/><rect x="0" y="55" width="600" height="12" fill="#ffffff"/><rect x="0" y="223" width="600" height="8" fill="#ffffff"/><rect x="162" y="0" width="13" height="300" fill="#ffffff"/><rect x="86" y="0" width="11" height="300" fill="#ffffff"/><rect x="237" y="0" width="7" height="300" fill="#ffffff"/><rect x="557" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="405" y="2" width="44" height="48" fill="#dfe3e1"/><rect x="202" y="186" width="56" height="41" fill="#dfe3e1"/><rect x="279" y="184" width="68" height="43" fill="#dfe3e1"/><rect x="461" y="56" width="48" height="30" fill="#dfe3e1"/><rect x="133" y="118" width="43" height="39" fill="#dfe3e1"/><rect x="98" y="18" width="43" height="55" fill="#dfe3e1"/><rect x="79" y="48" width="81" height="36" fill="#dfe3e1"/><rect x="237" y="63" width="87" height="33" fill="#dfe3e1"/><rect x="134" y="28" width="67" height="35" fill="#dfe3e1"/><rect x="495" y="121" width="84" height="56" fill="#dfe3e1"/><rect x="472" y="168" width="81" height="37" fill="#dfe3e1"/><rect x="407" y="224" width="63" height="42" fill="#dfe3e1"/><rect x="8" y="51" width="77" height="34" fill="#dfe3e1"/><rect x="231" y="76" width="45" height="42" fill="#dfe3e1"/><rect x="0" y="211" width="600" height="9" fill="#ffffff"/><rect x="0" y="227" width="600" height="10" fill="#ffffff"/><rect x="0" y="36" width="600" height="12" fill="#ffffff"/><rect x="0" y="75" width="600" height="11" fill="#ffffff"/><rect x="455" y="0" width="10" height="300" fill="#ffffff"/><rect x="398" y="0" width="8" height="300" fill="#ffffff"/><rect x="342" y="0" width="9" height="300" fill="#ffffff"/><rect x="448" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="194" width="600" height="300" fill="#c8d9e4"/><rect x="240" y="4" width="53" height="41" fill="#dfe3e1"/><rect x="440" y="85" width="57" height="42" fill="#dfe3e1"/><rect x="93" y="46" width="44" height="30" fill="#dfe3e1"/><rect x="307" y="80" width="64" height="50" fill="#dfe3e1"/><rect x="349" y="30" width="71" height="66" fill="#dfe3e1"/><rect x="44" y="95" width="79" height="52" fill="#dfe3e1"/><rect x="476" y="1" width="64" height="54" fill="#dfe3e1"/><rect x="187" y="61" width="80" height="48" fill="#dfe3e1"/><rect x="310" y="77" width="67" height="30" fill="#dfe3e1"/><rect x="103" y="26" width="82" height="38" fill="#dfe3e1"/><rect x="67" y="164" width="41" height="36" fill="#dfe3e1"/><rect x="385" y="9" width="65" height="39" fill="#dfe3e1"/><rect x="368" y="139" width="64" height="41" fill="#dfe3e1"/><rect x="497" y="9" width="73" height="30" fill="#dfe3e1"/><rect x="0" y="72" width="600" height="8" fill="#ffffff"/><rect x="0" y="191" width="600" height="10" fill="#ffffff"/><rect x="0" y="221" width="600" height="11" fill="#ffffff"/><rect x="0" y="107" width="600" height="10" fill="#ffffff"/><rect x="58" y="0" width="9" height="300" fill="#ffffff"/><rect x="259" y="0" width="10" height="300" fill="#ffffff"/><rect x="390" y="0" width="11" height="300" fill="#ffffff"/><rect x="406" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="259" y="206" width="43" height="50" fill="#dfe3e1"/><rect x="381" y="125" width="87" height="60" fill="#dfe3e1"/><rect x="154" y="60" width="55" height="39" fill="#dfe3e1"/><rect x="238" y="129" width="55" height="56" fill="#dfe3e1"/><rect x="380" y="186" width="42" height="51" fill="#dfe3e1"/><rect x="122" y="214" width="49" height="42" fill="#dfe3e1"/><rect x="402" y="199" width="45" height="62" fill="#dfe3e1"/><rect x="14" y="55" width="74" height="65" fill="#dfe3e1"/><rect x="258" y="78" width="77" height="37" fill="#dfe3e1"/><rect x="50" y="9" width="70" height="52" fill="#dfe3e1"/><rect x="175" y="43" width="82" height="33" fill="#dfe3e1"/><rect x="479" y="62" width="74" height="42" fill="#dfe3e1"/><rect x="23" y="194" width="60" height="64" fill="#dfe3e1"/><rect x="118" y="95" width="41" height="45" fill="#dfe3e1"/><rect x="0" y="161" width="600" height="13" fill="#ffffff"/><rect x="0" y="168" width="600" height="8" fill="#ffffff"/><rect x="0" y="271" width="600" height="10" fill="#ffffff"/><rect x="0" y="76" width="600" height="13" fill="#ffffff"/><rect x="505" y="0" width="10" height="300" fill="#ffffff"/><rect x="131" y="0" width="8" height="300" fill="#ffffff"/><rect x="286" y="0" width="10" height="300" fill="#ffffff"/><rect x="477" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="227" width="600" height="300" fill="#c8d9e4"/><rect x="282" y="205" width="72" height="33" fill="#dfe3e1"/><rect x="391" y="156" width="87" height="45" fill="#dfe3e1"/><rect x="12" y="90" width="50" height="64" fill="#dfe3e1"/><rect x="102" y="97" width="69" height="41" fill="#dfe3e1"/><rect x="241" y="49" width="83" height="57" fill="#dfe3e1"/><rect x="319" y="75" width="44" height="38" fill="#dfe3e1"/><rect x="500" y="168" width="46" height="47" fill="#dfe3e1"/><rect x="508" y="77" width="71" height="34" fill="#dfe3e1"/><rect x="422" y="151" width="58" height="66" fill="#dfe3e1"/><rect x="112" y="197" width="68" height="53" fill="#dfe3e1"/><rect x="322" y="76" width="51" height="39" fill="#dfe3e1"/><rect x="386" y="156" width="70" height="52" fill="#dfe3e1"/><rect x="195" y="197" width="76" height="58" fill="#dfe3e1"/><rect x="271" y="33" width="83" height="35" fill="#dfe3e1"/><rect x="0" y="56" width="600" height="8" fill="#ffffff"/><rect x="0" y="214" width="600" height="12" fill="#ffffff"/><rect x="0" y="136" width="600" height="13" fill="#ffffff"/><rect x="0" y="28" width="600" height="11" fill="#ffffff"/><rect x="485" y="0" width="9" height="300" fill="#ffffff"/><rect x="338" y="0" width="7" height="300" fill="#ffffff"/><rect x="522" y="0" width="8" height="300" fill="#ffffff"/><rect x="572" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="194" width="600" height="300" fill="#c8d9e4"/><rect x="271" y="121" width="63" height="55" fill="#dfe3e1"/><rect x="132" y="71" width="61" height="35" fill="#dfe3e1"/><rect x="290" y="95" width="58" height="64" fill="#dfe3e1"/><rect x="256" y="210" width="70" height="55" fill="#dfe3e1"/><rect x="115" y="99" width="64" height="33" fill="#dfe3e1"/><rect x="330" y="216" width="80" height="56" fill="#dfe3e1"/><rect x="26" y="148" width="70" height="56" fill="#dfe3e1"/><rect x="229" y="66" width="54" height="56" fill="#dfe3e1"/><rect x="324" y="134" width="42" height="30" fill="#dfe3e1"/><rect x="361" y="24" width="63" height="62" fill="#dfe3e1"/><rect x="79" y="227" width="52" height="35" fill="#dfe3e1"/><rect x="166" y="64" width="65" height="63" fill="#dfe3e1"/><rect x="205" y="85" width="44" height="31" fill="#dfe3e1"/><rect x="26" y="158" width="51" height="51" fill="#dfe3e1"/><rect x="0" y="254" width="600" height="7" fill="#ffffff"/><rect x="0" y="107" width="600" height="7" fill="#ffffff"/><rect x="0" y="144" width="600" height="7" fill="#ffffff"/><rect x="0" y="197" width="600" height="11" fill="#ffffff"/><rect x="179" y="0" width="11" height="300" fill="#ffffff"/><rect x="499" y="0" width="13" height="300" fill="#ffffff"/><rect x="172" y="0" width="11" height="300" fill="#ffffff"/><rect x="365" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="220" width="600" height="300" fill="#c8d9e4"/><rect x="78" y="73" width="64" height="45" fill="#dfe3e1"/><rect x="98" y="84" width="59" height="63" fill="#dfe3e1"/><rect x="144" y="86" width="75" height="44" fill="#dfe3e1"/><rect x="227" y="96" width="56" height="39" fill="#dfe3e1"/><rect x="347" y="157" width="45" height="34" fill="#dfe3e1"/><rect x="290" y="225" width="64" height="32" fill="#dfe3e1"/><rect x="77" y="196" width="68" height="56" fill="#dfe3e1"/><rect x="308" y="60" width="43" height="40" fill="#dfe3e1"/><rect x="22" y="221" width="86" height="34" fill="#dfe3e1"/><rect x="363" y="29" width="74" height="47" fill="#dfe3e1"/><rect x="33" y="111" width="50" height="41" fill="#dfe3e1"/><rect x="392" y="175" width="60" height="43" fill="#dfe3e1"/><rect x="12" y="43" width="71" height="37" fill="#dfe3e1"/><rect x="98" y="83" width="80" height="61" fill="#dfe3e1"/><rect x="0" y="136" width="600" height="12" fill="#ffffff"/><rect x="0" y="190" width="600" height="12" fill="#ffffff"/><rect x="0" y="117" width="600" height="9" fill="#ffffff"/><rect x="0" y="265" width="600" height="11" fill="#ffffff"/><rect x="305" y="0" width="7" height="300" fill="#ffffff"/><rect x="334" y="0" width="9" height="300" fill="#ffffff"/><rect x="264" y="0" width="11" height="300" fill="#ffffff"/><rect x="524" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="236" width="600" height="300" fill="#c8d9e4"/><rect x="92" y="91" width="74" height="34" fill="#dfe3e1"/><rect x="375" y="124" width="50" height="47" fill="#dfe3e1"/><rect x="364" y="209" width="65" height="47" fill="#dfe3e1"/><rect x="70" y="227" width="72" height="60" fill="#dfe3e1"/><rect x="496" y="22" width="79" height="48" fill="#dfe3e1"/><rect x="361" y="127" width="79" height="61" fill="#dfe3e1"/><rect x="356" y="186" width="73" height="59" fill="#dfe3e1"/><rect x="345" y="71" width="59" height="40" fill="#dfe3e1"/><rect x="445" y="163" width="56" height="64" fill="#dfe3e1"/><rect x="115" y="106" width="44" height="48" fill="#dfe3e1"/><rect x="163" y="176" width="66" height="52" fill="#dfe3e1"/><rect x="497" y="186" width="46" height="52" fill="#dfe3e1"/><rect x="330" y="143" width="44" height="34" fill="#dfe3e1"/><rect x="368" y="153" width="68" height="58" fill="#dfe3e1"/><rect x="0" y="265" width="600" height="12" fill="#ffffff"/><rect x="0" y="242" width="600" height="13" fill="#ffffff"/><rect x="0" y="241" width="600" height="11" fill="#ffffff"/><rect x="0" y="162" width="600" height="9" fill="#ffffff"/><rect x="407" y="0" width="8" height="300" fill="#ffffff"/><rect x="116" y="0" width="12" height="300" fill="#ffffff"/><rect x="394" y="0" width="7" height="300" fill="#ffffff"/><rect x="428" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="244" width="600" height="300" fill="#c8d9e4"/><rect x="207" y="219" width="55" height="52" fill="#dfe3e1"/><rect x="229" y="48" width="75" height="48" fill="#dfe3e1"/><rect x="83" y="139" width="49" height="37" fill="#dfe3e1"/><rect x="427" y="25" width="82" height="66" fill="#dfe3e1"/><rect x="386" y="119" width="80" height="34" fill="#dfe3e1"/><rect x="207" y="19" width="84" height="62" fill="#dfe3e1"/><rect x="61" y="45" width="58" height="62" fill="#dfe3e1"/><rect x="415" y="190" width="46" height="54" fill="#dfe3e1"/><rect x="303" y="212" width="67" height="39" fill="#dfe3e1"/><rect x="291" y="152" width="65" height="42" fill="#dfe3e1"/><rect x="476" y="81" width="59" height="48" fill="#dfe3e1"/><rect x="452" y="210" width="59" height="34" fill="#dfe3e1"/><rect x="80" y="197" width="60" height="40" fill="#dfe3e1"/><rect x="77" y="2" width="67" height="38" fill="#dfe3e1"/><rect x="0" y="122" width="600" height="8" fill="#ffffff"/><rect x="0" y="186" width="600" height="12" fill="#ffffff"/><rect x="0" y="197" width="600" height="10" fill="#ffffff"/><rect x="0" y="83" width="600" height="7" fill="#ffffff"/><rect x="456" y="0" width="8" height="300" fill="#ffffff"/><rect x="109" y="0" width="12" height="300" fill="#ffffff"/><rect x="20" y="0" width="7" height="300" fill="#ffffff"/><rect x="474" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="391" y="171" width="84" height="66" fill="#dfe3e1"/><rect x="87" y="33" width="45" height="36" fill="#dfe3e1"/><rect x="109" y="91" width="82" height="32" fill="#dfe3e1"/><rect x="439" y="125" width="53" height="65" fill="#dfe3e1"/><rect x="479" y="127" width="77" height="30" fill="#dfe3e1"/><rect x="420" y="227" width="75" height="64" fill="#dfe3e1"/><rect x="482" y="127" width="67" height="38" fill="#dfe3e1"/><rect x="498" y="139" width="49" height="39" fill="#dfe3e1"/><rect x="229" y="90" width="59" height="51" fill="#dfe3e1"/><rect x="192" y="229" width="43" height="41" fill="#dfe3e1"/><rect x="42" y="147" width="71" height="61" fill="#dfe3e1"/><rect x="33" y="124" width="48" height="38" fill="#dfe3e1"/><rect x="143" y="182" width="60" height="43" fill="#dfe3e1"/><rect x="342" y="110" width="45" height="62" fill="#dfe3e1"/><rect x="0" y="245" width="600" height="12" fill="#ffffff"/><rect x="0" y="272" width="600" height="13" fill="#ffffff"/><rect x="0" y="110" width="600" height="10" fill="#ffffff"/><rect x="0" y="233" width="600" height="10" fill="#ffffff"/><rect x="420" y="0" width="12" height="300" fill="#ffffff"/><rect x="363" y="0" width="10" height="300" fill="#ffffff"/><rect x="86" y="0" width="9" height="300" fill="#ffffff"/><rect x="58" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="312" y="81" width="43" height="52" fill="#dfe3e1"/><rect x="284" y="181" width="46" height="40" fill="#dfe3e1"/><rect x="466" y="57" width="44" height="58" fill="#dfe3e1"/><rect x="466" y="39" width="57" height="34" fill="#dfe3e1"/><rect x="175" y="75" width="48" height="64" fill="#dfe3e1"/><rect x="7" y="192" width="58" height="56" fill="#dfe3e1"/><rect x="404" y="89" width="49" height="47" fill="#dfe3e1"/><rect x="131" y="46" width="87" height="52" fill="#dfe3e1"/><rect x="336" y="170" width="79" height="66" fill="#dfe3e1"/><rect x="353" y="177" width="77" height="62" fill="#dfe3e1"/><rect x="390" y="212" width="67" height="57" fill="#dfe3e1"/><rect x="16" y="202" width="51" height="39" fill="#dfe3e1"/><rect x="51" y="142" width="67" height="30" fill="#dfe3e1"/><rect x="195" y="229" width="84" height="47" fill="#dfe3e1"/><rect x="0" y="276" width="600" height="8" fill="#ffffff"/><rect x="0" y="149" width="600" height="9" fill="#ffffff"/><rect x="0" y="272" width="600" height="12" fill="#ffffff"/><rect x="0" y="32" width="600" height="9" fill="#ffffff"/><rect x="382" y="0" width="10" height="300" fill="#ffffff"/><rect x="132" y="0" width="10" height="300" fill="#ffffff"/><rect x="115" y="0" width="11" height="300" fill="#ffffff"/><rect x="336" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="299" y="88" width="61" height="63" fill="#dfe3e1"/><rect x="419" y="190" width="51" height="46" fill="#dfe3e1"/><rect x="388" y="196" width="82" height="60" fill="#dfe3e1"/><rect x="487" y="219" width="53" height="41" fill="#dfe3e1"/><rect x="399" y="140" width="86" height="46" fill="#dfe3e1"/><rect x="302" y="6" width="74" height="49" fill="#dfe3e1"/><rect x="131" y="35" width="74" height="35" fill="#dfe3e1"/><rect x="161" y="193" width="84" height="40" fill="#dfe3e1"/><rect x="457" y="169" width="66" height="53" fill="#dfe3e1"/><rect x="131" y="228" width="62" height="64" fill="#dfe3e1"/><rect x="100" y="130" width="55" height="66" fill="#dfe3e1"/><rect x="351" y="168" width="43" height="46" fill="#dfe3e1"/><rect x="437" y="104" width="81" height="34" fill="#dfe3e1"/><rect x="270" y="134" width="55" height="39" fill="#dfe3e1"/><rect x="0" y="207" width="600" height="12" fill="#ffffff"/><rect x="0" y="86" width="600" height="10" fill="#ffffff"/><rect x="0" y="261" width="600" height="13" fill="#ffffff"/><rect x="0" y="73" width="600" height="11" fill="#ffffff"/><rect x="44" y="0" width="7" height="300" fill="#ffffff"/><rect x="256" y="0" width="7" height="300" fill="#ffffff"/><rect x="368" y="0" width="11" height="300" fill="#ffffff"/><rect x="455" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="361" y="62" width="75" height="38" fill="#dfe3e1"/><rect x="126" y="152" width="59" height="49" fill="#dfe3e1"/><rect x="500" y="91" width="53" height="31" fill="#dfe3e1"/><rect x="311" y="135" width="67" height="49" fill="#dfe3e1"/><rect x="51" y="72" width="67" height="56" fill="#dfe3e1"/><rect x="368" y="217" width="46" height="33" fill="#dfe3e1"/><rect x="216" y="159" width="80" height="30" fill="#dfe3e1"/><rect x="297" y="5" width="69" height="46" fill="#dfe3e1"/><rect x="473" y="189" width="69" height="62" fill="#dfe3e1"/><rect x="314" y="220" width="49" height="30" fill="#dfe3e1"/><rect x="99" y="227" width="54" height="50" fill="#dfe3e1"/><rect x="212" y="73" width="76" height="57" fill="#dfe3e1"/><rect x="457" y="108" width="84" height="50" fill="#dfe3e1"/><rect x="260" y="4" width="82" height="34" fill="#dfe3e1"/><rect x="0" y="39" width="600" height="12" fill="#ffffff"/><rect x="0" y="110" width="600" height="9" fill="#ffffff"/><rect x="0" y="53" width="600" height="10" fill="#ffffff"/><rect x="0" y="45" width="600" height="12" fill="#ffffff"/><rect x="460" y="0" width="8" height="300" fill="#ffffff"/><rect x="28" y="0" width="10" height="300" fill="#ffffff"/><rect x="23" y="0" width="13" height="300" fill="#ffffff"/><rect x="503" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="193" width="600" height="300" fill="#c8d9e4"/><rect x="460" y="206" width="65" height="63" fill="#dfe3e1"/><rect x="501" y="74" width="81" height="34" fill="#dfe3e1"/><rect x="231" y="56" width="64" height="65" fill="#dfe3e1"/><rect x="48" y="214" width="43" height="59" fill="#dfe3e1"/><rect x="476" y="199" width="77" height="53" fill="#dfe3e1"/><rect x="220" y="215" width="61" height="57" fill="#dfe3e1"/><rect x="182" y="93" width="58" height="49" fill="#dfe3e1"/><rect x="82" y="21" width="66" height="49" fill="#dfe3e1"/><rect x="29" y="15" width="45" height="52" fill="#dfe3e1"/><rect x="491" y="18" width="40" height="50" fill="#dfe3e1"/><rect x="180" y="77" width="64" height="37" fill="#dfe3e1"/><rect x="21" y="164" width="58" height="63" fill="#dfe3e1"/><rect x="397" y="165" width="85" height="48" fill="#dfe3e1"/><rect x="215" y="154" width="75" height="53" fill="#dfe3e1"/><rect x="0" y="148" width="600" height="8" fill="#ffffff"/><rect x="0" y="161" width="600" height="8" fill="#ffffff"/><rect x="0" y="73" width="600" height="11" fill="#ffffff"/><rect x="0" y="198" width="600" height="12" fill="#ffffff"/><rect x="329" y="0" width="8" height="300" fill="#ffffff"/><rect x="105" y="0" width="11" height="300" fill="#ffffff"/><rect x="256" y="0" width="9" height="300" fill="#ffffff"/><rect x="326" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="115" y="12" width="71" height="65" fill="#dfe3e1"/><rect x="509" y="213" width="48" height="43" fill="#dfe3e1"/><rect x="155" y="187" width="77" height="49" fill="#dfe3e1"/><rect x="360" y="45" width="45" height="61" fill="#dfe3e1"/><rect x="383" y="188" width="75" height="61" fill="#dfe3e1"/><rect x="411" y="103" width="58" height="57" fill="#dfe3e1"/><rect x="357" y="98" width="65" height="41" fill="#dfe3e1"/><rect x="94" y="152" width="67" height="58" fill="#dfe3e1"/><rect x="229" y="114" width="48" height="50" fill="#dfe3e1"/><rect x="398" y="197" width="52" height="37" fill="#dfe3e1"/><rect x="161" y="113" width="46" height="57" fill="#dfe3e1"/><rect x="458" y="49" width="59" height="32" fill="#dfe3e1"/><rect x="1" y="87" width="82" height="57" fill="#dfe3e1"/><rect x="450" y="95" width="83" height="59" fill="#dfe3e1"/><rect x="0" y="110" width="600" height="12" fill="#ffffff"/><rect x="0" y="234" width="600" height="11" fill="#ffffff"/><rect x="0" y="233" width="600" height="12" fill="#ffffff"/><rect x="0" y="190" width="600" height="7" fill="#ffffff"/><rect x="224" y="0" width="10" height="300" fill="#ffffff"/><rect x="276" y="0" width="11" height="300" fill="#ffffff"/><rect x="553" y="0" width="13" height="300" fill="#ffffff"/><rect x="422" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="240" width="600" height="300" fill="#c8d9e4"/><rect x="196" y="41" width="60" height="46" fill="#dfe3e1"/><rect x="431" y="53" width="50" height="53" fill="#dfe3e1"/><rect x="288" y="60" width="85" height="37" fill="#dfe3e1"/><rect x="168" y="135" width="79" height="65" fill="#dfe3e1"/><rect x="75" y="109" width="61" height="55" fill="#dfe3e1"/><rect x="458" y="151" width="75" height="41" fill="#dfe3e1"/><rect x="439" y="128" width="54" height="38" fill="#dfe3e1"/><rect x="419" y="49" width="70" height="63" fill="#dfe3e1"/><rect x="281" y="70" width="72" height="52" fill="#dfe3e1"/><rect x="419" y="123" width="44" height="37" fill="#dfe3e1"/><rect x="456" y="97" width="42" height="66" fill="#dfe3e1"/><rect x="114" y="90" width="48" height="63" fill="#dfe3e1"/><rect x="62" y="5" width="76" height="45" fill="#dfe3e1"/><rect x="455" y="67" width="78" height="53" fill="#dfe3e1"/><rect x="0" y="135" width="600" height="10" fill="#ffffff"/><rect x="0" y="158" width="600" height="10" fill="#ffffff"/><rect x="0" y="190" width="600" height="9" fill="#ffffff"/><rect x="0" y="199" width="600" height="8" fill="#ffffff"/><rect x="113" y="0" width="8" height="300" fill="#ffffff"/><rect x="391" y="0" width="10" height="300" fill="#ffffff"/><rect x="243" y="0" width="7" height="300" fill="#ffffff"/><rect x="224" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="48" y="36" width="44" height="36" fill="#dfe3e1"/><rect x="54" y="191" width="77" height="32" fill="#dfe3e1"/><rect x="297" y="137" width="61" height="31" fill="#dfe3e1"/><rect x="254" y="171" width="79" height="65" fill="#dfe3e1"/><rect x="380" y="123" width="66" height="41" fill="#dfe3e1"/><rect x="393" y="217" width="48" height="41" fill="#dfe3e1"/><rect x="331" y="192" width="87" height="39" fill="#dfe3e1"/><rect x="117" y="158" width="69" height="39" fill="#dfe3e1"/><rect x="335" y="150" width="56" height="62" fill="#dfe3e1"/><rect x="229" y="56" width="73" height="38" fill="#dfe3e1"/><rect x="293" y="210" width="67" height="35" fill="#dfe3e1"/><rect x="260" y="67" width="80" height="53" fill="#dfe3e1"/><rect x="170" y="50" width="83" height="39" fill="#dfe3e1"/><rect x="51" y="137" width="49" height="44" fill="#dfe3e1"/><rect x="0" y="191" width="600" height="11" fill="#ffffff"/><rect x="0" y="191" width="600" height="13" fill="#ffffff"/><rect x="0" y="214" width="600" height="12" fill="#ffffff"/><rect x="0" y="88" width="600" height="9" fill="#ffffff"/><rect x="261" y="0" width="7" height="300" fill="#ffffff"/><rect x="327" y="0" width="12" height="300" fill="#ffffff"/><rect x="72" y="0" width="11" height="300" fill="#ffffff"/><rect x="439" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="268" y="173" width="71" height="34" fill="#dfe3e1"/><rect x="0" y="42" width="60" height="56" fill="#dfe3e1"/><rect x="406" y="106" width="45" height="32" fill="#dfe3e1"/><rect x="473" y="105" width="86" height="46" fill="#dfe3e1"/><rect x="184" y="177" width="51" height="44" fill="#dfe3e1"/><rect x="137" y="52" width="48" height="49" fill="#dfe3e1"/><rect x="426" y="202" width="87" height="45" fill="#dfe3e1"/><rect x="297" y="107" width="66" height="45" fill="#dfe3e1"/><rect x="426" y="104" width="47" height="51" fill="#dfe3e1"/><rect x="202" y="0" width="47" height="62" fill="#dfe3e1"/><rect x="158" y="44" width="86" height="44" fill="#dfe3e1"/><rect x="4" y="94" width="44" height="57" fill="#dfe3e1"/><rect x="401" y="187" width="72" height="59" fill="#dfe3e1"/><rect x="75" y="209" width="53" height="30" fill="#dfe3e1"/><rect x="0" y="239" width="600" height="11" fill="#ffffff"/><rect x="0" y="214" width="600" height="9" fill="#ffffff"/><rect x="0" y="229" width="600" height="8" fill="#ffffff"/><rect x="0" y="229" width="600" height="12" fill="#ffffff"/><rect x="355" y="0" width="10" height="300" fill="#ffffff"/><rect x="180" y="0" width="10" height="300" fill="#ffffff"/><rect x="573" y="0" width="10" height="300" fill="#ffffff"/><rect x="177" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="227" width="600" height="300" fill="#c8d9e4"/><rect x="289" y="36" width="44" height="52" fill="#dfe3e1"/><rect x="257" y="15" width="58" height="49" fill="#dfe3e1"/><rect x="58" y="14" width="42" height="50" fill="#dfe3e1"/><rect x="172" y="221" width="81" height="30" fill="#dfe3e1"/><rect x="363" y="23" width="88" height="52" fill="#dfe3e1"/><rect x="433" y="41" width="74" height="48" fill="#dfe3e1"/><rect x="425" y="105" width="70" height="46" fill="#dfe3e1"/><rect x="463" y="46" width="87" height="32" fill="#dfe3e1"/><rect x="299" y="215" width="44" height="44" fill="#dfe3e1"/><rect x="276" y="76" width="57" height="63" fill="#dfe3e1"/><rect x="205" y="142" width="80" height="45" fill="#dfe3e1"/><rect x="415" y="152" width="61" height="35" fill="#dfe3e1"/><rect x="27" y="36" width="76" height="34" fill="#dfe3e1"/><rect x="211" y="169" width="43" height="65" fill="#dfe3e1"/><rect x="0" y="154" width="600" height="9" fill="#ffffff"/><rect x="0" y="156" width="600" height="8" fill="#ffffff"/><rect x="0" y="138" width="600" height="10" fill="#ffffff"/><rect x="0" y="34" width="600" height="7" fill="#ffffff"/><rect x="354" y="0" width="8" height="300" fill="#ffffff"/><rect x="401" y="0" width="12" height="300" fill="#ffffff"/><rect x="389" y="0" width="13" height="300" fill="#ffffff"/><rect x="312" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="232" width="600" height="300" fill="#c8d9e4"/><rect x="140" y="22" width="46" height="46" fill="#dfe3e1"/><rect x="231" y="217" width="72" height="32" fill="#dfe3e1"/><rect x="60" y="182" width="43" height="37" fill="#dfe3e1"/><rect x="83" y="226" width="70" height="45" fill="#dfe3e1"/><rect x="456" y="72" width="78" height="31" fill="#dfe3e1"/><rect x="208" y="114" width="61" height="56" fill="#dfe3e1"/><rect x="163" y="216" width="52" height="37" fill="#dfe3e1"/><rect x="335" y="21" width="57" height="31" fill="#dfe3e1"/><rect x="313" y="73" width="80" height="41" fill="#dfe3e1"/><rect x="304" y="55" width="66" height="35" fill="#dfe3e1"/><rect x="436" y="165" width="82" height="48" fill="#dfe3e1"/><rect x="4" y="218" width="42" height="32" fill="#dfe3e1"/><rect x="452" y="87" width="70" height="62" fill="#dfe3e1"/><rect x="443" y="51" width="51" height="48" fill="#dfe3e1"/><rect x="0" y="189" width="600" height="11" fill="#ffffff"/><rect x="0" y="67" width="600" height="13" fill="#ffffff"/><rect x="0" y="135" width="600" height="12" fill="#ffffff"/><rect x="0" y="101" width="600" height="11" fill="#ffffff"/><rect x="135" y="0" width="11" height="300" fill="#ffffff"/><rect x="233" y="0" width="8" height="300" fill="#ffffff"/><rect x="238" y="0" width="7" height="300" fill="#ffffff"/><rect x="246" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="370" y="88" width="46" height="42" fill="#dfe3e1"/><rect x="67" y="224" width="62" height="36" fill="#dfe3e1"/><rect x="501" y="85" width="59" height="48" fill="#dfe3e1"/><rect x="370" y="130" width="51" height="31" fill="#dfe3e1"/><rect x="484" y="63" width="82" height="54" fill="#dfe3e1"/><rect x="250" y="42" width="78" height="42" fill="#dfe3e1"/><rect x="177" y="203" width="72" height="55" fill="#dfe3e1"/><rect x="114" y="132" width="67" height="43" fill="#dfe3e1"/><rect x="48" y="218" width="41" height="53" fill="#dfe3e1"/><rect x="130" y="131" width="67" height="66" fill="#dfe3e1"/><rect x="126" y="139" width="58" height="37" fill="#dfe3e1"/><rect x="220" y="190" width="86" height="64" fill="#dfe3e1"/><rect x="33" y="95" width="84" height="35" fill="#dfe3e1"/><rect x="400" y="193" width="79" height="62" fill="#dfe3e1"/><rect x="0" y="176" width="600" height="11" fill="#ffffff"/><rect x="0" y="156" width="600" height="8" fill="#ffffff"/><rect x="0" y="128" width="600" height="8" fill="#ffffff"/><rect x="0" y="135" width="600" height="8" fill="#ffffff"/><rect x="231" y="0" width="12" height="300" fill="#ffffff"/><rect x="35" y="0" width="8" height="300" fill="#ffffff"/><rect x="134" y="0" width="10" height="300" fill="#ffffff"/><rect x="378" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="201" width="600" height="300" fill="#c8d9e4"/><rect x="228" y="37" width="56" height="36" fill="#dfe3e1"/><rect x="87" y="184" width="55" height="47" fill="#dfe3e1"/><rect x="486" y="74" width="44" height="31" fill="#dfe3e1"/><rect x="498" y="47" width="67" height="48" fill="#dfe3e1"/><rect x="440" y="230" width="64" height="30" fill="#dfe3e1"/><rect x="359" y="53" width="74" height="58" fill="#dfe3e1"/><rect x="301" y="161" width="77" height="50" fill="#dfe3e1"/><rect x="65" y="24" width="51" height="33" fill="#dfe3e1"/><rect x="477" y="70" width="53" height="36" fill="#dfe3e1"/><rect x="472" y="54" width="77" height="38" fill="#dfe3e1"/><rect x="340" y="95" width="57" height="54" fill="#dfe3e1"/><rect x="338" y="113" width="71" height="48" fill="#dfe3e1"/><rect x="149" y="90" width="72" height="37" fill="#dfe3e1"/><rect x="9" y="45" width="82" height="62" fill="#dfe3e1"/><rect x="0" y="53" width="600" height="7" fill="#ffffff"/><rect x="0" y="123" width="600" height="11" fill="#ffffff"/><rect x="0" y="143" width="600" height="13" fill="#ffffff"/><rect x="0" y="156" width="600" height="8" fill="#ffffff"/><rect x="82" y="0" width="13" height="300" fill="#ffffff"/><rect x="492" y="0" width="11" height="300" fill="#ffffff"/><rect x="326" y="0" width="11" height="300" fill="#ffffff"/><rect x="379" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="247" width="600" height="300" fill="#c8d9e4"/><rect x="181" y="33" width="50" height="54" fill="#dfe3e1"/><rect x="21" y="21" width="60" height="50" fill="#dfe3e1"/><rect x="151" y="55" width="78" height="39" fill="#dfe3e1"/><rect x="342" y="135" width="76" height="36" fill="#dfe3e1"/><rect x="468" y="162" width="50" height="40" fill="#dfe3e1"/><rect x="104" y="123" width="40" height="37" fill="#dfe3e1"/><rect x="128" y="162" width="81" height="43" fill="#dfe3e1"/><rect x="25" y="189" width="49" height="52" fill="#dfe3e1"/><rect x="15" y="70" width="58" height="56" fill="#dfe3e1"/><rect x="243" y="101" width="55" height="55" fill="#dfe3e1"/><rect x="419" y="38" width="62" height="36" fill="#dfe3e1"/><rect x="35" y="79" width="49" height="30" fill="#dfe3e1"/><rect x="340" y="82" width="76" height="47" fill="#dfe3e1"/><rect x="27" y="19" width="47" height="61" fill="#dfe3e1"/><rect x="0" y="46" width="600" height="10" fill="#ffffff"/><rect x="0" y="187" width="600" height="7" fill="#ffffff"/><rect x="0" y="191" width="600" height="7" fill="#ffffff"/><rect x="0" y="268" width="600" height="8" fill="#ffffff"/><rect x="370" y="0" width="11" height="300" fill="#ffffff"/><rect x="194" y="0" width="7" height="300" fill="#ffffff"/><rect x="276" y="0" width="8" height="300" fill="#ffffff"/><rect x="552" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="237" width="600" height="300" fill="#c8d9e4"/><rect x="56" y="64" width="78" height="48" fill="#dfe3e1"/><rect x="352" y="89" width="46" height="43" fill="#dfe3e1"/><rect x="429" y="75" width="59" height="65" fill="#dfe3e1"/><rect x="143" y="86" width="59" height="59" fill="#dfe3e1"/><rect x="337" y="83" width="43" height="32" fill="#dfe3e1"/><rect x="258" y="32" width="74" height="41" fill="#dfe3e1"/><rect x="177" y="152" width="46" height="47" fill="#dfe3e1"/><rect x="216" y="76" width="73" height="34" fill="#dfe3e1"/><rect x="118" y="26" width="58" height="43" fill="#dfe3e1"/><rect x="16" y="100" width="79" height="62" fill="#dfe3e1"/><rect x="178" y="55" width="72" height="46" fill="#dfe3e1"/><rect x="338" y="228" width="70" height="31" fill="#dfe3e1"/><rect x="438" y="87" width="81" height="45" fill="#dfe3e1"/><rect x="483" y="81" width="62" height="49" fill="#dfe3e1"/><rect x="0" y="180" width="600" height="8" fill="#ffffff"/><rect x="0" y="124" width="600" height="12" fill="#ffffff"/><rect x="0" y="249" width="600" height="13" fill="#ffffff"/><rect x="0" y="173" width="600" height="9" fill="#ffffff"/><rect x="321" y="0" width="10" height="300" fill="#ffffff"/><rect x="102" y="0" width="10" height="300" fill="#ffffff"/><rect x="171" y="0" width="7" height="300" fill="#ffffff"/><rect x="323" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="206" y="51" width="55" height="53" fill="#dfe3e1"/><rect x="132" y="141" width="86" height="37" fill="#dfe3e1"/><rect x="404" y="217" width="46" height="30" fill="#dfe3e1"/><rect x="312" y="187" width="45" height="37" fill="#dfe3e1"/><rect x="378" y="67" width="47" height="31" fill="#dfe3e1"/><rect x="435" y="104" width="64" height="49" fill="#dfe3e1"/><rect x="70" y="146" width="70" height="32" fill="#dfe3e1"/><rect x="492" y="46" width="55" height="57" fill="#dfe3e1"/><rect x="120" y="207" width="54" height="39" fill="#dfe3e1"/><rect x="505" y="230" width="63" height="48" fill="#dfe3e1"/><rect x="277" y="81" width="65" height="32" fill="#dfe3e1"/><rect x="71" y="129" width="53" height="35" fill="#dfe3e1"/><rect x="38" y="200" width="51" height="64" fill="#dfe3e1"/><rect x="507" y="217" width="63" height="44" fill="#dfe3e1"/><rect x="0" y="160" width="600" height="13" fill="#ffffff"/><rect x="0" y="64" width="600" height="9" fill="#ffffff"/><rect x="0" y="200" width="600" height="10" fill="#ffffff"/><rect x="0" y="232" width="600" height="9" fill="#ffffff"/><rect x="210" y="0" width="13" height="300" fill="#ffffff"/><rect x="83" y="0" width="11" height="300" fill="#ffffff"/><rect x="62" y="0" width="12" height="300" fill="#ffffff"/><rect x="345" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="223" width="600" height="300" fill="#c8d9e4"/><rect x="138" y="16" width="66" height="43" fill="#dfe3e1"/><rect x="270" y="13" width="51" height="32" fill="#dfe3e1"/><rect x="344" y="168" width="80" height="35" fill="#dfe3e1"/><rect x="265" y="144" width="65" height="45" fill="#dfe3e1"/><rect x="485" y="158" width="84" height="62" fill="#dfe3e1"/><rect x="130" y="230" width="48" height="45" fill="#dfe3e1"/><rect x="256" y="7" width="61" height="54" fill="#dfe3e1"/><rect x="371" y="126" width="67" height="58" fill="#dfe3e1"/><rect x="36" y="170" width="64" height="48" fill="#dfe3e1"/><rect x="326" y="99" width="85" height="39" fill="#dfe3e1"/><rect x="162" y="96" width="64" height="61" fill="#dfe3e1"/><rect x="501" y="216" width="88" height="58" fill="#dfe3e1"/><rect x="451" y="67" width="49" height="38" fill="#dfe3e1"/><rect x="476" y="208" width="73" height="42" fill="#dfe3e1"/><rect x="0" y="208" width="600" height="12" fill="#ffffff"/><rect x="0" y="91" width="600" height="8" fill="#ffffff"/><rect x="0" y="96" width="600" height="10" fill="#ffffff"/><rect x="0" y="182" width="600" height="12" fill="#ffffff"/><rect x="20" y="0" width="10" height="300" fill="#ffffff"/><rect x="253" y="0" width="10" height="300" fill="#ffffff"/><rect x="90" y="0" width="11" height="300" fill="#ffffff"/><rect x="346" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="135" y="181" width="43" height="61" fill="#dfe3e1"/><rect x="223" y="182" width="53" height="58" fill="#dfe3e1"/><rect x="119" y="194" width="69" height="49" fill="#dfe3e1"/><rect x="229" y="139" width="72" height="54" fill="#dfe3e1"/><rect x="353" y="14" width="74" height="54" fill="#dfe3e1"/><rect x="13" y="78" width="75" height="48" fill="#dfe3e1"/><rect x="245" y="11" width="75" height="52" fill="#dfe3e1"/><rect x="57" y="75" width="68" height="61" fill="#dfe3e1"/><rect x="58" y="199" width="53" height="56" fill="#dfe3e1"/><rect x="252" y="17" width="81" height="31" fill="#dfe3e1"/><rect x="147" y="35" width="45" height="42" fill="#dfe3e1"/><rect x="231" y="48" width="52" height="37" fill="#dfe3e1"/><rect x="101" y="76" width="67" height="38" fill="#dfe3e1"/><rect x="166" y="228" width="61" height="45" fill="#dfe3e1"/><rect x="0" y="49" width="600" height="12" fill="#ffffff"/><rect x="0" y="55" width="600" height="9" fill="#ffffff"/><rect x="0" y="250" width="600" height="7" fill="#ffffff"/><rect x="0" y="90" width="600" height="10" fill="#ffffff"/><rect x="210" y="0" width="11" height="300" fill="#ffffff"/><rect x="64" y="0" width="11" height="300" fill="#ffffff"/><rect x="443" y="0" width="9" height="300" fill="#ffffff"/><rect x="362" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="62" y="136" width="78" height="35" fill="#dfe3e1"/><rect x="137" y="145" width="41" height="38" fill="#dfe3e1"/><rect x="14" y="119" width="51" height="39" fill="#dfe3e1"/><rect x="139" y="97" width="82" height="64" fill="#dfe3e1"/><rect x="20" y="164" width="53" height="52" fill="#dfe3e1"/><rect x="339" y="197" width="68" height="44" fill="#dfe3e1"/><rect x="252" y="195" width="49" height="38" fill="#dfe3e1"/><rect x="433" y="183" width="49" height="50" fill="#dfe3e1"/><rect x="54" y="140" width="55" height="62" fill="#dfe3e1"/><rect x="221" y="148" width="71" height="43" fill="#dfe3e1"/><rect x="227" y="70" width="53" height="61" fill="#dfe3e1"/><rect x="133" y="197" width="72" height="55" fill="#dfe3e1"/><rect x="402" y="77" width="42" height="58" fill="#dfe3e1"/><rect x="68" y="214" width="53" height="45" fill="#dfe3e1"/><rect x="0" y="274" width="600" height="12" fill="#ffffff"/><rect x="0" y="86" width="600" height="9" fill="#ffffff"/><rect x="0" y="89" width="600" height="12" fill="#ffffff"/><rect x="0" y="59" width="600" height="12" fill="#ffffff"/><rect x="375" y="0" width="13" height="300" fill="#ffffff"/><rect x="407" y="0" width="11" height="300" fill="#ffffff"/><rect x="166" y="0" width="7" height="300" fill="#ffffff"/><rect x="394" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="169" y="7" width="63" height="37" fill="#dfe3e1"/><rect x="390" y="111" width="56" height="47" fill="#dfe3e1"/><rect x="341" y="105" width="53" height="40" fill="#dfe3e1"/><rect x="419" y="51" width="71" height="45" fill="#dfe3e1"/><rect x="450" y="214" width="62" height="44" fill="#dfe3e1"/><rect x="245" y="224" width="74" height="60" fill="#dfe3e1"/><rect x="389" y="74" width="62" height="63" fill="#dfe3e1"/><rect x="48" y="12" width="83" height="35" fill="#dfe3e1"/><rect x="122" y="203" width="85" height="65" fill="#dfe3e1"/><rect x="150" y="162" width="74" height="49" fill="#dfe3e1"/><rect x="157" y="153" width="65" height="64" fill="#dfe3e1"/><rect x="233" y="107" width="79" height="40" fill="#dfe3e1"/><rect x="449" y="79" width="81" height="35" fill="#dfe3e1"/><rect x="171" y="4" width="79" height="66" fill="#dfe3e1"/><rect x="0" y="241" width="600" height="10" fill="#ffffff"/><rect x="0" y="78" width="600" height="8" fill="#ffffff"/><rect x="0" y="30" width="600" height="9" fill="#ffffff"/><rect x="0" y="156" width="600" height="13" fill="#ffffff"/><rect x="20" y="0" width="7" height="300" fill="#ffffff"/><rect x="389" y="0" width="12" height="300" fill="#ffffff"/><rect x="217" y="0" width="13" height="300" fill="#ffffff"/><rect x="28" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="360" y="227" width="71" height="64" fill="#dfe3e1"/><rect x="321" y="6" width="44" height="31" fill="#dfe3e1"/><rect x="499" y="174" width="44" height="54" fill="#dfe3e1"/><rect x="90" y="14" width="46" height="57" fill="#dfe3e1"/><rect x="392" y="176" width="71" height="30" fill="#dfe3e1"/><rect x="317" y="6" width="70" height="44" fill="#dfe3e1"/><rect x="467" y="146" width="83" height="33" fill="#dfe3e1"/><rect x="383" y="81" width="43" height="32" fill="#dfe3e1"/><rect x="283" y="88" width="52" height="54" fill="#dfe3e1"/><rect x="410" y="21" width="83" height="61" fill="#dfe3e1"/><rect x="276" y="10" width="49" height="35" fill="#dfe3e1"/><rect x="224" y="100" width="69" height="44" fill="#dfe3e1"/><rect x="84" y="128" width="65" height="33" fill="#dfe3e1"/><rect x="394" y="93" width="73" height="45" fill="#dfe3e1"/><rect x="0" y="141" width="600" height="8" fill="#ffffff"/><rect x="0" y="87" width="600" height="10" fill="#ffffff"/><rect x="0" y="155" width="600" height="10" fill="#ffffff"/><rect x="0" y="80" width="600" height="10" fill="#ffffff"/><rect x="579" y="0" width="8" height="300" fill="#ffffff"/><rect x="408" y="0" width="8" height="300" fill="#ffffff"/><rect x="45" y="0" width="7" height="300" fill="#ffffff"/><rect x="123" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="211" y="4" width="54" height="47" fill="#dfe3e1"/><rect x="66" y="26" width="53" height="52" fill="#dfe3e1"/><rect x="174" y="117" width="43" height="53" fill="#dfe3e1"/><rect x="3" y="83" width="41" height="62" fill="#dfe3e1"/><rect x="400" y="208" width="81" height="42" fill="#dfe3e1"/><rect x="451" y="67" width="43" height="47" fill="#dfe3e1"/><rect x="433" y="134" width="58" height="47" fill="#dfe3e1"/><rect x="495" y="0" width="75" height="45" fill="#dfe3e1"/><rect x="500" y="181" width="72" height="32" fill="#dfe3e1"/><rect x="319" y="66" width="54" height="31" fill="#dfe3e1"/><rect x="473" y="210" width="76" height="46" fill="#dfe3e1"/><rect x="278" y="67" width="88" height="40" fill="#dfe3e1"/><rect x="494" y="95" width="88" height="60" fill="#dfe3e1"/><rect x="366" y="186" width="53" height="62" fill="#dfe3e1"/><rect x="0" y="183" width="600" height="11" fill="#ffffff"/><rect x="0" y="154" width="600" height="10" fill="#ffffff"/><rect x="0" y="183" width="600" height="7" fill="#ffffff"/><rect x="0" y="266" width="600" height="12" fill="#ffffff"/><rect x="212" y="0" width="13" height="300" fill="#ffffff"/><rect x="289" y="0" width="12" height="300" fill="#ffffff"/><rect x="308" y="0" width="10" height="300" fill="#ffffff"/><rect x="233" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="131" y="66" width="80" height="63" fill="#dfe3e1"/><rect x="499" y="102" width="61" height="63" fill="#dfe3e1"/><rect x="304" y="3" width="63" height="37" fill="#dfe3e1"/><rect x="291" y="187" width="72" height="48" fill="#dfe3e1"/><rect x="302" y="18" width="57" height="60" fill="#dfe3e1"/><rect x="158" y="218" width="82" height="34" fill="#dfe3e1"/><rect x="443" y="97" width="40" height="55" fill="#dfe3e1"/><rect x="225" y="26" width="42" height="33" fill="#dfe3e1"/><rect x="503" y="76" width="51" height="60" fill="#dfe3e1"/><rect x="159" y="49" width="66" height="55" fill="#dfe3e1"/><rect x="369" y="24" width="47" height="50" fill="#dfe3e1"/><rect x="372" y="5" width="79" height="64" fill="#dfe3e1"/><rect x="237" y="108" width="47" height="66" fill="#dfe3e1"/><rect x="147" y="148" width="42" height="48" fill="#dfe3e1"/><rect x="0" y="75" width="600" height="12" fill="#ffffff"/><rect x="0" y="69" width="600" height="8" fill="#ffffff"/><rect x="0" y="150" width="600" height="7" fill="#ffffff"/><rect x="0" y="103" width="600" height="8" fill="#ffffff"/><rect x="502" y="0" width="11" height="300" fill="#ffffff"/><rect x="517" y="0" width="10" height="300" fill="#ffffff"/><rect x="481" y="0" width="8" height="300" fill="#ffffff"/><rect x="20" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="361" y="37" width="69" height="64" fill="#dfe3e1"/><rect x="261" y="16" width="44" height="57" fill="#dfe3e1"/><rect x="346" y="227" width="53" height="51" fill="#dfe3e1"/><rect x="215" y="109" width="43" height="49" fill="#dfe3e1"/><rect x="74" y="22" width="56" height="36" fill="#dfe3e1"/><rect x="220" y="74" width="47" height="36" fill="#dfe3e1"/><rect x="267" y="73" width="76" height="47" fill="#dfe3e1"/><rect x="150" y="57" width="76" height="36" fill="#dfe3e1"/><rect x="232" y="130" width="41" height="40" fill="#dfe3e1"/><rect x="366" y="45" width="61" height="33" fill="#dfe3e1"/><rect x="369" y="132" width="79" height="65" fill="#dfe3e1"/><rect x="234" y="134" width="82" height="57" fill="#dfe3e1"/><rect x="150" y="59" width="78" height="36" fill="#dfe3e1"/><rect x="108" y="161" width="45" height="66" fill="#dfe3e1"/><rect x="0" y="230" width="600" height="11" fill="#ffffff"/><rect x="0" y="220" width="600" height="12" fill="#ffffff"/><rect x="0" y="48" width="600" height="9" fill="#ffffff"/><rect x="0" y="51" width="600" height="7" fill="#ffffff"/><rect x="467" y="0" width="9" height="300" fill="#ffffff"/><rect x="423" y="0" width="11" height="300" fill="#ffffff"/><rect x="111" y="0" width="12" height="300" fill="#ffffff"/><rect x="274" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="478" y="147" width="43" height="48" fill="#dfe3e1"/><rect x="483" y="75" width="52" height="30" fill="#dfe3e1"/><rect x="412" y="34" width="70" height="49" fill="#dfe3e1"/><rect x="32" y="64" width="76" height="39" fill="#dfe3e1"/><rect x="502" y="122" width="88" height="54" fill="#dfe3e1"/><rect x="33" y="225" width="87" height="63" fill="#dfe3e1"/><rect x="50" y="169" width="72" height="55" fill="#dfe3e1"/><rect x="164" y="90" width="82" height="50" fill="#dfe3e1"/><rect x="510" y="127" width="46" height="60" fill="#dfe3e1"/><rect x="367" y="225" width="64" height="43" fill="#dfe3e1"/><rect x="332" y="172" width="82" height="45" fill="#dfe3e1"/><rect x="0" y="112" width="86" height="65" fill="#dfe3e1"/><rect x="231" y="7" width="48" height="38" fill="#dfe3e1"/><rect x="495" y="171" width="64" height="57" fill="#dfe3e1"/><rect x="0" y="39" width="600" height="9" fill="#ffffff"/><rect x="0" y="222" width="600" height="11" fill="#ffffff"/><rect x="0" y="96" width="600" height="7" fill="#ffffff"/><rect x="0" y="122" width="600" height="7" fill="#ffffff"/><rect x="270" y="0" width="12" height="300" fill="#ffffff"/><rect x="249" y="0" width="10" height="300" fill="#ffffff"/><rect x="227" y="0" width="8" height="300" fill="#ffffff"/><rect x="183" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="416" y="78" width="48" height="38" fill="#dfe3e1"/><rect x="164" y="221" width="52" height="50" fill="#dfe3e1"/><rect x="423" y="177" width="59" height="49" fill="#dfe3e1"/><rect x="361" y="133" width="66" height="47" fill="#dfe3e1"/><rect x="206" y="173" width="66" height="43" fill="#dfe3e1"/><rect x="193" y="174" width="51" height="33" fill="#dfe3e1"/><rect x="86" y="9" width="53" height="48" fill="#dfe3e1"/><rect x="421" y="125" width="67" height="37" fill="#dfe3e1"/><rect x="320" y="87" width="70" height="53" fill="#dfe3e1"/><rect x="229" y="87" width="48" height="41" fill="#dfe3e1"/><rect x="322" y="195" width="87" height="43" fill="#dfe3e1"/><rect x="0" y="61" width="66" height="38" fill="#dfe3e1"/><rect x="99" y="112" width="58" height="39" fill="#dfe3e1"/><rect x="359" y="30" width="86" height="30" fill="#dfe3e1"/><rect x="0" y="263" width="600" height="9" fill="#ffffff"/><rect x="0" y="212" width="600" height="8" fill="#ffffff"/><rect x="0" y="241" width="600" height="11" fill="#ffffff"/><rect x="0" y="31" width="600" height="9" fill="#ffffff"/><rect x="198" y="0" width="10" height="300" fill="#ffffff"/><rect x="47" y="0" width="12" height="300" fill="#ffffff"/><rect x="488" y="0" width="10" height="300" fill="#ffffff"/><rect x="139" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="50" y="195" width="58" height="66" fill="#dfe3e1"/><rect x="263" y="89" width="51" height="56" fill="#dfe3e1"/><rect x="419" y="56" width="83" height="56" fill="#dfe3e1"/><rect x="146" y="40" width="86" height="36" fill="#dfe3e1"/><rect x="160" y="148" width="59" height="43" fill="#dfe3e1"/><rect x="190" y="31" width="78" height="35" fill="#dfe3e1"/><rect x="510" y="221" width="68" height="64" fill="#dfe3e1"/><rect x="12" y="104" width="57" height="47" fill="#dfe3e1"/><rect x="61" y="124" width="74" height="58" fill="#dfe3e1"/><rect x="427" y="106" width="41" height="30" fill="#dfe3e1"/><rect x="107" y="125" width="79" height="48" fill="#dfe3e1"/><rect x="435" y="27" width="43" height="55" fill="#dfe3e1"/><rect x="201" y="50" width="51" height="37" fill="#dfe3e1"/><rect x="74" y="176" width="76" height="45" fill="#dfe3e1"/><rect x="0" y="148" width="600" height="11" fill="#ffffff"/><rect x="0" y="115" width="600" height="10" fill="#ffffff"/><rect x="0" y="249" width="600" height="12" fill="#ffffff"/><rect x="0" y="100" width="600" height="9" fill="#ffffff"/><rect x="339" y="0" width="13" height="300" fill="#ffffff"/><rect x="104" y="0" width="12" height="300" fill="#ffffff"/><rect x="488" y="0" width="13" height="300" fill="#ffffff"/><rect x="371" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="324" y="85" width="74" height="55" fill="#dfe3e1"/><rect x="199" y="53" width="45" height="54" fill="#dfe3e1"/><rect x="21" y="100" width="72" height="31" fill="#dfe3e1"/><rect x="455" y="99" width="84" height="35" fill="#dfe3e1"/><rect x="192" y="92" width="78" height="55" fill="#dfe3e1"/><rect x="501" y="74" width="76" height="39" fill="#dfe3e1"/><rect x="296" y="164" width="46" height="61" fill="#dfe3e1"/><rect x="472" y="46" width="72" height="36" fill="#dfe3e1"/><rect x="99" y="178" width="61" height="34" fill="#dfe3e1"/><rect x="413" y="50" width="55" height="30" fill="#dfe3e1"/><rect x="212" y="119" width="55" height="53" fill="#dfe3e1"/><rect x="197" y="70" width="50" height="42" fill="#dfe3e1"/><rect x="1" y="132" width="62" height="53" fill="#dfe3e1"/><rect x="380" y="121" width="67" height="37" fill="#dfe3e1"/><rect x="0" y="258" width="600" height="12" fill="#ffffff"/><rect x="0" y="152" width="600" height="10" fill="#ffffff"/><rect x="0" y="238" width="600" height="8" fill="#ffffff"/><rect x="0" y="175" width="600" height="8" fill="#ffffff"/><rect x="452" y="0" width="7" height="300" fill="#ffffff"/><rect x="175" y="0" width="9" height="300" fill="#ffffff"/><rect x="360" y="0" width="13" height="300" fill="#ffffff"/><rect x="544" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="243" width="600" height="300" fill="#c8d9e4"/><rect x="504" y="43" width="50" height="48" fill="#dfe3e1"/><rect x="418" y="45" width="41" height="41" fill="#dfe3e1"/><rect x="347" y="145" width="49" height="41" fill="#dfe3e1"/><rect x="501" y="47" width="84" height="35" fill="#dfe3e1"/><rect x="23" y="165" width="48" height="60" fill="#dfe3e1"/><rect x="145" y="114" width="45" height="41" fill="#dfe3e1"/><rect x="345" y="164" width="51" height="61" fill="#dfe3e1"/><rect x="305" y="67" width="74" height="37" fill="#dfe3e1"/><rect x="127" y="82" width="55" height="55" fill="#dfe3e1"/><rect x="418" y="131" width="68" height="38" fill="#dfe3e1"/><rect x="329" y="226" width="47" height="39" fill="#dfe3e1"/><rect x="422" y="10" width="75" height="39" fill="#dfe3e1"/><rect x="21" y="204" width="45" height="62" fill="#dfe3e1"/><rect x="107" y="178" width="65" height="42" fill="#dfe3e1"/><rect x="0" y="88" width="600" height="10" fill="#ffffff"/><rect x="0" y="201" width="600" height="12" fill="#ffffff"/><rect x="0" y="184" width="600" height="13" fill="#ffffff"/><rect x="0" y="220" width="600" height="8" fill="#ffffff"/><rect x="102" y="0" width="11" height="300" fill="#ffffff"/><rect x="396" y="0" width="13" height="300" fill="#ffffff"/><rect x="321" y="0" width="11" height="300" fill="#ffffff"/><rect x="404" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="238" y="175" width="87" height="45" fill="#dfe3e1"/><rect x="484" y="77" width="70" height="64" fill="#dfe3e1"/><rect x="174" y="6" width="62" height="63" fill="#dfe3e1"/><rect x="118" y="8" width="60" height="44" fill="#dfe3e1"/><rect x="274" y="40" width="69" height="37" fill="#dfe3e1"/><rect x="234" y="135" width="83" height="63" fill="#dfe3e1"/><rect x="439" y="222" width="77" height="62" fill="#dfe3e1"/><rect x="343" y="187" width="71" height="42" fill="#dfe3e1"/><rect x="368" y="171" width="56" height="62" fill="#dfe3e1"/><rect x="335" y="153" width="49" height="31" fill="#dfe3e1"/><rect x="388" y="62" width="43" height="42" fill="#dfe3e1"/><rect x="156" y="29" width="56" height="36" fill="#dfe3e1"/><rect x="181" y="61" width="60" height="48" fill="#dfe3e1"/><rect x="339" y="20" width="59" height="45" fill="#dfe3e1"/><rect x="0" y="46" width="600" height="10" fill="#ffffff"/><rect x="0" y="163" width="600" height="9" fill="#ffffff"/><rect x="0" y="245" width="600" height="11" fill="#ffffff"/><rect x="0" y="141" width="600" height="9" fill="#ffffff"/><rect x="289" y="0" width="11" height="300" fill="#ffffff"/><rect x="330" y="0" width="9" height="300" fill="#ffffff"/><rect x="544" y="0" width="11" height="300" fill="#ffffff"/><rect x="300" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="210" y="229" width="61" height="54" fill="#dfe3e1"/><rect x="118" y="172" width="85" height="44" fill="#dfe3e1"/><rect x="254" y="21" width="86" height="42" fill="#dfe3e1"/><rect x="423" y="141" width="59" height="44" fill="#dfe3e1"/><rect x="190" y="164" width="75" height="40" fill="#dfe3e1"/><rect x="295" y="82" width="85" height="49" fill="#dfe3e1"/><rect x="62" y="126" width="75" height="60" fill="#dfe3e1"/><rect x="183" y="41" width="40" height="61" fill="#dfe3e1"/><rect x="220" y="40" width="62" height="60" fill="#dfe3e1"/><rect x="156" y="120" width="77" height="31" fill="#dfe3e1"/><rect x="301" y="180" width="69" height="52" fill="#dfe3e1"/><rect x="447" y="184" width="69" height="40" fill="#dfe3e1"/><rect x="83" y="95" width="56" height="55" fill="#dfe3e1"/><rect x="374" y="124" width="59" height="47" fill="#dfe3e1"/><rect x="0" y="85" width="600" height="13" fill="#ffffff"/><rect x="0" y="199" width="600" height="8" fill="#ffffff"/><rect x="0" y="177" width="600" height="8" fill="#ffffff"/><rect x="0" y="183" width="600" height="13" fill="#ffffff"/><rect x="335" y="0" width="10" height="300" fill="#ffffff"/><rect x="536" y="0" width="12" height="300" fill="#ffffff"/><rect x="534" y="0" width="13" height="300" fill="#ffffff"/><rect x="162" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="210" width="600" height="300" fill="#c8d9e4"/><rect x="148" y="131" width="42" height="43" fill="#dfe3e1"/><rect x="326" y="119" width="61" height="54" fill="#dfe3e1"/><rect x="81" y="112" width="79" height="37" fill="#dfe3e1"/><rect x="145" y="111" width="54" height="33" fill="#dfe3e1"/><rect x="299" y="18" width="48" height="47" fill="#dfe3e1"/><rect x="127" y="173" width="44" height="58" fill="#dfe3e1"/><rect x="27" y="145" width="85" height="54" fill="#dfe3e1"/><rect x="494" y="201" width="68" height="63" fill="#dfe3e1"/><rect x="25" y="98" width="76" height="63" fill="#dfe3e1"/><rect x="456" y="108" width="55" height="53" fill="#dfe3e1"/><rect x="245" y="131" width="42" height="61" fill="#dfe3e1"/><rect x="44" y="142" width="51" height="38" fill="#dfe3e1"/><rect x="305" y="10" width="60" height="42" fill="#dfe3e1"/><rect x="31" y="228" width="44" height="43" fill="#dfe3e1"/><rect x="0" y="245" width="600" height="8" fill="#ffffff"/><rect x="0" y="47" width="600" height="11" fill="#ffffff"/><rect x="0" y="266" width="600" height="10" fill="#ffffff"/><rect x="0" y="186" width="600" height="12" fill="#ffffff"/><rect x="379" y="0" width="13" height="300" fill="#ffffff"/><rect x="391" y="0" width="9" height="300" fill="#ffffff"/><rect x="260" y="0" width="7" height="300" fill="#ffffff"/><rect x="368" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="97" y="105" width="40" height="39" fill="#dfe3e1"/><rect x="137" y="63" width="56" height="62" fill="#dfe3e1"/><rect x="394" y="73" width="41" height="64" fill="#dfe3e1"/><rect x="380" y="14" width="88" height="58" fill="#dfe3e1"/><rect x="78" y="222" width="65" height="33" fill="#dfe3e1"/><rect x="77" y="228" width="79" height="59" fill="#dfe3e1"/><rect x="400" y="205" width="47" height="58" fill="#dfe3e1"/><rect x="205" y="18" width="45" height="58" fill="#dfe3e1"/><rect x="390" y="61" width="62" height="52" fill="#dfe3e1"/><rect x="388" y="154" width="79" height="49" fill="#dfe3e1"/><rect x="432" y="171" width="55" height="43" fill="#dfe3e1"/><rect x="345" y="157" width="69" height="41" fill="#dfe3e1"/><rect x="432" y="70" width="42" height="47" fill="#dfe3e1"/><rect x="454" y="154" width="60" height="65" fill="#dfe3e1"/><rect x="0" y="38" width="600" height="13" fill="#ffffff"/><rect x="0" y="24" width="600" height="11" fill="#ffffff"/><rect x="0" y="137" width="600" height="11" fill="#ffffff"/><rect x="0" y="64" width="600" height="13" fill="#ffffff"/><rect x="369" y="0" width="8" height="300" fill="#ffffff"/><rect x="130" y="0" width="10" height="300" fill="#ffffff"/><rect x="311" y="0" width="11" height="300" fill="#ffffff"/><rect x="514" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="195" width="600" height="300" fill="#c8d9e4"/><rect x="183" y="156" width="55" height="63" fill="#dfe3e1"/><rect x="24" y="90" width="40" height="64" fill="#dfe3e1"/><rect x="409" y="97" width="43" height="42" fill="#dfe3e1"/><rect x="500" y="100" width="47" height="38" fill="#dfe3e1"/><rect x="95" y="157" width="51" height="60" fill="#dfe3e1"/><rect x="342" y="135" width="49" height="41" fill="#dfe3e1"/><rect x="388" y="165" width="75" height="43" fill="#dfe3e1"/><rect x="83" y="26" width="40" height="53" fill="#dfe3e1"/><rect x="498" y="23" width="74" height="49" fill="#dfe3e1"/><rect x="311" y="19" width="51" height="31" fill="#dfe3e1"/><rect x="109" y="154" width="79" height="59" fill="#dfe3e1"/><rect x="194" y="218" width="63" height="39" fill="#dfe3e1"/><rect x="154" y="9" width="45" height="46" fill="#dfe3e1"/><rect x="154" y="57" width="80" height="53" fill="#dfe3e1"/><rect x="0" y="94" width="600" height="9" fill="#ffffff"/><rect x="0" y="136" width="600" height="8" fill="#ffffff"/><rect x="0" y="91" width="600" height="10" fill="#ffffff"/><rect x="0" y="29" width="600" height="8" fill="#ffffff"/><rect x="161" y="0" width="12" height="300" fill="#ffffff"/><rect x="343" y="0" width="10" height="300" fill="#ffffff"/><rect x="29" y="0" width="9" height="300" fill="#ffffff"/><rect x="120" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="484" y="177" width="84" height="48" fill="#dfe3e1"/><rect x="138" y="12" width="53" height="55" fill="#dfe3e1"/><rect x="138" y="133" width="68" height="63" fill="#dfe3e1"/><rect x="91" y="93" width="54" height="40" fill="#dfe3e1"/><rect x="117" y="156" width="48" height="51" fill="#dfe3e1"/><rect x="406" y="61" width="72" height="48" fill="#dfe3e1"/><rect x="231" y="48" width="83" height="37" fill="#dfe3e1"/><rect x="428" y="147" width="51" height="59" fill="#dfe3e1"/><rect x="357" y="166" width="52" height="30" fill="#dfe3e1"/><rect x="4" y="157" width="66" height="30" fill="#dfe3e1"/><rect x="127" y="174" width="71" height="33" fill="#dfe3e1"/><rect x="249" y="24" width="71" height="61" fill="#dfe3e1"/><rect x="240" y="40" width="83" height="37" fill="#dfe3e1"/><rect x="279" y="188" width="66" height="64" fill="#dfe3e1"/><rect x="0" y="203" width="600" height="10" fill="#ffffff"/><rect x="0" y="140" width="600" height="8" fill="#ffffff"/><rect x="0" y="269" width="600" height="9" fill="#ffffff"/><rect x="0" y="25" width="600" height="9" fill="#ffffff"/><rect x="264" y="0" width="13" height="300" fill="#ffffff"/><rect x="550" y="0" width="9" height="300" fill="#ffffff"/><rect x="370" y="0" width="7" height="300" fill="#ffffff"/><rect x="102" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="234" width="600" height="300" fill="#c8d9e4"/><rect x="10" y="125" width="85" height="62" fill="#dfe3e1"/><rect x="9" y="201" width="68" height="48" fill="#dfe3e1"/><rect x="49" y="202" width="46" height="30" fill="#dfe3e1"/><rect x="510" y="166" width="50" height="32" fill="#dfe3e1"/><rect x="191" y="218" width="72" height="64" fill="#dfe3e1"/><rect x="14" y="29" width="64" height="34" fill="#dfe3e1"/><rect x="2" y="120" width="81" height="45" fill="#dfe3e1"/><rect x="110" y="77" width="58" height="48" fill="#dfe3e1"/><rect x="247" y="92" width="48" height="58" fill="#dfe3e1"/><rect x="319" y="164" width="78" height="40" fill="#dfe3e1"/><rect x="69" y="154" width="48" height="51" fill="#dfe3e1"/><rect x="243" y="176" width="45" height="41" fill="#dfe3e1"/><rect x="355" y="50" width="84" height="61" fill="#dfe3e1"/><rect x="485" y="139" width="83" height="65" fill="#dfe3e1"/><rect x="0" y="271" width="600" height="10" fill="#ffffff"/><rect x="0" y="263" width="600" height="9" fill="#ffffff"/><rect x="0" y="280" width="600" height="7" fill="#ffffff"/><rect x="0" y="218" width="600" height="9" fill="#ffffff"/><rect x="93" y="0" width="11" height="300" fill="#ffffff"/><rect x="298" y="0" width="12" height="300" fill="#ffffff"/><rect x="253" y="0" width="11" height="300" fill="#ffffff"/><rect x="72" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="284" y="188" width="54" height="54" fill="#dfe3e1"/><rect x="256" y="203" width="60" height="44" fill="#dfe3e1"/><rect x="482" y="88" width="51" height="54" fill="#dfe3e1"/><rect x="156" y="123" width="65" height="54" fill="#dfe3e1"/><rect x="133" y="219" width="52" height="51" fill="#dfe3e1"/><rect x="10" y="181" width="68" height="49" fill="#dfe3e1"/><rect x="432" y="74" width="83" height="53" fill="#dfe3e1"/><rect x="158" y="78" width="50" height="62" fill="#dfe3e1"/><rect x="78" y="140" width="78" height="59" fill="#dfe3e1"/><rect x="420" y="149" width="48" height="42" fill="#dfe3e1"/><rect x="359" y="207" width="48" height="63" fill="#dfe3e1"/><rect x="457" y="96" width="58" height="58" fill="#dfe3e1"/><rect x="101" y="46" width="45" height="42" fill="#dfe3e1"/><rect x="31" y="26" width="54" height="65" fill="#dfe3e1"/><rect x="0" y="188" width="600" height="13" fill="#ffffff"/><rect x="0" y="253" width="600" height="11" fill="#ffffff"/><rect x="0" y="27" width="600" height="11" fill="#ffffff"/><rect x="0" y="83" width="600" height="13" fill="#ffffff"/><rect x="473" y="0" width="8" height="300" fill="#ffffff"/><rect x="25" y="0" width="7" height="300" fill="#ffffff"/><rect x="195" y="0" width="13" height="300" fill="#ffffff"/><rect x="57" y="0" width="12" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="98" y="208" width="82" height="37" fill="#dfe3e1"/><rect x="207" y="22" width="78" height="31" fill="#dfe3e1"/><rect x="440" y="225" width="65" height="30" fill="#dfe3e1"/><rect x="243" y="120" width="52" height="50" fill="#dfe3e1"/><rect x="0" y="64" width="81" height="49" fill="#dfe3e1"/><rect x="470" y="201" width="70" height="58" fill="#dfe3e1"/><rect x="312" y="227" width="53" height="35" fill="#dfe3e1"/><rect x="230" y="227" width="68" height="48" fill="#dfe3e1"/><rect x="368" y="122" width="74" height="62" fill="#dfe3e1"/><rect x="358" y="107" width="82" height="54" fill="#dfe3e1"/><rect x="241" y="38" width="78" height="36" fill="#dfe3e1"/><rect x="427" y="179" width="73" height="52" fill="#dfe3e1"/><rect x="112" y="23" width="40" height="44" fill="#dfe3e1"/><rect x="468" y="165" width="79" height="49" fill="#dfe3e1"/><rect x="0" y="112" width="600" height="9" fill="#ffffff"/><rect x="0" y="32" width="600" height="9" fill="#ffffff"/><rect x="0" y="159" width="600" height="13" fill="#ffffff"/><rect x="0" y="108" width="600" height="8" fill="#ffffff"/><rect x="56" y="0" width="8" height="300" fill="#ffffff"/><rect x="159" y="0" width="11" height="300" fill="#ffffff"/><rect x="352" y="0" width="7" height="300" fill="#ffffff"/><rect x="119" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="395" y="24" width="53" height="51" fill="#dfe3e1"/><rect x="315" y="11" width="40" height="33" fill="#dfe3e1"/><rect x="487" y="228" width="65" height="30" fill="#dfe3e1"/><rect x="100" y="103" width="55" height="35" fill="#dfe3e1"/><rect x="239" y="65" width="72" height="49" fill="#dfe3e1"/><rect x="121" y="45" width="55" height="55" fill="#dfe3e1"/><rect x="104" y="197" width="50" height="44" fill="#dfe3e1"/><rect x="24" y="102" width="53" height="49" fill="#dfe3e1"/><rect x="386" y="7" width="84" height="49" fill="#dfe3e1"/><rect x="458" y="4" width="79" height="43" fill="#dfe3e1"/><rect x="398" y="182" width="80" height="42" fill="#dfe3e1"/><rect x="268" y="152" width="85" height="34" fill="#dfe3e1"/><rect x="131" y="22" width="48" height="63" fill="#dfe3e1"/><rect x="48" y="118" width="88" height="52" fill="#dfe3e1"/><rect x="0" y="105" width="600" height="12" fill="#ffffff"/><rect x="0" y="60" width="600" height="11" fill="#ffffff"/><rect x="0" y="209" width="600" height="11" fill="#ffffff"/><rect x="0" y="100" width="600" height="7" fill="#ffffff"/><rect x="525" y="0" width="11" height="300" fill="#ffffff"/><rect x="520" y="0" width="8" height="300" fill="#ffffff"/><rect x="384" y="0" width="7" height="300" fill="#ffffff"/><rect x="340" y="0" width="11" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="465" y="113" width="61" height="37" fill="#dfe3e1"/><rect x="156" y="207" width="63" height="35" fill="#dfe3e1"/><rect x="496" y="112" width="85" height="30" fill="#dfe3e1"/><rect x="93" y="147" width="59" height="31" fill="#dfe3e1"/><rect x="37" y="184" width="50" height="47" fill="#dfe3e1"/><rect x="497" y="47" width="52" height="32" fill="#dfe3e1"/><rect x="419" y="107" width="50" height="60" fill="#dfe3e1"/><rect x="414" y="24" width="54" height="51" fill="#dfe3e1"/><rect x="81" y="129" width="82" height="41" fill="#dfe3e1"/><rect x="140" y="77" width="77" height="50" fill="#dfe3e1"/><rect x="416" y="54" width="74" height="36" fill="#dfe3e1"/><rect x="376" y="125" width="73" height="55" fill="#dfe3e1"/><rect x="278" y="37" width="57" height="50" fill="#dfe3e1"/><rect x="31" y="78" width="80" height="33" fill="#dfe3e1"/><rect x="0" y="141" width="600" height="8" fill="#ffffff"/><rect x="0" y="248" width="600" height="12" fill="#ffffff"/><rect x="0" y="152" width="600" height="12" fill="#ffffff"/><rect x="0" y="162" width="600" height="8" fill="#ffffff"/><rect x="277" y="0" width="10" height="300" fill="#ffffff"/><rect x="573" y="0" width="8" height="300" fill="#ffffff"/><rect x="208" y="0" width="10" height="300" fill="#ffffff"/><rect x="247" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="202" width="600" height="300" fill="#c8d9e4"/><rect x="136" y="88" width="76" height="41" fill="#dfe3e1"/><rect x="169" y="181" width="84" height="60" fill="#dfe3e1"/><rect x="493" y="225" width="87" height="65" fill="#dfe3e1"/><rect x="298" y="8" width="79" height="34" fill="#dfe3e1"/><rect x="174" y="89" width="60" height="32" fill="#dfe3e1"/><rect x="98" y="199" width="75" height="32" fill="#dfe3e1"/><rect x="267" y="204" width="58" height="65" fill="#dfe3e1"/><rect x="263" y="35" width="78" height="37" fill="#dfe3e1"/><rect x="397" y="125" width="43" height="37" fill="#dfe3e1"/><rect x="447" y="211" width="52" height="42" fill="#dfe3e1"/><rect x="32" y="14" width="78" height="30" fill="#dfe3e1"/><rect x="142" y="217" width="45" height="53" fill="#dfe3e1"/><rect x="446" y="39" width="49" height="51" fill="#dfe3e1"/><rect x="413" y="103" width="86" height="45" fill="#dfe3e1"/><rect x="0" y="218" width="600" height="7" fill="#ffffff"/><rect x="0" y="114" width="600" height="13" fill="#ffffff"/><rect x="0" y="160" width="600" height="11" fill="#ffffff"/><rect x="0" y="97" width="600" height="13" fill="#ffffff"/><rect x="428" y="0" width="7" height="300" fill="#ffffff"/><rect x="218" y="0" width="11" height="300" fill="#ffffff"/><rect x="313" y="0" width="13" height="300" fill="#ffffff"/><rect x="315" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="135" y="133" width="40" height="64" fill="#dfe3e1"/><rect x="374" y="149" width="56" height="53" fill="#dfe3e1"/><rect x="271" y="65" width="49" height="63" fill="#dfe3e1"/><rect x="96" y="53" width="64" height="66" fill="#dfe3e1"/><rect x="223" y="197" width="74" height="62" fill="#dfe3e1"/><rect x="193" y="164" width="85" height="30" fill="#dfe3e1"/><rect x="473" y="199" width="84" height="54" fill="#dfe3e1"/><rect x="414" y="5" width="70" height="47" fill="#dfe3e1"/><rect x="87" y="165" width="49" height="52" fill="#dfe3e1"/><rect x="452" y="166" width="58" height="61" fill="#dfe3e1"/><rect x="245" y="146" width="75" height="64" fill="#dfe3e1"/><rect x="298" y="138" width="72" height="55" fill="#dfe3e1"/><rect x="198" y="43" width="45" height="49" fill="#dfe3e1"/><rect x="233" y="223" width="69" height="56" fill="#dfe3e1"/><rect x="0" y="200" width="600" height="10" fill="#ffffff"/><rect x="0" y="224" width="600" height="13" fill="#ffffff"/><rect x="0" y="64" width="600" height="8" fill="#ffffff"/><rect x="0" y="273" width="600" height="8" fill="#ffffff"/><rect x="278" y="0" width="11" height="300" fill="#ffffff"/><rect x="334" y="0" width="11" height="300" fill="#ffffff"/><rect x="423" y="0" width="8" height="300" fill="#ffffff"/><rect x="145" y="0" width="10" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="356" y="29" width="67" height="32" fill="#dfe3e1"/><rect x="29" y="45" width="46" height="58" fill="#dfe3e1"/><rect x="169" y="6" width="44" height="61" fill="#dfe3e1"/><rect x="451" y="132" width="86" height="62" fill="#dfe3e1"/><rect x="173" y="63" width="57" height="35" fill="#dfe3e1"/><rect x="466" y="203" width="49" height="33" fill="#dfe3e1"/><rect x="309" y="128" width="70" height="60" fill="#dfe3e1"/><rect x="251" y="44" width="49" height="37" fill="#dfe3e1"/><rect x="121" y="172" width="74" height="34" fill="#dfe3e1"/><rect x="38" y="47" width="61" height="34" fill="#dfe3e1"/><rect x="122" y="186" width="62" height="65" fill="#dfe3e1"/><rect x="323" y="29" width="65" height="61" fill="#dfe3e1"/><rect x="47" y="108" width="42" height="58" fill="#dfe3e1"/><rect x="196" y="5" width="43" height="51" fill="#dfe3e1"/><rect x="0" y="75" width="600" height="7" fill="#ffffff"/><rect x="0" y="56" width="600" height="10" fill="#ffffff"/><rect x="0" y="233" width="600" height="12" fill="#ffffff"/><rect x="0" y="107" width="600" height="7" fill="#ffffff"/><rect x="547" y="0" width="9" height="300" fill="#ffffff"/><rect x="426" y="0" width="9" height="300" fill="#ffffff"/><rect x="57" y="0" width="7" height="300" fill="#ffffff"/><rect x="417" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="224" width="600" height="300" fill="#c8d9e4"/><rect x="498" y="104" width="68" height="30" fill="#dfe3e1"/><rect x="359" y="65" width="55" height="55" fill="#dfe3e1"/><rect x="98" y="34" width="68" height="64" fill="#dfe3e1"/><rect x="265" y="145" width="78" height="48" fill="#dfe3e1"/><rect x="49" y="119" width="43" height="64" fill="#dfe3e1"/><rect x="343" y="79" width="69" height="65" fill="#dfe3e1"/><rect x="477" y="102" width="71" height="32" fill="#dfe3e1"/><rect x="270" y="113" width="51" height="65" fill="#dfe3e1"/><rect x="12" y="151" width="42" height="63" fill="#dfe3e1"/><rect x="133" y="9" width="80" height="33" fill="#dfe3e1"/><rect x="150" y="130" width="46" height="59" fill="#dfe3e1"/><rect x="46" y="77" width="64" height="49" fill="#dfe3e1"/><rect x="428" y="64" width="76" height="38" fill="#dfe3e1"/><rect x="81" y="171" width="50" height="54" fill="#dfe3e1"/><rect x="0" y="153" width="600" height="11" fill="#ffffff"/><rect x="0" y="228" width="600" height="9" fill="#ffffff"/><rect x="0" y="251" width="600" height="7" fill="#ffffff"/><rect x="0" y="124" width="600" height="13" fill="#ffffff"/><rect x="41" y="0" width="11" height="300" fill="#ffffff"/><rect x="208" y="0" width="10" height="300" fill="#ffffff"/><rect x="409" y="0" width="9" height="300" fill="#ffffff"/><rect x="89" y="0" width="7" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="0" y="213" width="600" height="300" fill="#c8d9e4"/><rect x="472" y="206" width="53" height="58" fill="#dfe3e1"/><rect x="25" y="12" width="70" height="54" fill="#dfe3e1"/><rect x="445" y="47" width="78" height="45" fill="#dfe3e1"/><rect x="509" y="160" width="43" height="35" fill="#dfe3e1"/><rect x="262" y="168" width="69" height="38" fill="#dfe3e1"/><rect x="130" y="92" width="83" height="66" fill="#dfe3e1"/><rect x="474" y="26" width="78" height="32" fill="#dfe3e1"/><rect x="218" y="114" width="49" height="60" fill="#dfe3e1"/><rect x="117" y="173" width="49" height="37" fill="#dfe3e1"/><rect x="303" y="194" width="75" height="35" fill="#dfe3e1"/><rect x="503" y="138" width="87" height="38" fill="#dfe3e1"/><rect x="325" y="91" width="63" height="55" fill="#dfe3e1"/><rect x="92" y="60" width="52" height="52" fill="#dfe3e1"/><rect x="374" y="81" width="51" height="38" fill="#dfe3e1"/><rect x="0" y="150" width="600" height="9" fill="#ffffff"/><rect x="0" y="253" width="600" height="7" fill="#ffffff"/><rect x="0" y="92" width="600" height="8" fill="#ffffff"/><rect x="0" y="138" width="600" height="10" fill="#ffffff"/><rect x="461" y="0" width="12" height="300" fill="#ffffff"/><rect x="110" y="0" width="7" height="300" fill="#ffffff"/><rect x="288" y="0" width="10" height="300" fill="#ffffff"/><rect x="436" y="0" width="13" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="288" y="27" width="62" height="55" fill="#dfe3e1"/><rect x="85" y="17" width="52" height="53" fill="#dfe3e1"/><rect x="390" y="162" width="79" height="32" fill="#dfe3e1"/><rect x="206" y="153" width="87" height="45" fill="#dfe3e1"/><rect x="106" y="85" width="77" height="49" fill="#dfe3e1"/><rect x="16" y="224" width="55" height="41" fill="#dfe3e1"/><rect x="351" y="204" width="84" height="58" fill="#dfe3e1"/><rect x="353" y="98" width="50" height="41" fill="#dfe3e1"/><rect x="443" y="114" width="85" height="40" fill="#dfe3e1"/><rect x="2" y="164" width="85" height="51" fill="#dfe3e1"/><rect x="123" y="100" width="83" height="51" fill="#dfe3e1"/><rect x="355" y="75" width="74" height="58" fill="#dfe3e1"/><rect x="238" y="14" width="65" height="50" fill="#dfe3e1"/><rect x="119" y="127" width="58" height="54" fill="#dfe3e1"/><rect x="0" y="234" width="600" height="10" fill="#ffffff"/><rect x="0" y="121" width="600" height="12" fill="#ffffff"/><rect x="0" y="147" width="600" height="13" fill="#ffffff"/><rect x="0" y="151" width="600" height="9" fill="#ffffff"/><rect x="275" y="0" width="10" height="300" fill="#ffffff"/><rect x="279" y="0" width="9" height="300" fill="#ffffff"/><rect x="99" y="0" width="12" height="300" fill="#ffffff"/><rect x="159" y="0" width="8" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="600" height="300" role="img" aria-label="Lageplan">
|
||||
<rect width="600" height="300" fill="#eef1f0"/><rect x="43" y="172" width="59" height="52" fill="#dfe3e1"/><rect x="172" y="228" width="48" height="33" fill="#dfe3e1"/><rect x="275" y="224" width="55" height="58" fill="#dfe3e1"/><rect x="226" y="78" width="40" height="31" fill="#dfe3e1"/><rect x="399" y="55" width="75" height="39" fill="#dfe3e1"/><rect x="387" y="57" width="53" height="38" fill="#dfe3e1"/><rect x="314" y="29" width="40" height="38" fill="#dfe3e1"/><rect x="328" y="206" width="73" height="56" fill="#dfe3e1"/><rect x="323" y="140" width="86" height="35" fill="#dfe3e1"/><rect x="172" y="129" width="47" height="64" fill="#dfe3e1"/><rect x="193" y="71" width="72" height="58" fill="#dfe3e1"/><rect x="472" y="105" width="43" height="46" fill="#dfe3e1"/><rect x="451" y="77" width="80" height="54" fill="#dfe3e1"/><rect x="225" y="51" width="75" height="32" fill="#dfe3e1"/><rect x="0" y="128" width="600" height="12" fill="#ffffff"/><rect x="0" y="252" width="600" height="9" fill="#ffffff"/><rect x="0" y="109" width="600" height="10" fill="#ffffff"/><rect x="0" y="253" width="600" height="9" fill="#ffffff"/><rect x="329" y="0" width="13" height="300" fill="#ffffff"/><rect x="224" y="0" width="11" height="300" fill="#ffffff"/><rect x="425" y="0" width="12" height="300" fill="#ffffff"/><rect x="277" y="0" width="9" height="300" fill="#ffffff"/>
|
||||
<circle cx="300" cy="150" r="17" fill="#152642" opacity="0.15"/>
|
||||
<circle cx="300" cy="150" r="8" fill="#152642"/>
|
||||
<circle cx="300" cy="150" r="3" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |