Skip to content

Commit 1ae8e57

Browse files
author
m.buchhorn-roth
committed
docs: remove em/en-dashes used as sentence separators (README, PRD, copilot-instructions)
1 parent f909b96 commit 1ae8e57

3 files changed

Lines changed: 82 additions & 82 deletions

File tree

.github/copilot-instructions.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# Project Guidelines InvestiGraph (Police Knowledge Graph & GraphRAG Demo)
1+
# Project Guidelines: InvestiGraph (Police Knowledge Graph & GraphRAG Demo)
22

33
## Overview
4-
Generic demo landing page for a **Knowledge Graph & GraphRAG** approach to police investigations, with an interactive 3D police knowledge graph ("Operation Hydra"). All UI text is **German**. Domain: law enforcement, legal references (StPO, StGB, BtMG, GwG, BSIG, NIS2, DSGVO). No vendor branding fictional/illustrative only.
4+
Generic demo landing page for a **Knowledge Graph & GraphRAG** approach to police investigations, with an interactive 3D police knowledge graph ("Operation Hydra"). All UI text is **German**. Domain: law enforcement, legal references (StPO, StGB, BtMG, GwG, BSIG, NIS2, DSGVO). No vendor branding: fictional/illustrative only.
55

66
Deployed at: `https://<user>.github.io/graph-investigation/` (base path `/graph-investigation/`)
77

