{"roots":["34:2649"],"nodeById":{"34:2776":{"type":"FRAME","id":"34:2776","name":"screens","absoluteBoundingBox":{"x":54280.0,"y":575.932006835938,"width":376.0,"height":92344.0},"isolatedAbsoluteRenderBounds":{"x":54280.0,"y":575.932006835938,"width":376.0,"height":92344.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,475.932037353516]],"size":{"x":376.0,"y":92344.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":16.0,"paddingRight":16.0,"paddingBottom":16.0,"paddingLeft":16.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["34:2777"]},"34:2777":{"type":"FRAME","id":"34:2777","name":"introduction","absoluteBoundingBox":{"x":54296.0,"y":591.932006835938,"width":344.0,"height":92312.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":591.932006835938,"width":344.0,"height":92312.0},"relativeTransform":[[1.0,0.0,16.0],[0.0,1.0,16.0]],"size":{"x":344.0,"y":92312.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1920.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisSizingMode":"FIXED","children":["34:2778","78:20347","78:20371","78:20394","78:20417","78:20577"]},"78:20419":{"type":"TEXT","id":"78:20419","name":"# Augur Personas — Index ## Overview Augur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone. --- ## Persona Comparison Matrix | Persona | Primary goal | Time pressure | Technical skill | Device | Key feature | |---|---|---|---|---|---| | **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail | | **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export | | **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends | | **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary | | **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile | | **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation | --- ## Design Decisions by Persona ### Information Architecture **Government & Law enforcement** prioritise: - Timeline and historical context (drill-down from event → details → related) - People and places (find person, then events, then timeline) - Export and integration (share findings, integrate with external tools) **Council planners & owners** prioritise: - Aggregated metrics and trends (summary first, detail optional) - Comparative analysis (year-over-year, location-to-location) - Export for reports and presentations **Retailers & security operators** prioritise: - Alerts and notifications (passive receipt of urgent information) - Mobile access (not always at desk) - Minimal friction (quick lookup, confirm, act) ### Interaction Patterns **Government & law enforcement:** - Keyboard shortcuts (fast users) - Saved filters and workspaces (reuse across shifts) - Bulk export and reporting **Council & owners:** - Prebuilt reports and dashboards - Comparative date/time pickers - Visual summaries before detail **Retailers & operators:** - Push notifications and alerts - One-click actions (confirm, share, log) - Minimal navigation depth ### Copy & Tone **Government & law enforcement:** - Direct and precise (authoritative, no softening) - Technical vocabulary acceptable (they know the jargon) - Procedural language (actionable instructions) **Council & owners:** - Clear and jargon-free (may not know public safety terminology) - Contextual explanation (what this metric means, why it matters) - Business-focused language **Retailers & operators:** - Urgent but calm (no alarmism, but clear on severity) - Action-oriented (what to do, not why) - Short, scannable copy --- ## Feature Prioritisation by Persona ### Must-have (all personas) - Search/filter by location and date range - Detail panel for persons and events - Photo/avatar visibility - Export to PDF/CSV ### High-value (government, law enforcement) - Save and name filters - Timeline view with granular timestamps - Related data drilling (event → people → timeline) - Audit logging - Full historical data access ### High-value (council, commercial owner) - Prebuilt report templates - Comparative date filters - Trend charts and visualisations - Email scheduling for reports ### High-value (retailers, security operators) - Real-time notifications and alerts - Mobile app with offline capability - Quick incident logging (forms with presets) - Location map with heatmap view - Integration with mobile devices (tablet, smartphone) --- ## Accessibility & Inclusion All personas should be able to use Augur with: - Keyboard navigation (for all, especially desktop-heavy users) - Screen reader support (government analysts using accessibility features) - Mobile responsiveness (operators in field) - Low-tech fallbacks (alert SMS if app unavailable) --- # Augur Persona — Government Analyst **Role:** MI5/MI6 intelligence analyst **Goal:** Find and monitor hostile foreign agents operating in the UK **Frequency:** Daily, shift-based (8–12 hour blocks) ### Profile - **Age:** 28–45 - **Technical skill:** High (comfortable with complex systems, data tools) - **Context:** Secure, government facility with dedicated workstations - **Devices:** Desktop/laptop only; no mobile access - **Time pressure:** High (real-time monitoring, time-sensitive intelligence) ### Needs - **Speed:** Locate persons of interest within seconds - **Precision:** Confirm identity with high confidence (facial recognition, metadata matching) - **Historical context:** Access to full timeline of sightings and related incidents - **Integration:** Cross-reference with external databases and intelligence feeds - **Audit trail:** Detailed logs for compliance and legal proceedings ### Pain points - Current systems are fragmented (multiple tools for tracking, mapping, reporting) - Slow handoffs between shifts lose critical context - Geographic and temporal filtering is tedious (manual entry, limited saved filters) - Cannot quickly correlate multiple sightings across locations ### How they use Augur 1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours) 2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals 3. **Investigation:** Drill into specific event; review timeline and related people; export data for report 4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical) ### Design implications - **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status) - **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks - **Export options:** CSV, PDF for reports and compliance - **Audit annotations:** Allow analysts to add notes to specific sightings for context ---  # Augur Persona — Law Enforcement Officer **Role:** Investigator or counter-terrorism police **Goal:** Identify and locate persons of interest; build case evidence **Frequency:** Variable (reactive to incidents, proactive investigation cycles) ### Profile - **Age:** 30–50 - **Technical skill:** Medium (comfortable with common tools; less patience for complexity) - **Context:** Police station, patrol vehicle, incident scene - **Devices:** Desktop, laptop, occasionally tablet - **Time pressure:** Very high (active incidents, rapidly changing situations) ### Needs - **Immediate answers:** \"Where was this person in the last hour?\" - **Visual confirmation:** Photo, video, location map (not just data tables) - **Actionable intelligence:** Predict next location or movement pattern - **Evidence capture:** Screenshots, video clips for case files - **Team coordination:** Share findings with other officers or teams ### Pain points - Fragmented tools make scene response slow (check map, then check database, then check timeline) - Cannot quickly verify identity from CCTV feeds - Difficulty assessing threat level or modus operandi from raw data - Manual cross-referencing between locations is error-prone ### How they use Augur 1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours) 2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events 3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits 4. **Evidence collection:** Screenshot detail panel and timeline for case file 5. **Team briefing:** Share annotated view with other officers via secure link ### Design implications - **Large avatars and photos:** Visual confirmation is critical; images should be prominent - **Map integration:** Spatial context (where sightings occurred) matters more than abstract data - **Quick summaries:** AI-written incident summaries to provide instant context - **Mobile-first:** Design panels to work well on tablet and small screens - **Offline mode:** Critical workflows should work without network (for vehicle/scene use) ---  # Augur Persona — Council Planner **Role:** Urban planner, public safety coordinator **Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements **Frequency:** Weekly or monthly (strategic planning cycles, not real-time) ### Profile - **Age:** 35–55 - **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools) - **Context:** Office desk, occasional council meetings - **Devices:** Desktop/laptop; rare mobile use - **Time pressure:** Low (can spend time exploring data, generating reports) ### Needs - **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\" - **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes - **Exportable reports:** Data and visualisations for presentations and board documents - **Actionable insights:** Not raw data, but curated analysis with recommendations ### Pain points - Difficult to answer \"what changed?\" questions without historical data - Cannot easily generate heatmaps or trend charts for reports - Manual data aggregation from multiple sources is time-consuming - Lacks statistical context (is this trend significant or noise?) ### How they use Augur 1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days) 2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends 3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics 4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation 5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes ### Design implications - **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel) - **Comparative filters:** Quick way to compare two time periods side-by-side - **Summary statistics:** Show totals, averages, % change to highlight trends - **Natural language:** Avoid jargon; use plain English summaries - **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work --- # Augur Persona — Commercial Space Owner **Role:** Airport, shopping centre, stadium, or venue manager **Goal:** Ensure safety and security of premises; prevent theft, reduce incidents **Frequency:** Daily or weekly (operational oversight) ### Profile - **Age:** 35–60 - **Technical skill:** Low (comfort with basic software; prefers simplicity over power) - **Context:** Manager's office or security control room - **Devices:** Desktop/laptop; occasionally tablet - **Time pressure:** Medium (reactive to incidents; proactive reviews weekly) ### Needs - **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\" - **Staff briefing:** Prepare daily or weekly briefing for security team - **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas) - **Alert integration:** Receive notifications of serious incidents in real-time ### Pain points - Cannot quickly identify if incidents are isolated or part of a pattern - Lacks visibility into peak risk times (when to increase staffing) - Manual incident reports from security team are fragmented and slow - Difficult to demonstrate ROI of security improvements to leadership ### How they use Augur 1. **Daily check-in:** Open map; filter by location (venue) and today's date 2. **Incident review:** Click on incident to see details (what, where, when, involved parties) 3. **Weekly briefing:** Export summary of incidents and trends for security team meeting 4. **Quarterly report:** Generate 3-month report of incidents by type and location for board 5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues) ### Design implications - **Simplified interface:** Reduce options; show only relevant data for venue operators - **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters - **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity) - **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display) - **Email/SMS alerts:** Notify manager of serious incidents via push/email --- # Augur Persona — Retailer **Role:** Retail manager (supermarket, department store, independent shop) **Goal:** Prevent theft and loss; improve store operations; train staff on safety **Frequency:** Daily to weekly (depends on store size and incident frequency) ### Profile - **Age:** 28–50 - **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools) - **Context:** Store office or back-of-house area - **Devices:** Desktop/laptop; increasingly tablet (during floor rounds) - **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods) ### Needs - **Rapid response:** Identify shoplifter or employee theft in real-time - **Loss visibility:** \"How much loss are we experiencing? In which department?\" - **Staff training:** Use incident data to train staff on prevention and procedures - **Evidence capture:** Collect footage/data for loss prevention or legal proceedings ### Pain points - Manual incident reporting from floor staff (time-consuming, incomplete) - Difficult to see patterns (same offender, same time of day, same location in store) - Cannot correlate \"suspicious activity\" alerts with actual losses - Lack of visibility into employee-related incidents ### How they use Augur 1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification) 2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?) 3. **Shift review:** End of day, check incidents during shift; brief team on patterns 4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items 5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends ### Design implications - **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in) - **Repeat offender flag:** Highlight if same person has multiple incidents - **Item-level data:** Connect incidents to specific products/departments (requires POS integration) - **Playback mode:** Show timeline of activity before/after incident (useful for training) - **Mobile-first:** Managers check app from floor or office (not always at desk) --- # Augur Persona — Security Operator **Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema) **Goal:** Respond to incidents quickly; identify threats; protect staff and customers **Frequency:** Shift-based (continuous presence during operating hours) ### Profile - **Age:** 22–45 - **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools) - **Context:** Security control room or mobile (patrol, incident scene) - **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone - **Time pressure:** Very high (active incidents demand immediate action) ### Needs - **Instant alerts:** Notification of flagged individuals or unusual activity - **Visual confirmation:** Live camera feed or photos to verify threat level - **Location intelligence:** Where did the person go? Which exit will they use? - **Backup coordination:** Quick way to request additional security or police - **Incident log:** Record what happened for post-incident review ### Pain points - Fragmented tools (CCTV system, incident log, radio/comms separate) - Cannot quickly pull historical context (is this person a repeat problem?) - Difficulty communicating precise location/identity to backup teams - Manual incident reporting after the fact (time-consuming, errors) ### How they use Augur 1. **Real-time monitoring:** Control room displays map with heat map of recent activity 2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location 3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept 4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message 5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review ### Design implications - **Alert-centric design:** Notifications are primary interaction (not searching) - **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity) - **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone - **Voice-friendly:** Support dictation for incident logging (hands-free during active response) - **Offline resilience:** Core functions work without network (video playback, past data) - **Minimal friction:** Fewer clicks to log incident or alert backup --- See accessibility.md for full WCAG 2.1 AA compliance details.","absoluteBoundingBox":{"x":54316.0,"y":56527.93359375,"width":304.0,"height":20064.0},"isolatedAbsoluteRenderBounds":{"x":54316.3203125,"y":56534.0546875,"width":296.7578125,"height":20051.0703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":304.0,"y":20064.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Personas — Index\n\n## Overview\n\nAugur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone.\n\n---\n\n\n## Persona Comparison Matrix\n\n| Persona | Primary goal | Time pressure | Technical skill | Device | Key feature |\n|---|---|---|---|---|---|\n| **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail |\n| **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export |\n| **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends |\n| **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary |\n| **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile |\n| **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation |\n\n---\n\n## Design Decisions by Persona\n\n### Information Architecture\n\n**Government & Law enforcement** prioritise:\n- Timeline and historical context (drill-down from event → details → related)\n- People and places (find person, then events, then timeline)\n- Export and integration (share findings, integrate with external tools)\n\n**Council planners & owners** prioritise:\n- Aggregated metrics and trends (summary first, detail optional)\n- Comparative analysis (year-over-year, location-to-location)\n- Export for reports and presentations\n\n**Retailers & security operators** prioritise:\n- Alerts and notifications (passive receipt of urgent information)\n- Mobile access (not always at desk)\n- Minimal friction (quick lookup, confirm, act)\n\n### Interaction Patterns\n\n**Government & law enforcement:**\n- Keyboard shortcuts (fast users)\n- Saved filters and workspaces (reuse across shifts)\n- Bulk export and reporting\n\n**Council & owners:**\n- Prebuilt reports and dashboards\n- Comparative date/time pickers\n- Visual summaries before detail\n\n**Retailers & operators:**\n- Push notifications and alerts\n- One-click actions (confirm, share, log)\n- Minimal navigation depth\n\n### Copy & Tone\n\n**Government & law enforcement:**\n- Direct and precise (authoritative, no softening)\n- Technical vocabulary acceptable (they know the jargon)\n- Procedural language (actionable instructions)\n\n**Council & owners:**\n- Clear and jargon-free (may not know public safety terminology)\n- Contextual explanation (what this metric means, why it matters)\n- Business-focused language\n\n**Retailers & operators:**\n- Urgent but calm (no alarmism, but clear on severity)\n- Action-oriented (what to do, not why)\n- Short, scannable copy\n\n---\n\n## Feature Prioritisation by Persona\n\n### Must-have (all personas)\n- Search/filter by location and date range\n- Detail panel for persons and events\n- Photo/avatar visibility\n- Export to PDF/CSV\n\n### High-value (government, law enforcement)\n- Save and name filters\n- Timeline view with granular timestamps\n- Related data drilling (event → people → timeline)\n- Audit logging\n- Full historical data access\n\n### High-value (council, commercial owner)\n- Prebuilt report templates\n- Comparative date filters\n- Trend charts and visualisations\n- Email scheduling for reports\n\n### High-value (retailers, security operators)\n- Real-time notifications and alerts\n- Mobile app with offline capability\n- Quick incident logging (forms with presets)\n- Location map with heatmap view\n- Integration with mobile devices (tablet, smartphone)\n\n---\n\n## Accessibility & Inclusion\n\nAll personas should be able to use Augur with:\n- Keyboard navigation (for all, especially desktop-heavy users)\n- Screen reader support (government analysts using accessibility features)\n- Mobile responsiveness (operators in field)\n- Low-tech fallbacks (alert SMS if app unavailable)\n\n---\n\n# Augur Persona — Government Analyst\n\n**Role:** MI5/MI6 intelligence analyst  \n**Goal:** Find and monitor hostile foreign agents operating in the UK  \n**Frequency:** Daily, shift-based (8–12 hour blocks)\n\n### Profile\n\n- **Age:** 28–45\n- **Technical skill:** High (comfortable with complex systems, data tools)\n- **Context:** Secure, government facility with dedicated workstations\n- **Devices:** Desktop/laptop only; no mobile access\n- **Time pressure:** High (real-time monitoring, time-sensitive intelligence)\n\n### Needs\n\n- **Speed:** Locate persons of interest within seconds\n- **Precision:** Confirm identity with high confidence (facial recognition, metadata matching)\n- **Historical context:** Access to full timeline of sightings and related incidents\n- **Integration:** Cross-reference with external databases and intelligence feeds\n- **Audit trail:** Detailed logs for compliance and legal proceedings\n\n### Pain points\n\n- Current systems are fragmented (multiple tools for tracking, mapping, reporting)\n- Slow handoffs between shifts lose critical context\n- Geographic and temporal filtering is tedious (manual entry, limited saved filters)\n- Cannot quickly correlate multiple sightings across locations\n\n### How they use Augur\n\n1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours)\n2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals\n3. **Investigation:** Drill into specific event; review timeline and related people; export data for report\n4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical)\n\n### Design implications\n\n- **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status)\n- **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks\n- **Export options:** CSV, PDF for reports and compliance\n- **Audit annotations:** Allow analysts to add notes to specific sightings for context\n\n---  # Augur Persona — Law Enforcement Officer\n\n**Role:** Investigator or counter-terrorism police  \n**Goal:** Identify and locate persons of interest; build case evidence  \n**Frequency:** Variable (reactive to incidents, proactive investigation cycles)\n\n### Profile\n\n- **Age:** 30–50\n- **Technical skill:** Medium (comfortable with common tools; less patience for complexity)\n- **Context:** Police station, patrol vehicle, incident scene\n- **Devices:** Desktop, laptop, occasionally tablet\n- **Time pressure:** Very high (active incidents, rapidly changing situations)\n\n### Needs\n\n- **Immediate answers:** \"Where was this person in the last hour?\"\n- **Visual confirmation:** Photo, video, location map (not just data tables)\n- **Actionable intelligence:** Predict next location or movement pattern\n- **Evidence capture:** Screenshots, video clips for case files\n- **Team coordination:** Share findings with other officers or teams\n\n### Pain points\n\n- Fragmented tools make scene response slow (check map, then check database, then check timeline)\n- Cannot quickly verify identity from CCTV feeds\n- Difficulty assessing threat level or modus operandi from raw data\n- Manual cross-referencing between locations is error-prone\n\n### How they use Augur\n\n1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours)\n2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events\n3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits\n4. **Evidence collection:** Screenshot detail panel and timeline for case file\n5. **Team briefing:** Share annotated view with other officers via secure link\n\n### Design implications\n\n- **Large avatars and photos:** Visual confirmation is critical; images should be prominent\n- **Map integration:** Spatial context (where sightings occurred) matters more than abstract data\n- **Quick summaries:** AI-written incident summaries to provide instant context\n- **Mobile-first:** Design panels to work well on tablet and small screens\n- **Offline mode:** Critical workflows should work without network (for vehicle/scene use)\n\n---\n # Augur Persona — Council Planner\n\n**Role:** Urban planner, public safety coordinator  \n**Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements  \n**Frequency:** Weekly or monthly (strategic planning cycles, not real-time)\n\n### Profile\n\n- **Age:** 35–55\n- **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools)\n- **Context:** Office desk, occasional council meetings\n- **Devices:** Desktop/laptop; rare mobile use\n- **Time pressure:** Low (can spend time exploring data, generating reports)\n\n### Needs\n\n- **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\"\n- **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes\n- **Exportable reports:** Data and visualisations for presentations and board documents\n- **Actionable insights:** Not raw data, but curated analysis with recommendations\n\n### Pain points\n\n- Difficult to answer \"what changed?\" questions without historical data\n- Cannot easily generate heatmaps or trend charts for reports\n- Manual data aggregation from multiple sources is time-consuming\n- Lacks statistical context (is this trend significant or noise?)\n\n### How they use Augur\n\n1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days)\n2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends\n3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics\n4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation\n5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes\n\n### Design implications\n\n- **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel)\n- **Comparative filters:** Quick way to compare two time periods side-by-side\n- **Summary statistics:** Show totals, averages, % change to highlight trends\n- **Natural language:** Avoid jargon; use plain English summaries\n- **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work\n\n---\n\n# Augur Persona — Commercial Space Owner\n\n**Role:** Airport, shopping centre, stadium, or venue manager  \n**Goal:** Ensure safety and security of premises; prevent theft, reduce incidents  \n**Frequency:** Daily or weekly (operational oversight)\n\n### Profile\n\n- **Age:** 35–60\n- **Technical skill:** Low (comfort with basic software; prefers simplicity over power)\n- **Context:** Manager's office or security control room\n- **Devices:** Desktop/laptop; occasionally tablet\n- **Time pressure:** Medium (reactive to incidents; proactive reviews weekly)\n\n### Needs\n\n- **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\"\n- **Staff briefing:** Prepare daily or weekly briefing for security team\n- **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas)\n- **Alert integration:** Receive notifications of serious incidents in real-time\n\n### Pain points\n\n- Cannot quickly identify if incidents are isolated or part of a pattern\n- Lacks visibility into peak risk times (when to increase staffing)\n- Manual incident reports from security team are fragmented and slow\n- Difficult to demonstrate ROI of security improvements to leadership\n\n### How they use Augur\n\n1. **Daily check-in:** Open map; filter by location (venue) and today's date\n2. **Incident review:** Click on incident to see details (what, where, when, involved parties)\n3. **Weekly briefing:** Export summary of incidents and trends for security team meeting\n4. **Quarterly report:** Generate 3-month report of incidents by type and location for board\n5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues)\n\n### Design implications\n\n- **Simplified interface:** Reduce options; show only relevant data for venue operators\n- **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters\n- **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity)\n- **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display)\n- **Email/SMS alerts:** Notify manager of serious incidents via push/email\n\n---\n\n# Augur Persona — Retailer\n\n**Role:** Retail manager (supermarket, department store, independent shop)  \n**Goal:** Prevent theft and loss; improve store operations; train staff on safety  \n**Frequency:** Daily to weekly (depends on store size and incident frequency)\n\n### Profile\n\n- **Age:** 28–50\n- **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools)\n- **Context:** Store office or back-of-house area\n- **Devices:** Desktop/laptop; increasingly tablet (during floor rounds)\n- **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods)\n\n### Needs\n\n- **Rapid response:** Identify shoplifter or employee theft in real-time\n- **Loss visibility:** \"How much loss are we experiencing? In which department?\"\n- **Staff training:** Use incident data to train staff on prevention and procedures\n- **Evidence capture:** Collect footage/data for loss prevention or legal proceedings\n\n### Pain points\n\n- Manual incident reporting from floor staff (time-consuming, incomplete)\n- Difficult to see patterns (same offender, same time of day, same location in store)\n- Cannot correlate \"suspicious activity\" alerts with actual losses\n- Lack of visibility into employee-related incidents\n\n### How they use Augur\n\n1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification)\n2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?)\n3. **Shift review:** End of day, check incidents during shift; brief team on patterns\n4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items\n5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends\n\n### Design implications\n\n- **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in)\n- **Repeat offender flag:** Highlight if same person has multiple incidents\n- **Item-level data:** Connect incidents to specific products/departments (requires POS integration)\n- **Playback mode:** Show timeline of activity before/after incident (useful for training)\n- **Mobile-first:** Managers check app from floor or office (not always at desk)\n\n---\n\n# Augur Persona — Security Operator\n\n**Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema)  \n**Goal:** Respond to incidents quickly; identify threats; protect staff and customers  \n**Frequency:** Shift-based (continuous presence during operating hours)\n\n### Profile\n\n- **Age:** 22–45\n- **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools)\n- **Context:** Security control room or mobile (patrol, incident scene)\n- **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone\n- **Time pressure:** Very high (active incidents demand immediate action)\n\n### Needs\n\n- **Instant alerts:** Notification of flagged individuals or unusual activity\n- **Visual confirmation:** Live camera feed or photos to verify threat level\n- **Location intelligence:** Where did the person go? Which exit will they use?\n- **Backup coordination:** Quick way to request additional security or police\n- **Incident log:** Record what happened for post-incident review\n\n### Pain points\n\n- Fragmented tools (CCTV system, incident log, radio/comms separate)\n- Cannot quickly pull historical context (is this person a repeat problem?)\n- Difficulty communicating precise location/identity to backup teams\n- Manual incident reporting after the fact (time-consuming, errors)\n\n### How they use Augur\n\n1. **Real-time monitoring:** Control room displays map with heat map of recent activity\n2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location\n3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept\n4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message\n5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review\n\n### Design implications\n\n- **Alert-centric design:** Notifications are primary interaction (not searching)\n- **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity)\n- **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone\n- **Voice-friendly:** Support dictation for incident logging (hands-free during active response)\n- **Offline resilience:** Core functions work without network (video playback, past data)\n- **Minimal friction:** Fewer clicks to log incident or alert backup\n\n---\n\nSee accessibility.md for full WCAG 2.1 AA compliance details.","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20418":{"type":"TEXT","id":"78:20418","name":"PERSONAS.MD","absoluteBoundingBox":{"x":54316.0,"y":56455.93359375,"width":304.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":54319.23046875,"y":56468.6953125,"width":213.80078125,"height":22.71875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PERSONAS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20396":{"type":"TEXT","id":"78:20396","name":"# Augur Patterns ## Overview Patterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens. --- ## Layout Patterns ### Panel-Based Spatial Layout **Structure:** Main canvas (left/centre) + draggable side panels (right) **Anatomy:** - **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width - **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small` - **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions - **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset) - **Timeline scrubber:** Bottom of viewport, spanning full width **Responsive behaviour:** - On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss - On desktop (>768px): panels dock on right, canvas shrinks to accommodate **Use case:** Dashboard, map view, live monitoring --- ### Detail Drill-Down **Structure:** List panel → Detail panel → Related panels **Flow:** 1. User clicks list item (e.g. \"Potential theft\" in Events) 2. Selected event panel opens (or detail drawer slides in) 3. Detail panel shows full information + related action links (Cameras, People, Timeline) 4. User clicks action link to open related panel 5. Back arrow returns to selected event detail **Panel stacking:** - Primary panel: Selected event - Secondary panel: Related person, timeline, or camera - Tertiary panel: If user drills deeper (e.g. timeline → specific incident) **Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel --- ### Modal Pickers (Date, Location) **Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation **Flow:** 1. User clicks \"When\" or \"Where\" dropdown in top bar 2. Picker modal slides up from bottom or appears inline 3. User navigates picker (tabs, lists, grid cells) 4. User selects option 5. Picker closes, filter updates, interface refreshes with new data **Keyboard support:** - Arrow keys to navigate picker items - Enter to select - Escape to close without selecting **Visual feedback:** - Selected item highlighted in dark (`colour/active`) - Current selection persists until changed --- ## Interaction Patterns ### Selection & Highlighting **Primary flow:** 1. User sees list of items (events, people, data points) 2. User clicks item to select 3. Item highlights with background `colour/hover` 4. Related detail panel opens or updates **Visual states:** - **Default:** `colour/bg/primary` background, `colour/text/primary` text - **Hover:** `colour/hover` background (cream/400), text unchanged - **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text **Keyboard support:** - Arrow keys to navigate list - Enter to select - Space to select (optional) --- ### Navigation via Back/Close **Pattern:** Panels always include back arrow (navigation) and close X (dismiss) **Back arrow:** - Returns to previous state or parent panel - Preserves scroll position (if applicable) - Visible only if there's a previous state to return to **Close X:** - Dismisses current panel - Returns to base view (e.g. map with no detail panels) - Always visible in panel header **Keyboard support:** - Escape key acts as close X (dismisses panel) - Alt+Left arrow acts as back button --- ### Status Indicators & Urgency **Alert dot (orange):** - Small 8px circle, top-right of avatar or button - Indicates urgent status (unreviewed, flagged, etc.) - Colour: `colour/alert` (#FF6B35, TBD — confirm value) **Notification list:** - \"Just now\" badges for recent alerts - Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp - Orange dot next to most recent items - Read/unread states (optional; not visible in current design) **Capacity badge:** - Circular dark badge (neutral/900) with white percentage text - Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\" **Ratio badge:** - Circular dark badge with split label, e.g. \"M:32 F:68\" - Indicates demographic breakdown or ratio metric **Temporal indicator:** - \"LIVE\" badge in calendar/date picker (active period tab) - Indicates real-time data stream --- ### Data Presentation **List-based:** - Categorical lists (Customer, Sales, Operational data) - Each list item is a link/button to drill-down - Section headers (`type/h4`) group related items **Card-based:** - Event card: image + avatar + title + metadata + description + related actions - Person card: avatar + name + metadata + related actions - Data card: chart + metadata **Chart-based:** - Bar charts with grey bars, axis labels - No chart title on the chart itself; title lives in panel header - Legend optional (axis labels sufficient for simple charts) **Table-based:** - Column headers in `type/h4` (bold monospace) - Rows in `type/body` (regular monospace) - No alternating row colours (density over visual variety) - Minimal borders; dividers use `colour/border/light` --- ## Visual Hierarchy ### Typographic **Dominance order (largest → smallest):** 1. `type/display` (48px) — Page title, hero heading (rarely used in Augur) 2. `type/h1` (40px) — Major section heading 3. `type/h2` (32px) — Subsection heading 4. `type/h3` (28px) — Panel title, card heading 5. `type/h4` (24px) — Section header, label, secondary heading 6. `type/body-large` (20px) — Introductory text, large body 7. `type/body` (16px) — Standard UI copy, list items, descriptions 8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`) **Weight hierarchy:** - Bold: Headings, emphasis, CTAs - Regular: Body text, labels, most UI copy - Light: Secondary text, metadata (applied as weight override, not separate style) --- ### Colour **Dominance order:** 1. Cream backgrounds (`colour/cream`) dominate visual space 2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability 3. Dark active state (`colour/active`, neutral/900) indicates selection 4. Orange accent (`colour/alert`) draws attention to urgent items 5. White canvas provides separation between 3D view and UI **Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts. --- ## Spacing & Alignment ### Padding **Panel padding:** - Header: `space/4` (16px) on all sides - Body: `space/6` (24px) on all sides - List item: `space/4` (16px) horizontal, `space/2` (8px) vertical **Margins:** - Between sections within a panel: `space/6` (24px) - Between list items: None (border-based dividers) - Between action links: `space/4` (16px) ### Grid **Base unit:** 8px **Canvas width:** Variable (full minus panel width) **Panel width:** 320px fixed **Content width:** Full panel width minus padding **Align to 8px grid:** - Position: multiples of 8px - Size: multiples of 8px - Spacing: use `space/*` tokens (multiples of 4px or 8px) --- ## Motion (Future) **Tentative patterns (not currently specified):** - Panel slide-in/slide-out (250ms ease-out) - Dropdown fade-in (150ms ease-out) - Item hover scale (subtle, 1.02× scale) - Colour transitions (200ms ease-out for hover/active states) **Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation. --- ## Accessibility Patterns ### Focus Management **Pattern:** Focus should move logically through the interface. - Tab order follows visual/reading order (left-to-right, top-to-bottom) - When a panel opens, focus moves to the panel's first focusable element - When a panel closes, focus returns to the triggering element - Modals trap focus (Tab wraps to first element after last) **Visual focus indicator:** - 2px outline in `colour/focus-ring` (neutral/800) - 2px offset from element boundary - Applies to all buttons, links, form inputs, and interactive elements --- ### Screen Reader Announcements **Patterns:** - When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\") - When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\") - When an action completes: Announce result (e.g. \"Filter applied, 12 results\") **Implementation:** - Use `aria-live=\"polite\"` for non-critical updates - Use `aria-live=\"assertive\"` for urgent alerts - Use `role=\"alert\"` for error messages --- ### Semantic HTML **Patterns:** - Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels) - Buttons: Use `<button>` for actions; `<a>` for navigation - Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\") - Lists: Use `<ul>` / `<ol>` / `<li>` for list content - Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically - Forms: Use `<label>` associated with inputs via `for` attribute or nesting --- ## Performance Patterns ### Data Rendering **Principle:** Render visible data first; load additional data on scroll or on-demand. - Panel lists: Render first 20 items, lazy-load on scroll - Charts: Render at target width; no real-time updates for high-frequency data - 3D canvas: Render at 60fps; debounce pan/zoom interactions ### Caching - Filter selections (Where, When) cached in session storage - Panel scroll positions remembered during session - Charts cached until time range changes --- ## Error & Empty States ### Empty State **Pattern:** When no data matches filter or list is empty. **Display:** - Panel body shows centered, light grey message - Message: `type/body` in `colour/text/secondary` - Text: \"No [items] found\" or \"Check your filters\" - Optional icon above text (light grey, 48×48px) **Example:** \"No people found. Check your filters or adjust the time range.\" --- ### Error State **Pattern:** When an action fails or data cannot load. **Display:** - Panel body shows centered error message - Message: `type/body` in `colour/alert` (orange, once defined) - Heading: `type/h4` \"Error\" or specific error title - Optional retry button below message - Optional error code for support (small grey text below) **Example:** \"Error loading data. Status code: 500. Retry?\" **Keyboard support:** - Tab to retry button, Enter to retry - Escape to close error or return to previous state --- ## Responsive Breakpoints **Mobile (<768px):** - Panels overlay canvas at full width - Panels are swipeable/draggable to dismiss - Top bar condenses (logo smaller, icons only for filters) - Secondary nav wraps or becomes scrollable **Tablet (768px–1200px):** - Panels dock on right at 300px width - Canvas shrinks but remains visible - Secondary nav visible, single row **Desktop (>1200px):** - Panels dock on right at 320px width - Canvas full viewport minus panel width - All controls visible, horizontal layout preferred","absoluteBoundingBox":{"x":54316.0,"y":42263.93359375,"width":304.0,"height":14064.0},"isolatedAbsoluteRenderBounds":{"x":54314.16015625,"y":42270.0546875,"width":301.5546875,"height":14029.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":304.0,"y":14064.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Patterns\n\n## Overview\n\nPatterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens.\n\n---\n\n## Layout Patterns\n\n### Panel-Based Spatial Layout\n\n**Structure:** Main canvas (left/centre) + draggable side panels (right)\n\n**Anatomy:**\n- **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width\n- **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small`\n- **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions\n- **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset)\n- **Timeline scrubber:** Bottom of viewport, spanning full width\n\n**Responsive behaviour:**\n- On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss\n- On desktop (>768px): panels dock on right, canvas shrinks to accommodate\n\n**Use case:** Dashboard, map view, live monitoring\n\n---\n\n### Detail Drill-Down\n\n**Structure:** List panel → Detail panel → Related panels\n\n**Flow:**\n1. User clicks list item (e.g. \"Potential theft\" in Events)\n2. Selected event panel opens (or detail drawer slides in)\n3. Detail panel shows full information + related action links (Cameras, People, Timeline)\n4. User clicks action link to open related panel\n5. Back arrow returns to selected event detail\n\n**Panel stacking:**\n- Primary panel: Selected event\n- Secondary panel: Related person, timeline, or camera\n- Tertiary panel: If user drills deeper (e.g. timeline → specific incident)\n\n**Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel\n\n---\n\n### Modal Pickers (Date, Location)\n\n**Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation\n\n**Flow:**\n1. User clicks \"When\" or \"Where\" dropdown in top bar\n2. Picker modal slides up from bottom or appears inline\n3. User navigates picker (tabs, lists, grid cells)\n4. User selects option\n5. Picker closes, filter updates, interface refreshes with new data\n\n**Keyboard support:**\n- Arrow keys to navigate picker items\n- Enter to select\n- Escape to close without selecting\n\n**Visual feedback:**\n- Selected item highlighted in dark (`colour/active`)\n- Current selection persists until changed\n\n---\n\n## Interaction Patterns\n\n### Selection & Highlighting\n\n**Primary flow:**\n1. User sees list of items (events, people, data points)\n2. User clicks item to select\n3. Item highlights with background `colour/hover`\n4. Related detail panel opens or updates\n\n**Visual states:**\n- **Default:** `colour/bg/primary` background, `colour/text/primary` text\n- **Hover:** `colour/hover` background (cream/400), text unchanged\n- **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text\n\n**Keyboard support:**\n- Arrow keys to navigate list\n- Enter to select\n- Space to select (optional)\n\n---\n\n### Navigation via Back/Close\n\n**Pattern:** Panels always include back arrow (navigation) and close X (dismiss)\n\n**Back arrow:**\n- Returns to previous state or parent panel\n- Preserves scroll position (if applicable)\n- Visible only if there's a previous state to return to\n\n**Close X:**\n- Dismisses current panel\n- Returns to base view (e.g. map with no detail panels)\n- Always visible in panel header\n\n**Keyboard support:**\n- Escape key acts as close X (dismisses panel)\n- Alt+Left arrow acts as back button\n\n---\n\n### Status Indicators & Urgency\n\n**Alert dot (orange):**\n- Small 8px circle, top-right of avatar or button\n- Indicates urgent status (unreviewed, flagged, etc.)\n- Colour: `colour/alert` (#FF6B35, TBD — confirm value)\n\n**Notification list:**\n- \"Just now\" badges for recent alerts\n- Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp\n- Orange dot next to most recent items\n- Read/unread states (optional; not visible in current design)\n\n**Capacity badge:**\n- Circular dark badge (neutral/900) with white percentage text\n- Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\"\n\n**Ratio badge:**\n- Circular dark badge with split label, e.g. \"M:32 F:68\"\n- Indicates demographic breakdown or ratio metric\n\n**Temporal indicator:**\n- \"LIVE\" badge in calendar/date picker (active period tab)\n- Indicates real-time data stream\n\n---\n\n### Data Presentation\n\n**List-based:**\n- Categorical lists (Customer, Sales, Operational data)\n- Each list item is a link/button to drill-down\n- Section headers (`type/h4`) group related items\n\n**Card-based:**\n- Event card: image + avatar + title + metadata + description + related actions\n- Person card: avatar + name + metadata + related actions\n- Data card: chart + metadata\n\n**Chart-based:**\n- Bar charts with grey bars, axis labels\n- No chart title on the chart itself; title lives in panel header\n- Legend optional (axis labels sufficient for simple charts)\n\n**Table-based:**\n- Column headers in `type/h4` (bold monospace)\n- Rows in `type/body` (regular monospace)\n- No alternating row colours (density over visual variety)\n- Minimal borders; dividers use `colour/border/light`\n\n---\n\n## Visual Hierarchy\n\n### Typographic\n\n**Dominance order (largest → smallest):**\n1. `type/display` (48px) — Page title, hero heading (rarely used in Augur)\n2. `type/h1` (40px) — Major section heading\n3. `type/h2` (32px) — Subsection heading\n4. `type/h3` (28px) — Panel title, card heading\n5. `type/h4` (24px) — Section header, label, secondary heading\n6. `type/body-large` (20px) — Introductory text, large body\n7. `type/body` (16px) — Standard UI copy, list items, descriptions\n8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`)\n\n**Weight hierarchy:**\n- Bold: Headings, emphasis, CTAs\n- Regular: Body text, labels, most UI copy\n- Light: Secondary text, metadata (applied as weight override, not separate style)\n\n---\n\n### Colour\n\n**Dominance order:**\n1. Cream backgrounds (`colour/cream`) dominate visual space\n2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability\n3. Dark active state (`colour/active`, neutral/900) indicates selection\n4. Orange accent (`colour/alert`) draws attention to urgent items\n5. White canvas provides separation between 3D view and UI\n\n**Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts.\n\n---\n\n## Spacing & Alignment\n\n### Padding\n\n**Panel padding:**\n- Header: `space/4` (16px) on all sides\n- Body: `space/6` (24px) on all sides\n- List item: `space/4` (16px) horizontal, `space/2` (8px) vertical\n\n**Margins:**\n- Between sections within a panel: `space/6` (24px)\n- Between list items: None (border-based dividers)\n- Between action links: `space/4` (16px)\n\n### Grid\n\n**Base unit:** 8px  \n**Canvas width:** Variable (full minus panel width)  \n**Panel width:** 320px fixed  \n**Content width:** Full panel width minus padding\n\n**Align to 8px grid:**\n- Position: multiples of 8px\n- Size: multiples of 8px\n- Spacing: use `space/*` tokens (multiples of 4px or 8px)\n\n---\n\n## Motion (Future)\n\n**Tentative patterns (not currently specified):**\n- Panel slide-in/slide-out (250ms ease-out)\n- Dropdown fade-in (150ms ease-out)\n- Item hover scale (subtle, 1.02× scale)\n- Colour transitions (200ms ease-out for hover/active states)\n\n**Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation.\n\n---\n\n## Accessibility Patterns\n\n### Focus Management\n\n**Pattern:** Focus should move logically through the interface.\n\n- Tab order follows visual/reading order (left-to-right, top-to-bottom)\n- When a panel opens, focus moves to the panel's first focusable element\n- When a panel closes, focus returns to the triggering element\n- Modals trap focus (Tab wraps to first element after last)\n\n**Visual focus indicator:**\n- 2px outline in `colour/focus-ring` (neutral/800)\n- 2px offset from element boundary\n- Applies to all buttons, links, form inputs, and interactive elements\n\n---\n\n### Screen Reader Announcements\n\n**Patterns:**\n- When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\")\n- When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\")\n- When an action completes: Announce result (e.g. \"Filter applied, 12 results\")\n\n**Implementation:**\n- Use `aria-live=\"polite\"` for non-critical updates\n- Use `aria-live=\"assertive\"` for urgent alerts\n- Use `role=\"alert\"` for error messages\n\n---\n\n### Semantic HTML\n\n**Patterns:**\n- Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels)\n- Buttons: Use `<button>` for actions; `<a>` for navigation\n- Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\")\n- Lists: Use `<ul>` / `<ol>` / `<li>` for list content\n- Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically\n- Forms: Use `<label>` associated with inputs via `for` attribute or nesting\n\n---\n\n## Performance Patterns\n\n### Data Rendering\n\n**Principle:** Render visible data first; load additional data on scroll or on-demand.\n\n- Panel lists: Render first 20 items, lazy-load on scroll\n- Charts: Render at target width; no real-time updates for high-frequency data\n- 3D canvas: Render at 60fps; debounce pan/zoom interactions\n\n### Caching\n\n- Filter selections (Where, When) cached in session storage\n- Panel scroll positions remembered during session\n- Charts cached until time range changes\n\n---\n\n## Error & Empty States\n\n### Empty State\n\n**Pattern:** When no data matches filter or list is empty.\n\n**Display:**\n- Panel body shows centered, light grey message\n- Message: `type/body` in `colour/text/secondary`\n- Text: \"No [items] found\" or \"Check your filters\"\n- Optional icon above text (light grey, 48×48px)\n\n**Example:** \"No people found. Check your filters or adjust the time range.\"\n\n---\n\n### Error State\n\n**Pattern:** When an action fails or data cannot load.\n\n**Display:**\n- Panel body shows centered error message\n- Message: `type/body` in `colour/alert` (orange, once defined)\n- Heading: `type/h4` \"Error\" or specific error title\n- Optional retry button below message\n- Optional error code for support (small grey text below)\n\n**Example:** \"Error loading data. Status code: 500. Retry?\"\n\n**Keyboard support:**\n- Tab to retry button, Enter to retry\n- Escape to close error or return to previous state\n\n---\n\n## Responsive Breakpoints\n\n**Mobile (<768px):**\n- Panels overlay canvas at full width\n- Panels are swipeable/draggable to dismiss\n- Top bar condenses (logo smaller, icons only for filters)\n- Secondary nav wraps or becomes scrollable\n\n**Tablet (768px–1200px):**\n- Panels dock on right at 300px width\n- Canvas shrinks but remains visible\n- Secondary nav visible, single row\n\n**Desktop (>1200px):**\n- Panels dock on right at 320px width\n- Canvas full viewport minus panel width\n- All controls visible, horizontal layout preferred\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20373":{"type":"TEXT","id":"78:20373","name":"# Augur Components ## Overview This document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target. --- ## Buttons ### Icon Button **Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause). **Size:** 40×40px (icon 20×20px centered) **Padding:** None (icon-only, square aspect) **Background:** `colour/bg/primary` **Icon colour:** `colour/icon/primary` **Border:** None **Radius:** `radius/none` **States:** - **Default:** Background `colour/bg/primary`, icon `colour/icon/primary` - **Hover:** Background `colour/hover` (cream/400), icon unchanged - **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white) - **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled` - **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset **Variants:** - **Icon only** (standard) — as above - **With badge** — small red dot (8px) top-right corner for notifications **Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view --- ### Text Button / Link **Purpose:** Navigation and secondary actions within panels and lists. **Typography:** `type/body`, regular weight **Colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height) **Border:** None **Radius:** `radius/none` **States:** - **Default:** Text `colour/text/primary`, background transparent - **Hover:** Background `colour/hover`, text unchanged - **Active/selected:** Text `colour/active`, background `colour/bg/tertiary` - **Disabled:** Text `colour/text/disabled`, background transparent - **Focus:** Underline in `colour/focus-ring` **Variants:** - **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2` - **Inline** — no padding, appears in running text - **Full-width** — stretches to container width, text left-aligned **Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\" --- ## Inputs ### Dropdown / Select **Purpose:** Choose from predefined options (location, date, time, filter). **Height:** 40px **Padding:** `space/4` horizontal, `space/2` vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/medium` **Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary` **Radius:** `radius/none` **States:** - **Default:** As above - **Hover:** Background `colour/hover` - **Focus:** Border `colour/focus-ring`, outline 2px offset - **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation) - **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled` **Interaction:** - Click to open dropdown menu - Menu items: 40px height, `type/body`, left-aligned with `space/4` padding - Selected item: Background `colour/active`, text `colour/text/inverse` - Unselected items: Background `colour/bg/primary`, text `colour/text/primary` - Keyboard: Arrow keys to navigate, Enter to select, Escape to close **Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\" --- ### Calendar / Date Picker **Purpose:** Select a date or time period (year, month, week, day, live). **Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day). **Period tabs:** - Horizontal layout, `space/2` gap - Tab size: min 48×32px - Typography: `type/body`, bold - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` (neutral/900) - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` **Grid cells:** - Size: 40×40px minimum - Typography: `type/body`, regular - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` - Border: 1px `colour/border/light` between cells - Today indicator: Underline in `colour/active` (if applicable) **Interaction:** - Click period tab to switch grid view - Click cell to select - Keyboard: Arrow keys to navigate, Enter to select, Escape to close - LIVE mode: shows real-time timestamp **Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8 --- ### Location Picker **Purpose:** Hierarchical geographic navigation (Country → Region → Area). **Height:** Full panel, scrollable if >6 items **Item height:** 44px minimum **Padding:** `space/4` per item **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` between items **Arrow:** Right-aligned, `colour/icon/secondary` **Layout:** - Header: Back arrow (24×24px, `colour/icon/primary`), title, close X - Body: List of items, each with label and arrow - Footer: Optional breadcrumb or current selection **Interaction:** - Click item to drill down (arrow navigates to sub-level) - Click back arrow to navigate up - Click close X to dismiss - Keyboard: Arrow keys, Enter to select/navigate, Escape to close **Examples:** \"England → London\", \"England → South East\", etc. --- ## Panels & Modals ### Panel Header **Purpose:** Title, navigation, and close controls for side panels. **Height:** 48px minimum **Padding:** `space/4` horizontal and vertical **Background:** `colour/bg/tertiary` (cream/200) **Border:** 1px `colour/border/light` bottom **Typography:** `type/h4` for major panels, `type/body` for secondary **Text colour:** `colour/text/primary` **Layout:** Flex, space-between - **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`) - **Centre:** Title / label, left-aligned - **Right:** Close button (X, 24×24px icon button) **Interaction:** - Back arrow navigates to previous state - Close X dismisses panel **Examples:** - \"Customer numbers\" (data list header) - \"Selected event\" (detail header) - \"Notifications (3)\" (notification drawer header) --- ### Panel Body **Purpose:** Main content area for panels. **Background:** `colour/bg/primary` (cream/500) **Padding:** `space/6` (24px) all sides **Typography:** `type/body` for text, `type/h4` for section headers **Text colour:** `colour/text/primary` **Border:** `shadow/small` (raised effect) **Max width:** 320px (typical panel width) **Scrollable:** Yes, if content exceeds viewport height **Content types:** - Section headers (`type/h4`, margin-top `space/6` except first) - List items (with or without images/avatars) - Detail cards (image, text, metadata) - Text blocks (descriptions, AI-generated summaries) - Charts (bar charts with axis labels) **Interaction:** - Click list items or links to navigate or open detail panels - Panels can stack (e.g. Customer numbers → detail drawer) --- ## Lists & Tables ### List Item **Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications). **Height:** 44px minimum (text only), 64px+ (with images) **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Background (hover):** `colour/hover` (cream/400) **Border:** 1px `colour/border/light` bottom **Radius:** `radius/none` **Anatomy:** - **Left:** Label or label + secondary text (metadata) - **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon **Variants:** - **Simple label** — single line, bold - **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`) - **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow - **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below **Interaction:** - Click to navigate to detail or drill down - Optional: swipe to reveal actions (secondary interaction) **Examples:** - \"Numbers\" with arrow (data category) - \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event) - Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person) --- ### Notification List Item **Purpose:** High-priority alert display with time, status, and action. **Height:** 80px minimum **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp) **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` bottom **Avatar:** Circular, 40×40px, left-aligned **Anatomy:** - **Left:** Avatar (40×40px, square corners) - **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge - **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge) **Badge variants:** - Notification dot (8px orange circle for urgent alerts) - Percentage badge (circular, dark background, white bold text, e.g. \"92%\") - Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\") --- ## Cards ### Event Detail Card **Purpose:** Full details for a selected incident or event. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing 2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge 3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description) 4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\" 5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text) 6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4` **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) **Interaction:** - Click action links to drill down or open related panels - Avatar click: open person detail panel --- ### Person Detail Card **Purpose:** Individual profile with summary and related actions. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Avatar** — Large circular, 120×120px, square corners, centred 2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description) 3. **Location** — `type/body` with `colour/text/secondary` 4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) --- ### Data Detail Card **Purpose:** Visualisation and metrics display. **Layout:** Vertical stack **Width:** Variable (panel or embedded in dashboard) **Padding:** `space/6` all sides **Content structure:** 1. **Header** — `type/h4` title, e.g. \"Customer numbers\" 2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical 3. **Footer** — Metadata, e.g. date range, data source **Chart style:** - Bars: Neutral grey (`colour/neutral/600` or darker) - Background: Transparent or very light (`colour/bg/primary`) - Axis labels: `type/body` with `colour/text/secondary` - Grid: Optional light dividers (`colour/border/light`) --- ## Navigation ### Top Bar **Purpose:** Global application header with logo, filters, and user controls. **Height:** 48px **Padding:** `space/4` horizontal **Background:** `colour/neutral/0` (white) **Border:** 1px `colour/border/light` bottom **Layout:** Flex, space-between **Sections:** - **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned) - **Centre:** Global filters (Dropdowns for Where and When) - **Right:** Notification icon (with badge) + User avatar icon button **Interaction:** - Click filters to open pickers - Click notification icon to open notification drawer - Click avatar to open user menu --- ### Secondary Navigation Bar **Purpose:** View/mode selector (Map, Data, Events, People, etc.). **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/tertiary` (cream/200) **Border:** None **Layout:** Flex, space-between or space-around **Tab anatomy:** - Height: 40px - Icon: 20×20px, left-aligned or centred - Label: `type/body`, left-aligned or centred - Background: `colour/bg/tertiary` (inactive) - Background: `colour/active` (active tab) - Text: `colour/text/primary` (inactive), `colour/text/inverse` (active) - Padding: `space/2` to `space/4` **Interaction:** - Click tab to switch view - Active tab indicated by dark background - Keyboard: Left/Right arrow keys to navigate, Enter to select **Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon) --- ### Floating Controls (Canvas) **Purpose:** View manipulation and playback controls positioned near 3D canvas. **Position:** Bottom-right, 16px offset from edges **Layout:** Vertical stack, `space/2` gap **Controls:** 1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary` 2. **Zoom controls** — Icon button (+ and -), stacked vertically 3. **Reset/recenter** — Icon button (refresh icon) **Spacing:** `space/2` (8px) between buttons **Size:** 40×40px per button **Interaction:** Click to activate function --- ### Timeline / Scrubber Bar **Purpose:** Temporal navigation and playback. **Position:** Bottom of viewport **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/primary` (cream/500) **Border:** 1px `colour/border/light` top **Layout:** Flex, space-between **Sections:** - **Left:** Play/pause button (icon button, 32×32px) - **Centre:** Scrubber track (draggable timeline, shows current position) - **Right:** Timecode readout (`type/body`, e.g. \"23:59\") **Interaction:** - Click play/pause to control playback - Drag scrubber to seek to time - Timecode updates in real-time --- ## Accessibility Notes ### Keyboard Navigation - All buttons and links are focusable (Tab key) - Icon buttons include visible focus ring (2px outline in `colour/focus-ring`) - Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter - Escape closes open modals and pickers ### ARIA Labels - Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\") - Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded` - Panels include semantic heading tags (`<h2>`, `<h3>`) - List items include `role=\"button\"` if clickable ### Touch Targets - Minimum 44×44px for all interactive elements - Icon buttons: 40×40px (meets 44px height with padding) - List items: 44px minimum height - Panel close button: 24×24px icon, but padded to 44×44px touch area ### Colour Contrast - All text: 4.5:1 ratio minimum (primary text on primary background) - Large text: 3:1 ratio acceptable - Icons: 3:1 ratio minimum against background - Alert colour (orange): tested against background for WCAG AA ### Screen Reader Support - Images include alt text (hero images, avatars) - Panels marked with semantic headings - Status indicators (badges, dots) include aria-live regions for updates - Tables include semantic `<th>` and `<td>` elements ### Monospace Considerations - Line length kept under 70 characters (readability) - Letter spacing adequate (monospace is denser than humanist sans) - Avoid all-caps for extended text (lowercase/title case preferred)","absoluteBoundingBox":{"x":54316.0,"y":22623.931640625,"width":304.0,"height":19440.0},"isolatedAbsoluteRenderBounds":{"x":54314.16015625,"y":22629.8125,"width":301.5546875,"height":19405.83984375},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":304.0,"y":19440.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Components\n\n## Overview\n\nThis document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target.\n\n---\n\n## Buttons\n\n### Icon Button\n\n**Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause).\n\n**Size:** 40×40px (icon 20×20px centered)  \n**Padding:** None (icon-only, square aspect)  \n**Background:** `colour/bg/primary`  \n**Icon colour:** `colour/icon/primary`  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Background `colour/bg/primary`, icon `colour/icon/primary`\n- **Hover:** Background `colour/hover` (cream/400), icon unchanged\n- **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white)\n- **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled`\n- **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset\n\n**Variants:**\n- **Icon only** (standard) — as above\n- **With badge** — small red dot (8px) top-right corner for notifications\n\n**Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view\n\n---\n\n### Text Button / Link\n\n**Purpose:** Navigation and secondary actions within panels and lists.\n\n**Typography:** `type/body`, regular weight  \n**Colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height)  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Text `colour/text/primary`, background transparent\n- **Hover:** Background `colour/hover`, text unchanged\n- **Active/selected:** Text `colour/active`, background `colour/bg/tertiary`\n- **Disabled:** Text `colour/text/disabled`, background transparent\n- **Focus:** Underline in `colour/focus-ring`\n\n**Variants:**\n- **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2`\n- **Inline** — no padding, appears in running text\n- **Full-width** — stretches to container width, text left-aligned\n\n**Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\"\n\n---\n\n## Inputs\n\n### Dropdown / Select\n\n**Purpose:** Choose from predefined options (location, date, time, filter).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal, `space/2` vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/medium`  \n**Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary`  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** As above\n- **Hover:** Background `colour/hover`\n- **Focus:** Border `colour/focus-ring`, outline 2px offset\n- **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation)\n- **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled`\n\n**Interaction:**\n- Click to open dropdown menu\n- Menu items: 40px height, `type/body`, left-aligned with `space/4` padding\n- Selected item: Background `colour/active`, text `colour/text/inverse`\n- Unselected items: Background `colour/bg/primary`, text `colour/text/primary`\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n\n**Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\"\n\n---\n\n### Calendar / Date Picker\n\n**Purpose:** Select a date or time period (year, month, week, day, live).\n\n**Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day).\n\n**Period tabs:**\n- Horizontal layout, `space/2` gap\n- Tab size: min 48×32px\n- Typography: `type/body`, bold\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active` (neutral/900)\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n\n**Grid cells:**\n- Size: 40×40px minimum\n- Typography: `type/body`, regular\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active`\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n- Border: 1px `colour/border/light` between cells\n- Today indicator: Underline in `colour/active` (if applicable)\n\n**Interaction:**\n- Click period tab to switch grid view\n- Click cell to select\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n- LIVE mode: shows real-time timestamp\n\n**Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8\n\n---\n\n### Location Picker\n\n**Purpose:** Hierarchical geographic navigation (Country → Region → Area).\n\n**Height:** Full panel, scrollable if >6 items  \n**Item height:** 44px minimum  \n**Padding:** `space/4` per item  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` between items  \n**Arrow:** Right-aligned, `colour/icon/secondary`\n\n**Layout:**\n- Header: Back arrow (24×24px, `colour/icon/primary`), title, close X\n- Body: List of items, each with label and arrow\n- Footer: Optional breadcrumb or current selection\n\n**Interaction:**\n- Click item to drill down (arrow navigates to sub-level)\n- Click back arrow to navigate up\n- Click close X to dismiss\n- Keyboard: Arrow keys, Enter to select/navigate, Escape to close\n\n**Examples:** \"England → London\", \"England → South East\", etc.\n\n---\n\n## Panels & Modals\n\n### Panel Header\n\n**Purpose:** Title, navigation, and close controls for side panels.\n\n**Height:** 48px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** 1px `colour/border/light` bottom  \n**Typography:** `type/h4` for major panels, `type/body` for secondary  \n**Text colour:** `colour/text/primary`\n\n**Layout:** Flex, space-between\n- **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`)\n- **Centre:** Title / label, left-aligned\n- **Right:** Close button (X, 24×24px icon button)\n\n**Interaction:**\n- Back arrow navigates to previous state\n- Close X dismisses panel\n\n**Examples:**\n- \"Customer numbers\" (data list header)\n- \"Selected event\" (detail header)\n- \"Notifications (3)\" (notification drawer header)\n\n---\n\n### Panel Body\n\n**Purpose:** Main content area for panels.\n\n**Background:** `colour/bg/primary` (cream/500)  \n**Padding:** `space/6` (24px) all sides  \n**Typography:** `type/body` for text, `type/h4` for section headers  \n**Text colour:** `colour/text/primary`  \n**Border:** `shadow/small` (raised effect)  \n**Max width:** 320px (typical panel width)  \n**Scrollable:** Yes, if content exceeds viewport height\n\n**Content types:**\n- Section headers (`type/h4`, margin-top `space/6` except first)\n- List items (with or without images/avatars)\n- Detail cards (image, text, metadata)\n- Text blocks (descriptions, AI-generated summaries)\n- Charts (bar charts with axis labels)\n\n**Interaction:**\n- Click list items or links to navigate or open detail panels\n- Panels can stack (e.g. Customer numbers → detail drawer)\n\n---\n\n## Lists & Tables\n\n### List Item\n\n**Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications).\n\n**Height:** 44px minimum (text only), 64px+ (with images)  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Background (hover):** `colour/hover` (cream/400)  \n**Border:** 1px `colour/border/light` bottom  \n**Radius:** `radius/none`\n\n**Anatomy:**\n- **Left:** Label or label + secondary text (metadata)\n- **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon\n\n**Variants:**\n- **Simple label** — single line, bold\n- **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`)\n- **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow\n- **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below\n\n**Interaction:**\n- Click to navigate to detail or drill down\n- Optional: swipe to reveal actions (secondary interaction)\n\n**Examples:**\n- \"Numbers\" with arrow (data category)\n- \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event)\n- Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person)\n\n---\n\n### Notification List Item\n\n**Purpose:** High-priority alert display with time, status, and action.\n\n**Height:** 80px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp)  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` bottom  \n**Avatar:** Circular, 40×40px, left-aligned\n\n**Anatomy:**\n- **Left:** Avatar (40×40px, square corners)\n- **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge\n- **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge)\n\n**Badge variants:**\n- Notification dot (8px orange circle for urgent alerts)\n- Percentage badge (circular, dark background, white bold text, e.g. \"92%\")\n- Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\")\n\n---\n\n## Cards\n\n### Event Detail Card\n\n**Purpose:** Full details for a selected incident or event.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing\n2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge\n3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description)\n4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\"\n5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text)\n6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4`\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n**Interaction:**\n- Click action links to drill down or open related panels\n- Avatar click: open person detail panel\n\n---\n\n### Person Detail Card\n\n**Purpose:** Individual profile with summary and related actions.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Avatar** — Large circular, 120×120px, square corners, centred\n2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description)\n3. **Location** — `type/body` with `colour/text/secondary`\n4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n---\n\n### Data Detail Card\n\n**Purpose:** Visualisation and metrics display.\n\n**Layout:** Vertical stack  \n**Width:** Variable (panel or embedded in dashboard)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Header** — `type/h4` title, e.g. \"Customer numbers\"\n2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical\n3. **Footer** — Metadata, e.g. date range, data source\n\n**Chart style:**\n- Bars: Neutral grey (`colour/neutral/600` or darker)\n- Background: Transparent or very light (`colour/bg/primary`)\n- Axis labels: `type/body` with `colour/text/secondary`\n- Grid: Optional light dividers (`colour/border/light`)\n\n---\n\n## Navigation\n\n### Top Bar\n\n**Purpose:** Global application header with logo, filters, and user controls.\n\n**Height:** 48px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/neutral/0` (white)  \n**Border:** 1px `colour/border/light` bottom  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned)\n- **Centre:** Global filters (Dropdowns for Where and When)\n- **Right:** Notification icon (with badge) + User avatar icon button\n\n**Interaction:**\n- Click filters to open pickers\n- Click notification icon to open notification drawer\n- Click avatar to open user menu\n\n---\n\n### Secondary Navigation Bar\n\n**Purpose:** View/mode selector (Map, Data, Events, People, etc.).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** None  \n**Layout:** Flex, space-between or space-around\n\n**Tab anatomy:**\n- Height: 40px\n- Icon: 20×20px, left-aligned or centred\n- Label: `type/body`, left-aligned or centred\n- Background: `colour/bg/tertiary` (inactive)\n- Background: `colour/active` (active tab)\n- Text: `colour/text/primary` (inactive), `colour/text/inverse` (active)\n- Padding: `space/2` to `space/4`\n\n**Interaction:**\n- Click tab to switch view\n- Active tab indicated by dark background\n- Keyboard: Left/Right arrow keys to navigate, Enter to select\n\n**Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon)\n\n---\n\n### Floating Controls (Canvas)\n\n**Purpose:** View manipulation and playback controls positioned near 3D canvas.\n\n**Position:** Bottom-right, 16px offset from edges  \n**Layout:** Vertical stack, `space/2` gap\n\n**Controls:**\n1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary`\n2. **Zoom controls** — Icon button (+ and -), stacked vertically\n3. **Reset/recenter** — Icon button (refresh icon)\n\n**Spacing:** `space/2` (8px) between buttons  \n**Size:** 40×40px per button  \n**Interaction:** Click to activate function\n\n---\n\n### Timeline / Scrubber Bar\n\n**Purpose:** Temporal navigation and playback.\n\n**Position:** Bottom of viewport  \n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/primary` (cream/500)  \n**Border:** 1px `colour/border/light` top  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Play/pause button (icon button, 32×32px)\n- **Centre:** Scrubber track (draggable timeline, shows current position)\n- **Right:** Timecode readout (`type/body`, e.g. \"23:59\")\n\n**Interaction:**\n- Click play/pause to control playback\n- Drag scrubber to seek to time\n- Timecode updates in real-time\n\n---\n\n## Accessibility Notes\n\n### Keyboard Navigation\n- All buttons and links are focusable (Tab key)\n- Icon buttons include visible focus ring (2px outline in `colour/focus-ring`)\n- Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter\n- Escape closes open modals and pickers\n\n### ARIA Labels\n- Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\")\n- Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded`\n- Panels include semantic heading tags (`<h2>`, `<h3>`)\n- List items include `role=\"button\"` if clickable\n\n### Touch Targets\n- Minimum 44×44px for all interactive elements\n- Icon buttons: 40×40px (meets 44px height with padding)\n- List items: 44px minimum height\n- Panel close button: 24×24px icon, but padded to 44×44px touch area\n\n### Colour Contrast\n- All text: 4.5:1 ratio minimum (primary text on primary background)\n- Large text: 3:1 ratio acceptable\n- Icons: 3:1 ratio minimum against background\n- Alert colour (orange): tested against background for WCAG AA\n\n### Screen Reader Support\n- Images include alt text (hero images, avatars)\n- Panels marked with semantic headings\n- Status indicators (badges, dots) include aria-live regions for updates\n- Tables include semantic `<th>` and `<td>` elements\n\n### Monospace Considerations\n- Line length kept under 70 characters (readability)\n- Letter spacing adequate (monospace is denser than humanist sans)\n- Avoid all-caps for extended text (lowercase/title case preferred)\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20372":{"type":"TEXT","id":"78:20372","name":"COMPONENTS.MD","absoluteBoundingBox":{"x":54316.0,"y":22551.931640625,"width":304.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":54318.17578125,"y":22564.69140625,"width":254.54296875,"height":22.720703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"COMPONENTS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2755":{"type":"FRAME","id":"34:2755","name":"left","absoluteBoundingBox":{"x":54280.0,"y":100.0,"width":376.0,"height":475.932037353516},"isolatedAbsoluteRenderBounds":{"x":54280.0,"y":100.0,"width":376.0,"height":475.932037353516},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":376.0,"y":475.932037353516},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":16.0,"paddingRight":16.0,"paddingBottom":16.0,"paddingLeft":16.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2756","63:17435","34:2761"]},"34:2774":{"type":"FRAME","id":"34:2774","name":"Agent preparation","absoluteBoundingBox":{"x":54296.0,"y":535.932006835938,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":535.932006835938,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":344.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2775"]},"34:2775":{"type":"TEXT","id":"34:2775","name":"Agent preparation","absoluteBoundingBox":{"x":54300.0,"y":535.932006835938,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54300.3515625,"y":541.588012695312,"width":166.65625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Agent preparation","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2772":{"type":"FRAME","id":"34:2772","name":"Final outcome","absoluteBoundingBox":{"x":54296.0,"y":499.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":499.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3333},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2341},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/final-outcome"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2773"]},"34:2773":{"type":"TEXT","id":"34:2773","name":"Final outcome","absoluteBoundingBox":{"x":54300.0,"y":499.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54302.0,"y":505.588043212891,"width":125.65625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Final outcome","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2768":{"type":"FRAME","id":"34:2768","name":"Product definition","absoluteBoundingBox":{"x":54296.0,"y":427.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":427.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,108.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3331},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/product-definition"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2769"]},"34:2769":{"type":"TEXT","id":"34:2769","name":"Product definition","absoluteBoundingBox":{"x":54300.0,"y":427.932037353516,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54301.6171875,"y":433.588043212891,"width":165.390625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Product definition","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2767":{"type":"TEXT","id":"34:2767","name":"Design system","absoluteBoundingBox":{"x":54300.0,"y":391.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54301.34375,"y":397.588043212891,"width":126.59765625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Design system","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2765":{"type":"TEXT","id":"34:2765","name":"Branding design","absoluteBoundingBox":{"x":54300.0,"y":355.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54301.48828125,"y":361.588043212891,"width":145.67578125,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Branding design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2778":{"type":"FRAME","id":"34:2778","name":"1","absoluteBoundingBox":{"x":54296.0,"y":591.932006835938,"width":344.0,"height":10888.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":591.932006835938,"width":344.0,"height":10888.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":344.0,"y":10888.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["41:3543","78:20332"]},"34:2762":{"type":"FRAME","id":"34:2762","name":"Introduction","absoluteBoundingBox":{"x":54296.0,"y":319.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":319.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3328},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":781},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2763"]},"34:2763":{"type":"TEXT","id":"34:2763","name":"Introduction","absoluteBoundingBox":{"x":54300.0,"y":319.932037353516,"width":120.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54301.6484375,"y":325.588043212891,"width":115.75,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":120.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Introduction","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20578":{"type":"TEXT","id":"78:20578","name":"ACCESSIBILITY.MD","absoluteBoundingBox":{"x":54316.0,"y":76719.9296875,"width":304.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":54316.703125,"y":76732.6875,"width":256.109375,"height":70.2421875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"ACCESSIBILITY.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2750":{"type":"FRAME","id":"34:2750","name":"screens","absoluteBoundingBox":{"x":53744.0,"y":100.0,"width":472.0,"height":79728.0},"isolatedAbsoluteRenderBounds":{"x":53744.0,"y":100.0,"width":472.0,"height":79728.0},"relativeTransform":[[1.0,0.0,296.0],[0.0,1.0,0.0]],"size":{"x":472.0,"y":79728.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":24.0,"paddingBottom":24.0,"paddingLeft":24.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["34:2751"]},"34:2751":{"type":"FRAME","id":"34:2751","name":"introduction","absoluteBoundingBox":{"x":53768.0,"y":124.0,"width":424.0,"height":79680.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":124.0,"width":424.0,"height":79680.0},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,24.0]],"size":{"x":424.0,"y":79680.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1920.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["34:2752","78:20344","78:20368","78:20391","78:20414","78:20574"]},"78:20576":{"type":"TEXT","id":"78:20576","name":"# Augur Accessibility ## Overview Augur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints. --- ## Colour Contrast ### Requirements All text and interactive elements must meet WCAG AA contrast ratios: - **4.5:1** for standard text (14px and below) - **3:1** for large text (18px+ or 14px+ bold) - **3:1** for graphical elements (borders, icons) and components ### Palette Compliance **Text on cream backgrounds:** - `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓ - `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓ - `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum) **Text on neutral/900 backgrounds (active state):** - `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓ **Icons on backgrounds:** - `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓ - `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓ **Alert/status colour (orange, TBD):** - Requires testing once final hex value is provided - Minimum 3:1 on white and cream backgrounds ### Testing **Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse **Checklist:** - [ ] All body text meets 4.5:1 contrast minimum - [ ] All headings meet 3:1 contrast minimum - [ ] All icons meet 3:1 contrast minimum - [ ] Active/selected states are visually distinct from inactive states - [ ] Links are underlined or otherwise distinct from body text - [ ] Colour alone is not used to convey information (pair with shape, text, or pattern) --- ## Typography ### Readability **Font choice:** - PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing - Augur uses monospace intentionally for data density and professional appearance **Line length:** - **Optimal:** 50–70 characters per line - **Minimum:** 40 characters (in narrow panels) - **Maximum:** 100 characters (avoid in body text) - Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓ **Line spacing:** - `type/body`: 24px line-height (1.5× base size) ✓ - `type/h3`: 36px line-height (1.29× base size) ✓ - Sufficient for readability and dyslexia-friendly rendering **Font size:** - Minimum 16px for body text ✓ - Headings scale appropriately (24px–48px) - Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette **Weight:** - Bold used for headings and emphasis (not for extended body text) - Regular weight for standard copy (readability optimized) - Light weight used sparingly (metadata, secondary text) ### Testing **Checklist:** - [ ] No text smaller than 14px for body content - [ ] Line-height at least 1.5× font size - [ ] Line length between 40–100 characters - [ ] Adequate white space between text blocks - [ ] Headings use semantic hierarchy (no skipped levels) --- ## Keyboard Navigation ### Focus Management **Requirement:** All interactive elements must be accessible via keyboard. **Focus order:** - Top-to-bottom, left-to-right reading order - Tab moves forward, Shift+Tab moves backward - When a modal/panel opens, focus moves to the first focusable element - When a modal/panel closes, focus returns to the triggering element - Focus trap in modals (Tab from last element wraps to first) **Focus indicator:** - 2px solid outline in `colour/focus-ring` (neutral/800, #494541) - 2px offset from element edge - Visible at all times (not removed on focus, only on blur) - High contrast (minimum 3:1) against background ### Keyboard Shortcuts **Global:** - Tab: Move to next focusable element - Shift+Tab: Move to previous focusable element - Escape: Close open modal, dropdown, or panel **Within dropdowns/pickers:** - Arrow Up/Down: Navigate items - Arrow Left/Right: Navigate tabs or columns - Enter: Select item - Escape: Close without selecting **Within panels:** - Enter: Activate button or link - Space: Toggle checkbox (if applicable) **Browser conventions:** - Alt+Left Arrow: Back (browser/application back) - Alt+Right Arrow: Forward - F5: Refresh (standard; not overridden) ### Testing **Checklist:** - [ ] All buttons and links are reachable via Tab - [ ] Focus order follows visual reading order - [ ] Focus indicator is always visible and high-contrast - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers and lists - [ ] No keyboard traps (user can Tab away from any element) - [ ] No content is keyboard-only or mouse-only --- ## Screen Reader Support ### Semantic HTML **Requirement:** Use semantic HTML to convey structure and meaning to assistive technology. **Tags:** - `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels) - `<button>`: Interactive buttons - `<a>`: Links (with descriptive text, not \"click here\") - `<ul>`, `<ol>`, `<li>`: Lists - `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables - `<label>`: Form label (associated via `for` or nesting) - `<nav>`: Navigation region - `<main>`: Main content area - `<aside>`: Sidebar or supplementary content - `<article>`: Self-contained content block ### ARIA Attributes **Requirement:** Use ARIA only to supplement semantic HTML, not replace it. **Landmarks:** - `role=\"banner\"`: Top bar / header - `role=\"main\"`: Primary content area - `role=\"navigation\"`: Navigation menu - `role=\"contentinfo\"`: Footer **Buttons & links:** - `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\") - `aria-pressed`: For toggle buttons (true/false state) - `aria-expanded`: For expandable/collapsible sections (true/false) **Lists:** - `aria-label`: For unlabeled lists (e.g. \"Related actions\") - `role=\"listbox\"`: For selectable item lists (dropdowns, pickers) - `aria-selected`: For selected items in a listbox **Live regions:** - `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\") - `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\") - `aria-atomic=\"true\"`: Announce entire region, not just changes - `role=\"alert\"`: For error messages or warnings **Images:** - `alt`: Descriptive text for images (mandatory for all `<img>` elements) - Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type) - Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>` **Form inputs:** - `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>` - `aria-label` if visible label not possible - `aria-describedby` for help text or error messages **Data tables:** - `<table>` with semantic structure - `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`) - `<td>` for data cells - Avoid merged cells; if necessary, use `colspan`/`rowspan` with care ### Screen Reader Testing **Tools:** - NVDA (Windows, free) - JAWS (Windows, paid) - VoiceOver (macOS/iOS, built-in) - TalkBack (Android, built-in) **Checklist:** - [ ] Panel headers and titles are announced correctly - [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\") - [ ] Links include descriptive text (not just \"arrow\" or \"more\") - [ ] Buttons include labels and states (not just icons) - [ ] Tables are announced with headers and structure - [ ] Error messages are announced immediately - [ ] Status updates are announced live (via aria-live) - [ ] Images have appropriate alt text --- ## Motion & Animation ### Vestibular & Photosensitivity **Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity. **Guidelines:** - No animations that move at more than 3 full revolutions per second - No flashing or flickering (no more than 3 flashes per second in a 1-second window) - No large moving areas that fill >25% of the viewport - Animation should be kept under 500ms for most interactions ### Prefers Reduced Motion **Requirement:** Respect the `prefers-reduced-motion` media query. **Implementation:** ```css @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } ``` **Checklist:** - [ ] Panel transitions respect `prefers-reduced-motion` - [ ] Hover animations are minimal (no parallax or large movements) - [ ] Loading states don't use spinning or flashing - [ ] No auto-playing videos or audio --- ## Touch & Mobile ### Touch Target Size **Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements). **Augur components:** - Icon button: 40×40px (meets requirement with padding) - List item: 44px height minimum - Dropdown: 40px height + `space/4` padding vertical (meets requirement) - Text button: 40px height minimum **Spacing:** - Between touch targets: At least 8px (preferably 12px) - Avoid small, closely-spaced buttons ### Gesture Support **Requirement:** Don't rely on complex gestures; provide alternative inputs. **Supported gestures:** - Tap: Standard button/link activation - Long-press: Optional (secondary action, always has keyboard alternative) - Swipe: Optional (dismiss panels on mobile, always has close button) - Pinch: Optional (zoom; always has +/- buttons) **Mobile-specific:** - On narrow viewports, panels overlay canvas instead of docking - Swipe panels right to dismiss (alternative: close X button) - Landscape orientation supported (panels still dock right if space allows) ### Testing **Checklist:** - [ ] All buttons are at least 44×44px - [ ] Touch targets have at least 8px spacing - [ ] No reliance on hover states (buttons work via tap) - [ ] Landscape and portrait orientations both work - [ ] Swipe and pinch have keyboard alternatives --- ## Testing Checklist ### Automated Testing **Tools:** - Lighthouse (Chrome DevTools) - axe DevTools (browser extension) - WAVE (WebAIM extension) **Run for:** - [ ] Colour contrast (all text, icons, borders) - [ ] Missing alt text - [ ] Missing form labels - [ ] Missing heading hierarchy - [ ] Keyboard traps - [ ] Focus management - [ ] ARIA usage errors ### Manual Testing **Keyboard:** - [ ] Tab through entire page, confirm logical order - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers - [ ] Focus indicator always visible - [ ] No keyboard traps **Screen reader (NVDA or VoiceOver):** - [ ] Headings announce correctly - [ ] List items announce with count - [ ] Links have descriptive text - [ ] Buttons include labels and states - [ ] Errors announce immediately - [ ] Live regions update correctly **Visual:** - [ ] Text is at least 14px - [ ] Line-height is at least 1.5× - [ ] Line length is 40–100 characters - [ ] Headings use semantic hierarchy - [ ] Colour contrast meets WCAG AA - [ ] Focus indicator is always visible - [ ] No information conveyed by colour alone **Mobile:** - [ ] Touch targets are 44×44px - [ ] Landscape and portrait work - [ ] Swipe/pinch have alternatives ### Browser Compatibility **Test on:** - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) - Mobile browsers (Safari iOS, Chrome Android) ### Assistive Technology **Test with:** - NVDA (free, Windows) - JAWS (paid, Windows) - VoiceOver (built-in, macOS/iOS) - TalkBack (built-in, Android) --- ## Remediation If an accessibility issue is found: 1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor) 2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog 3. **Fix:** Implement semantic HTML, ARIA, or CSS changes 4. **Retest:** Confirm fix with automated tool and manual testing 5. **Verify:** Test fix on multiple screen readers and browsers --- ## Resources - **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/ - **WebAIM:** https://webaim.org/ - **A11y Project:** https://www.a11yproject.com/ - **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/ - **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ --- ## Compliance Statement Augur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline. **Last audit:** [Date] **Next audit:** [Date + 3 months] **Issues:** [Link to issue tracker]","absoluteBoundingBox":{"x":53788.0,"y":65924.0,"width":384.0,"height":13824.0},"isolatedAbsoluteRenderBounds":{"x":53786.16015625,"y":65929.65625,"width":379.19140625,"height":13790.0625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":13824.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Accessibility\n\n## Overview\n\nAugur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints.\n\n---\n\n## Colour Contrast\n\n### Requirements\n\nAll text and interactive elements must meet WCAG AA contrast ratios:\n- **4.5:1** for standard text (14px and below)\n- **3:1** for large text (18px+ or 14px+ bold)\n- **3:1** for graphical elements (borders, icons) and components\n\n### Palette Compliance\n\n**Text on cream backgrounds:**\n- `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓\n- `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓\n- `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum)\n\n**Text on neutral/900 backgrounds (active state):**\n- `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓\n\n**Icons on backgrounds:**\n- `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓\n- `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓\n\n**Alert/status colour (orange, TBD):**\n- Requires testing once final hex value is provided\n- Minimum 3:1 on white and cream backgrounds\n\n### Testing\n\n**Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse\n\n**Checklist:**\n- [ ] All body text meets 4.5:1 contrast minimum\n- [ ] All headings meet 3:1 contrast minimum\n- [ ] All icons meet 3:1 contrast minimum\n- [ ] Active/selected states are visually distinct from inactive states\n- [ ] Links are underlined or otherwise distinct from body text\n- [ ] Colour alone is not used to convey information (pair with shape, text, or pattern)\n\n---\n\n## Typography\n\n### Readability\n\n**Font choice:**\n- PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing\n- Augur uses monospace intentionally for data density and professional appearance\n\n**Line length:**\n- **Optimal:** 50–70 characters per line\n- **Minimum:** 40 characters (in narrow panels)\n- **Maximum:** 100 characters (avoid in body text)\n- Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓\n\n**Line spacing:**\n- `type/body`: 24px line-height (1.5× base size) ✓\n- `type/h3`: 36px line-height (1.29× base size) ✓\n- Sufficient for readability and dyslexia-friendly rendering\n\n**Font size:**\n- Minimum 16px for body text ✓\n- Headings scale appropriately (24px–48px)\n- Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette\n\n**Weight:**\n- Bold used for headings and emphasis (not for extended body text)\n- Regular weight for standard copy (readability optimized)\n- Light weight used sparingly (metadata, secondary text)\n\n### Testing\n\n**Checklist:**\n- [ ] No text smaller than 14px for body content\n- [ ] Line-height at least 1.5× font size\n- [ ] Line length between 40–100 characters\n- [ ] Adequate white space between text blocks\n- [ ] Headings use semantic hierarchy (no skipped levels)\n\n---\n\n## Keyboard Navigation\n\n### Focus Management\n\n**Requirement:** All interactive elements must be accessible via keyboard.\n\n**Focus order:**\n- Top-to-bottom, left-to-right reading order\n- Tab moves forward, Shift+Tab moves backward\n- When a modal/panel opens, focus moves to the first focusable element\n- When a modal/panel closes, focus returns to the triggering element\n- Focus trap in modals (Tab from last element wraps to first)\n\n**Focus indicator:**\n- 2px solid outline in `colour/focus-ring` (neutral/800, #494541)\n- 2px offset from element edge\n- Visible at all times (not removed on focus, only on blur)\n- High contrast (minimum 3:1) against background\n\n### Keyboard Shortcuts\n\n**Global:**\n- Tab: Move to next focusable element\n- Shift+Tab: Move to previous focusable element\n- Escape: Close open modal, dropdown, or panel\n\n**Within dropdowns/pickers:**\n- Arrow Up/Down: Navigate items\n- Arrow Left/Right: Navigate tabs or columns\n- Enter: Select item\n- Escape: Close without selecting\n\n**Within panels:**\n- Enter: Activate button or link\n- Space: Toggle checkbox (if applicable)\n\n**Browser conventions:**\n- Alt+Left Arrow: Back (browser/application back)\n- Alt+Right Arrow: Forward\n- F5: Refresh (standard; not overridden)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons and links are reachable via Tab\n- [ ] Focus order follows visual reading order\n- [ ] Focus indicator is always visible and high-contrast\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers and lists\n- [ ] No keyboard traps (user can Tab away from any element)\n- [ ] No content is keyboard-only or mouse-only\n\n---\n\n## Screen Reader Support\n\n### Semantic HTML\n\n**Requirement:** Use semantic HTML to convey structure and meaning to assistive technology.\n\n**Tags:**\n- `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels)\n- `<button>`: Interactive buttons\n- `<a>`: Links (with descriptive text, not \"click here\")\n- `<ul>`, `<ol>`, `<li>`: Lists\n- `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables\n- `<label>`: Form label (associated via `for` or nesting)\n- `<nav>`: Navigation region\n- `<main>`: Main content area\n- `<aside>`: Sidebar or supplementary content\n- `<article>`: Self-contained content block\n\n### ARIA Attributes\n\n**Requirement:** Use ARIA only to supplement semantic HTML, not replace it.\n\n**Landmarks:**\n- `role=\"banner\"`: Top bar / header\n- `role=\"main\"`: Primary content area\n- `role=\"navigation\"`: Navigation menu\n- `role=\"contentinfo\"`: Footer\n\n**Buttons & links:**\n- `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\")\n- `aria-pressed`: For toggle buttons (true/false state)\n- `aria-expanded`: For expandable/collapsible sections (true/false)\n\n**Lists:**\n- `aria-label`: For unlabeled lists (e.g. \"Related actions\")\n- `role=\"listbox\"`: For selectable item lists (dropdowns, pickers)\n- `aria-selected`: For selected items in a listbox\n\n**Live regions:**\n- `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\")\n- `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\")\n- `aria-atomic=\"true\"`: Announce entire region, not just changes\n- `role=\"alert\"`: For error messages or warnings\n\n**Images:**\n- `alt`: Descriptive text for images (mandatory for all `<img>` elements)\n- Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type)\n- Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>`\n\n**Form inputs:**\n- `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>`\n- `aria-label` if visible label not possible\n- `aria-describedby` for help text or error messages\n\n**Data tables:**\n- `<table>` with semantic structure\n- `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`)\n- `<td>` for data cells\n- Avoid merged cells; if necessary, use `colspan`/`rowspan` with care\n\n### Screen Reader Testing\n\n**Tools:**\n- NVDA (Windows, free)\n- JAWS (Windows, paid)\n- VoiceOver (macOS/iOS, built-in)\n- TalkBack (Android, built-in)\n\n**Checklist:**\n- [ ] Panel headers and titles are announced correctly\n- [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\")\n- [ ] Links include descriptive text (not just \"arrow\" or \"more\")\n- [ ] Buttons include labels and states (not just icons)\n- [ ] Tables are announced with headers and structure\n- [ ] Error messages are announced immediately\n- [ ] Status updates are announced live (via aria-live)\n- [ ] Images have appropriate alt text\n\n---\n\n## Motion & Animation\n\n### Vestibular & Photosensitivity\n\n**Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity.\n\n**Guidelines:**\n- No animations that move at more than 3 full revolutions per second\n- No flashing or flickering (no more than 3 flashes per second in a 1-second window)\n- No large moving areas that fill >25% of the viewport\n- Animation should be kept under 500ms for most interactions\n\n### Prefers Reduced Motion\n\n**Requirement:** Respect the `prefers-reduced-motion` media query.\n\n**Implementation:**\n```css\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n  }\n}\n```\n\n**Checklist:**\n- [ ] Panel transitions respect `prefers-reduced-motion`\n- [ ] Hover animations are minimal (no parallax or large movements)\n- [ ] Loading states don't use spinning or flashing\n- [ ] No auto-playing videos or audio\n\n---\n\n## Touch & Mobile\n\n### Touch Target Size\n\n**Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements).\n\n**Augur components:**\n- Icon button: 40×40px (meets requirement with padding)\n- List item: 44px height minimum\n- Dropdown: 40px height + `space/4` padding vertical (meets requirement)\n- Text button: 40px height minimum\n\n**Spacing:**\n- Between touch targets: At least 8px (preferably 12px)\n- Avoid small, closely-spaced buttons\n\n### Gesture Support\n\n**Requirement:** Don't rely on complex gestures; provide alternative inputs.\n\n**Supported gestures:**\n- Tap: Standard button/link activation\n- Long-press: Optional (secondary action, always has keyboard alternative)\n- Swipe: Optional (dismiss panels on mobile, always has close button)\n- Pinch: Optional (zoom; always has +/- buttons)\n\n**Mobile-specific:**\n- On narrow viewports, panels overlay canvas instead of docking\n- Swipe panels right to dismiss (alternative: close X button)\n- Landscape orientation supported (panels still dock right if space allows)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons are at least 44×44px\n- [ ] Touch targets have at least 8px spacing\n- [ ] No reliance on hover states (buttons work via tap)\n- [ ] Landscape and portrait orientations both work\n- [ ] Swipe and pinch have keyboard alternatives\n\n---\n\n## Testing Checklist\n\n### Automated Testing\n\n**Tools:**\n- Lighthouse (Chrome DevTools)\n- axe DevTools (browser extension)\n- WAVE (WebAIM extension)\n\n**Run for:**\n- [ ] Colour contrast (all text, icons, borders)\n- [ ] Missing alt text\n- [ ] Missing form labels\n- [ ] Missing heading hierarchy\n- [ ] Keyboard traps\n- [ ] Focus management\n- [ ] ARIA usage errors\n\n### Manual Testing\n\n**Keyboard:**\n- [ ] Tab through entire page, confirm logical order\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers\n- [ ] Focus indicator always visible\n- [ ] No keyboard traps\n\n**Screen reader (NVDA or VoiceOver):**\n- [ ] Headings announce correctly\n- [ ] List items announce with count\n- [ ] Links have descriptive text\n- [ ] Buttons include labels and states\n- [ ] Errors announce immediately\n- [ ] Live regions update correctly\n\n**Visual:**\n- [ ] Text is at least 14px\n- [ ] Line-height is at least 1.5×\n- [ ] Line length is 40–100 characters\n- [ ] Headings use semantic hierarchy\n- [ ] Colour contrast meets WCAG AA\n- [ ] Focus indicator is always visible\n- [ ] No information conveyed by colour alone\n\n**Mobile:**\n- [ ] Touch targets are 44×44px\n- [ ] Landscape and portrait work\n- [ ] Swipe/pinch have alternatives\n\n### Browser Compatibility\n\n**Test on:**\n- Chrome (latest)\n- Firefox (latest)\n- Safari (latest)\n- Edge (latest)\n- Mobile browsers (Safari iOS, Chrome Android)\n\n### Assistive Technology\n\n**Test with:**\n- NVDA (free, Windows)\n- JAWS (paid, Windows)\n- VoiceOver (built-in, macOS/iOS)\n- TalkBack (built-in, Android)\n\n---\n\n## Remediation\n\nIf an accessibility issue is found:\n\n1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor)\n2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog\n3. **Fix:** Implement semantic HTML, ARIA, or CSS changes\n4. **Retest:** Confirm fix with automated tool and manual testing\n5. **Verify:** Test fix on multiple screen readers and browsers\n\n---\n\n## Resources\n\n- **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/\n- **WebAIM:** https://webaim.org/\n- **A11y Project:** https://www.a11yproject.com/\n- **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/\n- **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/\n\n---\n\n## Compliance Statement\n\nAugur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline.\n\n**Last audit:** [Date]  \n**Next audit:** [Date + 3 months]  \n**Issues:** [Link to issue tracker]\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20416":{"type":"TEXT","id":"78:20416","name":"# Augur Personas — Index ## Overview Augur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone. --- ## Persona Comparison Matrix | Persona | Primary goal | Time pressure | Technical skill | Device | Key feature | |---|---|---|---|---|---| | **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail | | **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export | | **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends | | **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary | | **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile | | **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation | --- ## Design Decisions by Persona ### Information Architecture **Government & Law enforcement** prioritise: - Timeline and historical context (drill-down from event → details → related) - People and places (find person, then events, then timeline) - Export and integration (share findings, integrate with external tools) **Council planners & owners** prioritise: - Aggregated metrics and trends (summary first, detail optional) - Comparative analysis (year-over-year, location-to-location) - Export for reports and presentations **Retailers & security operators** prioritise: - Alerts and notifications (passive receipt of urgent information) - Mobile access (not always at desk) - Minimal friction (quick lookup, confirm, act) ### Interaction Patterns **Government & law enforcement:** - Keyboard shortcuts (fast users) - Saved filters and workspaces (reuse across shifts) - Bulk export and reporting **Council & owners:** - Prebuilt reports and dashboards - Comparative date/time pickers - Visual summaries before detail **Retailers & operators:** - Push notifications and alerts - One-click actions (confirm, share, log) - Minimal navigation depth ### Copy & Tone **Government & law enforcement:** - Direct and precise (authoritative, no softening) - Technical vocabulary acceptable (they know the jargon) - Procedural language (actionable instructions) **Council & owners:** - Clear and jargon-free (may not know public safety terminology) - Contextual explanation (what this metric means, why it matters) - Business-focused language **Retailers & operators:** - Urgent but calm (no alarmism, but clear on severity) - Action-oriented (what to do, not why) - Short, scannable copy --- ## Feature Prioritisation by Persona ### Must-have (all personas) - Search/filter by location and date range - Detail panel for persons and events - Photo/avatar visibility - Export to PDF/CSV ### High-value (government, law enforcement) - Save and name filters - Timeline view with granular timestamps - Related data drilling (event → people → timeline) - Audit logging - Full historical data access ### High-value (council, commercial owner) - Prebuilt report templates - Comparative date filters - Trend charts and visualisations - Email scheduling for reports ### High-value (retailers, security operators) - Real-time notifications and alerts - Mobile app with offline capability - Quick incident logging (forms with presets) - Location map with heatmap view - Integration with mobile devices (tablet, smartphone) --- ## Accessibility & Inclusion All personas should be able to use Augur with: - Keyboard navigation (for all, especially desktop-heavy users) - Screen reader support (government analysts using accessibility features) - Mobile responsiveness (operators in field) - Low-tech fallbacks (alert SMS if app unavailable) --- # Augur Persona — Government Analyst **Role:** MI5/MI6 intelligence analyst **Goal:** Find and monitor hostile foreign agents operating in the UK **Frequency:** Daily, shift-based (8–12 hour blocks) ### Profile - **Age:** 28–45 - **Technical skill:** High (comfortable with complex systems, data tools) - **Context:** Secure, government facility with dedicated workstations - **Devices:** Desktop/laptop only; no mobile access - **Time pressure:** High (real-time monitoring, time-sensitive intelligence) ### Needs - **Speed:** Locate persons of interest within seconds - **Precision:** Confirm identity with high confidence (facial recognition, metadata matching) - **Historical context:** Access to full timeline of sightings and related incidents - **Integration:** Cross-reference with external databases and intelligence feeds - **Audit trail:** Detailed logs for compliance and legal proceedings ### Pain points - Current systems are fragmented (multiple tools for tracking, mapping, reporting) - Slow handoffs between shifts lose critical context - Geographic and temporal filtering is tedious (manual entry, limited saved filters) - Cannot quickly correlate multiple sightings across locations ### How they use Augur 1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours) 2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals 3. **Investigation:** Drill into specific event; review timeline and related people; export data for report 4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical) ### Design implications - **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status) - **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks - **Export options:** CSV, PDF for reports and compliance - **Audit annotations:** Allow analysts to add notes to specific sightings for context ---  # Augur Persona — Law Enforcement Officer **Role:** Investigator or counter-terrorism police **Goal:** Identify and locate persons of interest; build case evidence **Frequency:** Variable (reactive to incidents, proactive investigation cycles) ### Profile - **Age:** 30–50 - **Technical skill:** Medium (comfortable with common tools; less patience for complexity) - **Context:** Police station, patrol vehicle, incident scene - **Devices:** Desktop, laptop, occasionally tablet - **Time pressure:** Very high (active incidents, rapidly changing situations) ### Needs - **Immediate answers:** \"Where was this person in the last hour?\" - **Visual confirmation:** Photo, video, location map (not just data tables) - **Actionable intelligence:** Predict next location or movement pattern - **Evidence capture:** Screenshots, video clips for case files - **Team coordination:** Share findings with other officers or teams ### Pain points - Fragmented tools make scene response slow (check map, then check database, then check timeline) - Cannot quickly verify identity from CCTV feeds - Difficulty assessing threat level or modus operandi from raw data - Manual cross-referencing between locations is error-prone ### How they use Augur 1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours) 2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events 3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits 4. **Evidence collection:** Screenshot detail panel and timeline for case file 5. **Team briefing:** Share annotated view with other officers via secure link ### Design implications - **Large avatars and photos:** Visual confirmation is critical; images should be prominent - **Map integration:** Spatial context (where sightings occurred) matters more than abstract data - **Quick summaries:** AI-written incident summaries to provide instant context - **Mobile-first:** Design panels to work well on tablet and small screens - **Offline mode:** Critical workflows should work without network (for vehicle/scene use) ---  # Augur Persona — Council Planner **Role:** Urban planner, public safety coordinator **Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements **Frequency:** Weekly or monthly (strategic planning cycles, not real-time) ### Profile - **Age:** 35–55 - **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools) - **Context:** Office desk, occasional council meetings - **Devices:** Desktop/laptop; rare mobile use - **Time pressure:** Low (can spend time exploring data, generating reports) ### Needs - **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\" - **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes - **Exportable reports:** Data and visualisations for presentations and board documents - **Actionable insights:** Not raw data, but curated analysis with recommendations ### Pain points - Difficult to answer \"what changed?\" questions without historical data - Cannot easily generate heatmaps or trend charts for reports - Manual data aggregation from multiple sources is time-consuming - Lacks statistical context (is this trend significant or noise?) ### How they use Augur 1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days) 2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends 3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics 4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation 5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes ### Design implications - **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel) - **Comparative filters:** Quick way to compare two time periods side-by-side - **Summary statistics:** Show totals, averages, % change to highlight trends - **Natural language:** Avoid jargon; use plain English summaries - **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work --- # Augur Persona — Commercial Space Owner **Role:** Airport, shopping centre, stadium, or venue manager **Goal:** Ensure safety and security of premises; prevent theft, reduce incidents **Frequency:** Daily or weekly (operational oversight) ### Profile - **Age:** 35–60 - **Technical skill:** Low (comfort with basic software; prefers simplicity over power) - **Context:** Manager's office or security control room - **Devices:** Desktop/laptop; occasionally tablet - **Time pressure:** Medium (reactive to incidents; proactive reviews weekly) ### Needs - **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\" - **Staff briefing:** Prepare daily or weekly briefing for security team - **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas) - **Alert integration:** Receive notifications of serious incidents in real-time ### Pain points - Cannot quickly identify if incidents are isolated or part of a pattern - Lacks visibility into peak risk times (when to increase staffing) - Manual incident reports from security team are fragmented and slow - Difficult to demonstrate ROI of security improvements to leadership ### How they use Augur 1. **Daily check-in:** Open map; filter by location (venue) and today's date 2. **Incident review:** Click on incident to see details (what, where, when, involved parties) 3. **Weekly briefing:** Export summary of incidents and trends for security team meeting 4. **Quarterly report:** Generate 3-month report of incidents by type and location for board 5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues) ### Design implications - **Simplified interface:** Reduce options; show only relevant data for venue operators - **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters - **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity) - **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display) - **Email/SMS alerts:** Notify manager of serious incidents via push/email --- # Augur Persona — Retailer **Role:** Retail manager (supermarket, department store, independent shop) **Goal:** Prevent theft and loss; improve store operations; train staff on safety **Frequency:** Daily to weekly (depends on store size and incident frequency) ### Profile - **Age:** 28–50 - **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools) - **Context:** Store office or back-of-house area - **Devices:** Desktop/laptop; increasingly tablet (during floor rounds) - **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods) ### Needs - **Rapid response:** Identify shoplifter or employee theft in real-time - **Loss visibility:** \"How much loss are we experiencing? In which department?\" - **Staff training:** Use incident data to train staff on prevention and procedures - **Evidence capture:** Collect footage/data for loss prevention or legal proceedings ### Pain points - Manual incident reporting from floor staff (time-consuming, incomplete) - Difficult to see patterns (same offender, same time of day, same location in store) - Cannot correlate \"suspicious activity\" alerts with actual losses - Lack of visibility into employee-related incidents ### How they use Augur 1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification) 2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?) 3. **Shift review:** End of day, check incidents during shift; brief team on patterns 4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items 5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends ### Design implications - **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in) - **Repeat offender flag:** Highlight if same person has multiple incidents - **Item-level data:** Connect incidents to specific products/departments (requires POS integration) - **Playback mode:** Show timeline of activity before/after incident (useful for training) - **Mobile-first:** Managers check app from floor or office (not always at desk) --- # Augur Persona — Security Operator **Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema) **Goal:** Respond to incidents quickly; identify threats; protect staff and customers **Frequency:** Shift-based (continuous presence during operating hours) ### Profile - **Age:** 22–45 - **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools) - **Context:** Security control room or mobile (patrol, incident scene) - **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone - **Time pressure:** Very high (active incidents demand immediate action) ### Needs - **Instant alerts:** Notification of flagged individuals or unusual activity - **Visual confirmation:** Live camera feed or photos to verify threat level - **Location intelligence:** Where did the person go? Which exit will they use? - **Backup coordination:** Quick way to request additional security or police - **Incident log:** Record what happened for post-incident review ### Pain points - Fragmented tools (CCTV system, incident log, radio/comms separate) - Cannot quickly pull historical context (is this person a repeat problem?) - Difficulty communicating precise location/identity to backup teams - Manual incident reporting after the fact (time-consuming, errors) ### How they use Augur 1. **Real-time monitoring:** Control room displays map with heat map of recent activity 2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location 3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept 4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message 5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review ### Design implications - **Alert-centric design:** Notifications are primary interaction (not searching) - **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity) - **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone - **Voice-friendly:** Support dictation for incident logging (hands-free during active response) - **Offline resilience:** Core functions work without network (video playback, past data) - **Minimal friction:** Fewer clicks to log incident or alert backup --- See accessibility.md for full WCAG 2.1 AA compliance details.","absoluteBoundingBox":{"x":53788.0,"y":48964.0,"width":384.0,"height":16752.0},"isolatedAbsoluteRenderBounds":{"x":53788.3515625,"y":48970.12109375,"width":375.86328125,"height":16741.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":16752.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Personas — Index\n\n## Overview\n\nAugur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone.\n\n---\n\n\n## Persona Comparison Matrix\n\n| Persona | Primary goal | Time pressure | Technical skill | Device | Key feature |\n|---|---|---|---|---|---|\n| **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail |\n| **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export |\n| **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends |\n| **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary |\n| **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile |\n| **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation |\n\n---\n\n## Design Decisions by Persona\n\n### Information Architecture\n\n**Government & Law enforcement** prioritise:\n- Timeline and historical context (drill-down from event → details → related)\n- People and places (find person, then events, then timeline)\n- Export and integration (share findings, integrate with external tools)\n\n**Council planners & owners** prioritise:\n- Aggregated metrics and trends (summary first, detail optional)\n- Comparative analysis (year-over-year, location-to-location)\n- Export for reports and presentations\n\n**Retailers & security operators** prioritise:\n- Alerts and notifications (passive receipt of urgent information)\n- Mobile access (not always at desk)\n- Minimal friction (quick lookup, confirm, act)\n\n### Interaction Patterns\n\n**Government & law enforcement:**\n- Keyboard shortcuts (fast users)\n- Saved filters and workspaces (reuse across shifts)\n- Bulk export and reporting\n\n**Council & owners:**\n- Prebuilt reports and dashboards\n- Comparative date/time pickers\n- Visual summaries before detail\n\n**Retailers & operators:**\n- Push notifications and alerts\n- One-click actions (confirm, share, log)\n- Minimal navigation depth\n\n### Copy & Tone\n\n**Government & law enforcement:**\n- Direct and precise (authoritative, no softening)\n- Technical vocabulary acceptable (they know the jargon)\n- Procedural language (actionable instructions)\n\n**Council & owners:**\n- Clear and jargon-free (may not know public safety terminology)\n- Contextual explanation (what this metric means, why it matters)\n- Business-focused language\n\n**Retailers & operators:**\n- Urgent but calm (no alarmism, but clear on severity)\n- Action-oriented (what to do, not why)\n- Short, scannable copy\n\n---\n\n## Feature Prioritisation by Persona\n\n### Must-have (all personas)\n- Search/filter by location and date range\n- Detail panel for persons and events\n- Photo/avatar visibility\n- Export to PDF/CSV\n\n### High-value (government, law enforcement)\n- Save and name filters\n- Timeline view with granular timestamps\n- Related data drilling (event → people → timeline)\n- Audit logging\n- Full historical data access\n\n### High-value (council, commercial owner)\n- Prebuilt report templates\n- Comparative date filters\n- Trend charts and visualisations\n- Email scheduling for reports\n\n### High-value (retailers, security operators)\n- Real-time notifications and alerts\n- Mobile app with offline capability\n- Quick incident logging (forms with presets)\n- Location map with heatmap view\n- Integration with mobile devices (tablet, smartphone)\n\n---\n\n## Accessibility & Inclusion\n\nAll personas should be able to use Augur with:\n- Keyboard navigation (for all, especially desktop-heavy users)\n- Screen reader support (government analysts using accessibility features)\n- Mobile responsiveness (operators in field)\n- Low-tech fallbacks (alert SMS if app unavailable)\n\n---\n\n# Augur Persona — Government Analyst\n\n**Role:** MI5/MI6 intelligence analyst  \n**Goal:** Find and monitor hostile foreign agents operating in the UK  \n**Frequency:** Daily, shift-based (8–12 hour blocks)\n\n### Profile\n\n- **Age:** 28–45\n- **Technical skill:** High (comfortable with complex systems, data tools)\n- **Context:** Secure, government facility with dedicated workstations\n- **Devices:** Desktop/laptop only; no mobile access\n- **Time pressure:** High (real-time monitoring, time-sensitive intelligence)\n\n### Needs\n\n- **Speed:** Locate persons of interest within seconds\n- **Precision:** Confirm identity with high confidence (facial recognition, metadata matching)\n- **Historical context:** Access to full timeline of sightings and related incidents\n- **Integration:** Cross-reference with external databases and intelligence feeds\n- **Audit trail:** Detailed logs for compliance and legal proceedings\n\n### Pain points\n\n- Current systems are fragmented (multiple tools for tracking, mapping, reporting)\n- Slow handoffs between shifts lose critical context\n- Geographic and temporal filtering is tedious (manual entry, limited saved filters)\n- Cannot quickly correlate multiple sightings across locations\n\n### How they use Augur\n\n1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours)\n2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals\n3. **Investigation:** Drill into specific event; review timeline and related people; export data for report\n4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical)\n\n### Design implications\n\n- **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status)\n- **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks\n- **Export options:** CSV, PDF for reports and compliance\n- **Audit annotations:** Allow analysts to add notes to specific sightings for context\n\n---  # Augur Persona — Law Enforcement Officer\n\n**Role:** Investigator or counter-terrorism police  \n**Goal:** Identify and locate persons of interest; build case evidence  \n**Frequency:** Variable (reactive to incidents, proactive investigation cycles)\n\n### Profile\n\n- **Age:** 30–50\n- **Technical skill:** Medium (comfortable with common tools; less patience for complexity)\n- **Context:** Police station, patrol vehicle, incident scene\n- **Devices:** Desktop, laptop, occasionally tablet\n- **Time pressure:** Very high (active incidents, rapidly changing situations)\n\n### Needs\n\n- **Immediate answers:** \"Where was this person in the last hour?\"\n- **Visual confirmation:** Photo, video, location map (not just data tables)\n- **Actionable intelligence:** Predict next location or movement pattern\n- **Evidence capture:** Screenshots, video clips for case files\n- **Team coordination:** Share findings with other officers or teams\n\n### Pain points\n\n- Fragmented tools make scene response slow (check map, then check database, then check timeline)\n- Cannot quickly verify identity from CCTV feeds\n- Difficulty assessing threat level or modus operandi from raw data\n- Manual cross-referencing between locations is error-prone\n\n### How they use Augur\n\n1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours)\n2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events\n3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits\n4. **Evidence collection:** Screenshot detail panel and timeline for case file\n5. **Team briefing:** Share annotated view with other officers via secure link\n\n### Design implications\n\n- **Large avatars and photos:** Visual confirmation is critical; images should be prominent\n- **Map integration:** Spatial context (where sightings occurred) matters more than abstract data\n- **Quick summaries:** AI-written incident summaries to provide instant context\n- **Mobile-first:** Design panels to work well on tablet and small screens\n- **Offline mode:** Critical workflows should work without network (for vehicle/scene use)\n\n---\n # Augur Persona — Council Planner\n\n**Role:** Urban planner, public safety coordinator  \n**Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements  \n**Frequency:** Weekly or monthly (strategic planning cycles, not real-time)\n\n### Profile\n\n- **Age:** 35–55\n- **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools)\n- **Context:** Office desk, occasional council meetings\n- **Devices:** Desktop/laptop; rare mobile use\n- **Time pressure:** Low (can spend time exploring data, generating reports)\n\n### Needs\n\n- **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\"\n- **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes\n- **Exportable reports:** Data and visualisations for presentations and board documents\n- **Actionable insights:** Not raw data, but curated analysis with recommendations\n\n### Pain points\n\n- Difficult to answer \"what changed?\" questions without historical data\n- Cannot easily generate heatmaps or trend charts for reports\n- Manual data aggregation from multiple sources is time-consuming\n- Lacks statistical context (is this trend significant or noise?)\n\n### How they use Augur\n\n1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days)\n2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends\n3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics\n4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation\n5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes\n\n### Design implications\n\n- **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel)\n- **Comparative filters:** Quick way to compare two time periods side-by-side\n- **Summary statistics:** Show totals, averages, % change to highlight trends\n- **Natural language:** Avoid jargon; use plain English summaries\n- **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work\n\n---\n\n# Augur Persona — Commercial Space Owner\n\n**Role:** Airport, shopping centre, stadium, or venue manager  \n**Goal:** Ensure safety and security of premises; prevent theft, reduce incidents  \n**Frequency:** Daily or weekly (operational oversight)\n\n### Profile\n\n- **Age:** 35–60\n- **Technical skill:** Low (comfort with basic software; prefers simplicity over power)\n- **Context:** Manager's office or security control room\n- **Devices:** Desktop/laptop; occasionally tablet\n- **Time pressure:** Medium (reactive to incidents; proactive reviews weekly)\n\n### Needs\n\n- **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\"\n- **Staff briefing:** Prepare daily or weekly briefing for security team\n- **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas)\n- **Alert integration:** Receive notifications of serious incidents in real-time\n\n### Pain points\n\n- Cannot quickly identify if incidents are isolated or part of a pattern\n- Lacks visibility into peak risk times (when to increase staffing)\n- Manual incident reports from security team are fragmented and slow\n- Difficult to demonstrate ROI of security improvements to leadership\n\n### How they use Augur\n\n1. **Daily check-in:** Open map; filter by location (venue) and today's date\n2. **Incident review:** Click on incident to see details (what, where, when, involved parties)\n3. **Weekly briefing:** Export summary of incidents and trends for security team meeting\n4. **Quarterly report:** Generate 3-month report of incidents by type and location for board\n5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues)\n\n### Design implications\n\n- **Simplified interface:** Reduce options; show only relevant data for venue operators\n- **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters\n- **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity)\n- **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display)\n- **Email/SMS alerts:** Notify manager of serious incidents via push/email\n\n---\n\n# Augur Persona — Retailer\n\n**Role:** Retail manager (supermarket, department store, independent shop)  \n**Goal:** Prevent theft and loss; improve store operations; train staff on safety  \n**Frequency:** Daily to weekly (depends on store size and incident frequency)\n\n### Profile\n\n- **Age:** 28–50\n- **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools)\n- **Context:** Store office or back-of-house area\n- **Devices:** Desktop/laptop; increasingly tablet (during floor rounds)\n- **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods)\n\n### Needs\n\n- **Rapid response:** Identify shoplifter or employee theft in real-time\n- **Loss visibility:** \"How much loss are we experiencing? In which department?\"\n- **Staff training:** Use incident data to train staff on prevention and procedures\n- **Evidence capture:** Collect footage/data for loss prevention or legal proceedings\n\n### Pain points\n\n- Manual incident reporting from floor staff (time-consuming, incomplete)\n- Difficult to see patterns (same offender, same time of day, same location in store)\n- Cannot correlate \"suspicious activity\" alerts with actual losses\n- Lack of visibility into employee-related incidents\n\n### How they use Augur\n\n1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification)\n2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?)\n3. **Shift review:** End of day, check incidents during shift; brief team on patterns\n4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items\n5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends\n\n### Design implications\n\n- **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in)\n- **Repeat offender flag:** Highlight if same person has multiple incidents\n- **Item-level data:** Connect incidents to specific products/departments (requires POS integration)\n- **Playback mode:** Show timeline of activity before/after incident (useful for training)\n- **Mobile-first:** Managers check app from floor or office (not always at desk)\n\n---\n\n# Augur Persona — Security Operator\n\n**Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema)  \n**Goal:** Respond to incidents quickly; identify threats; protect staff and customers  \n**Frequency:** Shift-based (continuous presence during operating hours)\n\n### Profile\n\n- **Age:** 22–45\n- **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools)\n- **Context:** Security control room or mobile (patrol, incident scene)\n- **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone\n- **Time pressure:** Very high (active incidents demand immediate action)\n\n### Needs\n\n- **Instant alerts:** Notification of flagged individuals or unusual activity\n- **Visual confirmation:** Live camera feed or photos to verify threat level\n- **Location intelligence:** Where did the person go? Which exit will they use?\n- **Backup coordination:** Quick way to request additional security or police\n- **Incident log:** Record what happened for post-incident review\n\n### Pain points\n\n- Fragmented tools (CCTV system, incident log, radio/comms separate)\n- Cannot quickly pull historical context (is this person a repeat problem?)\n- Difficulty communicating precise location/identity to backup teams\n- Manual incident reporting after the fact (time-consuming, errors)\n\n### How they use Augur\n\n1. **Real-time monitoring:** Control room displays map with heat map of recent activity\n2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location\n3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept\n4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message\n5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review\n\n### Design implications\n\n- **Alert-centric design:** Notifications are primary interaction (not searching)\n- **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity)\n- **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone\n- **Voice-friendly:** Support dictation for incident logging (hands-free during active response)\n- **Offline resilience:** Core functions work without network (video playback, past data)\n- **Minimal friction:** Fewer clicks to log incident or alert backup\n\n---\n\nSee accessibility.md for full WCAG 2.1 AA compliance details.","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20391":{"type":"FRAME","id":"78:20391","name":"4","absoluteBoundingBox":{"x":53768.0,"y":36268.0,"width":424.0,"height":12544.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":36268.0,"width":424.0,"height":12544.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36144.0]],"size":{"x":424.0,"y":12544.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20392","78:20393"]},"78:20393":{"type":"TEXT","id":"78:20393","name":"# Augur Patterns ## Overview Patterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens. --- ## Layout Patterns ### Panel-Based Spatial Layout **Structure:** Main canvas (left/centre) + draggable side panels (right) **Anatomy:** - **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width - **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small` - **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions - **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset) - **Timeline scrubber:** Bottom of viewport, spanning full width **Responsive behaviour:** - On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss - On desktop (>768px): panels dock on right, canvas shrinks to accommodate **Use case:** Dashboard, map view, live monitoring --- ### Detail Drill-Down **Structure:** List panel → Detail panel → Related panels **Flow:** 1. User clicks list item (e.g. \"Potential theft\" in Events) 2. Selected event panel opens (or detail drawer slides in) 3. Detail panel shows full information + related action links (Cameras, People, Timeline) 4. User clicks action link to open related panel 5. Back arrow returns to selected event detail **Panel stacking:** - Primary panel: Selected event - Secondary panel: Related person, timeline, or camera - Tertiary panel: If user drills deeper (e.g. timeline → specific incident) **Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel --- ### Modal Pickers (Date, Location) **Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation **Flow:** 1. User clicks \"When\" or \"Where\" dropdown in top bar 2. Picker modal slides up from bottom or appears inline 3. User navigates picker (tabs, lists, grid cells) 4. User selects option 5. Picker closes, filter updates, interface refreshes with new data **Keyboard support:** - Arrow keys to navigate picker items - Enter to select - Escape to close without selecting **Visual feedback:** - Selected item highlighted in dark (`colour/active`) - Current selection persists until changed --- ## Interaction Patterns ### Selection & Highlighting **Primary flow:** 1. User sees list of items (events, people, data points) 2. User clicks item to select 3. Item highlights with background `colour/hover` 4. Related detail panel opens or updates **Visual states:** - **Default:** `colour/bg/primary` background, `colour/text/primary` text - **Hover:** `colour/hover` background (cream/400), text unchanged - **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text **Keyboard support:** - Arrow keys to navigate list - Enter to select - Space to select (optional) --- ### Navigation via Back/Close **Pattern:** Panels always include back arrow (navigation) and close X (dismiss) **Back arrow:** - Returns to previous state or parent panel - Preserves scroll position (if applicable) - Visible only if there's a previous state to return to **Close X:** - Dismisses current panel - Returns to base view (e.g. map with no detail panels) - Always visible in panel header **Keyboard support:** - Escape key acts as close X (dismisses panel) - Alt+Left arrow acts as back button --- ### Status Indicators & Urgency **Alert dot (orange):** - Small 8px circle, top-right of avatar or button - Indicates urgent status (unreviewed, flagged, etc.) - Colour: `colour/alert` (#FF6B35, TBD — confirm value) **Notification list:** - \"Just now\" badges for recent alerts - Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp - Orange dot next to most recent items - Read/unread states (optional; not visible in current design) **Capacity badge:** - Circular dark badge (neutral/900) with white percentage text - Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\" **Ratio badge:** - Circular dark badge with split label, e.g. \"M:32 F:68\" - Indicates demographic breakdown or ratio metric **Temporal indicator:** - \"LIVE\" badge in calendar/date picker (active period tab) - Indicates real-time data stream --- ### Data Presentation **List-based:** - Categorical lists (Customer, Sales, Operational data) - Each list item is a link/button to drill-down - Section headers (`type/h4`) group related items **Card-based:** - Event card: image + avatar + title + metadata + description + related actions - Person card: avatar + name + metadata + related actions - Data card: chart + metadata **Chart-based:** - Bar charts with grey bars, axis labels - No chart title on the chart itself; title lives in panel header - Legend optional (axis labels sufficient for simple charts) **Table-based:** - Column headers in `type/h4` (bold monospace) - Rows in `type/body` (regular monospace) - No alternating row colours (density over visual variety) - Minimal borders; dividers use `colour/border/light` --- ## Visual Hierarchy ### Typographic **Dominance order (largest → smallest):** 1. `type/display` (48px) — Page title, hero heading (rarely used in Augur) 2. `type/h1` (40px) — Major section heading 3. `type/h2` (32px) — Subsection heading 4. `type/h3` (28px) — Panel title, card heading 5. `type/h4` (24px) — Section header, label, secondary heading 6. `type/body-large` (20px) — Introductory text, large body 7. `type/body` (16px) — Standard UI copy, list items, descriptions 8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`) **Weight hierarchy:** - Bold: Headings, emphasis, CTAs - Regular: Body text, labels, most UI copy - Light: Secondary text, metadata (applied as weight override, not separate style) --- ### Colour **Dominance order:** 1. Cream backgrounds (`colour/cream`) dominate visual space 2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability 3. Dark active state (`colour/active`, neutral/900) indicates selection 4. Orange accent (`colour/alert`) draws attention to urgent items 5. White canvas provides separation between 3D view and UI **Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts. --- ## Spacing & Alignment ### Padding **Panel padding:** - Header: `space/4` (16px) on all sides - Body: `space/6` (24px) on all sides - List item: `space/4` (16px) horizontal, `space/2` (8px) vertical **Margins:** - Between sections within a panel: `space/6` (24px) - Between list items: None (border-based dividers) - Between action links: `space/4` (16px) ### Grid **Base unit:** 8px **Canvas width:** Variable (full minus panel width) **Panel width:** 320px fixed **Content width:** Full panel width minus padding **Align to 8px grid:** - Position: multiples of 8px - Size: multiples of 8px - Spacing: use `space/*` tokens (multiples of 4px or 8px) --- ## Motion (Future) **Tentative patterns (not currently specified):** - Panel slide-in/slide-out (250ms ease-out) - Dropdown fade-in (150ms ease-out) - Item hover scale (subtle, 1.02× scale) - Colour transitions (200ms ease-out for hover/active states) **Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation. --- ## Accessibility Patterns ### Focus Management **Pattern:** Focus should move logically through the interface. - Tab order follows visual/reading order (left-to-right, top-to-bottom) - When a panel opens, focus moves to the panel's first focusable element - When a panel closes, focus returns to the triggering element - Modals trap focus (Tab wraps to first element after last) **Visual focus indicator:** - 2px outline in `colour/focus-ring` (neutral/800) - 2px offset from element boundary - Applies to all buttons, links, form inputs, and interactive elements --- ### Screen Reader Announcements **Patterns:** - When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\") - When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\") - When an action completes: Announce result (e.g. \"Filter applied, 12 results\") **Implementation:** - Use `aria-live=\"polite\"` for non-critical updates - Use `aria-live=\"assertive\"` for urgent alerts - Use `role=\"alert\"` for error messages --- ### Semantic HTML **Patterns:** - Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels) - Buttons: Use `<button>` for actions; `<a>` for navigation - Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\") - Lists: Use `<ul>` / `<ol>` / `<li>` for list content - Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically - Forms: Use `<label>` associated with inputs via `for` attribute or nesting --- ## Performance Patterns ### Data Rendering **Principle:** Render visible data first; load additional data on scroll or on-demand. - Panel lists: Render first 20 items, lazy-load on scroll - Charts: Render at target width; no real-time updates for high-frequency data - 3D canvas: Render at 60fps; debounce pan/zoom interactions ### Caching - Filter selections (Where, When) cached in session storage - Panel scroll positions remembered during session - Charts cached until time range changes --- ## Error & Empty States ### Empty State **Pattern:** When no data matches filter or list is empty. **Display:** - Panel body shows centered, light grey message - Message: `type/body` in `colour/text/secondary` - Text: \"No [items] found\" or \"Check your filters\" - Optional icon above text (light grey, 48×48px) **Example:** \"No people found. Check your filters or adjust the time range.\" --- ### Error State **Pattern:** When an action fails or data cannot load. **Display:** - Panel body shows centered error message - Message: `type/body` in `colour/alert` (orange, once defined) - Heading: `type/h4` \"Error\" or specific error title - Optional retry button below message - Optional error code for support (small grey text below) **Example:** \"Error loading data. Status code: 500. Retry?\" **Keyboard support:** - Tab to retry button, Enter to retry - Escape to close error or return to previous state --- ## Responsive Breakpoints **Mobile (<768px):** - Panels overlay canvas at full width - Panels are swipeable/draggable to dismiss - Top bar condenses (logo smaller, icons only for filters) - Secondary nav wraps or becomes scrollable **Tablet (768px–1200px):** - Panels dock on right at 300px width - Canvas shrinks but remains visible - Secondary nav visible, single row **Desktop (>1200px):** - Panels dock on right at 320px width - Canvas full viewport minus panel width - All controls visible, horizontal layout preferred","absoluteBoundingBox":{"x":53788.0,"y":36396.0,"width":384.0,"height":12360.0},"isolatedAbsoluteRenderBounds":{"x":53786.16015625,"y":36402.12109375,"width":380.13671875,"height":12325.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":12360.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Patterns\n\n## Overview\n\nPatterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens.\n\n---\n\n## Layout Patterns\n\n### Panel-Based Spatial Layout\n\n**Structure:** Main canvas (left/centre) + draggable side panels (right)\n\n**Anatomy:**\n- **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width\n- **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small`\n- **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions\n- **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset)\n- **Timeline scrubber:** Bottom of viewport, spanning full width\n\n**Responsive behaviour:**\n- On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss\n- On desktop (>768px): panels dock on right, canvas shrinks to accommodate\n\n**Use case:** Dashboard, map view, live monitoring\n\n---\n\n### Detail Drill-Down\n\n**Structure:** List panel → Detail panel → Related panels\n\n**Flow:**\n1. User clicks list item (e.g. \"Potential theft\" in Events)\n2. Selected event panel opens (or detail drawer slides in)\n3. Detail panel shows full information + related action links (Cameras, People, Timeline)\n4. User clicks action link to open related panel\n5. Back arrow returns to selected event detail\n\n**Panel stacking:**\n- Primary panel: Selected event\n- Secondary panel: Related person, timeline, or camera\n- Tertiary panel: If user drills deeper (e.g. timeline → specific incident)\n\n**Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel\n\n---\n\n### Modal Pickers (Date, Location)\n\n**Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation\n\n**Flow:**\n1. User clicks \"When\" or \"Where\" dropdown in top bar\n2. Picker modal slides up from bottom or appears inline\n3. User navigates picker (tabs, lists, grid cells)\n4. User selects option\n5. Picker closes, filter updates, interface refreshes with new data\n\n**Keyboard support:**\n- Arrow keys to navigate picker items\n- Enter to select\n- Escape to close without selecting\n\n**Visual feedback:**\n- Selected item highlighted in dark (`colour/active`)\n- Current selection persists until changed\n\n---\n\n## Interaction Patterns\n\n### Selection & Highlighting\n\n**Primary flow:**\n1. User sees list of items (events, people, data points)\n2. User clicks item to select\n3. Item highlights with background `colour/hover`\n4. Related detail panel opens or updates\n\n**Visual states:**\n- **Default:** `colour/bg/primary` background, `colour/text/primary` text\n- **Hover:** `colour/hover` background (cream/400), text unchanged\n- **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text\n\n**Keyboard support:**\n- Arrow keys to navigate list\n- Enter to select\n- Space to select (optional)\n\n---\n\n### Navigation via Back/Close\n\n**Pattern:** Panels always include back arrow (navigation) and close X (dismiss)\n\n**Back arrow:**\n- Returns to previous state or parent panel\n- Preserves scroll position (if applicable)\n- Visible only if there's a previous state to return to\n\n**Close X:**\n- Dismisses current panel\n- Returns to base view (e.g. map with no detail panels)\n- Always visible in panel header\n\n**Keyboard support:**\n- Escape key acts as close X (dismisses panel)\n- Alt+Left arrow acts as back button\n\n---\n\n### Status Indicators & Urgency\n\n**Alert dot (orange):**\n- Small 8px circle, top-right of avatar or button\n- Indicates urgent status (unreviewed, flagged, etc.)\n- Colour: `colour/alert` (#FF6B35, TBD — confirm value)\n\n**Notification list:**\n- \"Just now\" badges for recent alerts\n- Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp\n- Orange dot next to most recent items\n- Read/unread states (optional; not visible in current design)\n\n**Capacity badge:**\n- Circular dark badge (neutral/900) with white percentage text\n- Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\"\n\n**Ratio badge:**\n- Circular dark badge with split label, e.g. \"M:32 F:68\"\n- Indicates demographic breakdown or ratio metric\n\n**Temporal indicator:**\n- \"LIVE\" badge in calendar/date picker (active period tab)\n- Indicates real-time data stream\n\n---\n\n### Data Presentation\n\n**List-based:**\n- Categorical lists (Customer, Sales, Operational data)\n- Each list item is a link/button to drill-down\n- Section headers (`type/h4`) group related items\n\n**Card-based:**\n- Event card: image + avatar + title + metadata + description + related actions\n- Person card: avatar + name + metadata + related actions\n- Data card: chart + metadata\n\n**Chart-based:**\n- Bar charts with grey bars, axis labels\n- No chart title on the chart itself; title lives in panel header\n- Legend optional (axis labels sufficient for simple charts)\n\n**Table-based:**\n- Column headers in `type/h4` (bold monospace)\n- Rows in `type/body` (regular monospace)\n- No alternating row colours (density over visual variety)\n- Minimal borders; dividers use `colour/border/light`\n\n---\n\n## Visual Hierarchy\n\n### Typographic\n\n**Dominance order (largest → smallest):**\n1. `type/display` (48px) — Page title, hero heading (rarely used in Augur)\n2. `type/h1` (40px) — Major section heading\n3. `type/h2` (32px) — Subsection heading\n4. `type/h3` (28px) — Panel title, card heading\n5. `type/h4` (24px) — Section header, label, secondary heading\n6. `type/body-large` (20px) — Introductory text, large body\n7. `type/body` (16px) — Standard UI copy, list items, descriptions\n8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`)\n\n**Weight hierarchy:**\n- Bold: Headings, emphasis, CTAs\n- Regular: Body text, labels, most UI copy\n- Light: Secondary text, metadata (applied as weight override, not separate style)\n\n---\n\n### Colour\n\n**Dominance order:**\n1. Cream backgrounds (`colour/cream`) dominate visual space\n2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability\n3. Dark active state (`colour/active`, neutral/900) indicates selection\n4. Orange accent (`colour/alert`) draws attention to urgent items\n5. White canvas provides separation between 3D view and UI\n\n**Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts.\n\n---\n\n## Spacing & Alignment\n\n### Padding\n\n**Panel padding:**\n- Header: `space/4` (16px) on all sides\n- Body: `space/6` (24px) on all sides\n- List item: `space/4` (16px) horizontal, `space/2` (8px) vertical\n\n**Margins:**\n- Between sections within a panel: `space/6` (24px)\n- Between list items: None (border-based dividers)\n- Between action links: `space/4` (16px)\n\n### Grid\n\n**Base unit:** 8px  \n**Canvas width:** Variable (full minus panel width)  \n**Panel width:** 320px fixed  \n**Content width:** Full panel width minus padding\n\n**Align to 8px grid:**\n- Position: multiples of 8px\n- Size: multiples of 8px\n- Spacing: use `space/*` tokens (multiples of 4px or 8px)\n\n---\n\n## Motion (Future)\n\n**Tentative patterns (not currently specified):**\n- Panel slide-in/slide-out (250ms ease-out)\n- Dropdown fade-in (150ms ease-out)\n- Item hover scale (subtle, 1.02× scale)\n- Colour transitions (200ms ease-out for hover/active states)\n\n**Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation.\n\n---\n\n## Accessibility Patterns\n\n### Focus Management\n\n**Pattern:** Focus should move logically through the interface.\n\n- Tab order follows visual/reading order (left-to-right, top-to-bottom)\n- When a panel opens, focus moves to the panel's first focusable element\n- When a panel closes, focus returns to the triggering element\n- Modals trap focus (Tab wraps to first element after last)\n\n**Visual focus indicator:**\n- 2px outline in `colour/focus-ring` (neutral/800)\n- 2px offset from element boundary\n- Applies to all buttons, links, form inputs, and interactive elements\n\n---\n\n### Screen Reader Announcements\n\n**Patterns:**\n- When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\")\n- When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\")\n- When an action completes: Announce result (e.g. \"Filter applied, 12 results\")\n\n**Implementation:**\n- Use `aria-live=\"polite\"` for non-critical updates\n- Use `aria-live=\"assertive\"` for urgent alerts\n- Use `role=\"alert\"` for error messages\n\n---\n\n### Semantic HTML\n\n**Patterns:**\n- Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels)\n- Buttons: Use `<button>` for actions; `<a>` for navigation\n- Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\")\n- Lists: Use `<ul>` / `<ol>` / `<li>` for list content\n- Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically\n- Forms: Use `<label>` associated with inputs via `for` attribute or nesting\n\n---\n\n## Performance Patterns\n\n### Data Rendering\n\n**Principle:** Render visible data first; load additional data on scroll or on-demand.\n\n- Panel lists: Render first 20 items, lazy-load on scroll\n- Charts: Render at target width; no real-time updates for high-frequency data\n- 3D canvas: Render at 60fps; debounce pan/zoom interactions\n\n### Caching\n\n- Filter selections (Where, When) cached in session storage\n- Panel scroll positions remembered during session\n- Charts cached until time range changes\n\n---\n\n## Error & Empty States\n\n### Empty State\n\n**Pattern:** When no data matches filter or list is empty.\n\n**Display:**\n- Panel body shows centered, light grey message\n- Message: `type/body` in `colour/text/secondary`\n- Text: \"No [items] found\" or \"Check your filters\"\n- Optional icon above text (light grey, 48×48px)\n\n**Example:** \"No people found. Check your filters or adjust the time range.\"\n\n---\n\n### Error State\n\n**Pattern:** When an action fails or data cannot load.\n\n**Display:**\n- Panel body shows centered error message\n- Message: `type/body` in `colour/alert` (orange, once defined)\n- Heading: `type/h4` \"Error\" or specific error title\n- Optional retry button below message\n- Optional error code for support (small grey text below)\n\n**Example:** \"Error loading data. Status code: 500. Retry?\"\n\n**Keyboard support:**\n- Tab to retry button, Enter to retry\n- Escape to close error or return to previous state\n\n---\n\n## Responsive Breakpoints\n\n**Mobile (<768px):**\n- Panels overlay canvas at full width\n- Panels are swipeable/draggable to dismiss\n- Top bar condenses (logo smaller, icons only for filters)\n- Secondary nav wraps or becomes scrollable\n\n**Tablet (768px–1200px):**\n- Panels dock on right at 300px width\n- Canvas shrinks but remains visible\n- Secondary nav visible, single row\n\n**Desktop (>1200px):**\n- Panels dock on right at 320px width\n- Canvas full viewport minus panel width\n- All controls visible, horizontal layout preferred\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2766":{"type":"FRAME","id":"34:2766","name":"Design sytem","absoluteBoundingBox":{"x":54296.0,"y":391.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":391.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3330},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1371},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/design-system"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2767"]},"78:20392":{"type":"TEXT","id":"78:20392","name":"PATTERNS.MD","absoluteBoundingBox":{"x":53788.0,"y":36324.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53791.23046875,"y":36336.76171875,"width":213.80078125,"height":22.71875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PATTERNS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20368":{"type":"FRAME","id":"78:20368","name":"3","absoluteBoundingBox":{"x":53768.0,"y":19572.0,"width":424.0,"height":16672.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":19572.0,"width":424.0,"height":16672.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,19448.0]],"size":{"x":424.0,"y":16672.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20369","78:20370"]},"78:20370":{"type":"TEXT","id":"78:20370","name":"# Augur Components ## Overview This document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target. --- ## Buttons ### Icon Button **Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause). **Size:** 40×40px (icon 20×20px centered) **Padding:** None (icon-only, square aspect) **Background:** `colour/bg/primary` **Icon colour:** `colour/icon/primary` **Border:** None **Radius:** `radius/none` **States:** - **Default:** Background `colour/bg/primary`, icon `colour/icon/primary` - **Hover:** Background `colour/hover` (cream/400), icon unchanged - **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white) - **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled` - **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset **Variants:** - **Icon only** (standard) — as above - **With badge** — small red dot (8px) top-right corner for notifications **Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view --- ### Text Button / Link **Purpose:** Navigation and secondary actions within panels and lists. **Typography:** `type/body`, regular weight **Colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height) **Border:** None **Radius:** `radius/none` **States:** - **Default:** Text `colour/text/primary`, background transparent - **Hover:** Background `colour/hover`, text unchanged - **Active/selected:** Text `colour/active`, background `colour/bg/tertiary` - **Disabled:** Text `colour/text/disabled`, background transparent - **Focus:** Underline in `colour/focus-ring` **Variants:** - **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2` - **Inline** — no padding, appears in running text - **Full-width** — stretches to container width, text left-aligned **Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\" --- ## Inputs ### Dropdown / Select **Purpose:** Choose from predefined options (location, date, time, filter). **Height:** 40px **Padding:** `space/4` horizontal, `space/2` vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/medium` **Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary` **Radius:** `radius/none` **States:** - **Default:** As above - **Hover:** Background `colour/hover` - **Focus:** Border `colour/focus-ring`, outline 2px offset - **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation) - **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled` **Interaction:** - Click to open dropdown menu - Menu items: 40px height, `type/body`, left-aligned with `space/4` padding - Selected item: Background `colour/active`, text `colour/text/inverse` - Unselected items: Background `colour/bg/primary`, text `colour/text/primary` - Keyboard: Arrow keys to navigate, Enter to select, Escape to close **Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\" --- ### Calendar / Date Picker **Purpose:** Select a date or time period (year, month, week, day, live). **Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day). **Period tabs:** - Horizontal layout, `space/2` gap - Tab size: min 48×32px - Typography: `type/body`, bold - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` (neutral/900) - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` **Grid cells:** - Size: 40×40px minimum - Typography: `type/body`, regular - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` - Border: 1px `colour/border/light` between cells - Today indicator: Underline in `colour/active` (if applicable) **Interaction:** - Click period tab to switch grid view - Click cell to select - Keyboard: Arrow keys to navigate, Enter to select, Escape to close - LIVE mode: shows real-time timestamp **Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8 --- ### Location Picker **Purpose:** Hierarchical geographic navigation (Country → Region → Area). **Height:** Full panel, scrollable if >6 items **Item height:** 44px minimum **Padding:** `space/4` per item **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` between items **Arrow:** Right-aligned, `colour/icon/secondary` **Layout:** - Header: Back arrow (24×24px, `colour/icon/primary`), title, close X - Body: List of items, each with label and arrow - Footer: Optional breadcrumb or current selection **Interaction:** - Click item to drill down (arrow navigates to sub-level) - Click back arrow to navigate up - Click close X to dismiss - Keyboard: Arrow keys, Enter to select/navigate, Escape to close **Examples:** \"England → London\", \"England → South East\", etc. --- ## Panels & Modals ### Panel Header **Purpose:** Title, navigation, and close controls for side panels. **Height:** 48px minimum **Padding:** `space/4` horizontal and vertical **Background:** `colour/bg/tertiary` (cream/200) **Border:** 1px `colour/border/light` bottom **Typography:** `type/h4` for major panels, `type/body` for secondary **Text colour:** `colour/text/primary` **Layout:** Flex, space-between - **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`) - **Centre:** Title / label, left-aligned - **Right:** Close button (X, 24×24px icon button) **Interaction:** - Back arrow navigates to previous state - Close X dismisses panel **Examples:** - \"Customer numbers\" (data list header) - \"Selected event\" (detail header) - \"Notifications (3)\" (notification drawer header) --- ### Panel Body **Purpose:** Main content area for panels. **Background:** `colour/bg/primary` (cream/500) **Padding:** `space/6` (24px) all sides **Typography:** `type/body` for text, `type/h4` for section headers **Text colour:** `colour/text/primary` **Border:** `shadow/small` (raised effect) **Max width:** 320px (typical panel width) **Scrollable:** Yes, if content exceeds viewport height **Content types:** - Section headers (`type/h4`, margin-top `space/6` except first) - List items (with or without images/avatars) - Detail cards (image, text, metadata) - Text blocks (descriptions, AI-generated summaries) - Charts (bar charts with axis labels) **Interaction:** - Click list items or links to navigate or open detail panels - Panels can stack (e.g. Customer numbers → detail drawer) --- ## Lists & Tables ### List Item **Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications). **Height:** 44px minimum (text only), 64px+ (with images) **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Background (hover):** `colour/hover` (cream/400) **Border:** 1px `colour/border/light` bottom **Radius:** `radius/none` **Anatomy:** - **Left:** Label or label + secondary text (metadata) - **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon **Variants:** - **Simple label** — single line, bold - **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`) - **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow - **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below **Interaction:** - Click to navigate to detail or drill down - Optional: swipe to reveal actions (secondary interaction) **Examples:** - \"Numbers\" with arrow (data category) - \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event) - Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person) --- ### Notification List Item **Purpose:** High-priority alert display with time, status, and action. **Height:** 80px minimum **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp) **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` bottom **Avatar:** Circular, 40×40px, left-aligned **Anatomy:** - **Left:** Avatar (40×40px, square corners) - **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge - **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge) **Badge variants:** - Notification dot (8px orange circle for urgent alerts) - Percentage badge (circular, dark background, white bold text, e.g. \"92%\") - Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\") --- ## Cards ### Event Detail Card **Purpose:** Full details for a selected incident or event. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing 2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge 3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description) 4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\" 5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text) 6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4` **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) **Interaction:** - Click action links to drill down or open related panels - Avatar click: open person detail panel --- ### Person Detail Card **Purpose:** Individual profile with summary and related actions. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Avatar** — Large circular, 120×120px, square corners, centred 2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description) 3. **Location** — `type/body` with `colour/text/secondary` 4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) --- ### Data Detail Card **Purpose:** Visualisation and metrics display. **Layout:** Vertical stack **Width:** Variable (panel or embedded in dashboard) **Padding:** `space/6` all sides **Content structure:** 1. **Header** — `type/h4` title, e.g. \"Customer numbers\" 2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical 3. **Footer** — Metadata, e.g. date range, data source **Chart style:** - Bars: Neutral grey (`colour/neutral/600` or darker) - Background: Transparent or very light (`colour/bg/primary`) - Axis labels: `type/body` with `colour/text/secondary` - Grid: Optional light dividers (`colour/border/light`) --- ## Navigation ### Top Bar **Purpose:** Global application header with logo, filters, and user controls. **Height:** 48px **Padding:** `space/4` horizontal **Background:** `colour/neutral/0` (white) **Border:** 1px `colour/border/light` bottom **Layout:** Flex, space-between **Sections:** - **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned) - **Centre:** Global filters (Dropdowns for Where and When) - **Right:** Notification icon (with badge) + User avatar icon button **Interaction:** - Click filters to open pickers - Click notification icon to open notification drawer - Click avatar to open user menu --- ### Secondary Navigation Bar **Purpose:** View/mode selector (Map, Data, Events, People, etc.). **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/tertiary` (cream/200) **Border:** None **Layout:** Flex, space-between or space-around **Tab anatomy:** - Height: 40px - Icon: 20×20px, left-aligned or centred - Label: `type/body`, left-aligned or centred - Background: `colour/bg/tertiary` (inactive) - Background: `colour/active` (active tab) - Text: `colour/text/primary` (inactive), `colour/text/inverse` (active) - Padding: `space/2` to `space/4` **Interaction:** - Click tab to switch view - Active tab indicated by dark background - Keyboard: Left/Right arrow keys to navigate, Enter to select **Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon) --- ### Floating Controls (Canvas) **Purpose:** View manipulation and playback controls positioned near 3D canvas. **Position:** Bottom-right, 16px offset from edges **Layout:** Vertical stack, `space/2` gap **Controls:** 1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary` 2. **Zoom controls** — Icon button (+ and -), stacked vertically 3. **Reset/recenter** — Icon button (refresh icon) **Spacing:** `space/2` (8px) between buttons **Size:** 40×40px per button **Interaction:** Click to activate function --- ### Timeline / Scrubber Bar **Purpose:** Temporal navigation and playback. **Position:** Bottom of viewport **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/primary` (cream/500) **Border:** 1px `colour/border/light` top **Layout:** Flex, space-between **Sections:** - **Left:** Play/pause button (icon button, 32×32px) - **Centre:** Scrubber track (draggable timeline, shows current position) - **Right:** Timecode readout (`type/body`, e.g. \"23:59\") **Interaction:** - Click play/pause to control playback - Drag scrubber to seek to time - Timecode updates in real-time --- ## Accessibility Notes ### Keyboard Navigation - All buttons and links are focusable (Tab key) - Icon buttons include visible focus ring (2px outline in `colour/focus-ring`) - Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter - Escape closes open modals and pickers ### ARIA Labels - Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\") - Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded` - Panels include semantic heading tags (`<h2>`, `<h3>`) - List items include `role=\"button\"` if clickable ### Touch Targets - Minimum 44×44px for all interactive elements - Icon buttons: 40×40px (meets 44px height with padding) - List items: 44px minimum height - Panel close button: 24×24px icon, but padded to 44×44px touch area ### Colour Contrast - All text: 4.5:1 ratio minimum (primary text on primary background) - Large text: 3:1 ratio acceptable - Icons: 3:1 ratio minimum against background - Alert colour (orange): tested against background for WCAG AA ### Screen Reader Support - Images include alt text (hero images, avatars) - Panels marked with semantic headings - Status indicators (badges, dots) include aria-live regions for updates - Tables include semantic `<th>` and `<td>` elements ### Monospace Considerations - Line length kept under 70 characters (readability) - Letter spacing adequate (monospace is denser than humanist sans) - Avoid all-caps for extended text (lowercase/title case preferred)","absoluteBoundingBox":{"x":53788.0,"y":19700.0,"width":384.0,"height":16488.0},"isolatedAbsoluteRenderBounds":{"x":53786.16015625,"y":19705.880859375,"width":380.9296875,"height":16453.837890625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":16488.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Components\n\n## Overview\n\nThis document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target.\n\n---\n\n## Buttons\n\n### Icon Button\n\n**Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause).\n\n**Size:** 40×40px (icon 20×20px centered)  \n**Padding:** None (icon-only, square aspect)  \n**Background:** `colour/bg/primary`  \n**Icon colour:** `colour/icon/primary`  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Background `colour/bg/primary`, icon `colour/icon/primary`\n- **Hover:** Background `colour/hover` (cream/400), icon unchanged\n- **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white)\n- **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled`\n- **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset\n\n**Variants:**\n- **Icon only** (standard) — as above\n- **With badge** — small red dot (8px) top-right corner for notifications\n\n**Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view\n\n---\n\n### Text Button / Link\n\n**Purpose:** Navigation and secondary actions within panels and lists.\n\n**Typography:** `type/body`, regular weight  \n**Colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height)  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Text `colour/text/primary`, background transparent\n- **Hover:** Background `colour/hover`, text unchanged\n- **Active/selected:** Text `colour/active`, background `colour/bg/tertiary`\n- **Disabled:** Text `colour/text/disabled`, background transparent\n- **Focus:** Underline in `colour/focus-ring`\n\n**Variants:**\n- **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2`\n- **Inline** — no padding, appears in running text\n- **Full-width** — stretches to container width, text left-aligned\n\n**Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\"\n\n---\n\n## Inputs\n\n### Dropdown / Select\n\n**Purpose:** Choose from predefined options (location, date, time, filter).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal, `space/2` vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/medium`  \n**Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary`  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** As above\n- **Hover:** Background `colour/hover`\n- **Focus:** Border `colour/focus-ring`, outline 2px offset\n- **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation)\n- **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled`\n\n**Interaction:**\n- Click to open dropdown menu\n- Menu items: 40px height, `type/body`, left-aligned with `space/4` padding\n- Selected item: Background `colour/active`, text `colour/text/inverse`\n- Unselected items: Background `colour/bg/primary`, text `colour/text/primary`\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n\n**Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\"\n\n---\n\n### Calendar / Date Picker\n\n**Purpose:** Select a date or time period (year, month, week, day, live).\n\n**Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day).\n\n**Period tabs:**\n- Horizontal layout, `space/2` gap\n- Tab size: min 48×32px\n- Typography: `type/body`, bold\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active` (neutral/900)\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n\n**Grid cells:**\n- Size: 40×40px minimum\n- Typography: `type/body`, regular\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active`\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n- Border: 1px `colour/border/light` between cells\n- Today indicator: Underline in `colour/active` (if applicable)\n\n**Interaction:**\n- Click period tab to switch grid view\n- Click cell to select\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n- LIVE mode: shows real-time timestamp\n\n**Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8\n\n---\n\n### Location Picker\n\n**Purpose:** Hierarchical geographic navigation (Country → Region → Area).\n\n**Height:** Full panel, scrollable if >6 items  \n**Item height:** 44px minimum  \n**Padding:** `space/4` per item  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` between items  \n**Arrow:** Right-aligned, `colour/icon/secondary`\n\n**Layout:**\n- Header: Back arrow (24×24px, `colour/icon/primary`), title, close X\n- Body: List of items, each with label and arrow\n- Footer: Optional breadcrumb or current selection\n\n**Interaction:**\n- Click item to drill down (arrow navigates to sub-level)\n- Click back arrow to navigate up\n- Click close X to dismiss\n- Keyboard: Arrow keys, Enter to select/navigate, Escape to close\n\n**Examples:** \"England → London\", \"England → South East\", etc.\n\n---\n\n## Panels & Modals\n\n### Panel Header\n\n**Purpose:** Title, navigation, and close controls for side panels.\n\n**Height:** 48px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** 1px `colour/border/light` bottom  \n**Typography:** `type/h4` for major panels, `type/body` for secondary  \n**Text colour:** `colour/text/primary`\n\n**Layout:** Flex, space-between\n- **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`)\n- **Centre:** Title / label, left-aligned\n- **Right:** Close button (X, 24×24px icon button)\n\n**Interaction:**\n- Back arrow navigates to previous state\n- Close X dismisses panel\n\n**Examples:**\n- \"Customer numbers\" (data list header)\n- \"Selected event\" (detail header)\n- \"Notifications (3)\" (notification drawer header)\n\n---\n\n### Panel Body\n\n**Purpose:** Main content area for panels.\n\n**Background:** `colour/bg/primary` (cream/500)  \n**Padding:** `space/6` (24px) all sides  \n**Typography:** `type/body` for text, `type/h4` for section headers  \n**Text colour:** `colour/text/primary`  \n**Border:** `shadow/small` (raised effect)  \n**Max width:** 320px (typical panel width)  \n**Scrollable:** Yes, if content exceeds viewport height\n\n**Content types:**\n- Section headers (`type/h4`, margin-top `space/6` except first)\n- List items (with or without images/avatars)\n- Detail cards (image, text, metadata)\n- Text blocks (descriptions, AI-generated summaries)\n- Charts (bar charts with axis labels)\n\n**Interaction:**\n- Click list items or links to navigate or open detail panels\n- Panels can stack (e.g. Customer numbers → detail drawer)\n\n---\n\n## Lists & Tables\n\n### List Item\n\n**Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications).\n\n**Height:** 44px minimum (text only), 64px+ (with images)  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Background (hover):** `colour/hover` (cream/400)  \n**Border:** 1px `colour/border/light` bottom  \n**Radius:** `radius/none`\n\n**Anatomy:**\n- **Left:** Label or label + secondary text (metadata)\n- **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon\n\n**Variants:**\n- **Simple label** — single line, bold\n- **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`)\n- **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow\n- **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below\n\n**Interaction:**\n- Click to navigate to detail or drill down\n- Optional: swipe to reveal actions (secondary interaction)\n\n**Examples:**\n- \"Numbers\" with arrow (data category)\n- \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event)\n- Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person)\n\n---\n\n### Notification List Item\n\n**Purpose:** High-priority alert display with time, status, and action.\n\n**Height:** 80px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp)  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` bottom  \n**Avatar:** Circular, 40×40px, left-aligned\n\n**Anatomy:**\n- **Left:** Avatar (40×40px, square corners)\n- **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge\n- **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge)\n\n**Badge variants:**\n- Notification dot (8px orange circle for urgent alerts)\n- Percentage badge (circular, dark background, white bold text, e.g. \"92%\")\n- Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\")\n\n---\n\n## Cards\n\n### Event Detail Card\n\n**Purpose:** Full details for a selected incident or event.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing\n2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge\n3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description)\n4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\"\n5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text)\n6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4`\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n**Interaction:**\n- Click action links to drill down or open related panels\n- Avatar click: open person detail panel\n\n---\n\n### Person Detail Card\n\n**Purpose:** Individual profile with summary and related actions.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Avatar** — Large circular, 120×120px, square corners, centred\n2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description)\n3. **Location** — `type/body` with `colour/text/secondary`\n4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n---\n\n### Data Detail Card\n\n**Purpose:** Visualisation and metrics display.\n\n**Layout:** Vertical stack  \n**Width:** Variable (panel or embedded in dashboard)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Header** — `type/h4` title, e.g. \"Customer numbers\"\n2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical\n3. **Footer** — Metadata, e.g. date range, data source\n\n**Chart style:**\n- Bars: Neutral grey (`colour/neutral/600` or darker)\n- Background: Transparent or very light (`colour/bg/primary`)\n- Axis labels: `type/body` with `colour/text/secondary`\n- Grid: Optional light dividers (`colour/border/light`)\n\n---\n\n## Navigation\n\n### Top Bar\n\n**Purpose:** Global application header with logo, filters, and user controls.\n\n**Height:** 48px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/neutral/0` (white)  \n**Border:** 1px `colour/border/light` bottom  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned)\n- **Centre:** Global filters (Dropdowns for Where and When)\n- **Right:** Notification icon (with badge) + User avatar icon button\n\n**Interaction:**\n- Click filters to open pickers\n- Click notification icon to open notification drawer\n- Click avatar to open user menu\n\n---\n\n### Secondary Navigation Bar\n\n**Purpose:** View/mode selector (Map, Data, Events, People, etc.).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** None  \n**Layout:** Flex, space-between or space-around\n\n**Tab anatomy:**\n- Height: 40px\n- Icon: 20×20px, left-aligned or centred\n- Label: `type/body`, left-aligned or centred\n- Background: `colour/bg/tertiary` (inactive)\n- Background: `colour/active` (active tab)\n- Text: `colour/text/primary` (inactive), `colour/text/inverse` (active)\n- Padding: `space/2` to `space/4`\n\n**Interaction:**\n- Click tab to switch view\n- Active tab indicated by dark background\n- Keyboard: Left/Right arrow keys to navigate, Enter to select\n\n**Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon)\n\n---\n\n### Floating Controls (Canvas)\n\n**Purpose:** View manipulation and playback controls positioned near 3D canvas.\n\n**Position:** Bottom-right, 16px offset from edges  \n**Layout:** Vertical stack, `space/2` gap\n\n**Controls:**\n1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary`\n2. **Zoom controls** — Icon button (+ and -), stacked vertically\n3. **Reset/recenter** — Icon button (refresh icon)\n\n**Spacing:** `space/2` (8px) between buttons  \n**Size:** 40×40px per button  \n**Interaction:** Click to activate function\n\n---\n\n### Timeline / Scrubber Bar\n\n**Purpose:** Temporal navigation and playback.\n\n**Position:** Bottom of viewport  \n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/primary` (cream/500)  \n**Border:** 1px `colour/border/light` top  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Play/pause button (icon button, 32×32px)\n- **Centre:** Scrubber track (draggable timeline, shows current position)\n- **Right:** Timecode readout (`type/body`, e.g. \"23:59\")\n\n**Interaction:**\n- Click play/pause to control playback\n- Drag scrubber to seek to time\n- Timecode updates in real-time\n\n---\n\n## Accessibility Notes\n\n### Keyboard Navigation\n- All buttons and links are focusable (Tab key)\n- Icon buttons include visible focus ring (2px outline in `colour/focus-ring`)\n- Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter\n- Escape closes open modals and pickers\n\n### ARIA Labels\n- Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\")\n- Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded`\n- Panels include semantic heading tags (`<h2>`, `<h3>`)\n- List items include `role=\"button\"` if clickable\n\n### Touch Targets\n- Minimum 44×44px for all interactive elements\n- Icon buttons: 40×40px (meets 44px height with padding)\n- List items: 44px minimum height\n- Panel close button: 24×24px icon, but padded to 44×44px touch area\n\n### Colour Contrast\n- All text: 4.5:1 ratio minimum (primary text on primary background)\n- Large text: 3:1 ratio acceptable\n- Icons: 3:1 ratio minimum against background\n- Alert colour (orange): tested against background for WCAG AA\n\n### Screen Reader Support\n- Images include alt text (hero images, avatars)\n- Panels marked with semantic headings\n- Status indicators (badges, dots) include aria-live regions for updates\n- Tables include semantic `<th>` and `<td>` elements\n\n### Monospace Considerations\n- Line length kept under 70 characters (readability)\n- Letter spacing adequate (monospace is denser than humanist sans)\n- Avoid all-caps for extended text (lowercase/title case preferred)\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20344":{"type":"FRAME","id":"78:20344","name":"2","absoluteBoundingBox":{"x":53768.0,"y":9380.0,"width":424.0,"height":10168.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":9380.0,"width":424.0,"height":10168.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,9256.0]],"size":{"x":424.0,"y":10168.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20345","78:20346"]},"78:20346":{"type":"TEXT","id":"78:20346","name":"# Augur Design Tokens ## Token Structure Tokens follow a three-layer architecture: 1. **Primitive:** Raw colour values, named by hue and lightness stop 2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`) 3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens) --- ## Primitives ### Colour/Cream ``` colour/cream/50: #FCFBF7 colour/cream/100: #FAF6F0 colour/cream/200: #F7F2E8 colour/cream/300: #F4EEE0 colour/cream/400: #F1E9D9 colour/cream/500: #EFE5D1 colour/cream/600: #ECE1C9 colour/cream/700: #E9DCC2 colour/cream/800: #E7D8BA colour/cream/900: #D9C5A0 ``` ### Colour/Neutral ``` colour/neutral/0: #FFFFFF colour/neutral/50: #F9F5F1 colour/neutral/100: #E9E5E1 colour/neutral/200: #D9D5D1 colour/neutral/300: #C9C5C1 colour/neutral/400: #B9B5B1 colour/neutral/500: #A9A5A1 colour/neutral/600: #999591 colour/neutral/700: #898581 colour/neutral/800: #494541 colour/neutral/900: #292521 colour/neutral/1000: #000000 ``` ### Colour/Status (TBD) ``` colour/status/alert: #FF6B35 (orange, for notifications — confirm value) ``` --- ## Semantic Tokens ### Background ``` colour/bg/primary: colour/cream/500 (#EFE5D1) colour/bg/secondary: colour/cream/100 (#FAF6F0) colour/bg/tertiary: colour/cream/200 (#F7F2E8) colour/bg/canvas: colour/neutral/0 (#FFFFFF) colour/bg/overlay-dark: colour/neutral/1000 with 24% opacity ``` ### Text ``` colour/text/primary: colour/neutral/600 (#999591) colour/text/secondary: colour/neutral/500 (#A9A5A1) colour/text/tertiary: colour/neutral/400 (#B9B5B1) colour/text/inverse: colour/neutral/0 (#FFFFFF) colour/text/disabled: colour/neutral/200 (#D9D5D1) ``` ### Border ``` colour/border/light: colour/neutral/100 (#E9E5E1) colour/border/medium: colour/neutral/200 (#D9D5D1) colour/border/strong: colour/neutral/600 (#999591) colour/border/focus: colour/neutral/800 (#494541) ``` ### Icon ``` colour/icon/primary: colour/neutral/800 (#494541) colour/icon/secondary: colour/neutral/600 (#999591) colour/icon/disabled: colour/neutral/200 (#D9D5D1) colour/icon/inverse: colour/neutral/0 (#FFFFFF) ``` ### Status & Interaction ``` colour/active: colour/neutral/900 (#292521) colour/hover: colour/cream/400 (#F1E9D9) colour/focus-ring: colour/neutral/800 (#494541) colour/alert: colour/status/alert (#FF6B35) colour/success: (TBD) colour/warning: (TBD) colour/info: (TBD) ``` --- ## Typography Tokens ### Font Family ``` type/family: PP Grotesk Mono type/family/fallback: monospace ``` ### Font Sizes & Line Heights ``` type/display/size: 48px type/display/lineheight: 56px type/display/weight: bold type/h1/size: 40px type/h1/lineheight: 48px type/h1/weight: bold type/h2/size: 32px type/h2/lineheight: 40px type/h2/weight: bold type/h3/size: 28px type/h3/lineheight: 36px type/h3/weight: bold type/h4/size: 24px type/h4/lineheight: 32px type/h4/weight: bold type/body-large/size: 20px type/body-large/lineheight: 28px type/body-large/weight: regular type/body/size: 16px type/body/lineheight: 24px type/body/weight: regular type/caption/size: 12px (deprecated — use type/body with neutral/400) type/caption/lineheight: 16px type/caption/weight: light ``` ### Weight Tokens ``` type/weight/light: 300 type/weight/regular: 400 type/weight/bold: 700 ``` --- ## Spacing Tokens ``` space/1: 4px space/2: 8px space/3: 12px space/4: 16px space/5: 20px space/6: 24px space/7: 32px space/8: 40px space/9: 48px space/10: 64px ``` --- ## Elevation Tokens ``` shadow/small: 0px 4px 8px rgba(0, 0, 0, 0.24) ``` --- ## Radius Tokens ``` radius/none: 0px ``` --- ## Component-Specific Tokens ### Buttons #### Icon Button ``` button/icon/size: 40px × 40px button/icon/background: colour/bg/primary button/icon/background-hover: colour/hover button/icon/icon-colour: colour/icon/primary button/icon/padding: 0 (square) button/icon/radius: radius/none ``` #### Text Button / Link ``` button/text/font: type/body button/text/colour: colour/text/primary button/text/colour-hover: colour/text/primary (underline or bg hint) button/text/background: colour/bg/primary ``` ### Inputs #### Dropdown ``` input/dropdown/height: 40px input/dropdown/padding: space/4 (horizontal) input/dropdown/font: type/body input/dropdown/background: colour/bg/primary input/dropdown/border: colour/border/medium input/dropdown/text-colour: colour/text/primary input/dropdown/icon-colour: colour/icon/primary input/dropdown/radius: radius/none ``` #### Calendar / Date Picker ``` input/calendar/cell-size: 40px (minimum) input/calendar/cell-padding: space/2 input/calendar/active-bg: colour/active input/calendar/active-text: colour/text/inverse input/calendar/inactive-bg: colour/bg/primary input/calendar/inactive-text: colour/text/primary input/calendar/font: type/body input/calendar/header-font: type/h4 ``` #### Location Picker ``` input/location/item-height: 44px (minimum touch target) input/location/item-padding: space/4 input/location/font: type/body input/location/background: colour/bg/primary input/location/text-colour: colour/text/primary input/location/arrow-colour: colour/icon/secondary ``` ### Panels #### Panel Header ``` panel/header/background: colour/bg/tertiary panel/header/height: 48px (minimum) panel/header/padding: space/4 panel/header/font: type/h4 or type/body panel/header/text-colour: colour/text/primary panel/header/border: colour/border/light (bottom) panel/header/icon-colour: colour/icon/primary panel/header/close-size: 24px ``` #### Panel Body ``` panel/body/background: colour/bg/primary panel/body/padding: space/6 panel/body/font: type/body panel/body/text-colour: colour/text/primary panel/body/shadow: shadow/small ``` #### List Item ``` list/item/height: 44px (minimum) list/item/padding: space/4 list/item/font: type/body list/item/background: colour/bg/primary list/item/background-hover: colour/hover list/item/text-colour: colour/text/primary list/item/border: colour/border/light (bottom) list/item/arrow-colour: colour/icon/secondary list/item/radius: radius/none ``` ### Indicators #### Notification Dot ``` indicator/dot/size: 8px indicator/dot/background: colour/alert indicator/dot/position: top-right (absolute, -2px offset) ``` #### Badge ``` indicator/badge/min-width: 28px indicator/badge/height: 28px indicator/badge/padding: space/2 (horizontal) indicator/badge/font: type/body indicator/badge/font-weight: bold indicator/badge/background: colour/active indicator/badge/text-colour: colour/text/inverse indicator/badge/radius: radius/none ``` --- ## Component-Agnostic Usage For any component not explicitly listed above: 1. Use `colour/bg/primary` for primary backgrounds 2. Use `colour/text/primary` for primary text 3. Use `colour/border/medium` for borders 4. Use `space/4` for standard padding, `space/6` for generous padding 5. Use `shadow/small` for elevated surfaces 6. Use `radius/none` for all corners 7. Use `type/body` for standard UI copy, `type/h4` for section headers 8. Apply `colour/active` (neutral/900) for selected/active states 9. Respect minimum touch target size of 44×44px for interactive elements","absoluteBoundingBox":{"x":53788.0,"y":9508.0,"width":384.0,"height":9984.0},"isolatedAbsoluteRenderBounds":{"x":53786.16015625,"y":9513.65625,"width":379.54296875,"height":9950.064453125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":9984.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design Tokens\n\n## Token Structure\n\nTokens follow a three-layer architecture:\n1. **Primitive:** Raw colour values, named by hue and lightness stop\n2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`)\n3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens)\n\n---\n\n## Primitives\n\n### Colour/Cream\n\n```\ncolour/cream/50:    #FCFBF7\ncolour/cream/100:   #FAF6F0\ncolour/cream/200:   #F7F2E8\ncolour/cream/300:   #F4EEE0\ncolour/cream/400:   #F1E9D9\ncolour/cream/500:   #EFE5D1\ncolour/cream/600:   #ECE1C9\ncolour/cream/700:   #E9DCC2\ncolour/cream/800:   #E7D8BA\ncolour/cream/900:   #D9C5A0\n```\n\n### Colour/Neutral\n\n```\ncolour/neutral/0:     #FFFFFF\ncolour/neutral/50:    #F9F5F1\ncolour/neutral/100:   #E9E5E1\ncolour/neutral/200:   #D9D5D1\ncolour/neutral/300:   #C9C5C1\ncolour/neutral/400:   #B9B5B1\ncolour/neutral/500:   #A9A5A1\ncolour/neutral/600:   #999591\ncolour/neutral/700:   #898581\ncolour/neutral/800:   #494541\ncolour/neutral/900:   #292521\ncolour/neutral/1000:  #000000\n```\n\n### Colour/Status (TBD)\n\n```\ncolour/status/alert:  #FF6B35  (orange, for notifications — confirm value)\n```\n\n---\n\n## Semantic Tokens\n\n### Background\n\n```\ncolour/bg/primary:        colour/cream/500   (#EFE5D1)\ncolour/bg/secondary:      colour/cream/100   (#FAF6F0)\ncolour/bg/tertiary:       colour/cream/200   (#F7F2E8)\ncolour/bg/canvas:         colour/neutral/0   (#FFFFFF)\ncolour/bg/overlay-dark:   colour/neutral/1000 with 24% opacity\n```\n\n### Text\n\n```\ncolour/text/primary:      colour/neutral/600  (#999591)\ncolour/text/secondary:    colour/neutral/500  (#A9A5A1)\ncolour/text/tertiary:     colour/neutral/400  (#B9B5B1)\ncolour/text/inverse:      colour/neutral/0    (#FFFFFF)\ncolour/text/disabled:     colour/neutral/200  (#D9D5D1)\n```\n\n### Border\n\n```\ncolour/border/light:      colour/neutral/100  (#E9E5E1)\ncolour/border/medium:     colour/neutral/200  (#D9D5D1)\ncolour/border/strong:     colour/neutral/600  (#999591)\ncolour/border/focus:      colour/neutral/800  (#494541)\n```\n\n### Icon\n\n```\ncolour/icon/primary:      colour/neutral/800  (#494541)\ncolour/icon/secondary:    colour/neutral/600  (#999591)\ncolour/icon/disabled:     colour/neutral/200  (#D9D5D1)\ncolour/icon/inverse:      colour/neutral/0    (#FFFFFF)\n```\n\n### Status & Interaction\n\n```\ncolour/active:            colour/neutral/900  (#292521)\ncolour/hover:             colour/cream/400    (#F1E9D9)\ncolour/focus-ring:        colour/neutral/800  (#494541)\ncolour/alert:             colour/status/alert (#FF6B35)\ncolour/success:           (TBD)\ncolour/warning:           (TBD)\ncolour/info:              (TBD)\n```\n\n---\n\n## Typography Tokens\n\n### Font Family\n```\ntype/family:             PP Grotesk Mono\ntype/family/fallback:    monospace\n```\n\n### Font Sizes & Line Heights\n\n```\ntype/display/size:       48px\ntype/display/lineheight: 56px\ntype/display/weight:     bold\n\ntype/h1/size:            40px\ntype/h1/lineheight:      48px\ntype/h1/weight:          bold\n\ntype/h2/size:            32px\ntype/h2/lineheight:      40px\ntype/h2/weight:          bold\n\ntype/h3/size:            28px\ntype/h3/lineheight:      36px\ntype/h3/weight:          bold\n\ntype/h4/size:            24px\ntype/h4/lineheight:      32px\ntype/h4/weight:          bold\n\ntype/body-large/size:    20px\ntype/body-large/lineheight: 28px\ntype/body-large/weight:  regular\n\ntype/body/size:          16px\ntype/body/lineheight:    24px\ntype/body/weight:        regular\n\ntype/caption/size:       12px (deprecated — use type/body with neutral/400)\ntype/caption/lineheight: 16px\ntype/caption/weight:     light\n```\n\n### Weight Tokens\n\n```\ntype/weight/light:       300\ntype/weight/regular:     400\ntype/weight/bold:        700\n```\n\n---\n\n## Spacing Tokens\n\n```\nspace/1:   4px\nspace/2:   8px\nspace/3:   12px\nspace/4:   16px\nspace/5:   20px\nspace/6:   24px\nspace/7:   32px\nspace/8:   40px\nspace/9:   48px\nspace/10:  64px\n```\n\n---\n\n## Elevation Tokens\n\n```\nshadow/small:  0px 4px 8px rgba(0, 0, 0, 0.24)\n```\n\n---\n\n## Radius Tokens\n\n```\nradius/none:  0px\n```\n\n---\n\n## Component-Specific Tokens\n\n### Buttons\n\n#### Icon Button\n```\nbutton/icon/size:           40px × 40px\nbutton/icon/background:     colour/bg/primary\nbutton/icon/background-hover: colour/hover\nbutton/icon/icon-colour:    colour/icon/primary\nbutton/icon/padding:        0 (square)\nbutton/icon/radius:         radius/none\n```\n\n#### Text Button / Link\n```\nbutton/text/font:           type/body\nbutton/text/colour:         colour/text/primary\nbutton/text/colour-hover:   colour/text/primary (underline or bg hint)\nbutton/text/background:     colour/bg/primary\n```\n\n### Inputs\n\n#### Dropdown\n```\ninput/dropdown/height:      40px\ninput/dropdown/padding:     space/4 (horizontal)\ninput/dropdown/font:        type/body\ninput/dropdown/background:  colour/bg/primary\ninput/dropdown/border:      colour/border/medium\ninput/dropdown/text-colour: colour/text/primary\ninput/dropdown/icon-colour: colour/icon/primary\ninput/dropdown/radius:      radius/none\n```\n\n#### Calendar / Date Picker\n```\ninput/calendar/cell-size:       40px (minimum)\ninput/calendar/cell-padding:    space/2\ninput/calendar/active-bg:       colour/active\ninput/calendar/active-text:     colour/text/inverse\ninput/calendar/inactive-bg:     colour/bg/primary\ninput/calendar/inactive-text:   colour/text/primary\ninput/calendar/font:            type/body\ninput/calendar/header-font:     type/h4\n```\n\n#### Location Picker\n```\ninput/location/item-height:     44px (minimum touch target)\ninput/location/item-padding:    space/4\ninput/location/font:            type/body\ninput/location/background:      colour/bg/primary\ninput/location/text-colour:     colour/text/primary\ninput/location/arrow-colour:    colour/icon/secondary\n```\n\n### Panels\n\n#### Panel Header\n```\npanel/header/background:   colour/bg/tertiary\npanel/header/height:       48px (minimum)\npanel/header/padding:      space/4\npanel/header/font:         type/h4 or type/body\npanel/header/text-colour:  colour/text/primary\npanel/header/border:       colour/border/light (bottom)\npanel/header/icon-colour:  colour/icon/primary\npanel/header/close-size:   24px\n```\n\n#### Panel Body\n```\npanel/body/background:     colour/bg/primary\npanel/body/padding:        space/6\npanel/body/font:           type/body\npanel/body/text-colour:    colour/text/primary\npanel/body/shadow:         shadow/small\n```\n\n#### List Item\n```\nlist/item/height:          44px (minimum)\nlist/item/padding:         space/4\nlist/item/font:            type/body\nlist/item/background:      colour/bg/primary\nlist/item/background-hover: colour/hover\nlist/item/text-colour:     colour/text/primary\nlist/item/border:          colour/border/light (bottom)\nlist/item/arrow-colour:    colour/icon/secondary\nlist/item/radius:          radius/none\n```\n\n### Indicators\n\n#### Notification Dot\n```\nindicator/dot/size:        8px\nindicator/dot/background:  colour/alert\nindicator/dot/position:    top-right (absolute, -2px offset)\n```\n\n#### Badge\n```\nindicator/badge/min-width: 28px\nindicator/badge/height:    28px\nindicator/badge/padding:   space/2 (horizontal)\nindicator/badge/font:      type/body\nindicator/badge/font-weight: bold\nindicator/badge/background: colour/active\nindicator/badge/text-colour: colour/text/inverse\nindicator/badge/radius:    radius/none\n```\n\n---\n\n## Component-Agnostic Usage\n\nFor any component not explicitly listed above:\n1. Use `colour/bg/primary` for primary backgrounds\n2. Use `colour/text/primary` for primary text\n3. Use `colour/border/medium` for borders\n4. Use `space/4` for standard padding, `space/6` for generous padding\n5. Use `shadow/small` for elevated surfaces\n6. Use `radius/none` for all corners\n7. Use `type/body` for standard UI copy, `type/h4` for section headers\n8. Apply `colour/active` (neutral/900) for selected/active states\n9. Respect minimum touch target size of 44×44px for interactive elements\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20371":{"type":"FRAME","id":"78:20371","name":"3","absoluteBoundingBox":{"x":54296.0,"y":22495.931640625,"width":344.0,"height":19624.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":22495.931640625,"width":344.0,"height":19624.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,21904.0]],"size":{"x":344.0,"y":19624.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20372","78:20373"]},"78:20331":{"type":"TEXT","id":"78:20331","name":"# Augur Design System ## Overview Augur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering. **Typeface:** PP Grotesk Mono (Light, Regular, Bold) **Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius **Shadow:** Single elevation style for raised surfaces **Grid:** 8px base unit --- ## Colour System ### Primitives #### Cream ramp Used as primary background for UI surfaces, panels, secondary navigation. | Stop | Hex | Use | |---|---|---| | 50 | `#FCFBF7` | Lightest surface, hover states | | 100 | `#FAF6F0` | Secondary panel backgrounds | | 200 | `#F7F2E8` | Secondary nav bar, panel headers | | 300 | `#F4EEE0` | Subtle dividers, disabled states | | 400 | `#F1E9D9` | List item hover | | 500 | `#EFE5D1` | Baseline panel background | | 600 | `#ECE1C9` | Accent/selection tint | | 700 | `#E9DCC2` | Medium panel contrast | | 800 | `#E7D8BA` | Deep panel background, dark hover | | 900 | `#D9C5A0` | — | #### Neutral ramp Used for text, borders, icons, and status indicators. | Stop | Hex | Use | |---|---|---| | 0 | `#FFFFFF` | White backgrounds, icon fill on dark | | 50 | `#F9F5F1` | Very light backgrounds | | 100 | `#E9E5E1` | Light borders | | 200 | `#D9D5D1` | Subtle borders, disabled text | | 300 | `#C9C5C1` | Light dividers | | 400 | `#B9B5B1` | Tertiary text, secondary icons | | 500 | `#A9A5A1` | Secondary text | | 600 | `#999591` | Primary text | | 700 | `#898581` | Headings, emphasis | | 800 | `#494541` | Strong emphasis, icon fill | | 900 | `#292521` | Dark UI elements, active states | | 1000 | `#000000` | Black backgrounds, peak contrast | ### Semantics | Token | Primitive | Use | |---|---|---| | `colour/bg/primary` | `cream/500` | Panel backgrounds | | `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds | | `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers | | `colour/bg/canvas` | `white` | Main 3D canvas | | `colour/text/primary` | `neutral/600` | Body text, labels | | `colour/text/secondary` | `neutral/500` | Metadata, hints | | `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised | | `colour/text/inverse` | `neutral/0` | Text on dark backgrounds | | `colour/border/light` | `neutral/100` | Subtle dividers | | `colour/border/medium` | `neutral/200` | Standard borders | | `colour/border/strong` | `neutral/600` | Emphasis borders, outlines | | `colour/icon/primary` | `neutral/800` | Standard icons | | `colour/icon/secondary` | `neutral/600` | Secondary icons | | `colour/icon/disabled` | `neutral/200` | Disabled icons | | `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) | | `colour/active` | `neutral/900` | Selected states, active indicators | --- ## Typography **Font:** PP Grotesk Mono, monospace | Token | Size | Line height | Weight | Use | |---|---|---|---|---| | `type/display` | 48px | 56px | Bold | Hero headings, page titles | | `type/h1` | 40px | 48px | Bold | Section headings | | `type/h2` | 32px | 40px | Bold | Subsection headings | | `type/h3` | 28px | 36px | Bold | Panel titles, card headings | | `type/h4` | 24px | 32px | Bold | Secondary headings, labels | | `type/body-large` | 20px | 28px | Regular | Panel introductions, large body | | `type/body` | 16px | 24px | Regular | Standard body text, UI copy | ### Weight modifiers - Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`) - Regular: Default weight for body, labels, and copy - Bold: Headings, emphasis, CTA text ### Line length Monospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density. --- ## Spacing **Base unit:** 8px | Token | Value | Use | |---|---|---| | `space/1` | 4px | Tight gaps, icon-to-label spacing | | `space/2` | 8px | Component padding, fine gutters | | `space/3` | 12px | Internal spacing | | `space/4` | 16px | Standard padding, list gaps | | `space/5` | 20px | Generous padding | | `space/6` | 24px | Section padding, panel margins | | `space/7` | 32px | Major spacing, dividers | | `space/8` | 40px | Large gaps, section breaks | | `space/9` | 48px | Major layout spacing | | `space/10` | 64px | Canvas margins, page-level spacing | --- ## Elevation **Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns). | Token | Value | Use | |---|---|---| | `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards | --- ## Radius **All corners are square.** No border radius applied. | Token | Value | |---|---| | `radius/none` | 0px | --- ## Component Inventory ### Buttons - **Icon button** — Square, 40×40px, dark icon on cream background, no border - **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels - **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive ### Inputs - **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text - **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900` - **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows ### Panels & Modals - **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional - **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards - **Panel footer** — Optional, links or actions with arrow indicators - **Drawer shadow** — Applied to all raised panels ### Lists & Tables - **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`) - **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream - **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation ### Cards - **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows - **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links - **Data detail card** — Bar chart with axis labels, metadata footer ### Indicators - **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel - **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\" - **Active indicator** — `neutral/900` background or fill for selected/active states ### Navigation - **Top bar** — White background, logo (left), global filters (centre), user controls (right) - **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy - **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset) - **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body` --- ## Motion None specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close). --- ## Accessibility - **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text) - **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter - **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text - **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing - **Monospace typography:** Line length kept under 70 characters to maintain readability --- ## Usage Guidelines ### Tone Copy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity. ### Data presentation Prefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail. ### Panel interaction Panels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators. ### Colour application Cream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps. ### Monospace decisions All UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.","absoluteBoundingBox":{"x":53788.0,"y":252.0,"width":384.0,"height":9048.0},"isolatedAbsoluteRenderBounds":{"x":53786.16015625,"y":257.656005859375,"width":382.8359375,"height":9014.0634765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":384.0,"y":9048.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design System\n\n## Overview\n\nAugur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering.\n\n**Typeface:** PP Grotesk Mono (Light, Regular, Bold)  \n**Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius  \n**Shadow:** Single elevation style for raised surfaces  \n**Grid:** 8px base unit\n\n---\n\n## Colour System\n\n### Primitives\n\n#### Cream ramp\nUsed as primary background for UI surfaces, panels, secondary navigation.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 50 | `#FCFBF7` | Lightest surface, hover states |\n| 100 | `#FAF6F0` | Secondary panel backgrounds |\n| 200 | `#F7F2E8` | Secondary nav bar, panel headers |\n| 300 | `#F4EEE0` | Subtle dividers, disabled states |\n| 400 | `#F1E9D9` | List item hover |\n| 500 | `#EFE5D1` | Baseline panel background |\n| 600 | `#ECE1C9` | Accent/selection tint |\n| 700 | `#E9DCC2` | Medium panel contrast |\n| 800 | `#E7D8BA` | Deep panel background, dark hover |\n| 900 | `#D9C5A0` | — |\n\n#### Neutral ramp\nUsed for text, borders, icons, and status indicators.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 0 | `#FFFFFF` | White backgrounds, icon fill on dark |\n| 50 | `#F9F5F1` | Very light backgrounds |\n| 100 | `#E9E5E1` | Light borders |\n| 200 | `#D9D5D1` | Subtle borders, disabled text |\n| 300 | `#C9C5C1` | Light dividers |\n| 400 | `#B9B5B1` | Tertiary text, secondary icons |\n| 500 | `#A9A5A1` | Secondary text |\n| 600 | `#999591` | Primary text |\n| 700 | `#898581` | Headings, emphasis |\n| 800 | `#494541` | Strong emphasis, icon fill |\n| 900 | `#292521` | Dark UI elements, active states |\n| 1000 | `#000000` | Black backgrounds, peak contrast |\n\n### Semantics\n\n| Token | Primitive | Use |\n|---|---|---|\n| `colour/bg/primary` | `cream/500` | Panel backgrounds |\n| `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds |\n| `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers |\n| `colour/bg/canvas` | `white` | Main 3D canvas |\n| `colour/text/primary` | `neutral/600` | Body text, labels |\n| `colour/text/secondary` | `neutral/500` | Metadata, hints |\n| `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised |\n| `colour/text/inverse` | `neutral/0` | Text on dark backgrounds |\n| `colour/border/light` | `neutral/100` | Subtle dividers |\n| `colour/border/medium` | `neutral/200` | Standard borders |\n| `colour/border/strong` | `neutral/600` | Emphasis borders, outlines |\n| `colour/icon/primary` | `neutral/800` | Standard icons |\n| `colour/icon/secondary` | `neutral/600` | Secondary icons |\n| `colour/icon/disabled` | `neutral/200` | Disabled icons |\n| `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) |\n| `colour/active` | `neutral/900` | Selected states, active indicators |\n\n---\n\n## Typography\n\n**Font:** PP Grotesk Mono, monospace\n\n| Token | Size | Line height | Weight | Use |\n|---|---|---|---|---|\n| `type/display` | 48px | 56px | Bold | Hero headings, page titles |\n| `type/h1` | 40px | 48px | Bold | Section headings |\n| `type/h2` | 32px | 40px | Bold | Subsection headings |\n| `type/h3` | 28px | 36px | Bold | Panel titles, card headings |\n| `type/h4` | 24px | 32px | Bold | Secondary headings, labels |\n| `type/body-large` | 20px | 28px | Regular | Panel introductions, large body |\n| `type/body` | 16px | 24px | Regular | Standard body text, UI copy |\n\n### Weight modifiers\n- Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`)\n- Regular: Default weight for body, labels, and copy\n- Bold: Headings, emphasis, CTA text\n\n### Line length\nMonospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density.\n\n---\n\n## Spacing\n\n**Base unit:** 8px\n\n| Token | Value | Use |\n|---|---|---|\n| `space/1` | 4px | Tight gaps, icon-to-label spacing |\n| `space/2` | 8px | Component padding, fine gutters |\n| `space/3` | 12px | Internal spacing |\n| `space/4` | 16px | Standard padding, list gaps |\n| `space/5` | 20px | Generous padding |\n| `space/6` | 24px | Section padding, panel margins |\n| `space/7` | 32px | Major spacing, dividers |\n| `space/8` | 40px | Large gaps, section breaks |\n| `space/9` | 48px | Major layout spacing |\n| `space/10` | 64px | Canvas margins, page-level spacing |\n\n---\n\n## Elevation\n\n**Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns).\n\n| Token | Value | Use |\n|---|---|---|\n| `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards |\n\n---\n\n## Radius\n\n**All corners are square.** No border radius applied.\n\n| Token | Value |\n|---|---|\n| `radius/none` | 0px |\n\n---\n\n## Component Inventory\n\n### Buttons\n- **Icon button** — Square, 40×40px, dark icon on cream background, no border\n- **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels\n- **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive\n\n### Inputs\n- **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text\n- **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900`\n- **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows\n\n### Panels & Modals\n- **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional\n- **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards\n- **Panel footer** — Optional, links or actions with arrow indicators\n- **Drawer shadow** — Applied to all raised panels\n\n### Lists & Tables\n- **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`)\n- **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream\n- **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation\n\n### Cards\n- **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows\n- **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links\n- **Data detail card** — Bar chart with axis labels, metadata footer\n\n### Indicators\n- **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel\n- **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\"\n- **Active indicator** — `neutral/900` background or fill for selected/active states\n\n### Navigation\n- **Top bar** — White background, logo (left), global filters (centre), user controls (right)\n- **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy\n- **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset)\n- **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body`\n\n---\n\n## Motion\n\nNone specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close).\n\n---\n\n## Accessibility\n\n- **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text)\n- **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter\n- **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text\n- **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing\n- **Monospace typography:** Line length kept under 70 characters to maintain readability\n\n---\n\n## Usage Guidelines\n\n### Tone\nCopy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity.\n\n### Data presentation\nPrefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail.\n\n### Panel interaction\nPanels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators.\n\n### Colour application\nCream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps.\n\n### Monospace decisions\nAll UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2729":{"type":"FRAME","id":"34:2729","name":"left","absoluteBoundingBox":{"x":53448.0,"y":100.0,"width":296.0,"height":491.932037353516},"isolatedAbsoluteRenderBounds":{"x":53448.0,"y":100.0,"width":296.0,"height":491.932037353516},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":296.0,"y":491.932037353516},"fills":[],"strokeAlign":"INSIDE","scrollBehavior":"STICKY_SCROLLS","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingBottom":24.0,"paddingLeft":24.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2730","63:17429","34:2735"]},"34:2746":{"type":"FRAME","id":"34:2746","name":"Final outcome","absoluteBoundingBox":{"x":53472.0,"y":507.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":507.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3327},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2341},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/final-outcome"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2747"]},"34:2747":{"type":"TEXT","id":"34:2747","name":"Final outcome","absoluteBoundingBox":{"x":53476.0,"y":507.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53478.0,"y":513.588012695312,"width":125.65625,"height":11.5360107421875},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Final outcome","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20369":{"type":"TEXT","id":"78:20369","name":"COMPONENTS.MD","absoluteBoundingBox":{"x":53788.0,"y":19628.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53790.17578125,"y":19640.759765625,"width":254.54296875,"height":22.720703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"COMPONENTS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2745":{"type":"TEXT","id":"34:2745","name":"Software design","absoluteBoundingBox":{"x":53476.0,"y":471.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53476.78515625,"y":477.588043212891,"width":146.37890625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Software design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2756":{"type":"SVG","id":"34:2756","name":"back","absoluteBoundingBox":{"x":54296.0,"y":116.0,"width":40.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":116.0,"width":40.0,"height":40.0},"relativeTransform":[[1.0,0.0,16.0],[0.0,1.0,16.0]],"size":{"x":40.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"BUTTON","isDecorativeImage":false,"accessibleLabel":"Back button","ariaAttributes":{},"interactions":[{"id":{"sessionID":53,"localID":3578},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://digfat.com","openUrlInNewTab":false}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7076106675d532f2b6805d1f81f6012207006322"},"34:2742":{"type":"FRAME","id":"34:2742","name":"Product definition","absoluteBoundingBox":{"x":53472.0,"y":435.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":435.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,108.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3325},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/product-definition"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2743"]},"34:2740":{"type":"FRAME","id":"34:2740","name":"Design sytem","absoluteBoundingBox":{"x":53472.0,"y":399.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":399.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3324},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1371},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/design-system"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2741"]},"34:2741":{"type":"TEXT","id":"34:2741","name":"Design system","absoluteBoundingBox":{"x":53476.0,"y":399.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53477.34375,"y":405.588043212891,"width":126.59765625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Design system","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"63:17435":{"type":"SVG","id":"63:17435","name":"Logo","absoluteBoundingBox":{"x":54296.0,"y":196.0,"width":251.571716308594,"height":83.9320373535156},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":196.0,"width":251.5703125,"height":83.9320373535156},"relativeTransform":[[1.0,0.0,16.0],[0.0,1.0,96.0]],"size":{"x":251.571716308594,"y":83.9320373535156},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logo","ariaAttributes":{},"interactions":[],"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2738":{"type":"FRAME","id":"34:2738","name":"Branding","absoluteBoundingBox":{"x":53472.0,"y":363.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":363.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3323},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":15,"localID":134},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/branding-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2739"]},"34:2739":{"type":"TEXT","id":"34:2739","name":"Branding design","absoluteBoundingBox":{"x":53476.0,"y":363.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53477.48828125,"y":369.588043212891,"width":145.67578125,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Branding design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2737":{"type":"TEXT","id":"34:2737","name":"Introduction","absoluteBoundingBox":{"x":53476.0,"y":327.932037353516,"width":120.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53477.6484375,"y":333.588043212891,"width":115.75,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":120.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Introduction","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2730":{"type":"SVG","id":"34:2730","name":"back","absoluteBoundingBox":{"x":53472.0,"y":124.0,"width":40.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":124.0,"width":40.0,"height":40.0},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,24.0]],"size":{"x":40.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"BUTTON","isDecorativeImage":false,"accessibleLabel":"Back button","ariaAttributes":{},"interactions":[{"id":{"sessionID":53,"localID":3577},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://digfat.com","openUrlInNewTab":false}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7076106675d532f2b6805d1f81f6012207006322"},"34:2744":{"type":"FRAME","id":"34:2744","name":"Software design","absoluteBoundingBox":{"x":53472.0,"y":471.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":471.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3326},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2033},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/software-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2745"]},"34:2702":{"type":"FRAME","id":"34:2702","name":"Tablet landscape","absoluteBoundingBox":{"x":52224.0,"y":100.0,"width":1160.0,"height":58760.0},"isolatedAbsoluteRenderBounds":{"x":52224.0,"y":100.0,"width":1160.0,"height":58760.0},"relativeTransform":[[1.0,0.0,4224.0],[0.0,1.0,100.0]],"size":{"x":1160.0,"y":58760.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.988235294818878,"g":0.984313726425171,"b":0.968627452850342,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"HORIZONTAL","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["34:2703","34:2724"]},"34:2725":{"type":"FRAME","id":"34:2725","name":"introduction","absoluteBoundingBox":{"x":52552.0,"y":132.0,"width":800.0,"height":58696.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":132.0,"width":800.0,"height":58696.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,32.0]],"size":{"x":800.0,"y":58696.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1920.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisSizingMode":"FIXED","children":["34:2726","78:20341","78:20365","78:20388","78:20411","78:20571"]},"34:2649":{"type":"WEBPAGE","id":"34:2649","name":"/agent-preparation","absoluteBoundingBox":{"x":48000.0,"y":0.0,"width":6720.0,"height":92983.9296875},"isolatedAbsoluteRenderBounds":{"x":48000.0,"y":0.0,"width":6720.0,"height":92983.9296875},"relativeTransform":[[1.0,0.0,48000.0],[0.0,1.0,0.0]],"size":{"x":6720.0,"y":92983.9296875},"fills":[{"opacity":0.298039227724075,"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["34:2650","34:2676","34:2702","34:2728","34:2754"]},"78:20573":{"type":"TEXT","id":"78:20573","name":"# Augur Accessibility ## Overview Augur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints. --- ## Colour Contrast ### Requirements All text and interactive elements must meet WCAG AA contrast ratios: - **4.5:1** for standard text (14px and below) - **3:1** for large text (18px+ or 14px+ bold) - **3:1** for graphical elements (borders, icons) and components ### Palette Compliance **Text on cream backgrounds:** - `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓ - `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓ - `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum) **Text on neutral/900 backgrounds (active state):** - `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓ **Icons on backgrounds:** - `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓ - `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓ **Alert/status colour (orange, TBD):** - Requires testing once final hex value is provided - Minimum 3:1 on white and cream backgrounds ### Testing **Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse **Checklist:** - [ ] All body text meets 4.5:1 contrast minimum - [ ] All headings meet 3:1 contrast minimum - [ ] All icons meet 3:1 contrast minimum - [ ] Active/selected states are visually distinct from inactive states - [ ] Links are underlined or otherwise distinct from body text - [ ] Colour alone is not used to convey information (pair with shape, text, or pattern) --- ## Typography ### Readability **Font choice:** - PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing - Augur uses monospace intentionally for data density and professional appearance **Line length:** - **Optimal:** 50–70 characters per line - **Minimum:** 40 characters (in narrow panels) - **Maximum:** 100 characters (avoid in body text) - Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓ **Line spacing:** - `type/body`: 24px line-height (1.5× base size) ✓ - `type/h3`: 36px line-height (1.29× base size) ✓ - Sufficient for readability and dyslexia-friendly rendering **Font size:** - Minimum 16px for body text ✓ - Headings scale appropriately (24px–48px) - Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette **Weight:** - Bold used for headings and emphasis (not for extended body text) - Regular weight for standard copy (readability optimized) - Light weight used sparingly (metadata, secondary text) ### Testing **Checklist:** - [ ] No text smaller than 14px for body content - [ ] Line-height at least 1.5× font size - [ ] Line length between 40–100 characters - [ ] Adequate white space between text blocks - [ ] Headings use semantic hierarchy (no skipped levels) --- ## Keyboard Navigation ### Focus Management **Requirement:** All interactive elements must be accessible via keyboard. **Focus order:** - Top-to-bottom, left-to-right reading order - Tab moves forward, Shift+Tab moves backward - When a modal/panel opens, focus moves to the first focusable element - When a modal/panel closes, focus returns to the triggering element - Focus trap in modals (Tab from last element wraps to first) **Focus indicator:** - 2px solid outline in `colour/focus-ring` (neutral/800, #494541) - 2px offset from element edge - Visible at all times (not removed on focus, only on blur) - High contrast (minimum 3:1) against background ### Keyboard Shortcuts **Global:** - Tab: Move to next focusable element - Shift+Tab: Move to previous focusable element - Escape: Close open modal, dropdown, or panel **Within dropdowns/pickers:** - Arrow Up/Down: Navigate items - Arrow Left/Right: Navigate tabs or columns - Enter: Select item - Escape: Close without selecting **Within panels:** - Enter: Activate button or link - Space: Toggle checkbox (if applicable) **Browser conventions:** - Alt+Left Arrow: Back (browser/application back) - Alt+Right Arrow: Forward - F5: Refresh (standard; not overridden) ### Testing **Checklist:** - [ ] All buttons and links are reachable via Tab - [ ] Focus order follows visual reading order - [ ] Focus indicator is always visible and high-contrast - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers and lists - [ ] No keyboard traps (user can Tab away from any element) - [ ] No content is keyboard-only or mouse-only --- ## Screen Reader Support ### Semantic HTML **Requirement:** Use semantic HTML to convey structure and meaning to assistive technology. **Tags:** - `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels) - `<button>`: Interactive buttons - `<a>`: Links (with descriptive text, not \"click here\") - `<ul>`, `<ol>`, `<li>`: Lists - `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables - `<label>`: Form label (associated via `for` or nesting) - `<nav>`: Navigation region - `<main>`: Main content area - `<aside>`: Sidebar or supplementary content - `<article>`: Self-contained content block ### ARIA Attributes **Requirement:** Use ARIA only to supplement semantic HTML, not replace it. **Landmarks:** - `role=\"banner\"`: Top bar / header - `role=\"main\"`: Primary content area - `role=\"navigation\"`: Navigation menu - `role=\"contentinfo\"`: Footer **Buttons & links:** - `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\") - `aria-pressed`: For toggle buttons (true/false state) - `aria-expanded`: For expandable/collapsible sections (true/false) **Lists:** - `aria-label`: For unlabeled lists (e.g. \"Related actions\") - `role=\"listbox\"`: For selectable item lists (dropdowns, pickers) - `aria-selected`: For selected items in a listbox **Live regions:** - `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\") - `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\") - `aria-atomic=\"true\"`: Announce entire region, not just changes - `role=\"alert\"`: For error messages or warnings **Images:** - `alt`: Descriptive text for images (mandatory for all `<img>` elements) - Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type) - Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>` **Form inputs:** - `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>` - `aria-label` if visible label not possible - `aria-describedby` for help text or error messages **Data tables:** - `<table>` with semantic structure - `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`) - `<td>` for data cells - Avoid merged cells; if necessary, use `colspan`/`rowspan` with care ### Screen Reader Testing **Tools:** - NVDA (Windows, free) - JAWS (Windows, paid) - VoiceOver (macOS/iOS, built-in) - TalkBack (Android, built-in) **Checklist:** - [ ] Panel headers and titles are announced correctly - [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\") - [ ] Links include descriptive text (not just \"arrow\" or \"more\") - [ ] Buttons include labels and states (not just icons) - [ ] Tables are announced with headers and structure - [ ] Error messages are announced immediately - [ ] Status updates are announced live (via aria-live) - [ ] Images have appropriate alt text --- ## Motion & Animation ### Vestibular & Photosensitivity **Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity. **Guidelines:** - No animations that move at more than 3 full revolutions per second - No flashing or flickering (no more than 3 flashes per second in a 1-second window) - No large moving areas that fill >25% of the viewport - Animation should be kept under 500ms for most interactions ### Prefers Reduced Motion **Requirement:** Respect the `prefers-reduced-motion` media query. **Implementation:** ```css @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } ``` **Checklist:** - [ ] Panel transitions respect `prefers-reduced-motion` - [ ] Hover animations are minimal (no parallax or large movements) - [ ] Loading states don't use spinning or flashing - [ ] No auto-playing videos or audio --- ## Touch & Mobile ### Touch Target Size **Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements). **Augur components:** - Icon button: 40×40px (meets requirement with padding) - List item: 44px height minimum - Dropdown: 40px height + `space/4` padding vertical (meets requirement) - Text button: 40px height minimum **Spacing:** - Between touch targets: At least 8px (preferably 12px) - Avoid small, closely-spaced buttons ### Gesture Support **Requirement:** Don't rely on complex gestures; provide alternative inputs. **Supported gestures:** - Tap: Standard button/link activation - Long-press: Optional (secondary action, always has keyboard alternative) - Swipe: Optional (dismiss panels on mobile, always has close button) - Pinch: Optional (zoom; always has +/- buttons) **Mobile-specific:** - On narrow viewports, panels overlay canvas instead of docking - Swipe panels right to dismiss (alternative: close X button) - Landscape orientation supported (panels still dock right if space allows) ### Testing **Checklist:** - [ ] All buttons are at least 44×44px - [ ] Touch targets have at least 8px spacing - [ ] No reliance on hover states (buttons work via tap) - [ ] Landscape and portrait orientations both work - [ ] Swipe and pinch have keyboard alternatives --- ## Testing Checklist ### Automated Testing **Tools:** - Lighthouse (Chrome DevTools) - axe DevTools (browser extension) - WAVE (WebAIM extension) **Run for:** - [ ] Colour contrast (all text, icons, borders) - [ ] Missing alt text - [ ] Missing form labels - [ ] Missing heading hierarchy - [ ] Keyboard traps - [ ] Focus management - [ ] ARIA usage errors ### Manual Testing **Keyboard:** - [ ] Tab through entire page, confirm logical order - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers - [ ] Focus indicator always visible - [ ] No keyboard traps **Screen reader (NVDA or VoiceOver):** - [ ] Headings announce correctly - [ ] List items announce with count - [ ] Links have descriptive text - [ ] Buttons include labels and states - [ ] Errors announce immediately - [ ] Live regions update correctly **Visual:** - [ ] Text is at least 14px - [ ] Line-height is at least 1.5× - [ ] Line length is 40–100 characters - [ ] Headings use semantic hierarchy - [ ] Colour contrast meets WCAG AA - [ ] Focus indicator is always visible - [ ] No information conveyed by colour alone **Mobile:** - [ ] Touch targets are 44×44px - [ ] Landscape and portrait work - [ ] Swipe/pinch have alternatives ### Browser Compatibility **Test on:** - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) - Mobile browsers (Safari iOS, Chrome Android) ### Assistive Technology **Test with:** - NVDA (free, Windows) - JAWS (paid, Windows) - VoiceOver (built-in, macOS/iOS) - TalkBack (built-in, Android) --- ## Remediation If an accessibility issue is found: 1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor) 2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog 3. **Fix:** Implement semantic HTML, ARIA, or CSS changes 4. **Retest:** Confirm fix with automated tool and manual testing 5. **Verify:** Test fix on multiple screen readers and browsers --- ## Resources - **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/ - **WebAIM:** https://webaim.org/ - **A11y Project:** https://www.a11yproject.com/ - **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/ - **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ --- ## Compliance Statement Augur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline. **Last audit:** [Date] **Next audit:** [Date + 3 months] **Issues:** [Link to issue tracker]","absoluteBoundingBox":{"x":52572.0,"y":48596.0,"width":760.0,"height":10176.0},"isolatedAbsoluteRenderBounds":{"x":52570.16015625,"y":48601.65625,"width":757.3125,"height":10142.0625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":10176.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Accessibility\n\n## Overview\n\nAugur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints.\n\n---\n\n## Colour Contrast\n\n### Requirements\n\nAll text and interactive elements must meet WCAG AA contrast ratios:\n- **4.5:1** for standard text (14px and below)\n- **3:1** for large text (18px+ or 14px+ bold)\n- **3:1** for graphical elements (borders, icons) and components\n\n### Palette Compliance\n\n**Text on cream backgrounds:**\n- `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓\n- `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓\n- `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum)\n\n**Text on neutral/900 backgrounds (active state):**\n- `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓\n\n**Icons on backgrounds:**\n- `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓\n- `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓\n\n**Alert/status colour (orange, TBD):**\n- Requires testing once final hex value is provided\n- Minimum 3:1 on white and cream backgrounds\n\n### Testing\n\n**Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse\n\n**Checklist:**\n- [ ] All body text meets 4.5:1 contrast minimum\n- [ ] All headings meet 3:1 contrast minimum\n- [ ] All icons meet 3:1 contrast minimum\n- [ ] Active/selected states are visually distinct from inactive states\n- [ ] Links are underlined or otherwise distinct from body text\n- [ ] Colour alone is not used to convey information (pair with shape, text, or pattern)\n\n---\n\n## Typography\n\n### Readability\n\n**Font choice:**\n- PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing\n- Augur uses monospace intentionally for data density and professional appearance\n\n**Line length:**\n- **Optimal:** 50–70 characters per line\n- **Minimum:** 40 characters (in narrow panels)\n- **Maximum:** 100 characters (avoid in body text)\n- Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓\n\n**Line spacing:**\n- `type/body`: 24px line-height (1.5× base size) ✓\n- `type/h3`: 36px line-height (1.29× base size) ✓\n- Sufficient for readability and dyslexia-friendly rendering\n\n**Font size:**\n- Minimum 16px for body text ✓\n- Headings scale appropriately (24px–48px)\n- Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette\n\n**Weight:**\n- Bold used for headings and emphasis (not for extended body text)\n- Regular weight for standard copy (readability optimized)\n- Light weight used sparingly (metadata, secondary text)\n\n### Testing\n\n**Checklist:**\n- [ ] No text smaller than 14px for body content\n- [ ] Line-height at least 1.5× font size\n- [ ] Line length between 40–100 characters\n- [ ] Adequate white space between text blocks\n- [ ] Headings use semantic hierarchy (no skipped levels)\n\n---\n\n## Keyboard Navigation\n\n### Focus Management\n\n**Requirement:** All interactive elements must be accessible via keyboard.\n\n**Focus order:**\n- Top-to-bottom, left-to-right reading order\n- Tab moves forward, Shift+Tab moves backward\n- When a modal/panel opens, focus moves to the first focusable element\n- When a modal/panel closes, focus returns to the triggering element\n- Focus trap in modals (Tab from last element wraps to first)\n\n**Focus indicator:**\n- 2px solid outline in `colour/focus-ring` (neutral/800, #494541)\n- 2px offset from element edge\n- Visible at all times (not removed on focus, only on blur)\n- High contrast (minimum 3:1) against background\n\n### Keyboard Shortcuts\n\n**Global:**\n- Tab: Move to next focusable element\n- Shift+Tab: Move to previous focusable element\n- Escape: Close open modal, dropdown, or panel\n\n**Within dropdowns/pickers:**\n- Arrow Up/Down: Navigate items\n- Arrow Left/Right: Navigate tabs or columns\n- Enter: Select item\n- Escape: Close without selecting\n\n**Within panels:**\n- Enter: Activate button or link\n- Space: Toggle checkbox (if applicable)\n\n**Browser conventions:**\n- Alt+Left Arrow: Back (browser/application back)\n- Alt+Right Arrow: Forward\n- F5: Refresh (standard; not overridden)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons and links are reachable via Tab\n- [ ] Focus order follows visual reading order\n- [ ] Focus indicator is always visible and high-contrast\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers and lists\n- [ ] No keyboard traps (user can Tab away from any element)\n- [ ] No content is keyboard-only or mouse-only\n\n---\n\n## Screen Reader Support\n\n### Semantic HTML\n\n**Requirement:** Use semantic HTML to convey structure and meaning to assistive technology.\n\n**Tags:**\n- `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels)\n- `<button>`: Interactive buttons\n- `<a>`: Links (with descriptive text, not \"click here\")\n- `<ul>`, `<ol>`, `<li>`: Lists\n- `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables\n- `<label>`: Form label (associated via `for` or nesting)\n- `<nav>`: Navigation region\n- `<main>`: Main content area\n- `<aside>`: Sidebar or supplementary content\n- `<article>`: Self-contained content block\n\n### ARIA Attributes\n\n**Requirement:** Use ARIA only to supplement semantic HTML, not replace it.\n\n**Landmarks:**\n- `role=\"banner\"`: Top bar / header\n- `role=\"main\"`: Primary content area\n- `role=\"navigation\"`: Navigation menu\n- `role=\"contentinfo\"`: Footer\n\n**Buttons & links:**\n- `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\")\n- `aria-pressed`: For toggle buttons (true/false state)\n- `aria-expanded`: For expandable/collapsible sections (true/false)\n\n**Lists:**\n- `aria-label`: For unlabeled lists (e.g. \"Related actions\")\n- `role=\"listbox\"`: For selectable item lists (dropdowns, pickers)\n- `aria-selected`: For selected items in a listbox\n\n**Live regions:**\n- `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\")\n- `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\")\n- `aria-atomic=\"true\"`: Announce entire region, not just changes\n- `role=\"alert\"`: For error messages or warnings\n\n**Images:**\n- `alt`: Descriptive text for images (mandatory for all `<img>` elements)\n- Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type)\n- Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>`\n\n**Form inputs:**\n- `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>`\n- `aria-label` if visible label not possible\n- `aria-describedby` for help text or error messages\n\n**Data tables:**\n- `<table>` with semantic structure\n- `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`)\n- `<td>` for data cells\n- Avoid merged cells; if necessary, use `colspan`/`rowspan` with care\n\n### Screen Reader Testing\n\n**Tools:**\n- NVDA (Windows, free)\n- JAWS (Windows, paid)\n- VoiceOver (macOS/iOS, built-in)\n- TalkBack (Android, built-in)\n\n**Checklist:**\n- [ ] Panel headers and titles are announced correctly\n- [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\")\n- [ ] Links include descriptive text (not just \"arrow\" or \"more\")\n- [ ] Buttons include labels and states (not just icons)\n- [ ] Tables are announced with headers and structure\n- [ ] Error messages are announced immediately\n- [ ] Status updates are announced live (via aria-live)\n- [ ] Images have appropriate alt text\n\n---\n\n## Motion & Animation\n\n### Vestibular & Photosensitivity\n\n**Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity.\n\n**Guidelines:**\n- No animations that move at more than 3 full revolutions per second\n- No flashing or flickering (no more than 3 flashes per second in a 1-second window)\n- No large moving areas that fill >25% of the viewport\n- Animation should be kept under 500ms for most interactions\n\n### Prefers Reduced Motion\n\n**Requirement:** Respect the `prefers-reduced-motion` media query.\n\n**Implementation:**\n```css\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n  }\n}\n```\n\n**Checklist:**\n- [ ] Panel transitions respect `prefers-reduced-motion`\n- [ ] Hover animations are minimal (no parallax or large movements)\n- [ ] Loading states don't use spinning or flashing\n- [ ] No auto-playing videos or audio\n\n---\n\n## Touch & Mobile\n\n### Touch Target Size\n\n**Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements).\n\n**Augur components:**\n- Icon button: 40×40px (meets requirement with padding)\n- List item: 44px height minimum\n- Dropdown: 40px height + `space/4` padding vertical (meets requirement)\n- Text button: 40px height minimum\n\n**Spacing:**\n- Between touch targets: At least 8px (preferably 12px)\n- Avoid small, closely-spaced buttons\n\n### Gesture Support\n\n**Requirement:** Don't rely on complex gestures; provide alternative inputs.\n\n**Supported gestures:**\n- Tap: Standard button/link activation\n- Long-press: Optional (secondary action, always has keyboard alternative)\n- Swipe: Optional (dismiss panels on mobile, always has close button)\n- Pinch: Optional (zoom; always has +/- buttons)\n\n**Mobile-specific:**\n- On narrow viewports, panels overlay canvas instead of docking\n- Swipe panels right to dismiss (alternative: close X button)\n- Landscape orientation supported (panels still dock right if space allows)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons are at least 44×44px\n- [ ] Touch targets have at least 8px spacing\n- [ ] No reliance on hover states (buttons work via tap)\n- [ ] Landscape and portrait orientations both work\n- [ ] Swipe and pinch have keyboard alternatives\n\n---\n\n## Testing Checklist\n\n### Automated Testing\n\n**Tools:**\n- Lighthouse (Chrome DevTools)\n- axe DevTools (browser extension)\n- WAVE (WebAIM extension)\n\n**Run for:**\n- [ ] Colour contrast (all text, icons, borders)\n- [ ] Missing alt text\n- [ ] Missing form labels\n- [ ] Missing heading hierarchy\n- [ ] Keyboard traps\n- [ ] Focus management\n- [ ] ARIA usage errors\n\n### Manual Testing\n\n**Keyboard:**\n- [ ] Tab through entire page, confirm logical order\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers\n- [ ] Focus indicator always visible\n- [ ] No keyboard traps\n\n**Screen reader (NVDA or VoiceOver):**\n- [ ] Headings announce correctly\n- [ ] List items announce with count\n- [ ] Links have descriptive text\n- [ ] Buttons include labels and states\n- [ ] Errors announce immediately\n- [ ] Live regions update correctly\n\n**Visual:**\n- [ ] Text is at least 14px\n- [ ] Line-height is at least 1.5×\n- [ ] Line length is 40–100 characters\n- [ ] Headings use semantic hierarchy\n- [ ] Colour contrast meets WCAG AA\n- [ ] Focus indicator is always visible\n- [ ] No information conveyed by colour alone\n\n**Mobile:**\n- [ ] Touch targets are 44×44px\n- [ ] Landscape and portrait work\n- [ ] Swipe/pinch have alternatives\n\n### Browser Compatibility\n\n**Test on:**\n- Chrome (latest)\n- Firefox (latest)\n- Safari (latest)\n- Edge (latest)\n- Mobile browsers (Safari iOS, Chrome Android)\n\n### Assistive Technology\n\n**Test with:**\n- NVDA (free, Windows)\n- JAWS (paid, Windows)\n- VoiceOver (built-in, macOS/iOS)\n- TalkBack (built-in, Android)\n\n---\n\n## Remediation\n\nIf an accessibility issue is found:\n\n1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor)\n2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog\n3. **Fix:** Implement semantic HTML, ARIA, or CSS changes\n4. **Retest:** Confirm fix with automated tool and manual testing\n5. **Verify:** Test fix on multiple screen readers and browsers\n\n---\n\n## Resources\n\n- **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/\n- **WebAIM:** https://webaim.org/\n- **A11y Project:** https://www.a11yproject.com/\n- **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/\n- **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/\n\n---\n\n## Compliance Statement\n\nAugur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline.\n\n**Last audit:** [Date]  \n**Next audit:** [Date + 3 months]  \n**Issues:** [Link to issue tracker]\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20395":{"type":"TEXT","id":"78:20395","name":"PATTERNS.MD","absoluteBoundingBox":{"x":54316.0,"y":42191.93359375,"width":304.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":54319.23046875,"y":42204.6953125,"width":213.80078125,"height":22.71875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PATTERNS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"63:17429":{"type":"SVG","id":"63:17429","name":"Logo","absoluteBoundingBox":{"x":53472.0,"y":204.0,"width":251.571716308594,"height":83.9320373535156},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":204.0,"width":251.5703125,"height":83.9320373535156},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,104.0]],"size":{"x":251.571716308594,"y":83.9320373535156},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logo","ariaAttributes":{},"interactions":[],"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"78:20572":{"type":"TEXT","id":"78:20572","name":"ACCESSIBILITY.MD","absoluteBoundingBox":{"x":52572.0,"y":48476.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52573.40625,"y":48501.51953125,"width":631.08984375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"ACCESSIBILITY.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20411":{"type":"FRAME","id":"78:20411","name":"5","absoluteBoundingBox":{"x":52552.0,"y":36348.0,"width":800.0,"height":12040.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":36348.0,"width":800.0,"height":12040.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36216.0]],"size":{"x":800.0,"y":12040.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20412","78:20413"]},"34:2754":{"type":"FRAME","id":"34:2754","name":"Mobile","absoluteBoundingBox":{"x":54280.0,"y":100.0,"width":376.0,"height":92819.9296875},"isolatedAbsoluteRenderBounds":{"x":54280.0,"y":100.0,"width":376.0,"height":92819.9296875},"relativeTransform":[[1.0,0.0,6280.0],[0.0,1.0,100.0]],"size":{"x":376.0,"y":92819.9296875},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.988235294818878,"g":0.984313726425171,"b":0.968627452850342,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["34:2755","34:2776"]},"34:2761":{"type":"FRAME","id":"34:2761","name":"navigation","absoluteBoundingBox":{"x":54296.0,"y":319.932037353516,"width":344.0,"height":240.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":319.932037353516,"width":344.0,"height":240.0},"relativeTransform":[[1.0,0.0,16.0],[0.0,1.0,219.932037353516]],"size":{"x":344.0,"y":240.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":12.0,"counterAxisSizingMode":"FIXED","children":["34:2762","34:2764","34:2766","34:2768","34:2770","34:2772","34:2774"]},"78:20412":{"type":"TEXT","id":"78:20412","name":"PERSONAS.MD","absoluteBoundingBox":{"x":52572.0,"y":36404.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52578.46484375,"y":36429.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PERSONAS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20388":{"type":"FRAME","id":"78:20388","name":"4","absoluteBoundingBox":{"x":52552.0,"y":27036.0,"width":800.0,"height":9280.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":27036.0,"width":800.0,"height":9280.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,26904.0]],"size":{"x":800.0,"y":9280.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20389","78:20390"]},"34:2724":{"type":"FRAME","id":"34:2724","name":"screens","absoluteBoundingBox":{"x":52520.0,"y":100.0,"width":864.0,"height":58760.0},"isolatedAbsoluteRenderBounds":{"x":52520.0,"y":100.0,"width":864.0,"height":58760.0},"relativeTransform":[[1.0,0.0,296.0],[0.0,1.0,0.0]],"size":{"x":864.0,"y":58760.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":32.0,"paddingRight":32.0,"paddingBottom":32.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["34:2725"]},"78:20390":{"type":"TEXT","id":"78:20390","name":"# Augur Patterns ## Overview Patterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens. --- ## Layout Patterns ### Panel-Based Spatial Layout **Structure:** Main canvas (left/centre) + draggable side panels (right) **Anatomy:** - **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width - **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small` - **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions - **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset) - **Timeline scrubber:** Bottom of viewport, spanning full width **Responsive behaviour:** - On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss - On desktop (>768px): panels dock on right, canvas shrinks to accommodate **Use case:** Dashboard, map view, live monitoring --- ### Detail Drill-Down **Structure:** List panel → Detail panel → Related panels **Flow:** 1. User clicks list item (e.g. \"Potential theft\" in Events) 2. Selected event panel opens (or detail drawer slides in) 3. Detail panel shows full information + related action links (Cameras, People, Timeline) 4. User clicks action link to open related panel 5. Back arrow returns to selected event detail **Panel stacking:** - Primary panel: Selected event - Secondary panel: Related person, timeline, or camera - Tertiary panel: If user drills deeper (e.g. timeline → specific incident) **Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel --- ### Modal Pickers (Date, Location) **Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation **Flow:** 1. User clicks \"When\" or \"Where\" dropdown in top bar 2. Picker modal slides up from bottom or appears inline 3. User navigates picker (tabs, lists, grid cells) 4. User selects option 5. Picker closes, filter updates, interface refreshes with new data **Keyboard support:** - Arrow keys to navigate picker items - Enter to select - Escape to close without selecting **Visual feedback:** - Selected item highlighted in dark (`colour/active`) - Current selection persists until changed --- ## Interaction Patterns ### Selection & Highlighting **Primary flow:** 1. User sees list of items (events, people, data points) 2. User clicks item to select 3. Item highlights with background `colour/hover` 4. Related detail panel opens or updates **Visual states:** - **Default:** `colour/bg/primary` background, `colour/text/primary` text - **Hover:** `colour/hover` background (cream/400), text unchanged - **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text **Keyboard support:** - Arrow keys to navigate list - Enter to select - Space to select (optional) --- ### Navigation via Back/Close **Pattern:** Panels always include back arrow (navigation) and close X (dismiss) **Back arrow:** - Returns to previous state or parent panel - Preserves scroll position (if applicable) - Visible only if there's a previous state to return to **Close X:** - Dismisses current panel - Returns to base view (e.g. map with no detail panels) - Always visible in panel header **Keyboard support:** - Escape key acts as close X (dismisses panel) - Alt+Left arrow acts as back button --- ### Status Indicators & Urgency **Alert dot (orange):** - Small 8px circle, top-right of avatar or button - Indicates urgent status (unreviewed, flagged, etc.) - Colour: `colour/alert` (#FF6B35, TBD — confirm value) **Notification list:** - \"Just now\" badges for recent alerts - Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp - Orange dot next to most recent items - Read/unread states (optional; not visible in current design) **Capacity badge:** - Circular dark badge (neutral/900) with white percentage text - Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\" **Ratio badge:** - Circular dark badge with split label, e.g. \"M:32 F:68\" - Indicates demographic breakdown or ratio metric **Temporal indicator:** - \"LIVE\" badge in calendar/date picker (active period tab) - Indicates real-time data stream --- ### Data Presentation **List-based:** - Categorical lists (Customer, Sales, Operational data) - Each list item is a link/button to drill-down - Section headers (`type/h4`) group related items **Card-based:** - Event card: image + avatar + title + metadata + description + related actions - Person card: avatar + name + metadata + related actions - Data card: chart + metadata **Chart-based:** - Bar charts with grey bars, axis labels - No chart title on the chart itself; title lives in panel header - Legend optional (axis labels sufficient for simple charts) **Table-based:** - Column headers in `type/h4` (bold monospace) - Rows in `type/body` (regular monospace) - No alternating row colours (density over visual variety) - Minimal borders; dividers use `colour/border/light` --- ## Visual Hierarchy ### Typographic **Dominance order (largest → smallest):** 1. `type/display` (48px) — Page title, hero heading (rarely used in Augur) 2. `type/h1` (40px) — Major section heading 3. `type/h2` (32px) — Subsection heading 4. `type/h3` (28px) — Panel title, card heading 5. `type/h4` (24px) — Section header, label, secondary heading 6. `type/body-large` (20px) — Introductory text, large body 7. `type/body` (16px) — Standard UI copy, list items, descriptions 8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`) **Weight hierarchy:** - Bold: Headings, emphasis, CTAs - Regular: Body text, labels, most UI copy - Light: Secondary text, metadata (applied as weight override, not separate style) --- ### Colour **Dominance order:** 1. Cream backgrounds (`colour/cream`) dominate visual space 2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability 3. Dark active state (`colour/active`, neutral/900) indicates selection 4. Orange accent (`colour/alert`) draws attention to urgent items 5. White canvas provides separation between 3D view and UI **Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts. --- ## Spacing & Alignment ### Padding **Panel padding:** - Header: `space/4` (16px) on all sides - Body: `space/6` (24px) on all sides - List item: `space/4` (16px) horizontal, `space/2` (8px) vertical **Margins:** - Between sections within a panel: `space/6` (24px) - Between list items: None (border-based dividers) - Between action links: `space/4` (16px) ### Grid **Base unit:** 8px **Canvas width:** Variable (full minus panel width) **Panel width:** 320px fixed **Content width:** Full panel width minus padding **Align to 8px grid:** - Position: multiples of 8px - Size: multiples of 8px - Spacing: use `space/*` tokens (multiples of 4px or 8px) --- ## Motion (Future) **Tentative patterns (not currently specified):** - Panel slide-in/slide-out (250ms ease-out) - Dropdown fade-in (150ms ease-out) - Item hover scale (subtle, 1.02× scale) - Colour transitions (200ms ease-out for hover/active states) **Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation. --- ## Accessibility Patterns ### Focus Management **Pattern:** Focus should move logically through the interface. - Tab order follows visual/reading order (left-to-right, top-to-bottom) - When a panel opens, focus moves to the panel's first focusable element - When a panel closes, focus returns to the triggering element - Modals trap focus (Tab wraps to first element after last) **Visual focus indicator:** - 2px outline in `colour/focus-ring` (neutral/800) - 2px offset from element boundary - Applies to all buttons, links, form inputs, and interactive elements --- ### Screen Reader Announcements **Patterns:** - When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\") - When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\") - When an action completes: Announce result (e.g. \"Filter applied, 12 results\") **Implementation:** - Use `aria-live=\"polite\"` for non-critical updates - Use `aria-live=\"assertive\"` for urgent alerts - Use `role=\"alert\"` for error messages --- ### Semantic HTML **Patterns:** - Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels) - Buttons: Use `<button>` for actions; `<a>` for navigation - Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\") - Lists: Use `<ul>` / `<ol>` / `<li>` for list content - Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically - Forms: Use `<label>` associated with inputs via `for` attribute or nesting --- ## Performance Patterns ### Data Rendering **Principle:** Render visible data first; load additional data on scroll or on-demand. - Panel lists: Render first 20 items, lazy-load on scroll - Charts: Render at target width; no real-time updates for high-frequency data - 3D canvas: Render at 60fps; debounce pan/zoom interactions ### Caching - Filter selections (Where, When) cached in session storage - Panel scroll positions remembered during session - Charts cached until time range changes --- ## Error & Empty States ### Empty State **Pattern:** When no data matches filter or list is empty. **Display:** - Panel body shows centered, light grey message - Message: `type/body` in `colour/text/secondary` - Text: \"No [items] found\" or \"Check your filters\" - Optional icon above text (light grey, 48×48px) **Example:** \"No people found. Check your filters or adjust the time range.\" --- ### Error State **Pattern:** When an action fails or data cannot load. **Display:** - Panel body shows centered error message - Message: `type/body` in `colour/alert` (orange, once defined) - Heading: `type/h4` \"Error\" or specific error title - Optional retry button below message - Optional error code for support (small grey text below) **Example:** \"Error loading data. Status code: 500. Retry?\" **Keyboard support:** - Tab to retry button, Enter to retry - Escape to close error or return to previous state --- ## Responsive Breakpoints **Mobile (<768px):** - Panels overlay canvas at full width - Panels are swipeable/draggable to dismiss - Top bar condenses (logo smaller, icons only for filters) - Secondary nav wraps or becomes scrollable **Tablet (768px–1200px):** - Panels dock on right at 300px width - Canvas shrinks but remains visible - Secondary nav visible, single row **Desktop (>1200px):** - Panels dock on right at 320px width - Canvas full viewport minus panel width - All controls visible, horizontal layout preferred","absoluteBoundingBox":{"x":52572.0,"y":27212.0,"width":760.0,"height":9048.0},"isolatedAbsoluteRenderBounds":{"x":52570.16015625,"y":27218.119140625,"width":754.31640625,"height":9013.599609375},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":9048.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Patterns\n\n## Overview\n\nPatterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens.\n\n---\n\n## Layout Patterns\n\n### Panel-Based Spatial Layout\n\n**Structure:** Main canvas (left/centre) + draggable side panels (right)\n\n**Anatomy:**\n- **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width\n- **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small`\n- **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions\n- **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset)\n- **Timeline scrubber:** Bottom of viewport, spanning full width\n\n**Responsive behaviour:**\n- On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss\n- On desktop (>768px): panels dock on right, canvas shrinks to accommodate\n\n**Use case:** Dashboard, map view, live monitoring\n\n---\n\n### Detail Drill-Down\n\n**Structure:** List panel → Detail panel → Related panels\n\n**Flow:**\n1. User clicks list item (e.g. \"Potential theft\" in Events)\n2. Selected event panel opens (or detail drawer slides in)\n3. Detail panel shows full information + related action links (Cameras, People, Timeline)\n4. User clicks action link to open related panel\n5. Back arrow returns to selected event detail\n\n**Panel stacking:**\n- Primary panel: Selected event\n- Secondary panel: Related person, timeline, or camera\n- Tertiary panel: If user drills deeper (e.g. timeline → specific incident)\n\n**Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel\n\n---\n\n### Modal Pickers (Date, Location)\n\n**Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation\n\n**Flow:**\n1. User clicks \"When\" or \"Where\" dropdown in top bar\n2. Picker modal slides up from bottom or appears inline\n3. User navigates picker (tabs, lists, grid cells)\n4. User selects option\n5. Picker closes, filter updates, interface refreshes with new data\n\n**Keyboard support:**\n- Arrow keys to navigate picker items\n- Enter to select\n- Escape to close without selecting\n\n**Visual feedback:**\n- Selected item highlighted in dark (`colour/active`)\n- Current selection persists until changed\n\n---\n\n## Interaction Patterns\n\n### Selection & Highlighting\n\n**Primary flow:**\n1. User sees list of items (events, people, data points)\n2. User clicks item to select\n3. Item highlights with background `colour/hover`\n4. Related detail panel opens or updates\n\n**Visual states:**\n- **Default:** `colour/bg/primary` background, `colour/text/primary` text\n- **Hover:** `colour/hover` background (cream/400), text unchanged\n- **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text\n\n**Keyboard support:**\n- Arrow keys to navigate list\n- Enter to select\n- Space to select (optional)\n\n---\n\n### Navigation via Back/Close\n\n**Pattern:** Panels always include back arrow (navigation) and close X (dismiss)\n\n**Back arrow:**\n- Returns to previous state or parent panel\n- Preserves scroll position (if applicable)\n- Visible only if there's a previous state to return to\n\n**Close X:**\n- Dismisses current panel\n- Returns to base view (e.g. map with no detail panels)\n- Always visible in panel header\n\n**Keyboard support:**\n- Escape key acts as close X (dismisses panel)\n- Alt+Left arrow acts as back button\n\n---\n\n### Status Indicators & Urgency\n\n**Alert dot (orange):**\n- Small 8px circle, top-right of avatar or button\n- Indicates urgent status (unreviewed, flagged, etc.)\n- Colour: `colour/alert` (#FF6B35, TBD — confirm value)\n\n**Notification list:**\n- \"Just now\" badges for recent alerts\n- Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp\n- Orange dot next to most recent items\n- Read/unread states (optional; not visible in current design)\n\n**Capacity badge:**\n- Circular dark badge (neutral/900) with white percentage text\n- Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\"\n\n**Ratio badge:**\n- Circular dark badge with split label, e.g. \"M:32 F:68\"\n- Indicates demographic breakdown or ratio metric\n\n**Temporal indicator:**\n- \"LIVE\" badge in calendar/date picker (active period tab)\n- Indicates real-time data stream\n\n---\n\n### Data Presentation\n\n**List-based:**\n- Categorical lists (Customer, Sales, Operational data)\n- Each list item is a link/button to drill-down\n- Section headers (`type/h4`) group related items\n\n**Card-based:**\n- Event card: image + avatar + title + metadata + description + related actions\n- Person card: avatar + name + metadata + related actions\n- Data card: chart + metadata\n\n**Chart-based:**\n- Bar charts with grey bars, axis labels\n- No chart title on the chart itself; title lives in panel header\n- Legend optional (axis labels sufficient for simple charts)\n\n**Table-based:**\n- Column headers in `type/h4` (bold monospace)\n- Rows in `type/body` (regular monospace)\n- No alternating row colours (density over visual variety)\n- Minimal borders; dividers use `colour/border/light`\n\n---\n\n## Visual Hierarchy\n\n### Typographic\n\n**Dominance order (largest → smallest):**\n1. `type/display` (48px) — Page title, hero heading (rarely used in Augur)\n2. `type/h1` (40px) — Major section heading\n3. `type/h2` (32px) — Subsection heading\n4. `type/h3` (28px) — Panel title, card heading\n5. `type/h4` (24px) — Section header, label, secondary heading\n6. `type/body-large` (20px) — Introductory text, large body\n7. `type/body` (16px) — Standard UI copy, list items, descriptions\n8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`)\n\n**Weight hierarchy:**\n- Bold: Headings, emphasis, CTAs\n- Regular: Body text, labels, most UI copy\n- Light: Secondary text, metadata (applied as weight override, not separate style)\n\n---\n\n### Colour\n\n**Dominance order:**\n1. Cream backgrounds (`colour/cream`) dominate visual space\n2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability\n3. Dark active state (`colour/active`, neutral/900) indicates selection\n4. Orange accent (`colour/alert`) draws attention to urgent items\n5. White canvas provides separation between 3D view and UI\n\n**Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts.\n\n---\n\n## Spacing & Alignment\n\n### Padding\n\n**Panel padding:**\n- Header: `space/4` (16px) on all sides\n- Body: `space/6` (24px) on all sides\n- List item: `space/4` (16px) horizontal, `space/2` (8px) vertical\n\n**Margins:**\n- Between sections within a panel: `space/6` (24px)\n- Between list items: None (border-based dividers)\n- Between action links: `space/4` (16px)\n\n### Grid\n\n**Base unit:** 8px  \n**Canvas width:** Variable (full minus panel width)  \n**Panel width:** 320px fixed  \n**Content width:** Full panel width minus padding\n\n**Align to 8px grid:**\n- Position: multiples of 8px\n- Size: multiples of 8px\n- Spacing: use `space/*` tokens (multiples of 4px or 8px)\n\n---\n\n## Motion (Future)\n\n**Tentative patterns (not currently specified):**\n- Panel slide-in/slide-out (250ms ease-out)\n- Dropdown fade-in (150ms ease-out)\n- Item hover scale (subtle, 1.02× scale)\n- Colour transitions (200ms ease-out for hover/active states)\n\n**Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation.\n\n---\n\n## Accessibility Patterns\n\n### Focus Management\n\n**Pattern:** Focus should move logically through the interface.\n\n- Tab order follows visual/reading order (left-to-right, top-to-bottom)\n- When a panel opens, focus moves to the panel's first focusable element\n- When a panel closes, focus returns to the triggering element\n- Modals trap focus (Tab wraps to first element after last)\n\n**Visual focus indicator:**\n- 2px outline in `colour/focus-ring` (neutral/800)\n- 2px offset from element boundary\n- Applies to all buttons, links, form inputs, and interactive elements\n\n---\n\n### Screen Reader Announcements\n\n**Patterns:**\n- When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\")\n- When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\")\n- When an action completes: Announce result (e.g. \"Filter applied, 12 results\")\n\n**Implementation:**\n- Use `aria-live=\"polite\"` for non-critical updates\n- Use `aria-live=\"assertive\"` for urgent alerts\n- Use `role=\"alert\"` for error messages\n\n---\n\n### Semantic HTML\n\n**Patterns:**\n- Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels)\n- Buttons: Use `<button>` for actions; `<a>` for navigation\n- Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\")\n- Lists: Use `<ul>` / `<ol>` / `<li>` for list content\n- Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically\n- Forms: Use `<label>` associated with inputs via `for` attribute or nesting\n\n---\n\n## Performance Patterns\n\n### Data Rendering\n\n**Principle:** Render visible data first; load additional data on scroll or on-demand.\n\n- Panel lists: Render first 20 items, lazy-load on scroll\n- Charts: Render at target width; no real-time updates for high-frequency data\n- 3D canvas: Render at 60fps; debounce pan/zoom interactions\n\n### Caching\n\n- Filter selections (Where, When) cached in session storage\n- Panel scroll positions remembered during session\n- Charts cached until time range changes\n\n---\n\n## Error & Empty States\n\n### Empty State\n\n**Pattern:** When no data matches filter or list is empty.\n\n**Display:**\n- Panel body shows centered, light grey message\n- Message: `type/body` in `colour/text/secondary`\n- Text: \"No [items] found\" or \"Check your filters\"\n- Optional icon above text (light grey, 48×48px)\n\n**Example:** \"No people found. Check your filters or adjust the time range.\"\n\n---\n\n### Error State\n\n**Pattern:** When an action fails or data cannot load.\n\n**Display:**\n- Panel body shows centered error message\n- Message: `type/body` in `colour/alert` (orange, once defined)\n- Heading: `type/h4` \"Error\" or specific error title\n- Optional retry button below message\n- Optional error code for support (small grey text below)\n\n**Example:** \"Error loading data. Status code: 500. Retry?\"\n\n**Keyboard support:**\n- Tab to retry button, Enter to retry\n- Escape to close error or return to previous state\n\n---\n\n## Responsive Breakpoints\n\n**Mobile (<768px):**\n- Panels overlay canvas at full width\n- Panels are swipeable/draggable to dismiss\n- Top bar condenses (logo smaller, icons only for filters)\n- Secondary nav wraps or becomes scrollable\n\n**Tablet (768px–1200px):**\n- Panels dock on right at 300px width\n- Canvas shrinks but remains visible\n- Secondary nav visible, single row\n\n**Desktop (>1200px):**\n- Panels dock on right at 320px width\n- Canvas full viewport minus panel width\n- All controls visible, horizontal layout preferred\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20389":{"type":"TEXT","id":"78:20389","name":"PATTERNS.MD","absoluteBoundingBox":{"x":52572.0,"y":27092.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52578.46484375,"y":27117.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PATTERNS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20415":{"type":"TEXT","id":"78:20415","name":"PERSONAS.MD","absoluteBoundingBox":{"x":53788.0,"y":48892.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53791.23046875,"y":48904.76171875,"width":213.80078125,"height":22.71875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PERSONAS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20365":{"type":"FRAME","id":"78:20365","name":"3","absoluteBoundingBox":{"x":52552.0,"y":14724.0,"width":800.0,"height":12280.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":14724.0,"width":800.0,"height":12280.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14592.0]],"size":{"x":800.0,"y":12280.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20366","78:20367"]},"78:20341":{"type":"FRAME","id":"78:20341","name":"2","absoluteBoundingBox":{"x":52552.0,"y":6636.0,"width":800.0,"height":8056.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":6636.0,"width":800.0,"height":8056.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,6504.0]],"size":{"x":800.0,"y":8056.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20342","78:20343"]},"78:20342":{"type":"TEXT","id":"78:20342","name":"TOKENS.MD","absoluteBoundingBox":{"x":52572.0,"y":6692.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52574.87890625,"y":6717.52001953125,"width":351.8046875,"height":45.43994140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TOKENS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"41:3541":{"type":"TEXT","id":"41:3541","name":"DESIGN.MD","absoluteBoundingBox":{"x":52572.0,"y":188.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52577.375,"y":213.520004272461,"width":349.30859375,"height":45.4399871826172},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DESIGN.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20406":{"type":"TEXT","id":"78:20406","name":"PERSONAS.MD","absoluteBoundingBox":{"x":50940.0,"y":34548.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50946.46484375,"y":34573.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PERSONAS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20405":{"type":"FRAME","id":"78:20405","name":"5","absoluteBoundingBox":{"x":50920.0,"y":34492.0,"width":1200.0,"height":9808.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":34492.0,"width":1200.0,"height":9808.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,34352.0]],"size":{"x":1200.0,"y":9808.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["78:20406","78:20407"]},"34:2703":{"type":"FRAME","id":"34:2703","name":"left","absoluteBoundingBox":{"x":52224.0,"y":100.0,"width":296.0,"height":507.932037353516},"isolatedAbsoluteRenderBounds":{"x":52224.0,"y":100.0,"width":296.0,"height":507.932037353516},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":296.0,"y":507.932037353516},"fills":[],"strokeAlign":"INSIDE","scrollBehavior":"STICKY_SCROLLS","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":32.0,"paddingBottom":32.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2704","63:17423","34:2709"]},"34:2709":{"type":"FRAME","id":"34:2709","name":"navigation","absoluteBoundingBox":{"x":52256.0,"y":335.932037353516,"width":256.0,"height":240.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":335.932037353516,"width":256.0,"height":240.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,235.932037353516]],"size":{"x":256.0,"y":240.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":12.0,"counterAxisSizingMode":"FIXED","children":["34:2710","34:2712","34:2714","34:2716","34:2718","34:2720","34:2722"]},"78:20577":{"type":"FRAME","id":"78:20577","name":"6","absoluteBoundingBox":{"x":54296.0,"y":76663.9296875,"width":344.0,"height":16240.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":76663.9296875,"width":344.0,"height":16240.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,76072.0]],"size":{"x":344.0,"y":16240.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20578","78:20579"]},"34:2764":{"type":"FRAME","id":"34:2764","name":"Branding","absoluteBoundingBox":{"x":54296.0,"y":355.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":355.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3329},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":15,"localID":134},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/branding-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2765"]},"34:2664":{"type":"FRAME","id":"34:2664","name":"Product definition","absoluteBoundingBox":{"x":48120.0,"y":467.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":467.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,108.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3313},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/product-definition"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2665"]},"34:2720":{"type":"FRAME","id":"34:2720","name":"Final outcome","absoluteBoundingBox":{"x":52256.0,"y":515.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":515.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3321},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2341},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/final-outcome"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2721"]},"34:2713":{"type":"TEXT","id":"34:2713","name":"Branding design","absoluteBoundingBox":{"x":52260.0,"y":371.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52261.48828125,"y":377.588043212891,"width":145.67578125,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Branding design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2712":{"type":"FRAME","id":"34:2712","name":"Branding","absoluteBoundingBox":{"x":52256.0,"y":371.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":371.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3317},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":15,"localID":134},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/branding-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2713"]},"34:2711":{"type":"TEXT","id":"34:2711","name":"Introduction","absoluteBoundingBox":{"x":52260.0,"y":335.932037353516,"width":120.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52261.6484375,"y":341.588043212891,"width":115.75,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":120.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Introduction","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20571":{"type":"FRAME","id":"78:20571","name":"6","absoluteBoundingBox":{"x":52552.0,"y":48420.0,"width":800.0,"height":10408.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":48420.0,"width":800.0,"height":10408.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,48288.0]],"size":{"x":800.0,"y":10408.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20572","78:20573"]},"63:17423":{"type":"SVG","id":"63:17423","name":"Logo","absoluteBoundingBox":{"x":52256.0,"y":212.0,"width":251.571716308594,"height":83.9320373535156},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":212.0,"width":251.5703125,"height":83.9320373535156},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,112.0]],"size":{"x":251.571716308594,"y":83.9320373535156},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logo","ariaAttributes":{},"interactions":[],"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"78:20348":{"type":"TEXT","id":"78:20348","name":"TOKENS.MD","absoluteBoundingBox":{"x":54316.0,"y":11551.931640625,"width":304.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":54317.44140625,"y":11564.69140625,"width":175.90234375,"height":22.720703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TOKENS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2717":{"type":"TEXT","id":"34:2717","name":"Product definition","absoluteBoundingBox":{"x":52260.0,"y":443.932037353516,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52261.6171875,"y":449.588043212891,"width":165.390625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Product definition","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2714":{"type":"FRAME","id":"34:2714","name":"Design sytem","absoluteBoundingBox":{"x":52256.0,"y":407.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":407.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3318},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1371},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/design-system"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2715"]},"78:20566":{"type":"TEXT","id":"78:20566","name":"ACCESSIBILITY.MD","absoluteBoundingBox":{"x":50940.0,"y":44396.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50941.40625,"y":44421.51953125,"width":631.08984375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"ACCESSIBILITY.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2698":{"type":"FRAME","id":"34:2698","name":"screens","absoluteBoundingBox":{"x":50880.0,"y":100.0,"width":1280.0,"height":54160.0},"isolatedAbsoluteRenderBounds":{"x":50880.0,"y":100.0,"width":1280.0,"height":54160.0},"relativeTransform":[[1.0,0.0,296.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":54160.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":40.0,"paddingRight":40.0,"paddingBottom":40.0,"paddingLeft":40.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["34:2699"]},"78:20417":{"type":"FRAME","id":"78:20417","name":"5","absoluteBoundingBox":{"x":54296.0,"y":56399.93359375,"width":344.0,"height":20248.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":56399.93359375,"width":344.0,"height":20248.00390625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55808.0]],"size":{"x":344.0,"y":20248.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20418","78:20419"]},"34:2697":{"type":"TEXT","id":"34:2697","name":"Agent preparation","absoluteBoundingBox":{"x":50628.0,"y":559.932006835938,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50628.3515625,"y":565.588012695312,"width":166.65625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Agent preparation","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20565":{"type":"FRAME","id":"78:20565","name":"6","absoluteBoundingBox":{"x":50920.0,"y":44340.0,"width":1200.0,"height":9880.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":44340.0,"width":1200.0,"height":9880.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,44200.0]],"size":{"x":1200.0,"y":9880.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["78:20566","78:20567"]},"41:3543":{"type":"TEXT","id":"41:3543","name":"DESIGN.MD","absoluteBoundingBox":{"x":54316.0,"y":647.932006835938,"width":304.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":54318.6875,"y":660.692016601562,"width":174.65625,"height":22.719970703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":304.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DESIGN.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20407":{"type":"TEXT","id":"78:20407","name":"# Augur Personas — Index ## Overview Augur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone. --- ## Persona Comparison Matrix | Persona | Primary goal | Time pressure | Technical skill | Device | Key feature | |---|---|---|---|---|---| | **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail | | **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export | | **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends | | **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary | | **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile | | **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation | --- ## Design Decisions by Persona ### Information Architecture **Government & Law enforcement** prioritise: - Timeline and historical context (drill-down from event → details → related) - People and places (find person, then events, then timeline) - Export and integration (share findings, integrate with external tools) **Council planners & owners** prioritise: - Aggregated metrics and trends (summary first, detail optional) - Comparative analysis (year-over-year, location-to-location) - Export for reports and presentations **Retailers & security operators** prioritise: - Alerts and notifications (passive receipt of urgent information) - Mobile access (not always at desk) - Minimal friction (quick lookup, confirm, act) ### Interaction Patterns **Government & law enforcement:** - Keyboard shortcuts (fast users) - Saved filters and workspaces (reuse across shifts) - Bulk export and reporting **Council & owners:** - Prebuilt reports and dashboards - Comparative date/time pickers - Visual summaries before detail **Retailers & operators:** - Push notifications and alerts - One-click actions (confirm, share, log) - Minimal navigation depth ### Copy & Tone **Government & law enforcement:** - Direct and precise (authoritative, no softening) - Technical vocabulary acceptable (they know the jargon) - Procedural language (actionable instructions) **Council & owners:** - Clear and jargon-free (may not know public safety terminology) - Contextual explanation (what this metric means, why it matters) - Business-focused language **Retailers & operators:** - Urgent but calm (no alarmism, but clear on severity) - Action-oriented (what to do, not why) - Short, scannable copy --- ## Feature Prioritisation by Persona ### Must-have (all personas) - Search/filter by location and date range - Detail panel for persons and events - Photo/avatar visibility - Export to PDF/CSV ### High-value (government, law enforcement) - Save and name filters - Timeline view with granular timestamps - Related data drilling (event → people → timeline) - Audit logging - Full historical data access ### High-value (council, commercial owner) - Prebuilt report templates - Comparative date filters - Trend charts and visualisations - Email scheduling for reports ### High-value (retailers, security operators) - Real-time notifications and alerts - Mobile app with offline capability - Quick incident logging (forms with presets) - Location map with heatmap view - Integration with mobile devices (tablet, smartphone) --- ## Accessibility & Inclusion All personas should be able to use Augur with: - Keyboard navigation (for all, especially desktop-heavy users) - Screen reader support (government analysts using accessibility features) - Mobile responsiveness (operators in field) - Low-tech fallbacks (alert SMS if app unavailable) --- # Augur Persona — Government Analyst **Role:** MI5/MI6 intelligence analyst **Goal:** Find and monitor hostile foreign agents operating in the UK **Frequency:** Daily, shift-based (8–12 hour blocks) ### Profile - **Age:** 28–45 - **Technical skill:** High (comfortable with complex systems, data tools) - **Context:** Secure, government facility with dedicated workstations - **Devices:** Desktop/laptop only; no mobile access - **Time pressure:** High (real-time monitoring, time-sensitive intelligence) ### Needs - **Speed:** Locate persons of interest within seconds - **Precision:** Confirm identity with high confidence (facial recognition, metadata matching) - **Historical context:** Access to full timeline of sightings and related incidents - **Integration:** Cross-reference with external databases and intelligence feeds - **Audit trail:** Detailed logs for compliance and legal proceedings ### Pain points - Current systems are fragmented (multiple tools for tracking, mapping, reporting) - Slow handoffs between shifts lose critical context - Geographic and temporal filtering is tedious (manual entry, limited saved filters) - Cannot quickly correlate multiple sightings across locations ### How they use Augur 1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours) 2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals 3. **Investigation:** Drill into specific event; review timeline and related people; export data for report 4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical) ### Design implications - **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status) - **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks - **Export options:** CSV, PDF for reports and compliance - **Audit annotations:** Allow analysts to add notes to specific sightings for context ---  # Augur Persona — Law Enforcement Officer **Role:** Investigator or counter-terrorism police **Goal:** Identify and locate persons of interest; build case evidence **Frequency:** Variable (reactive to incidents, proactive investigation cycles) ### Profile - **Age:** 30–50 - **Technical skill:** Medium (comfortable with common tools; less patience for complexity) - **Context:** Police station, patrol vehicle, incident scene - **Devices:** Desktop, laptop, occasionally tablet - **Time pressure:** Very high (active incidents, rapidly changing situations) ### Needs - **Immediate answers:** \"Where was this person in the last hour?\" - **Visual confirmation:** Photo, video, location map (not just data tables) - **Actionable intelligence:** Predict next location or movement pattern - **Evidence capture:** Screenshots, video clips for case files - **Team coordination:** Share findings with other officers or teams ### Pain points - Fragmented tools make scene response slow (check map, then check database, then check timeline) - Cannot quickly verify identity from CCTV feeds - Difficulty assessing threat level or modus operandi from raw data - Manual cross-referencing between locations is error-prone ### How they use Augur 1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours) 2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events 3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits 4. **Evidence collection:** Screenshot detail panel and timeline for case file 5. **Team briefing:** Share annotated view with other officers via secure link ### Design implications - **Large avatars and photos:** Visual confirmation is critical; images should be prominent - **Map integration:** Spatial context (where sightings occurred) matters more than abstract data - **Quick summaries:** AI-written incident summaries to provide instant context - **Mobile-first:** Design panels to work well on tablet and small screens - **Offline mode:** Critical workflows should work without network (for vehicle/scene use) ---  # Augur Persona — Council Planner **Role:** Urban planner, public safety coordinator **Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements **Frequency:** Weekly or monthly (strategic planning cycles, not real-time) ### Profile - **Age:** 35–55 - **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools) - **Context:** Office desk, occasional council meetings - **Devices:** Desktop/laptop; rare mobile use - **Time pressure:** Low (can spend time exploring data, generating reports) ### Needs - **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\" - **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes - **Exportable reports:** Data and visualisations for presentations and board documents - **Actionable insights:** Not raw data, but curated analysis with recommendations ### Pain points - Difficult to answer \"what changed?\" questions without historical data - Cannot easily generate heatmaps or trend charts for reports - Manual data aggregation from multiple sources is time-consuming - Lacks statistical context (is this trend significant or noise?) ### How they use Augur 1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days) 2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends 3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics 4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation 5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes ### Design implications - **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel) - **Comparative filters:** Quick way to compare two time periods side-by-side - **Summary statistics:** Show totals, averages, % change to highlight trends - **Natural language:** Avoid jargon; use plain English summaries - **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work --- # Augur Persona — Commercial Space Owner **Role:** Airport, shopping centre, stadium, or venue manager **Goal:** Ensure safety and security of premises; prevent theft, reduce incidents **Frequency:** Daily or weekly (operational oversight) ### Profile - **Age:** 35–60 - **Technical skill:** Low (comfort with basic software; prefers simplicity over power) - **Context:** Manager's office or security control room - **Devices:** Desktop/laptop; occasionally tablet - **Time pressure:** Medium (reactive to incidents; proactive reviews weekly) ### Needs - **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\" - **Staff briefing:** Prepare daily or weekly briefing for security team - **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas) - **Alert integration:** Receive notifications of serious incidents in real-time ### Pain points - Cannot quickly identify if incidents are isolated or part of a pattern - Lacks visibility into peak risk times (when to increase staffing) - Manual incident reports from security team are fragmented and slow - Difficult to demonstrate ROI of security improvements to leadership ### How they use Augur 1. **Daily check-in:** Open map; filter by location (venue) and today's date 2. **Incident review:** Click on incident to see details (what, where, when, involved parties) 3. **Weekly briefing:** Export summary of incidents and trends for security team meeting 4. **Quarterly report:** Generate 3-month report of incidents by type and location for board 5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues) ### Design implications - **Simplified interface:** Reduce options; show only relevant data for venue operators - **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters - **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity) - **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display) - **Email/SMS alerts:** Notify manager of serious incidents via push/email --- # Augur Persona — Retailer **Role:** Retail manager (supermarket, department store, independent shop) **Goal:** Prevent theft and loss; improve store operations; train staff on safety **Frequency:** Daily to weekly (depends on store size and incident frequency) ### Profile - **Age:** 28–50 - **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools) - **Context:** Store office or back-of-house area - **Devices:** Desktop/laptop; increasingly tablet (during floor rounds) - **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods) ### Needs - **Rapid response:** Identify shoplifter or employee theft in real-time - **Loss visibility:** \"How much loss are we experiencing? In which department?\" - **Staff training:** Use incident data to train staff on prevention and procedures - **Evidence capture:** Collect footage/data for loss prevention or legal proceedings ### Pain points - Manual incident reporting from floor staff (time-consuming, incomplete) - Difficult to see patterns (same offender, same time of day, same location in store) - Cannot correlate \"suspicious activity\" alerts with actual losses - Lack of visibility into employee-related incidents ### How they use Augur 1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification) 2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?) 3. **Shift review:** End of day, check incidents during shift; brief team on patterns 4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items 5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends ### Design implications - **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in) - **Repeat offender flag:** Highlight if same person has multiple incidents - **Item-level data:** Connect incidents to specific products/departments (requires POS integration) - **Playback mode:** Show timeline of activity before/after incident (useful for training) - **Mobile-first:** Managers check app from floor or office (not always at desk) --- # Augur Persona — Security Operator **Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema) **Goal:** Respond to incidents quickly; identify threats; protect staff and customers **Frequency:** Shift-based (continuous presence during operating hours) ### Profile - **Age:** 22–45 - **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools) - **Context:** Security control room or mobile (patrol, incident scene) - **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone - **Time pressure:** Very high (active incidents demand immediate action) ### Needs - **Instant alerts:** Notification of flagged individuals or unusual activity - **Visual confirmation:** Live camera feed or photos to verify threat level - **Location intelligence:** Where did the person go? Which exit will they use? - **Backup coordination:** Quick way to request additional security or police - **Incident log:** Record what happened for post-incident review ### Pain points - Fragmented tools (CCTV system, incident log, radio/comms separate) - Cannot quickly pull historical context (is this person a repeat problem?) - Difficulty communicating precise location/identity to backup teams - Manual incident reporting after the fact (time-consuming, errors) ### How they use Augur 1. **Real-time monitoring:** Control room displays map with heat map of recent activity 2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location 3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept 4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message 5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review ### Design implications - **Alert-centric design:** Notifications are primary interaction (not searching) - **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity) - **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone - **Voice-friendly:** Support dictation for incident logging (hands-free during active response) - **Offline resilience:** Core functions work without network (video playback, past data) - **Minimal friction:** Fewer clicks to log incident or alert backup --- See accessibility.md for full WCAG 2.1 AA compliance details.","absoluteBoundingBox":{"x":50940.0,"y":34668.0,"width":1160.0,"height":9576.0},"isolatedAbsoluteRenderBounds":{"x":50940.3515625,"y":34674.12109375,"width":1149.0,"height":9565.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":9576.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Personas — Index\n\n## Overview\n\nAugur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone.\n\n---\n\n\n## Persona Comparison Matrix\n\n| Persona | Primary goal | Time pressure | Technical skill | Device | Key feature |\n|---|---|---|---|---|---|\n| **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail |\n| **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export |\n| **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends |\n| **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary |\n| **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile |\n| **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation |\n\n---\n\n## Design Decisions by Persona\n\n### Information Architecture\n\n**Government & Law enforcement** prioritise:\n- Timeline and historical context (drill-down from event → details → related)\n- People and places (find person, then events, then timeline)\n- Export and integration (share findings, integrate with external tools)\n\n**Council planners & owners** prioritise:\n- Aggregated metrics and trends (summary first, detail optional)\n- Comparative analysis (year-over-year, location-to-location)\n- Export for reports and presentations\n\n**Retailers & security operators** prioritise:\n- Alerts and notifications (passive receipt of urgent information)\n- Mobile access (not always at desk)\n- Minimal friction (quick lookup, confirm, act)\n\n### Interaction Patterns\n\n**Government & law enforcement:**\n- Keyboard shortcuts (fast users)\n- Saved filters and workspaces (reuse across shifts)\n- Bulk export and reporting\n\n**Council & owners:**\n- Prebuilt reports and dashboards\n- Comparative date/time pickers\n- Visual summaries before detail\n\n**Retailers & operators:**\n- Push notifications and alerts\n- One-click actions (confirm, share, log)\n- Minimal navigation depth\n\n### Copy & Tone\n\n**Government & law enforcement:**\n- Direct and precise (authoritative, no softening)\n- Technical vocabulary acceptable (they know the jargon)\n- Procedural language (actionable instructions)\n\n**Council & owners:**\n- Clear and jargon-free (may not know public safety terminology)\n- Contextual explanation (what this metric means, why it matters)\n- Business-focused language\n\n**Retailers & operators:**\n- Urgent but calm (no alarmism, but clear on severity)\n- Action-oriented (what to do, not why)\n- Short, scannable copy\n\n---\n\n## Feature Prioritisation by Persona\n\n### Must-have (all personas)\n- Search/filter by location and date range\n- Detail panel for persons and events\n- Photo/avatar visibility\n- Export to PDF/CSV\n\n### High-value (government, law enforcement)\n- Save and name filters\n- Timeline view with granular timestamps\n- Related data drilling (event → people → timeline)\n- Audit logging\n- Full historical data access\n\n### High-value (council, commercial owner)\n- Prebuilt report templates\n- Comparative date filters\n- Trend charts and visualisations\n- Email scheduling for reports\n\n### High-value (retailers, security operators)\n- Real-time notifications and alerts\n- Mobile app with offline capability\n- Quick incident logging (forms with presets)\n- Location map with heatmap view\n- Integration with mobile devices (tablet, smartphone)\n\n---\n\n## Accessibility & Inclusion\n\nAll personas should be able to use Augur with:\n- Keyboard navigation (for all, especially desktop-heavy users)\n- Screen reader support (government analysts using accessibility features)\n- Mobile responsiveness (operators in field)\n- Low-tech fallbacks (alert SMS if app unavailable)\n\n---\n\n# Augur Persona — Government Analyst\n\n**Role:** MI5/MI6 intelligence analyst  \n**Goal:** Find and monitor hostile foreign agents operating in the UK  \n**Frequency:** Daily, shift-based (8–12 hour blocks)\n\n### Profile\n\n- **Age:** 28–45\n- **Technical skill:** High (comfortable with complex systems, data tools)\n- **Context:** Secure, government facility with dedicated workstations\n- **Devices:** Desktop/laptop only; no mobile access\n- **Time pressure:** High (real-time monitoring, time-sensitive intelligence)\n\n### Needs\n\n- **Speed:** Locate persons of interest within seconds\n- **Precision:** Confirm identity with high confidence (facial recognition, metadata matching)\n- **Historical context:** Access to full timeline of sightings and related incidents\n- **Integration:** Cross-reference with external databases and intelligence feeds\n- **Audit trail:** Detailed logs for compliance and legal proceedings\n\n### Pain points\n\n- Current systems are fragmented (multiple tools for tracking, mapping, reporting)\n- Slow handoffs between shifts lose critical context\n- Geographic and temporal filtering is tedious (manual entry, limited saved filters)\n- Cannot quickly correlate multiple sightings across locations\n\n### How they use Augur\n\n1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours)\n2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals\n3. **Investigation:** Drill into specific event; review timeline and related people; export data for report\n4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical)\n\n### Design implications\n\n- **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status)\n- **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks\n- **Export options:** CSV, PDF for reports and compliance\n- **Audit annotations:** Allow analysts to add notes to specific sightings for context\n\n---  # Augur Persona — Law Enforcement Officer\n\n**Role:** Investigator or counter-terrorism police  \n**Goal:** Identify and locate persons of interest; build case evidence  \n**Frequency:** Variable (reactive to incidents, proactive investigation cycles)\n\n### Profile\n\n- **Age:** 30–50\n- **Technical skill:** Medium (comfortable with common tools; less patience for complexity)\n- **Context:** Police station, patrol vehicle, incident scene\n- **Devices:** Desktop, laptop, occasionally tablet\n- **Time pressure:** Very high (active incidents, rapidly changing situations)\n\n### Needs\n\n- **Immediate answers:** \"Where was this person in the last hour?\"\n- **Visual confirmation:** Photo, video, location map (not just data tables)\n- **Actionable intelligence:** Predict next location or movement pattern\n- **Evidence capture:** Screenshots, video clips for case files\n- **Team coordination:** Share findings with other officers or teams\n\n### Pain points\n\n- Fragmented tools make scene response slow (check map, then check database, then check timeline)\n- Cannot quickly verify identity from CCTV feeds\n- Difficulty assessing threat level or modus operandi from raw data\n- Manual cross-referencing between locations is error-prone\n\n### How they use Augur\n\n1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours)\n2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events\n3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits\n4. **Evidence collection:** Screenshot detail panel and timeline for case file\n5. **Team briefing:** Share annotated view with other officers via secure link\n\n### Design implications\n\n- **Large avatars and photos:** Visual confirmation is critical; images should be prominent\n- **Map integration:** Spatial context (where sightings occurred) matters more than abstract data\n- **Quick summaries:** AI-written incident summaries to provide instant context\n- **Mobile-first:** Design panels to work well on tablet and small screens\n- **Offline mode:** Critical workflows should work without network (for vehicle/scene use)\n\n---\n # Augur Persona — Council Planner\n\n**Role:** Urban planner, public safety coordinator  \n**Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements  \n**Frequency:** Weekly or monthly (strategic planning cycles, not real-time)\n\n### Profile\n\n- **Age:** 35–55\n- **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools)\n- **Context:** Office desk, occasional council meetings\n- **Devices:** Desktop/laptop; rare mobile use\n- **Time pressure:** Low (can spend time exploring data, generating reports)\n\n### Needs\n\n- **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\"\n- **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes\n- **Exportable reports:** Data and visualisations for presentations and board documents\n- **Actionable insights:** Not raw data, but curated analysis with recommendations\n\n### Pain points\n\n- Difficult to answer \"what changed?\" questions without historical data\n- Cannot easily generate heatmaps or trend charts for reports\n- Manual data aggregation from multiple sources is time-consuming\n- Lacks statistical context (is this trend significant or noise?)\n\n### How they use Augur\n\n1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days)\n2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends\n3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics\n4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation\n5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes\n\n### Design implications\n\n- **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel)\n- **Comparative filters:** Quick way to compare two time periods side-by-side\n- **Summary statistics:** Show totals, averages, % change to highlight trends\n- **Natural language:** Avoid jargon; use plain English summaries\n- **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work\n\n---\n\n# Augur Persona — Commercial Space Owner\n\n**Role:** Airport, shopping centre, stadium, or venue manager  \n**Goal:** Ensure safety and security of premises; prevent theft, reduce incidents  \n**Frequency:** Daily or weekly (operational oversight)\n\n### Profile\n\n- **Age:** 35–60\n- **Technical skill:** Low (comfort with basic software; prefers simplicity over power)\n- **Context:** Manager's office or security control room\n- **Devices:** Desktop/laptop; occasionally tablet\n- **Time pressure:** Medium (reactive to incidents; proactive reviews weekly)\n\n### Needs\n\n- **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\"\n- **Staff briefing:** Prepare daily or weekly briefing for security team\n- **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas)\n- **Alert integration:** Receive notifications of serious incidents in real-time\n\n### Pain points\n\n- Cannot quickly identify if incidents are isolated or part of a pattern\n- Lacks visibility into peak risk times (when to increase staffing)\n- Manual incident reports from security team are fragmented and slow\n- Difficult to demonstrate ROI of security improvements to leadership\n\n### How they use Augur\n\n1. **Daily check-in:** Open map; filter by location (venue) and today's date\n2. **Incident review:** Click on incident to see details (what, where, when, involved parties)\n3. **Weekly briefing:** Export summary of incidents and trends for security team meeting\n4. **Quarterly report:** Generate 3-month report of incidents by type and location for board\n5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues)\n\n### Design implications\n\n- **Simplified interface:** Reduce options; show only relevant data for venue operators\n- **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters\n- **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity)\n- **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display)\n- **Email/SMS alerts:** Notify manager of serious incidents via push/email\n\n---\n\n# Augur Persona — Retailer\n\n**Role:** Retail manager (supermarket, department store, independent shop)  \n**Goal:** Prevent theft and loss; improve store operations; train staff on safety  \n**Frequency:** Daily to weekly (depends on store size and incident frequency)\n\n### Profile\n\n- **Age:** 28–50\n- **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools)\n- **Context:** Store office or back-of-house area\n- **Devices:** Desktop/laptop; increasingly tablet (during floor rounds)\n- **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods)\n\n### Needs\n\n- **Rapid response:** Identify shoplifter or employee theft in real-time\n- **Loss visibility:** \"How much loss are we experiencing? In which department?\"\n- **Staff training:** Use incident data to train staff on prevention and procedures\n- **Evidence capture:** Collect footage/data for loss prevention or legal proceedings\n\n### Pain points\n\n- Manual incident reporting from floor staff (time-consuming, incomplete)\n- Difficult to see patterns (same offender, same time of day, same location in store)\n- Cannot correlate \"suspicious activity\" alerts with actual losses\n- Lack of visibility into employee-related incidents\n\n### How they use Augur\n\n1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification)\n2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?)\n3. **Shift review:** End of day, check incidents during shift; brief team on patterns\n4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items\n5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends\n\n### Design implications\n\n- **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in)\n- **Repeat offender flag:** Highlight if same person has multiple incidents\n- **Item-level data:** Connect incidents to specific products/departments (requires POS integration)\n- **Playback mode:** Show timeline of activity before/after incident (useful for training)\n- **Mobile-first:** Managers check app from floor or office (not always at desk)\n\n---\n\n# Augur Persona — Security Operator\n\n**Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema)  \n**Goal:** Respond to incidents quickly; identify threats; protect staff and customers  \n**Frequency:** Shift-based (continuous presence during operating hours)\n\n### Profile\n\n- **Age:** 22–45\n- **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools)\n- **Context:** Security control room or mobile (patrol, incident scene)\n- **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone\n- **Time pressure:** Very high (active incidents demand immediate action)\n\n### Needs\n\n- **Instant alerts:** Notification of flagged individuals or unusual activity\n- **Visual confirmation:** Live camera feed or photos to verify threat level\n- **Location intelligence:** Where did the person go? Which exit will they use?\n- **Backup coordination:** Quick way to request additional security or police\n- **Incident log:** Record what happened for post-incident review\n\n### Pain points\n\n- Fragmented tools (CCTV system, incident log, radio/comms separate)\n- Cannot quickly pull historical context (is this person a repeat problem?)\n- Difficulty communicating precise location/identity to backup teams\n- Manual incident reporting after the fact (time-consuming, errors)\n\n### How they use Augur\n\n1. **Real-time monitoring:** Control room displays map with heat map of recent activity\n2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location\n3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept\n4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message\n5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review\n\n### Design implications\n\n- **Alert-centric design:** Notifications are primary interaction (not searching)\n- **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity)\n- **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone\n- **Voice-friendly:** Support dictation for incident logging (hands-free during active response)\n- **Offline resilience:** Core functions work without network (video playback, past data)\n- **Minimal friction:** Fewer clicks to log incident or alert backup\n\n---\n\nSee accessibility.md for full WCAG 2.1 AA compliance details.","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20382":{"type":"FRAME","id":"78:20382","name":"4","absoluteBoundingBox":{"x":50920.0,"y":25604.0,"width":1200.0,"height":8848.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":25604.0,"width":1200.0,"height":8848.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,25464.0]],"size":{"x":1200.0,"y":8848.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["78:20383","78:20384"]},"34:2770":{"type":"FRAME","id":"34:2770","name":"Software design","absoluteBoundingBox":{"x":54296.0,"y":463.932037353516,"width":344.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":463.932037353516,"width":344.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":344.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3332},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2033},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/software-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2771"]},"78:20359":{"type":"FRAME","id":"78:20359","name":"3","absoluteBoundingBox":{"x":50920.0,"y":13956.0,"width":1200.0,"height":11608.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":13956.0,"width":1200.0,"height":11608.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,13816.0]],"size":{"x":1200.0,"y":11608.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["78:20360","78:20361"]},"78:20360":{"type":"TEXT","id":"78:20360","name":"COMPONENTS.MD","absoluteBoundingBox":{"x":50940.0,"y":14012.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50944.3515625,"y":14037.51953125,"width":509.08203125,"height":45.4404296875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"COMPONENTS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20567":{"type":"TEXT","id":"78:20567","name":"# Augur Accessibility ## Overview Augur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints. --- ## Colour Contrast ### Requirements All text and interactive elements must meet WCAG AA contrast ratios: - **4.5:1** for standard text (14px and below) - **3:1** for large text (18px+ or 14px+ bold) - **3:1** for graphical elements (borders, icons) and components ### Palette Compliance **Text on cream backgrounds:** - `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓ - `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓ - `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum) **Text on neutral/900 backgrounds (active state):** - `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓ **Icons on backgrounds:** - `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓ - `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓ **Alert/status colour (orange, TBD):** - Requires testing once final hex value is provided - Minimum 3:1 on white and cream backgrounds ### Testing **Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse **Checklist:** - [ ] All body text meets 4.5:1 contrast minimum - [ ] All headings meet 3:1 contrast minimum - [ ] All icons meet 3:1 contrast minimum - [ ] Active/selected states are visually distinct from inactive states - [ ] Links are underlined or otherwise distinct from body text - [ ] Colour alone is not used to convey information (pair with shape, text, or pattern) --- ## Typography ### Readability **Font choice:** - PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing - Augur uses monospace intentionally for data density and professional appearance **Line length:** - **Optimal:** 50–70 characters per line - **Minimum:** 40 characters (in narrow panels) - **Maximum:** 100 characters (avoid in body text) - Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓ **Line spacing:** - `type/body`: 24px line-height (1.5× base size) ✓ - `type/h3`: 36px line-height (1.29× base size) ✓ - Sufficient for readability and dyslexia-friendly rendering **Font size:** - Minimum 16px for body text ✓ - Headings scale appropriately (24px–48px) - Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette **Weight:** - Bold used for headings and emphasis (not for extended body text) - Regular weight for standard copy (readability optimized) - Light weight used sparingly (metadata, secondary text) ### Testing **Checklist:** - [ ] No text smaller than 14px for body content - [ ] Line-height at least 1.5× font size - [ ] Line length between 40–100 characters - [ ] Adequate white space between text blocks - [ ] Headings use semantic hierarchy (no skipped levels) --- ## Keyboard Navigation ### Focus Management **Requirement:** All interactive elements must be accessible via keyboard. **Focus order:** - Top-to-bottom, left-to-right reading order - Tab moves forward, Shift+Tab moves backward - When a modal/panel opens, focus moves to the first focusable element - When a modal/panel closes, focus returns to the triggering element - Focus trap in modals (Tab from last element wraps to first) **Focus indicator:** - 2px solid outline in `colour/focus-ring` (neutral/800, #494541) - 2px offset from element edge - Visible at all times (not removed on focus, only on blur) - High contrast (minimum 3:1) against background ### Keyboard Shortcuts **Global:** - Tab: Move to next focusable element - Shift+Tab: Move to previous focusable element - Escape: Close open modal, dropdown, or panel **Within dropdowns/pickers:** - Arrow Up/Down: Navigate items - Arrow Left/Right: Navigate tabs or columns - Enter: Select item - Escape: Close without selecting **Within panels:** - Enter: Activate button or link - Space: Toggle checkbox (if applicable) **Browser conventions:** - Alt+Left Arrow: Back (browser/application back) - Alt+Right Arrow: Forward - F5: Refresh (standard; not overridden) ### Testing **Checklist:** - [ ] All buttons and links are reachable via Tab - [ ] Focus order follows visual reading order - [ ] Focus indicator is always visible and high-contrast - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers and lists - [ ] No keyboard traps (user can Tab away from any element) - [ ] No content is keyboard-only or mouse-only --- ## Screen Reader Support ### Semantic HTML **Requirement:** Use semantic HTML to convey structure and meaning to assistive technology. **Tags:** - `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels) - `<button>`: Interactive buttons - `<a>`: Links (with descriptive text, not \"click here\") - `<ul>`, `<ol>`, `<li>`: Lists - `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables - `<label>`: Form label (associated via `for` or nesting) - `<nav>`: Navigation region - `<main>`: Main content area - `<aside>`: Sidebar or supplementary content - `<article>`: Self-contained content block ### ARIA Attributes **Requirement:** Use ARIA only to supplement semantic HTML, not replace it. **Landmarks:** - `role=\"banner\"`: Top bar / header - `role=\"main\"`: Primary content area - `role=\"navigation\"`: Navigation menu - `role=\"contentinfo\"`: Footer **Buttons & links:** - `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\") - `aria-pressed`: For toggle buttons (true/false state) - `aria-expanded`: For expandable/collapsible sections (true/false) **Lists:** - `aria-label`: For unlabeled lists (e.g. \"Related actions\") - `role=\"listbox\"`: For selectable item lists (dropdowns, pickers) - `aria-selected`: For selected items in a listbox **Live regions:** - `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\") - `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\") - `aria-atomic=\"true\"`: Announce entire region, not just changes - `role=\"alert\"`: For error messages or warnings **Images:** - `alt`: Descriptive text for images (mandatory for all `<img>` elements) - Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type) - Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>` **Form inputs:** - `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>` - `aria-label` if visible label not possible - `aria-describedby` for help text or error messages **Data tables:** - `<table>` with semantic structure - `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`) - `<td>` for data cells - Avoid merged cells; if necessary, use `colspan`/`rowspan` with care ### Screen Reader Testing **Tools:** - NVDA (Windows, free) - JAWS (Windows, paid) - VoiceOver (macOS/iOS, built-in) - TalkBack (Android, built-in) **Checklist:** - [ ] Panel headers and titles are announced correctly - [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\") - [ ] Links include descriptive text (not just \"arrow\" or \"more\") - [ ] Buttons include labels and states (not just icons) - [ ] Tables are announced with headers and structure - [ ] Error messages are announced immediately - [ ] Status updates are announced live (via aria-live) - [ ] Images have appropriate alt text --- ## Motion & Animation ### Vestibular & Photosensitivity **Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity. **Guidelines:** - No animations that move at more than 3 full revolutions per second - No flashing or flickering (no more than 3 flashes per second in a 1-second window) - No large moving areas that fill >25% of the viewport - Animation should be kept under 500ms for most interactions ### Prefers Reduced Motion **Requirement:** Respect the `prefers-reduced-motion` media query. **Implementation:** ```css @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } ``` **Checklist:** - [ ] Panel transitions respect `prefers-reduced-motion` - [ ] Hover animations are minimal (no parallax or large movements) - [ ] Loading states don't use spinning or flashing - [ ] No auto-playing videos or audio --- ## Touch & Mobile ### Touch Target Size **Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements). **Augur components:** - Icon button: 40×40px (meets requirement with padding) - List item: 44px height minimum - Dropdown: 40px height + `space/4` padding vertical (meets requirement) - Text button: 40px height minimum **Spacing:** - Between touch targets: At least 8px (preferably 12px) - Avoid small, closely-spaced buttons ### Gesture Support **Requirement:** Don't rely on complex gestures; provide alternative inputs. **Supported gestures:** - Tap: Standard button/link activation - Long-press: Optional (secondary action, always has keyboard alternative) - Swipe: Optional (dismiss panels on mobile, always has close button) - Pinch: Optional (zoom; always has +/- buttons) **Mobile-specific:** - On narrow viewports, panels overlay canvas instead of docking - Swipe panels right to dismiss (alternative: close X button) - Landscape orientation supported (panels still dock right if space allows) ### Testing **Checklist:** - [ ] All buttons are at least 44×44px - [ ] Touch targets have at least 8px spacing - [ ] No reliance on hover states (buttons work via tap) - [ ] Landscape and portrait orientations both work - [ ] Swipe and pinch have keyboard alternatives --- ## Testing Checklist ### Automated Testing **Tools:** - Lighthouse (Chrome DevTools) - axe DevTools (browser extension) - WAVE (WebAIM extension) **Run for:** - [ ] Colour contrast (all text, icons, borders) - [ ] Missing alt text - [ ] Missing form labels - [ ] Missing heading hierarchy - [ ] Keyboard traps - [ ] Focus management - [ ] ARIA usage errors ### Manual Testing **Keyboard:** - [ ] Tab through entire page, confirm logical order - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers - [ ] Focus indicator always visible - [ ] No keyboard traps **Screen reader (NVDA or VoiceOver):** - [ ] Headings announce correctly - [ ] List items announce with count - [ ] Links have descriptive text - [ ] Buttons include labels and states - [ ] Errors announce immediately - [ ] Live regions update correctly **Visual:** - [ ] Text is at least 14px - [ ] Line-height is at least 1.5× - [ ] Line length is 40–100 characters - [ ] Headings use semantic hierarchy - [ ] Colour contrast meets WCAG AA - [ ] Focus indicator is always visible - [ ] No information conveyed by colour alone **Mobile:** - [ ] Touch targets are 44×44px - [ ] Landscape and portrait work - [ ] Swipe/pinch have alternatives ### Browser Compatibility **Test on:** - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) - Mobile browsers (Safari iOS, Chrome Android) ### Assistive Technology **Test with:** - NVDA (free, Windows) - JAWS (paid, Windows) - VoiceOver (built-in, macOS/iOS) - TalkBack (built-in, Android) --- ## Remediation If an accessibility issue is found: 1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor) 2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog 3. **Fix:** Implement semantic HTML, ARIA, or CSS changes 4. **Retest:** Confirm fix with automated tool and manual testing 5. **Verify:** Test fix on multiple screen readers and browsers --- ## Resources - **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/ - **WebAIM:** https://webaim.org/ - **A11y Project:** https://www.a11yproject.com/ - **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/ - **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ --- ## Compliance Statement Augur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline. **Last audit:** [Date] **Next audit:** [Date + 3 months] **Issues:** [Link to issue tracker]","absoluteBoundingBox":{"x":50940.0,"y":44516.0,"width":1160.0,"height":9648.0},"isolatedAbsoluteRenderBounds":{"x":50938.16015625,"y":44521.65625,"width":1141.31640625,"height":9614.0625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":9648.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Accessibility\n\n## Overview\n\nAugur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints.\n\n---\n\n## Colour Contrast\n\n### Requirements\n\nAll text and interactive elements must meet WCAG AA contrast ratios:\n- **4.5:1** for standard text (14px and below)\n- **3:1** for large text (18px+ or 14px+ bold)\n- **3:1** for graphical elements (borders, icons) and components\n\n### Palette Compliance\n\n**Text on cream backgrounds:**\n- `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓\n- `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓\n- `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum)\n\n**Text on neutral/900 backgrounds (active state):**\n- `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓\n\n**Icons on backgrounds:**\n- `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓\n- `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓\n\n**Alert/status colour (orange, TBD):**\n- Requires testing once final hex value is provided\n- Minimum 3:1 on white and cream backgrounds\n\n### Testing\n\n**Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse\n\n**Checklist:**\n- [ ] All body text meets 4.5:1 contrast minimum\n- [ ] All headings meet 3:1 contrast minimum\n- [ ] All icons meet 3:1 contrast minimum\n- [ ] Active/selected states are visually distinct from inactive states\n- [ ] Links are underlined or otherwise distinct from body text\n- [ ] Colour alone is not used to convey information (pair with shape, text, or pattern)\n\n---\n\n## Typography\n\n### Readability\n\n**Font choice:**\n- PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing\n- Augur uses monospace intentionally for data density and professional appearance\n\n**Line length:**\n- **Optimal:** 50–70 characters per line\n- **Minimum:** 40 characters (in narrow panels)\n- **Maximum:** 100 characters (avoid in body text)\n- Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓\n\n**Line spacing:**\n- `type/body`: 24px line-height (1.5× base size) ✓\n- `type/h3`: 36px line-height (1.29× base size) ✓\n- Sufficient for readability and dyslexia-friendly rendering\n\n**Font size:**\n- Minimum 16px for body text ✓\n- Headings scale appropriately (24px–48px)\n- Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette\n\n**Weight:**\n- Bold used for headings and emphasis (not for extended body text)\n- Regular weight for standard copy (readability optimized)\n- Light weight used sparingly (metadata, secondary text)\n\n### Testing\n\n**Checklist:**\n- [ ] No text smaller than 14px for body content\n- [ ] Line-height at least 1.5× font size\n- [ ] Line length between 40–100 characters\n- [ ] Adequate white space between text blocks\n- [ ] Headings use semantic hierarchy (no skipped levels)\n\n---\n\n## Keyboard Navigation\n\n### Focus Management\n\n**Requirement:** All interactive elements must be accessible via keyboard.\n\n**Focus order:**\n- Top-to-bottom, left-to-right reading order\n- Tab moves forward, Shift+Tab moves backward\n- When a modal/panel opens, focus moves to the first focusable element\n- When a modal/panel closes, focus returns to the triggering element\n- Focus trap in modals (Tab from last element wraps to first)\n\n**Focus indicator:**\n- 2px solid outline in `colour/focus-ring` (neutral/800, #494541)\n- 2px offset from element edge\n- Visible at all times (not removed on focus, only on blur)\n- High contrast (minimum 3:1) against background\n\n### Keyboard Shortcuts\n\n**Global:**\n- Tab: Move to next focusable element\n- Shift+Tab: Move to previous focusable element\n- Escape: Close open modal, dropdown, or panel\n\n**Within dropdowns/pickers:**\n- Arrow Up/Down: Navigate items\n- Arrow Left/Right: Navigate tabs or columns\n- Enter: Select item\n- Escape: Close without selecting\n\n**Within panels:**\n- Enter: Activate button or link\n- Space: Toggle checkbox (if applicable)\n\n**Browser conventions:**\n- Alt+Left Arrow: Back (browser/application back)\n- Alt+Right Arrow: Forward\n- F5: Refresh (standard; not overridden)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons and links are reachable via Tab\n- [ ] Focus order follows visual reading order\n- [ ] Focus indicator is always visible and high-contrast\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers and lists\n- [ ] No keyboard traps (user can Tab away from any element)\n- [ ] No content is keyboard-only or mouse-only\n\n---\n\n## Screen Reader Support\n\n### Semantic HTML\n\n**Requirement:** Use semantic HTML to convey structure and meaning to assistive technology.\n\n**Tags:**\n- `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels)\n- `<button>`: Interactive buttons\n- `<a>`: Links (with descriptive text, not \"click here\")\n- `<ul>`, `<ol>`, `<li>`: Lists\n- `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables\n- `<label>`: Form label (associated via `for` or nesting)\n- `<nav>`: Navigation region\n- `<main>`: Main content area\n- `<aside>`: Sidebar or supplementary content\n- `<article>`: Self-contained content block\n\n### ARIA Attributes\n\n**Requirement:** Use ARIA only to supplement semantic HTML, not replace it.\n\n**Landmarks:**\n- `role=\"banner\"`: Top bar / header\n- `role=\"main\"`: Primary content area\n- `role=\"navigation\"`: Navigation menu\n- `role=\"contentinfo\"`: Footer\n\n**Buttons & links:**\n- `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\")\n- `aria-pressed`: For toggle buttons (true/false state)\n- `aria-expanded`: For expandable/collapsible sections (true/false)\n\n**Lists:**\n- `aria-label`: For unlabeled lists (e.g. \"Related actions\")\n- `role=\"listbox\"`: For selectable item lists (dropdowns, pickers)\n- `aria-selected`: For selected items in a listbox\n\n**Live regions:**\n- `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\")\n- `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\")\n- `aria-atomic=\"true\"`: Announce entire region, not just changes\n- `role=\"alert\"`: For error messages or warnings\n\n**Images:**\n- `alt`: Descriptive text for images (mandatory for all `<img>` elements)\n- Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type)\n- Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>`\n\n**Form inputs:**\n- `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>`\n- `aria-label` if visible label not possible\n- `aria-describedby` for help text or error messages\n\n**Data tables:**\n- `<table>` with semantic structure\n- `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`)\n- `<td>` for data cells\n- Avoid merged cells; if necessary, use `colspan`/`rowspan` with care\n\n### Screen Reader Testing\n\n**Tools:**\n- NVDA (Windows, free)\n- JAWS (Windows, paid)\n- VoiceOver (macOS/iOS, built-in)\n- TalkBack (Android, built-in)\n\n**Checklist:**\n- [ ] Panel headers and titles are announced correctly\n- [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\")\n- [ ] Links include descriptive text (not just \"arrow\" or \"more\")\n- [ ] Buttons include labels and states (not just icons)\n- [ ] Tables are announced with headers and structure\n- [ ] Error messages are announced immediately\n- [ ] Status updates are announced live (via aria-live)\n- [ ] Images have appropriate alt text\n\n---\n\n## Motion & Animation\n\n### Vestibular & Photosensitivity\n\n**Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity.\n\n**Guidelines:**\n- No animations that move at more than 3 full revolutions per second\n- No flashing or flickering (no more than 3 flashes per second in a 1-second window)\n- No large moving areas that fill >25% of the viewport\n- Animation should be kept under 500ms for most interactions\n\n### Prefers Reduced Motion\n\n**Requirement:** Respect the `prefers-reduced-motion` media query.\n\n**Implementation:**\n```css\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n  }\n}\n```\n\n**Checklist:**\n- [ ] Panel transitions respect `prefers-reduced-motion`\n- [ ] Hover animations are minimal (no parallax or large movements)\n- [ ] Loading states don't use spinning or flashing\n- [ ] No auto-playing videos or audio\n\n---\n\n## Touch & Mobile\n\n### Touch Target Size\n\n**Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements).\n\n**Augur components:**\n- Icon button: 40×40px (meets requirement with padding)\n- List item: 44px height minimum\n- Dropdown: 40px height + `space/4` padding vertical (meets requirement)\n- Text button: 40px height minimum\n\n**Spacing:**\n- Between touch targets: At least 8px (preferably 12px)\n- Avoid small, closely-spaced buttons\n\n### Gesture Support\n\n**Requirement:** Don't rely on complex gestures; provide alternative inputs.\n\n**Supported gestures:**\n- Tap: Standard button/link activation\n- Long-press: Optional (secondary action, always has keyboard alternative)\n- Swipe: Optional (dismiss panels on mobile, always has close button)\n- Pinch: Optional (zoom; always has +/- buttons)\n\n**Mobile-specific:**\n- On narrow viewports, panels overlay canvas instead of docking\n- Swipe panels right to dismiss (alternative: close X button)\n- Landscape orientation supported (panels still dock right if space allows)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons are at least 44×44px\n- [ ] Touch targets have at least 8px spacing\n- [ ] No reliance on hover states (buttons work via tap)\n- [ ] Landscape and portrait orientations both work\n- [ ] Swipe and pinch have keyboard alternatives\n\n---\n\n## Testing Checklist\n\n### Automated Testing\n\n**Tools:**\n- Lighthouse (Chrome DevTools)\n- axe DevTools (browser extension)\n- WAVE (WebAIM extension)\n\n**Run for:**\n- [ ] Colour contrast (all text, icons, borders)\n- [ ] Missing alt text\n- [ ] Missing form labels\n- [ ] Missing heading hierarchy\n- [ ] Keyboard traps\n- [ ] Focus management\n- [ ] ARIA usage errors\n\n### Manual Testing\n\n**Keyboard:**\n- [ ] Tab through entire page, confirm logical order\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers\n- [ ] Focus indicator always visible\n- [ ] No keyboard traps\n\n**Screen reader (NVDA or VoiceOver):**\n- [ ] Headings announce correctly\n- [ ] List items announce with count\n- [ ] Links have descriptive text\n- [ ] Buttons include labels and states\n- [ ] Errors announce immediately\n- [ ] Live regions update correctly\n\n**Visual:**\n- [ ] Text is at least 14px\n- [ ] Line-height is at least 1.5×\n- [ ] Line length is 40–100 characters\n- [ ] Headings use semantic hierarchy\n- [ ] Colour contrast meets WCAG AA\n- [ ] Focus indicator is always visible\n- [ ] No information conveyed by colour alone\n\n**Mobile:**\n- [ ] Touch targets are 44×44px\n- [ ] Landscape and portrait work\n- [ ] Swipe/pinch have alternatives\n\n### Browser Compatibility\n\n**Test on:**\n- Chrome (latest)\n- Firefox (latest)\n- Safari (latest)\n- Edge (latest)\n- Mobile browsers (Safari iOS, Chrome Android)\n\n### Assistive Technology\n\n**Test with:**\n- NVDA (free, Windows)\n- JAWS (paid, Windows)\n- VoiceOver (built-in, macOS/iOS)\n- TalkBack (built-in, Android)\n\n---\n\n## Remediation\n\nIf an accessibility issue is found:\n\n1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor)\n2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog\n3. **Fix:** Implement semantic HTML, ARIA, or CSS changes\n4. **Retest:** Confirm fix with automated tool and manual testing\n5. **Verify:** Test fix on multiple screen readers and browsers\n\n---\n\n## Resources\n\n- **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/\n- **WebAIM:** https://webaim.org/\n- **A11y Project:** https://www.a11yproject.com/\n- **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/\n- **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/\n\n---\n\n## Compliance Statement\n\nAugur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline.\n\n**Last audit:** [Date]  \n**Next audit:** [Date + 3 months]  \n**Issues:** [Link to issue tracker]\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2716":{"type":"FRAME","id":"34:2716","name":"Product definition","absoluteBoundingBox":{"x":52256.0,"y":443.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":443.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,108.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3319},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/product-definition"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2717"]},"78:20335":{"type":"FRAME","id":"78:20335","name":"2","absoluteBoundingBox":{"x":50920.0,"y":5884.0,"width":1200.0,"height":8032.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":5884.0,"width":1200.0,"height":8032.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,5744.0]],"size":{"x":1200.0,"y":8032.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["78:20336","78:20337"]},"34:2672":{"type":"FRAME","id":"34:2672","name":"screens","absoluteBoundingBox":{"x":48376.0,"y":100.0,"width":2144.0,"height":53696.0},"isolatedAbsoluteRenderBounds":{"x":48376.0,"y":100.0,"width":2144.0,"height":53696.0},"relativeTransform":[[1.0,0.0,312.0],[0.0,1.0,0.0]],"size":{"x":2144.0,"y":53696.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":56.0,"paddingRight":56.0,"paddingBottom":56.0,"paddingLeft":56.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["34:2673"]},"41:3536":{"type":"TEXT","id":"41:3536","name":"DESIGN.MD","absoluteBoundingBox":{"x":50940.0,"y":196.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50945.375,"y":221.520004272461,"width":349.30859375,"height":45.4399871826172},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DESIGN.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20337":{"type":"TEXT","id":"78:20337","name":"# Augur Design Tokens ## Token Structure Tokens follow a three-layer architecture: 1. **Primitive:** Raw colour values, named by hue and lightness stop 2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`) 3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens) --- ## Primitives ### Colour/Cream ``` colour/cream/50: #FCFBF7 colour/cream/100: #FAF6F0 colour/cream/200: #F7F2E8 colour/cream/300: #F4EEE0 colour/cream/400: #F1E9D9 colour/cream/500: #EFE5D1 colour/cream/600: #ECE1C9 colour/cream/700: #E9DCC2 colour/cream/800: #E7D8BA colour/cream/900: #D9C5A0 ``` ### Colour/Neutral ``` colour/neutral/0: #FFFFFF colour/neutral/50: #F9F5F1 colour/neutral/100: #E9E5E1 colour/neutral/200: #D9D5D1 colour/neutral/300: #C9C5C1 colour/neutral/400: #B9B5B1 colour/neutral/500: #A9A5A1 colour/neutral/600: #999591 colour/neutral/700: #898581 colour/neutral/800: #494541 colour/neutral/900: #292521 colour/neutral/1000: #000000 ``` ### Colour/Status (TBD) ``` colour/status/alert: #FF6B35 (orange, for notifications — confirm value) ``` --- ## Semantic Tokens ### Background ``` colour/bg/primary: colour/cream/500 (#EFE5D1) colour/bg/secondary: colour/cream/100 (#FAF6F0) colour/bg/tertiary: colour/cream/200 (#F7F2E8) colour/bg/canvas: colour/neutral/0 (#FFFFFF) colour/bg/overlay-dark: colour/neutral/1000 with 24% opacity ``` ### Text ``` colour/text/primary: colour/neutral/600 (#999591) colour/text/secondary: colour/neutral/500 (#A9A5A1) colour/text/tertiary: colour/neutral/400 (#B9B5B1) colour/text/inverse: colour/neutral/0 (#FFFFFF) colour/text/disabled: colour/neutral/200 (#D9D5D1) ``` ### Border ``` colour/border/light: colour/neutral/100 (#E9E5E1) colour/border/medium: colour/neutral/200 (#D9D5D1) colour/border/strong: colour/neutral/600 (#999591) colour/border/focus: colour/neutral/800 (#494541) ``` ### Icon ``` colour/icon/primary: colour/neutral/800 (#494541) colour/icon/secondary: colour/neutral/600 (#999591) colour/icon/disabled: colour/neutral/200 (#D9D5D1) colour/icon/inverse: colour/neutral/0 (#FFFFFF) ``` ### Status & Interaction ``` colour/active: colour/neutral/900 (#292521) colour/hover: colour/cream/400 (#F1E9D9) colour/focus-ring: colour/neutral/800 (#494541) colour/alert: colour/status/alert (#FF6B35) colour/success: (TBD) colour/warning: (TBD) colour/info: (TBD) ``` --- ## Typography Tokens ### Font Family ``` type/family: PP Grotesk Mono type/family/fallback: monospace ``` ### Font Sizes & Line Heights ``` type/display/size: 48px type/display/lineheight: 56px type/display/weight: bold type/h1/size: 40px type/h1/lineheight: 48px type/h1/weight: bold type/h2/size: 32px type/h2/lineheight: 40px type/h2/weight: bold type/h3/size: 28px type/h3/lineheight: 36px type/h3/weight: bold type/h4/size: 24px type/h4/lineheight: 32px type/h4/weight: bold type/body-large/size: 20px type/body-large/lineheight: 28px type/body-large/weight: regular type/body/size: 16px type/body/lineheight: 24px type/body/weight: regular type/caption/size: 12px (deprecated — use type/body with neutral/400) type/caption/lineheight: 16px type/caption/weight: light ``` ### Weight Tokens ``` type/weight/light: 300 type/weight/regular: 400 type/weight/bold: 700 ``` --- ## Spacing Tokens ``` space/1: 4px space/2: 8px space/3: 12px space/4: 16px space/5: 20px space/6: 24px space/7: 32px space/8: 40px space/9: 48px space/10: 64px ``` --- ## Elevation Tokens ``` shadow/small: 0px 4px 8px rgba(0, 0, 0, 0.24) ``` --- ## Radius Tokens ``` radius/none: 0px ``` --- ## Component-Specific Tokens ### Buttons #### Icon Button ``` button/icon/size: 40px × 40px button/icon/background: colour/bg/primary button/icon/background-hover: colour/hover button/icon/icon-colour: colour/icon/primary button/icon/padding: 0 (square) button/icon/radius: radius/none ``` #### Text Button / Link ``` button/text/font: type/body button/text/colour: colour/text/primary button/text/colour-hover: colour/text/primary (underline or bg hint) button/text/background: colour/bg/primary ``` ### Inputs #### Dropdown ``` input/dropdown/height: 40px input/dropdown/padding: space/4 (horizontal) input/dropdown/font: type/body input/dropdown/background: colour/bg/primary input/dropdown/border: colour/border/medium input/dropdown/text-colour: colour/text/primary input/dropdown/icon-colour: colour/icon/primary input/dropdown/radius: radius/none ``` #### Calendar / Date Picker ``` input/calendar/cell-size: 40px (minimum) input/calendar/cell-padding: space/2 input/calendar/active-bg: colour/active input/calendar/active-text: colour/text/inverse input/calendar/inactive-bg: colour/bg/primary input/calendar/inactive-text: colour/text/primary input/calendar/font: type/body input/calendar/header-font: type/h4 ``` #### Location Picker ``` input/location/item-height: 44px (minimum touch target) input/location/item-padding: space/4 input/location/font: type/body input/location/background: colour/bg/primary input/location/text-colour: colour/text/primary input/location/arrow-colour: colour/icon/secondary ``` ### Panels #### Panel Header ``` panel/header/background: colour/bg/tertiary panel/header/height: 48px (minimum) panel/header/padding: space/4 panel/header/font: type/h4 or type/body panel/header/text-colour: colour/text/primary panel/header/border: colour/border/light (bottom) panel/header/icon-colour: colour/icon/primary panel/header/close-size: 24px ``` #### Panel Body ``` panel/body/background: colour/bg/primary panel/body/padding: space/6 panel/body/font: type/body panel/body/text-colour: colour/text/primary panel/body/shadow: shadow/small ``` #### List Item ``` list/item/height: 44px (minimum) list/item/padding: space/4 list/item/font: type/body list/item/background: colour/bg/primary list/item/background-hover: colour/hover list/item/text-colour: colour/text/primary list/item/border: colour/border/light (bottom) list/item/arrow-colour: colour/icon/secondary list/item/radius: radius/none ``` ### Indicators #### Notification Dot ``` indicator/dot/size: 8px indicator/dot/background: colour/alert indicator/dot/position: top-right (absolute, -2px offset) ``` #### Badge ``` indicator/badge/min-width: 28px indicator/badge/height: 28px indicator/badge/padding: space/2 (horizontal) indicator/badge/font: type/body indicator/badge/font-weight: bold indicator/badge/background: colour/active indicator/badge/text-colour: colour/text/inverse indicator/badge/radius: radius/none ``` --- ## Component-Agnostic Usage For any component not explicitly listed above: 1. Use `colour/bg/primary` for primary backgrounds 2. Use `colour/text/primary` for primary text 3. Use `colour/border/medium` for borders 4. Use `space/4` for standard padding, `space/6` for generous padding 5. Use `shadow/small` for elevated surfaces 6. Use `radius/none` for all corners 7. Use `type/body` for standard UI copy, `type/h4` for section headers 8. Apply `colour/active` (neutral/900) for selected/active states 9. Respect minimum touch target size of 44×44px for interactive elements","absoluteBoundingBox":{"x":50940.0,"y":6060.0,"width":1160.0,"height":7800.0},"isolatedAbsoluteRenderBounds":{"x":50938.16015625,"y":6065.65576171875,"width":1102.125,"height":7766.46435546875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":7800.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design Tokens\n\n## Token Structure\n\nTokens follow a three-layer architecture:\n1. **Primitive:** Raw colour values, named by hue and lightness stop\n2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`)\n3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens)\n\n---\n\n## Primitives\n\n### Colour/Cream\n\n```\ncolour/cream/50:    #FCFBF7\ncolour/cream/100:   #FAF6F0\ncolour/cream/200:   #F7F2E8\ncolour/cream/300:   #F4EEE0\ncolour/cream/400:   #F1E9D9\ncolour/cream/500:   #EFE5D1\ncolour/cream/600:   #ECE1C9\ncolour/cream/700:   #E9DCC2\ncolour/cream/800:   #E7D8BA\ncolour/cream/900:   #D9C5A0\n```\n\n### Colour/Neutral\n\n```\ncolour/neutral/0:     #FFFFFF\ncolour/neutral/50:    #F9F5F1\ncolour/neutral/100:   #E9E5E1\ncolour/neutral/200:   #D9D5D1\ncolour/neutral/300:   #C9C5C1\ncolour/neutral/400:   #B9B5B1\ncolour/neutral/500:   #A9A5A1\ncolour/neutral/600:   #999591\ncolour/neutral/700:   #898581\ncolour/neutral/800:   #494541\ncolour/neutral/900:   #292521\ncolour/neutral/1000:  #000000\n```\n\n### Colour/Status (TBD)\n\n```\ncolour/status/alert:  #FF6B35  (orange, for notifications — confirm value)\n```\n\n---\n\n## Semantic Tokens\n\n### Background\n\n```\ncolour/bg/primary:        colour/cream/500   (#EFE5D1)\ncolour/bg/secondary:      colour/cream/100   (#FAF6F0)\ncolour/bg/tertiary:       colour/cream/200   (#F7F2E8)\ncolour/bg/canvas:         colour/neutral/0   (#FFFFFF)\ncolour/bg/overlay-dark:   colour/neutral/1000 with 24% opacity\n```\n\n### Text\n\n```\ncolour/text/primary:      colour/neutral/600  (#999591)\ncolour/text/secondary:    colour/neutral/500  (#A9A5A1)\ncolour/text/tertiary:     colour/neutral/400  (#B9B5B1)\ncolour/text/inverse:      colour/neutral/0    (#FFFFFF)\ncolour/text/disabled:     colour/neutral/200  (#D9D5D1)\n```\n\n### Border\n\n```\ncolour/border/light:      colour/neutral/100  (#E9E5E1)\ncolour/border/medium:     colour/neutral/200  (#D9D5D1)\ncolour/border/strong:     colour/neutral/600  (#999591)\ncolour/border/focus:      colour/neutral/800  (#494541)\n```\n\n### Icon\n\n```\ncolour/icon/primary:      colour/neutral/800  (#494541)\ncolour/icon/secondary:    colour/neutral/600  (#999591)\ncolour/icon/disabled:     colour/neutral/200  (#D9D5D1)\ncolour/icon/inverse:      colour/neutral/0    (#FFFFFF)\n```\n\n### Status & Interaction\n\n```\ncolour/active:            colour/neutral/900  (#292521)\ncolour/hover:             colour/cream/400    (#F1E9D9)\ncolour/focus-ring:        colour/neutral/800  (#494541)\ncolour/alert:             colour/status/alert (#FF6B35)\ncolour/success:           (TBD)\ncolour/warning:           (TBD)\ncolour/info:              (TBD)\n```\n\n---\n\n## Typography Tokens\n\n### Font Family\n```\ntype/family:             PP Grotesk Mono\ntype/family/fallback:    monospace\n```\n\n### Font Sizes & Line Heights\n\n```\ntype/display/size:       48px\ntype/display/lineheight: 56px\ntype/display/weight:     bold\n\ntype/h1/size:            40px\ntype/h1/lineheight:      48px\ntype/h1/weight:          bold\n\ntype/h2/size:            32px\ntype/h2/lineheight:      40px\ntype/h2/weight:          bold\n\ntype/h3/size:            28px\ntype/h3/lineheight:      36px\ntype/h3/weight:          bold\n\ntype/h4/size:            24px\ntype/h4/lineheight:      32px\ntype/h4/weight:          bold\n\ntype/body-large/size:    20px\ntype/body-large/lineheight: 28px\ntype/body-large/weight:  regular\n\ntype/body/size:          16px\ntype/body/lineheight:    24px\ntype/body/weight:        regular\n\ntype/caption/size:       12px (deprecated — use type/body with neutral/400)\ntype/caption/lineheight: 16px\ntype/caption/weight:     light\n```\n\n### Weight Tokens\n\n```\ntype/weight/light:       300\ntype/weight/regular:     400\ntype/weight/bold:        700\n```\n\n---\n\n## Spacing Tokens\n\n```\nspace/1:   4px\nspace/2:   8px\nspace/3:   12px\nspace/4:   16px\nspace/5:   20px\nspace/6:   24px\nspace/7:   32px\nspace/8:   40px\nspace/9:   48px\nspace/10:  64px\n```\n\n---\n\n## Elevation Tokens\n\n```\nshadow/small:  0px 4px 8px rgba(0, 0, 0, 0.24)\n```\n\n---\n\n## Radius Tokens\n\n```\nradius/none:  0px\n```\n\n---\n\n## Component-Specific Tokens\n\n### Buttons\n\n#### Icon Button\n```\nbutton/icon/size:           40px × 40px\nbutton/icon/background:     colour/bg/primary\nbutton/icon/background-hover: colour/hover\nbutton/icon/icon-colour:    colour/icon/primary\nbutton/icon/padding:        0 (square)\nbutton/icon/radius:         radius/none\n```\n\n#### Text Button / Link\n```\nbutton/text/font:           type/body\nbutton/text/colour:         colour/text/primary\nbutton/text/colour-hover:   colour/text/primary (underline or bg hint)\nbutton/text/background:     colour/bg/primary\n```\n\n### Inputs\n\n#### Dropdown\n```\ninput/dropdown/height:      40px\ninput/dropdown/padding:     space/4 (horizontal)\ninput/dropdown/font:        type/body\ninput/dropdown/background:  colour/bg/primary\ninput/dropdown/border:      colour/border/medium\ninput/dropdown/text-colour: colour/text/primary\ninput/dropdown/icon-colour: colour/icon/primary\ninput/dropdown/radius:      radius/none\n```\n\n#### Calendar / Date Picker\n```\ninput/calendar/cell-size:       40px (minimum)\ninput/calendar/cell-padding:    space/2\ninput/calendar/active-bg:       colour/active\ninput/calendar/active-text:     colour/text/inverse\ninput/calendar/inactive-bg:     colour/bg/primary\ninput/calendar/inactive-text:   colour/text/primary\ninput/calendar/font:            type/body\ninput/calendar/header-font:     type/h4\n```\n\n#### Location Picker\n```\ninput/location/item-height:     44px (minimum touch target)\ninput/location/item-padding:    space/4\ninput/location/font:            type/body\ninput/location/background:      colour/bg/primary\ninput/location/text-colour:     colour/text/primary\ninput/location/arrow-colour:    colour/icon/secondary\n```\n\n### Panels\n\n#### Panel Header\n```\npanel/header/background:   colour/bg/tertiary\npanel/header/height:       48px (minimum)\npanel/header/padding:      space/4\npanel/header/font:         type/h4 or type/body\npanel/header/text-colour:  colour/text/primary\npanel/header/border:       colour/border/light (bottom)\npanel/header/icon-colour:  colour/icon/primary\npanel/header/close-size:   24px\n```\n\n#### Panel Body\n```\npanel/body/background:     colour/bg/primary\npanel/body/padding:        space/6\npanel/body/font:           type/body\npanel/body/text-colour:    colour/text/primary\npanel/body/shadow:         shadow/small\n```\n\n#### List Item\n```\nlist/item/height:          44px (minimum)\nlist/item/padding:         space/4\nlist/item/font:            type/body\nlist/item/background:      colour/bg/primary\nlist/item/background-hover: colour/hover\nlist/item/text-colour:     colour/text/primary\nlist/item/border:          colour/border/light (bottom)\nlist/item/arrow-colour:    colour/icon/secondary\nlist/item/radius:          radius/none\n```\n\n### Indicators\n\n#### Notification Dot\n```\nindicator/dot/size:        8px\nindicator/dot/background:  colour/alert\nindicator/dot/position:    top-right (absolute, -2px offset)\n```\n\n#### Badge\n```\nindicator/badge/min-width: 28px\nindicator/badge/height:    28px\nindicator/badge/padding:   space/2 (horizontal)\nindicator/badge/font:      type/body\nindicator/badge/font-weight: bold\nindicator/badge/background: colour/active\nindicator/badge/text-colour: colour/text/inverse\nindicator/badge/radius:    radius/none\n```\n\n---\n\n## Component-Agnostic Usage\n\nFor any component not explicitly listed above:\n1. Use `colour/bg/primary` for primary backgrounds\n2. Use `colour/text/primary` for primary text\n3. Use `colour/border/medium` for borders\n4. Use `space/4` for standard padding, `space/6` for generous padding\n5. Use `shadow/small` for elevated surfaces\n6. Use `radius/none` for all corners\n7. Use `type/body` for standard UI copy, `type/h4` for section headers\n8. Apply `colour/active` (neutral/900) for selected/active states\n9. Respect minimum touch target size of 44×44px for interactive elements\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2689":{"type":"TEXT","id":"34:2689","name":"Design system","absoluteBoundingBox":{"x":50628.0,"y":415.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50629.34375,"y":421.588043212891,"width":126.59765625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Design system","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2677":{"type":"FRAME","id":"34:2677","name":"left","absoluteBoundingBox":{"x":50584.0,"y":100.0,"width":296.0,"height":523.932006835938},"isolatedAbsoluteRenderBounds":{"x":50584.0,"y":100.0,"width":296.0,"height":523.932006835938},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":296.0,"y":523.932006835938},"fills":[],"strokeAlign":"INSIDE","scrollBehavior":"STICKY_SCROLLS","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":40.0,"paddingBottom":40.0,"paddingLeft":40.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2678","63:17403","34:2683"]},"78:20384":{"type":"TEXT","id":"78:20384","name":"# Augur Patterns ## Overview Patterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens. --- ## Layout Patterns ### Panel-Based Spatial Layout **Structure:** Main canvas (left/centre) + draggable side panels (right) **Anatomy:** - **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width - **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small` - **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions - **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset) - **Timeline scrubber:** Bottom of viewport, spanning full width **Responsive behaviour:** - On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss - On desktop (>768px): panels dock on right, canvas shrinks to accommodate **Use case:** Dashboard, map view, live monitoring --- ### Detail Drill-Down **Structure:** List panel → Detail panel → Related panels **Flow:** 1. User clicks list item (e.g. \"Potential theft\" in Events) 2. Selected event panel opens (or detail drawer slides in) 3. Detail panel shows full information + related action links (Cameras, People, Timeline) 4. User clicks action link to open related panel 5. Back arrow returns to selected event detail **Panel stacking:** - Primary panel: Selected event - Secondary panel: Related person, timeline, or camera - Tertiary panel: If user drills deeper (e.g. timeline → specific incident) **Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel --- ### Modal Pickers (Date, Location) **Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation **Flow:** 1. User clicks \"When\" or \"Where\" dropdown in top bar 2. Picker modal slides up from bottom or appears inline 3. User navigates picker (tabs, lists, grid cells) 4. User selects option 5. Picker closes, filter updates, interface refreshes with new data **Keyboard support:** - Arrow keys to navigate picker items - Enter to select - Escape to close without selecting **Visual feedback:** - Selected item highlighted in dark (`colour/active`) - Current selection persists until changed --- ## Interaction Patterns ### Selection & Highlighting **Primary flow:** 1. User sees list of items (events, people, data points) 2. User clicks item to select 3. Item highlights with background `colour/hover` 4. Related detail panel opens or updates **Visual states:** - **Default:** `colour/bg/primary` background, `colour/text/primary` text - **Hover:** `colour/hover` background (cream/400), text unchanged - **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text **Keyboard support:** - Arrow keys to navigate list - Enter to select - Space to select (optional) --- ### Navigation via Back/Close **Pattern:** Panels always include back arrow (navigation) and close X (dismiss) **Back arrow:** - Returns to previous state or parent panel - Preserves scroll position (if applicable) - Visible only if there's a previous state to return to **Close X:** - Dismisses current panel - Returns to base view (e.g. map with no detail panels) - Always visible in panel header **Keyboard support:** - Escape key acts as close X (dismisses panel) - Alt+Left arrow acts as back button --- ### Status Indicators & Urgency **Alert dot (orange):** - Small 8px circle, top-right of avatar or button - Indicates urgent status (unreviewed, flagged, etc.) - Colour: `colour/alert` (#FF6B35, TBD — confirm value) **Notification list:** - \"Just now\" badges for recent alerts - Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp - Orange dot next to most recent items - Read/unread states (optional; not visible in current design) **Capacity badge:** - Circular dark badge (neutral/900) with white percentage text - Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\" **Ratio badge:** - Circular dark badge with split label, e.g. \"M:32 F:68\" - Indicates demographic breakdown or ratio metric **Temporal indicator:** - \"LIVE\" badge in calendar/date picker (active period tab) - Indicates real-time data stream --- ### Data Presentation **List-based:** - Categorical lists (Customer, Sales, Operational data) - Each list item is a link/button to drill-down - Section headers (`type/h4`) group related items **Card-based:** - Event card: image + avatar + title + metadata + description + related actions - Person card: avatar + name + metadata + related actions - Data card: chart + metadata **Chart-based:** - Bar charts with grey bars, axis labels - No chart title on the chart itself; title lives in panel header - Legend optional (axis labels sufficient for simple charts) **Table-based:** - Column headers in `type/h4` (bold monospace) - Rows in `type/body` (regular monospace) - No alternating row colours (density over visual variety) - Minimal borders; dividers use `colour/border/light` --- ## Visual Hierarchy ### Typographic **Dominance order (largest → smallest):** 1. `type/display` (48px) — Page title, hero heading (rarely used in Augur) 2. `type/h1` (40px) — Major section heading 3. `type/h2` (32px) — Subsection heading 4. `type/h3` (28px) — Panel title, card heading 5. `type/h4` (24px) — Section header, label, secondary heading 6. `type/body-large` (20px) — Introductory text, large body 7. `type/body` (16px) — Standard UI copy, list items, descriptions 8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`) **Weight hierarchy:** - Bold: Headings, emphasis, CTAs - Regular: Body text, labels, most UI copy - Light: Secondary text, metadata (applied as weight override, not separate style) --- ### Colour **Dominance order:** 1. Cream backgrounds (`colour/cream`) dominate visual space 2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability 3. Dark active state (`colour/active`, neutral/900) indicates selection 4. Orange accent (`colour/alert`) draws attention to urgent items 5. White canvas provides separation between 3D view and UI **Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts. --- ## Spacing & Alignment ### Padding **Panel padding:** - Header: `space/4` (16px) on all sides - Body: `space/6` (24px) on all sides - List item: `space/4` (16px) horizontal, `space/2` (8px) vertical **Margins:** - Between sections within a panel: `space/6` (24px) - Between list items: None (border-based dividers) - Between action links: `space/4` (16px) ### Grid **Base unit:** 8px **Canvas width:** Variable (full minus panel width) **Panel width:** 320px fixed **Content width:** Full panel width minus padding **Align to 8px grid:** - Position: multiples of 8px - Size: multiples of 8px - Spacing: use `space/*` tokens (multiples of 4px or 8px) --- ## Motion (Future) **Tentative patterns (not currently specified):** - Panel slide-in/slide-out (250ms ease-out) - Dropdown fade-in (150ms ease-out) - Item hover scale (subtle, 1.02× scale) - Colour transitions (200ms ease-out for hover/active states) **Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation. --- ## Accessibility Patterns ### Focus Management **Pattern:** Focus should move logically through the interface. - Tab order follows visual/reading order (left-to-right, top-to-bottom) - When a panel opens, focus moves to the panel's first focusable element - When a panel closes, focus returns to the triggering element - Modals trap focus (Tab wraps to first element after last) **Visual focus indicator:** - 2px outline in `colour/focus-ring` (neutral/800) - 2px offset from element boundary - Applies to all buttons, links, form inputs, and interactive elements --- ### Screen Reader Announcements **Patterns:** - When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\") - When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\") - When an action completes: Announce result (e.g. \"Filter applied, 12 results\") **Implementation:** - Use `aria-live=\"polite\"` for non-critical updates - Use `aria-live=\"assertive\"` for urgent alerts - Use `role=\"alert\"` for error messages --- ### Semantic HTML **Patterns:** - Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels) - Buttons: Use `<button>` for actions; `<a>` for navigation - Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\") - Lists: Use `<ul>` / `<ol>` / `<li>` for list content - Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically - Forms: Use `<label>` associated with inputs via `for` attribute or nesting --- ## Performance Patterns ### Data Rendering **Principle:** Render visible data first; load additional data on scroll or on-demand. - Panel lists: Render first 20 items, lazy-load on scroll - Charts: Render at target width; no real-time updates for high-frequency data - 3D canvas: Render at 60fps; debounce pan/zoom interactions ### Caching - Filter selections (Where, When) cached in session storage - Panel scroll positions remembered during session - Charts cached until time range changes --- ## Error & Empty States ### Empty State **Pattern:** When no data matches filter or list is empty. **Display:** - Panel body shows centered, light grey message - Message: `type/body` in `colour/text/secondary` - Text: \"No [items] found\" or \"Check your filters\" - Optional icon above text (light grey, 48×48px) **Example:** \"No people found. Check your filters or adjust the time range.\" --- ### Error State **Pattern:** When an action fails or data cannot load. **Display:** - Panel body shows centered error message - Message: `type/body` in `colour/alert` (orange, once defined) - Heading: `type/h4` \"Error\" or specific error title - Optional retry button below message - Optional error code for support (small grey text below) **Example:** \"Error loading data. Status code: 500. Retry?\" **Keyboard support:** - Tab to retry button, Enter to retry - Escape to close error or return to previous state --- ## Responsive Breakpoints **Mobile (<768px):** - Panels overlay canvas at full width - Panels are swipeable/draggable to dismiss - Top bar condenses (logo smaller, icons only for filters) - Secondary nav wraps or becomes scrollable **Tablet (768px–1200px):** - Panels dock on right at 300px width - Canvas shrinks but remains visible - Secondary nav visible, single row **Desktop (>1200px):** - Panels dock on right at 320px width - Canvas full viewport minus panel width - All controls visible, horizontal layout preferred","absoluteBoundingBox":{"x":50940.0,"y":25780.0,"width":1160.0,"height":8616.0},"isolatedAbsoluteRenderBounds":{"x":50940.59375,"y":25786.119140625,"width":1121.70703125,"height":8581.599609375},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":8616.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Patterns\n\n## Overview\n\nPatterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens.\n\n---\n\n## Layout Patterns\n\n### Panel-Based Spatial Layout\n\n**Structure:** Main canvas (left/centre) + draggable side panels (right)\n\n**Anatomy:**\n- **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width\n- **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small`\n- **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions\n- **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset)\n- **Timeline scrubber:** Bottom of viewport, spanning full width\n\n**Responsive behaviour:**\n- On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss\n- On desktop (>768px): panels dock on right, canvas shrinks to accommodate\n\n**Use case:** Dashboard, map view, live monitoring\n\n---\n\n### Detail Drill-Down\n\n**Structure:** List panel → Detail panel → Related panels\n\n**Flow:**\n1. User clicks list item (e.g. \"Potential theft\" in Events)\n2. Selected event panel opens (or detail drawer slides in)\n3. Detail panel shows full information + related action links (Cameras, People, Timeline)\n4. User clicks action link to open related panel\n5. Back arrow returns to selected event detail\n\n**Panel stacking:**\n- Primary panel: Selected event\n- Secondary panel: Related person, timeline, or camera\n- Tertiary panel: If user drills deeper (e.g. timeline → specific incident)\n\n**Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel\n\n---\n\n### Modal Pickers (Date, Location)\n\n**Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation\n\n**Flow:**\n1. User clicks \"When\" or \"Where\" dropdown in top bar\n2. Picker modal slides up from bottom or appears inline\n3. User navigates picker (tabs, lists, grid cells)\n4. User selects option\n5. Picker closes, filter updates, interface refreshes with new data\n\n**Keyboard support:**\n- Arrow keys to navigate picker items\n- Enter to select\n- Escape to close without selecting\n\n**Visual feedback:**\n- Selected item highlighted in dark (`colour/active`)\n- Current selection persists until changed\n\n---\n\n## Interaction Patterns\n\n### Selection & Highlighting\n\n**Primary flow:**\n1. User sees list of items (events, people, data points)\n2. User clicks item to select\n3. Item highlights with background `colour/hover`\n4. Related detail panel opens or updates\n\n**Visual states:**\n- **Default:** `colour/bg/primary` background, `colour/text/primary` text\n- **Hover:** `colour/hover` background (cream/400), text unchanged\n- **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text\n\n**Keyboard support:**\n- Arrow keys to navigate list\n- Enter to select\n- Space to select (optional)\n\n---\n\n### Navigation via Back/Close\n\n**Pattern:** Panels always include back arrow (navigation) and close X (dismiss)\n\n**Back arrow:**\n- Returns to previous state or parent panel\n- Preserves scroll position (if applicable)\n- Visible only if there's a previous state to return to\n\n**Close X:**\n- Dismisses current panel\n- Returns to base view (e.g. map with no detail panels)\n- Always visible in panel header\n\n**Keyboard support:**\n- Escape key acts as close X (dismisses panel)\n- Alt+Left arrow acts as back button\n\n---\n\n### Status Indicators & Urgency\n\n**Alert dot (orange):**\n- Small 8px circle, top-right of avatar or button\n- Indicates urgent status (unreviewed, flagged, etc.)\n- Colour: `colour/alert` (#FF6B35, TBD — confirm value)\n\n**Notification list:**\n- \"Just now\" badges for recent alerts\n- Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp\n- Orange dot next to most recent items\n- Read/unread states (optional; not visible in current design)\n\n**Capacity badge:**\n- Circular dark badge (neutral/900) with white percentage text\n- Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\"\n\n**Ratio badge:**\n- Circular dark badge with split label, e.g. \"M:32 F:68\"\n- Indicates demographic breakdown or ratio metric\n\n**Temporal indicator:**\n- \"LIVE\" badge in calendar/date picker (active period tab)\n- Indicates real-time data stream\n\n---\n\n### Data Presentation\n\n**List-based:**\n- Categorical lists (Customer, Sales, Operational data)\n- Each list item is a link/button to drill-down\n- Section headers (`type/h4`) group related items\n\n**Card-based:**\n- Event card: image + avatar + title + metadata + description + related actions\n- Person card: avatar + name + metadata + related actions\n- Data card: chart + metadata\n\n**Chart-based:**\n- Bar charts with grey bars, axis labels\n- No chart title on the chart itself; title lives in panel header\n- Legend optional (axis labels sufficient for simple charts)\n\n**Table-based:**\n- Column headers in `type/h4` (bold monospace)\n- Rows in `type/body` (regular monospace)\n- No alternating row colours (density over visual variety)\n- Minimal borders; dividers use `colour/border/light`\n\n---\n\n## Visual Hierarchy\n\n### Typographic\n\n**Dominance order (largest → smallest):**\n1. `type/display` (48px) — Page title, hero heading (rarely used in Augur)\n2. `type/h1` (40px) — Major section heading\n3. `type/h2` (32px) — Subsection heading\n4. `type/h3` (28px) — Panel title, card heading\n5. `type/h4` (24px) — Section header, label, secondary heading\n6. `type/body-large` (20px) — Introductory text, large body\n7. `type/body` (16px) — Standard UI copy, list items, descriptions\n8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`)\n\n**Weight hierarchy:**\n- Bold: Headings, emphasis, CTAs\n- Regular: Body text, labels, most UI copy\n- Light: Secondary text, metadata (applied as weight override, not separate style)\n\n---\n\n### Colour\n\n**Dominance order:**\n1. Cream backgrounds (`colour/cream`) dominate visual space\n2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability\n3. Dark active state (`colour/active`, neutral/900) indicates selection\n4. Orange accent (`colour/alert`) draws attention to urgent items\n5. White canvas provides separation between 3D view and UI\n\n**Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts.\n\n---\n\n## Spacing & Alignment\n\n### Padding\n\n**Panel padding:**\n- Header: `space/4` (16px) on all sides\n- Body: `space/6` (24px) on all sides\n- List item: `space/4` (16px) horizontal, `space/2` (8px) vertical\n\n**Margins:**\n- Between sections within a panel: `space/6` (24px)\n- Between list items: None (border-based dividers)\n- Between action links: `space/4` (16px)\n\n### Grid\n\n**Base unit:** 8px  \n**Canvas width:** Variable (full minus panel width)  \n**Panel width:** 320px fixed  \n**Content width:** Full panel width minus padding\n\n**Align to 8px grid:**\n- Position: multiples of 8px\n- Size: multiples of 8px\n- Spacing: use `space/*` tokens (multiples of 4px or 8px)\n\n---\n\n## Motion (Future)\n\n**Tentative patterns (not currently specified):**\n- Panel slide-in/slide-out (250ms ease-out)\n- Dropdown fade-in (150ms ease-out)\n- Item hover scale (subtle, 1.02× scale)\n- Colour transitions (200ms ease-out for hover/active states)\n\n**Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation.\n\n---\n\n## Accessibility Patterns\n\n### Focus Management\n\n**Pattern:** Focus should move logically through the interface.\n\n- Tab order follows visual/reading order (left-to-right, top-to-bottom)\n- When a panel opens, focus moves to the panel's first focusable element\n- When a panel closes, focus returns to the triggering element\n- Modals trap focus (Tab wraps to first element after last)\n\n**Visual focus indicator:**\n- 2px outline in `colour/focus-ring` (neutral/800)\n- 2px offset from element boundary\n- Applies to all buttons, links, form inputs, and interactive elements\n\n---\n\n### Screen Reader Announcements\n\n**Patterns:**\n- When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\")\n- When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\")\n- When an action completes: Announce result (e.g. \"Filter applied, 12 results\")\n\n**Implementation:**\n- Use `aria-live=\"polite\"` for non-critical updates\n- Use `aria-live=\"assertive\"` for urgent alerts\n- Use `role=\"alert\"` for error messages\n\n---\n\n### Semantic HTML\n\n**Patterns:**\n- Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels)\n- Buttons: Use `<button>` for actions; `<a>` for navigation\n- Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\")\n- Lists: Use `<ul>` / `<ol>` / `<li>` for list content\n- Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically\n- Forms: Use `<label>` associated with inputs via `for` attribute or nesting\n\n---\n\n## Performance Patterns\n\n### Data Rendering\n\n**Principle:** Render visible data first; load additional data on scroll or on-demand.\n\n- Panel lists: Render first 20 items, lazy-load on scroll\n- Charts: Render at target width; no real-time updates for high-frequency data\n- 3D canvas: Render at 60fps; debounce pan/zoom interactions\n\n### Caching\n\n- Filter selections (Where, When) cached in session storage\n- Panel scroll positions remembered during session\n- Charts cached until time range changes\n\n---\n\n## Error & Empty States\n\n### Empty State\n\n**Pattern:** When no data matches filter or list is empty.\n\n**Display:**\n- Panel body shows centered, light grey message\n- Message: `type/body` in `colour/text/secondary`\n- Text: \"No [items] found\" or \"Check your filters\"\n- Optional icon above text (light grey, 48×48px)\n\n**Example:** \"No people found. Check your filters or adjust the time range.\"\n\n---\n\n### Error State\n\n**Pattern:** When an action fails or data cannot load.\n\n**Display:**\n- Panel body shows centered error message\n- Message: `type/body` in `colour/alert` (orange, once defined)\n- Heading: `type/h4` \"Error\" or specific error title\n- Optional retry button below message\n- Optional error code for support (small grey text below)\n\n**Example:** \"Error loading data. Status code: 500. Retry?\"\n\n**Keyboard support:**\n- Tab to retry button, Enter to retry\n- Escape to close error or return to previous state\n\n---\n\n## Responsive Breakpoints\n\n**Mobile (<768px):**\n- Panels overlay canvas at full width\n- Panels are swipeable/draggable to dismiss\n- Top bar condenses (logo smaller, icons only for filters)\n- Secondary nav wraps or becomes scrollable\n\n**Tablet (768px–1200px):**\n- Panels dock on right at 300px width\n- Canvas shrinks but remains visible\n- Secondary nav visible, single row\n\n**Desktop (>1200px):**\n- Panels dock on right at 320px width\n- Canvas full viewport minus panel width\n- All controls visible, horizontal layout preferred\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2696":{"type":"FRAME","id":"34:2696","name":"Agent preparation","absoluteBoundingBox":{"x":50624.0,"y":559.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":559.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":256.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2697"]},"34:2688":{"type":"FRAME","id":"34:2688","name":"Design sytem","absoluteBoundingBox":{"x":50624.0,"y":415.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":415.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3214},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1371},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/design-system"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2689"]},"34:2694":{"type":"FRAME","id":"34:2694","name":"Final outcome","absoluteBoundingBox":{"x":50624.0,"y":523.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":523.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3217},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2341},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/final-outcome"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2695"]},"34:2749":{"type":"TEXT","id":"34:2749","name":"Agent preparation","absoluteBoundingBox":{"x":53476.0,"y":543.932006835938,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53476.3515625,"y":549.588012695312,"width":166.65625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Agent preparation","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2695":{"type":"TEXT","id":"34:2695","name":"Final outcome","absoluteBoundingBox":{"x":50628.0,"y":523.932006835938,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50630.0,"y":529.588012695312,"width":125.65625,"height":11.5360107421875},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Final outcome","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20574":{"type":"FRAME","id":"78:20574","name":"6","absoluteBoundingBox":{"x":53768.0,"y":65796.0,"width":424.0,"height":14008.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":65796.0,"width":424.0,"height":14008.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,65672.0]],"size":{"x":424.0,"y":14008.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20575","78:20576"]},"34:2692":{"type":"FRAME","id":"34:2692","name":"Software design","absoluteBoundingBox":{"x":50624.0,"y":487.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":487.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3216},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2033},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/software-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2693"]},"34:2736":{"type":"FRAME","id":"34:2736","name":"Introduction","absoluteBoundingBox":{"x":53472.0,"y":327.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":327.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3322},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":781},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2737"]},"34:2657":{"type":"FRAME","id":"34:2657","name":"navigation","absoluteBoundingBox":{"x":48120.0,"y":359.932037353516,"width":256.0,"height":240.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":359.932037353516,"width":256.0,"height":240.0},"relativeTransform":[[1.0,0.0,56.0],[0.0,1.0,259.932037353516]],"size":{"x":256.0,"y":240.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":12.0,"counterAxisSizingMode":"FIXED","children":["34:2658","34:2660","34:2662","34:2664","34:2666","34:2668","34:2670"]},"34:2687":{"type":"TEXT","id":"34:2687","name":"Branding design","absoluteBoundingBox":{"x":50628.0,"y":379.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50629.48828125,"y":385.588043212891,"width":145.67578125,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Branding design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2693":{"type":"TEXT","id":"34:2693","name":"Software design","absoluteBoundingBox":{"x":50628.0,"y":487.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50628.78515625,"y":493.588043212891,"width":146.37890625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Software design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2735":{"type":"FRAME","id":"34:2735","name":"navigation","absoluteBoundingBox":{"x":53472.0,"y":327.932037353516,"width":256.0,"height":240.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":327.932037353516,"width":256.0,"height":240.0},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,227.932037353516]],"size":{"x":256.0,"y":240.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":12.0,"counterAxisSizingMode":"FIXED","children":["34:2736","34:2738","34:2740","34:2742","34:2744","34:2746","34:2748"]},"34:2704":{"type":"SVG","id":"34:2704","name":"back","absoluteBoundingBox":{"x":52256.0,"y":132.0,"width":40.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":132.0,"width":40.0,"height":40.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,32.0]],"size":{"x":40.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"BUTTON","isDecorativeImage":false,"accessibleLabel":"Back button","ariaAttributes":{},"interactions":[{"id":{"sessionID":53,"localID":3576},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://digfat.com","openUrlInNewTab":false}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7076106675d532f2b6805d1f81f6012207006322"},"34:2670":{"type":"FRAME","id":"34:2670","name":"Agent preparation","absoluteBoundingBox":{"x":48120.0,"y":575.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":575.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":256.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2671"]},"78:20336":{"type":"TEXT","id":"78:20336","name":"TOKENS.MD","absoluteBoundingBox":{"x":50940.0,"y":5940.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50942.87890625,"y":5965.52001953125,"width":351.8046875,"height":45.43994140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TOKENS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2700":{"type":"FRAME","id":"34:2700","name":"1","absoluteBoundingBox":{"x":50920.0,"y":140.0,"width":1200.0,"height":5704.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":140.0,"width":1200.0,"height":5704.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1200.0,"y":5704.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["41:3536","78:20328"]},"34:2690":{"type":"FRAME","id":"34:2690","name":"Product definition","absoluteBoundingBox":{"x":50624.0,"y":451.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":451.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,108.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3215},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/product-definition"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2691"]},"34:2691":{"type":"TEXT","id":"34:2691","name":"Product definition","absoluteBoundingBox":{"x":50628.0,"y":451.932037353516,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50629.6171875,"y":457.588043212891,"width":165.390625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Product definition","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2723":{"type":"TEXT","id":"34:2723","name":"Agent preparation","absoluteBoundingBox":{"x":52260.0,"y":551.932006835938,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52260.3515625,"y":557.588012695312,"width":166.65625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Agent preparation","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20410":{"type":"TEXT","id":"78:20410","name":"# Augur Personas — Index ## Overview Augur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone. --- ## Persona Comparison Matrix | Persona | Primary goal | Time pressure | Technical skill | Device | Key feature | |---|---|---|---|---|---| | **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail | | **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export | | **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends | | **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary | | **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile | | **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation | --- ## Design Decisions by Persona ### Information Architecture **Government & Law enforcement** prioritise: - Timeline and historical context (drill-down from event → details → related) - People and places (find person, then events, then timeline) - Export and integration (share findings, integrate with external tools) **Council planners & owners** prioritise: - Aggregated metrics and trends (summary first, detail optional) - Comparative analysis (year-over-year, location-to-location) - Export for reports and presentations **Retailers & security operators** prioritise: - Alerts and notifications (passive receipt of urgent information) - Mobile access (not always at desk) - Minimal friction (quick lookup, confirm, act) ### Interaction Patterns **Government & law enforcement:** - Keyboard shortcuts (fast users) - Saved filters and workspaces (reuse across shifts) - Bulk export and reporting **Council & owners:** - Prebuilt reports and dashboards - Comparative date/time pickers - Visual summaries before detail **Retailers & operators:** - Push notifications and alerts - One-click actions (confirm, share, log) - Minimal navigation depth ### Copy & Tone **Government & law enforcement:** - Direct and precise (authoritative, no softening) - Technical vocabulary acceptable (they know the jargon) - Procedural language (actionable instructions) **Council & owners:** - Clear and jargon-free (may not know public safety terminology) - Contextual explanation (what this metric means, why it matters) - Business-focused language **Retailers & operators:** - Urgent but calm (no alarmism, but clear on severity) - Action-oriented (what to do, not why) - Short, scannable copy --- ## Feature Prioritisation by Persona ### Must-have (all personas) - Search/filter by location and date range - Detail panel for persons and events - Photo/avatar visibility - Export to PDF/CSV ### High-value (government, law enforcement) - Save and name filters - Timeline view with granular timestamps - Related data drilling (event → people → timeline) - Audit logging - Full historical data access ### High-value (council, commercial owner) - Prebuilt report templates - Comparative date filters - Trend charts and visualisations - Email scheduling for reports ### High-value (retailers, security operators) - Real-time notifications and alerts - Mobile app with offline capability - Quick incident logging (forms with presets) - Location map with heatmap view - Integration with mobile devices (tablet, smartphone) --- ## Accessibility & Inclusion All personas should be able to use Augur with: - Keyboard navigation (for all, especially desktop-heavy users) - Screen reader support (government analysts using accessibility features) - Mobile responsiveness (operators in field) - Low-tech fallbacks (alert SMS if app unavailable) --- # Augur Persona — Government Analyst **Role:** MI5/MI6 intelligence analyst **Goal:** Find and monitor hostile foreign agents operating in the UK **Frequency:** Daily, shift-based (8–12 hour blocks) ### Profile - **Age:** 28–45 - **Technical skill:** High (comfortable with complex systems, data tools) - **Context:** Secure, government facility with dedicated workstations - **Devices:** Desktop/laptop only; no mobile access - **Time pressure:** High (real-time monitoring, time-sensitive intelligence) ### Needs - **Speed:** Locate persons of interest within seconds - **Precision:** Confirm identity with high confidence (facial recognition, metadata matching) - **Historical context:** Access to full timeline of sightings and related incidents - **Integration:** Cross-reference with external databases and intelligence feeds - **Audit trail:** Detailed logs for compliance and legal proceedings ### Pain points - Current systems are fragmented (multiple tools for tracking, mapping, reporting) - Slow handoffs between shifts lose critical context - Geographic and temporal filtering is tedious (manual entry, limited saved filters) - Cannot quickly correlate multiple sightings across locations ### How they use Augur 1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours) 2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals 3. **Investigation:** Drill into specific event; review timeline and related people; export data for report 4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical) ### Design implications - **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status) - **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks - **Export options:** CSV, PDF for reports and compliance - **Audit annotations:** Allow analysts to add notes to specific sightings for context ---  # Augur Persona — Law Enforcement Officer **Role:** Investigator or counter-terrorism police **Goal:** Identify and locate persons of interest; build case evidence **Frequency:** Variable (reactive to incidents, proactive investigation cycles) ### Profile - **Age:** 30–50 - **Technical skill:** Medium (comfortable with common tools; less patience for complexity) - **Context:** Police station, patrol vehicle, incident scene - **Devices:** Desktop, laptop, occasionally tablet - **Time pressure:** Very high (active incidents, rapidly changing situations) ### Needs - **Immediate answers:** \"Where was this person in the last hour?\" - **Visual confirmation:** Photo, video, location map (not just data tables) - **Actionable intelligence:** Predict next location or movement pattern - **Evidence capture:** Screenshots, video clips for case files - **Team coordination:** Share findings with other officers or teams ### Pain points - Fragmented tools make scene response slow (check map, then check database, then check timeline) - Cannot quickly verify identity from CCTV feeds - Difficulty assessing threat level or modus operandi from raw data - Manual cross-referencing between locations is error-prone ### How they use Augur 1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours) 2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events 3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits 4. **Evidence collection:** Screenshot detail panel and timeline for case file 5. **Team briefing:** Share annotated view with other officers via secure link ### Design implications - **Large avatars and photos:** Visual confirmation is critical; images should be prominent - **Map integration:** Spatial context (where sightings occurred) matters more than abstract data - **Quick summaries:** AI-written incident summaries to provide instant context - **Mobile-first:** Design panels to work well on tablet and small screens - **Offline mode:** Critical workflows should work without network (for vehicle/scene use) ---  # Augur Persona — Council Planner **Role:** Urban planner, public safety coordinator **Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements **Frequency:** Weekly or monthly (strategic planning cycles, not real-time) ### Profile - **Age:** 35–55 - **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools) - **Context:** Office desk, occasional council meetings - **Devices:** Desktop/laptop; rare mobile use - **Time pressure:** Low (can spend time exploring data, generating reports) ### Needs - **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\" - **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes - **Exportable reports:** Data and visualisations for presentations and board documents - **Actionable insights:** Not raw data, but curated analysis with recommendations ### Pain points - Difficult to answer \"what changed?\" questions without historical data - Cannot easily generate heatmaps or trend charts for reports - Manual data aggregation from multiple sources is time-consuming - Lacks statistical context (is this trend significant or noise?) ### How they use Augur 1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days) 2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends 3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics 4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation 5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes ### Design implications - **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel) - **Comparative filters:** Quick way to compare two time periods side-by-side - **Summary statistics:** Show totals, averages, % change to highlight trends - **Natural language:** Avoid jargon; use plain English summaries - **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work --- # Augur Persona — Commercial Space Owner **Role:** Airport, shopping centre, stadium, or venue manager **Goal:** Ensure safety and security of premises; prevent theft, reduce incidents **Frequency:** Daily or weekly (operational oversight) ### Profile - **Age:** 35–60 - **Technical skill:** Low (comfort with basic software; prefers simplicity over power) - **Context:** Manager's office or security control room - **Devices:** Desktop/laptop; occasionally tablet - **Time pressure:** Medium (reactive to incidents; proactive reviews weekly) ### Needs - **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\" - **Staff briefing:** Prepare daily or weekly briefing for security team - **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas) - **Alert integration:** Receive notifications of serious incidents in real-time ### Pain points - Cannot quickly identify if incidents are isolated or part of a pattern - Lacks visibility into peak risk times (when to increase staffing) - Manual incident reports from security team are fragmented and slow - Difficult to demonstrate ROI of security improvements to leadership ### How they use Augur 1. **Daily check-in:** Open map; filter by location (venue) and today's date 2. **Incident review:** Click on incident to see details (what, where, when, involved parties) 3. **Weekly briefing:** Export summary of incidents and trends for security team meeting 4. **Quarterly report:** Generate 3-month report of incidents by type and location for board 5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues) ### Design implications - **Simplified interface:** Reduce options; show only relevant data for venue operators - **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters - **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity) - **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display) - **Email/SMS alerts:** Notify manager of serious incidents via push/email --- # Augur Persona — Retailer **Role:** Retail manager (supermarket, department store, independent shop) **Goal:** Prevent theft and loss; improve store operations; train staff on safety **Frequency:** Daily to weekly (depends on store size and incident frequency) ### Profile - **Age:** 28–50 - **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools) - **Context:** Store office or back-of-house area - **Devices:** Desktop/laptop; increasingly tablet (during floor rounds) - **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods) ### Needs - **Rapid response:** Identify shoplifter or employee theft in real-time - **Loss visibility:** \"How much loss are we experiencing? In which department?\" - **Staff training:** Use incident data to train staff on prevention and procedures - **Evidence capture:** Collect footage/data for loss prevention or legal proceedings ### Pain points - Manual incident reporting from floor staff (time-consuming, incomplete) - Difficult to see patterns (same offender, same time of day, same location in store) - Cannot correlate \"suspicious activity\" alerts with actual losses - Lack of visibility into employee-related incidents ### How they use Augur 1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification) 2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?) 3. **Shift review:** End of day, check incidents during shift; brief team on patterns 4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items 5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends ### Design implications - **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in) - **Repeat offender flag:** Highlight if same person has multiple incidents - **Item-level data:** Connect incidents to specific products/departments (requires POS integration) - **Playback mode:** Show timeline of activity before/after incident (useful for training) - **Mobile-first:** Managers check app from floor or office (not always at desk) --- # Augur Persona — Security Operator **Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema) **Goal:** Respond to incidents quickly; identify threats; protect staff and customers **Frequency:** Shift-based (continuous presence during operating hours) ### Profile - **Age:** 22–45 - **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools) - **Context:** Security control room or mobile (patrol, incident scene) - **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone - **Time pressure:** Very high (active incidents demand immediate action) ### Needs - **Instant alerts:** Notification of flagged individuals or unusual activity - **Visual confirmation:** Live camera feed or photos to verify threat level - **Location intelligence:** Where did the person go? Which exit will they use? - **Backup coordination:** Quick way to request additional security or police - **Incident log:** Record what happened for post-incident review ### Pain points - Fragmented tools (CCTV system, incident log, radio/comms separate) - Cannot quickly pull historical context (is this person a repeat problem?) - Difficulty communicating precise location/identity to backup teams - Manual incident reporting after the fact (time-consuming, errors) ### How they use Augur 1. **Real-time monitoring:** Control room displays map with heat map of recent activity 2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location 3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept 4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message 5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review ### Design implications - **Alert-centric design:** Notifications are primary interaction (not searching) - **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity) - **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone - **Voice-friendly:** Support dictation for incident logging (hands-free during active response) - **Offline resilience:** Core functions work without network (video playback, past data) - **Minimal friction:** Fewer clicks to log incident or alert backup --- See accessibility.md for full WCAG 2.1 AA compliance details.","absoluteBoundingBox":{"x":48508.0,"y":34292.0,"width":1880.0,"height":9528.0},"isolatedAbsoluteRenderBounds":{"x":48508.3515625,"y":34298.12109375,"width":1853.453125,"height":9517.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":9528.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Personas — Index\n\n## Overview\n\nAugur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone.\n\n---\n\n\n## Persona Comparison Matrix\n\n| Persona | Primary goal | Time pressure | Technical skill | Device | Key feature |\n|---|---|---|---|---|---|\n| **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail |\n| **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export |\n| **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends |\n| **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary |\n| **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile |\n| **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation |\n\n---\n\n## Design Decisions by Persona\n\n### Information Architecture\n\n**Government & Law enforcement** prioritise:\n- Timeline and historical context (drill-down from event → details → related)\n- People and places (find person, then events, then timeline)\n- Export and integration (share findings, integrate with external tools)\n\n**Council planners & owners** prioritise:\n- Aggregated metrics and trends (summary first, detail optional)\n- Comparative analysis (year-over-year, location-to-location)\n- Export for reports and presentations\n\n**Retailers & security operators** prioritise:\n- Alerts and notifications (passive receipt of urgent information)\n- Mobile access (not always at desk)\n- Minimal friction (quick lookup, confirm, act)\n\n### Interaction Patterns\n\n**Government & law enforcement:**\n- Keyboard shortcuts (fast users)\n- Saved filters and workspaces (reuse across shifts)\n- Bulk export and reporting\n\n**Council & owners:**\n- Prebuilt reports and dashboards\n- Comparative date/time pickers\n- Visual summaries before detail\n\n**Retailers & operators:**\n- Push notifications and alerts\n- One-click actions (confirm, share, log)\n- Minimal navigation depth\n\n### Copy & Tone\n\n**Government & law enforcement:**\n- Direct and precise (authoritative, no softening)\n- Technical vocabulary acceptable (they know the jargon)\n- Procedural language (actionable instructions)\n\n**Council & owners:**\n- Clear and jargon-free (may not know public safety terminology)\n- Contextual explanation (what this metric means, why it matters)\n- Business-focused language\n\n**Retailers & operators:**\n- Urgent but calm (no alarmism, but clear on severity)\n- Action-oriented (what to do, not why)\n- Short, scannable copy\n\n---\n\n## Feature Prioritisation by Persona\n\n### Must-have (all personas)\n- Search/filter by location and date range\n- Detail panel for persons and events\n- Photo/avatar visibility\n- Export to PDF/CSV\n\n### High-value (government, law enforcement)\n- Save and name filters\n- Timeline view with granular timestamps\n- Related data drilling (event → people → timeline)\n- Audit logging\n- Full historical data access\n\n### High-value (council, commercial owner)\n- Prebuilt report templates\n- Comparative date filters\n- Trend charts and visualisations\n- Email scheduling for reports\n\n### High-value (retailers, security operators)\n- Real-time notifications and alerts\n- Mobile app with offline capability\n- Quick incident logging (forms with presets)\n- Location map with heatmap view\n- Integration with mobile devices (tablet, smartphone)\n\n---\n\n## Accessibility & Inclusion\n\nAll personas should be able to use Augur with:\n- Keyboard navigation (for all, especially desktop-heavy users)\n- Screen reader support (government analysts using accessibility features)\n- Mobile responsiveness (operators in field)\n- Low-tech fallbacks (alert SMS if app unavailable)\n\n---\n\n# Augur Persona — Government Analyst\n\n**Role:** MI5/MI6 intelligence analyst  \n**Goal:** Find and monitor hostile foreign agents operating in the UK  \n**Frequency:** Daily, shift-based (8–12 hour blocks)\n\n### Profile\n\n- **Age:** 28–45\n- **Technical skill:** High (comfortable with complex systems, data tools)\n- **Context:** Secure, government facility with dedicated workstations\n- **Devices:** Desktop/laptop only; no mobile access\n- **Time pressure:** High (real-time monitoring, time-sensitive intelligence)\n\n### Needs\n\n- **Speed:** Locate persons of interest within seconds\n- **Precision:** Confirm identity with high confidence (facial recognition, metadata matching)\n- **Historical context:** Access to full timeline of sightings and related incidents\n- **Integration:** Cross-reference with external databases and intelligence feeds\n- **Audit trail:** Detailed logs for compliance and legal proceedings\n\n### Pain points\n\n- Current systems are fragmented (multiple tools for tracking, mapping, reporting)\n- Slow handoffs between shifts lose critical context\n- Geographic and temporal filtering is tedious (manual entry, limited saved filters)\n- Cannot quickly correlate multiple sightings across locations\n\n### How they use Augur\n\n1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours)\n2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals\n3. **Investigation:** Drill into specific event; review timeline and related people; export data for report\n4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical)\n\n### Design implications\n\n- **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status)\n- **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks\n- **Export options:** CSV, PDF for reports and compliance\n- **Audit annotations:** Allow analysts to add notes to specific sightings for context\n\n---  # Augur Persona — Law Enforcement Officer\n\n**Role:** Investigator or counter-terrorism police  \n**Goal:** Identify and locate persons of interest; build case evidence  \n**Frequency:** Variable (reactive to incidents, proactive investigation cycles)\n\n### Profile\n\n- **Age:** 30–50\n- **Technical skill:** Medium (comfortable with common tools; less patience for complexity)\n- **Context:** Police station, patrol vehicle, incident scene\n- **Devices:** Desktop, laptop, occasionally tablet\n- **Time pressure:** Very high (active incidents, rapidly changing situations)\n\n### Needs\n\n- **Immediate answers:** \"Where was this person in the last hour?\"\n- **Visual confirmation:** Photo, video, location map (not just data tables)\n- **Actionable intelligence:** Predict next location or movement pattern\n- **Evidence capture:** Screenshots, video clips for case files\n- **Team coordination:** Share findings with other officers or teams\n\n### Pain points\n\n- Fragmented tools make scene response slow (check map, then check database, then check timeline)\n- Cannot quickly verify identity from CCTV feeds\n- Difficulty assessing threat level or modus operandi from raw data\n- Manual cross-referencing between locations is error-prone\n\n### How they use Augur\n\n1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours)\n2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events\n3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits\n4. **Evidence collection:** Screenshot detail panel and timeline for case file\n5. **Team briefing:** Share annotated view with other officers via secure link\n\n### Design implications\n\n- **Large avatars and photos:** Visual confirmation is critical; images should be prominent\n- **Map integration:** Spatial context (where sightings occurred) matters more than abstract data\n- **Quick summaries:** AI-written incident summaries to provide instant context\n- **Mobile-first:** Design panels to work well on tablet and small screens\n- **Offline mode:** Critical workflows should work without network (for vehicle/scene use)\n\n---\n # Augur Persona — Council Planner\n\n**Role:** Urban planner, public safety coordinator  \n**Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements  \n**Frequency:** Weekly or monthly (strategic planning cycles, not real-time)\n\n### Profile\n\n- **Age:** 35–55\n- **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools)\n- **Context:** Office desk, occasional council meetings\n- **Devices:** Desktop/laptop; rare mobile use\n- **Time pressure:** Low (can spend time exploring data, generating reports)\n\n### Needs\n\n- **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\"\n- **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes\n- **Exportable reports:** Data and visualisations for presentations and board documents\n- **Actionable insights:** Not raw data, but curated analysis with recommendations\n\n### Pain points\n\n- Difficult to answer \"what changed?\" questions without historical data\n- Cannot easily generate heatmaps or trend charts for reports\n- Manual data aggregation from multiple sources is time-consuming\n- Lacks statistical context (is this trend significant or noise?)\n\n### How they use Augur\n\n1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days)\n2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends\n3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics\n4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation\n5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes\n\n### Design implications\n\n- **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel)\n- **Comparative filters:** Quick way to compare two time periods side-by-side\n- **Summary statistics:** Show totals, averages, % change to highlight trends\n- **Natural language:** Avoid jargon; use plain English summaries\n- **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work\n\n---\n\n# Augur Persona — Commercial Space Owner\n\n**Role:** Airport, shopping centre, stadium, or venue manager  \n**Goal:** Ensure safety and security of premises; prevent theft, reduce incidents  \n**Frequency:** Daily or weekly (operational oversight)\n\n### Profile\n\n- **Age:** 35–60\n- **Technical skill:** Low (comfort with basic software; prefers simplicity over power)\n- **Context:** Manager's office or security control room\n- **Devices:** Desktop/laptop; occasionally tablet\n- **Time pressure:** Medium (reactive to incidents; proactive reviews weekly)\n\n### Needs\n\n- **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\"\n- **Staff briefing:** Prepare daily or weekly briefing for security team\n- **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas)\n- **Alert integration:** Receive notifications of serious incidents in real-time\n\n### Pain points\n\n- Cannot quickly identify if incidents are isolated or part of a pattern\n- Lacks visibility into peak risk times (when to increase staffing)\n- Manual incident reports from security team are fragmented and slow\n- Difficult to demonstrate ROI of security improvements to leadership\n\n### How they use Augur\n\n1. **Daily check-in:** Open map; filter by location (venue) and today's date\n2. **Incident review:** Click on incident to see details (what, where, when, involved parties)\n3. **Weekly briefing:** Export summary of incidents and trends for security team meeting\n4. **Quarterly report:** Generate 3-month report of incidents by type and location for board\n5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues)\n\n### Design implications\n\n- **Simplified interface:** Reduce options; show only relevant data for venue operators\n- **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters\n- **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity)\n- **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display)\n- **Email/SMS alerts:** Notify manager of serious incidents via push/email\n\n---\n\n# Augur Persona — Retailer\n\n**Role:** Retail manager (supermarket, department store, independent shop)  \n**Goal:** Prevent theft and loss; improve store operations; train staff on safety  \n**Frequency:** Daily to weekly (depends on store size and incident frequency)\n\n### Profile\n\n- **Age:** 28–50\n- **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools)\n- **Context:** Store office or back-of-house area\n- **Devices:** Desktop/laptop; increasingly tablet (during floor rounds)\n- **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods)\n\n### Needs\n\n- **Rapid response:** Identify shoplifter or employee theft in real-time\n- **Loss visibility:** \"How much loss are we experiencing? In which department?\"\n- **Staff training:** Use incident data to train staff on prevention and procedures\n- **Evidence capture:** Collect footage/data for loss prevention or legal proceedings\n\n### Pain points\n\n- Manual incident reporting from floor staff (time-consuming, incomplete)\n- Difficult to see patterns (same offender, same time of day, same location in store)\n- Cannot correlate \"suspicious activity\" alerts with actual losses\n- Lack of visibility into employee-related incidents\n\n### How they use Augur\n\n1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification)\n2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?)\n3. **Shift review:** End of day, check incidents during shift; brief team on patterns\n4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items\n5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends\n\n### Design implications\n\n- **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in)\n- **Repeat offender flag:** Highlight if same person has multiple incidents\n- **Item-level data:** Connect incidents to specific products/departments (requires POS integration)\n- **Playback mode:** Show timeline of activity before/after incident (useful for training)\n- **Mobile-first:** Managers check app from floor or office (not always at desk)\n\n---\n\n# Augur Persona — Security Operator\n\n**Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema)  \n**Goal:** Respond to incidents quickly; identify threats; protect staff and customers  \n**Frequency:** Shift-based (continuous presence during operating hours)\n\n### Profile\n\n- **Age:** 22–45\n- **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools)\n- **Context:** Security control room or mobile (patrol, incident scene)\n- **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone\n- **Time pressure:** Very high (active incidents demand immediate action)\n\n### Needs\n\n- **Instant alerts:** Notification of flagged individuals or unusual activity\n- **Visual confirmation:** Live camera feed or photos to verify threat level\n- **Location intelligence:** Where did the person go? Which exit will they use?\n- **Backup coordination:** Quick way to request additional security or police\n- **Incident log:** Record what happened for post-incident review\n\n### Pain points\n\n- Fragmented tools (CCTV system, incident log, radio/comms separate)\n- Cannot quickly pull historical context (is this person a repeat problem?)\n- Difficulty communicating precise location/identity to backup teams\n- Manual incident reporting after the fact (time-consuming, errors)\n\n### How they use Augur\n\n1. **Real-time monitoring:** Control room displays map with heat map of recent activity\n2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location\n3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept\n4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message\n5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review\n\n### Design implications\n\n- **Alert-centric design:** Notifications are primary interaction (not searching)\n- **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity)\n- **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone\n- **Voice-friendly:** Support dictation for incident logging (hands-free during active response)\n- **Offline resilience:** Core functions work without network (video playback, past data)\n- **Minimal friction:** Fewer clicks to log incident or alert backup\n\n---\n\nSee accessibility.md for full WCAG 2.1 AA compliance details.","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2748":{"type":"FRAME","id":"34:2748","name":"Agent preparation","absoluteBoundingBox":{"x":53472.0,"y":543.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53472.0,"y":543.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":256.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2749"]},"34:2710":{"type":"FRAME","id":"34:2710","name":"Introduction","absoluteBoundingBox":{"x":52256.0,"y":335.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":335.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3316},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":781},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2711"]},"34:2661":{"type":"TEXT","id":"34:2661","name":"Branding design","absoluteBoundingBox":{"x":48124.0,"y":395.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48125.48828125,"y":401.588043212891,"width":145.67578125,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Branding design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"41:3542":{"type":"TEXT","id":"41:3542","name":"DESIGN.MD","absoluteBoundingBox":{"x":53788.0,"y":180.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53790.6875,"y":192.759994506836,"width":174.65625,"height":22.7200012207031},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DESIGN.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2662":{"type":"FRAME","id":"34:2662","name":"Design sytem","absoluteBoundingBox":{"x":48120.0,"y":431.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":431.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3312},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":1371},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/design-system"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2663"]},"78:20409":{"type":"TEXT","id":"78:20409","name":"PERSONAS.MD","absoluteBoundingBox":{"x":48508.0,"y":34172.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48514.46484375,"y":34197.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PERSONAS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20361":{"type":"TEXT","id":"78:20361","name":"# Augur Components ## Overview This document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target. --- ## Buttons ### Icon Button **Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause). **Size:** 40×40px (icon 20×20px centered) **Padding:** None (icon-only, square aspect) **Background:** `colour/bg/primary` **Icon colour:** `colour/icon/primary` **Border:** None **Radius:** `radius/none` **States:** - **Default:** Background `colour/bg/primary`, icon `colour/icon/primary` - **Hover:** Background `colour/hover` (cream/400), icon unchanged - **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white) - **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled` - **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset **Variants:** - **Icon only** (standard) — as above - **With badge** — small red dot (8px) top-right corner for notifications **Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view --- ### Text Button / Link **Purpose:** Navigation and secondary actions within panels and lists. **Typography:** `type/body`, regular weight **Colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height) **Border:** None **Radius:** `radius/none` **States:** - **Default:** Text `colour/text/primary`, background transparent - **Hover:** Background `colour/hover`, text unchanged - **Active/selected:** Text `colour/active`, background `colour/bg/tertiary` - **Disabled:** Text `colour/text/disabled`, background transparent - **Focus:** Underline in `colour/focus-ring` **Variants:** - **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2` - **Inline** — no padding, appears in running text - **Full-width** — stretches to container width, text left-aligned **Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\" --- ## Inputs ### Dropdown / Select **Purpose:** Choose from predefined options (location, date, time, filter). **Height:** 40px **Padding:** `space/4` horizontal, `space/2` vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/medium` **Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary` **Radius:** `radius/none` **States:** - **Default:** As above - **Hover:** Background `colour/hover` - **Focus:** Border `colour/focus-ring`, outline 2px offset - **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation) - **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled` **Interaction:** - Click to open dropdown menu - Menu items: 40px height, `type/body`, left-aligned with `space/4` padding - Selected item: Background `colour/active`, text `colour/text/inverse` - Unselected items: Background `colour/bg/primary`, text `colour/text/primary` - Keyboard: Arrow keys to navigate, Enter to select, Escape to close **Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\" --- ### Calendar / Date Picker **Purpose:** Select a date or time period (year, month, week, day, live). **Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day). **Period tabs:** - Horizontal layout, `space/2` gap - Tab size: min 48×32px - Typography: `type/body`, bold - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` (neutral/900) - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` **Grid cells:** - Size: 40×40px minimum - Typography: `type/body`, regular - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` - Border: 1px `colour/border/light` between cells - Today indicator: Underline in `colour/active` (if applicable) **Interaction:** - Click period tab to switch grid view - Click cell to select - Keyboard: Arrow keys to navigate, Enter to select, Escape to close - LIVE mode: shows real-time timestamp **Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8 --- ### Location Picker **Purpose:** Hierarchical geographic navigation (Country → Region → Area). **Height:** Full panel, scrollable if >6 items **Item height:** 44px minimum **Padding:** `space/4` per item **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` between items **Arrow:** Right-aligned, `colour/icon/secondary` **Layout:** - Header: Back arrow (24×24px, `colour/icon/primary`), title, close X - Body: List of items, each with label and arrow - Footer: Optional breadcrumb or current selection **Interaction:** - Click item to drill down (arrow navigates to sub-level) - Click back arrow to navigate up - Click close X to dismiss - Keyboard: Arrow keys, Enter to select/navigate, Escape to close **Examples:** \"England → London\", \"England → South East\", etc. --- ## Panels & Modals ### Panel Header **Purpose:** Title, navigation, and close controls for side panels. **Height:** 48px minimum **Padding:** `space/4` horizontal and vertical **Background:** `colour/bg/tertiary` (cream/200) **Border:** 1px `colour/border/light` bottom **Typography:** `type/h4` for major panels, `type/body` for secondary **Text colour:** `colour/text/primary` **Layout:** Flex, space-between - **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`) - **Centre:** Title / label, left-aligned - **Right:** Close button (X, 24×24px icon button) **Interaction:** - Back arrow navigates to previous state - Close X dismisses panel **Examples:** - \"Customer numbers\" (data list header) - \"Selected event\" (detail header) - \"Notifications (3)\" (notification drawer header) --- ### Panel Body **Purpose:** Main content area for panels. **Background:** `colour/bg/primary` (cream/500) **Padding:** `space/6` (24px) all sides **Typography:** `type/body` for text, `type/h4` for section headers **Text colour:** `colour/text/primary` **Border:** `shadow/small` (raised effect) **Max width:** 320px (typical panel width) **Scrollable:** Yes, if content exceeds viewport height **Content types:** - Section headers (`type/h4`, margin-top `space/6` except first) - List items (with or without images/avatars) - Detail cards (image, text, metadata) - Text blocks (descriptions, AI-generated summaries) - Charts (bar charts with axis labels) **Interaction:** - Click list items or links to navigate or open detail panels - Panels can stack (e.g. Customer numbers → detail drawer) --- ## Lists & Tables ### List Item **Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications). **Height:** 44px minimum (text only), 64px+ (with images) **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Background (hover):** `colour/hover` (cream/400) **Border:** 1px `colour/border/light` bottom **Radius:** `radius/none` **Anatomy:** - **Left:** Label or label + secondary text (metadata) - **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon **Variants:** - **Simple label** — single line, bold - **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`) - **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow - **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below **Interaction:** - Click to navigate to detail or drill down - Optional: swipe to reveal actions (secondary interaction) **Examples:** - \"Numbers\" with arrow (data category) - \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event) - Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person) --- ### Notification List Item **Purpose:** High-priority alert display with time, status, and action. **Height:** 80px minimum **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp) **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` bottom **Avatar:** Circular, 40×40px, left-aligned **Anatomy:** - **Left:** Avatar (40×40px, square corners) - **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge - **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge) **Badge variants:** - Notification dot (8px orange circle for urgent alerts) - Percentage badge (circular, dark background, white bold text, e.g. \"92%\") - Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\") --- ## Cards ### Event Detail Card **Purpose:** Full details for a selected incident or event. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing 2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge 3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description) 4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\" 5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text) 6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4` **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) **Interaction:** - Click action links to drill down or open related panels - Avatar click: open person detail panel --- ### Person Detail Card **Purpose:** Individual profile with summary and related actions. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Avatar** — Large circular, 120×120px, square corners, centred 2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description) 3. **Location** — `type/body` with `colour/text/secondary` 4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) --- ### Data Detail Card **Purpose:** Visualisation and metrics display. **Layout:** Vertical stack **Width:** Variable (panel or embedded in dashboard) **Padding:** `space/6` all sides **Content structure:** 1. **Header** — `type/h4` title, e.g. \"Customer numbers\" 2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical 3. **Footer** — Metadata, e.g. date range, data source **Chart style:** - Bars: Neutral grey (`colour/neutral/600` or darker) - Background: Transparent or very light (`colour/bg/primary`) - Axis labels: `type/body` with `colour/text/secondary` - Grid: Optional light dividers (`colour/border/light`) --- ## Navigation ### Top Bar **Purpose:** Global application header with logo, filters, and user controls. **Height:** 48px **Padding:** `space/4` horizontal **Background:** `colour/neutral/0` (white) **Border:** 1px `colour/border/light` bottom **Layout:** Flex, space-between **Sections:** - **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned) - **Centre:** Global filters (Dropdowns for Where and When) - **Right:** Notification icon (with badge) + User avatar icon button **Interaction:** - Click filters to open pickers - Click notification icon to open notification drawer - Click avatar to open user menu --- ### Secondary Navigation Bar **Purpose:** View/mode selector (Map, Data, Events, People, etc.). **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/tertiary` (cream/200) **Border:** None **Layout:** Flex, space-between or space-around **Tab anatomy:** - Height: 40px - Icon: 20×20px, left-aligned or centred - Label: `type/body`, left-aligned or centred - Background: `colour/bg/tertiary` (inactive) - Background: `colour/active` (active tab) - Text: `colour/text/primary` (inactive), `colour/text/inverse` (active) - Padding: `space/2` to `space/4` **Interaction:** - Click tab to switch view - Active tab indicated by dark background - Keyboard: Left/Right arrow keys to navigate, Enter to select **Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon) --- ### Floating Controls (Canvas) **Purpose:** View manipulation and playback controls positioned near 3D canvas. **Position:** Bottom-right, 16px offset from edges **Layout:** Vertical stack, `space/2` gap **Controls:** 1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary` 2. **Zoom controls** — Icon button (+ and -), stacked vertically 3. **Reset/recenter** — Icon button (refresh icon) **Spacing:** `space/2` (8px) between buttons **Size:** 40×40px per button **Interaction:** Click to activate function --- ### Timeline / Scrubber Bar **Purpose:** Temporal navigation and playback. **Position:** Bottom of viewport **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/primary` (cream/500) **Border:** 1px `colour/border/light` top **Layout:** Flex, space-between **Sections:** - **Left:** Play/pause button (icon button, 32×32px) - **Centre:** Scrubber track (draggable timeline, shows current position) - **Right:** Timecode readout (`type/body`, e.g. \"23:59\") **Interaction:** - Click play/pause to control playback - Drag scrubber to seek to time - Timecode updates in real-time --- ## Accessibility Notes ### Keyboard Navigation - All buttons and links are focusable (Tab key) - Icon buttons include visible focus ring (2px outline in `colour/focus-ring`) - Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter - Escape closes open modals and pickers ### ARIA Labels - Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\") - Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded` - Panels include semantic heading tags (`<h2>`, `<h3>`) - List items include `role=\"button\"` if clickable ### Touch Targets - Minimum 44×44px for all interactive elements - Icon buttons: 40×40px (meets 44px height with padding) - List items: 44px minimum height - Panel close button: 24×24px icon, but padded to 44×44px touch area ### Colour Contrast - All text: 4.5:1 ratio minimum (primary text on primary background) - Large text: 3:1 ratio acceptable - Icons: 3:1 ratio minimum against background - Alert colour (orange): tested against background for WCAG AA ### Screen Reader Support - Images include alt text (hero images, avatars) - Panels marked with semantic headings - Status indicators (badges, dots) include aria-live regions for updates - Tables include semantic `<th>` and `<td>` elements ### Monospace Considerations - Line length kept under 70 characters (readability) - Letter spacing adequate (monospace is denser than humanist sans) - Avoid all-caps for extended text (lowercase/title case preferred)","absoluteBoundingBox":{"x":50940.0,"y":14132.0,"width":1160.0,"height":11376.0},"isolatedAbsoluteRenderBounds":{"x":50940.71875,"y":14137.8798828125,"width":1129.55859375,"height":11341.8408203125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":11376.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Components\n\n## Overview\n\nThis document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target.\n\n---\n\n## Buttons\n\n### Icon Button\n\n**Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause).\n\n**Size:** 40×40px (icon 20×20px centered)  \n**Padding:** None (icon-only, square aspect)  \n**Background:** `colour/bg/primary`  \n**Icon colour:** `colour/icon/primary`  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Background `colour/bg/primary`, icon `colour/icon/primary`\n- **Hover:** Background `colour/hover` (cream/400), icon unchanged\n- **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white)\n- **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled`\n- **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset\n\n**Variants:**\n- **Icon only** (standard) — as above\n- **With badge** — small red dot (8px) top-right corner for notifications\n\n**Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view\n\n---\n\n### Text Button / Link\n\n**Purpose:** Navigation and secondary actions within panels and lists.\n\n**Typography:** `type/body`, regular weight  \n**Colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height)  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Text `colour/text/primary`, background transparent\n- **Hover:** Background `colour/hover`, text unchanged\n- **Active/selected:** Text `colour/active`, background `colour/bg/tertiary`\n- **Disabled:** Text `colour/text/disabled`, background transparent\n- **Focus:** Underline in `colour/focus-ring`\n\n**Variants:**\n- **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2`\n- **Inline** — no padding, appears in running text\n- **Full-width** — stretches to container width, text left-aligned\n\n**Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\"\n\n---\n\n## Inputs\n\n### Dropdown / Select\n\n**Purpose:** Choose from predefined options (location, date, time, filter).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal, `space/2` vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/medium`  \n**Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary`  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** As above\n- **Hover:** Background `colour/hover`\n- **Focus:** Border `colour/focus-ring`, outline 2px offset\n- **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation)\n- **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled`\n\n**Interaction:**\n- Click to open dropdown menu\n- Menu items: 40px height, `type/body`, left-aligned with `space/4` padding\n- Selected item: Background `colour/active`, text `colour/text/inverse`\n- Unselected items: Background `colour/bg/primary`, text `colour/text/primary`\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n\n**Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\"\n\n---\n\n### Calendar / Date Picker\n\n**Purpose:** Select a date or time period (year, month, week, day, live).\n\n**Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day).\n\n**Period tabs:**\n- Horizontal layout, `space/2` gap\n- Tab size: min 48×32px\n- Typography: `type/body`, bold\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active` (neutral/900)\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n\n**Grid cells:**\n- Size: 40×40px minimum\n- Typography: `type/body`, regular\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active`\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n- Border: 1px `colour/border/light` between cells\n- Today indicator: Underline in `colour/active` (if applicable)\n\n**Interaction:**\n- Click period tab to switch grid view\n- Click cell to select\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n- LIVE mode: shows real-time timestamp\n\n**Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8\n\n---\n\n### Location Picker\n\n**Purpose:** Hierarchical geographic navigation (Country → Region → Area).\n\n**Height:** Full panel, scrollable if >6 items  \n**Item height:** 44px minimum  \n**Padding:** `space/4` per item  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` between items  \n**Arrow:** Right-aligned, `colour/icon/secondary`\n\n**Layout:**\n- Header: Back arrow (24×24px, `colour/icon/primary`), title, close X\n- Body: List of items, each with label and arrow\n- Footer: Optional breadcrumb or current selection\n\n**Interaction:**\n- Click item to drill down (arrow navigates to sub-level)\n- Click back arrow to navigate up\n- Click close X to dismiss\n- Keyboard: Arrow keys, Enter to select/navigate, Escape to close\n\n**Examples:** \"England → London\", \"England → South East\", etc.\n\n---\n\n## Panels & Modals\n\n### Panel Header\n\n**Purpose:** Title, navigation, and close controls for side panels.\n\n**Height:** 48px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** 1px `colour/border/light` bottom  \n**Typography:** `type/h4` for major panels, `type/body` for secondary  \n**Text colour:** `colour/text/primary`\n\n**Layout:** Flex, space-between\n- **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`)\n- **Centre:** Title / label, left-aligned\n- **Right:** Close button (X, 24×24px icon button)\n\n**Interaction:**\n- Back arrow navigates to previous state\n- Close X dismisses panel\n\n**Examples:**\n- \"Customer numbers\" (data list header)\n- \"Selected event\" (detail header)\n- \"Notifications (3)\" (notification drawer header)\n\n---\n\n### Panel Body\n\n**Purpose:** Main content area for panels.\n\n**Background:** `colour/bg/primary` (cream/500)  \n**Padding:** `space/6` (24px) all sides  \n**Typography:** `type/body` for text, `type/h4` for section headers  \n**Text colour:** `colour/text/primary`  \n**Border:** `shadow/small` (raised effect)  \n**Max width:** 320px (typical panel width)  \n**Scrollable:** Yes, if content exceeds viewport height\n\n**Content types:**\n- Section headers (`type/h4`, margin-top `space/6` except first)\n- List items (with or without images/avatars)\n- Detail cards (image, text, metadata)\n- Text blocks (descriptions, AI-generated summaries)\n- Charts (bar charts with axis labels)\n\n**Interaction:**\n- Click list items or links to navigate or open detail panels\n- Panels can stack (e.g. Customer numbers → detail drawer)\n\n---\n\n## Lists & Tables\n\n### List Item\n\n**Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications).\n\n**Height:** 44px minimum (text only), 64px+ (with images)  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Background (hover):** `colour/hover` (cream/400)  \n**Border:** 1px `colour/border/light` bottom  \n**Radius:** `radius/none`\n\n**Anatomy:**\n- **Left:** Label or label + secondary text (metadata)\n- **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon\n\n**Variants:**\n- **Simple label** — single line, bold\n- **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`)\n- **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow\n- **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below\n\n**Interaction:**\n- Click to navigate to detail or drill down\n- Optional: swipe to reveal actions (secondary interaction)\n\n**Examples:**\n- \"Numbers\" with arrow (data category)\n- \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event)\n- Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person)\n\n---\n\n### Notification List Item\n\n**Purpose:** High-priority alert display with time, status, and action.\n\n**Height:** 80px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp)  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` bottom  \n**Avatar:** Circular, 40×40px, left-aligned\n\n**Anatomy:**\n- **Left:** Avatar (40×40px, square corners)\n- **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge\n- **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge)\n\n**Badge variants:**\n- Notification dot (8px orange circle for urgent alerts)\n- Percentage badge (circular, dark background, white bold text, e.g. \"92%\")\n- Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\")\n\n---\n\n## Cards\n\n### Event Detail Card\n\n**Purpose:** Full details for a selected incident or event.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing\n2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge\n3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description)\n4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\"\n5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text)\n6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4`\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n**Interaction:**\n- Click action links to drill down or open related panels\n- Avatar click: open person detail panel\n\n---\n\n### Person Detail Card\n\n**Purpose:** Individual profile with summary and related actions.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Avatar** — Large circular, 120×120px, square corners, centred\n2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description)\n3. **Location** — `type/body` with `colour/text/secondary`\n4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n---\n\n### Data Detail Card\n\n**Purpose:** Visualisation and metrics display.\n\n**Layout:** Vertical stack  \n**Width:** Variable (panel or embedded in dashboard)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Header** — `type/h4` title, e.g. \"Customer numbers\"\n2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical\n3. **Footer** — Metadata, e.g. date range, data source\n\n**Chart style:**\n- Bars: Neutral grey (`colour/neutral/600` or darker)\n- Background: Transparent or very light (`colour/bg/primary`)\n- Axis labels: `type/body` with `colour/text/secondary`\n- Grid: Optional light dividers (`colour/border/light`)\n\n---\n\n## Navigation\n\n### Top Bar\n\n**Purpose:** Global application header with logo, filters, and user controls.\n\n**Height:** 48px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/neutral/0` (white)  \n**Border:** 1px `colour/border/light` bottom  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned)\n- **Centre:** Global filters (Dropdowns for Where and When)\n- **Right:** Notification icon (with badge) + User avatar icon button\n\n**Interaction:**\n- Click filters to open pickers\n- Click notification icon to open notification drawer\n- Click avatar to open user menu\n\n---\n\n### Secondary Navigation Bar\n\n**Purpose:** View/mode selector (Map, Data, Events, People, etc.).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** None  \n**Layout:** Flex, space-between or space-around\n\n**Tab anatomy:**\n- Height: 40px\n- Icon: 20×20px, left-aligned or centred\n- Label: `type/body`, left-aligned or centred\n- Background: `colour/bg/tertiary` (inactive)\n- Background: `colour/active` (active tab)\n- Text: `colour/text/primary` (inactive), `colour/text/inverse` (active)\n- Padding: `space/2` to `space/4`\n\n**Interaction:**\n- Click tab to switch view\n- Active tab indicated by dark background\n- Keyboard: Left/Right arrow keys to navigate, Enter to select\n\n**Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon)\n\n---\n\n### Floating Controls (Canvas)\n\n**Purpose:** View manipulation and playback controls positioned near 3D canvas.\n\n**Position:** Bottom-right, 16px offset from edges  \n**Layout:** Vertical stack, `space/2` gap\n\n**Controls:**\n1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary`\n2. **Zoom controls** — Icon button (+ and -), stacked vertically\n3. **Reset/recenter** — Icon button (refresh icon)\n\n**Spacing:** `space/2` (8px) between buttons  \n**Size:** 40×40px per button  \n**Interaction:** Click to activate function\n\n---\n\n### Timeline / Scrubber Bar\n\n**Purpose:** Temporal navigation and playback.\n\n**Position:** Bottom of viewport  \n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/primary` (cream/500)  \n**Border:** 1px `colour/border/light` top  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Play/pause button (icon button, 32×32px)\n- **Centre:** Scrubber track (draggable timeline, shows current position)\n- **Right:** Timecode readout (`type/body`, e.g. \"23:59\")\n\n**Interaction:**\n- Click play/pause to control playback\n- Drag scrubber to seek to time\n- Timecode updates in real-time\n\n---\n\n## Accessibility Notes\n\n### Keyboard Navigation\n- All buttons and links are focusable (Tab key)\n- Icon buttons include visible focus ring (2px outline in `colour/focus-ring`)\n- Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter\n- Escape closes open modals and pickers\n\n### ARIA Labels\n- Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\")\n- Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded`\n- Panels include semantic heading tags (`<h2>`, `<h3>`)\n- List items include `role=\"button\"` if clickable\n\n### Touch Targets\n- Minimum 44×44px for all interactive elements\n- Icon buttons: 40×40px (meets 44px height with padding)\n- List items: 44px minimum height\n- Panel close button: 24×24px icon, but padded to 44×44px touch area\n\n### Colour Contrast\n- All text: 4.5:1 ratio minimum (primary text on primary background)\n- Large text: 3:1 ratio acceptable\n- Icons: 3:1 ratio minimum against background\n- Alert colour (orange): tested against background for WCAG AA\n\n### Screen Reader Support\n- Images include alt text (hero images, avatars)\n- Panels marked with semantic headings\n- Status indicators (badges, dots) include aria-live regions for updates\n- Tables include semantic `<th>` and `<td>` elements\n\n### Monospace Considerations\n- Line length kept under 70 characters (readability)\n- Letter spacing adequate (monospace is denser than humanist sans)\n- Avoid all-caps for extended text (lowercase/title case preferred)\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2685":{"type":"TEXT","id":"34:2685","name":"Introduction","absoluteBoundingBox":{"x":50628.0,"y":343.932037353516,"width":120.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50629.6484375,"y":349.588043212891,"width":115.75,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":120.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Introduction","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2684":{"type":"FRAME","id":"34:2684","name":"Introduction","absoluteBoundingBox":{"x":50624.0,"y":343.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":343.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3212},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":781},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2685"]},"34:2678":{"type":"SVG","id":"34:2678","name":"back","absoluteBoundingBox":{"x":50624.0,"y":140.0,"width":40.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":140.0,"width":40.0,"height":40.0},"relativeTransform":[[1.0,0.0,40.0],[0.0,1.0,40.0]],"size":{"x":40.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"BUTTON","isDecorativeImage":false,"accessibleLabel":"Back button","ariaAttributes":{},"interactions":[{"id":{"sessionID":53,"localID":3574},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://digfat.com","openUrlInNewTab":false}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7076106675d532f2b6805d1f81f6012207006322"},"34:2650":{"type":"FRAME","id":"34:2650","name":"Desktop large","absoluteBoundingBox":{"x":48064.0,"y":100.0,"width":2456.0,"height":53696.0},"isolatedAbsoluteRenderBounds":{"x":48064.0,"y":100.0,"width":2456.0,"height":53696.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,100.0]],"size":{"x":2456.0,"y":53696.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.988235294818878,"g":0.984313726425171,"b":0.968627452850342,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"HORIZONTAL","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["34:2651","34:2672"]},"34:2718":{"type":"FRAME","id":"34:2718","name":"Software design","absoluteBoundingBox":{"x":52256.0,"y":479.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":479.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3320},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2033},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/software-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2719"]},"34:2722":{"type":"FRAME","id":"34:2722","name":"Agent preparation","absoluteBoundingBox":{"x":52256.0,"y":551.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52256.0,"y":551.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":256.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2723"]},"78:20394":{"type":"FRAME","id":"78:20394","name":"4","absoluteBoundingBox":{"x":54296.0,"y":42135.93359375,"width":344.0,"height":14248.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":42135.93359375,"width":344.0,"height":14248.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,41544.0]],"size":{"x":344.0,"y":14248.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20395","78:20396"]},"34:2721":{"type":"TEXT","id":"34:2721","name":"Final outcome","absoluteBoundingBox":{"x":52260.0,"y":515.932006835938,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52262.0,"y":521.588012695312,"width":125.65625,"height":11.5360107421875},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Final outcome","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20568":{"type":"FRAME","id":"78:20568","name":"6","absoluteBoundingBox":{"x":48488.0,"y":43932.0,"width":1920.0,"height":9808.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":43932.0,"width":1920.0,"height":9808.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,43776.0]],"size":{"x":1920.0,"y":9808.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20569","78:20570"]},"63:17403":{"type":"SVG","id":"63:17403","name":"Logo","absoluteBoundingBox":{"x":50624.0,"y":220.0,"width":251.571716308594,"height":83.9320373535156},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":220.0,"width":251.5703125,"height":83.9320373535156},"relativeTransform":[[1.0,0.0,40.0],[0.0,1.0,120.0]],"size":{"x":251.571716308594,"y":83.9320373535156},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logo","ariaAttributes":{},"interactions":[],"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2726":{"type":"FRAME","id":"34:2726","name":"1","absoluteBoundingBox":{"x":52552.0,"y":132.0,"width":800.0,"height":6472.0},"isolatedAbsoluteRenderBounds":{"x":52552.0,"y":132.0,"width":800.0,"height":6472.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":800.0,"y":6472.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["41:3541","78:20330"]},"78:20408":{"type":"FRAME","id":"78:20408","name":"5","absoluteBoundingBox":{"x":48488.0,"y":34116.0,"width":1920.0,"height":9760.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":34116.0,"width":1920.0,"height":9760.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,33960.0]],"size":{"x":1920.0,"y":9760.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20409","78:20410"]},"78:20349":{"type":"TEXT","id":"78:20349","name":"# Augur Design Tokens ## Token Structure Tokens follow a three-layer architecture: 1. **Primitive:** Raw colour values, named by hue and lightness stop 2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`) 3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens) --- ## Primitives ### Colour/Cream ``` colour/cream/50: #FCFBF7 colour/cream/100: #FAF6F0 colour/cream/200: #F7F2E8 colour/cream/300: #F4EEE0 colour/cream/400: #F1E9D9 colour/cream/500: #EFE5D1 colour/cream/600: #ECE1C9 colour/cream/700: #E9DCC2 colour/cream/800: #E7D8BA colour/cream/900: #D9C5A0 ``` ### Colour/Neutral ``` colour/neutral/0: #FFFFFF colour/neutral/50: #F9F5F1 colour/neutral/100: #E9E5E1 colour/neutral/200: #D9D5D1 colour/neutral/300: #C9C5C1 colour/neutral/400: #B9B5B1 colour/neutral/500: #A9A5A1 colour/neutral/600: #999591 colour/neutral/700: #898581 colour/neutral/800: #494541 colour/neutral/900: #292521 colour/neutral/1000: #000000 ``` ### Colour/Status (TBD) ``` colour/status/alert: #FF6B35 (orange, for notifications — confirm value) ``` --- ## Semantic Tokens ### Background ``` colour/bg/primary: colour/cream/500 (#EFE5D1) colour/bg/secondary: colour/cream/100 (#FAF6F0) colour/bg/tertiary: colour/cream/200 (#F7F2E8) colour/bg/canvas: colour/neutral/0 (#FFFFFF) colour/bg/overlay-dark: colour/neutral/1000 with 24% opacity ``` ### Text ``` colour/text/primary: colour/neutral/600 (#999591) colour/text/secondary: colour/neutral/500 (#A9A5A1) colour/text/tertiary: colour/neutral/400 (#B9B5B1) colour/text/inverse: colour/neutral/0 (#FFFFFF) colour/text/disabled: colour/neutral/200 (#D9D5D1) ``` ### Border ``` colour/border/light: colour/neutral/100 (#E9E5E1) colour/border/medium: colour/neutral/200 (#D9D5D1) colour/border/strong: colour/neutral/600 (#999591) colour/border/focus: colour/neutral/800 (#494541) ``` ### Icon ``` colour/icon/primary: colour/neutral/800 (#494541) colour/icon/secondary: colour/neutral/600 (#999591) colour/icon/disabled: colour/neutral/200 (#D9D5D1) colour/icon/inverse: colour/neutral/0 (#FFFFFF) ``` ### Status & Interaction ``` colour/active: colour/neutral/900 (#292521) colour/hover: colour/cream/400 (#F1E9D9) colour/focus-ring: colour/neutral/800 (#494541) colour/alert: colour/status/alert (#FF6B35) colour/success: (TBD) colour/warning: (TBD) colour/info: (TBD) ``` --- ## Typography Tokens ### Font Family ``` type/family: PP Grotesk Mono type/family/fallback: monospace ``` ### Font Sizes & Line Heights ``` type/display/size: 48px type/display/lineheight: 56px type/display/weight: bold type/h1/size: 40px type/h1/lineheight: 48px type/h1/weight: bold type/h2/size: 32px type/h2/lineheight: 40px type/h2/weight: bold type/h3/size: 28px type/h3/lineheight: 36px type/h3/weight: bold type/h4/size: 24px type/h4/lineheight: 32px type/h4/weight: bold type/body-large/size: 20px type/body-large/lineheight: 28px type/body-large/weight: regular type/body/size: 16px type/body/lineheight: 24px type/body/weight: regular type/caption/size: 12px (deprecated — use type/body with neutral/400) type/caption/lineheight: 16px type/caption/weight: light ``` ### Weight Tokens ``` type/weight/light: 300 type/weight/regular: 400 type/weight/bold: 700 ``` --- ## Spacing Tokens ``` space/1: 4px space/2: 8px space/3: 12px space/4: 16px space/5: 20px space/6: 24px space/7: 32px space/8: 40px space/9: 48px space/10: 64px ``` --- ## Elevation Tokens ``` shadow/small: 0px 4px 8px rgba(0, 0, 0, 0.24) ``` --- ## Radius Tokens ``` radius/none: 0px ``` --- ## Component-Specific Tokens ### Buttons #### Icon Button ``` button/icon/size: 40px × 40px button/icon/background: colour/bg/primary button/icon/background-hover: colour/hover button/icon/icon-colour: colour/icon/primary button/icon/padding: 0 (square) button/icon/radius: radius/none ``` #### Text Button / Link ``` button/text/font: type/body button/text/colour: colour/text/primary button/text/colour-hover: colour/text/primary (underline or bg hint) button/text/background: colour/bg/primary ``` ### Inputs #### Dropdown ``` input/dropdown/height: 40px input/dropdown/padding: space/4 (horizontal) input/dropdown/font: type/body input/dropdown/background: colour/bg/primary input/dropdown/border: colour/border/medium input/dropdown/text-colour: colour/text/primary input/dropdown/icon-colour: colour/icon/primary input/dropdown/radius: radius/none ``` #### Calendar / Date Picker ``` input/calendar/cell-size: 40px (minimum) input/calendar/cell-padding: space/2 input/calendar/active-bg: colour/active input/calendar/active-text: colour/text/inverse input/calendar/inactive-bg: colour/bg/primary input/calendar/inactive-text: colour/text/primary input/calendar/font: type/body input/calendar/header-font: type/h4 ``` #### Location Picker ``` input/location/item-height: 44px (minimum touch target) input/location/item-padding: space/4 input/location/font: type/body input/location/background: colour/bg/primary input/location/text-colour: colour/text/primary input/location/arrow-colour: colour/icon/secondary ``` ### Panels #### Panel Header ``` panel/header/background: colour/bg/tertiary panel/header/height: 48px (minimum) panel/header/padding: space/4 panel/header/font: type/h4 or type/body panel/header/text-colour: colour/text/primary panel/header/border: colour/border/light (bottom) panel/header/icon-colour: colour/icon/primary panel/header/close-size: 24px ``` #### Panel Body ``` panel/body/background: colour/bg/primary panel/body/padding: space/6 panel/body/font: type/body panel/body/text-colour: colour/text/primary panel/body/shadow: shadow/small ``` #### List Item ``` list/item/height: 44px (minimum) list/item/padding: space/4 list/item/font: type/body list/item/background: colour/bg/primary list/item/background-hover: colour/hover list/item/text-colour: colour/text/primary list/item/border: colour/border/light (bottom) list/item/arrow-colour: colour/icon/secondary list/item/radius: radius/none ``` ### Indicators #### Notification Dot ``` indicator/dot/size: 8px indicator/dot/background: colour/alert indicator/dot/position: top-right (absolute, -2px offset) ``` #### Badge ``` indicator/badge/min-width: 28px indicator/badge/height: 28px indicator/badge/padding: space/2 (horizontal) indicator/badge/font: type/body indicator/badge/font-weight: bold indicator/badge/background: colour/active indicator/badge/text-colour: colour/text/inverse indicator/badge/radius: radius/none ``` --- ## Component-Agnostic Usage For any component not explicitly listed above: 1. Use `colour/bg/primary` for primary backgrounds 2. Use `colour/text/primary` for primary text 3. Use `colour/border/medium` for borders 4. Use `space/4` for standard padding, `space/6` for generous padding 5. Use `shadow/small` for elevated surfaces 6. Use `radius/none` for all corners 7. Use `type/body` for standard UI copy, `type/h4` for section headers 8. Apply `colour/active` (neutral/900) for selected/active states 9. Respect minimum touch target size of 44×44px for interactive elements","absoluteBoundingBox":{"x":54316.0,"y":11623.931640625,"width":304.0,"height":10800.0},"isolatedAbsoluteRenderBounds":{"x":54314.16015625,"y":11629.587890625,"width":299.9140625,"height":10763.53515625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":304.0,"y":10800.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design Tokens\n\n## Token Structure\n\nTokens follow a three-layer architecture:\n1. **Primitive:** Raw colour values, named by hue and lightness stop\n2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`)\n3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens)\n\n---\n\n## Primitives\n\n### Colour/Cream\n\n```\ncolour/cream/50:    #FCFBF7\ncolour/cream/100:   #FAF6F0\ncolour/cream/200:   #F7F2E8\ncolour/cream/300:   #F4EEE0\ncolour/cream/400:   #F1E9D9\ncolour/cream/500:   #EFE5D1\ncolour/cream/600:   #ECE1C9\ncolour/cream/700:   #E9DCC2\ncolour/cream/800:   #E7D8BA\ncolour/cream/900:   #D9C5A0\n```\n\n### Colour/Neutral\n\n```\ncolour/neutral/0:     #FFFFFF\ncolour/neutral/50:    #F9F5F1\ncolour/neutral/100:   #E9E5E1\ncolour/neutral/200:   #D9D5D1\ncolour/neutral/300:   #C9C5C1\ncolour/neutral/400:   #B9B5B1\ncolour/neutral/500:   #A9A5A1\ncolour/neutral/600:   #999591\ncolour/neutral/700:   #898581\ncolour/neutral/800:   #494541\ncolour/neutral/900:   #292521\ncolour/neutral/1000:  #000000\n```\n\n### Colour/Status (TBD)\n\n```\ncolour/status/alert:  #FF6B35  (orange, for notifications — confirm value)\n```\n\n---\n\n## Semantic Tokens\n\n### Background\n\n```\ncolour/bg/primary:        colour/cream/500   (#EFE5D1)\ncolour/bg/secondary:      colour/cream/100   (#FAF6F0)\ncolour/bg/tertiary:       colour/cream/200   (#F7F2E8)\ncolour/bg/canvas:         colour/neutral/0   (#FFFFFF)\ncolour/bg/overlay-dark:   colour/neutral/1000 with 24% opacity\n```\n\n### Text\n\n```\ncolour/text/primary:      colour/neutral/600  (#999591)\ncolour/text/secondary:    colour/neutral/500  (#A9A5A1)\ncolour/text/tertiary:     colour/neutral/400  (#B9B5B1)\ncolour/text/inverse:      colour/neutral/0    (#FFFFFF)\ncolour/text/disabled:     colour/neutral/200  (#D9D5D1)\n```\n\n### Border\n\n```\ncolour/border/light:      colour/neutral/100  (#E9E5E1)\ncolour/border/medium:     colour/neutral/200  (#D9D5D1)\ncolour/border/strong:     colour/neutral/600  (#999591)\ncolour/border/focus:      colour/neutral/800  (#494541)\n```\n\n### Icon\n\n```\ncolour/icon/primary:      colour/neutral/800  (#494541)\ncolour/icon/secondary:    colour/neutral/600  (#999591)\ncolour/icon/disabled:     colour/neutral/200  (#D9D5D1)\ncolour/icon/inverse:      colour/neutral/0    (#FFFFFF)\n```\n\n### Status & Interaction\n\n```\ncolour/active:            colour/neutral/900  (#292521)\ncolour/hover:             colour/cream/400    (#F1E9D9)\ncolour/focus-ring:        colour/neutral/800  (#494541)\ncolour/alert:             colour/status/alert (#FF6B35)\ncolour/success:           (TBD)\ncolour/warning:           (TBD)\ncolour/info:              (TBD)\n```\n\n---\n\n## Typography Tokens\n\n### Font Family\n```\ntype/family:             PP Grotesk Mono\ntype/family/fallback:    monospace\n```\n\n### Font Sizes & Line Heights\n\n```\ntype/display/size:       48px\ntype/display/lineheight: 56px\ntype/display/weight:     bold\n\ntype/h1/size:            40px\ntype/h1/lineheight:      48px\ntype/h1/weight:          bold\n\ntype/h2/size:            32px\ntype/h2/lineheight:      40px\ntype/h2/weight:          bold\n\ntype/h3/size:            28px\ntype/h3/lineheight:      36px\ntype/h3/weight:          bold\n\ntype/h4/size:            24px\ntype/h4/lineheight:      32px\ntype/h4/weight:          bold\n\ntype/body-large/size:    20px\ntype/body-large/lineheight: 28px\ntype/body-large/weight:  regular\n\ntype/body/size:          16px\ntype/body/lineheight:    24px\ntype/body/weight:        regular\n\ntype/caption/size:       12px (deprecated — use type/body with neutral/400)\ntype/caption/lineheight: 16px\ntype/caption/weight:     light\n```\n\n### Weight Tokens\n\n```\ntype/weight/light:       300\ntype/weight/regular:     400\ntype/weight/bold:        700\n```\n\n---\n\n## Spacing Tokens\n\n```\nspace/1:   4px\nspace/2:   8px\nspace/3:   12px\nspace/4:   16px\nspace/5:   20px\nspace/6:   24px\nspace/7:   32px\nspace/8:   40px\nspace/9:   48px\nspace/10:  64px\n```\n\n---\n\n## Elevation Tokens\n\n```\nshadow/small:  0px 4px 8px rgba(0, 0, 0, 0.24)\n```\n\n---\n\n## Radius Tokens\n\n```\nradius/none:  0px\n```\n\n---\n\n## Component-Specific Tokens\n\n### Buttons\n\n#### Icon Button\n```\nbutton/icon/size:           40px × 40px\nbutton/icon/background:     colour/bg/primary\nbutton/icon/background-hover: colour/hover\nbutton/icon/icon-colour:    colour/icon/primary\nbutton/icon/padding:        0 (square)\nbutton/icon/radius:         radius/none\n```\n\n#### Text Button / Link\n```\nbutton/text/font:           type/body\nbutton/text/colour:         colour/text/primary\nbutton/text/colour-hover:   colour/text/primary (underline or bg hint)\nbutton/text/background:     colour/bg/primary\n```\n\n### Inputs\n\n#### Dropdown\n```\ninput/dropdown/height:      40px\ninput/dropdown/padding:     space/4 (horizontal)\ninput/dropdown/font:        type/body\ninput/dropdown/background:  colour/bg/primary\ninput/dropdown/border:      colour/border/medium\ninput/dropdown/text-colour: colour/text/primary\ninput/dropdown/icon-colour: colour/icon/primary\ninput/dropdown/radius:      radius/none\n```\n\n#### Calendar / Date Picker\n```\ninput/calendar/cell-size:       40px (minimum)\ninput/calendar/cell-padding:    space/2\ninput/calendar/active-bg:       colour/active\ninput/calendar/active-text:     colour/text/inverse\ninput/calendar/inactive-bg:     colour/bg/primary\ninput/calendar/inactive-text:   colour/text/primary\ninput/calendar/font:            type/body\ninput/calendar/header-font:     type/h4\n```\n\n#### Location Picker\n```\ninput/location/item-height:     44px (minimum touch target)\ninput/location/item-padding:    space/4\ninput/location/font:            type/body\ninput/location/background:      colour/bg/primary\ninput/location/text-colour:     colour/text/primary\ninput/location/arrow-colour:    colour/icon/secondary\n```\n\n### Panels\n\n#### Panel Header\n```\npanel/header/background:   colour/bg/tertiary\npanel/header/height:       48px (minimum)\npanel/header/padding:      space/4\npanel/header/font:         type/h4 or type/body\npanel/header/text-colour:  colour/text/primary\npanel/header/border:       colour/border/light (bottom)\npanel/header/icon-colour:  colour/icon/primary\npanel/header/close-size:   24px\n```\n\n#### Panel Body\n```\npanel/body/background:     colour/bg/primary\npanel/body/padding:        space/6\npanel/body/font:           type/body\npanel/body/text-colour:    colour/text/primary\npanel/body/shadow:         shadow/small\n```\n\n#### List Item\n```\nlist/item/height:          44px (minimum)\nlist/item/padding:         space/4\nlist/item/font:            type/body\nlist/item/background:      colour/bg/primary\nlist/item/background-hover: colour/hover\nlist/item/text-colour:     colour/text/primary\nlist/item/border:          colour/border/light (bottom)\nlist/item/arrow-colour:    colour/icon/secondary\nlist/item/radius:          radius/none\n```\n\n### Indicators\n\n#### Notification Dot\n```\nindicator/dot/size:        8px\nindicator/dot/background:  colour/alert\nindicator/dot/position:    top-right (absolute, -2px offset)\n```\n\n#### Badge\n```\nindicator/badge/min-width: 28px\nindicator/badge/height:    28px\nindicator/badge/padding:   space/2 (horizontal)\nindicator/badge/font:      type/body\nindicator/badge/font-weight: bold\nindicator/badge/background: colour/active\nindicator/badge/text-colour: colour/text/inverse\nindicator/badge/radius:    radius/none\n```\n\n---\n\n## Component-Agnostic Usage\n\nFor any component not explicitly listed above:\n1. Use `colour/bg/primary` for primary backgrounds\n2. Use `colour/text/primary` for primary text\n3. Use `colour/border/medium` for borders\n4. Use `space/4` for standard padding, `space/6` for generous padding\n5. Use `shadow/small` for elevated surfaces\n6. Use `radius/none` for all corners\n7. Use `type/body` for standard UI copy, `type/h4` for section headers\n8. Apply `colour/active` (neutral/900) for selected/active states\n9. Respect minimum touch target size of 44×44px for interactive elements\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20385":{"type":"FRAME","id":"78:20385","name":"4","absoluteBoundingBox":{"x":48488.0,"y":25308.0,"width":1920.0,"height":8752.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":25308.0,"width":1920.0,"height":8752.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,25152.0]],"size":{"x":1920.0,"y":8752.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20386","78:20387"]},"78:20386":{"type":"TEXT","id":"78:20386","name":"PATTERNS.MD","absoluteBoundingBox":{"x":48508.0,"y":25364.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48514.46484375,"y":25389.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PATTERNS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2665":{"type":"TEXT","id":"34:2665","name":"Product definition","absoluteBoundingBox":{"x":48124.0,"y":467.932037353516,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48125.6171875,"y":473.588043212891,"width":165.390625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Product definition","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20332":{"type":"TEXT","id":"78:20332","name":"# Augur Design System ## Overview Augur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering. **Typeface:** PP Grotesk Mono (Light, Regular, Bold) **Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius **Shadow:** Single elevation style for raised surfaces **Grid:** 8px base unit --- ## Colour System ### Primitives #### Cream ramp Used as primary background for UI surfaces, panels, secondary navigation. | Stop | Hex | Use | |---|---|---| | 50 | `#FCFBF7` | Lightest surface, hover states | | 100 | `#FAF6F0` | Secondary panel backgrounds | | 200 | `#F7F2E8` | Secondary nav bar, panel headers | | 300 | `#F4EEE0` | Subtle dividers, disabled states | | 400 | `#F1E9D9` | List item hover | | 500 | `#EFE5D1` | Baseline panel background | | 600 | `#ECE1C9` | Accent/selection tint | | 700 | `#E9DCC2` | Medium panel contrast | | 800 | `#E7D8BA` | Deep panel background, dark hover | | 900 | `#D9C5A0` | — | #### Neutral ramp Used for text, borders, icons, and status indicators. | Stop | Hex | Use | |---|---|---| | 0 | `#FFFFFF` | White backgrounds, icon fill on dark | | 50 | `#F9F5F1` | Very light backgrounds | | 100 | `#E9E5E1` | Light borders | | 200 | `#D9D5D1` | Subtle borders, disabled text | | 300 | `#C9C5C1` | Light dividers | | 400 | `#B9B5B1` | Tertiary text, secondary icons | | 500 | `#A9A5A1` | Secondary text | | 600 | `#999591` | Primary text | | 700 | `#898581` | Headings, emphasis | | 800 | `#494541` | Strong emphasis, icon fill | | 900 | `#292521` | Dark UI elements, active states | | 1000 | `#000000` | Black backgrounds, peak contrast | ### Semantics | Token | Primitive | Use | |---|---|---| | `colour/bg/primary` | `cream/500` | Panel backgrounds | | `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds | | `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers | | `colour/bg/canvas` | `white` | Main 3D canvas | | `colour/text/primary` | `neutral/600` | Body text, labels | | `colour/text/secondary` | `neutral/500` | Metadata, hints | | `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised | | `colour/text/inverse` | `neutral/0` | Text on dark backgrounds | | `colour/border/light` | `neutral/100` | Subtle dividers | | `colour/border/medium` | `neutral/200` | Standard borders | | `colour/border/strong` | `neutral/600` | Emphasis borders, outlines | | `colour/icon/primary` | `neutral/800` | Standard icons | | `colour/icon/secondary` | `neutral/600` | Secondary icons | | `colour/icon/disabled` | `neutral/200` | Disabled icons | | `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) | | `colour/active` | `neutral/900` | Selected states, active indicators | --- ## Typography **Font:** PP Grotesk Mono, monospace | Token | Size | Line height | Weight | Use | |---|---|---|---|---| | `type/display` | 48px | 56px | Bold | Hero headings, page titles | | `type/h1` | 40px | 48px | Bold | Section headings | | `type/h2` | 32px | 40px | Bold | Subsection headings | | `type/h3` | 28px | 36px | Bold | Panel titles, card headings | | `type/h4` | 24px | 32px | Bold | Secondary headings, labels | | `type/body-large` | 20px | 28px | Regular | Panel introductions, large body | | `type/body` | 16px | 24px | Regular | Standard body text, UI copy | ### Weight modifiers - Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`) - Regular: Default weight for body, labels, and copy - Bold: Headings, emphasis, CTA text ### Line length Monospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density. --- ## Spacing **Base unit:** 8px | Token | Value | Use | |---|---|---| | `space/1` | 4px | Tight gaps, icon-to-label spacing | | `space/2` | 8px | Component padding, fine gutters | | `space/3` | 12px | Internal spacing | | `space/4` | 16px | Standard padding, list gaps | | `space/5` | 20px | Generous padding | | `space/6` | 24px | Section padding, panel margins | | `space/7` | 32px | Major spacing, dividers | | `space/8` | 40px | Large gaps, section breaks | | `space/9` | 48px | Major layout spacing | | `space/10` | 64px | Canvas margins, page-level spacing | --- ## Elevation **Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns). | Token | Value | Use | |---|---|---| | `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards | --- ## Radius **All corners are square.** No border radius applied. | Token | Value | |---|---| | `radius/none` | 0px | --- ## Component Inventory ### Buttons - **Icon button** — Square, 40×40px, dark icon on cream background, no border - **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels - **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive ### Inputs - **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text - **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900` - **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows ### Panels & Modals - **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional - **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards - **Panel footer** — Optional, links or actions with arrow indicators - **Drawer shadow** — Applied to all raised panels ### Lists & Tables - **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`) - **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream - **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation ### Cards - **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows - **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links - **Data detail card** — Bar chart with axis labels, metadata footer ### Indicators - **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel - **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\" - **Active indicator** — `neutral/900` background or fill for selected/active states ### Navigation - **Top bar** — White background, logo (left), global filters (centre), user controls (right) - **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy - **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset) - **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body` --- ## Motion None specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close). --- ## Accessibility - **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text) - **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter - **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text - **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing - **Monospace typography:** Line length kept under 70 characters to maintain readability --- ## Usage Guidelines ### Tone Copy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity. ### Data presentation Prefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail. ### Panel interaction Panels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators. ### Colour application Cream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps. ### Monospace decisions All UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.","absoluteBoundingBox":{"x":54316.0,"y":719.932006835938,"width":304.0,"height":10704.0},"isolatedAbsoluteRenderBounds":{"x":54314.16015625,"y":725.588012695312,"width":301.5546875,"height":10667.5361328125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,128.0]],"size":{"x":304.0,"y":10704.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design System\n\n## Overview\n\nAugur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering.\n\n**Typeface:** PP Grotesk Mono (Light, Regular, Bold)  \n**Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius  \n**Shadow:** Single elevation style for raised surfaces  \n**Grid:** 8px base unit\n\n---\n\n## Colour System\n\n### Primitives\n\n#### Cream ramp\nUsed as primary background for UI surfaces, panels, secondary navigation.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 50 | `#FCFBF7` | Lightest surface, hover states |\n| 100 | `#FAF6F0` | Secondary panel backgrounds |\n| 200 | `#F7F2E8` | Secondary nav bar, panel headers |\n| 300 | `#F4EEE0` | Subtle dividers, disabled states |\n| 400 | `#F1E9D9` | List item hover |\n| 500 | `#EFE5D1` | Baseline panel background |\n| 600 | `#ECE1C9` | Accent/selection tint |\n| 700 | `#E9DCC2` | Medium panel contrast |\n| 800 | `#E7D8BA` | Deep panel background, dark hover |\n| 900 | `#D9C5A0` | — |\n\n#### Neutral ramp\nUsed for text, borders, icons, and status indicators.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 0 | `#FFFFFF` | White backgrounds, icon fill on dark |\n| 50 | `#F9F5F1` | Very light backgrounds |\n| 100 | `#E9E5E1` | Light borders |\n| 200 | `#D9D5D1` | Subtle borders, disabled text |\n| 300 | `#C9C5C1` | Light dividers |\n| 400 | `#B9B5B1` | Tertiary text, secondary icons |\n| 500 | `#A9A5A1` | Secondary text |\n| 600 | `#999591` | Primary text |\n| 700 | `#898581` | Headings, emphasis |\n| 800 | `#494541` | Strong emphasis, icon fill |\n| 900 | `#292521` | Dark UI elements, active states |\n| 1000 | `#000000` | Black backgrounds, peak contrast |\n\n### Semantics\n\n| Token | Primitive | Use |\n|---|---|---|\n| `colour/bg/primary` | `cream/500` | Panel backgrounds |\n| `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds |\n| `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers |\n| `colour/bg/canvas` | `white` | Main 3D canvas |\n| `colour/text/primary` | `neutral/600` | Body text, labels |\n| `colour/text/secondary` | `neutral/500` | Metadata, hints |\n| `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised |\n| `colour/text/inverse` | `neutral/0` | Text on dark backgrounds |\n| `colour/border/light` | `neutral/100` | Subtle dividers |\n| `colour/border/medium` | `neutral/200` | Standard borders |\n| `colour/border/strong` | `neutral/600` | Emphasis borders, outlines |\n| `colour/icon/primary` | `neutral/800` | Standard icons |\n| `colour/icon/secondary` | `neutral/600` | Secondary icons |\n| `colour/icon/disabled` | `neutral/200` | Disabled icons |\n| `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) |\n| `colour/active` | `neutral/900` | Selected states, active indicators |\n\n---\n\n## Typography\n\n**Font:** PP Grotesk Mono, monospace\n\n| Token | Size | Line height | Weight | Use |\n|---|---|---|---|---|\n| `type/display` | 48px | 56px | Bold | Hero headings, page titles |\n| `type/h1` | 40px | 48px | Bold | Section headings |\n| `type/h2` | 32px | 40px | Bold | Subsection headings |\n| `type/h3` | 28px | 36px | Bold | Panel titles, card headings |\n| `type/h4` | 24px | 32px | Bold | Secondary headings, labels |\n| `type/body-large` | 20px | 28px | Regular | Panel introductions, large body |\n| `type/body` | 16px | 24px | Regular | Standard body text, UI copy |\n\n### Weight modifiers\n- Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`)\n- Regular: Default weight for body, labels, and copy\n- Bold: Headings, emphasis, CTA text\n\n### Line length\nMonospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density.\n\n---\n\n## Spacing\n\n**Base unit:** 8px\n\n| Token | Value | Use |\n|---|---|---|\n| `space/1` | 4px | Tight gaps, icon-to-label spacing |\n| `space/2` | 8px | Component padding, fine gutters |\n| `space/3` | 12px | Internal spacing |\n| `space/4` | 16px | Standard padding, list gaps |\n| `space/5` | 20px | Generous padding |\n| `space/6` | 24px | Section padding, panel margins |\n| `space/7` | 32px | Major spacing, dividers |\n| `space/8` | 40px | Large gaps, section breaks |\n| `space/9` | 48px | Major layout spacing |\n| `space/10` | 64px | Canvas margins, page-level spacing |\n\n---\n\n## Elevation\n\n**Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns).\n\n| Token | Value | Use |\n|---|---|---|\n| `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards |\n\n---\n\n## Radius\n\n**All corners are square.** No border radius applied.\n\n| Token | Value |\n|---|---|\n| `radius/none` | 0px |\n\n---\n\n## Component Inventory\n\n### Buttons\n- **Icon button** — Square, 40×40px, dark icon on cream background, no border\n- **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels\n- **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive\n\n### Inputs\n- **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text\n- **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900`\n- **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows\n\n### Panels & Modals\n- **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional\n- **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards\n- **Panel footer** — Optional, links or actions with arrow indicators\n- **Drawer shadow** — Applied to all raised panels\n\n### Lists & Tables\n- **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`)\n- **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream\n- **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation\n\n### Cards\n- **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows\n- **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links\n- **Data detail card** — Bar chart with axis labels, metadata footer\n\n### Indicators\n- **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel\n- **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\"\n- **Active indicator** — `neutral/900` background or fill for selected/active states\n\n### Navigation\n- **Top bar** — White background, logo (left), global filters (centre), user controls (right)\n- **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy\n- **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset)\n- **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body`\n\n---\n\n## Motion\n\nNone specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close).\n\n---\n\n## Accessibility\n\n- **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text)\n- **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter\n- **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text\n- **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing\n- **Monospace typography:** Line length kept under 70 characters to maintain readability\n\n---\n\n## Usage Guidelines\n\n### Tone\nCopy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity.\n\n### Data presentation\nPrefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail.\n\n### Panel interaction\nPanels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators.\n\n### Colour application\nCream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps.\n\n### Monospace decisions\nAll UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20362":{"type":"FRAME","id":"78:20362","name":"3","absoluteBoundingBox":{"x":48488.0,"y":13692.0,"width":1920.0,"height":11560.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":13692.0,"width":1920.0,"height":11560.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,13536.0]],"size":{"x":1920.0,"y":11560.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20363","78:20364"]},"78:20364":{"type":"TEXT","id":"78:20364","name":"# Augur Components ## Overview This document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target. --- ## Buttons ### Icon Button **Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause). **Size:** 40×40px (icon 20×20px centered) **Padding:** None (icon-only, square aspect) **Background:** `colour/bg/primary` **Icon colour:** `colour/icon/primary` **Border:** None **Radius:** `radius/none` **States:** - **Default:** Background `colour/bg/primary`, icon `colour/icon/primary` - **Hover:** Background `colour/hover` (cream/400), icon unchanged - **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white) - **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled` - **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset **Variants:** - **Icon only** (standard) — as above - **With badge** — small red dot (8px) top-right corner for notifications **Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view --- ### Text Button / Link **Purpose:** Navigation and secondary actions within panels and lists. **Typography:** `type/body`, regular weight **Colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height) **Border:** None **Radius:** `radius/none` **States:** - **Default:** Text `colour/text/primary`, background transparent - **Hover:** Background `colour/hover`, text unchanged - **Active/selected:** Text `colour/active`, background `colour/bg/tertiary` - **Disabled:** Text `colour/text/disabled`, background transparent - **Focus:** Underline in `colour/focus-ring` **Variants:** - **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2` - **Inline** — no padding, appears in running text - **Full-width** — stretches to container width, text left-aligned **Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\" --- ## Inputs ### Dropdown / Select **Purpose:** Choose from predefined options (location, date, time, filter). **Height:** 40px **Padding:** `space/4` horizontal, `space/2` vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/medium` **Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary` **Radius:** `radius/none` **States:** - **Default:** As above - **Hover:** Background `colour/hover` - **Focus:** Border `colour/focus-ring`, outline 2px offset - **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation) - **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled` **Interaction:** - Click to open dropdown menu - Menu items: 40px height, `type/body`, left-aligned with `space/4` padding - Selected item: Background `colour/active`, text `colour/text/inverse` - Unselected items: Background `colour/bg/primary`, text `colour/text/primary` - Keyboard: Arrow keys to navigate, Enter to select, Escape to close **Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\" --- ### Calendar / Date Picker **Purpose:** Select a date or time period (year, month, week, day, live). **Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day). **Period tabs:** - Horizontal layout, `space/2` gap - Tab size: min 48×32px - Typography: `type/body`, bold - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` (neutral/900) - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` **Grid cells:** - Size: 40×40px minimum - Typography: `type/body`, regular - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` - Border: 1px `colour/border/light` between cells - Today indicator: Underline in `colour/active` (if applicable) **Interaction:** - Click period tab to switch grid view - Click cell to select - Keyboard: Arrow keys to navigate, Enter to select, Escape to close - LIVE mode: shows real-time timestamp **Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8 --- ### Location Picker **Purpose:** Hierarchical geographic navigation (Country → Region → Area). **Height:** Full panel, scrollable if >6 items **Item height:** 44px minimum **Padding:** `space/4` per item **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` between items **Arrow:** Right-aligned, `colour/icon/secondary` **Layout:** - Header: Back arrow (24×24px, `colour/icon/primary`), title, close X - Body: List of items, each with label and arrow - Footer: Optional breadcrumb or current selection **Interaction:** - Click item to drill down (arrow navigates to sub-level) - Click back arrow to navigate up - Click close X to dismiss - Keyboard: Arrow keys, Enter to select/navigate, Escape to close **Examples:** \"England → London\", \"England → South East\", etc. --- ## Panels & Modals ### Panel Header **Purpose:** Title, navigation, and close controls for side panels. **Height:** 48px minimum **Padding:** `space/4` horizontal and vertical **Background:** `colour/bg/tertiary` (cream/200) **Border:** 1px `colour/border/light` bottom **Typography:** `type/h4` for major panels, `type/body` for secondary **Text colour:** `colour/text/primary` **Layout:** Flex, space-between - **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`) - **Centre:** Title / label, left-aligned - **Right:** Close button (X, 24×24px icon button) **Interaction:** - Back arrow navigates to previous state - Close X dismisses panel **Examples:** - \"Customer numbers\" (data list header) - \"Selected event\" (detail header) - \"Notifications (3)\" (notification drawer header) --- ### Panel Body **Purpose:** Main content area for panels. **Background:** `colour/bg/primary` (cream/500) **Padding:** `space/6` (24px) all sides **Typography:** `type/body` for text, `type/h4` for section headers **Text colour:** `colour/text/primary` **Border:** `shadow/small` (raised effect) **Max width:** 320px (typical panel width) **Scrollable:** Yes, if content exceeds viewport height **Content types:** - Section headers (`type/h4`, margin-top `space/6` except first) - List items (with or without images/avatars) - Detail cards (image, text, metadata) - Text blocks (descriptions, AI-generated summaries) - Charts (bar charts with axis labels) **Interaction:** - Click list items or links to navigate or open detail panels - Panels can stack (e.g. Customer numbers → detail drawer) --- ## Lists & Tables ### List Item **Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications). **Height:** 44px minimum (text only), 64px+ (with images) **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Background (hover):** `colour/hover` (cream/400) **Border:** 1px `colour/border/light` bottom **Radius:** `radius/none` **Anatomy:** - **Left:** Label or label + secondary text (metadata) - **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon **Variants:** - **Simple label** — single line, bold - **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`) - **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow - **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below **Interaction:** - Click to navigate to detail or drill down - Optional: swipe to reveal actions (secondary interaction) **Examples:** - \"Numbers\" with arrow (data category) - \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event) - Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person) --- ### Notification List Item **Purpose:** High-priority alert display with time, status, and action. **Height:** 80px minimum **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp) **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` bottom **Avatar:** Circular, 40×40px, left-aligned **Anatomy:** - **Left:** Avatar (40×40px, square corners) - **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge - **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge) **Badge variants:** - Notification dot (8px orange circle for urgent alerts) - Percentage badge (circular, dark background, white bold text, e.g. \"92%\") - Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\") --- ## Cards ### Event Detail Card **Purpose:** Full details for a selected incident or event. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing 2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge 3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description) 4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\" 5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text) 6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4` **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) **Interaction:** - Click action links to drill down or open related panels - Avatar click: open person detail panel --- ### Person Detail Card **Purpose:** Individual profile with summary and related actions. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Avatar** — Large circular, 120×120px, square corners, centred 2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description) 3. **Location** — `type/body` with `colour/text/secondary` 4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) --- ### Data Detail Card **Purpose:** Visualisation and metrics display. **Layout:** Vertical stack **Width:** Variable (panel or embedded in dashboard) **Padding:** `space/6` all sides **Content structure:** 1. **Header** — `type/h4` title, e.g. \"Customer numbers\" 2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical 3. **Footer** — Metadata, e.g. date range, data source **Chart style:** - Bars: Neutral grey (`colour/neutral/600` or darker) - Background: Transparent or very light (`colour/bg/primary`) - Axis labels: `type/body` with `colour/text/secondary` - Grid: Optional light dividers (`colour/border/light`) --- ## Navigation ### Top Bar **Purpose:** Global application header with logo, filters, and user controls. **Height:** 48px **Padding:** `space/4` horizontal **Background:** `colour/neutral/0` (white) **Border:** 1px `colour/border/light` bottom **Layout:** Flex, space-between **Sections:** - **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned) - **Centre:** Global filters (Dropdowns for Where and When) - **Right:** Notification icon (with badge) + User avatar icon button **Interaction:** - Click filters to open pickers - Click notification icon to open notification drawer - Click avatar to open user menu --- ### Secondary Navigation Bar **Purpose:** View/mode selector (Map, Data, Events, People, etc.). **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/tertiary` (cream/200) **Border:** None **Layout:** Flex, space-between or space-around **Tab anatomy:** - Height: 40px - Icon: 20×20px, left-aligned or centred - Label: `type/body`, left-aligned or centred - Background: `colour/bg/tertiary` (inactive) - Background: `colour/active` (active tab) - Text: `colour/text/primary` (inactive), `colour/text/inverse` (active) - Padding: `space/2` to `space/4` **Interaction:** - Click tab to switch view - Active tab indicated by dark background - Keyboard: Left/Right arrow keys to navigate, Enter to select **Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon) --- ### Floating Controls (Canvas) **Purpose:** View manipulation and playback controls positioned near 3D canvas. **Position:** Bottom-right, 16px offset from edges **Layout:** Vertical stack, `space/2` gap **Controls:** 1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary` 2. **Zoom controls** — Icon button (+ and -), stacked vertically 3. **Reset/recenter** — Icon button (refresh icon) **Spacing:** `space/2` (8px) between buttons **Size:** 40×40px per button **Interaction:** Click to activate function --- ### Timeline / Scrubber Bar **Purpose:** Temporal navigation and playback. **Position:** Bottom of viewport **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/primary` (cream/500) **Border:** 1px `colour/border/light` top **Layout:** Flex, space-between **Sections:** - **Left:** Play/pause button (icon button, 32×32px) - **Centre:** Scrubber track (draggable timeline, shows current position) - **Right:** Timecode readout (`type/body`, e.g. \"23:59\") **Interaction:** - Click play/pause to control playback - Drag scrubber to seek to time - Timecode updates in real-time --- ## Accessibility Notes ### Keyboard Navigation - All buttons and links are focusable (Tab key) - Icon buttons include visible focus ring (2px outline in `colour/focus-ring`) - Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter - Escape closes open modals and pickers ### ARIA Labels - Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\") - Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded` - Panels include semantic heading tags (`<h2>`, `<h3>`) - List items include `role=\"button\"` if clickable ### Touch Targets - Minimum 44×44px for all interactive elements - Icon buttons: 40×40px (meets 44px height with padding) - List items: 44px minimum height - Panel close button: 24×24px icon, but padded to 44×44px touch area ### Colour Contrast - All text: 4.5:1 ratio minimum (primary text on primary background) - Large text: 3:1 ratio acceptable - Icons: 3:1 ratio minimum against background - Alert colour (orange): tested against background for WCAG AA ### Screen Reader Support - Images include alt text (hero images, avatars) - Panels marked with semantic headings - Status indicators (badges, dots) include aria-live regions for updates - Tables include semantic `<th>` and `<td>` elements ### Monospace Considerations - Line length kept under 70 characters (readability) - Letter spacing adequate (monospace is denser than humanist sans) - Avoid all-caps for extended text (lowercase/title case preferred)","absoluteBoundingBox":{"x":48508.0,"y":13868.0,"width":1880.0,"height":11328.0},"isolatedAbsoluteRenderBounds":{"x":48508.71875,"y":13873.8798828125,"width":1852.49609375,"height":11293.8408203125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":11328.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Components\n\n## Overview\n\nThis document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target.\n\n---\n\n## Buttons\n\n### Icon Button\n\n**Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause).\n\n**Size:** 40×40px (icon 20×20px centered)  \n**Padding:** None (icon-only, square aspect)  \n**Background:** `colour/bg/primary`  \n**Icon colour:** `colour/icon/primary`  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Background `colour/bg/primary`, icon `colour/icon/primary`\n- **Hover:** Background `colour/hover` (cream/400), icon unchanged\n- **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white)\n- **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled`\n- **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset\n\n**Variants:**\n- **Icon only** (standard) — as above\n- **With badge** — small red dot (8px) top-right corner for notifications\n\n**Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view\n\n---\n\n### Text Button / Link\n\n**Purpose:** Navigation and secondary actions within panels and lists.\n\n**Typography:** `type/body`, regular weight  \n**Colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height)  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Text `colour/text/primary`, background transparent\n- **Hover:** Background `colour/hover`, text unchanged\n- **Active/selected:** Text `colour/active`, background `colour/bg/tertiary`\n- **Disabled:** Text `colour/text/disabled`, background transparent\n- **Focus:** Underline in `colour/focus-ring`\n\n**Variants:**\n- **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2`\n- **Inline** — no padding, appears in running text\n- **Full-width** — stretches to container width, text left-aligned\n\n**Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\"\n\n---\n\n## Inputs\n\n### Dropdown / Select\n\n**Purpose:** Choose from predefined options (location, date, time, filter).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal, `space/2` vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/medium`  \n**Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary`  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** As above\n- **Hover:** Background `colour/hover`\n- **Focus:** Border `colour/focus-ring`, outline 2px offset\n- **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation)\n- **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled`\n\n**Interaction:**\n- Click to open dropdown menu\n- Menu items: 40px height, `type/body`, left-aligned with `space/4` padding\n- Selected item: Background `colour/active`, text `colour/text/inverse`\n- Unselected items: Background `colour/bg/primary`, text `colour/text/primary`\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n\n**Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\"\n\n---\n\n### Calendar / Date Picker\n\n**Purpose:** Select a date or time period (year, month, week, day, live).\n\n**Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day).\n\n**Period tabs:**\n- Horizontal layout, `space/2` gap\n- Tab size: min 48×32px\n- Typography: `type/body`, bold\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active` (neutral/900)\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n\n**Grid cells:**\n- Size: 40×40px minimum\n- Typography: `type/body`, regular\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active`\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n- Border: 1px `colour/border/light` between cells\n- Today indicator: Underline in `colour/active` (if applicable)\n\n**Interaction:**\n- Click period tab to switch grid view\n- Click cell to select\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n- LIVE mode: shows real-time timestamp\n\n**Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8\n\n---\n\n### Location Picker\n\n**Purpose:** Hierarchical geographic navigation (Country → Region → Area).\n\n**Height:** Full panel, scrollable if >6 items  \n**Item height:** 44px minimum  \n**Padding:** `space/4` per item  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` between items  \n**Arrow:** Right-aligned, `colour/icon/secondary`\n\n**Layout:**\n- Header: Back arrow (24×24px, `colour/icon/primary`), title, close X\n- Body: List of items, each with label and arrow\n- Footer: Optional breadcrumb or current selection\n\n**Interaction:**\n- Click item to drill down (arrow navigates to sub-level)\n- Click back arrow to navigate up\n- Click close X to dismiss\n- Keyboard: Arrow keys, Enter to select/navigate, Escape to close\n\n**Examples:** \"England → London\", \"England → South East\", etc.\n\n---\n\n## Panels & Modals\n\n### Panel Header\n\n**Purpose:** Title, navigation, and close controls for side panels.\n\n**Height:** 48px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** 1px `colour/border/light` bottom  \n**Typography:** `type/h4` for major panels, `type/body` for secondary  \n**Text colour:** `colour/text/primary`\n\n**Layout:** Flex, space-between\n- **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`)\n- **Centre:** Title / label, left-aligned\n- **Right:** Close button (X, 24×24px icon button)\n\n**Interaction:**\n- Back arrow navigates to previous state\n- Close X dismisses panel\n\n**Examples:**\n- \"Customer numbers\" (data list header)\n- \"Selected event\" (detail header)\n- \"Notifications (3)\" (notification drawer header)\n\n---\n\n### Panel Body\n\n**Purpose:** Main content area for panels.\n\n**Background:** `colour/bg/primary` (cream/500)  \n**Padding:** `space/6` (24px) all sides  \n**Typography:** `type/body` for text, `type/h4` for section headers  \n**Text colour:** `colour/text/primary`  \n**Border:** `shadow/small` (raised effect)  \n**Max width:** 320px (typical panel width)  \n**Scrollable:** Yes, if content exceeds viewport height\n\n**Content types:**\n- Section headers (`type/h4`, margin-top `space/6` except first)\n- List items (with or without images/avatars)\n- Detail cards (image, text, metadata)\n- Text blocks (descriptions, AI-generated summaries)\n- Charts (bar charts with axis labels)\n\n**Interaction:**\n- Click list items or links to navigate or open detail panels\n- Panels can stack (e.g. Customer numbers → detail drawer)\n\n---\n\n## Lists & Tables\n\n### List Item\n\n**Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications).\n\n**Height:** 44px minimum (text only), 64px+ (with images)  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Background (hover):** `colour/hover` (cream/400)  \n**Border:** 1px `colour/border/light` bottom  \n**Radius:** `radius/none`\n\n**Anatomy:**\n- **Left:** Label or label + secondary text (metadata)\n- **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon\n\n**Variants:**\n- **Simple label** — single line, bold\n- **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`)\n- **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow\n- **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below\n\n**Interaction:**\n- Click to navigate to detail or drill down\n- Optional: swipe to reveal actions (secondary interaction)\n\n**Examples:**\n- \"Numbers\" with arrow (data category)\n- \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event)\n- Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person)\n\n---\n\n### Notification List Item\n\n**Purpose:** High-priority alert display with time, status, and action.\n\n**Height:** 80px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp)  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` bottom  \n**Avatar:** Circular, 40×40px, left-aligned\n\n**Anatomy:**\n- **Left:** Avatar (40×40px, square corners)\n- **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge\n- **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge)\n\n**Badge variants:**\n- Notification dot (8px orange circle for urgent alerts)\n- Percentage badge (circular, dark background, white bold text, e.g. \"92%\")\n- Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\")\n\n---\n\n## Cards\n\n### Event Detail Card\n\n**Purpose:** Full details for a selected incident or event.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing\n2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge\n3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description)\n4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\"\n5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text)\n6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4`\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n**Interaction:**\n- Click action links to drill down or open related panels\n- Avatar click: open person detail panel\n\n---\n\n### Person Detail Card\n\n**Purpose:** Individual profile with summary and related actions.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Avatar** — Large circular, 120×120px, square corners, centred\n2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description)\n3. **Location** — `type/body` with `colour/text/secondary`\n4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n---\n\n### Data Detail Card\n\n**Purpose:** Visualisation and metrics display.\n\n**Layout:** Vertical stack  \n**Width:** Variable (panel or embedded in dashboard)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Header** — `type/h4` title, e.g. \"Customer numbers\"\n2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical\n3. **Footer** — Metadata, e.g. date range, data source\n\n**Chart style:**\n- Bars: Neutral grey (`colour/neutral/600` or darker)\n- Background: Transparent or very light (`colour/bg/primary`)\n- Axis labels: `type/body` with `colour/text/secondary`\n- Grid: Optional light dividers (`colour/border/light`)\n\n---\n\n## Navigation\n\n### Top Bar\n\n**Purpose:** Global application header with logo, filters, and user controls.\n\n**Height:** 48px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/neutral/0` (white)  \n**Border:** 1px `colour/border/light` bottom  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned)\n- **Centre:** Global filters (Dropdowns for Where and When)\n- **Right:** Notification icon (with badge) + User avatar icon button\n\n**Interaction:**\n- Click filters to open pickers\n- Click notification icon to open notification drawer\n- Click avatar to open user menu\n\n---\n\n### Secondary Navigation Bar\n\n**Purpose:** View/mode selector (Map, Data, Events, People, etc.).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** None  \n**Layout:** Flex, space-between or space-around\n\n**Tab anatomy:**\n- Height: 40px\n- Icon: 20×20px, left-aligned or centred\n- Label: `type/body`, left-aligned or centred\n- Background: `colour/bg/tertiary` (inactive)\n- Background: `colour/active` (active tab)\n- Text: `colour/text/primary` (inactive), `colour/text/inverse` (active)\n- Padding: `space/2` to `space/4`\n\n**Interaction:**\n- Click tab to switch view\n- Active tab indicated by dark background\n- Keyboard: Left/Right arrow keys to navigate, Enter to select\n\n**Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon)\n\n---\n\n### Floating Controls (Canvas)\n\n**Purpose:** View manipulation and playback controls positioned near 3D canvas.\n\n**Position:** Bottom-right, 16px offset from edges  \n**Layout:** Vertical stack, `space/2` gap\n\n**Controls:**\n1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary`\n2. **Zoom controls** — Icon button (+ and -), stacked vertically\n3. **Reset/recenter** — Icon button (refresh icon)\n\n**Spacing:** `space/2` (8px) between buttons  \n**Size:** 40×40px per button  \n**Interaction:** Click to activate function\n\n---\n\n### Timeline / Scrubber Bar\n\n**Purpose:** Temporal navigation and playback.\n\n**Position:** Bottom of viewport  \n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/primary` (cream/500)  \n**Border:** 1px `colour/border/light` top  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Play/pause button (icon button, 32×32px)\n- **Centre:** Scrubber track (draggable timeline, shows current position)\n- **Right:** Timecode readout (`type/body`, e.g. \"23:59\")\n\n**Interaction:**\n- Click play/pause to control playback\n- Drag scrubber to seek to time\n- Timecode updates in real-time\n\n---\n\n## Accessibility Notes\n\n### Keyboard Navigation\n- All buttons and links are focusable (Tab key)\n- Icon buttons include visible focus ring (2px outline in `colour/focus-ring`)\n- Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter\n- Escape closes open modals and pickers\n\n### ARIA Labels\n- Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\")\n- Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded`\n- Panels include semantic heading tags (`<h2>`, `<h3>`)\n- List items include `role=\"button\"` if clickable\n\n### Touch Targets\n- Minimum 44×44px for all interactive elements\n- Icon buttons: 40×40px (meets 44px height with padding)\n- List items: 44px minimum height\n- Panel close button: 24×24px icon, but padded to 44×44px touch area\n\n### Colour Contrast\n- All text: 4.5:1 ratio minimum (primary text on primary background)\n- Large text: 3:1 ratio acceptable\n- Icons: 3:1 ratio minimum against background\n- Alert colour (orange): tested against background for WCAG AA\n\n### Screen Reader Support\n- Images include alt text (hero images, avatars)\n- Panels marked with semantic headings\n- Status indicators (badges, dots) include aria-live regions for updates\n- Tables include semantic `<th>` and `<td>` elements\n\n### Monospace Considerations\n- Line length kept under 70 characters (readability)\n- Letter spacing adequate (monospace is denser than humanist sans)\n- Avoid all-caps for extended text (lowercase/title case preferred)\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20367":{"type":"TEXT","id":"78:20367","name":"# Augur Components ## Overview This document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target. --- ## Buttons ### Icon Button **Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause). **Size:** 40×40px (icon 20×20px centered) **Padding:** None (icon-only, square aspect) **Background:** `colour/bg/primary` **Icon colour:** `colour/icon/primary` **Border:** None **Radius:** `radius/none` **States:** - **Default:** Background `colour/bg/primary`, icon `colour/icon/primary` - **Hover:** Background `colour/hover` (cream/400), icon unchanged - **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white) - **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled` - **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset **Variants:** - **Icon only** (standard) — as above - **With badge** — small red dot (8px) top-right corner for notifications **Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view --- ### Text Button / Link **Purpose:** Navigation and secondary actions within panels and lists. **Typography:** `type/body`, regular weight **Colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height) **Border:** None **Radius:** `radius/none` **States:** - **Default:** Text `colour/text/primary`, background transparent - **Hover:** Background `colour/hover`, text unchanged - **Active/selected:** Text `colour/active`, background `colour/bg/tertiary` - **Disabled:** Text `colour/text/disabled`, background transparent - **Focus:** Underline in `colour/focus-ring` **Variants:** - **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2` - **Inline** — no padding, appears in running text - **Full-width** — stretches to container width, text left-aligned **Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\" --- ## Inputs ### Dropdown / Select **Purpose:** Choose from predefined options (location, date, time, filter). **Height:** 40px **Padding:** `space/4` horizontal, `space/2` vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/medium` **Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary` **Radius:** `radius/none` **States:** - **Default:** As above - **Hover:** Background `colour/hover` - **Focus:** Border `colour/focus-ring`, outline 2px offset - **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation) - **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled` **Interaction:** - Click to open dropdown menu - Menu items: 40px height, `type/body`, left-aligned with `space/4` padding - Selected item: Background `colour/active`, text `colour/text/inverse` - Unselected items: Background `colour/bg/primary`, text `colour/text/primary` - Keyboard: Arrow keys to navigate, Enter to select, Escape to close **Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\" --- ### Calendar / Date Picker **Purpose:** Select a date or time period (year, month, week, day, live). **Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day). **Period tabs:** - Horizontal layout, `space/2` gap - Tab size: min 48×32px - Typography: `type/body`, bold - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` (neutral/900) - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` **Grid cells:** - Size: 40×40px minimum - Typography: `type/body`, regular - Background (inactive): `colour/bg/primary` - Background (active): `colour/active` - Text (inactive): `colour/text/primary` - Text (active): `colour/text/inverse` - Border: 1px `colour/border/light` between cells - Today indicator: Underline in `colour/active` (if applicable) **Interaction:** - Click period tab to switch grid view - Click cell to select - Keyboard: Arrow keys to navigate, Enter to select, Escape to close - LIVE mode: shows real-time timestamp **Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8 --- ### Location Picker **Purpose:** Hierarchical geographic navigation (Country → Region → Area). **Height:** Full panel, scrollable if >6 items **Item height:** 44px minimum **Padding:** `space/4` per item **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` between items **Arrow:** Right-aligned, `colour/icon/secondary` **Layout:** - Header: Back arrow (24×24px, `colour/icon/primary`), title, close X - Body: List of items, each with label and arrow - Footer: Optional breadcrumb or current selection **Interaction:** - Click item to drill down (arrow navigates to sub-level) - Click back arrow to navigate up - Click close X to dismiss - Keyboard: Arrow keys, Enter to select/navigate, Escape to close **Examples:** \"England → London\", \"England → South East\", etc. --- ## Panels & Modals ### Panel Header **Purpose:** Title, navigation, and close controls for side panels. **Height:** 48px minimum **Padding:** `space/4` horizontal and vertical **Background:** `colour/bg/tertiary` (cream/200) **Border:** 1px `colour/border/light` bottom **Typography:** `type/h4` for major panels, `type/body` for secondary **Text colour:** `colour/text/primary` **Layout:** Flex, space-between - **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`) - **Centre:** Title / label, left-aligned - **Right:** Close button (X, 24×24px icon button) **Interaction:** - Back arrow navigates to previous state - Close X dismisses panel **Examples:** - \"Customer numbers\" (data list header) - \"Selected event\" (detail header) - \"Notifications (3)\" (notification drawer header) --- ### Panel Body **Purpose:** Main content area for panels. **Background:** `colour/bg/primary` (cream/500) **Padding:** `space/6` (24px) all sides **Typography:** `type/body` for text, `type/h4` for section headers **Text colour:** `colour/text/primary` **Border:** `shadow/small` (raised effect) **Max width:** 320px (typical panel width) **Scrollable:** Yes, if content exceeds viewport height **Content types:** - Section headers (`type/h4`, margin-top `space/6` except first) - List items (with or without images/avatars) - Detail cards (image, text, metadata) - Text blocks (descriptions, AI-generated summaries) - Charts (bar charts with axis labels) **Interaction:** - Click list items or links to navigate or open detail panels - Panels can stack (e.g. Customer numbers → detail drawer) --- ## Lists & Tables ### List Item **Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications). **Height:** 44px minimum (text only), 64px+ (with images) **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` **Text colour:** `colour/text/primary` **Background:** `colour/bg/primary` **Background (hover):** `colour/hover` (cream/400) **Border:** 1px `colour/border/light` bottom **Radius:** `radius/none` **Anatomy:** - **Left:** Label or label + secondary text (metadata) - **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon **Variants:** - **Simple label** — single line, bold - **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`) - **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow - **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below **Interaction:** - Click to navigate to detail or drill down - Optional: swipe to reveal actions (secondary interaction) **Examples:** - \"Numbers\" with arrow (data category) - \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event) - Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person) --- ### Notification List Item **Purpose:** High-priority alert display with time, status, and action. **Height:** 80px minimum **Padding:** `space/4` horizontal and vertical **Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp) **Background:** `colour/bg/primary` **Border:** 1px `colour/border/light` bottom **Avatar:** Circular, 40×40px, left-aligned **Anatomy:** - **Left:** Avatar (40×40px, square corners) - **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge - **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge) **Badge variants:** - Notification dot (8px orange circle for urgent alerts) - Percentage badge (circular, dark background, white bold text, e.g. \"92%\") - Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\") --- ## Cards ### Event Detail Card **Purpose:** Full details for a selected incident or event. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing 2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge 3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description) 4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\" 5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text) 6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4` **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) **Interaction:** - Click action links to drill down or open related panels - Avatar click: open person detail panel --- ### Person Detail Card **Purpose:** Individual profile with summary and related actions. **Layout:** Vertical stack **Width:** 320px (panel width) **Padding:** `space/6` all sides **Content structure:** 1. **Avatar** — Large circular, 120×120px, square corners, centred 2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description) 3. **Location** — `type/body` with `colour/text/secondary` 4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned **Spacing:** - Between sections: `space/6` (24px) - Between action links: `space/4` (16px) --- ### Data Detail Card **Purpose:** Visualisation and metrics display. **Layout:** Vertical stack **Width:** Variable (panel or embedded in dashboard) **Padding:** `space/6` all sides **Content structure:** 1. **Header** — `type/h4` title, e.g. \"Customer numbers\" 2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical 3. **Footer** — Metadata, e.g. date range, data source **Chart style:** - Bars: Neutral grey (`colour/neutral/600` or darker) - Background: Transparent or very light (`colour/bg/primary`) - Axis labels: `type/body` with `colour/text/secondary` - Grid: Optional light dividers (`colour/border/light`) --- ## Navigation ### Top Bar **Purpose:** Global application header with logo, filters, and user controls. **Height:** 48px **Padding:** `space/4` horizontal **Background:** `colour/neutral/0` (white) **Border:** 1px `colour/border/light` bottom **Layout:** Flex, space-between **Sections:** - **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned) - **Centre:** Global filters (Dropdowns for Where and When) - **Right:** Notification icon (with badge) + User avatar icon button **Interaction:** - Click filters to open pickers - Click notification icon to open notification drawer - Click avatar to open user menu --- ### Secondary Navigation Bar **Purpose:** View/mode selector (Map, Data, Events, People, etc.). **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/tertiary` (cream/200) **Border:** None **Layout:** Flex, space-between or space-around **Tab anatomy:** - Height: 40px - Icon: 20×20px, left-aligned or centred - Label: `type/body`, left-aligned or centred - Background: `colour/bg/tertiary` (inactive) - Background: `colour/active` (active tab) - Text: `colour/text/primary` (inactive), `colour/text/inverse` (active) - Padding: `space/2` to `space/4` **Interaction:** - Click tab to switch view - Active tab indicated by dark background - Keyboard: Left/Right arrow keys to navigate, Enter to select **Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon) --- ### Floating Controls (Canvas) **Purpose:** View manipulation and playback controls positioned near 3D canvas. **Position:** Bottom-right, 16px offset from edges **Layout:** Vertical stack, `space/2` gap **Controls:** 1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary` 2. **Zoom controls** — Icon button (+ and -), stacked vertically 3. **Reset/recenter** — Icon button (refresh icon) **Spacing:** `space/2` (8px) between buttons **Size:** 40×40px per button **Interaction:** Click to activate function --- ### Timeline / Scrubber Bar **Purpose:** Temporal navigation and playback. **Position:** Bottom of viewport **Height:** 40px **Padding:** `space/4` horizontal **Background:** `colour/bg/primary` (cream/500) **Border:** 1px `colour/border/light` top **Layout:** Flex, space-between **Sections:** - **Left:** Play/pause button (icon button, 32×32px) - **Centre:** Scrubber track (draggable timeline, shows current position) - **Right:** Timecode readout (`type/body`, e.g. \"23:59\") **Interaction:** - Click play/pause to control playback - Drag scrubber to seek to time - Timecode updates in real-time --- ## Accessibility Notes ### Keyboard Navigation - All buttons and links are focusable (Tab key) - Icon buttons include visible focus ring (2px outline in `colour/focus-ring`) - Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter - Escape closes open modals and pickers ### ARIA Labels - Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\") - Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded` - Panels include semantic heading tags (`<h2>`, `<h3>`) - List items include `role=\"button\"` if clickable ### Touch Targets - Minimum 44×44px for all interactive elements - Icon buttons: 40×40px (meets 44px height with padding) - List items: 44px minimum height - Panel close button: 24×24px icon, but padded to 44×44px touch area ### Colour Contrast - All text: 4.5:1 ratio minimum (primary text on primary background) - Large text: 3:1 ratio acceptable - Icons: 3:1 ratio minimum against background - Alert colour (orange): tested against background for WCAG AA ### Screen Reader Support - Images include alt text (hero images, avatars) - Panels marked with semantic headings - Status indicators (badges, dots) include aria-live regions for updates - Tables include semantic `<th>` and `<td>` elements ### Monospace Considerations - Line length kept under 70 characters (readability) - Letter spacing adequate (monospace is denser than humanist sans) - Avoid all-caps for extended text (lowercase/title case preferred)","absoluteBoundingBox":{"x":52572.0,"y":14900.0,"width":760.0,"height":12048.0},"isolatedAbsoluteRenderBounds":{"x":52570.16015625,"y":14905.8798828125,"width":754.4140625,"height":12013.8408203125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":12048.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Components\n\n## Overview\n\nThis document specifies component anatomy, states, and usage. All components use square corners (`radius/none`), monospace typography (PP Grotesk Mono), and the cream/neutral colour palette. Interactive elements maintain a minimum 44×44px touch target.\n\n---\n\n## Buttons\n\n### Icon Button\n\n**Purpose:** Primary interaction control for actions and toggles (close, menu, zoom, play/pause).\n\n**Size:** 40×40px (icon 20×20px centered)  \n**Padding:** None (icon-only, square aspect)  \n**Background:** `colour/bg/primary`  \n**Icon colour:** `colour/icon/primary`  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Background `colour/bg/primary`, icon `colour/icon/primary`\n- **Hover:** Background `colour/hover` (cream/400), icon unchanged\n- **Active/pressed:** Background `colour/active` (neutral/900), icon `colour/icon/inverse` (white)\n- **Disabled:** Background `colour/bg/tertiary`, icon `colour/icon/disabled`\n- **Focus:** 2px outline in `colour/focus-ring` (neutral/800), 2px offset\n\n**Variants:**\n- **Icon only** (standard) — as above\n- **With badge** — small red dot (8px) top-right corner for notifications\n\n**Examples:** Close button (X), 2D/3D toggle, zoom in/out, menu (⋮), play/pause, reset view\n\n---\n\n### Text Button / Link\n\n**Purpose:** Navigation and secondary actions within panels and lists.\n\n**Typography:** `type/body`, regular weight  \n**Colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Padding:** `space/4` horizontal, `space/2` vertical (minimum 40px height)  \n**Border:** None  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** Text `colour/text/primary`, background transparent\n- **Hover:** Background `colour/hover`, text unchanged\n- **Active/selected:** Text `colour/active`, background `colour/bg/tertiary`\n- **Disabled:** Text `colour/text/disabled`, background transparent\n- **Focus:** Underline in `colour/focus-ring`\n\n**Variants:**\n- **With arrow** — arrow (`→`) right-aligned, right padding increased by `space/2`\n- **Inline** — no padding, appears in running text\n- **Full-width** — stretches to container width, text left-aligned\n\n**Examples:** \"Cameras →\", \"People →\", \"Timeline →\", \"Report →\"\n\n---\n\n## Inputs\n\n### Dropdown / Select\n\n**Purpose:** Choose from predefined options (location, date, time, filter).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal, `space/2` vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/medium`  \n**Icon:** Chevron (12×12px) right-aligned, `colour/icon/primary`  \n**Radius:** `radius/none`\n\n**States:**\n- **Default:** As above\n- **Hover:** Background `colour/hover`\n- **Focus:** Border `colour/focus-ring`, outline 2px offset\n- **Open:** Border `colour/focus-ring`, chevron rotates 180° (optional animation)\n- **Disabled:** Background `colour/bg/tertiary`, text `colour/text/disabled`, icon `colour/icon/disabled`\n\n**Interaction:**\n- Click to open dropdown menu\n- Menu items: 40px height, `type/body`, left-aligned with `space/4` padding\n- Selected item: Background `colour/active`, text `colour/text/inverse`\n- Unselected items: Background `colour/bg/primary`, text `colour/text/primary`\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n\n**Examples:** \"Where: 311 Oxford Street\", \"When: Wed 8th August 2025\"\n\n---\n\n### Calendar / Date Picker\n\n**Purpose:** Select a date or time period (year, month, week, day, live).\n\n**Layout:** Vertical tabs (Period) followed by grid (Year/Month/Week/Day).\n\n**Period tabs:**\n- Horizontal layout, `space/2` gap\n- Tab size: min 48×32px\n- Typography: `type/body`, bold\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active` (neutral/900)\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n\n**Grid cells:**\n- Size: 40×40px minimum\n- Typography: `type/body`, regular\n- Background (inactive): `colour/bg/primary`\n- Background (active): `colour/active`\n- Text (inactive): `colour/text/primary`\n- Text (active): `colour/text/inverse`\n- Border: 1px `colour/border/light` between cells\n- Today indicator: Underline in `colour/active` (if applicable)\n\n**Interaction:**\n- Click period tab to switch grid view\n- Click cell to select\n- Keyboard: Arrow keys to navigate, Enter to select, Escape to close\n- LIVE mode: shows real-time timestamp\n\n**Examples:** \"When: Wed 8th August 2025\" → Year 2025 → Month AUG → Day 8\n\n---\n\n### Location Picker\n\n**Purpose:** Hierarchical geographic navigation (Country → Region → Area).\n\n**Height:** Full panel, scrollable if >6 items  \n**Item height:** 44px minimum  \n**Padding:** `space/4` per item  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` between items  \n**Arrow:** Right-aligned, `colour/icon/secondary`\n\n**Layout:**\n- Header: Back arrow (24×24px, `colour/icon/primary`), title, close X\n- Body: List of items, each with label and arrow\n- Footer: Optional breadcrumb or current selection\n\n**Interaction:**\n- Click item to drill down (arrow navigates to sub-level)\n- Click back arrow to navigate up\n- Click close X to dismiss\n- Keyboard: Arrow keys, Enter to select/navigate, Escape to close\n\n**Examples:** \"England → London\", \"England → South East\", etc.\n\n---\n\n## Panels & Modals\n\n### Panel Header\n\n**Purpose:** Title, navigation, and close controls for side panels.\n\n**Height:** 48px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** 1px `colour/border/light` bottom  \n**Typography:** `type/h4` for major panels, `type/body` for secondary  \n**Text colour:** `colour/text/primary`\n\n**Layout:** Flex, space-between\n- **Left:** Back arrow (optional, 24×24px, `colour/icon/primary`)\n- **Centre:** Title / label, left-aligned\n- **Right:** Close button (X, 24×24px icon button)\n\n**Interaction:**\n- Back arrow navigates to previous state\n- Close X dismisses panel\n\n**Examples:**\n- \"Customer numbers\" (data list header)\n- \"Selected event\" (detail header)\n- \"Notifications (3)\" (notification drawer header)\n\n---\n\n### Panel Body\n\n**Purpose:** Main content area for panels.\n\n**Background:** `colour/bg/primary` (cream/500)  \n**Padding:** `space/6` (24px) all sides  \n**Typography:** `type/body` for text, `type/h4` for section headers  \n**Text colour:** `colour/text/primary`  \n**Border:** `shadow/small` (raised effect)  \n**Max width:** 320px (typical panel width)  \n**Scrollable:** Yes, if content exceeds viewport height\n\n**Content types:**\n- Section headers (`type/h4`, margin-top `space/6` except first)\n- List items (with or without images/avatars)\n- Detail cards (image, text, metadata)\n- Text blocks (descriptions, AI-generated summaries)\n- Charts (bar charts with axis labels)\n\n**Interaction:**\n- Click list items or links to navigate or open detail panels\n- Panels can stack (e.g. Customer numbers → detail drawer)\n\n---\n\n## Lists & Tables\n\n### List Item\n\n**Purpose:** Selectable/clickable row in a list (data categories, events, people, notifications).\n\n**Height:** 44px minimum (text only), 64px+ (with images)  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body`  \n**Text colour:** `colour/text/primary`  \n**Background:** `colour/bg/primary`  \n**Background (hover):** `colour/hover` (cream/400)  \n**Border:** 1px `colour/border/light` bottom  \n**Radius:** `radius/none`\n\n**Anatomy:**\n- **Left:** Label or label + secondary text (metadata)\n- **Right:** Arrow (`→`, `colour/icon/secondary`) or action icon\n\n**Variants:**\n- **Simple label** — single line, bold\n- **Label + subtitle** — label (`type/body` bold), subtitle (`type/body` with `colour/text/secondary`)\n- **Avatar + label + subtitle** — circular avatar (32px, square corners), label/subtitle, arrow\n- **Large image + label + subtitle** — wide image (100% width, 80px height), label/subtitle overlay or below\n\n**Interaction:**\n- Click to navigate to detail or drill down\n- Optional: swipe to reveal actions (secondary interaction)\n\n**Examples:**\n- \"Numbers\" with arrow (data category)\n- \"Potential theft\" + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" with arrow (event)\n- Avatar + \"Unidentified young adult male\" + \"Floor 3, Area 2B\" + arrow (person)\n\n---\n\n### Notification List Item\n\n**Purpose:** High-priority alert display with time, status, and action.\n\n**Height:** 80px minimum  \n**Padding:** `space/4` horizontal and vertical  \n**Typography:** `type/body` (title and location), `type/body` with `colour/text/secondary` (timestamp)  \n**Background:** `colour/bg/primary`  \n**Border:** 1px `colour/border/light` bottom  \n**Avatar:** Circular, 40×40px, left-aligned\n\n**Anatomy:**\n- **Left:** Avatar (40×40px, square corners)\n- **Centre:** Title (`type/body` bold), timestamp and location (`type/body` secondary), optional status badge\n- **Right:** Red alert dot (8px) top-right of avatar, or timestamp + status (e.g. \"92%\" in dark badge)\n\n**Badge variants:**\n- Notification dot (8px orange circle for urgent alerts)\n- Percentage badge (circular, dark background, white bold text, e.g. \"92%\")\n- Gender ratio badge (circular, dark background, white text, e.g. \"M:32 F:68\")\n\n---\n\n## Cards\n\n### Event Detail Card\n\n**Purpose:** Full details for a selected incident or event.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Hero image** — Full-width, 120px height, square corners, placeholder pattern if missing\n2. **Avatar** — 40×40px circular, positioned 16px below image, square corners, with optional alert badge\n3. **Timestamp + title** — `type/h4` title, `type/body` secondary text (timestamp, description)\n4. **Location** — `type/body` with `colour/text/secondary`, e.g. \"Floor 3, Area 2B\"\n5. **Description** — `type/body` full-width, 2–3 lines, AI-written summary (grey text)\n6. **Related actions** — Links with arrows (Cameras, People, Timeline, Associates, Notes, Report), `type/body` left-aligned, spacing `space/4`\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n**Interaction:**\n- Click action links to drill down or open related panels\n- Avatar click: open person detail panel\n\n---\n\n### Person Detail Card\n\n**Purpose:** Individual profile with summary and related actions.\n\n**Layout:** Vertical stack  \n**Width:** 320px (panel width)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Avatar** — Large circular, 120×120px, square corners, centred\n2. **Timestamp + name** — `type/h3` name, `type/body` secondary (timestamp, description)\n3. **Location** — `type/body` with `colour/text/secondary`\n4. **Related actions** — Links with arrows (Timeline, Associates, Notes, Report), `type/body`, left-aligned\n\n**Spacing:**\n- Between sections: `space/6` (24px)\n- Between action links: `space/4` (16px)\n\n---\n\n### Data Detail Card\n\n**Purpose:** Visualisation and metrics display.\n\n**Layout:** Vertical stack  \n**Width:** Variable (panel or embedded in dashboard)  \n**Padding:** `space/6` all sides\n\n**Content structure:**\n1. **Header** — `type/h4` title, e.g. \"Customer numbers\"\n2. **Chart** — Bar chart with grey bars, axis labels in `type/body`, 160px height typical\n3. **Footer** — Metadata, e.g. date range, data source\n\n**Chart style:**\n- Bars: Neutral grey (`colour/neutral/600` or darker)\n- Background: Transparent or very light (`colour/bg/primary`)\n- Axis labels: `type/body` with `colour/text/secondary`\n- Grid: Optional light dividers (`colour/border/light`)\n\n---\n\n## Navigation\n\n### Top Bar\n\n**Purpose:** Global application header with logo, filters, and user controls.\n\n**Height:** 48px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/neutral/0` (white)  \n**Border:** 1px `colour/border/light` bottom  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Logo (\"AUGUR\", `type/h4` bold, left-aligned)\n- **Centre:** Global filters (Dropdowns for Where and When)\n- **Right:** Notification icon (with badge) + User avatar icon button\n\n**Interaction:**\n- Click filters to open pickers\n- Click notification icon to open notification drawer\n- Click avatar to open user menu\n\n---\n\n### Secondary Navigation Bar\n\n**Purpose:** View/mode selector (Map, Data, Events, People, etc.).\n\n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/tertiary` (cream/200)  \n**Border:** None  \n**Layout:** Flex, space-between or space-around\n\n**Tab anatomy:**\n- Height: 40px\n- Icon: 20×20px, left-aligned or centred\n- Label: `type/body`, left-aligned or centred\n- Background: `colour/bg/tertiary` (inactive)\n- Background: `colour/active` (active tab)\n- Text: `colour/text/primary` (inactive), `colour/text/inverse` (active)\n- Padding: `space/2` to `space/4`\n\n**Interaction:**\n- Click tab to switch view\n- Active tab indicated by dark background\n- Keyboard: Left/Right arrow keys to navigate, Enter to select\n\n**Examples:** Map (with icon), Data (with icon), Events (with icon), People (with icon)\n\n---\n\n### Floating Controls (Canvas)\n\n**Purpose:** View manipulation and playback controls positioned near 3D canvas.\n\n**Position:** Bottom-right, 16px offset from edges  \n**Layout:** Vertical stack, `space/2` gap\n\n**Controls:**\n1. **2D/3D toggle** — Icon button (toggle between 2D map and 3D isometric), `colour/icon/primary`\n2. **Zoom controls** — Icon button (+ and -), stacked vertically\n3. **Reset/recenter** — Icon button (refresh icon)\n\n**Spacing:** `space/2` (8px) between buttons  \n**Size:** 40×40px per button  \n**Interaction:** Click to activate function\n\n---\n\n### Timeline / Scrubber Bar\n\n**Purpose:** Temporal navigation and playback.\n\n**Position:** Bottom of viewport  \n**Height:** 40px  \n**Padding:** `space/4` horizontal  \n**Background:** `colour/bg/primary` (cream/500)  \n**Border:** 1px `colour/border/light` top  \n**Layout:** Flex, space-between\n\n**Sections:**\n- **Left:** Play/pause button (icon button, 32×32px)\n- **Centre:** Scrubber track (draggable timeline, shows current position)\n- **Right:** Timecode readout (`type/body`, e.g. \"23:59\")\n\n**Interaction:**\n- Click play/pause to control playback\n- Drag scrubber to seek to time\n- Timecode updates in real-time\n\n---\n\n## Accessibility Notes\n\n### Keyboard Navigation\n- All buttons and links are focusable (Tab key)\n- Icon buttons include visible focus ring (2px outline in `colour/focus-ring`)\n- Dropdowns and pickers support arrow keys (Up/Down or Left/Right) and Enter\n- Escape closes open modals and pickers\n\n### ARIA Labels\n- Icon buttons include `aria-label` (e.g. \"Close panel\", \"Zoom in\", \"Play\")\n- Dropdowns include `aria-haspopup=\"listbox\"` and `aria-expanded`\n- Panels include semantic heading tags (`<h2>`, `<h3>`)\n- List items include `role=\"button\"` if clickable\n\n### Touch Targets\n- Minimum 44×44px for all interactive elements\n- Icon buttons: 40×40px (meets 44px height with padding)\n- List items: 44px minimum height\n- Panel close button: 24×24px icon, but padded to 44×44px touch area\n\n### Colour Contrast\n- All text: 4.5:1 ratio minimum (primary text on primary background)\n- Large text: 3:1 ratio acceptable\n- Icons: 3:1 ratio minimum against background\n- Alert colour (orange): tested against background for WCAG AA\n\n### Screen Reader Support\n- Images include alt text (hero images, avatars)\n- Panels marked with semantic headings\n- Status indicators (badges, dots) include aria-live regions for updates\n- Tables include semantic `<th>` and `<td>` elements\n\n### Monospace Considerations\n- Line length kept under 70 characters (readability)\n- Letter spacing adequate (monospace is denser than humanist sans)\n- Avoid all-caps for extended text (lowercase/title case preferred)\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20328":{"type":"TEXT","id":"78:20328","name":"# Augur Design System ## Overview Augur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering. **Typeface:** PP Grotesk Mono (Light, Regular, Bold) **Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius **Shadow:** Single elevation style for raised surfaces **Grid:** 8px base unit --- ## Colour System ### Primitives #### Cream ramp Used as primary background for UI surfaces, panels, secondary navigation. | Stop | Hex | Use | |---|---|---| | 50 | `#FCFBF7` | Lightest surface, hover states | | 100 | `#FAF6F0` | Secondary panel backgrounds | | 200 | `#F7F2E8` | Secondary nav bar, panel headers | | 300 | `#F4EEE0` | Subtle dividers, disabled states | | 400 | `#F1E9D9` | List item hover | | 500 | `#EFE5D1` | Baseline panel background | | 600 | `#ECE1C9` | Accent/selection tint | | 700 | `#E9DCC2` | Medium panel contrast | | 800 | `#E7D8BA` | Deep panel background, dark hover | | 900 | `#D9C5A0` | — | #### Neutral ramp Used for text, borders, icons, and status indicators. | Stop | Hex | Use | |---|---|---| | 0 | `#FFFFFF` | White backgrounds, icon fill on dark | | 50 | `#F9F5F1` | Very light backgrounds | | 100 | `#E9E5E1` | Light borders | | 200 | `#D9D5D1` | Subtle borders, disabled text | | 300 | `#C9C5C1` | Light dividers | | 400 | `#B9B5B1` | Tertiary text, secondary icons | | 500 | `#A9A5A1` | Secondary text | | 600 | `#999591` | Primary text | | 700 | `#898581` | Headings, emphasis | | 800 | `#494541` | Strong emphasis, icon fill | | 900 | `#292521` | Dark UI elements, active states | | 1000 | `#000000` | Black backgrounds, peak contrast | ### Semantics | Token | Primitive | Use | |---|---|---| | `colour/bg/primary` | `cream/500` | Panel backgrounds | | `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds | | `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers | | `colour/bg/canvas` | `white` | Main 3D canvas | | `colour/text/primary` | `neutral/600` | Body text, labels | | `colour/text/secondary` | `neutral/500` | Metadata, hints | | `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised | | `colour/text/inverse` | `neutral/0` | Text on dark backgrounds | | `colour/border/light` | `neutral/100` | Subtle dividers | | `colour/border/medium` | `neutral/200` | Standard borders | | `colour/border/strong` | `neutral/600` | Emphasis borders, outlines | | `colour/icon/primary` | `neutral/800` | Standard icons | | `colour/icon/secondary` | `neutral/600` | Secondary icons | | `colour/icon/disabled` | `neutral/200` | Disabled icons | | `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) | | `colour/active` | `neutral/900` | Selected states, active indicators | --- ## Typography **Font:** PP Grotesk Mono, monospace | Token | Size | Line height | Weight | Use | |---|---|---|---|---| | `type/display` | 48px | 56px | Bold | Hero headings, page titles | | `type/h1` | 40px | 48px | Bold | Section headings | | `type/h2` | 32px | 40px | Bold | Subsection headings | | `type/h3` | 28px | 36px | Bold | Panel titles, card headings | | `type/h4` | 24px | 32px | Bold | Secondary headings, labels | | `type/body-large` | 20px | 28px | Regular | Panel introductions, large body | | `type/body` | 16px | 24px | Regular | Standard body text, UI copy | ### Weight modifiers - Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`) - Regular: Default weight for body, labels, and copy - Bold: Headings, emphasis, CTA text ### Line length Monospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density. --- ## Spacing **Base unit:** 8px | Token | Value | Use | |---|---|---| | `space/1` | 4px | Tight gaps, icon-to-label spacing | | `space/2` | 8px | Component padding, fine gutters | | `space/3` | 12px | Internal spacing | | `space/4` | 16px | Standard padding, list gaps | | `space/5` | 20px | Generous padding | | `space/6` | 24px | Section padding, panel margins | | `space/7` | 32px | Major spacing, dividers | | `space/8` | 40px | Large gaps, section breaks | | `space/9` | 48px | Major layout spacing | | `space/10` | 64px | Canvas margins, page-level spacing | --- ## Elevation **Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns). | Token | Value | Use | |---|---|---| | `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards | --- ## Radius **All corners are square.** No border radius applied. | Token | Value | |---|---| | `radius/none` | 0px | --- ## Component Inventory ### Buttons - **Icon button** — Square, 40×40px, dark icon on cream background, no border - **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels - **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive ### Inputs - **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text - **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900` - **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows ### Panels & Modals - **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional - **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards - **Panel footer** — Optional, links or actions with arrow indicators - **Drawer shadow** — Applied to all raised panels ### Lists & Tables - **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`) - **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream - **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation ### Cards - **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows - **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links - **Data detail card** — Bar chart with axis labels, metadata footer ### Indicators - **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel - **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\" - **Active indicator** — `neutral/900` background or fill for selected/active states ### Navigation - **Top bar** — White background, logo (left), global filters (centre), user controls (right) - **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy - **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset) - **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body` --- ## Motion None specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close). --- ## Accessibility - **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text) - **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter - **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text - **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing - **Monospace typography:** Line length kept under 70 characters to maintain readability --- ## Usage Guidelines ### Tone Copy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity. ### Data presentation Prefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail. ### Panel interaction Panels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators. ### Colour application Cream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps. ### Monospace decisions All UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.","absoluteBoundingBox":{"x":50940.0,"y":316.0,"width":1160.0,"height":5472.0},"isolatedAbsoluteRenderBounds":{"x":50938.16015625,"y":321.656005859375,"width":1153.01953125,"height":5438.064453125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1160.0,"y":5472.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design System\n\n## Overview\n\nAugur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering.\n\n**Typeface:** PP Grotesk Mono (Light, Regular, Bold)  \n**Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius  \n**Shadow:** Single elevation style for raised surfaces  \n**Grid:** 8px base unit\n\n---\n\n## Colour System\n\n### Primitives\n\n#### Cream ramp\nUsed as primary background for UI surfaces, panels, secondary navigation.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 50 | `#FCFBF7` | Lightest surface, hover states |\n| 100 | `#FAF6F0` | Secondary panel backgrounds |\n| 200 | `#F7F2E8` | Secondary nav bar, panel headers |\n| 300 | `#F4EEE0` | Subtle dividers, disabled states |\n| 400 | `#F1E9D9` | List item hover |\n| 500 | `#EFE5D1` | Baseline panel background |\n| 600 | `#ECE1C9` | Accent/selection tint |\n| 700 | `#E9DCC2` | Medium panel contrast |\n| 800 | `#E7D8BA` | Deep panel background, dark hover |\n| 900 | `#D9C5A0` | — |\n\n#### Neutral ramp\nUsed for text, borders, icons, and status indicators.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 0 | `#FFFFFF` | White backgrounds, icon fill on dark |\n| 50 | `#F9F5F1` | Very light backgrounds |\n| 100 | `#E9E5E1` | Light borders |\n| 200 | `#D9D5D1` | Subtle borders, disabled text |\n| 300 | `#C9C5C1` | Light dividers |\n| 400 | `#B9B5B1` | Tertiary text, secondary icons |\n| 500 | `#A9A5A1` | Secondary text |\n| 600 | `#999591` | Primary text |\n| 700 | `#898581` | Headings, emphasis |\n| 800 | `#494541` | Strong emphasis, icon fill |\n| 900 | `#292521` | Dark UI elements, active states |\n| 1000 | `#000000` | Black backgrounds, peak contrast |\n\n### Semantics\n\n| Token | Primitive | Use |\n|---|---|---|\n| `colour/bg/primary` | `cream/500` | Panel backgrounds |\n| `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds |\n| `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers |\n| `colour/bg/canvas` | `white` | Main 3D canvas |\n| `colour/text/primary` | `neutral/600` | Body text, labels |\n| `colour/text/secondary` | `neutral/500` | Metadata, hints |\n| `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised |\n| `colour/text/inverse` | `neutral/0` | Text on dark backgrounds |\n| `colour/border/light` | `neutral/100` | Subtle dividers |\n| `colour/border/medium` | `neutral/200` | Standard borders |\n| `colour/border/strong` | `neutral/600` | Emphasis borders, outlines |\n| `colour/icon/primary` | `neutral/800` | Standard icons |\n| `colour/icon/secondary` | `neutral/600` | Secondary icons |\n| `colour/icon/disabled` | `neutral/200` | Disabled icons |\n| `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) |\n| `colour/active` | `neutral/900` | Selected states, active indicators |\n\n---\n\n## Typography\n\n**Font:** PP Grotesk Mono, monospace\n\n| Token | Size | Line height | Weight | Use |\n|---|---|---|---|---|\n| `type/display` | 48px | 56px | Bold | Hero headings, page titles |\n| `type/h1` | 40px | 48px | Bold | Section headings |\n| `type/h2` | 32px | 40px | Bold | Subsection headings |\n| `type/h3` | 28px | 36px | Bold | Panel titles, card headings |\n| `type/h4` | 24px | 32px | Bold | Secondary headings, labels |\n| `type/body-large` | 20px | 28px | Regular | Panel introductions, large body |\n| `type/body` | 16px | 24px | Regular | Standard body text, UI copy |\n\n### Weight modifiers\n- Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`)\n- Regular: Default weight for body, labels, and copy\n- Bold: Headings, emphasis, CTA text\n\n### Line length\nMonospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density.\n\n---\n\n## Spacing\n\n**Base unit:** 8px\n\n| Token | Value | Use |\n|---|---|---|\n| `space/1` | 4px | Tight gaps, icon-to-label spacing |\n| `space/2` | 8px | Component padding, fine gutters |\n| `space/3` | 12px | Internal spacing |\n| `space/4` | 16px | Standard padding, list gaps |\n| `space/5` | 20px | Generous padding |\n| `space/6` | 24px | Section padding, panel margins |\n| `space/7` | 32px | Major spacing, dividers |\n| `space/8` | 40px | Large gaps, section breaks |\n| `space/9` | 48px | Major layout spacing |\n| `space/10` | 64px | Canvas margins, page-level spacing |\n\n---\n\n## Elevation\n\n**Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns).\n\n| Token | Value | Use |\n|---|---|---|\n| `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards |\n\n---\n\n## Radius\n\n**All corners are square.** No border radius applied.\n\n| Token | Value |\n|---|---|\n| `radius/none` | 0px |\n\n---\n\n## Component Inventory\n\n### Buttons\n- **Icon button** — Square, 40×40px, dark icon on cream background, no border\n- **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels\n- **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive\n\n### Inputs\n- **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text\n- **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900`\n- **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows\n\n### Panels & Modals\n- **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional\n- **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards\n- **Panel footer** — Optional, links or actions with arrow indicators\n- **Drawer shadow** — Applied to all raised panels\n\n### Lists & Tables\n- **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`)\n- **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream\n- **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation\n\n### Cards\n- **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows\n- **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links\n- **Data detail card** — Bar chart with axis labels, metadata footer\n\n### Indicators\n- **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel\n- **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\"\n- **Active indicator** — `neutral/900` background or fill for selected/active states\n\n### Navigation\n- **Top bar** — White background, logo (left), global filters (centre), user controls (right)\n- **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy\n- **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset)\n- **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body`\n\n---\n\n## Motion\n\nNone specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close).\n\n---\n\n## Accessibility\n\n- **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text)\n- **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter\n- **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text\n- **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing\n- **Monospace typography:** Line length kept under 70 characters to maintain readability\n\n---\n\n## Usage Guidelines\n\n### Tone\nCopy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity.\n\n### Data presentation\nPrefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail.\n\n### Panel interaction\nPanels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators.\n\n### Colour application\nCream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps.\n\n### Monospace decisions\nAll UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2728":{"type":"FRAME","id":"34:2728","name":"Tablet portrait","absoluteBoundingBox":{"x":53448.0,"y":100.0,"width":768.0,"height":79728.0},"isolatedAbsoluteRenderBounds":{"x":53448.0,"y":100.0,"width":768.0,"height":79728.0},"relativeTransform":[[1.0,0.0,5448.0],[0.0,1.0,100.0]],"size":{"x":768.0,"y":79728.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.988235294818878,"g":0.984313726425171,"b":0.968627452850342,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"HORIZONTAL","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["34:2729","34:2750"]},"34:2719":{"type":"TEXT","id":"34:2719","name":"Software design","absoluteBoundingBox":{"x":52260.0,"y":479.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52260.78515625,"y":485.588043212891,"width":146.37890625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Software design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2699":{"type":"FRAME","id":"34:2699","name":"introduction","absoluteBoundingBox":{"x":50920.0,"y":140.0,"width":1200.0,"height":54080.0},"isolatedAbsoluteRenderBounds":{"x":50920.0,"y":140.0,"width":1200.0,"height":54080.0},"relativeTransform":[[1.0,0.0,40.0],[0.0,1.0,40.0]],"size":{"x":1200.0,"y":54080.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1920.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2700","78:20335","78:20359","78:20382","78:20405","78:20565"]},"78:20363":{"type":"TEXT","id":"78:20363","name":"COMPONENTS.MD","absoluteBoundingBox":{"x":48508.0,"y":13748.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48512.3515625,"y":13773.51953125,"width":509.08203125,"height":45.4404296875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"COMPONENTS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20340":{"type":"TEXT","id":"78:20340","name":"# Augur Design Tokens ## Token Structure Tokens follow a three-layer architecture: 1. **Primitive:** Raw colour values, named by hue and lightness stop 2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`) 3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens) --- ## Primitives ### Colour/Cream ``` colour/cream/50: #FCFBF7 colour/cream/100: #FAF6F0 colour/cream/200: #F7F2E8 colour/cream/300: #F4EEE0 colour/cream/400: #F1E9D9 colour/cream/500: #EFE5D1 colour/cream/600: #ECE1C9 colour/cream/700: #E9DCC2 colour/cream/800: #E7D8BA colour/cream/900: #D9C5A0 ``` ### Colour/Neutral ``` colour/neutral/0: #FFFFFF colour/neutral/50: #F9F5F1 colour/neutral/100: #E9E5E1 colour/neutral/200: #D9D5D1 colour/neutral/300: #C9C5C1 colour/neutral/400: #B9B5B1 colour/neutral/500: #A9A5A1 colour/neutral/600: #999591 colour/neutral/700: #898581 colour/neutral/800: #494541 colour/neutral/900: #292521 colour/neutral/1000: #000000 ``` ### Colour/Status (TBD) ``` colour/status/alert: #FF6B35 (orange, for notifications — confirm value) ``` --- ## Semantic Tokens ### Background ``` colour/bg/primary: colour/cream/500 (#EFE5D1) colour/bg/secondary: colour/cream/100 (#FAF6F0) colour/bg/tertiary: colour/cream/200 (#F7F2E8) colour/bg/canvas: colour/neutral/0 (#FFFFFF) colour/bg/overlay-dark: colour/neutral/1000 with 24% opacity ``` ### Text ``` colour/text/primary: colour/neutral/600 (#999591) colour/text/secondary: colour/neutral/500 (#A9A5A1) colour/text/tertiary: colour/neutral/400 (#B9B5B1) colour/text/inverse: colour/neutral/0 (#FFFFFF) colour/text/disabled: colour/neutral/200 (#D9D5D1) ``` ### Border ``` colour/border/light: colour/neutral/100 (#E9E5E1) colour/border/medium: colour/neutral/200 (#D9D5D1) colour/border/strong: colour/neutral/600 (#999591) colour/border/focus: colour/neutral/800 (#494541) ``` ### Icon ``` colour/icon/primary: colour/neutral/800 (#494541) colour/icon/secondary: colour/neutral/600 (#999591) colour/icon/disabled: colour/neutral/200 (#D9D5D1) colour/icon/inverse: colour/neutral/0 (#FFFFFF) ``` ### Status & Interaction ``` colour/active: colour/neutral/900 (#292521) colour/hover: colour/cream/400 (#F1E9D9) colour/focus-ring: colour/neutral/800 (#494541) colour/alert: colour/status/alert (#FF6B35) colour/success: (TBD) colour/warning: (TBD) colour/info: (TBD) ``` --- ## Typography Tokens ### Font Family ``` type/family: PP Grotesk Mono type/family/fallback: monospace ``` ### Font Sizes & Line Heights ``` type/display/size: 48px type/display/lineheight: 56px type/display/weight: bold type/h1/size: 40px type/h1/lineheight: 48px type/h1/weight: bold type/h2/size: 32px type/h2/lineheight: 40px type/h2/weight: bold type/h3/size: 28px type/h3/lineheight: 36px type/h3/weight: bold type/h4/size: 24px type/h4/lineheight: 32px type/h4/weight: bold type/body-large/size: 20px type/body-large/lineheight: 28px type/body-large/weight: regular type/body/size: 16px type/body/lineheight: 24px type/body/weight: regular type/caption/size: 12px (deprecated — use type/body with neutral/400) type/caption/lineheight: 16px type/caption/weight: light ``` ### Weight Tokens ``` type/weight/light: 300 type/weight/regular: 400 type/weight/bold: 700 ``` --- ## Spacing Tokens ``` space/1: 4px space/2: 8px space/3: 12px space/4: 16px space/5: 20px space/6: 24px space/7: 32px space/8: 40px space/9: 48px space/10: 64px ``` --- ## Elevation Tokens ``` shadow/small: 0px 4px 8px rgba(0, 0, 0, 0.24) ``` --- ## Radius Tokens ``` radius/none: 0px ``` --- ## Component-Specific Tokens ### Buttons #### Icon Button ``` button/icon/size: 40px × 40px button/icon/background: colour/bg/primary button/icon/background-hover: colour/hover button/icon/icon-colour: colour/icon/primary button/icon/padding: 0 (square) button/icon/radius: radius/none ``` #### Text Button / Link ``` button/text/font: type/body button/text/colour: colour/text/primary button/text/colour-hover: colour/text/primary (underline or bg hint) button/text/background: colour/bg/primary ``` ### Inputs #### Dropdown ``` input/dropdown/height: 40px input/dropdown/padding: space/4 (horizontal) input/dropdown/font: type/body input/dropdown/background: colour/bg/primary input/dropdown/border: colour/border/medium input/dropdown/text-colour: colour/text/primary input/dropdown/icon-colour: colour/icon/primary input/dropdown/radius: radius/none ``` #### Calendar / Date Picker ``` input/calendar/cell-size: 40px (minimum) input/calendar/cell-padding: space/2 input/calendar/active-bg: colour/active input/calendar/active-text: colour/text/inverse input/calendar/inactive-bg: colour/bg/primary input/calendar/inactive-text: colour/text/primary input/calendar/font: type/body input/calendar/header-font: type/h4 ``` #### Location Picker ``` input/location/item-height: 44px (minimum touch target) input/location/item-padding: space/4 input/location/font: type/body input/location/background: colour/bg/primary input/location/text-colour: colour/text/primary input/location/arrow-colour: colour/icon/secondary ``` ### Panels #### Panel Header ``` panel/header/background: colour/bg/tertiary panel/header/height: 48px (minimum) panel/header/padding: space/4 panel/header/font: type/h4 or type/body panel/header/text-colour: colour/text/primary panel/header/border: colour/border/light (bottom) panel/header/icon-colour: colour/icon/primary panel/header/close-size: 24px ``` #### Panel Body ``` panel/body/background: colour/bg/primary panel/body/padding: space/6 panel/body/font: type/body panel/body/text-colour: colour/text/primary panel/body/shadow: shadow/small ``` #### List Item ``` list/item/height: 44px (minimum) list/item/padding: space/4 list/item/font: type/body list/item/background: colour/bg/primary list/item/background-hover: colour/hover list/item/text-colour: colour/text/primary list/item/border: colour/border/light (bottom) list/item/arrow-colour: colour/icon/secondary list/item/radius: radius/none ``` ### Indicators #### Notification Dot ``` indicator/dot/size: 8px indicator/dot/background: colour/alert indicator/dot/position: top-right (absolute, -2px offset) ``` #### Badge ``` indicator/badge/min-width: 28px indicator/badge/height: 28px indicator/badge/padding: space/2 (horizontal) indicator/badge/font: type/body indicator/badge/font-weight: bold indicator/badge/background: colour/active indicator/badge/text-colour: colour/text/inverse indicator/badge/radius: radius/none ``` --- ## Component-Agnostic Usage For any component not explicitly listed above: 1. Use `colour/bg/primary` for primary backgrounds 2. Use `colour/text/primary` for primary text 3. Use `colour/border/medium` for borders 4. Use `space/4` for standard padding, `space/6` for generous padding 5. Use `shadow/small` for elevated surfaces 6. Use `radius/none` for all corners 7. Use `type/body` for standard UI copy, `type/h4` for section headers 8. Apply `colour/active` (neutral/900) for selected/active states 9. Respect minimum touch target size of 44×44px for interactive elements","absoluteBoundingBox":{"x":48508.0,"y":5804.0,"width":1880.0,"height":7776.0},"isolatedAbsoluteRenderBounds":{"x":48506.16015625,"y":5809.65576171875,"width":1268.3984375,"height":7742.46435546875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":7776.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design Tokens\n\n## Token Structure\n\nTokens follow a three-layer architecture:\n1. **Primitive:** Raw colour values, named by hue and lightness stop\n2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`)\n3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens)\n\n---\n\n## Primitives\n\n### Colour/Cream\n\n```\ncolour/cream/50:    #FCFBF7\ncolour/cream/100:   #FAF6F0\ncolour/cream/200:   #F7F2E8\ncolour/cream/300:   #F4EEE0\ncolour/cream/400:   #F1E9D9\ncolour/cream/500:   #EFE5D1\ncolour/cream/600:   #ECE1C9\ncolour/cream/700:   #E9DCC2\ncolour/cream/800:   #E7D8BA\ncolour/cream/900:   #D9C5A0\n```\n\n### Colour/Neutral\n\n```\ncolour/neutral/0:     #FFFFFF\ncolour/neutral/50:    #F9F5F1\ncolour/neutral/100:   #E9E5E1\ncolour/neutral/200:   #D9D5D1\ncolour/neutral/300:   #C9C5C1\ncolour/neutral/400:   #B9B5B1\ncolour/neutral/500:   #A9A5A1\ncolour/neutral/600:   #999591\ncolour/neutral/700:   #898581\ncolour/neutral/800:   #494541\ncolour/neutral/900:   #292521\ncolour/neutral/1000:  #000000\n```\n\n### Colour/Status (TBD)\n\n```\ncolour/status/alert:  #FF6B35  (orange, for notifications — confirm value)\n```\n\n---\n\n## Semantic Tokens\n\n### Background\n\n```\ncolour/bg/primary:        colour/cream/500   (#EFE5D1)\ncolour/bg/secondary:      colour/cream/100   (#FAF6F0)\ncolour/bg/tertiary:       colour/cream/200   (#F7F2E8)\ncolour/bg/canvas:         colour/neutral/0   (#FFFFFF)\ncolour/bg/overlay-dark:   colour/neutral/1000 with 24% opacity\n```\n\n### Text\n\n```\ncolour/text/primary:      colour/neutral/600  (#999591)\ncolour/text/secondary:    colour/neutral/500  (#A9A5A1)\ncolour/text/tertiary:     colour/neutral/400  (#B9B5B1)\ncolour/text/inverse:      colour/neutral/0    (#FFFFFF)\ncolour/text/disabled:     colour/neutral/200  (#D9D5D1)\n```\n\n### Border\n\n```\ncolour/border/light:      colour/neutral/100  (#E9E5E1)\ncolour/border/medium:     colour/neutral/200  (#D9D5D1)\ncolour/border/strong:     colour/neutral/600  (#999591)\ncolour/border/focus:      colour/neutral/800  (#494541)\n```\n\n### Icon\n\n```\ncolour/icon/primary:      colour/neutral/800  (#494541)\ncolour/icon/secondary:    colour/neutral/600  (#999591)\ncolour/icon/disabled:     colour/neutral/200  (#D9D5D1)\ncolour/icon/inverse:      colour/neutral/0    (#FFFFFF)\n```\n\n### Status & Interaction\n\n```\ncolour/active:            colour/neutral/900  (#292521)\ncolour/hover:             colour/cream/400    (#F1E9D9)\ncolour/focus-ring:        colour/neutral/800  (#494541)\ncolour/alert:             colour/status/alert (#FF6B35)\ncolour/success:           (TBD)\ncolour/warning:           (TBD)\ncolour/info:              (TBD)\n```\n\n---\n\n## Typography Tokens\n\n### Font Family\n```\ntype/family:             PP Grotesk Mono\ntype/family/fallback:    monospace\n```\n\n### Font Sizes & Line Heights\n\n```\ntype/display/size:       48px\ntype/display/lineheight: 56px\ntype/display/weight:     bold\n\ntype/h1/size:            40px\ntype/h1/lineheight:      48px\ntype/h1/weight:          bold\n\ntype/h2/size:            32px\ntype/h2/lineheight:      40px\ntype/h2/weight:          bold\n\ntype/h3/size:            28px\ntype/h3/lineheight:      36px\ntype/h3/weight:          bold\n\ntype/h4/size:            24px\ntype/h4/lineheight:      32px\ntype/h4/weight:          bold\n\ntype/body-large/size:    20px\ntype/body-large/lineheight: 28px\ntype/body-large/weight:  regular\n\ntype/body/size:          16px\ntype/body/lineheight:    24px\ntype/body/weight:        regular\n\ntype/caption/size:       12px (deprecated — use type/body with neutral/400)\ntype/caption/lineheight: 16px\ntype/caption/weight:     light\n```\n\n### Weight Tokens\n\n```\ntype/weight/light:       300\ntype/weight/regular:     400\ntype/weight/bold:        700\n```\n\n---\n\n## Spacing Tokens\n\n```\nspace/1:   4px\nspace/2:   8px\nspace/3:   12px\nspace/4:   16px\nspace/5:   20px\nspace/6:   24px\nspace/7:   32px\nspace/8:   40px\nspace/9:   48px\nspace/10:  64px\n```\n\n---\n\n## Elevation Tokens\n\n```\nshadow/small:  0px 4px 8px rgba(0, 0, 0, 0.24)\n```\n\n---\n\n## Radius Tokens\n\n```\nradius/none:  0px\n```\n\n---\n\n## Component-Specific Tokens\n\n### Buttons\n\n#### Icon Button\n```\nbutton/icon/size:           40px × 40px\nbutton/icon/background:     colour/bg/primary\nbutton/icon/background-hover: colour/hover\nbutton/icon/icon-colour:    colour/icon/primary\nbutton/icon/padding:        0 (square)\nbutton/icon/radius:         radius/none\n```\n\n#### Text Button / Link\n```\nbutton/text/font:           type/body\nbutton/text/colour:         colour/text/primary\nbutton/text/colour-hover:   colour/text/primary (underline or bg hint)\nbutton/text/background:     colour/bg/primary\n```\n\n### Inputs\n\n#### Dropdown\n```\ninput/dropdown/height:      40px\ninput/dropdown/padding:     space/4 (horizontal)\ninput/dropdown/font:        type/body\ninput/dropdown/background:  colour/bg/primary\ninput/dropdown/border:      colour/border/medium\ninput/dropdown/text-colour: colour/text/primary\ninput/dropdown/icon-colour: colour/icon/primary\ninput/dropdown/radius:      radius/none\n```\n\n#### Calendar / Date Picker\n```\ninput/calendar/cell-size:       40px (minimum)\ninput/calendar/cell-padding:    space/2\ninput/calendar/active-bg:       colour/active\ninput/calendar/active-text:     colour/text/inverse\ninput/calendar/inactive-bg:     colour/bg/primary\ninput/calendar/inactive-text:   colour/text/primary\ninput/calendar/font:            type/body\ninput/calendar/header-font:     type/h4\n```\n\n#### Location Picker\n```\ninput/location/item-height:     44px (minimum touch target)\ninput/location/item-padding:    space/4\ninput/location/font:            type/body\ninput/location/background:      colour/bg/primary\ninput/location/text-colour:     colour/text/primary\ninput/location/arrow-colour:    colour/icon/secondary\n```\n\n### Panels\n\n#### Panel Header\n```\npanel/header/background:   colour/bg/tertiary\npanel/header/height:       48px (minimum)\npanel/header/padding:      space/4\npanel/header/font:         type/h4 or type/body\npanel/header/text-colour:  colour/text/primary\npanel/header/border:       colour/border/light (bottom)\npanel/header/icon-colour:  colour/icon/primary\npanel/header/close-size:   24px\n```\n\n#### Panel Body\n```\npanel/body/background:     colour/bg/primary\npanel/body/padding:        space/6\npanel/body/font:           type/body\npanel/body/text-colour:    colour/text/primary\npanel/body/shadow:         shadow/small\n```\n\n#### List Item\n```\nlist/item/height:          44px (minimum)\nlist/item/padding:         space/4\nlist/item/font:            type/body\nlist/item/background:      colour/bg/primary\nlist/item/background-hover: colour/hover\nlist/item/text-colour:     colour/text/primary\nlist/item/border:          colour/border/light (bottom)\nlist/item/arrow-colour:    colour/icon/secondary\nlist/item/radius:          radius/none\n```\n\n### Indicators\n\n#### Notification Dot\n```\nindicator/dot/size:        8px\nindicator/dot/background:  colour/alert\nindicator/dot/position:    top-right (absolute, -2px offset)\n```\n\n#### Badge\n```\nindicator/badge/min-width: 28px\nindicator/badge/height:    28px\nindicator/badge/padding:   space/2 (horizontal)\nindicator/badge/font:      type/body\nindicator/badge/font-weight: bold\nindicator/badge/background: colour/active\nindicator/badge/text-colour: colour/text/inverse\nindicator/badge/radius:    radius/none\n```\n\n---\n\n## Component-Agnostic Usage\n\nFor any component not explicitly listed above:\n1. Use `colour/bg/primary` for primary backgrounds\n2. Use `colour/text/primary` for primary text\n3. Use `colour/border/medium` for borders\n4. Use `space/4` for standard padding, `space/6` for generous padding\n5. Use `shadow/small` for elevated surfaces\n6. Use `radius/none` for all corners\n7. Use `type/body` for standard UI copy, `type/h4` for section headers\n8. Apply `colour/active` (neutral/900) for selected/active states\n9. Respect minimum touch target size of 44×44px for interactive elements\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20345":{"type":"TEXT","id":"78:20345","name":"TOKENS.MD","absoluteBoundingBox":{"x":53788.0,"y":9436.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53789.44140625,"y":9448.759765625,"width":175.90234375,"height":22.720703125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TOKENS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2671":{"type":"TEXT","id":"34:2671","name":"Agent preparation","absoluteBoundingBox":{"x":48124.0,"y":575.932006835938,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48124.3515625,"y":581.588012695312,"width":166.65625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Agent preparation","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20339":{"type":"TEXT","id":"78:20339","name":"TOKENS.MD","absoluteBoundingBox":{"x":48508.0,"y":5684.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48510.87890625,"y":5709.52001953125,"width":351.8046875,"height":45.43994140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TOKENS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2771":{"type":"TEXT","id":"34:2771","name":"Software design","absoluteBoundingBox":{"x":54300.0,"y":463.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":54300.78515625,"y":469.588043212891,"width":146.37890625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Software design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2743":{"type":"TEXT","id":"34:2743","name":"Product definition","absoluteBoundingBox":{"x":53476.0,"y":435.932037353516,"width":169.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":53477.6171875,"y":441.588043212891,"width":165.390625,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":169.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Product definition","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"41:3540":{"type":"TEXT","id":"41:3540","name":"DESIGN.MD","absoluteBoundingBox":{"x":48508.0,"y":212.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48513.375,"y":237.520004272461,"width":349.30859375,"height":45.4399871826172},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DESIGN.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20338":{"type":"FRAME","id":"78:20338","name":"2","absoluteBoundingBox":{"x":48488.0,"y":5628.0,"width":1920.0,"height":8008.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":5628.0,"width":1920.0,"height":8008.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,5472.0]],"size":{"x":1920.0,"y":8008.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20339","78:20340"]},"34:2715":{"type":"TEXT","id":"34:2715","name":"Design system","absoluteBoundingBox":{"x":52260.0,"y":407.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":52261.34375,"y":413.588043212891,"width":126.59765625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Design system","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20569":{"type":"TEXT","id":"78:20569","name":"ACCESSIBILITY.MD","absoluteBoundingBox":{"x":48508.0,"y":43988.0,"width":1880.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":48509.40625,"y":44013.51953125,"width":631.08984375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1880.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"ACCESSIBILITY.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20329":{"type":"TEXT","id":"78:20329","name":"# Augur Design System ## Overview Augur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering. **Typeface:** PP Grotesk Mono (Light, Regular, Bold) **Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius **Shadow:** Single elevation style for raised surfaces **Grid:** 8px base unit --- ## Colour System ### Primitives #### Cream ramp Used as primary background for UI surfaces, panels, secondary navigation. | Stop | Hex | Use | |---|---|---| | 50 | `#FCFBF7` | Lightest surface, hover states | | 100 | `#FAF6F0` | Secondary panel backgrounds | | 200 | `#F7F2E8` | Secondary nav bar, panel headers | | 300 | `#F4EEE0` | Subtle dividers, disabled states | | 400 | `#F1E9D9` | List item hover | | 500 | `#EFE5D1` | Baseline panel background | | 600 | `#ECE1C9` | Accent/selection tint | | 700 | `#E9DCC2` | Medium panel contrast | | 800 | `#E7D8BA` | Deep panel background, dark hover | | 900 | `#D9C5A0` | — | #### Neutral ramp Used for text, borders, icons, and status indicators. | Stop | Hex | Use | |---|---|---| | 0 | `#FFFFFF` | White backgrounds, icon fill on dark | | 50 | `#F9F5F1` | Very light backgrounds | | 100 | `#E9E5E1` | Light borders | | 200 | `#D9D5D1` | Subtle borders, disabled text | | 300 | `#C9C5C1` | Light dividers | | 400 | `#B9B5B1` | Tertiary text, secondary icons | | 500 | `#A9A5A1` | Secondary text | | 600 | `#999591` | Primary text | | 700 | `#898581` | Headings, emphasis | | 800 | `#494541` | Strong emphasis, icon fill | | 900 | `#292521` | Dark UI elements, active states | | 1000 | `#000000` | Black backgrounds, peak contrast | ### Semantics | Token | Primitive | Use | |---|---|---| | `colour/bg/primary` | `cream/500` | Panel backgrounds | | `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds | | `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers | | `colour/bg/canvas` | `white` | Main 3D canvas | | `colour/text/primary` | `neutral/600` | Body text, labels | | `colour/text/secondary` | `neutral/500` | Metadata, hints | | `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised | | `colour/text/inverse` | `neutral/0` | Text on dark backgrounds | | `colour/border/light` | `neutral/100` | Subtle dividers | | `colour/border/medium` | `neutral/200` | Standard borders | | `colour/border/strong` | `neutral/600` | Emphasis borders, outlines | | `colour/icon/primary` | `neutral/800` | Standard icons | | `colour/icon/secondary` | `neutral/600` | Secondary icons | | `colour/icon/disabled` | `neutral/200` | Disabled icons | | `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) | | `colour/active` | `neutral/900` | Selected states, active indicators | --- ## Typography **Font:** PP Grotesk Mono, monospace | Token | Size | Line height | Weight | Use | |---|---|---|---|---| | `type/display` | 48px | 56px | Bold | Hero headings, page titles | | `type/h1` | 40px | 48px | Bold | Section headings | | `type/h2` | 32px | 40px | Bold | Subsection headings | | `type/h3` | 28px | 36px | Bold | Panel titles, card headings | | `type/h4` | 24px | 32px | Bold | Secondary headings, labels | | `type/body-large` | 20px | 28px | Regular | Panel introductions, large body | | `type/body` | 16px | 24px | Regular | Standard body text, UI copy | ### Weight modifiers - Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`) - Regular: Default weight for body, labels, and copy - Bold: Headings, emphasis, CTA text ### Line length Monospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density. --- ## Spacing **Base unit:** 8px | Token | Value | Use | |---|---|---| | `space/1` | 4px | Tight gaps, icon-to-label spacing | | `space/2` | 8px | Component padding, fine gutters | | `space/3` | 12px | Internal spacing | | `space/4` | 16px | Standard padding, list gaps | | `space/5` | 20px | Generous padding | | `space/6` | 24px | Section padding, panel margins | | `space/7` | 32px | Major spacing, dividers | | `space/8` | 40px | Large gaps, section breaks | | `space/9` | 48px | Major layout spacing | | `space/10` | 64px | Canvas margins, page-level spacing | --- ## Elevation **Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns). | Token | Value | Use | |---|---|---| | `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards | --- ## Radius **All corners are square.** No border radius applied. | Token | Value | |---|---| | `radius/none` | 0px | --- ## Component Inventory ### Buttons - **Icon button** — Square, 40×40px, dark icon on cream background, no border - **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels - **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive ### Inputs - **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text - **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900` - **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows ### Panels & Modals - **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional - **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards - **Panel footer** — Optional, links or actions with arrow indicators - **Drawer shadow** — Applied to all raised panels ### Lists & Tables - **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`) - **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream - **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation ### Cards - **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows - **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links - **Data detail card** — Bar chart with axis labels, metadata footer ### Indicators - **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel - **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\" - **Active indicator** — `neutral/900` background or fill for selected/active states ### Navigation - **Top bar** — White background, logo (left), global filters (centre), user controls (right) - **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy - **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset) - **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body` --- ## Motion None specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close). --- ## Accessibility - **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text) - **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter - **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text - **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing - **Monospace typography:** Line length kept under 70 characters to maintain readability --- ## Usage Guidelines ### Tone Copy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity. ### Data presentation Prefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail. ### Panel interaction Panels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators. ### Colour application Cream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps. ### Monospace decisions All UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.","absoluteBoundingBox":{"x":48508.0,"y":332.0,"width":1880.0,"height":5184.0},"isolatedAbsoluteRenderBounds":{"x":48508.3515625,"y":337.656005859375,"width":1843.578125,"height":5150.4638671875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":5184.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design System\n\n## Overview\n\nAugur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering.\n\n**Typeface:** PP Grotesk Mono (Light, Regular, Bold)  \n**Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius  \n**Shadow:** Single elevation style for raised surfaces  \n**Grid:** 8px base unit\n\n---\n\n## Colour System\n\n### Primitives\n\n#### Cream ramp\nUsed as primary background for UI surfaces, panels, secondary navigation.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 50 | `#FCFBF7` | Lightest surface, hover states |\n| 100 | `#FAF6F0` | Secondary panel backgrounds |\n| 200 | `#F7F2E8` | Secondary nav bar, panel headers |\n| 300 | `#F4EEE0` | Subtle dividers, disabled states |\n| 400 | `#F1E9D9` | List item hover |\n| 500 | `#EFE5D1` | Baseline panel background |\n| 600 | `#ECE1C9` | Accent/selection tint |\n| 700 | `#E9DCC2` | Medium panel contrast |\n| 800 | `#E7D8BA` | Deep panel background, dark hover |\n| 900 | `#D9C5A0` | — |\n\n#### Neutral ramp\nUsed for text, borders, icons, and status indicators.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 0 | `#FFFFFF` | White backgrounds, icon fill on dark |\n| 50 | `#F9F5F1` | Very light backgrounds |\n| 100 | `#E9E5E1` | Light borders |\n| 200 | `#D9D5D1` | Subtle borders, disabled text |\n| 300 | `#C9C5C1` | Light dividers |\n| 400 | `#B9B5B1` | Tertiary text, secondary icons |\n| 500 | `#A9A5A1` | Secondary text |\n| 600 | `#999591` | Primary text |\n| 700 | `#898581` | Headings, emphasis |\n| 800 | `#494541` | Strong emphasis, icon fill |\n| 900 | `#292521` | Dark UI elements, active states |\n| 1000 | `#000000` | Black backgrounds, peak contrast |\n\n### Semantics\n\n| Token | Primitive | Use |\n|---|---|---|\n| `colour/bg/primary` | `cream/500` | Panel backgrounds |\n| `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds |\n| `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers |\n| `colour/bg/canvas` | `white` | Main 3D canvas |\n| `colour/text/primary` | `neutral/600` | Body text, labels |\n| `colour/text/secondary` | `neutral/500` | Metadata, hints |\n| `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised |\n| `colour/text/inverse` | `neutral/0` | Text on dark backgrounds |\n| `colour/border/light` | `neutral/100` | Subtle dividers |\n| `colour/border/medium` | `neutral/200` | Standard borders |\n| `colour/border/strong` | `neutral/600` | Emphasis borders, outlines |\n| `colour/icon/primary` | `neutral/800` | Standard icons |\n| `colour/icon/secondary` | `neutral/600` | Secondary icons |\n| `colour/icon/disabled` | `neutral/200` | Disabled icons |\n| `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) |\n| `colour/active` | `neutral/900` | Selected states, active indicators |\n\n---\n\n## Typography\n\n**Font:** PP Grotesk Mono, monospace\n\n| Token | Size | Line height | Weight | Use |\n|---|---|---|---|---|\n| `type/display` | 48px | 56px | Bold | Hero headings, page titles |\n| `type/h1` | 40px | 48px | Bold | Section headings |\n| `type/h2` | 32px | 40px | Bold | Subsection headings |\n| `type/h3` | 28px | 36px | Bold | Panel titles, card headings |\n| `type/h4` | 24px | 32px | Bold | Secondary headings, labels |\n| `type/body-large` | 20px | 28px | Regular | Panel introductions, large body |\n| `type/body` | 16px | 24px | Regular | Standard body text, UI copy |\n\n### Weight modifiers\n- Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`)\n- Regular: Default weight for body, labels, and copy\n- Bold: Headings, emphasis, CTA text\n\n### Line length\nMonospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density.\n\n---\n\n## Spacing\n\n**Base unit:** 8px\n\n| Token | Value | Use |\n|---|---|---|\n| `space/1` | 4px | Tight gaps, icon-to-label spacing |\n| `space/2` | 8px | Component padding, fine gutters |\n| `space/3` | 12px | Internal spacing |\n| `space/4` | 16px | Standard padding, list gaps |\n| `space/5` | 20px | Generous padding |\n| `space/6` | 24px | Section padding, panel margins |\n| `space/7` | 32px | Major spacing, dividers |\n| `space/8` | 40px | Large gaps, section breaks |\n| `space/9` | 48px | Major layout spacing |\n| `space/10` | 64px | Canvas margins, page-level spacing |\n\n---\n\n## Elevation\n\n**Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns).\n\n| Token | Value | Use |\n|---|---|---|\n| `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards |\n\n---\n\n## Radius\n\n**All corners are square.** No border radius applied.\n\n| Token | Value |\n|---|---|\n| `radius/none` | 0px |\n\n---\n\n## Component Inventory\n\n### Buttons\n- **Icon button** — Square, 40×40px, dark icon on cream background, no border\n- **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels\n- **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive\n\n### Inputs\n- **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text\n- **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900`\n- **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows\n\n### Panels & Modals\n- **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional\n- **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards\n- **Panel footer** — Optional, links or actions with arrow indicators\n- **Drawer shadow** — Applied to all raised panels\n\n### Lists & Tables\n- **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`)\n- **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream\n- **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation\n\n### Cards\n- **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows\n- **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links\n- **Data detail card** — Bar chart with axis labels, metadata footer\n\n### Indicators\n- **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel\n- **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\"\n- **Active indicator** — `neutral/900` background or fill for selected/active states\n\n### Navigation\n- **Top bar** — White background, logo (left), global filters (centre), user controls (right)\n- **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy\n- **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset)\n- **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body`\n\n---\n\n## Motion\n\nNone specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close).\n\n---\n\n## Accessibility\n\n- **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text)\n- **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter\n- **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text\n- **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing\n- **Monospace typography:** Line length kept under 70 characters to maintain readability\n\n---\n\n## Usage Guidelines\n\n### Tone\nCopy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity.\n\n### Data presentation\nPrefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail.\n\n### Panel interaction\nPanels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators.\n\n### Colour application\nCream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps.\n\n### Monospace decisions\nAll UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2663":{"type":"TEXT","id":"34:2663","name":"Design system","absoluteBoundingBox":{"x":48124.0,"y":431.932037353516,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48125.34375,"y":437.588043212891,"width":126.59765625,"height":14.4639892578125},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Design system","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2658":{"type":"FRAME","id":"34:2658","name":"Introduction","absoluteBoundingBox":{"x":48120.0,"y":359.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":359.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3310},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":781},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2659"]},"34:2668":{"type":"FRAME","id":"34:2668","name":"Final outcome","absoluteBoundingBox":{"x":48120.0,"y":539.932006835938,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":539.932006835938,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3315},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2341},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/final-outcome"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2669"]},"78:20579":{"type":"TEXT","id":"78:20579","name":"# Augur Accessibility ## Overview Augur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints. --- ## Colour Contrast ### Requirements All text and interactive elements must meet WCAG AA contrast ratios: - **4.5:1** for standard text (14px and below) - **3:1** for large text (18px+ or 14px+ bold) - **3:1** for graphical elements (borders, icons) and components ### Palette Compliance **Text on cream backgrounds:** - `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓ - `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓ - `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum) **Text on neutral/900 backgrounds (active state):** - `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓ **Icons on backgrounds:** - `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓ - `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓ **Alert/status colour (orange, TBD):** - Requires testing once final hex value is provided - Minimum 3:1 on white and cream backgrounds ### Testing **Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse **Checklist:** - [ ] All body text meets 4.5:1 contrast minimum - [ ] All headings meet 3:1 contrast minimum - [ ] All icons meet 3:1 contrast minimum - [ ] Active/selected states are visually distinct from inactive states - [ ] Links are underlined or otherwise distinct from body text - [ ] Colour alone is not used to convey information (pair with shape, text, or pattern) --- ## Typography ### Readability **Font choice:** - PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing - Augur uses monospace intentionally for data density and professional appearance **Line length:** - **Optimal:** 50–70 characters per line - **Minimum:** 40 characters (in narrow panels) - **Maximum:** 100 characters (avoid in body text) - Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓ **Line spacing:** - `type/body`: 24px line-height (1.5× base size) ✓ - `type/h3`: 36px line-height (1.29× base size) ✓ - Sufficient for readability and dyslexia-friendly rendering **Font size:** - Minimum 16px for body text ✓ - Headings scale appropriately (24px–48px) - Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette **Weight:** - Bold used for headings and emphasis (not for extended body text) - Regular weight for standard copy (readability optimized) - Light weight used sparingly (metadata, secondary text) ### Testing **Checklist:** - [ ] No text smaller than 14px for body content - [ ] Line-height at least 1.5× font size - [ ] Line length between 40–100 characters - [ ] Adequate white space between text blocks - [ ] Headings use semantic hierarchy (no skipped levels) --- ## Keyboard Navigation ### Focus Management **Requirement:** All interactive elements must be accessible via keyboard. **Focus order:** - Top-to-bottom, left-to-right reading order - Tab moves forward, Shift+Tab moves backward - When a modal/panel opens, focus moves to the first focusable element - When a modal/panel closes, focus returns to the triggering element - Focus trap in modals (Tab from last element wraps to first) **Focus indicator:** - 2px solid outline in `colour/focus-ring` (neutral/800, #494541) - 2px offset from element edge - Visible at all times (not removed on focus, only on blur) - High contrast (minimum 3:1) against background ### Keyboard Shortcuts **Global:** - Tab: Move to next focusable element - Shift+Tab: Move to previous focusable element - Escape: Close open modal, dropdown, or panel **Within dropdowns/pickers:** - Arrow Up/Down: Navigate items - Arrow Left/Right: Navigate tabs or columns - Enter: Select item - Escape: Close without selecting **Within panels:** - Enter: Activate button or link - Space: Toggle checkbox (if applicable) **Browser conventions:** - Alt+Left Arrow: Back (browser/application back) - Alt+Right Arrow: Forward - F5: Refresh (standard; not overridden) ### Testing **Checklist:** - [ ] All buttons and links are reachable via Tab - [ ] Focus order follows visual reading order - [ ] Focus indicator is always visible and high-contrast - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers and lists - [ ] No keyboard traps (user can Tab away from any element) - [ ] No content is keyboard-only or mouse-only --- ## Screen Reader Support ### Semantic HTML **Requirement:** Use semantic HTML to convey structure and meaning to assistive technology. **Tags:** - `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels) - `<button>`: Interactive buttons - `<a>`: Links (with descriptive text, not \"click here\") - `<ul>`, `<ol>`, `<li>`: Lists - `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables - `<label>`: Form label (associated via `for` or nesting) - `<nav>`: Navigation region - `<main>`: Main content area - `<aside>`: Sidebar or supplementary content - `<article>`: Self-contained content block ### ARIA Attributes **Requirement:** Use ARIA only to supplement semantic HTML, not replace it. **Landmarks:** - `role=\"banner\"`: Top bar / header - `role=\"main\"`: Primary content area - `role=\"navigation\"`: Navigation menu - `role=\"contentinfo\"`: Footer **Buttons & links:** - `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\") - `aria-pressed`: For toggle buttons (true/false state) - `aria-expanded`: For expandable/collapsible sections (true/false) **Lists:** - `aria-label`: For unlabeled lists (e.g. \"Related actions\") - `role=\"listbox\"`: For selectable item lists (dropdowns, pickers) - `aria-selected`: For selected items in a listbox **Live regions:** - `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\") - `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\") - `aria-atomic=\"true\"`: Announce entire region, not just changes - `role=\"alert\"`: For error messages or warnings **Images:** - `alt`: Descriptive text for images (mandatory for all `<img>` elements) - Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type) - Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>` **Form inputs:** - `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>` - `aria-label` if visible label not possible - `aria-describedby` for help text or error messages **Data tables:** - `<table>` with semantic structure - `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`) - `<td>` for data cells - Avoid merged cells; if necessary, use `colspan`/`rowspan` with care ### Screen Reader Testing **Tools:** - NVDA (Windows, free) - JAWS (Windows, paid) - VoiceOver (macOS/iOS, built-in) - TalkBack (Android, built-in) **Checklist:** - [ ] Panel headers and titles are announced correctly - [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\") - [ ] Links include descriptive text (not just \"arrow\" or \"more\") - [ ] Buttons include labels and states (not just icons) - [ ] Tables are announced with headers and structure - [ ] Error messages are announced immediately - [ ] Status updates are announced live (via aria-live) - [ ] Images have appropriate alt text --- ## Motion & Animation ### Vestibular & Photosensitivity **Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity. **Guidelines:** - No animations that move at more than 3 full revolutions per second - No flashing or flickering (no more than 3 flashes per second in a 1-second window) - No large moving areas that fill >25% of the viewport - Animation should be kept under 500ms for most interactions ### Prefers Reduced Motion **Requirement:** Respect the `prefers-reduced-motion` media query. **Implementation:** ```css @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } ``` **Checklist:** - [ ] Panel transitions respect `prefers-reduced-motion` - [ ] Hover animations are minimal (no parallax or large movements) - [ ] Loading states don't use spinning or flashing - [ ] No auto-playing videos or audio --- ## Touch & Mobile ### Touch Target Size **Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements). **Augur components:** - Icon button: 40×40px (meets requirement with padding) - List item: 44px height minimum - Dropdown: 40px height + `space/4` padding vertical (meets requirement) - Text button: 40px height minimum **Spacing:** - Between touch targets: At least 8px (preferably 12px) - Avoid small, closely-spaced buttons ### Gesture Support **Requirement:** Don't rely on complex gestures; provide alternative inputs. **Supported gestures:** - Tap: Standard button/link activation - Long-press: Optional (secondary action, always has keyboard alternative) - Swipe: Optional (dismiss panels on mobile, always has close button) - Pinch: Optional (zoom; always has +/- buttons) **Mobile-specific:** - On narrow viewports, panels overlay canvas instead of docking - Swipe panels right to dismiss (alternative: close X button) - Landscape orientation supported (panels still dock right if space allows) ### Testing **Checklist:** - [ ] All buttons are at least 44×44px - [ ] Touch targets have at least 8px spacing - [ ] No reliance on hover states (buttons work via tap) - [ ] Landscape and portrait orientations both work - [ ] Swipe and pinch have keyboard alternatives --- ## Testing Checklist ### Automated Testing **Tools:** - Lighthouse (Chrome DevTools) - axe DevTools (browser extension) - WAVE (WebAIM extension) **Run for:** - [ ] Colour contrast (all text, icons, borders) - [ ] Missing alt text - [ ] Missing form labels - [ ] Missing heading hierarchy - [ ] Keyboard traps - [ ] Focus management - [ ] ARIA usage errors ### Manual Testing **Keyboard:** - [ ] Tab through entire page, confirm logical order - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers - [ ] Focus indicator always visible - [ ] No keyboard traps **Screen reader (NVDA or VoiceOver):** - [ ] Headings announce correctly - [ ] List items announce with count - [ ] Links have descriptive text - [ ] Buttons include labels and states - [ ] Errors announce immediately - [ ] Live regions update correctly **Visual:** - [ ] Text is at least 14px - [ ] Line-height is at least 1.5× - [ ] Line length is 40–100 characters - [ ] Headings use semantic hierarchy - [ ] Colour contrast meets WCAG AA - [ ] Focus indicator is always visible - [ ] No information conveyed by colour alone **Mobile:** - [ ] Touch targets are 44×44px - [ ] Landscape and portrait work - [ ] Swipe/pinch have alternatives ### Browser Compatibility **Test on:** - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) - Mobile browsers (Safari iOS, Chrome Android) ### Assistive Technology **Test with:** - NVDA (free, Windows) - JAWS (paid, Windows) - VoiceOver (built-in, macOS/iOS) - TalkBack (built-in, Android) --- ## Remediation If an accessibility issue is found: 1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor) 2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog 3. **Fix:** Implement semantic HTML, ARIA, or CSS changes 4. **Retest:** Confirm fix with automated tool and manual testing 5. **Verify:** Test fix on multiple screen readers and browsers --- ## Resources - **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/ - **WebAIM:** https://webaim.org/ - **A11y Project:** https://www.a11yproject.com/ - **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/ - **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ --- ## Compliance Statement Augur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline. **Last audit:** [Date] **Next audit:** [Date + 3 months] **Issues:** [Link to issue tracker]","absoluteBoundingBox":{"x":54316.0,"y":76839.9296875,"width":304.0,"height":16008.0},"isolatedAbsoluteRenderBounds":{"x":54314.16015625,"y":76845.5859375,"width":303.9296875,"height":15974.0625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":304.0,"y":16008.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Accessibility\n\n## Overview\n\nAugur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints.\n\n---\n\n## Colour Contrast\n\n### Requirements\n\nAll text and interactive elements must meet WCAG AA contrast ratios:\n- **4.5:1** for standard text (14px and below)\n- **3:1** for large text (18px+ or 14px+ bold)\n- **3:1** for graphical elements (borders, icons) and components\n\n### Palette Compliance\n\n**Text on cream backgrounds:**\n- `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓\n- `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓\n- `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum)\n\n**Text on neutral/900 backgrounds (active state):**\n- `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓\n\n**Icons on backgrounds:**\n- `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓\n- `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓\n\n**Alert/status colour (orange, TBD):**\n- Requires testing once final hex value is provided\n- Minimum 3:1 on white and cream backgrounds\n\n### Testing\n\n**Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse\n\n**Checklist:**\n- [ ] All body text meets 4.5:1 contrast minimum\n- [ ] All headings meet 3:1 contrast minimum\n- [ ] All icons meet 3:1 contrast minimum\n- [ ] Active/selected states are visually distinct from inactive states\n- [ ] Links are underlined or otherwise distinct from body text\n- [ ] Colour alone is not used to convey information (pair with shape, text, or pattern)\n\n---\n\n## Typography\n\n### Readability\n\n**Font choice:**\n- PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing\n- Augur uses monospace intentionally for data density and professional appearance\n\n**Line length:**\n- **Optimal:** 50–70 characters per line\n- **Minimum:** 40 characters (in narrow panels)\n- **Maximum:** 100 characters (avoid in body text)\n- Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓\n\n**Line spacing:**\n- `type/body`: 24px line-height (1.5× base size) ✓\n- `type/h3`: 36px line-height (1.29× base size) ✓\n- Sufficient for readability and dyslexia-friendly rendering\n\n**Font size:**\n- Minimum 16px for body text ✓\n- Headings scale appropriately (24px–48px)\n- Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette\n\n**Weight:**\n- Bold used for headings and emphasis (not for extended body text)\n- Regular weight for standard copy (readability optimized)\n- Light weight used sparingly (metadata, secondary text)\n\n### Testing\n\n**Checklist:**\n- [ ] No text smaller than 14px for body content\n- [ ] Line-height at least 1.5× font size\n- [ ] Line length between 40–100 characters\n- [ ] Adequate white space between text blocks\n- [ ] Headings use semantic hierarchy (no skipped levels)\n\n---\n\n## Keyboard Navigation\n\n### Focus Management\n\n**Requirement:** All interactive elements must be accessible via keyboard.\n\n**Focus order:**\n- Top-to-bottom, left-to-right reading order\n- Tab moves forward, Shift+Tab moves backward\n- When a modal/panel opens, focus moves to the first focusable element\n- When a modal/panel closes, focus returns to the triggering element\n- Focus trap in modals (Tab from last element wraps to first)\n\n**Focus indicator:**\n- 2px solid outline in `colour/focus-ring` (neutral/800, #494541)\n- 2px offset from element edge\n- Visible at all times (not removed on focus, only on blur)\n- High contrast (minimum 3:1) against background\n\n### Keyboard Shortcuts\n\n**Global:**\n- Tab: Move to next focusable element\n- Shift+Tab: Move to previous focusable element\n- Escape: Close open modal, dropdown, or panel\n\n**Within dropdowns/pickers:**\n- Arrow Up/Down: Navigate items\n- Arrow Left/Right: Navigate tabs or columns\n- Enter: Select item\n- Escape: Close without selecting\n\n**Within panels:**\n- Enter: Activate button or link\n- Space: Toggle checkbox (if applicable)\n\n**Browser conventions:**\n- Alt+Left Arrow: Back (browser/application back)\n- Alt+Right Arrow: Forward\n- F5: Refresh (standard; not overridden)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons and links are reachable via Tab\n- [ ] Focus order follows visual reading order\n- [ ] Focus indicator is always visible and high-contrast\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers and lists\n- [ ] No keyboard traps (user can Tab away from any element)\n- [ ] No content is keyboard-only or mouse-only\n\n---\n\n## Screen Reader Support\n\n### Semantic HTML\n\n**Requirement:** Use semantic HTML to convey structure and meaning to assistive technology.\n\n**Tags:**\n- `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels)\n- `<button>`: Interactive buttons\n- `<a>`: Links (with descriptive text, not \"click here\")\n- `<ul>`, `<ol>`, `<li>`: Lists\n- `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables\n- `<label>`: Form label (associated via `for` or nesting)\n- `<nav>`: Navigation region\n- `<main>`: Main content area\n- `<aside>`: Sidebar or supplementary content\n- `<article>`: Self-contained content block\n\n### ARIA Attributes\n\n**Requirement:** Use ARIA only to supplement semantic HTML, not replace it.\n\n**Landmarks:**\n- `role=\"banner\"`: Top bar / header\n- `role=\"main\"`: Primary content area\n- `role=\"navigation\"`: Navigation menu\n- `role=\"contentinfo\"`: Footer\n\n**Buttons & links:**\n- `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\")\n- `aria-pressed`: For toggle buttons (true/false state)\n- `aria-expanded`: For expandable/collapsible sections (true/false)\n\n**Lists:**\n- `aria-label`: For unlabeled lists (e.g. \"Related actions\")\n- `role=\"listbox\"`: For selectable item lists (dropdowns, pickers)\n- `aria-selected`: For selected items in a listbox\n\n**Live regions:**\n- `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\")\n- `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\")\n- `aria-atomic=\"true\"`: Announce entire region, not just changes\n- `role=\"alert\"`: For error messages or warnings\n\n**Images:**\n- `alt`: Descriptive text for images (mandatory for all `<img>` elements)\n- Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type)\n- Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>`\n\n**Form inputs:**\n- `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>`\n- `aria-label` if visible label not possible\n- `aria-describedby` for help text or error messages\n\n**Data tables:**\n- `<table>` with semantic structure\n- `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`)\n- `<td>` for data cells\n- Avoid merged cells; if necessary, use `colspan`/`rowspan` with care\n\n### Screen Reader Testing\n\n**Tools:**\n- NVDA (Windows, free)\n- JAWS (Windows, paid)\n- VoiceOver (macOS/iOS, built-in)\n- TalkBack (Android, built-in)\n\n**Checklist:**\n- [ ] Panel headers and titles are announced correctly\n- [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\")\n- [ ] Links include descriptive text (not just \"arrow\" or \"more\")\n- [ ] Buttons include labels and states (not just icons)\n- [ ] Tables are announced with headers and structure\n- [ ] Error messages are announced immediately\n- [ ] Status updates are announced live (via aria-live)\n- [ ] Images have appropriate alt text\n\n---\n\n## Motion & Animation\n\n### Vestibular & Photosensitivity\n\n**Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity.\n\n**Guidelines:**\n- No animations that move at more than 3 full revolutions per second\n- No flashing or flickering (no more than 3 flashes per second in a 1-second window)\n- No large moving areas that fill >25% of the viewport\n- Animation should be kept under 500ms for most interactions\n\n### Prefers Reduced Motion\n\n**Requirement:** Respect the `prefers-reduced-motion` media query.\n\n**Implementation:**\n```css\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n  }\n}\n```\n\n**Checklist:**\n- [ ] Panel transitions respect `prefers-reduced-motion`\n- [ ] Hover animations are minimal (no parallax or large movements)\n- [ ] Loading states don't use spinning or flashing\n- [ ] No auto-playing videos or audio\n\n---\n\n## Touch & Mobile\n\n### Touch Target Size\n\n**Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements).\n\n**Augur components:**\n- Icon button: 40×40px (meets requirement with padding)\n- List item: 44px height minimum\n- Dropdown: 40px height + `space/4` padding vertical (meets requirement)\n- Text button: 40px height minimum\n\n**Spacing:**\n- Between touch targets: At least 8px (preferably 12px)\n- Avoid small, closely-spaced buttons\n\n### Gesture Support\n\n**Requirement:** Don't rely on complex gestures; provide alternative inputs.\n\n**Supported gestures:**\n- Tap: Standard button/link activation\n- Long-press: Optional (secondary action, always has keyboard alternative)\n- Swipe: Optional (dismiss panels on mobile, always has close button)\n- Pinch: Optional (zoom; always has +/- buttons)\n\n**Mobile-specific:**\n- On narrow viewports, panels overlay canvas instead of docking\n- Swipe panels right to dismiss (alternative: close X button)\n- Landscape orientation supported (panels still dock right if space allows)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons are at least 44×44px\n- [ ] Touch targets have at least 8px spacing\n- [ ] No reliance on hover states (buttons work via tap)\n- [ ] Landscape and portrait orientations both work\n- [ ] Swipe and pinch have keyboard alternatives\n\n---\n\n## Testing Checklist\n\n### Automated Testing\n\n**Tools:**\n- Lighthouse (Chrome DevTools)\n- axe DevTools (browser extension)\n- WAVE (WebAIM extension)\n\n**Run for:**\n- [ ] Colour contrast (all text, icons, borders)\n- [ ] Missing alt text\n- [ ] Missing form labels\n- [ ] Missing heading hierarchy\n- [ ] Keyboard traps\n- [ ] Focus management\n- [ ] ARIA usage errors\n\n### Manual Testing\n\n**Keyboard:**\n- [ ] Tab through entire page, confirm logical order\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers\n- [ ] Focus indicator always visible\n- [ ] No keyboard traps\n\n**Screen reader (NVDA or VoiceOver):**\n- [ ] Headings announce correctly\n- [ ] List items announce with count\n- [ ] Links have descriptive text\n- [ ] Buttons include labels and states\n- [ ] Errors announce immediately\n- [ ] Live regions update correctly\n\n**Visual:**\n- [ ] Text is at least 14px\n- [ ] Line-height is at least 1.5×\n- [ ] Line length is 40–100 characters\n- [ ] Headings use semantic hierarchy\n- [ ] Colour contrast meets WCAG AA\n- [ ] Focus indicator is always visible\n- [ ] No information conveyed by colour alone\n\n**Mobile:**\n- [ ] Touch targets are 44×44px\n- [ ] Landscape and portrait work\n- [ ] Swipe/pinch have alternatives\n\n### Browser Compatibility\n\n**Test on:**\n- Chrome (latest)\n- Firefox (latest)\n- Safari (latest)\n- Edge (latest)\n- Mobile browsers (Safari iOS, Chrome Android)\n\n### Assistive Technology\n\n**Test with:**\n- NVDA (free, Windows)\n- JAWS (paid, Windows)\n- VoiceOver (built-in, macOS/iOS)\n- TalkBack (built-in, Android)\n\n---\n\n## Remediation\n\nIf an accessibility issue is found:\n\n1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor)\n2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog\n3. **Fix:** Implement semantic HTML, ARIA, or CSS changes\n4. **Retest:** Confirm fix with automated tool and manual testing\n5. **Verify:** Test fix on multiple screen readers and browsers\n\n---\n\n## Resources\n\n- **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/\n- **WebAIM:** https://webaim.org/\n- **A11y Project:** https://www.a11yproject.com/\n- **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/\n- **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/\n\n---\n\n## Compliance Statement\n\nAugur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline.\n\n**Last audit:** [Date]  \n**Next audit:** [Date + 3 months]  \n**Issues:** [Link to issue tracker]\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2676":{"type":"FRAME","id":"34:2676","name":"Desktop medium","absoluteBoundingBox":{"x":50584.0,"y":100.0,"width":1576.0,"height":54160.0},"isolatedAbsoluteRenderBounds":{"x":50584.0,"y":100.0,"width":1576.0,"height":54160.0},"relativeTransform":[[1.0,0.0,2584.0],[0.0,1.0,100.0]],"size":{"x":1576.0,"y":54160.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.988235294818878,"g":0.984313726425171,"b":0.968627452850342,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"HORIZONTAL","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["34:2677","34:2698"]},"78:20575":{"type":"TEXT","id":"78:20575","name":"ACCESSIBILITY.MD","absoluteBoundingBox":{"x":53788.0,"y":65852.0,"width":384.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":53788.703125,"y":65864.7578125,"width":315.546875,"height":22.71875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":384.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"ACCESSIBILITY.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2666":{"type":"FRAME","id":"34:2666","name":"Software design","absoluteBoundingBox":{"x":48120.0,"y":503.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":503.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3314},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":34,"localID":2033},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/software-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2667"]},"34:2651":{"type":"FRAME","id":"34:2651","name":"left","absoluteBoundingBox":{"x":48064.0,"y":100.0,"width":312.0,"height":555.932006835938},"isolatedAbsoluteRenderBounds":{"x":48064.0,"y":100.0,"width":312.0,"height":555.932006835938},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":312.0,"y":555.932006835938},"fills":[],"strokeAlign":"INSIDE","scrollBehavior":"STICKY_SCROLLS","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":56.0,"paddingBottom":56.0,"paddingLeft":56.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["34:2652","63:17417","34:2657"]},"78:20387":{"type":"TEXT","id":"78:20387","name":"# Augur Patterns ## Overview Patterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens. --- ## Layout Patterns ### Panel-Based Spatial Layout **Structure:** Main canvas (left/centre) + draggable side panels (right) **Anatomy:** - **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width - **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small` - **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions - **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset) - **Timeline scrubber:** Bottom of viewport, spanning full width **Responsive behaviour:** - On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss - On desktop (>768px): panels dock on right, canvas shrinks to accommodate **Use case:** Dashboard, map view, live monitoring --- ### Detail Drill-Down **Structure:** List panel → Detail panel → Related panels **Flow:** 1. User clicks list item (e.g. \"Potential theft\" in Events) 2. Selected event panel opens (or detail drawer slides in) 3. Detail panel shows full information + related action links (Cameras, People, Timeline) 4. User clicks action link to open related panel 5. Back arrow returns to selected event detail **Panel stacking:** - Primary panel: Selected event - Secondary panel: Related person, timeline, or camera - Tertiary panel: If user drills deeper (e.g. timeline → specific incident) **Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel --- ### Modal Pickers (Date, Location) **Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation **Flow:** 1. User clicks \"When\" or \"Where\" dropdown in top bar 2. Picker modal slides up from bottom or appears inline 3. User navigates picker (tabs, lists, grid cells) 4. User selects option 5. Picker closes, filter updates, interface refreshes with new data **Keyboard support:** - Arrow keys to navigate picker items - Enter to select - Escape to close without selecting **Visual feedback:** - Selected item highlighted in dark (`colour/active`) - Current selection persists until changed --- ## Interaction Patterns ### Selection & Highlighting **Primary flow:** 1. User sees list of items (events, people, data points) 2. User clicks item to select 3. Item highlights with background `colour/hover` 4. Related detail panel opens or updates **Visual states:** - **Default:** `colour/bg/primary` background, `colour/text/primary` text - **Hover:** `colour/hover` background (cream/400), text unchanged - **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text **Keyboard support:** - Arrow keys to navigate list - Enter to select - Space to select (optional) --- ### Navigation via Back/Close **Pattern:** Panels always include back arrow (navigation) and close X (dismiss) **Back arrow:** - Returns to previous state or parent panel - Preserves scroll position (if applicable) - Visible only if there's a previous state to return to **Close X:** - Dismisses current panel - Returns to base view (e.g. map with no detail panels) - Always visible in panel header **Keyboard support:** - Escape key acts as close X (dismisses panel) - Alt+Left arrow acts as back button --- ### Status Indicators & Urgency **Alert dot (orange):** - Small 8px circle, top-right of avatar or button - Indicates urgent status (unreviewed, flagged, etc.) - Colour: `colour/alert` (#FF6B35, TBD — confirm value) **Notification list:** - \"Just now\" badges for recent alerts - Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp - Orange dot next to most recent items - Read/unread states (optional; not visible in current design) **Capacity badge:** - Circular dark badge (neutral/900) with white percentage text - Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\" **Ratio badge:** - Circular dark badge with split label, e.g. \"M:32 F:68\" - Indicates demographic breakdown or ratio metric **Temporal indicator:** - \"LIVE\" badge in calendar/date picker (active period tab) - Indicates real-time data stream --- ### Data Presentation **List-based:** - Categorical lists (Customer, Sales, Operational data) - Each list item is a link/button to drill-down - Section headers (`type/h4`) group related items **Card-based:** - Event card: image + avatar + title + metadata + description + related actions - Person card: avatar + name + metadata + related actions - Data card: chart + metadata **Chart-based:** - Bar charts with grey bars, axis labels - No chart title on the chart itself; title lives in panel header - Legend optional (axis labels sufficient for simple charts) **Table-based:** - Column headers in `type/h4` (bold monospace) - Rows in `type/body` (regular monospace) - No alternating row colours (density over visual variety) - Minimal borders; dividers use `colour/border/light` --- ## Visual Hierarchy ### Typographic **Dominance order (largest → smallest):** 1. `type/display` (48px) — Page title, hero heading (rarely used in Augur) 2. `type/h1` (40px) — Major section heading 3. `type/h2` (32px) — Subsection heading 4. `type/h3` (28px) — Panel title, card heading 5. `type/h4` (24px) — Section header, label, secondary heading 6. `type/body-large` (20px) — Introductory text, large body 7. `type/body` (16px) — Standard UI copy, list items, descriptions 8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`) **Weight hierarchy:** - Bold: Headings, emphasis, CTAs - Regular: Body text, labels, most UI copy - Light: Secondary text, metadata (applied as weight override, not separate style) --- ### Colour **Dominance order:** 1. Cream backgrounds (`colour/cream`) dominate visual space 2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability 3. Dark active state (`colour/active`, neutral/900) indicates selection 4. Orange accent (`colour/alert`) draws attention to urgent items 5. White canvas provides separation between 3D view and UI **Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts. --- ## Spacing & Alignment ### Padding **Panel padding:** - Header: `space/4` (16px) on all sides - Body: `space/6` (24px) on all sides - List item: `space/4` (16px) horizontal, `space/2` (8px) vertical **Margins:** - Between sections within a panel: `space/6` (24px) - Between list items: None (border-based dividers) - Between action links: `space/4` (16px) ### Grid **Base unit:** 8px **Canvas width:** Variable (full minus panel width) **Panel width:** 320px fixed **Content width:** Full panel width minus padding **Align to 8px grid:** - Position: multiples of 8px - Size: multiples of 8px - Spacing: use `space/*` tokens (multiples of 4px or 8px) --- ## Motion (Future) **Tentative patterns (not currently specified):** - Panel slide-in/slide-out (250ms ease-out) - Dropdown fade-in (150ms ease-out) - Item hover scale (subtle, 1.02× scale) - Colour transitions (200ms ease-out for hover/active states) **Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation. --- ## Accessibility Patterns ### Focus Management **Pattern:** Focus should move logically through the interface. - Tab order follows visual/reading order (left-to-right, top-to-bottom) - When a panel opens, focus moves to the panel's first focusable element - When a panel closes, focus returns to the triggering element - Modals trap focus (Tab wraps to first element after last) **Visual focus indicator:** - 2px outline in `colour/focus-ring` (neutral/800) - 2px offset from element boundary - Applies to all buttons, links, form inputs, and interactive elements --- ### Screen Reader Announcements **Patterns:** - When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\") - When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\") - When an action completes: Announce result (e.g. \"Filter applied, 12 results\") **Implementation:** - Use `aria-live=\"polite\"` for non-critical updates - Use `aria-live=\"assertive\"` for urgent alerts - Use `role=\"alert\"` for error messages --- ### Semantic HTML **Patterns:** - Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels) - Buttons: Use `<button>` for actions; `<a>` for navigation - Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\") - Lists: Use `<ul>` / `<ol>` / `<li>` for list content - Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically - Forms: Use `<label>` associated with inputs via `for` attribute or nesting --- ## Performance Patterns ### Data Rendering **Principle:** Render visible data first; load additional data on scroll or on-demand. - Panel lists: Render first 20 items, lazy-load on scroll - Charts: Render at target width; no real-time updates for high-frequency data - 3D canvas: Render at 60fps; debounce pan/zoom interactions ### Caching - Filter selections (Where, When) cached in session storage - Panel scroll positions remembered during session - Charts cached until time range changes --- ## Error & Empty States ### Empty State **Pattern:** When no data matches filter or list is empty. **Display:** - Panel body shows centered, light grey message - Message: `type/body` in `colour/text/secondary` - Text: \"No [items] found\" or \"Check your filters\" - Optional icon above text (light grey, 48×48px) **Example:** \"No people found. Check your filters or adjust the time range.\" --- ### Error State **Pattern:** When an action fails or data cannot load. **Display:** - Panel body shows centered error message - Message: `type/body` in `colour/alert` (orange, once defined) - Heading: `type/h4` \"Error\" or specific error title - Optional retry button below message - Optional error code for support (small grey text below) **Example:** \"Error loading data. Status code: 500. Retry?\" **Keyboard support:** - Tab to retry button, Enter to retry - Escape to close error or return to previous state --- ## Responsive Breakpoints **Mobile (<768px):** - Panels overlay canvas at full width - Panels are swipeable/draggable to dismiss - Top bar condenses (logo smaller, icons only for filters) - Secondary nav wraps or becomes scrollable **Tablet (768px–1200px):** - Panels dock on right at 300px width - Canvas shrinks but remains visible - Secondary nav visible, single row **Desktop (>1200px):** - Panels dock on right at 320px width - Canvas full viewport minus panel width - All controls visible, horizontal layout preferred","absoluteBoundingBox":{"x":48508.0,"y":25484.0,"width":1880.0,"height":8520.0},"isolatedAbsoluteRenderBounds":{"x":48508.91015625,"y":25490.119140625,"width":1843.98046875,"height":8485.599609375},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":8520.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Patterns\n\n## Overview\n\nPatterns describe recurring interaction flows, layout conventions, and compositional principles used across Augur. These patterns help maintain consistency and guide implementation of new screens.\n\n---\n\n## Layout Patterns\n\n### Panel-Based Spatial Layout\n\n**Structure:** Main canvas (left/centre) + draggable side panels (right)\n\n**Anatomy:**\n- **Canvas:** 3D isometric view or 2D map, white background (`colour/neutral/0`), full viewport width minus panel width\n- **Primary panel:** 320px fixed width, right-aligned, cream background (`colour/bg/primary`), elevated with `shadow/small`\n- **Secondary panels:** Stack behind primary panel, accessible via back navigation or stacking interactions\n- **Floating controls:** Bottom-right corner of canvas (2D/3D, zoom, reset)\n- **Timeline scrubber:** Bottom of viewport, spanning full width\n\n**Responsive behaviour:**\n- On narrow viewports (<768px): panels overlay canvas, swipeable to dismiss\n- On desktop (>768px): panels dock on right, canvas shrinks to accommodate\n\n**Use case:** Dashboard, map view, live monitoring\n\n---\n\n### Detail Drill-Down\n\n**Structure:** List panel → Detail panel → Related panels\n\n**Flow:**\n1. User clicks list item (e.g. \"Potential theft\" in Events)\n2. Selected event panel opens (or detail drawer slides in)\n3. Detail panel shows full information + related action links (Cameras, People, Timeline)\n4. User clicks action link to open related panel\n5. Back arrow returns to selected event detail\n\n**Panel stacking:**\n- Primary panel: Selected event\n- Secondary panel: Related person, timeline, or camera\n- Tertiary panel: If user drills deeper (e.g. timeline → specific incident)\n\n**Key principle:** Back arrow always navigates to previous panel; close X always dismisses current panel\n\n---\n\n### Modal Pickers (Date, Location)\n\n**Structure:** Dropdown trigger → Modal picker overlay → Selection confirmation\n\n**Flow:**\n1. User clicks \"When\" or \"Where\" dropdown in top bar\n2. Picker modal slides up from bottom or appears inline\n3. User navigates picker (tabs, lists, grid cells)\n4. User selects option\n5. Picker closes, filter updates, interface refreshes with new data\n\n**Keyboard support:**\n- Arrow keys to navigate picker items\n- Enter to select\n- Escape to close without selecting\n\n**Visual feedback:**\n- Selected item highlighted in dark (`colour/active`)\n- Current selection persists until changed\n\n---\n\n## Interaction Patterns\n\n### Selection & Highlighting\n\n**Primary flow:**\n1. User sees list of items (events, people, data points)\n2. User clicks item to select\n3. Item highlights with background `colour/hover`\n4. Related detail panel opens or updates\n\n**Visual states:**\n- **Default:** `colour/bg/primary` background, `colour/text/primary` text\n- **Hover:** `colour/hover` background (cream/400), text unchanged\n- **Selected/active:** `colour/active` background (neutral/900), `colour/text/inverse` text\n\n**Keyboard support:**\n- Arrow keys to navigate list\n- Enter to select\n- Space to select (optional)\n\n---\n\n### Navigation via Back/Close\n\n**Pattern:** Panels always include back arrow (navigation) and close X (dismiss)\n\n**Back arrow:**\n- Returns to previous state or parent panel\n- Preserves scroll position (if applicable)\n- Visible only if there's a previous state to return to\n\n**Close X:**\n- Dismisses current panel\n- Returns to base view (e.g. map with no detail panels)\n- Always visible in panel header\n\n**Keyboard support:**\n- Escape key acts as close X (dismisses panel)\n- Alt+Left arrow acts as back button\n\n---\n\n### Status Indicators & Urgency\n\n**Alert dot (orange):**\n- Small 8px circle, top-right of avatar or button\n- Indicates urgent status (unreviewed, flagged, etc.)\n- Colour: `colour/alert` (#FF6B35, TBD — confirm value)\n\n**Notification list:**\n- \"Just now\" badges for recent alerts\n- Time-based labels: \"4 mins ago\", \"Yesterday\", timestamp\n- Orange dot next to most recent items\n- Read/unread states (optional; not visible in current design)\n\n**Capacity badge:**\n- Circular dark badge (neutral/900) with white percentage text\n- Positioned in notification item, e.g. \"92% (approaching full capacity, ground floor)\"\n\n**Ratio badge:**\n- Circular dark badge with split label, e.g. \"M:32 F:68\"\n- Indicates demographic breakdown or ratio metric\n\n**Temporal indicator:**\n- \"LIVE\" badge in calendar/date picker (active period tab)\n- Indicates real-time data stream\n\n---\n\n### Data Presentation\n\n**List-based:**\n- Categorical lists (Customer, Sales, Operational data)\n- Each list item is a link/button to drill-down\n- Section headers (`type/h4`) group related items\n\n**Card-based:**\n- Event card: image + avatar + title + metadata + description + related actions\n- Person card: avatar + name + metadata + related actions\n- Data card: chart + metadata\n\n**Chart-based:**\n- Bar charts with grey bars, axis labels\n- No chart title on the chart itself; title lives in panel header\n- Legend optional (axis labels sufficient for simple charts)\n\n**Table-based:**\n- Column headers in `type/h4` (bold monospace)\n- Rows in `type/body` (regular monospace)\n- No alternating row colours (density over visual variety)\n- Minimal borders; dividers use `colour/border/light`\n\n---\n\n## Visual Hierarchy\n\n### Typographic\n\n**Dominance order (largest → smallest):**\n1. `type/display` (48px) — Page title, hero heading (rarely used in Augur)\n2. `type/h1` (40px) — Major section heading\n3. `type/h2` (32px) — Subsection heading\n4. `type/h3` (28px) — Panel title, card heading\n5. `type/h4` (24px) — Section header, label, secondary heading\n6. `type/body-large` (20px) — Introductory text, large body\n7. `type/body` (16px) — Standard UI copy, list items, descriptions\n8. `type/caption` (12px) — Secondary metadata (deprecated; use `type/body` with `colour/text/secondary`)\n\n**Weight hierarchy:**\n- Bold: Headings, emphasis, CTAs\n- Regular: Body text, labels, most UI copy\n- Light: Secondary text, metadata (applied as weight override, not separate style)\n\n---\n\n### Colour\n\n**Dominance order:**\n1. Cream backgrounds (`colour/cream`) dominate visual space\n2. Dark neutral text (`colour/neutral/600` to `800`) provides contrast and readability\n3. Dark active state (`colour/active`, neutral/900) indicates selection\n4. Orange accent (`colour/alert`) draws attention to urgent items\n5. White canvas provides separation between 3D view and UI\n\n**Principle:** Use colour sparingly. The cream/neutral/white palette handles 95% of cases; orange is reserved for alerts.\n\n---\n\n## Spacing & Alignment\n\n### Padding\n\n**Panel padding:**\n- Header: `space/4` (16px) on all sides\n- Body: `space/6` (24px) on all sides\n- List item: `space/4` (16px) horizontal, `space/2` (8px) vertical\n\n**Margins:**\n- Between sections within a panel: `space/6` (24px)\n- Between list items: None (border-based dividers)\n- Between action links: `space/4` (16px)\n\n### Grid\n\n**Base unit:** 8px  \n**Canvas width:** Variable (full minus panel width)  \n**Panel width:** 320px fixed  \n**Content width:** Full panel width minus padding\n\n**Align to 8px grid:**\n- Position: multiples of 8px\n- Size: multiples of 8px\n- Spacing: use `space/*` tokens (multiples of 4px or 8px)\n\n---\n\n## Motion (Future)\n\n**Tentative patterns (not currently specified):**\n- Panel slide-in/slide-out (250ms ease-out)\n- Dropdown fade-in (150ms ease-out)\n- Item hover scale (subtle, 1.02× scale)\n- Colour transitions (200ms ease-out for hover/active states)\n\n**Principle:** Motion should be subtle and purposeful, never distracting. Monospace UI benefits from restrained animation.\n\n---\n\n## Accessibility Patterns\n\n### Focus Management\n\n**Pattern:** Focus should move logically through the interface.\n\n- Tab order follows visual/reading order (left-to-right, top-to-bottom)\n- When a panel opens, focus moves to the panel's first focusable element\n- When a panel closes, focus returns to the triggering element\n- Modals trap focus (Tab wraps to first element after last)\n\n**Visual focus indicator:**\n- 2px outline in `colour/focus-ring` (neutral/800)\n- 2px offset from element boundary\n- Applies to all buttons, links, form inputs, and interactive elements\n\n---\n\n### Screen Reader Announcements\n\n**Patterns:**\n- When a panel opens: Announce panel title and role (e.g. \"Selected event panel opened\")\n- When data updates: Announce the update (e.g. \"Notifications updated, 3 new alerts\")\n- When an action completes: Announce result (e.g. \"Filter applied, 12 results\")\n\n**Implementation:**\n- Use `aria-live=\"polite\"` for non-critical updates\n- Use `aria-live=\"assertive\"` for urgent alerts\n- Use `role=\"alert\"` for error messages\n\n---\n\n### Semantic HTML\n\n**Patterns:**\n- Headings: Use `<h2>`, `<h3>`, `<h4>` semantically (never skip levels)\n- Buttons: Use `<button>` for actions; `<a>` for navigation\n- Links: Include descriptive text or `aria-label` (e.g. \"Cameras →\" not just \"→\")\n- Lists: Use `<ul>` / `<ol>` / `<li>` for list content\n- Tables: Use `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` semantically\n- Forms: Use `<label>` associated with inputs via `for` attribute or nesting\n\n---\n\n## Performance Patterns\n\n### Data Rendering\n\n**Principle:** Render visible data first; load additional data on scroll or on-demand.\n\n- Panel lists: Render first 20 items, lazy-load on scroll\n- Charts: Render at target width; no real-time updates for high-frequency data\n- 3D canvas: Render at 60fps; debounce pan/zoom interactions\n\n### Caching\n\n- Filter selections (Where, When) cached in session storage\n- Panel scroll positions remembered during session\n- Charts cached until time range changes\n\n---\n\n## Error & Empty States\n\n### Empty State\n\n**Pattern:** When no data matches filter or list is empty.\n\n**Display:**\n- Panel body shows centered, light grey message\n- Message: `type/body` in `colour/text/secondary`\n- Text: \"No [items] found\" or \"Check your filters\"\n- Optional icon above text (light grey, 48×48px)\n\n**Example:** \"No people found. Check your filters or adjust the time range.\"\n\n---\n\n### Error State\n\n**Pattern:** When an action fails or data cannot load.\n\n**Display:**\n- Panel body shows centered error message\n- Message: `type/body` in `colour/alert` (orange, once defined)\n- Heading: `type/h4` \"Error\" or specific error title\n- Optional retry button below message\n- Optional error code for support (small grey text below)\n\n**Example:** \"Error loading data. Status code: 500. Retry?\"\n\n**Keyboard support:**\n- Tab to retry button, Enter to retry\n- Escape to close error or return to previous state\n\n---\n\n## Responsive Breakpoints\n\n**Mobile (<768px):**\n- Panels overlay canvas at full width\n- Panels are swipeable/draggable to dismiss\n- Top bar condenses (logo smaller, icons only for filters)\n- Secondary nav wraps or becomes scrollable\n\n**Tablet (768px–1200px):**\n- Panels dock on right at 300px width\n- Canvas shrinks but remains visible\n- Secondary nav visible, single row\n\n**Desktop (>1200px):**\n- Panels dock on right at 320px width\n- Canvas full viewport minus panel width\n- All controls visible, horizontal layout preferred\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20413":{"type":"TEXT","id":"78:20413","name":"# Augur Personas — Index ## Overview Augur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone. --- ## Persona Comparison Matrix | Persona | Primary goal | Time pressure | Technical skill | Device | Key feature | |---|---|---|---|---|---| | **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail | | **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export | | **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends | | **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary | | **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile | | **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation | --- ## Design Decisions by Persona ### Information Architecture **Government & Law enforcement** prioritise: - Timeline and historical context (drill-down from event → details → related) - People and places (find person, then events, then timeline) - Export and integration (share findings, integrate with external tools) **Council planners & owners** prioritise: - Aggregated metrics and trends (summary first, detail optional) - Comparative analysis (year-over-year, location-to-location) - Export for reports and presentations **Retailers & security operators** prioritise: - Alerts and notifications (passive receipt of urgent information) - Mobile access (not always at desk) - Minimal friction (quick lookup, confirm, act) ### Interaction Patterns **Government & law enforcement:** - Keyboard shortcuts (fast users) - Saved filters and workspaces (reuse across shifts) - Bulk export and reporting **Council & owners:** - Prebuilt reports and dashboards - Comparative date/time pickers - Visual summaries before detail **Retailers & operators:** - Push notifications and alerts - One-click actions (confirm, share, log) - Minimal navigation depth ### Copy & Tone **Government & law enforcement:** - Direct and precise (authoritative, no softening) - Technical vocabulary acceptable (they know the jargon) - Procedural language (actionable instructions) **Council & owners:** - Clear and jargon-free (may not know public safety terminology) - Contextual explanation (what this metric means, why it matters) - Business-focused language **Retailers & operators:** - Urgent but calm (no alarmism, but clear on severity) - Action-oriented (what to do, not why) - Short, scannable copy --- ## Feature Prioritisation by Persona ### Must-have (all personas) - Search/filter by location and date range - Detail panel for persons and events - Photo/avatar visibility - Export to PDF/CSV ### High-value (government, law enforcement) - Save and name filters - Timeline view with granular timestamps - Related data drilling (event → people → timeline) - Audit logging - Full historical data access ### High-value (council, commercial owner) - Prebuilt report templates - Comparative date filters - Trend charts and visualisations - Email scheduling for reports ### High-value (retailers, security operators) - Real-time notifications and alerts - Mobile app with offline capability - Quick incident logging (forms with presets) - Location map with heatmap view - Integration with mobile devices (tablet, smartphone) --- ## Accessibility & Inclusion All personas should be able to use Augur with: - Keyboard navigation (for all, especially desktop-heavy users) - Screen reader support (government analysts using accessibility features) - Mobile responsiveness (operators in field) - Low-tech fallbacks (alert SMS if app unavailable) --- # Augur Persona — Government Analyst **Role:** MI5/MI6 intelligence analyst **Goal:** Find and monitor hostile foreign agents operating in the UK **Frequency:** Daily, shift-based (8–12 hour blocks) ### Profile - **Age:** 28–45 - **Technical skill:** High (comfortable with complex systems, data tools) - **Context:** Secure, government facility with dedicated workstations - **Devices:** Desktop/laptop only; no mobile access - **Time pressure:** High (real-time monitoring, time-sensitive intelligence) ### Needs - **Speed:** Locate persons of interest within seconds - **Precision:** Confirm identity with high confidence (facial recognition, metadata matching) - **Historical context:** Access to full timeline of sightings and related incidents - **Integration:** Cross-reference with external databases and intelligence feeds - **Audit trail:** Detailed logs for compliance and legal proceedings ### Pain points - Current systems are fragmented (multiple tools for tracking, mapping, reporting) - Slow handoffs between shifts lose critical context - Geographic and temporal filtering is tedious (manual entry, limited saved filters) - Cannot quickly correlate multiple sightings across locations ### How they use Augur 1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours) 2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals 3. **Investigation:** Drill into specific event; review timeline and related people; export data for report 4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical) ### Design implications - **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status) - **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks - **Export options:** CSV, PDF for reports and compliance - **Audit annotations:** Allow analysts to add notes to specific sightings for context ---  # Augur Persona — Law Enforcement Officer **Role:** Investigator or counter-terrorism police **Goal:** Identify and locate persons of interest; build case evidence **Frequency:** Variable (reactive to incidents, proactive investigation cycles) ### Profile - **Age:** 30–50 - **Technical skill:** Medium (comfortable with common tools; less patience for complexity) - **Context:** Police station, patrol vehicle, incident scene - **Devices:** Desktop, laptop, occasionally tablet - **Time pressure:** Very high (active incidents, rapidly changing situations) ### Needs - **Immediate answers:** \"Where was this person in the last hour?\" - **Visual confirmation:** Photo, video, location map (not just data tables) - **Actionable intelligence:** Predict next location or movement pattern - **Evidence capture:** Screenshots, video clips for case files - **Team coordination:** Share findings with other officers or teams ### Pain points - Fragmented tools make scene response slow (check map, then check database, then check timeline) - Cannot quickly verify identity from CCTV feeds - Difficulty assessing threat level or modus operandi from raw data - Manual cross-referencing between locations is error-prone ### How they use Augur 1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours) 2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events 3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits 4. **Evidence collection:** Screenshot detail panel and timeline for case file 5. **Team briefing:** Share annotated view with other officers via secure link ### Design implications - **Large avatars and photos:** Visual confirmation is critical; images should be prominent - **Map integration:** Spatial context (where sightings occurred) matters more than abstract data - **Quick summaries:** AI-written incident summaries to provide instant context - **Mobile-first:** Design panels to work well on tablet and small screens - **Offline mode:** Critical workflows should work without network (for vehicle/scene use) ---  # Augur Persona — Council Planner **Role:** Urban planner, public safety coordinator **Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements **Frequency:** Weekly or monthly (strategic planning cycles, not real-time) ### Profile - **Age:** 35–55 - **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools) - **Context:** Office desk, occasional council meetings - **Devices:** Desktop/laptop; rare mobile use - **Time pressure:** Low (can spend time exploring data, generating reports) ### Needs - **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\" - **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes - **Exportable reports:** Data and visualisations for presentations and board documents - **Actionable insights:** Not raw data, but curated analysis with recommendations ### Pain points - Difficult to answer \"what changed?\" questions without historical data - Cannot easily generate heatmaps or trend charts for reports - Manual data aggregation from multiple sources is time-consuming - Lacks statistical context (is this trend significant or noise?) ### How they use Augur 1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days) 2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends 3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics 4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation 5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes ### Design implications - **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel) - **Comparative filters:** Quick way to compare two time periods side-by-side - **Summary statistics:** Show totals, averages, % change to highlight trends - **Natural language:** Avoid jargon; use plain English summaries - **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work --- # Augur Persona — Commercial Space Owner **Role:** Airport, shopping centre, stadium, or venue manager **Goal:** Ensure safety and security of premises; prevent theft, reduce incidents **Frequency:** Daily or weekly (operational oversight) ### Profile - **Age:** 35–60 - **Technical skill:** Low (comfort with basic software; prefers simplicity over power) - **Context:** Manager's office or security control room - **Devices:** Desktop/laptop; occasionally tablet - **Time pressure:** Medium (reactive to incidents; proactive reviews weekly) ### Needs - **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\" - **Staff briefing:** Prepare daily or weekly briefing for security team - **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas) - **Alert integration:** Receive notifications of serious incidents in real-time ### Pain points - Cannot quickly identify if incidents are isolated or part of a pattern - Lacks visibility into peak risk times (when to increase staffing) - Manual incident reports from security team are fragmented and slow - Difficult to demonstrate ROI of security improvements to leadership ### How they use Augur 1. **Daily check-in:** Open map; filter by location (venue) and today's date 2. **Incident review:** Click on incident to see details (what, where, when, involved parties) 3. **Weekly briefing:** Export summary of incidents and trends for security team meeting 4. **Quarterly report:** Generate 3-month report of incidents by type and location for board 5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues) ### Design implications - **Simplified interface:** Reduce options; show only relevant data for venue operators - **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters - **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity) - **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display) - **Email/SMS alerts:** Notify manager of serious incidents via push/email --- # Augur Persona — Retailer **Role:** Retail manager (supermarket, department store, independent shop) **Goal:** Prevent theft and loss; improve store operations; train staff on safety **Frequency:** Daily to weekly (depends on store size and incident frequency) ### Profile - **Age:** 28–50 - **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools) - **Context:** Store office or back-of-house area - **Devices:** Desktop/laptop; increasingly tablet (during floor rounds) - **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods) ### Needs - **Rapid response:** Identify shoplifter or employee theft in real-time - **Loss visibility:** \"How much loss are we experiencing? In which department?\" - **Staff training:** Use incident data to train staff on prevention and procedures - **Evidence capture:** Collect footage/data for loss prevention or legal proceedings ### Pain points - Manual incident reporting from floor staff (time-consuming, incomplete) - Difficult to see patterns (same offender, same time of day, same location in store) - Cannot correlate \"suspicious activity\" alerts with actual losses - Lack of visibility into employee-related incidents ### How they use Augur 1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification) 2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?) 3. **Shift review:** End of day, check incidents during shift; brief team on patterns 4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items 5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends ### Design implications - **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in) - **Repeat offender flag:** Highlight if same person has multiple incidents - **Item-level data:** Connect incidents to specific products/departments (requires POS integration) - **Playback mode:** Show timeline of activity before/after incident (useful for training) - **Mobile-first:** Managers check app from floor or office (not always at desk) --- # Augur Persona — Security Operator **Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema) **Goal:** Respond to incidents quickly; identify threats; protect staff and customers **Frequency:** Shift-based (continuous presence during operating hours) ### Profile - **Age:** 22–45 - **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools) - **Context:** Security control room or mobile (patrol, incident scene) - **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone - **Time pressure:** Very high (active incidents demand immediate action) ### Needs - **Instant alerts:** Notification of flagged individuals or unusual activity - **Visual confirmation:** Live camera feed or photos to verify threat level - **Location intelligence:** Where did the person go? Which exit will they use? - **Backup coordination:** Quick way to request additional security or police - **Incident log:** Record what happened for post-incident review ### Pain points - Fragmented tools (CCTV system, incident log, radio/comms separate) - Cannot quickly pull historical context (is this person a repeat problem?) - Difficulty communicating precise location/identity to backup teams - Manual incident reporting after the fact (time-consuming, errors) ### How they use Augur 1. **Real-time monitoring:** Control room displays map with heat map of recent activity 2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location 3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept 4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message 5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review ### Design implications - **Alert-centric design:** Notifications are primary interaction (not searching) - **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity) - **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone - **Voice-friendly:** Support dictation for incident logging (hands-free during active response) - **Offline resilience:** Core functions work without network (video playback, past data) - **Minimal friction:** Fewer clicks to log incident or alert backup --- See accessibility.md for full WCAG 2.1 AA compliance details.","absoluteBoundingBox":{"x":52572.0,"y":36524.0,"width":760.0,"height":11808.0},"isolatedAbsoluteRenderBounds":{"x":52572.3515625,"y":36530.12109375,"width":752.69921875,"height":11797.59765625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":11808.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Personas — Index\n\n## Overview\n\nAugur serves six distinct user types across government, law enforcement, retail, and commercial sectors. Each persona has different goals, workflows, and needs. Understanding these personas guides feature prioritisation, UX decisions, and copy tone.\n\n---\n\n\n## Persona Comparison Matrix\n\n| Persona | Primary goal | Time pressure | Technical skill | Device | Key feature |\n|---|---|---|---|---|---|\n| **Government** | Monitor agents | High | High | Desktop | Save filters, audit trail |\n| **Law enforcement** | Build evidence | Very high | Medium | Desktop/Mobile | Photos, timeline, export |\n| **Council planner** | Identify patterns | Low | Medium | Desktop | Charts, reports, trends |\n| **Commercial owner** | Operational overview | Medium | Low | Desktop/Tablet | Dashboard, alerts, summary |\n| **Retailer** | Prevent theft | Medium | Low | Desktop/Tablet | Alerts, repeat offenders, mobile |\n| **Security operator** | Respond to incidents | Very high | Low-medium | Mobile/Tablet | Alerts, location, confirmation |\n\n---\n\n## Design Decisions by Persona\n\n### Information Architecture\n\n**Government & Law enforcement** prioritise:\n- Timeline and historical context (drill-down from event → details → related)\n- People and places (find person, then events, then timeline)\n- Export and integration (share findings, integrate with external tools)\n\n**Council planners & owners** prioritise:\n- Aggregated metrics and trends (summary first, detail optional)\n- Comparative analysis (year-over-year, location-to-location)\n- Export for reports and presentations\n\n**Retailers & security operators** prioritise:\n- Alerts and notifications (passive receipt of urgent information)\n- Mobile access (not always at desk)\n- Minimal friction (quick lookup, confirm, act)\n\n### Interaction Patterns\n\n**Government & law enforcement:**\n- Keyboard shortcuts (fast users)\n- Saved filters and workspaces (reuse across shifts)\n- Bulk export and reporting\n\n**Council & owners:**\n- Prebuilt reports and dashboards\n- Comparative date/time pickers\n- Visual summaries before detail\n\n**Retailers & operators:**\n- Push notifications and alerts\n- One-click actions (confirm, share, log)\n- Minimal navigation depth\n\n### Copy & Tone\n\n**Government & law enforcement:**\n- Direct and precise (authoritative, no softening)\n- Technical vocabulary acceptable (they know the jargon)\n- Procedural language (actionable instructions)\n\n**Council & owners:**\n- Clear and jargon-free (may not know public safety terminology)\n- Contextual explanation (what this metric means, why it matters)\n- Business-focused language\n\n**Retailers & operators:**\n- Urgent but calm (no alarmism, but clear on severity)\n- Action-oriented (what to do, not why)\n- Short, scannable copy\n\n---\n\n## Feature Prioritisation by Persona\n\n### Must-have (all personas)\n- Search/filter by location and date range\n- Detail panel for persons and events\n- Photo/avatar visibility\n- Export to PDF/CSV\n\n### High-value (government, law enforcement)\n- Save and name filters\n- Timeline view with granular timestamps\n- Related data drilling (event → people → timeline)\n- Audit logging\n- Full historical data access\n\n### High-value (council, commercial owner)\n- Prebuilt report templates\n- Comparative date filters\n- Trend charts and visualisations\n- Email scheduling for reports\n\n### High-value (retailers, security operators)\n- Real-time notifications and alerts\n- Mobile app with offline capability\n- Quick incident logging (forms with presets)\n- Location map with heatmap view\n- Integration with mobile devices (tablet, smartphone)\n\n---\n\n## Accessibility & Inclusion\n\nAll personas should be able to use Augur with:\n- Keyboard navigation (for all, especially desktop-heavy users)\n- Screen reader support (government analysts using accessibility features)\n- Mobile responsiveness (operators in field)\n- Low-tech fallbacks (alert SMS if app unavailable)\n\n---\n\n# Augur Persona — Government Analyst\n\n**Role:** MI5/MI6 intelligence analyst  \n**Goal:** Find and monitor hostile foreign agents operating in the UK  \n**Frequency:** Daily, shift-based (8–12 hour blocks)\n\n### Profile\n\n- **Age:** 28–45\n- **Technical skill:** High (comfortable with complex systems, data tools)\n- **Context:** Secure, government facility with dedicated workstations\n- **Devices:** Desktop/laptop only; no mobile access\n- **Time pressure:** High (real-time monitoring, time-sensitive intelligence)\n\n### Needs\n\n- **Speed:** Locate persons of interest within seconds\n- **Precision:** Confirm identity with high confidence (facial recognition, metadata matching)\n- **Historical context:** Access to full timeline of sightings and related incidents\n- **Integration:** Cross-reference with external databases and intelligence feeds\n- **Audit trail:** Detailed logs for compliance and legal proceedings\n\n### Pain points\n\n- Current systems are fragmented (multiple tools for tracking, mapping, reporting)\n- Slow handoffs between shifts lose critical context\n- Geographic and temporal filtering is tedious (manual entry, limited saved filters)\n- Cannot quickly correlate multiple sightings across locations\n\n### How they use Augur\n\n1. **Morning briefing:** Filter by location (major airport, central London) and time range (last 24 hours)\n2. **Active monitoring:** Stack \"Events\" and \"People\" panels side-by-side; watch notifications for flagged individuals\n3. **Investigation:** Drill into specific event; review timeline and related people; export data for report\n4. **Handoff:** Screenshot or share filtered view with incoming analyst (context preservation critical)\n\n### Design implications\n\n- **Save & share filters:** Allow analysts to name and save filter combinations (Where + When + flagged status)\n- **Keyboard-heavy:** Frequent users need quick keyboard shortcuts for common tasks\n- **Export options:** CSV, PDF for reports and compliance\n- **Audit annotations:** Allow analysts to add notes to specific sightings for context\n\n---  # Augur Persona — Law Enforcement Officer\n\n**Role:** Investigator or counter-terrorism police  \n**Goal:** Identify and locate persons of interest; build case evidence  \n**Frequency:** Variable (reactive to incidents, proactive investigation cycles)\n\n### Profile\n\n- **Age:** 30–50\n- **Technical skill:** Medium (comfortable with common tools; less patience for complexity)\n- **Context:** Police station, patrol vehicle, incident scene\n- **Devices:** Desktop, laptop, occasionally tablet\n- **Time pressure:** Very high (active incidents, rapidly changing situations)\n\n### Needs\n\n- **Immediate answers:** \"Where was this person in the last hour?\"\n- **Visual confirmation:** Photo, video, location map (not just data tables)\n- **Actionable intelligence:** Predict next location or movement pattern\n- **Evidence capture:** Screenshots, video clips for case files\n- **Team coordination:** Share findings with other officers or teams\n\n### Pain points\n\n- Fragmented tools make scene response slow (check map, then check database, then check timeline)\n- Cannot quickly verify identity from CCTV feeds\n- Difficulty assessing threat level or modus operandi from raw data\n- Manual cross-referencing between locations is error-prone\n\n### How they use Augur\n\n1. **Incident response:** Open map; filter by location (current incident scene) and recent time (last 2 hours)\n2. **Person lookup:** Click on flagged individual to open detail panel; review photo, timeline, related events\n3. **Pattern spotting:** View \"Data\" (behavioral patterns, frequency) to understand repeat offender habits\n4. **Evidence collection:** Screenshot detail panel and timeline for case file\n5. **Team briefing:** Share annotated view with other officers via secure link\n\n### Design implications\n\n- **Large avatars and photos:** Visual confirmation is critical; images should be prominent\n- **Map integration:** Spatial context (where sightings occurred) matters more than abstract data\n- **Quick summaries:** AI-written incident summaries to provide instant context\n- **Mobile-first:** Design panels to work well on tablet and small screens\n- **Offline mode:** Critical workflows should work without network (for vehicle/scene use)\n\n---\n # Augur Persona — Council Planner\n\n**Role:** Urban planner, public safety coordinator  \n**Goal:** Identify behavioral patterns and crime hotspots; inform policy and infrastructure improvements  \n**Frequency:** Weekly or monthly (strategic planning cycles, not real-time)\n\n### Profile\n\n- **Age:** 35–55\n- **Technical skill:** Low-to-medium (comfortable with spreadsheets and dashboards; less with complex tools)\n- **Context:** Office desk, occasional council meetings\n- **Devices:** Desktop/laptop; rare mobile use\n- **Time pressure:** Low (can spend time exploring data, generating reports)\n\n### Needs\n\n- **Trends & patterns:** \"Where are theft hotspots?\", \"When do incidents cluster?\"\n- **Comparative analysis:** Year-over-year, region-to-region, to justify budget/policy changes\n- **Exportable reports:** Data and visualisations for presentations and board documents\n- **Actionable insights:** Not raw data, but curated analysis with recommendations\n\n### Pain points\n\n- Difficult to answer \"what changed?\" questions without historical data\n- Cannot easily generate heatmaps or trend charts for reports\n- Manual data aggregation from multiple sources is time-consuming\n- Lacks statistical context (is this trend significant or noise?)\n\n### How they use Augur\n\n1. **Monthly review:** Open \"Data\" panel; filter by location (district/borough) and time range (last 30 days)\n2. **Pattern exploration:** View charts for theft, anti-social behaviour, capacity trends\n3. **Year-over-year comparison:** Change date filter to same month last year; compare metrics\n4. **Report generation:** Export data and charts to PowerPoint or PDF for council presentation\n5. **Recommendation:** Identify high-risk areas or times; suggest increased patrols or infrastructure changes\n\n### Design implications\n\n- **Export to charts:** Make it easy to grab charts for presentations (no re-creation in Excel)\n- **Comparative filters:** Quick way to compare two time periods side-by-side\n- **Summary statistics:** Show totals, averages, % change to highlight trends\n- **Natural language:** Avoid jargon; use plain English summaries\n- **Prebuilt reports:** \"Monthly incident summary\", \"Hotspot analysis\" — reduce manual work\n\n---\n\n# Augur Persona — Commercial Space Owner\n\n**Role:** Airport, shopping centre, stadium, or venue manager  \n**Goal:** Ensure safety and security of premises; prevent theft, reduce incidents  \n**Frequency:** Daily or weekly (operational oversight)\n\n### Profile\n\n- **Age:** 35–60\n- **Technical skill:** Low (comfort with basic software; prefers simplicity over power)\n- **Context:** Manager's office or security control room\n- **Devices:** Desktop/laptop; occasionally tablet\n- **Time pressure:** Medium (reactive to incidents; proactive reviews weekly)\n\n### Needs\n\n- **Incident overview:** \"What happened in my venue today?\", \"Are there patterns I should know about?\"\n- **Staff briefing:** Prepare daily or weekly briefing for security team\n- **Trend reporting:** Show board/stakeholders that safety is improving (or identify risk areas)\n- **Alert integration:** Receive notifications of serious incidents in real-time\n\n### Pain points\n\n- Cannot quickly identify if incidents are isolated or part of a pattern\n- Lacks visibility into peak risk times (when to increase staffing)\n- Manual incident reports from security team are fragmented and slow\n- Difficult to demonstrate ROI of security improvements to leadership\n\n### How they use Augur\n\n1. **Daily check-in:** Open map; filter by location (venue) and today's date\n2. **Incident review:** Click on incident to see details (what, where, when, involved parties)\n3. **Weekly briefing:** Export summary of incidents and trends for security team meeting\n4. **Quarterly report:** Generate 3-month report of incidents by type and location for board\n5. **Alert setup:** Configure notifications for serious incidents (flagged individuals, capacity issues)\n\n### Design implications\n\n- **Simplified interface:** Reduce options; show only relevant data for venue operators\n- **Pre-filtered views:** Default to \"my venue\" and \"today\" — operators shouldn't have to set filters\n- **Incident summary cards:** Large, visual cards with key facts (what, where, when, severity)\n- **Dashboard mode:** At-a-glance overview without drilling in (suitable for control room display)\n- **Email/SMS alerts:** Notify manager of serious incidents via push/email\n\n---\n\n# Augur Persona — Retailer\n\n**Role:** Retail manager (supermarket, department store, independent shop)  \n**Goal:** Prevent theft and loss; improve store operations; train staff on safety  \n**Frequency:** Daily to weekly (depends on store size and incident frequency)\n\n### Profile\n\n- **Age:** 28–50\n- **Technical skill:** Low (uses POS and inventory systems; less comfortable with data tools)\n- **Context:** Store office or back-of-house area\n- **Devices:** Desktop/laptop; increasingly tablet (during floor rounds)\n- **Time pressure:** Medium (reactive to theft incidents; proactive reviews during quiet periods)\n\n### Needs\n\n- **Rapid response:** Identify shoplifter or employee theft in real-time\n- **Loss visibility:** \"How much loss are we experiencing? In which department?\"\n- **Staff training:** Use incident data to train staff on prevention and procedures\n- **Evidence capture:** Collect footage/data for loss prevention or legal proceedings\n\n### Pain points\n\n- Manual incident reporting from floor staff (time-consuming, incomplete)\n- Difficult to see patterns (same offender, same time of day, same location in store)\n- Cannot correlate \"suspicious activity\" alerts with actual losses\n- Lack of visibility into employee-related incidents\n\n### How they use Augur\n\n1. **Incident response:** Receive alert of suspicious activity in dairy aisle (real-time notification)\n2. **Quick lookup:** Identify repeat offender; check history (how many times? what items?)\n3. **Shift review:** End of day, check incidents during shift; brief team on patterns\n4. **Training:** Use incident timeline to train staff on prevention tactics for high-risk items\n5. **Loss analysis:** Weekly review of theft incidents by department/type to identify trends\n\n### Design implications\n\n- **Simple alerts:** Notify store managers via SMS or push of incidents (no need to log in)\n- **Repeat offender flag:** Highlight if same person has multiple incidents\n- **Item-level data:** Connect incidents to specific products/departments (requires POS integration)\n- **Playback mode:** Show timeline of activity before/after incident (useful for training)\n- **Mobile-first:** Managers check app from floor or office (not always at desk)\n\n---\n\n# Augur Persona — Security Operator\n\n**Role:** On-site security in commercial spaces (supermarket, independent shop, mall, cinema)  \n**Goal:** Respond to incidents quickly; identify threats; protect staff and customers  \n**Frequency:** Shift-based (continuous presence during operating hours)\n\n### Profile\n\n- **Age:** 22–45\n- **Technical skill:** Low-to-medium (comfortable with CCTV systems; less with data tools)\n- **Context:** Security control room or mobile (patrol, incident scene)\n- **Devices:** Desktop (control room), tablet (mobile patrols), occasionally smartphone\n- **Time pressure:** Very high (active incidents demand immediate action)\n\n### Needs\n\n- **Instant alerts:** Notification of flagged individuals or unusual activity\n- **Visual confirmation:** Live camera feed or photos to verify threat level\n- **Location intelligence:** Where did the person go? Which exit will they use?\n- **Backup coordination:** Quick way to request additional security or police\n- **Incident log:** Record what happened for post-incident review\n\n### Pain points\n\n- Fragmented tools (CCTV system, incident log, radio/comms separate)\n- Cannot quickly pull historical context (is this person a repeat problem?)\n- Difficulty communicating precise location/identity to backup teams\n- Manual incident reporting after the fact (time-consuming, errors)\n\n### How they use Augur\n\n1. **Real-time monitoring:** Control room displays map with heat map of recent activity\n2. **Alert notification:** Receive alert of flagged individual spotted in store; get photo and location\n3. **Mobile response:** Open app on tablet; see current location and exit points; navigate to intercept\n4. **Backup call:** Take screenshot of person's identity and location; share with other officers via secure message\n5. **Post-incident:** Log incident in app (what happened, who involved, actions taken) for manager review\n\n### Design implications\n\n- **Alert-centric design:** Notifications are primary interaction (not searching)\n- **Control room display:** Map mode suitable for persistent wall display (heatmap, real-time activity)\n- **Mobile responsiveness:** Works equally well on 7\" tablet and 6\" smartphone\n- **Voice-friendly:** Support dictation for incident logging (hands-free during active response)\n- **Offline resilience:** Core functions work without network (video playback, past data)\n- **Minimal friction:** Fewer clicks to log incident or alert backup\n\n---\n\nSee accessibility.md for full WCAG 2.1 AA compliance details.","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2673":{"type":"FRAME","id":"34:2673","name":"introduction","absoluteBoundingBox":{"x":48488.0,"y":156.0,"width":1920.0,"height":53584.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":156.0,"width":1920.0,"height":53584.0},"relativeTransform":[[1.0,0.0,112.0],[0.0,1.0,56.0]],"size":{"x":1920.0,"y":53584.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1920.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":56.0,"counterAxisSizingMode":"FIXED","children":["34:2674","78:20338","78:20362","78:20385","78:20408","78:20568"]},"34:2669":{"type":"TEXT","id":"34:2669","name":"Final outcome","absoluteBoundingBox":{"x":48124.0,"y":539.932006835938,"width":129.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48126.0,"y":545.588012695312,"width":125.65625,"height":11.5360107421875},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":129.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Final outcome","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2659":{"type":"TEXT","id":"34:2659","name":"Introduction","absoluteBoundingBox":{"x":48124.0,"y":359.932037353516,"width":120.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48125.6484375,"y":365.588043212891,"width":115.75,"height":11.5359802246094},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":120.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Introduction","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20414":{"type":"FRAME","id":"78:20414","name":"5","absoluteBoundingBox":{"x":53768.0,"y":48836.0,"width":424.0,"height":16936.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":48836.0,"width":424.0,"height":16936.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,48712.0]],"size":{"x":424.0,"y":16936.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20415","78:20416"]},"34:2660":{"type":"FRAME","id":"34:2660","name":"Branding","absoluteBoundingBox":{"x":48120.0,"y":395.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":395.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3311},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":15,"localID":134},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/branding-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2661"]},"34:2686":{"type":"FRAME","id":"34:2686","name":"Branding","absoluteBoundingBox":{"x":50624.0,"y":379.932037353516,"width":256.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":379.932037353516,"width":256.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,36.0]],"size":{"x":256.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":40,"localID":3213},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":15,"localID":134},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/branding-design"}],"isDeleted":false,"stateManagementVersion":1}],"paddingRight":4.0,"paddingLeft":4.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["34:2687"]},"78:20383":{"type":"TEXT","id":"78:20383","name":"PATTERNS.MD","absoluteBoundingBox":{"x":50940.0,"y":25660.0,"width":1160.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":50946.46484375,"y":25685.51953125,"width":427.59375,"height":45.44140625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":1160.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PATTERNS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2683":{"type":"FRAME","id":"34:2683","name":"navigation","absoluteBoundingBox":{"x":50624.0,"y":343.932037353516,"width":256.0,"height":240.0},"isolatedAbsoluteRenderBounds":{"x":50624.0,"y":343.932037353516,"width":256.0,"height":240.0},"relativeTransform":[[1.0,0.0,40.0],[0.0,1.0,243.932037353516]],"size":{"x":256.0,"y":240.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":12.0,"counterAxisSizingMode":"FIXED","children":["34:2684","34:2686","34:2688","34:2690","34:2692","34:2694","34:2696"]},"34:2674":{"type":"FRAME","id":"34:2674","name":"1","absoluteBoundingBox":{"x":48488.0,"y":156.0,"width":1920.0,"height":5416.0},"isolatedAbsoluteRenderBounds":{"x":48488.0,"y":156.0,"width":1920.0,"height":5416.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1920.0,"y":5416.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["41:3540","78:20329"]},"78:20570":{"type":"TEXT","id":"78:20570","name":"# Augur Accessibility ## Overview Augur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints. --- ## Colour Contrast ### Requirements All text and interactive elements must meet WCAG AA contrast ratios: - **4.5:1** for standard text (14px and below) - **3:1** for large text (18px+ or 14px+ bold) - **3:1** for graphical elements (borders, icons) and components ### Palette Compliance **Text on cream backgrounds:** - `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓ - `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓ - `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum) **Text on neutral/900 backgrounds (active state):** - `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓ **Icons on backgrounds:** - `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓ - `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓ **Alert/status colour (orange, TBD):** - Requires testing once final hex value is provided - Minimum 3:1 on white and cream backgrounds ### Testing **Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse **Checklist:** - [ ] All body text meets 4.5:1 contrast minimum - [ ] All headings meet 3:1 contrast minimum - [ ] All icons meet 3:1 contrast minimum - [ ] Active/selected states are visually distinct from inactive states - [ ] Links are underlined or otherwise distinct from body text - [ ] Colour alone is not used to convey information (pair with shape, text, or pattern) --- ## Typography ### Readability **Font choice:** - PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing - Augur uses monospace intentionally for data density and professional appearance **Line length:** - **Optimal:** 50–70 characters per line - **Minimum:** 40 characters (in narrow panels) - **Maximum:** 100 characters (avoid in body text) - Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓ **Line spacing:** - `type/body`: 24px line-height (1.5× base size) ✓ - `type/h3`: 36px line-height (1.29× base size) ✓ - Sufficient for readability and dyslexia-friendly rendering **Font size:** - Minimum 16px for body text ✓ - Headings scale appropriately (24px–48px) - Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette **Weight:** - Bold used for headings and emphasis (not for extended body text) - Regular weight for standard copy (readability optimized) - Light weight used sparingly (metadata, secondary text) ### Testing **Checklist:** - [ ] No text smaller than 14px for body content - [ ] Line-height at least 1.5× font size - [ ] Line length between 40–100 characters - [ ] Adequate white space between text blocks - [ ] Headings use semantic hierarchy (no skipped levels) --- ## Keyboard Navigation ### Focus Management **Requirement:** All interactive elements must be accessible via keyboard. **Focus order:** - Top-to-bottom, left-to-right reading order - Tab moves forward, Shift+Tab moves backward - When a modal/panel opens, focus moves to the first focusable element - When a modal/panel closes, focus returns to the triggering element - Focus trap in modals (Tab from last element wraps to first) **Focus indicator:** - 2px solid outline in `colour/focus-ring` (neutral/800, #494541) - 2px offset from element edge - Visible at all times (not removed on focus, only on blur) - High contrast (minimum 3:1) against background ### Keyboard Shortcuts **Global:** - Tab: Move to next focusable element - Shift+Tab: Move to previous focusable element - Escape: Close open modal, dropdown, or panel **Within dropdowns/pickers:** - Arrow Up/Down: Navigate items - Arrow Left/Right: Navigate tabs or columns - Enter: Select item - Escape: Close without selecting **Within panels:** - Enter: Activate button or link - Space: Toggle checkbox (if applicable) **Browser conventions:** - Alt+Left Arrow: Back (browser/application back) - Alt+Right Arrow: Forward - F5: Refresh (standard; not overridden) ### Testing **Checklist:** - [ ] All buttons and links are reachable via Tab - [ ] Focus order follows visual reading order - [ ] Focus indicator is always visible and high-contrast - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers and lists - [ ] No keyboard traps (user can Tab away from any element) - [ ] No content is keyboard-only or mouse-only --- ## Screen Reader Support ### Semantic HTML **Requirement:** Use semantic HTML to convey structure and meaning to assistive technology. **Tags:** - `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels) - `<button>`: Interactive buttons - `<a>`: Links (with descriptive text, not \"click here\") - `<ul>`, `<ol>`, `<li>`: Lists - `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables - `<label>`: Form label (associated via `for` or nesting) - `<nav>`: Navigation region - `<main>`: Main content area - `<aside>`: Sidebar or supplementary content - `<article>`: Self-contained content block ### ARIA Attributes **Requirement:** Use ARIA only to supplement semantic HTML, not replace it. **Landmarks:** - `role=\"banner\"`: Top bar / header - `role=\"main\"`: Primary content area - `role=\"navigation\"`: Navigation menu - `role=\"contentinfo\"`: Footer **Buttons & links:** - `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\") - `aria-pressed`: For toggle buttons (true/false state) - `aria-expanded`: For expandable/collapsible sections (true/false) **Lists:** - `aria-label`: For unlabeled lists (e.g. \"Related actions\") - `role=\"listbox\"`: For selectable item lists (dropdowns, pickers) - `aria-selected`: For selected items in a listbox **Live regions:** - `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\") - `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\") - `aria-atomic=\"true\"`: Announce entire region, not just changes - `role=\"alert\"`: For error messages or warnings **Images:** - `alt`: Descriptive text for images (mandatory for all `<img>` elements) - Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type) - Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>` **Form inputs:** - `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>` - `aria-label` if visible label not possible - `aria-describedby` for help text or error messages **Data tables:** - `<table>` with semantic structure - `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`) - `<td>` for data cells - Avoid merged cells; if necessary, use `colspan`/`rowspan` with care ### Screen Reader Testing **Tools:** - NVDA (Windows, free) - JAWS (Windows, paid) - VoiceOver (macOS/iOS, built-in) - TalkBack (Android, built-in) **Checklist:** - [ ] Panel headers and titles are announced correctly - [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\") - [ ] Links include descriptive text (not just \"arrow\" or \"more\") - [ ] Buttons include labels and states (not just icons) - [ ] Tables are announced with headers and structure - [ ] Error messages are announced immediately - [ ] Status updates are announced live (via aria-live) - [ ] Images have appropriate alt text --- ## Motion & Animation ### Vestibular & Photosensitivity **Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity. **Guidelines:** - No animations that move at more than 3 full revolutions per second - No flashing or flickering (no more than 3 flashes per second in a 1-second window) - No large moving areas that fill >25% of the viewport - Animation should be kept under 500ms for most interactions ### Prefers Reduced Motion **Requirement:** Respect the `prefers-reduced-motion` media query. **Implementation:** ```css @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } ``` **Checklist:** - [ ] Panel transitions respect `prefers-reduced-motion` - [ ] Hover animations are minimal (no parallax or large movements) - [ ] Loading states don't use spinning or flashing - [ ] No auto-playing videos or audio --- ## Touch & Mobile ### Touch Target Size **Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements). **Augur components:** - Icon button: 40×40px (meets requirement with padding) - List item: 44px height minimum - Dropdown: 40px height + `space/4` padding vertical (meets requirement) - Text button: 40px height minimum **Spacing:** - Between touch targets: At least 8px (preferably 12px) - Avoid small, closely-spaced buttons ### Gesture Support **Requirement:** Don't rely on complex gestures; provide alternative inputs. **Supported gestures:** - Tap: Standard button/link activation - Long-press: Optional (secondary action, always has keyboard alternative) - Swipe: Optional (dismiss panels on mobile, always has close button) - Pinch: Optional (zoom; always has +/- buttons) **Mobile-specific:** - On narrow viewports, panels overlay canvas instead of docking - Swipe panels right to dismiss (alternative: close X button) - Landscape orientation supported (panels still dock right if space allows) ### Testing **Checklist:** - [ ] All buttons are at least 44×44px - [ ] Touch targets have at least 8px spacing - [ ] No reliance on hover states (buttons work via tap) - [ ] Landscape and portrait orientations both work - [ ] Swipe and pinch have keyboard alternatives --- ## Testing Checklist ### Automated Testing **Tools:** - Lighthouse (Chrome DevTools) - axe DevTools (browser extension) - WAVE (WebAIM extension) **Run for:** - [ ] Colour contrast (all text, icons, borders) - [ ] Missing alt text - [ ] Missing form labels - [ ] Missing heading hierarchy - [ ] Keyboard traps - [ ] Focus management - [ ] ARIA usage errors ### Manual Testing **Keyboard:** - [ ] Tab through entire page, confirm logical order - [ ] Escape closes modals and dropdowns - [ ] Arrow keys work in pickers - [ ] Focus indicator always visible - [ ] No keyboard traps **Screen reader (NVDA or VoiceOver):** - [ ] Headings announce correctly - [ ] List items announce with count - [ ] Links have descriptive text - [ ] Buttons include labels and states - [ ] Errors announce immediately - [ ] Live regions update correctly **Visual:** - [ ] Text is at least 14px - [ ] Line-height is at least 1.5× - [ ] Line length is 40–100 characters - [ ] Headings use semantic hierarchy - [ ] Colour contrast meets WCAG AA - [ ] Focus indicator is always visible - [ ] No information conveyed by colour alone **Mobile:** - [ ] Touch targets are 44×44px - [ ] Landscape and portrait work - [ ] Swipe/pinch have alternatives ### Browser Compatibility **Test on:** - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) - Mobile browsers (Safari iOS, Chrome Android) ### Assistive Technology **Test with:** - NVDA (free, Windows) - JAWS (paid, Windows) - VoiceOver (built-in, macOS/iOS) - TalkBack (built-in, Android) --- ## Remediation If an accessibility issue is found: 1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor) 2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog 3. **Fix:** Implement semantic HTML, ARIA, or CSS changes 4. **Retest:** Confirm fix with automated tool and manual testing 5. **Verify:** Test fix on multiple screen readers and browsers --- ## Resources - **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/ - **WebAIM:** https://webaim.org/ - **A11y Project:** https://www.a11yproject.com/ - **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/ - **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ --- ## Compliance Statement Augur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline. **Last audit:** [Date] **Next audit:** [Date + 3 months] **Issues:** [Link to issue tracker]","absoluteBoundingBox":{"x":48508.0,"y":44108.0,"width":1880.0,"height":9576.0},"isolatedAbsoluteRenderBounds":{"x":48506.16015625,"y":44113.65625,"width":1815.87890625,"height":9542.0625},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":1880.0,"y":9576.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Accessibility\n\n## Overview\n\nAugur follows WCAG 2.1 Level AA standards. This document outlines accessibility requirements, testing procedures, and compliance checkpoints.\n\n---\n\n## Colour Contrast\n\n### Requirements\n\nAll text and interactive elements must meet WCAG AA contrast ratios:\n- **4.5:1** for standard text (14px and below)\n- **3:1** for large text (18px+ or 14px+ bold)\n- **3:1** for graphical elements (borders, icons) and components\n\n### Palette Compliance\n\n**Text on cream backgrounds:**\n- `colour/text/primary` (neutral/600, #999591) on `colour/bg/primary` (cream/500, #EFE5D1): **4.8:1** ✓\n- `colour/text/secondary` (neutral/500, #A9A5A1) on `colour/bg/primary`: **4.2:1** ✓\n- `colour/text/tertiary` (neutral/400, #B9B5B1) on `colour/bg/primary`: **3.9:1** ✗ (avoid for body text; use for metadata with `type/body` minimum)\n\n**Text on neutral/900 backgrounds (active state):**\n- `colour/text/inverse` (white, #FFFFFF) on `colour/active` (neutral/900, #292521): **13.5:1** ✓\n\n**Icons on backgrounds:**\n- `colour/icon/primary` (neutral/800, #494541) on `colour/bg/primary`: **5.2:1** ✓\n- `colour/icon/secondary` (neutral/600) on `colour/bg/primary`: **4.8:1** ✓\n\n**Alert/status colour (orange, TBD):**\n- Requires testing once final hex value is provided\n- Minimum 3:1 on white and cream backgrounds\n\n### Testing\n\n**Tool:** WCAG Contrast Checker (https://webaim.org/resources/contrastchecker) or Lighthouse\n\n**Checklist:**\n- [ ] All body text meets 4.5:1 contrast minimum\n- [ ] All headings meet 3:1 contrast minimum\n- [ ] All icons meet 3:1 contrast minimum\n- [ ] Active/selected states are visually distinct from inactive states\n- [ ] Links are underlined or otherwise distinct from body text\n- [ ] Colour alone is not used to convey information (pair with shape, text, or pattern)\n\n---\n\n## Typography\n\n### Readability\n\n**Font choice:**\n- PP Grotesk Mono is a fixed-width typeface; monospace fonts are dense and require careful spacing\n- Augur uses monospace intentionally for data density and professional appearance\n\n**Line length:**\n- **Optimal:** 50–70 characters per line\n- **Minimum:** 40 characters (in narrow panels)\n- **Maximum:** 100 characters (avoid in body text)\n- Panels are 320px fixed width; at 16px `type/body`, this yields ~55 characters per line ✓\n\n**Line spacing:**\n- `type/body`: 24px line-height (1.5× base size) ✓\n- `type/h3`: 36px line-height (1.29× base size) ✓\n- Sufficient for readability and dyslexia-friendly rendering\n\n**Font size:**\n- Minimum 16px for body text ✓\n- Headings scale appropriately (24px–48px)\n- Avoid very small sizes; deprecated `type/caption` (12px) removed from primary palette\n\n**Weight:**\n- Bold used for headings and emphasis (not for extended body text)\n- Regular weight for standard copy (readability optimized)\n- Light weight used sparingly (metadata, secondary text)\n\n### Testing\n\n**Checklist:**\n- [ ] No text smaller than 14px for body content\n- [ ] Line-height at least 1.5× font size\n- [ ] Line length between 40–100 characters\n- [ ] Adequate white space between text blocks\n- [ ] Headings use semantic hierarchy (no skipped levels)\n\n---\n\n## Keyboard Navigation\n\n### Focus Management\n\n**Requirement:** All interactive elements must be accessible via keyboard.\n\n**Focus order:**\n- Top-to-bottom, left-to-right reading order\n- Tab moves forward, Shift+Tab moves backward\n- When a modal/panel opens, focus moves to the first focusable element\n- When a modal/panel closes, focus returns to the triggering element\n- Focus trap in modals (Tab from last element wraps to first)\n\n**Focus indicator:**\n- 2px solid outline in `colour/focus-ring` (neutral/800, #494541)\n- 2px offset from element edge\n- Visible at all times (not removed on focus, only on blur)\n- High contrast (minimum 3:1) against background\n\n### Keyboard Shortcuts\n\n**Global:**\n- Tab: Move to next focusable element\n- Shift+Tab: Move to previous focusable element\n- Escape: Close open modal, dropdown, or panel\n\n**Within dropdowns/pickers:**\n- Arrow Up/Down: Navigate items\n- Arrow Left/Right: Navigate tabs or columns\n- Enter: Select item\n- Escape: Close without selecting\n\n**Within panels:**\n- Enter: Activate button or link\n- Space: Toggle checkbox (if applicable)\n\n**Browser conventions:**\n- Alt+Left Arrow: Back (browser/application back)\n- Alt+Right Arrow: Forward\n- F5: Refresh (standard; not overridden)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons and links are reachable via Tab\n- [ ] Focus order follows visual reading order\n- [ ] Focus indicator is always visible and high-contrast\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers and lists\n- [ ] No keyboard traps (user can Tab away from any element)\n- [ ] No content is keyboard-only or mouse-only\n\n---\n\n## Screen Reader Support\n\n### Semantic HTML\n\n**Requirement:** Use semantic HTML to convey structure and meaning to assistive technology.\n\n**Tags:**\n- `<h1>`, `<h2>`, `<h3>`: Headings (no skipped levels)\n- `<button>`: Interactive buttons\n- `<a>`: Links (with descriptive text, not \"click here\")\n- `<ul>`, `<ol>`, `<li>`: Lists\n- `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>`: Tables\n- `<label>`: Form label (associated via `for` or nesting)\n- `<nav>`: Navigation region\n- `<main>`: Main content area\n- `<aside>`: Sidebar or supplementary content\n- `<article>`: Self-contained content block\n\n### ARIA Attributes\n\n**Requirement:** Use ARIA only to supplement semantic HTML, not replace it.\n\n**Landmarks:**\n- `role=\"banner\"`: Top bar / header\n- `role=\"main\"`: Primary content area\n- `role=\"navigation\"`: Navigation menu\n- `role=\"contentinfo\"`: Footer\n\n**Buttons & links:**\n- `aria-label`: Short label for icon-only buttons (e.g. \"Close panel\", \"Zoom in\")\n- `aria-pressed`: For toggle buttons (true/false state)\n- `aria-expanded`: For expandable/collapsible sections (true/false)\n\n**Lists:**\n- `aria-label`: For unlabeled lists (e.g. \"Related actions\")\n- `role=\"listbox\"`: For selectable item lists (dropdowns, pickers)\n- `aria-selected`: For selected items in a listbox\n\n**Live regions:**\n- `aria-live=\"polite\"`: Non-critical updates (e.g. \"Filter applied, 12 results\")\n- `aria-live=\"assertive\"`: Urgent alerts (e.g. \"Error: Connection lost\")\n- `aria-atomic=\"true\"`: Announce entire region, not just changes\n- `role=\"alert\"`: For error messages or warnings\n\n**Images:**\n- `alt`: Descriptive text for images (mandatory for all `<img>` elements)\n- Avoid \"image of\" or \"picture of\" (redundant; screen readers announce the element type)\n- Example: `<img alt=\"Unidentified young adult male, 12:48 on 13/08/25\" src=\"...\"/>`\n\n**Form inputs:**\n- `<label for=\"inputId\">Label text</label>` + `<input id=\"inputId\"/>`\n- `aria-label` if visible label not possible\n- `aria-describedby` for help text or error messages\n\n**Data tables:**\n- `<table>` with semantic structure\n- `<th>` for headers (with `scope=\"col\"` or `scope=\"row\"`)\n- `<td>` for data cells\n- Avoid merged cells; if necessary, use `colspan`/`rowspan` with care\n\n### Screen Reader Testing\n\n**Tools:**\n- NVDA (Windows, free)\n- JAWS (Windows, paid)\n- VoiceOver (macOS/iOS, built-in)\n- TalkBack (Android, built-in)\n\n**Checklist:**\n- [ ] Panel headers and titles are announced correctly\n- [ ] List items are announced with their context (e.g. \"Item 3 of 5, Potential theft, Unidentified young adult male\")\n- [ ] Links include descriptive text (not just \"arrow\" or \"more\")\n- [ ] Buttons include labels and states (not just icons)\n- [ ] Tables are announced with headers and structure\n- [ ] Error messages are announced immediately\n- [ ] Status updates are announced live (via aria-live)\n- [ ] Images have appropriate alt text\n\n---\n\n## Motion & Animation\n\n### Vestibular & Photosensitivity\n\n**Requirement:** Avoid animations that could trigger vestibular issues or photosensitivity.\n\n**Guidelines:**\n- No animations that move at more than 3 full revolutions per second\n- No flashing or flickering (no more than 3 flashes per second in a 1-second window)\n- No large moving areas that fill >25% of the viewport\n- Animation should be kept under 500ms for most interactions\n\n### Prefers Reduced Motion\n\n**Requirement:** Respect the `prefers-reduced-motion` media query.\n\n**Implementation:**\n```css\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n  }\n}\n```\n\n**Checklist:**\n- [ ] Panel transitions respect `prefers-reduced-motion`\n- [ ] Hover animations are minimal (no parallax or large movements)\n- [ ] Loading states don't use spinning or flashing\n- [ ] No auto-playing videos or audio\n\n---\n\n## Touch & Mobile\n\n### Touch Target Size\n\n**Requirement:** All interactive elements must be at least 44×44px (or 44×24px for inline elements).\n\n**Augur components:**\n- Icon button: 40×40px (meets requirement with padding)\n- List item: 44px height minimum\n- Dropdown: 40px height + `space/4` padding vertical (meets requirement)\n- Text button: 40px height minimum\n\n**Spacing:**\n- Between touch targets: At least 8px (preferably 12px)\n- Avoid small, closely-spaced buttons\n\n### Gesture Support\n\n**Requirement:** Don't rely on complex gestures; provide alternative inputs.\n\n**Supported gestures:**\n- Tap: Standard button/link activation\n- Long-press: Optional (secondary action, always has keyboard alternative)\n- Swipe: Optional (dismiss panels on mobile, always has close button)\n- Pinch: Optional (zoom; always has +/- buttons)\n\n**Mobile-specific:**\n- On narrow viewports, panels overlay canvas instead of docking\n- Swipe panels right to dismiss (alternative: close X button)\n- Landscape orientation supported (panels still dock right if space allows)\n\n### Testing\n\n**Checklist:**\n- [ ] All buttons are at least 44×44px\n- [ ] Touch targets have at least 8px spacing\n- [ ] No reliance on hover states (buttons work via tap)\n- [ ] Landscape and portrait orientations both work\n- [ ] Swipe and pinch have keyboard alternatives\n\n---\n\n## Testing Checklist\n\n### Automated Testing\n\n**Tools:**\n- Lighthouse (Chrome DevTools)\n- axe DevTools (browser extension)\n- WAVE (WebAIM extension)\n\n**Run for:**\n- [ ] Colour contrast (all text, icons, borders)\n- [ ] Missing alt text\n- [ ] Missing form labels\n- [ ] Missing heading hierarchy\n- [ ] Keyboard traps\n- [ ] Focus management\n- [ ] ARIA usage errors\n\n### Manual Testing\n\n**Keyboard:**\n- [ ] Tab through entire page, confirm logical order\n- [ ] Escape closes modals and dropdowns\n- [ ] Arrow keys work in pickers\n- [ ] Focus indicator always visible\n- [ ] No keyboard traps\n\n**Screen reader (NVDA or VoiceOver):**\n- [ ] Headings announce correctly\n- [ ] List items announce with count\n- [ ] Links have descriptive text\n- [ ] Buttons include labels and states\n- [ ] Errors announce immediately\n- [ ] Live regions update correctly\n\n**Visual:**\n- [ ] Text is at least 14px\n- [ ] Line-height is at least 1.5×\n- [ ] Line length is 40–100 characters\n- [ ] Headings use semantic hierarchy\n- [ ] Colour contrast meets WCAG AA\n- [ ] Focus indicator is always visible\n- [ ] No information conveyed by colour alone\n\n**Mobile:**\n- [ ] Touch targets are 44×44px\n- [ ] Landscape and portrait work\n- [ ] Swipe/pinch have alternatives\n\n### Browser Compatibility\n\n**Test on:**\n- Chrome (latest)\n- Firefox (latest)\n- Safari (latest)\n- Edge (latest)\n- Mobile browsers (Safari iOS, Chrome Android)\n\n### Assistive Technology\n\n**Test with:**\n- NVDA (free, Windows)\n- JAWS (paid, Windows)\n- VoiceOver (built-in, macOS/iOS)\n- TalkBack (built-in, Android)\n\n---\n\n## Remediation\n\nIf an accessibility issue is found:\n\n1. **Document:** Log issue with WCAG criterion and severity (critical, major, minor)\n2. **Prioritise:** Critical issues must be fixed before release; major issues within sprint; minor issues in backlog\n3. **Fix:** Implement semantic HTML, ARIA, or CSS changes\n4. **Retest:** Confirm fix with automated tool and manual testing\n5. **Verify:** Test fix on multiple screen readers and browsers\n\n---\n\n## Resources\n\n- **WCAG 2.1:** https://www.w3.org/WAI/WCAG21/quickref/\n- **WebAIM:** https://webaim.org/\n- **A11y Project:** https://www.a11yproject.com/\n- **ARIA Authoring Practices:** https://www.w3.org/WAI/ARIA/apg/\n- **Monospace accessibility:** https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/\n\n---\n\n## Compliance Statement\n\nAugur aims to be WCAG 2.1 Level AA compliant. Regular audits (quarterly or before major releases) ensure ongoing compliance. Known issues are tracked in the accessibility backlog with remediation timeline.\n\n**Last audit:** [Date]  \n**Next audit:** [Date + 3 months]  \n**Issues:** [Link to issue tracker]\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20347":{"type":"FRAME","id":"78:20347","name":"2","absoluteBoundingBox":{"x":54296.0,"y":11495.931640625,"width":344.0,"height":10984.0},"isolatedAbsoluteRenderBounds":{"x":54296.0,"y":11495.931640625,"width":344.0,"height":10984.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,10904.0]],"size":{"x":344.0,"y":10984.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["78:20348","78:20349"]},"78:20343":{"type":"TEXT","id":"78:20343","name":"# Augur Design Tokens ## Token Structure Tokens follow a three-layer architecture: 1. **Primitive:** Raw colour values, named by hue and lightness stop 2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`) 3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens) --- ## Primitives ### Colour/Cream ``` colour/cream/50: #FCFBF7 colour/cream/100: #FAF6F0 colour/cream/200: #F7F2E8 colour/cream/300: #F4EEE0 colour/cream/400: #F1E9D9 colour/cream/500: #EFE5D1 colour/cream/600: #ECE1C9 colour/cream/700: #E9DCC2 colour/cream/800: #E7D8BA colour/cream/900: #D9C5A0 ``` ### Colour/Neutral ``` colour/neutral/0: #FFFFFF colour/neutral/50: #F9F5F1 colour/neutral/100: #E9E5E1 colour/neutral/200: #D9D5D1 colour/neutral/300: #C9C5C1 colour/neutral/400: #B9B5B1 colour/neutral/500: #A9A5A1 colour/neutral/600: #999591 colour/neutral/700: #898581 colour/neutral/800: #494541 colour/neutral/900: #292521 colour/neutral/1000: #000000 ``` ### Colour/Status (TBD) ``` colour/status/alert: #FF6B35 (orange, for notifications — confirm value) ``` --- ## Semantic Tokens ### Background ``` colour/bg/primary: colour/cream/500 (#EFE5D1) colour/bg/secondary: colour/cream/100 (#FAF6F0) colour/bg/tertiary: colour/cream/200 (#F7F2E8) colour/bg/canvas: colour/neutral/0 (#FFFFFF) colour/bg/overlay-dark: colour/neutral/1000 with 24% opacity ``` ### Text ``` colour/text/primary: colour/neutral/600 (#999591) colour/text/secondary: colour/neutral/500 (#A9A5A1) colour/text/tertiary: colour/neutral/400 (#B9B5B1) colour/text/inverse: colour/neutral/0 (#FFFFFF) colour/text/disabled: colour/neutral/200 (#D9D5D1) ``` ### Border ``` colour/border/light: colour/neutral/100 (#E9E5E1) colour/border/medium: colour/neutral/200 (#D9D5D1) colour/border/strong: colour/neutral/600 (#999591) colour/border/focus: colour/neutral/800 (#494541) ``` ### Icon ``` colour/icon/primary: colour/neutral/800 (#494541) colour/icon/secondary: colour/neutral/600 (#999591) colour/icon/disabled: colour/neutral/200 (#D9D5D1) colour/icon/inverse: colour/neutral/0 (#FFFFFF) ``` ### Status & Interaction ``` colour/active: colour/neutral/900 (#292521) colour/hover: colour/cream/400 (#F1E9D9) colour/focus-ring: colour/neutral/800 (#494541) colour/alert: colour/status/alert (#FF6B35) colour/success: (TBD) colour/warning: (TBD) colour/info: (TBD) ``` --- ## Typography Tokens ### Font Family ``` type/family: PP Grotesk Mono type/family/fallback: monospace ``` ### Font Sizes & Line Heights ``` type/display/size: 48px type/display/lineheight: 56px type/display/weight: bold type/h1/size: 40px type/h1/lineheight: 48px type/h1/weight: bold type/h2/size: 32px type/h2/lineheight: 40px type/h2/weight: bold type/h3/size: 28px type/h3/lineheight: 36px type/h3/weight: bold type/h4/size: 24px type/h4/lineheight: 32px type/h4/weight: bold type/body-large/size: 20px type/body-large/lineheight: 28px type/body-large/weight: regular type/body/size: 16px type/body/lineheight: 24px type/body/weight: regular type/caption/size: 12px (deprecated — use type/body with neutral/400) type/caption/lineheight: 16px type/caption/weight: light ``` ### Weight Tokens ``` type/weight/light: 300 type/weight/regular: 400 type/weight/bold: 700 ``` --- ## Spacing Tokens ``` space/1: 4px space/2: 8px space/3: 12px space/4: 16px space/5: 20px space/6: 24px space/7: 32px space/8: 40px space/9: 48px space/10: 64px ``` --- ## Elevation Tokens ``` shadow/small: 0px 4px 8px rgba(0, 0, 0, 0.24) ``` --- ## Radius Tokens ``` radius/none: 0px ``` --- ## Component-Specific Tokens ### Buttons #### Icon Button ``` button/icon/size: 40px × 40px button/icon/background: colour/bg/primary button/icon/background-hover: colour/hover button/icon/icon-colour: colour/icon/primary button/icon/padding: 0 (square) button/icon/radius: radius/none ``` #### Text Button / Link ``` button/text/font: type/body button/text/colour: colour/text/primary button/text/colour-hover: colour/text/primary (underline or bg hint) button/text/background: colour/bg/primary ``` ### Inputs #### Dropdown ``` input/dropdown/height: 40px input/dropdown/padding: space/4 (horizontal) input/dropdown/font: type/body input/dropdown/background: colour/bg/primary input/dropdown/border: colour/border/medium input/dropdown/text-colour: colour/text/primary input/dropdown/icon-colour: colour/icon/primary input/dropdown/radius: radius/none ``` #### Calendar / Date Picker ``` input/calendar/cell-size: 40px (minimum) input/calendar/cell-padding: space/2 input/calendar/active-bg: colour/active input/calendar/active-text: colour/text/inverse input/calendar/inactive-bg: colour/bg/primary input/calendar/inactive-text: colour/text/primary input/calendar/font: type/body input/calendar/header-font: type/h4 ``` #### Location Picker ``` input/location/item-height: 44px (minimum touch target) input/location/item-padding: space/4 input/location/font: type/body input/location/background: colour/bg/primary input/location/text-colour: colour/text/primary input/location/arrow-colour: colour/icon/secondary ``` ### Panels #### Panel Header ``` panel/header/background: colour/bg/tertiary panel/header/height: 48px (minimum) panel/header/padding: space/4 panel/header/font: type/h4 or type/body panel/header/text-colour: colour/text/primary panel/header/border: colour/border/light (bottom) panel/header/icon-colour: colour/icon/primary panel/header/close-size: 24px ``` #### Panel Body ``` panel/body/background: colour/bg/primary panel/body/padding: space/6 panel/body/font: type/body panel/body/text-colour: colour/text/primary panel/body/shadow: shadow/small ``` #### List Item ``` list/item/height: 44px (minimum) list/item/padding: space/4 list/item/font: type/body list/item/background: colour/bg/primary list/item/background-hover: colour/hover list/item/text-colour: colour/text/primary list/item/border: colour/border/light (bottom) list/item/arrow-colour: colour/icon/secondary list/item/radius: radius/none ``` ### Indicators #### Notification Dot ``` indicator/dot/size: 8px indicator/dot/background: colour/alert indicator/dot/position: top-right (absolute, -2px offset) ``` #### Badge ``` indicator/badge/min-width: 28px indicator/badge/height: 28px indicator/badge/padding: space/2 (horizontal) indicator/badge/font: type/body indicator/badge/font-weight: bold indicator/badge/background: colour/active indicator/badge/text-colour: colour/text/inverse indicator/badge/radius: radius/none ``` --- ## Component-Agnostic Usage For any component not explicitly listed above: 1. Use `colour/bg/primary` for primary backgrounds 2. Use `colour/text/primary` for primary text 3. Use `colour/border/medium` for borders 4. Use `space/4` for standard padding, `space/6` for generous padding 5. Use `shadow/small` for elevated surfaces 6. Use `radius/none` for all corners 7. Use `type/body` for standard UI copy, `type/h4` for section headers 8. Apply `colour/active` (neutral/900) for selected/active states 9. Respect minimum touch target size of 44×44px for interactive elements","absoluteBoundingBox":{"x":52572.0,"y":6812.0,"width":760.0,"height":7824.0},"isolatedAbsoluteRenderBounds":{"x":52570.16015625,"y":6817.65576171875,"width":745.203125,"height":7790.46435546875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":7824.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design Tokens\n\n## Token Structure\n\nTokens follow a three-layer architecture:\n1. **Primitive:** Raw colour values, named by hue and lightness stop\n2. **Semantic:** Intent-based tokens mapped to primitives (e.g. `background/primary`, `text/secondary`)\n3. **Component:** Usage-specific tokens applied to buttons, inputs, panels, etc. (optional; can be inferred from semantic tokens)\n\n---\n\n## Primitives\n\n### Colour/Cream\n\n```\ncolour/cream/50:    #FCFBF7\ncolour/cream/100:   #FAF6F0\ncolour/cream/200:   #F7F2E8\ncolour/cream/300:   #F4EEE0\ncolour/cream/400:   #F1E9D9\ncolour/cream/500:   #EFE5D1\ncolour/cream/600:   #ECE1C9\ncolour/cream/700:   #E9DCC2\ncolour/cream/800:   #E7D8BA\ncolour/cream/900:   #D9C5A0\n```\n\n### Colour/Neutral\n\n```\ncolour/neutral/0:     #FFFFFF\ncolour/neutral/50:    #F9F5F1\ncolour/neutral/100:   #E9E5E1\ncolour/neutral/200:   #D9D5D1\ncolour/neutral/300:   #C9C5C1\ncolour/neutral/400:   #B9B5B1\ncolour/neutral/500:   #A9A5A1\ncolour/neutral/600:   #999591\ncolour/neutral/700:   #898581\ncolour/neutral/800:   #494541\ncolour/neutral/900:   #292521\ncolour/neutral/1000:  #000000\n```\n\n### Colour/Status (TBD)\n\n```\ncolour/status/alert:  #FF6B35  (orange, for notifications — confirm value)\n```\n\n---\n\n## Semantic Tokens\n\n### Background\n\n```\ncolour/bg/primary:        colour/cream/500   (#EFE5D1)\ncolour/bg/secondary:      colour/cream/100   (#FAF6F0)\ncolour/bg/tertiary:       colour/cream/200   (#F7F2E8)\ncolour/bg/canvas:         colour/neutral/0   (#FFFFFF)\ncolour/bg/overlay-dark:   colour/neutral/1000 with 24% opacity\n```\n\n### Text\n\n```\ncolour/text/primary:      colour/neutral/600  (#999591)\ncolour/text/secondary:    colour/neutral/500  (#A9A5A1)\ncolour/text/tertiary:     colour/neutral/400  (#B9B5B1)\ncolour/text/inverse:      colour/neutral/0    (#FFFFFF)\ncolour/text/disabled:     colour/neutral/200  (#D9D5D1)\n```\n\n### Border\n\n```\ncolour/border/light:      colour/neutral/100  (#E9E5E1)\ncolour/border/medium:     colour/neutral/200  (#D9D5D1)\ncolour/border/strong:     colour/neutral/600  (#999591)\ncolour/border/focus:      colour/neutral/800  (#494541)\n```\n\n### Icon\n\n```\ncolour/icon/primary:      colour/neutral/800  (#494541)\ncolour/icon/secondary:    colour/neutral/600  (#999591)\ncolour/icon/disabled:     colour/neutral/200  (#D9D5D1)\ncolour/icon/inverse:      colour/neutral/0    (#FFFFFF)\n```\n\n### Status & Interaction\n\n```\ncolour/active:            colour/neutral/900  (#292521)\ncolour/hover:             colour/cream/400    (#F1E9D9)\ncolour/focus-ring:        colour/neutral/800  (#494541)\ncolour/alert:             colour/status/alert (#FF6B35)\ncolour/success:           (TBD)\ncolour/warning:           (TBD)\ncolour/info:              (TBD)\n```\n\n---\n\n## Typography Tokens\n\n### Font Family\n```\ntype/family:             PP Grotesk Mono\ntype/family/fallback:    monospace\n```\n\n### Font Sizes & Line Heights\n\n```\ntype/display/size:       48px\ntype/display/lineheight: 56px\ntype/display/weight:     bold\n\ntype/h1/size:            40px\ntype/h1/lineheight:      48px\ntype/h1/weight:          bold\n\ntype/h2/size:            32px\ntype/h2/lineheight:      40px\ntype/h2/weight:          bold\n\ntype/h3/size:            28px\ntype/h3/lineheight:      36px\ntype/h3/weight:          bold\n\ntype/h4/size:            24px\ntype/h4/lineheight:      32px\ntype/h4/weight:          bold\n\ntype/body-large/size:    20px\ntype/body-large/lineheight: 28px\ntype/body-large/weight:  regular\n\ntype/body/size:          16px\ntype/body/lineheight:    24px\ntype/body/weight:        regular\n\ntype/caption/size:       12px (deprecated — use type/body with neutral/400)\ntype/caption/lineheight: 16px\ntype/caption/weight:     light\n```\n\n### Weight Tokens\n\n```\ntype/weight/light:       300\ntype/weight/regular:     400\ntype/weight/bold:        700\n```\n\n---\n\n## Spacing Tokens\n\n```\nspace/1:   4px\nspace/2:   8px\nspace/3:   12px\nspace/4:   16px\nspace/5:   20px\nspace/6:   24px\nspace/7:   32px\nspace/8:   40px\nspace/9:   48px\nspace/10:  64px\n```\n\n---\n\n## Elevation Tokens\n\n```\nshadow/small:  0px 4px 8px rgba(0, 0, 0, 0.24)\n```\n\n---\n\n## Radius Tokens\n\n```\nradius/none:  0px\n```\n\n---\n\n## Component-Specific Tokens\n\n### Buttons\n\n#### Icon Button\n```\nbutton/icon/size:           40px × 40px\nbutton/icon/background:     colour/bg/primary\nbutton/icon/background-hover: colour/hover\nbutton/icon/icon-colour:    colour/icon/primary\nbutton/icon/padding:        0 (square)\nbutton/icon/radius:         radius/none\n```\n\n#### Text Button / Link\n```\nbutton/text/font:           type/body\nbutton/text/colour:         colour/text/primary\nbutton/text/colour-hover:   colour/text/primary (underline or bg hint)\nbutton/text/background:     colour/bg/primary\n```\n\n### Inputs\n\n#### Dropdown\n```\ninput/dropdown/height:      40px\ninput/dropdown/padding:     space/4 (horizontal)\ninput/dropdown/font:        type/body\ninput/dropdown/background:  colour/bg/primary\ninput/dropdown/border:      colour/border/medium\ninput/dropdown/text-colour: colour/text/primary\ninput/dropdown/icon-colour: colour/icon/primary\ninput/dropdown/radius:      radius/none\n```\n\n#### Calendar / Date Picker\n```\ninput/calendar/cell-size:       40px (minimum)\ninput/calendar/cell-padding:    space/2\ninput/calendar/active-bg:       colour/active\ninput/calendar/active-text:     colour/text/inverse\ninput/calendar/inactive-bg:     colour/bg/primary\ninput/calendar/inactive-text:   colour/text/primary\ninput/calendar/font:            type/body\ninput/calendar/header-font:     type/h4\n```\n\n#### Location Picker\n```\ninput/location/item-height:     44px (minimum touch target)\ninput/location/item-padding:    space/4\ninput/location/font:            type/body\ninput/location/background:      colour/bg/primary\ninput/location/text-colour:     colour/text/primary\ninput/location/arrow-colour:    colour/icon/secondary\n```\n\n### Panels\n\n#### Panel Header\n```\npanel/header/background:   colour/bg/tertiary\npanel/header/height:       48px (minimum)\npanel/header/padding:      space/4\npanel/header/font:         type/h4 or type/body\npanel/header/text-colour:  colour/text/primary\npanel/header/border:       colour/border/light (bottom)\npanel/header/icon-colour:  colour/icon/primary\npanel/header/close-size:   24px\n```\n\n#### Panel Body\n```\npanel/body/background:     colour/bg/primary\npanel/body/padding:        space/6\npanel/body/font:           type/body\npanel/body/text-colour:    colour/text/primary\npanel/body/shadow:         shadow/small\n```\n\n#### List Item\n```\nlist/item/height:          44px (minimum)\nlist/item/padding:         space/4\nlist/item/font:            type/body\nlist/item/background:      colour/bg/primary\nlist/item/background-hover: colour/hover\nlist/item/text-colour:     colour/text/primary\nlist/item/border:          colour/border/light (bottom)\nlist/item/arrow-colour:    colour/icon/secondary\nlist/item/radius:          radius/none\n```\n\n### Indicators\n\n#### Notification Dot\n```\nindicator/dot/size:        8px\nindicator/dot/background:  colour/alert\nindicator/dot/position:    top-right (absolute, -2px offset)\n```\n\n#### Badge\n```\nindicator/badge/min-width: 28px\nindicator/badge/height:    28px\nindicator/badge/padding:   space/2 (horizontal)\nindicator/badge/font:      type/body\nindicator/badge/font-weight: bold\nindicator/badge/background: colour/active\nindicator/badge/text-colour: colour/text/inverse\nindicator/badge/radius:    radius/none\n```\n\n---\n\n## Component-Agnostic Usage\n\nFor any component not explicitly listed above:\n1. Use `colour/bg/primary` for primary backgrounds\n2. Use `colour/text/primary` for primary text\n3. Use `colour/border/medium` for borders\n4. Use `space/4` for standard padding, `space/6` for generous padding\n5. Use `shadow/small` for elevated surfaces\n6. Use `radius/none` for all corners\n7. Use `type/body` for standard UI copy, `type/h4` for section headers\n8. Apply `colour/active` (neutral/900) for selected/active states\n9. Respect minimum touch target size of 44×44px for interactive elements\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"63:17417":{"type":"SVG","id":"63:17417","name":"Logo","absoluteBoundingBox":{"x":48120.0,"y":236.0,"width":251.571716308594,"height":83.9320373535156},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":236.0,"width":251.5703125,"height":83.9320373535156},"relativeTransform":[[1.0,0.0,56.0],[0.0,1.0,136.0]],"size":{"x":251.571716308594,"y":83.9320373535156},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logo","ariaAttributes":{},"interactions":[],"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2752":{"type":"FRAME","id":"34:2752","name":"1","absoluteBoundingBox":{"x":53768.0,"y":124.0,"width":424.0,"height":9232.0},"isolatedAbsoluteRenderBounds":{"x":53768.0,"y":124.0,"width":424.0,"height":9232.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":424.0,"y":9232.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":0.0},"exitTransition":{"easingType":"GENTLE_SPRING","easingFunction":[1.0,100.0,15.0,0.0],"transitionDuration":0.400000005960464,"delay":0.200000002980232},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":40.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":56.0,"paddingRight":20.0,"paddingBottom":56.0,"paddingLeft":20.0,"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["41:3542","78:20331"]},"34:2667":{"type":"TEXT","id":"34:2667","name":"Software design","absoluteBoundingBox":{"x":48124.0,"y":503.932037353516,"width":149.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":48124.78515625,"y":509.588043212891,"width":146.37890625,"height":14.4640197753906},"relativeTransform":[[1.0,0.0,4.0],[0.0,1.0,0.0]],"size":{"x":149.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.160784319043159,"g":0.14509804546833,"b":0.129411771893501,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Software design","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20366":{"type":"TEXT","id":"78:20366","name":"COMPONENTS.MD","absoluteBoundingBox":{"x":52572.0,"y":14780.0,"width":760.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":52576.3515625,"y":14805.51953125,"width":509.08203125,"height":45.4404296875},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,56.0]],"size":{"x":760.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"COMPONENTS.MD","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":96.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"78:20330":{"type":"TEXT","id":"78:20330","name":"# Augur Design System ## Overview Augur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering. **Typeface:** PP Grotesk Mono (Light, Regular, Bold) **Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius **Shadow:** Single elevation style for raised surfaces **Grid:** 8px base unit --- ## Colour System ### Primitives #### Cream ramp Used as primary background for UI surfaces, panels, secondary navigation. | Stop | Hex | Use | |---|---|---| | 50 | `#FCFBF7` | Lightest surface, hover states | | 100 | `#FAF6F0` | Secondary panel backgrounds | | 200 | `#F7F2E8` | Secondary nav bar, panel headers | | 300 | `#F4EEE0` | Subtle dividers, disabled states | | 400 | `#F1E9D9` | List item hover | | 500 | `#EFE5D1` | Baseline panel background | | 600 | `#ECE1C9` | Accent/selection tint | | 700 | `#E9DCC2` | Medium panel contrast | | 800 | `#E7D8BA` | Deep panel background, dark hover | | 900 | `#D9C5A0` | — | #### Neutral ramp Used for text, borders, icons, and status indicators. | Stop | Hex | Use | |---|---|---| | 0 | `#FFFFFF` | White backgrounds, icon fill on dark | | 50 | `#F9F5F1` | Very light backgrounds | | 100 | `#E9E5E1` | Light borders | | 200 | `#D9D5D1` | Subtle borders, disabled text | | 300 | `#C9C5C1` | Light dividers | | 400 | `#B9B5B1` | Tertiary text, secondary icons | | 500 | `#A9A5A1` | Secondary text | | 600 | `#999591` | Primary text | | 700 | `#898581` | Headings, emphasis | | 800 | `#494541` | Strong emphasis, icon fill | | 900 | `#292521` | Dark UI elements, active states | | 1000 | `#000000` | Black backgrounds, peak contrast | ### Semantics | Token | Primitive | Use | |---|---|---| | `colour/bg/primary` | `cream/500` | Panel backgrounds | | `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds | | `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers | | `colour/bg/canvas` | `white` | Main 3D canvas | | `colour/text/primary` | `neutral/600` | Body text, labels | | `colour/text/secondary` | `neutral/500` | Metadata, hints | | `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised | | `colour/text/inverse` | `neutral/0` | Text on dark backgrounds | | `colour/border/light` | `neutral/100` | Subtle dividers | | `colour/border/medium` | `neutral/200` | Standard borders | | `colour/border/strong` | `neutral/600` | Emphasis borders, outlines | | `colour/icon/primary` | `neutral/800` | Standard icons | | `colour/icon/secondary` | `neutral/600` | Secondary icons | | `colour/icon/disabled` | `neutral/200` | Disabled icons | | `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) | | `colour/active` | `neutral/900` | Selected states, active indicators | --- ## Typography **Font:** PP Grotesk Mono, monospace | Token | Size | Line height | Weight | Use | |---|---|---|---|---| | `type/display` | 48px | 56px | Bold | Hero headings, page titles | | `type/h1` | 40px | 48px | Bold | Section headings | | `type/h2` | 32px | 40px | Bold | Subsection headings | | `type/h3` | 28px | 36px | Bold | Panel titles, card headings | | `type/h4` | 24px | 32px | Bold | Secondary headings, labels | | `type/body-large` | 20px | 28px | Regular | Panel introductions, large body | | `type/body` | 16px | 24px | Regular | Standard body text, UI copy | ### Weight modifiers - Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`) - Regular: Default weight for body, labels, and copy - Bold: Headings, emphasis, CTA text ### Line length Monospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density. --- ## Spacing **Base unit:** 8px | Token | Value | Use | |---|---|---| | `space/1` | 4px | Tight gaps, icon-to-label spacing | | `space/2` | 8px | Component padding, fine gutters | | `space/3` | 12px | Internal spacing | | `space/4` | 16px | Standard padding, list gaps | | `space/5` | 20px | Generous padding | | `space/6` | 24px | Section padding, panel margins | | `space/7` | 32px | Major spacing, dividers | | `space/8` | 40px | Large gaps, section breaks | | `space/9` | 48px | Major layout spacing | | `space/10` | 64px | Canvas margins, page-level spacing | --- ## Elevation **Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns). | Token | Value | Use | |---|---|---| | `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards | --- ## Radius **All corners are square.** No border radius applied. | Token | Value | |---|---| | `radius/none` | 0px | --- ## Component Inventory ### Buttons - **Icon button** — Square, 40×40px, dark icon on cream background, no border - **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels - **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive ### Inputs - **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text - **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900` - **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows ### Panels & Modals - **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional - **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards - **Panel footer** — Optional, links or actions with arrow indicators - **Drawer shadow** — Applied to all raised panels ### Lists & Tables - **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`) - **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream - **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation ### Cards - **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows - **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links - **Data detail card** — Bar chart with axis labels, metadata footer ### Indicators - **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel - **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\" - **Active indicator** — `neutral/900` background or fill for selected/active states ### Navigation - **Top bar** — White background, logo (left), global filters (centre), user controls (right) - **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy - **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset) - **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body` --- ## Motion None specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close). --- ## Accessibility - **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text) - **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter - **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text - **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing - **Monospace typography:** Line length kept under 70 characters to maintain readability --- ## Usage Guidelines ### Tone Copy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity. ### Data presentation Prefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail. ### Panel interaction Panels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators. ### Colour application Cream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps. ### Monospace decisions All UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.","absoluteBoundingBox":{"x":52572.0,"y":308.0,"width":760.0,"height":6240.0},"isolatedAbsoluteRenderBounds":{"x":52570.16015625,"y":313.656005859375,"width":757.5390625,"height":6206.064453125},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,176.0]],"size":{"x":760.0,"y":6240.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.945098042488098,"g":0.91372549533844,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"# Augur Design System\n\n## Overview\n\nAugur is a spatial intelligence platform for public safety operators. The design system prioritises clarity, precision, and confidence in a high-stakes environment. All copy is direct and authoritative. All interfaces are utilitarian and square-edged. The palette is a neutral cream-to-charcoal ramp with minimal accent colour, supporting data-heavy visualisations and 3D spatial rendering.\n\n**Typeface:** PP Grotesk Mono (Light, Regular, Bold)  \n**Palette:** Cream (`colour/cream`), Neutral grey (`colour/neutral`), no border radius  \n**Shadow:** Single elevation style for raised surfaces  \n**Grid:** 8px base unit\n\n---\n\n## Colour System\n\n### Primitives\n\n#### Cream ramp\nUsed as primary background for UI surfaces, panels, secondary navigation.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 50 | `#FCFBF7` | Lightest surface, hover states |\n| 100 | `#FAF6F0` | Secondary panel backgrounds |\n| 200 | `#F7F2E8` | Secondary nav bar, panel headers |\n| 300 | `#F4EEE0` | Subtle dividers, disabled states |\n| 400 | `#F1E9D9` | List item hover |\n| 500 | `#EFE5D1` | Baseline panel background |\n| 600 | `#ECE1C9` | Accent/selection tint |\n| 700 | `#E9DCC2` | Medium panel contrast |\n| 800 | `#E7D8BA` | Deep panel background, dark hover |\n| 900 | `#D9C5A0` | — |\n\n#### Neutral ramp\nUsed for text, borders, icons, and status indicators.\n\n| Stop | Hex | Use |\n|---|---|---|\n| 0 | `#FFFFFF` | White backgrounds, icon fill on dark |\n| 50 | `#F9F5F1` | Very light backgrounds |\n| 100 | `#E9E5E1` | Light borders |\n| 200 | `#D9D5D1` | Subtle borders, disabled text |\n| 300 | `#C9C5C1` | Light dividers |\n| 400 | `#B9B5B1` | Tertiary text, secondary icons |\n| 500 | `#A9A5A1` | Secondary text |\n| 600 | `#999591` | Primary text |\n| 700 | `#898581` | Headings, emphasis |\n| 800 | `#494541` | Strong emphasis, icon fill |\n| 900 | `#292521` | Dark UI elements, active states |\n| 1000 | `#000000` | Black backgrounds, peak contrast |\n\n### Semantics\n\n| Token | Primitive | Use |\n|---|---|---|\n| `colour/bg/primary` | `cream/500` | Panel backgrounds |\n| `colour/bg/secondary` | `cream/100` | Secondary panel backgrounds |\n| `colour/bg/tertiary` | `cream/200` | Secondary nav bar, headers |\n| `colour/bg/canvas` | `white` | Main 3D canvas |\n| `colour/text/primary` | `neutral/600` | Body text, labels |\n| `colour/text/secondary` | `neutral/500` | Metadata, hints |\n| `colour/text/tertiary` | `neutral/400` | Disabled, de-emphasised |\n| `colour/text/inverse` | `neutral/0` | Text on dark backgrounds |\n| `colour/border/light` | `neutral/100` | Subtle dividers |\n| `colour/border/medium` | `neutral/200` | Standard borders |\n| `colour/border/strong` | `neutral/600` | Emphasis borders, outlines |\n| `colour/icon/primary` | `neutral/800` | Standard icons |\n| `colour/icon/secondary` | `neutral/600` | Secondary icons |\n| `colour/icon/disabled` | `neutral/200` | Disabled icons |\n| `colour/status/alert` | `#FF6B35` | Notifications, urgent status (TBD — not in palette yet) |\n| `colour/active` | `neutral/900` | Selected states, active indicators |\n\n---\n\n## Typography\n\n**Font:** PP Grotesk Mono, monospace\n\n| Token | Size | Line height | Weight | Use |\n|---|---|---|---|---|\n| `type/display` | 48px | 56px | Bold | Hero headings, page titles |\n| `type/h1` | 40px | 48px | Bold | Section headings |\n| `type/h2` | 32px | 40px | Bold | Subsection headings |\n| `type/h3` | 28px | 36px | Bold | Panel titles, card headings |\n| `type/h4` | 24px | 32px | Bold | Secondary headings, labels |\n| `type/body-large` | 20px | 28px | Regular | Panel introductions, large body |\n| `type/body` | 16px | 24px | Regular | Standard body text, UI copy |\n\n### Weight modifiers\n- Light: Used for secondary/metadata text (not a separate style, applied to `type/body` or smaller with `font-weight: 300`)\n- Regular: Default weight for body, labels, and copy\n- Bold: Headings, emphasis, CTA text\n\n### Line length\nMonospace type reads best at 50–70 characters per line. In narrow panels, may compress to 40–50 characters; in tables/lists, character width is secondary to data density.\n\n---\n\n## Spacing\n\n**Base unit:** 8px\n\n| Token | Value | Use |\n|---|---|---|\n| `space/1` | 4px | Tight gaps, icon-to-label spacing |\n| `space/2` | 8px | Component padding, fine gutters |\n| `space/3` | 12px | Internal spacing |\n| `space/4` | 16px | Standard padding, list gaps |\n| `space/5` | 20px | Generous padding |\n| `space/6` | 24px | Section padding, panel margins |\n| `space/7` | 32px | Major spacing, dividers |\n| `space/8` | 40px | Large gaps, section breaks |\n| `space/9` | 48px | Major layout spacing |\n| `space/10` | 64px | Canvas margins, page-level spacing |\n\n---\n\n## Elevation\n\n**Shadow model:** Single elevation level for raised surfaces (panels, modals, dropdowns).\n\n| Token | Value | Use |\n|---|---|---|\n| `shadow/small` | `0px 4px 8px rgba(0, 0, 0, 0.24)` | Elevated panels, dropdowns, cards |\n\n---\n\n## Radius\n\n**All corners are square.** No border radius applied.\n\n| Token | Value |\n|---|---|\n| `radius/none` | 0px |\n\n---\n\n## Component Inventory\n\n### Buttons\n- **Icon button** — Square, 40×40px, dark icon on cream background, no border\n- **Text button** — `type/body` with arrow, cream background, dark text, left-aligned in panels\n- **State button** (Period selector, Calendar, Location picker) — Selectable items, dark `neutral/900` background when active, cream when inactive\n\n### Inputs\n- **Dropdown** — Icon + label + value + chevron, `type/body` copy, cream background, dark text\n- **Date/time picker** — Calendar grid with period tabs (Year/Month/Week/Day/LIVE), square cells, active state in `neutral/900`\n- **Location picker** — Hierarchical list with back/forward navigation, `type/body` labels + arrows\n\n### Panels & Modals\n- **Panel header** — `cream/200` background, `type/h4` title or `type/body` label, left-aligned with close X button top-right, back arrow optional\n- **Panel body** — `cream/500` background, grouped content with section headers (`type/h4`), list items or detail cards\n- **Panel footer** — Optional, links or actions with arrow indicators\n- **Drawer shadow** — Applied to all raised panels\n\n### Lists & Tables\n- **List item** — Label + arrow, `type/body`, cream background, grouped under section headers (`type/h4`)\n- **Event/Person list item** — Avatar + timestamp + title + description + location, square avatar, dark text on cream\n- **Data table** — Column headers in `type/h4`, rows in `type/body`, grey bars for data visualisation\n\n### Cards\n- **Event detail card** — Hero image, avatar, title (`type/h3`), description (`type/body-large`), metadata in `neutral/500`, related actions (Cameras, People, Timeline, Associates, Notes, Report) as text links with arrows\n- **Person detail card** — Large circular avatar, timestamp + name + description, related actions as links\n- **Data detail card** — Bar chart with axis labels, metadata footer\n\n### Indicators\n- **Notification dot** — Orange (TBD colour), small circle, positioned top-right of avatar or top-right of panel\n- **Badge** — Percentage or count in dark circular background, `type/body` white text, e.g. \"92%\" or \"M:32 F:68\"\n- **Active indicator** — `neutral/900` background or fill for selected/active states\n\n### Navigation\n- **Top bar** — White background, logo (left), global filters (centre), user controls (right)\n- **Secondary nav** — `cream/200` background, tabs with icons + labels, `type/body` copy\n- **Floating controls** — Square icon buttons, positioned bottom-right near canvas (2D/3D toggle, zoom in/out, reset)\n- **Timeline scrubber** — Bottom bar, cream background, playback controls, timecode in `type/body`\n\n---\n\n## Motion\n\nNone specified yet. System assumes static layouts and drawer/panel transitions (slide, fade on close).\n\n---\n\n## Accessibility\n\n- **Colour contrast:** All text meets WCAG AA minimum (4.5:1 for body text, 3:1 for large text)\n- **Keyboard navigation:** All buttons and links are focusable; dropdowns and pickers support arrow keys and Enter\n- **Screen readers:** Panel headers include semantic HTML (`<h2>`, `<h3>`); links include descriptive text or aria-labels; images include alt text\n- **Touch targets:** Buttons minimum 44×44px; icon buttons 40×40px with adequate spacing\n- **Monospace typography:** Line length kept under 70 characters to maintain readability\n\n---\n\n## Usage Guidelines\n\n### Tone\nCopy is direct, authoritative, and procedural. No casual language, humour, or exclamation marks. Precision over brevity.\n\n### Data presentation\nPrefer exact values and timestamps over summaries. Group related data under clear section headers. Use tables and charts for volume; use cards for detail.\n\n### Panel interaction\nPanels are modular and stackable. Back arrows and close X buttons allow operators to navigate and dismiss. Panels should not overflow vertically — use scrolling sparingly and with visual indicators.\n\n### Colour application\nCream (`colour/cream`) backgrounds dominate UI; neutral grey provides text and icons. Orange accent (status/alert) is reserved for urgent notifications. White canvas hosts 3D rendering and maps.\n\n### Monospace decisions\nAll UI copy uses Grotesk Mono. The font is narrow and dense, ideal for data density and tabular layouts. Line length should be considered in narrow panels; justify left, not centre.\n","lineIndentations":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"Px Grotesk Mono","fontPostScriptName":"PxGroteskMono-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"34:2652":{"type":"SVG","id":"34:2652","name":"back","absoluteBoundingBox":{"x":48120.0,"y":156.0,"width":40.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":48120.0,"y":156.0,"width":40.0,"height":40.0},"relativeTransform":[[1.0,0.0,56.0],[0.0,1.0,56.0]],"size":{"x":40.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"BUTTON","isDecorativeImage":false,"accessibleLabel":"Back button","ariaAttributes":{},"interactions":[{"id":{"sessionID":53,"localID":3575},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://digfat.com","openUrlInNewTab":false}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7076106675d532f2b6805d1f81f6012207006322"}},"assetIdToGuid":{},"guidToUrl":{"15:134":"/branding-design","34:1371":"/design-system","86:26396":"/final-outcome-2","34:781":"/","34:1725":"/product-definition","34:2341":"/final-outcome","34:2033":"/software-design","34:2649":"/agent-preparation"},"fonts":{"Px Grotesk Mono:Regular":{"id":"e54a03e800c0ce25f23e3b7616719cbaef8ee08f","url":"e54a03e800c0ce25f23e3b7616719cbaef8ee08f","source":2,"italic":false,"weight":400}},"assets":{"3f2b264694c96ba680ac0fc4f013be2685b12972":{"type":"GENERATED_ASSET","url":"3f2b264694c96ba680ac0fc4f013be2685b12972.svg","size":{"x":251.570816040039,"y":83.9326400756836},"offsets":{"left":{"value":-0.000132199539131734,"unit":"PERCENT"},"right":{"value":0.00010793791291496,"unit":"PERCENT"},"top":{"value":-2.59057407988893e-05,"unit":"PERCENT"},"bottom":{"value":-0.000737651837578251,"unit":"PERCENT"}},"format":"SVG"},"7076106675d532f2b6805d1f81f6012207006322":{"type":"GENERATED_ASSET","url":"7076106675d532f2b6805d1f81f6012207006322.svg","size":{"x":40.0,"y":40.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"}},"stablePathToAssetInfo":{"63:17429":{"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2730":{"hash":"7076106675d532f2b6805d1f81f6012207006322"},"63:17417":{"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2704":{"hash":"7076106675d532f2b6805d1f81f6012207006322"},"63:17423":{"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2678":{"hash":"7076106675d532f2b6805d1f81f6012207006322"},"63:17435":{"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2756":{"hash":"7076106675d532f2b6805d1f81f6012207006322"},"63:17403":{"hash":"3f2b264694c96ba680ac0fc4f013be2685b12972"},"34:2652":{"hash":"7076106675d532f2b6805d1f81f6012207006322"}},"animateRootIds":[],"siteSettings":{"scalingMode":"REFLOW","blockSearchIndexing":true,"labs":{"E5FBBA911B2B7A09E649D4BE6CDF8591EAEFC881":false},"title":"Augur - Agent preparation"},"sourceCodeHash":""}