@@ -12,7 +12,7 @@ Deployed at: `https://<user>.github.io/graph-investigation/` (base path `/graph-
1212
- **react-force-graph-3d** ^1.29 + **three.js** ^0.175 + **three-spritetext** ^1.10 for 3D graph
1313
- **framer-motion** ^12.6 for animations
1414
- **d3** ^7.9 (force layout engine used by react-force-graph)
15-
- **@github/spark** platform **never** remove `sparkPlugin()` or `createIconImportProxy()` from `vite.config.ts`
15+
- **@github/spark** platform: **never** remove `sparkPlugin()` or `createIconImportProxy()` from `vite.config.ts`
1616
- **react-error-boundary** ^6.0 wrapping `<App />` in `main.tsx`
1717

1818
## Build & Dev
@@ -26,8 +26,8 @@ npm run optimize # vite optimize (pre-bundle deps)
2626
```
2727

2828
## CI/CD
29-
- **GitHub Actions**: `.github/workflows/deploy.yml` Node 22, `npm ci``npm run build` → deploy `dist/` to GitHub Pages
30-
- **Dependabot**: `.github/dependabot.yml` npm daily, devcontainers weekly
29+
- **GitHub Actions**: `.github/workflows/deploy.yml`: Node 22, `npm ci``npm run build` → deploy `dist/` to GitHub Pages
30+
- **Dependabot**: `.github/dependabot.yml`: npm daily, devcontainers weekly
3131

3232
## Project Structure
3333

@@ -58,7 +58,7 @@ npm run optimize # vite optimize (pre-bundle deps)
5858
│ │ ├── PoliceKnowledgeGraph3D.tsx # 3D force-graph (~1075 lines)
5959
│ │ └── ui/ # 46 shadcn/ui components (accordion → tooltip)
6060
│ ├── hooks/
61-
│ │ └── use-mobile.ts # useIsMobile() breakpoint 768px
61+
│ │ └── use-mobile.ts # useIsMobile(): breakpoint 768px
6262
│ ├── lib/
6363
│ │ └── utils.ts # cn() = twMerge(clsx(...))
6464
│ └── styles/
@@ -97,18 +97,18 @@ Require `@playwright/test` + Chromium: `npx playwright install chromium`
9797
## Architecture
9898

9999
### Single-Page App
100-
- **No router** one `App.tsx` with scroll-based sections, using `scrollToSection(id)` helper
100+
- **No router**: one `App.tsx` with scroll-based sections, using `scrollToSection(id)` helper
101101
- **Sections** (in order): Hero → Challenges → Features → Architecture (4-Layer Ontology + embedded 3D Knowledge Graph) → Scenarios → Standards & Compliance → Best Practices → Cross-Border Cooperation → CTA → Footer
102102
- **Narration**: `HTMLAudioElement` playing `public/audio/hydra_briefing.mp3` (ElevenLabs "Otto" German male voice)
103103

104104
### State Management
105-
React hooks only (`useState`, `useEffect`, `useCallback`, `useRef`) no external state library.
105+
React hooks only (`useState`, `useEffect`, `useCallback`, `useRef`): no external state library.
106106

107107
Key state in `App.tsx`:
108-
- `selectedLayer: number | null` 4-layer architecture highlighting
109-
- `activeScenario: number` scenario tab selection
110-
- `showIntroGuide: boolean` intro overlay
111-
- `isPlayingNarration: boolean` audio toggle
108+
- `selectedLayer: number | null`: 4-layer architecture highlighting
109+
- `activeScenario: number`: scenario tab selection
110+
- `showIntroGuide: boolean`: intro overlay
111+
- `isPlayingNarration: boolean`: audio toggle
112112

113113
### Path Alias
114114
`@/*``./src/*` (configured in both `vite.config.ts` and `tsconfig.json`)
@@ -121,7 +121,7 @@ Key state in `App.tsx`:
121121
- Section dividers: `// ────────────` with section labels
122122
- Types at file top: `type NodeType = 'suspect' | 'victim' | ...` union pattern
123123
- Node data uses `Record<string, string>` for flexible `details` and optional `timestamp`, `score` fields
124-
- Icons from `lucide-react` primary icon library in components
124+
- Icons from `lucide-react`: primary icon library in components
125125
- Also available: `@heroicons/react`, `@phosphor-icons/react` (Spark icon proxy)
126126

127127
## Graph Component Conventions (`PoliceKnowledgeGraph3D.tsx`)
@@ -134,29 +134,29 @@ Key state in `App.tsx`:
134134
- `SOURCE_REGISTRY` maps source keys to URLs
135135
- Node data built in `buildCaseData()` → returns `{ nodes: GraphNode[], links: GraphLink[] }`
136136
- **81 nodes** and **110 relationships** in current dataset
137-
- Links: `{ source, target, type, description? }` source/target are string node IDs
137+
- Links: `{ source, target, type, description? }`: source/target are string node IDs
138138
- Detail panel groups relationships by connected node type: law → regulation → process → sop → anzeige → other
139139

140140
### Graph Data Enrichment
141141
Every node in the enriched JSON (`input/hydra_graph_data (1).json`) carries:
142-
- `sources[]` keys referencing `metadata.sources` (OFAC, TRM, DOJ, ELLIPTIC, etc.)
143-
- `stix_type` STIX 2.1 SDO mapping (e.g., `threat-actor`, `infrastructure`, `identity`)
144-
- `xpolizei_type` XPolizei 2.0 type (optional)
145-
- `applicable_standards[]` ISO 27037, ISO 27042, NIST 800-86, EO 13694, etc.
142+
- `sources[]`: keys referencing `metadata.sources` (OFAC, TRM, DOJ, ELLIPTIC, etc.)
143+
- `stix_type`: STIX 2.1 SDO mapping (e.g., `threat-actor`, `infrastructure`, `identity`)
144+
- `xpolizei_type`: XPolizei 2.0 type (optional)
145+
- `applicable_standards[]`: ISO 27037, ISO 27042, NIST 800-86, EO 13694, etc.
146146

147147
### German Legal Formats
148148
- Aktenzeichen: `Az. XXXX Js XXXXX/22`
149149
- Asservat-Nr: `ASS-2022-XXXX-XXXX`
150150
- Paragraph references: `§100a StPO`, `§261 StGB`
151-
- Addresses redacted with `XXX` never use real addresses
151+
- Addresses redacted with `XXX`: never use real addresses
152152

153153
## CSS & Theming
154-
- **Tailwind v4** with `@theme inline` in `src/main.css` all design tokens as CSS custom properties
154+
- **Tailwind v4** with `@theme inline` in `src/main.css`: all design tokens as CSS custom properties
155155
- **oklch color space** throughout: Deep Navy primary (`oklch(0.25 0.05 250)`), Signal Red accent (`oklch(0.55 0.22 25)`)
156156
- **Dark mode** via `.dark` selector and `@custom-variant dark (&:is(.dark *))`
157-
- **Fonts**: **Space Grotesk** (headings), **Inter** (body) loaded via Google Fonts in `index.html`
157+
- **Fonts**: **Space Grotesk** (headings), **Inter** (body): loaded via Google Fonts in `index.html`
158158
- **Radix color scales**: All scales imported in `src/styles/theme.css` (261 lines)
159-
- **Spark theme vars** in `#spark-app` selector spacing, radius, neutral/accent mapping but mostly dark/light bg colors
159+
- **Spark theme vars** in `#spark-app` selector: spacing, radius, neutral/accent mapping but mostly dark/light bg colors
160160
- `tailwind.config.js` (146 lines): extends defaultTheme with Radix CSS variable mappings
161161

162162
## Environment Variables
@@ -165,20 +165,20 @@ Every node in the enriched JSON (`input/hydra_graph_data (1).json`) carries:
165165
|----------|------|---------|
166166
| `ELEVENLABS_API_KEY` | `.env` | ElevenLabs TTS API key (for `scripts/*.py`) |
167167

168-
`.env` is in `.gitignore` never commit API keys.
168+
`.env` is in `.gitignore`: never commit API keys.
169169

170170
## Narration / Audio
171-
- **Always use ElevenLabs** for text-to-speech generation **never** use the Web Speech API (`SpeechSynthesis`)
171+
- **Always use ElevenLabs** for text-to-speech generation: **never** use the Web Speech API (`SpeechSynthesis`)
172172
- Voice: **male, warm friendly tone, native German** (currently ElevenLabs voice ID `FTNCalFNG5bRnkkaP5Ug` "Otto")
173173
- Model: `eleven_multilingual_v2`
174-
- API key is read from `.env` (`ELEVENLABS_API_KEY`) never hardcode it
174+
- API key is read from `.env` (`ELEVENLABS_API_KEY`): never hardcode it
175175
- Generate script: `python3 scripts/generate_narration.py` → outputs `public/audio/hydra_briefing.mp3`
176-
- The **player in `App.tsx` always uses the stored MP3 file** (`HTMLAudioElement` with `public/audio/hydra_briefing.mp3`) never inline `SpeechSynthesisUtterance`
176+
- The **player in `App.tsx` always uses the stored MP3 file** (`HTMLAudioElement` with `public/audio/hydra_briefing.mp3`): never inline `SpeechSynthesisUtterance`
177177
- When the narration text changes, **regenerate the MP3** by running the generate script before committing
178178

179179
## Security
180180
- Report vulnerabilities via `opensource-security@github.com`, not public issues
181-
- All case data is fictional keep addresses redacted, use fake Aktenzeichen
181+
- All case data is fictional: keep addresses redacted, use fake Aktenzeichen
182182
- DSGVO/NIS2 references must be legally accurate when added
183183
- Never commit `.env` or API keys
184184
- ElevenLabs API key is only used by Python scripts at build time, not at runtime

PRD.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ This is an interactive educational landing page that guides German police throug
5757

5858
## Design Direction
5959

60-
The design should project **institutional authority, technical sophistication, and German precision**. It must balance accessibility for non-technical decision-makers with depth for IT professionals. The aesthetic should feel like a high-end consulting presentationpolished, data-driven, and uncompromisingly professional. Visual elements should reference law enforcement (subtle badge/shield motifs, network diagrams) and German design traditions (clarity, functionality, minimal ornamentation).
60+
The design should project **institutional authority, technical sophistication, and German precision**. It must balance accessibility for non-technical decision-makers with depth for IT professionals. The aesthetic should feel like a high-end consulting presentation: polished, data-driven, and uncompromisingly professional. Visual elements should reference law enforcement (subtle badge/shield motifs, network diagrams) and German design traditions (clarity, functionality, minimal ornamentation).
6161

6262
## Color Selection
6363

@@ -93,7 +93,7 @@ Typography must balance German design sensibilities (clarity, legibility) with c
9393

9494
## Animations
9595

96-
Animations should feel **precise and purposeful**, reflecting German engineering principlesnothing frivolous, every motion serves a functional purpose. Entry animations use subtle upward motion with slight opacity changes (respecting reduced-motion preferences). Interactive elements respond with micro-interactions that provide immediate feedback. The architecture visualization includes smooth transitions between states. Hover effects are subtle but distinct, confirming interactivity without distraction.
96+
Animations should feel **precise and purposeful**, reflecting German engineering principles: nothing frivolous, every motion serves a functional purpose. Entry animations use subtle upward motion with slight opacity changes (respecting reduced-motion preferences). Interactive elements respond with micro-interactions that provide immediate feedback. The architecture visualization includes smooth transitions between states. Hover effects are subtle but distinct, confirming interactivity without distraction.
9797

9898
## Component Selection
9999

0 commit comments

Comments
 (0)