# samuelfriher/ull-auditorium-seating architecture

> Architecture diagram of the GitHub repository samuelfriher/ull-auditorium-seating, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-17). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/samuelfriher/ull-auditorium-seating
- Repository: https://github.com/samuelfriher/ull-auditorium-seating

## Overview

1. **Overall shape**
   - This is a **static Astro app** with a **vanilla TypeScript + DOM/SVG** client architecture.
   - There is no React/Vue component runtime; the UI is assembled directly through TypeScript classes that manipulate the DOM and SVG.

2. **Application entry and pages**
   - `src/pages/index.astro` is the main application shell.
   - `src/pages/legal.astro` provides the disclaimer/legal page referenced by the footer.
   - `src/main.ts` is the client-side bootstrap for the interactive seating app.

3. **Primary architectural pattern**
   - The app is organized as a **decoupled MVC-like system**:
     - **Controllers** manage user actions and state changes.
     - **Views** render UI and emit user events.
     - **Models** hold domain state.
   - Communication is mediated by a typed **EventBus** (`src/events/EventBus.ts`), which keeps views and controllers separated.

4. **State and domain model**
   - `src/models/AppState.ts` appears to be the central application state container.
   - The seating domain is modeled with:
     - `Venue`, `Section`, `Seat`, `SeatGroup`
     - `GraduationGuestGroup`
   - `VenueSerializer` supports turning the full seating arrangement into/from a portable representation, enabling save/load workflows.

5. **Venue definition and layout generation**
   - The auditorium layout is not hardcoded in a single view; it is generated from data modules in `src/data/`:
     - `UllAuditorium.ts`
     - `AmphitheaterGenerator.ts`
     - `BoxesGenerator.ts`
     - `StallsGenerator.ts`
   - These generators define the physical structure of the venue, which is then consumed by the UI and allocation logic.
   - `VenueDefinitionLoader` in `src/utils/` likely bridges these definitions into runtime-ready models.

6. **View layer responsibilities**
   - Views are split by responsibility and by screen area:
     - `src/views/venue/*` renders the SVG seating map and seat/section interactions.
     - `src/views/groups/*` manages group CRUD panels and list items.
     - `src/views/graduation/*` contains the graduation/orla configuration UI.
     - `src/views/layout/*` provides shared chrome such as toolbar and footer.
   - The view layer is responsible for presentation and user interaction capture, not business logic.

7. **Controller layer responsibilities**
   - Controllers orchestrate user workflows:
     - `AppController` is the top-level coordinator.
     - `SelectionController` handles seat selection behavior, including individual and drag selection.
     - `GroupController` manages group create/edit/delete actions.
     - `GraduationController` coordinates graduation mode configuration and allocation.
     - `ExportController` handles import/export of seating state.
   - Controllers are the main consumers of view events and the main mutators of application state.

8. **Graduation mode as a distinct subsystem**
   - Graduation/orla functionality is a specialized workflow rather than a minor toggle.
   - The subsystem combines:
     - allocation logic in `src/utils/GraduationAllocator.ts`
     - seat ordering in `GraduationSeatSorter.ts`
     - location labeling in `GraduationLocationLabeler.ts`
     - dedicated graduation views and panels
   - This mode has its own data model (`GraduationGuestGroup`) and its own interaction flow, suggesting a bounded feature area inside the app.

9. **Seat coloring, layout rules, and validation**
   - Several utility modules encode domain rules:
     - `ColorUtils` and `SeatColorResolver` determine visual coloring for groups/selections.
     - `LayoutUtils` and `LayoutValidator` ensure venue layouts are consistent and usable.
   - These utilities sit between the raw venue definition and the rendered UI, preventing presentation logic from owning domain rules.

10. **Data flow through the app**
   - A typical interaction flow is:
     - user interacts with a view
     - view emits an event on the EventBus
     - controller updates `AppState` / domain objects
     - utility logic validates or transforms data
     - views re-render based on updated state
   - Import/export and serialization provide another flow: current state → serializer/export controller → JSON file, and reverse on import.

11. **Styling and assets**
   - Styling is split into focused CSS files under `src/styles/` for main app, panels, venue rendering, and legal page.
   - `public/images/` holds static assets used by the site.
   - Because the seating map is SVG-driven, styling is an important part of the functional UI, not just cosmetic layering.

12. **Build, deployment, and quality tooling**
   - Astro handles static generation/building and the local dev server.
   - CI/CD is automated via GitHub Actions in `.github/workflows/deploy.yml`, deploying to **GitHub Pages** on `main`.
   - The repo includes strong test coverage with **Vitest** and mutation testing with **Stryker**, indicating the architecture is designed for logic-heavy, testable boundaries.

13. **How to diagram the repository**
   - A good architecture diagram would show:
     - Astro pages and bootstrap at the top
     - EventBus in the middle as the communication backbone
     - Controllers on one side, Views on the other, Models/Utilities beneath
     - Venue generators feeding the domain model
     - Export/import and graduation allocation as separate functional subsystems
     - CSS/static assets as supporting presentation infrastructure
     - GitHub Actions/GitHub Pages as the deployment boundary

Main entry points: [`src/controllers/AppController.ts`](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/AppController.ts) (AppController), [`src/views/AppView.ts`](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/AppView.ts) (AppView), [`src/utils/VenueDefinitionLoader.ts`](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/utils/VenueDefinitionLoader.ts) (Venue Loader), [`src/models/AppState.ts`](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/AppState.ts) (AppState)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App Shell"]
  node_src_pages_index_astro["App Shell<br/>astro page<br/>[index.astro]"]
  node_src_pages_legal_astro["Legal Page<br/>astro page<br/>[legal.astro]"]
  node_src_main_ts["Bootstrap<br/>client entry<br/>[main.ts]"]
end

subgraph group_core["Core MVC"]
  node_src_events_eventbus_ts(("EventBus<br/>typed bus<br/>[EventBus.ts]"))
  node_src_models_appstate_ts[("AppState<br/>state store<br/>[AppState.ts]")]
  node_src_models_venueserializer_ts["Serializer<br/>state codec<br/>[VenueSerializer.ts]"]
  node_src_controllers_appcontroller_ts["AppController<br/>orchestrator<br/>[AppController.ts]"]
  node_src_controllers_selectioncontroller_ts["Selection<br/>controller"]
  node_src_controllers_groupcontroller_ts["Groups<br/>controller<br/>[GroupController.ts]"]
  node_src_controllers_exportcontroller_ts["Export<br/>controller"]
end

subgraph group_venue["Venue Domain"]
  node_src_utils_venuedefinitionloader_ts["Venue Loader<br/>adapter"]
  node_src_data_ullauditorium_ts["Ull Auditorium<br/>venue spec<br/>[UllAuditorium.ts]"]
  node_src_data_amphitheatergenerator_ts["Amphitheater<br/>layout generator"]
  node_src_data_boxesgenerator_ts["Boxes<br/>layout generator<br/>[BoxesGenerator.ts]"]
  node_src_data_stallsgenerator_ts["Stalls<br/>layout generator<br/>[StallsGenerator.ts]"]
  node_src_models_venue_ts[("Venue<br/>domain model<br/>[Venue.ts]")]
end

subgraph group_grad["Graduation"]
  node_src_controllers_graduationcontroller_ts["Graduation<br/>controller"]
  node_src_utils_graduationallocator_ts["Allocator<br/>allocation engine"]
  node_src_views_graduation_graduationpanelview_ts["Graduation Panel<br/>panel view"]
end

subgraph group_views["Views"]
  node_src_views_appview_ts["AppView<br/>shell view<br/>[AppView.ts]"]
  node_src_views_venue_venueview_ts["Venue Map<br/>svg view<br/>[VenueView.ts]"]
  node_src_views_groups_grouppanelview_ts["Group Panel<br/>panel view<br/>[GroupPanelView.ts]"]
  node_src_views_layout_toolbarview_ts["Toolbar<br/>chrome view<br/>[ToolbarView.ts]"]
  node_src_views_layout_footerview_ts["Footer<br/>chrome view<br/>[FooterView.ts]"]
end

subgraph group_support["Support"]
  node_src_styles_main_css["Main CSS<br/>stylesheet<br/>[main.css]"]
  node_src_styles_venue_css["Venue CSS<br/>stylesheet<br/>[venue.css]"]
  node_src_styles_legal_css["Legal CSS<br/>stylesheet<br/>[legal.css]"]
  node_github_workflows_deploy_yml["Deploy<br/>ci workflow<br/>[deploy.yml]"]
  node_public_images[("Images<br/>static assets")]
end

node_src_pages_index_astro -->|"loads"| node_src_main_ts
node_src_main_ts -->|"starts"| node_src_controllers_appcontroller_ts
node_src_main_ts -->|"mounts"| node_src_views_appview_ts
node_src_main_ts -->|"loads venue"| node_src_utils_venuedefinitionloader_ts
node_src_views_appview_ts -->|"composes"| node_src_views_venue_venueview_ts
node_src_views_appview_ts -->|"composes"| node_src_views_groups_grouppanelview_ts
node_src_views_appview_ts -->|"composes"| node_src_views_graduation_graduationpanelview_ts
node_src_views_appview_ts -->|"composes"| node_src_views_layout_toolbarview_ts
node_src_views_appview_ts -->|"composes"| node_src_views_layout_footerview_ts
node_src_controllers_appcontroller_ts -->|"subscribes"| node_src_events_eventbus_ts
node_src_controllers_appcontroller_ts -->|"mutates"| node_src_models_appstate_ts
node_src_controllers_appcontroller_ts -->|"delegates"| node_src_controllers_selectioncontroller_ts
node_src_controllers_appcontroller_ts -->|"delegates"| node_src_controllers_groupcontroller_ts
node_src_controllers_appcontroller_ts -->|"delegates"| node_src_controllers_graduationcontroller_ts
node_src_controllers_appcontroller_ts -->|"delegates"| node_src_controllers_exportcontroller_ts
node_src_views_venue_venueview_ts -->|"emits"| node_src_events_eventbus_ts
node_src_views_groups_grouppanelview_ts -->|"emits"| node_src_events_eventbus_ts
node_src_views_graduation_graduationpanelview_ts -->|"emits"| node_src_events_eventbus_ts
node_src_views_layout_toolbarview_ts -->|"emits"| node_src_events_eventbus_ts
node_src_controllers_selectioncontroller_ts -->|"updates"| node_src_models_appstate_ts
node_src_controllers_groupcontroller_ts -->|"updates"| node_src_models_appstate_ts
node_src_controllers_graduationcontroller_ts -->|"updates"| node_src_models_appstate_ts
node_src_controllers_exportcontroller_ts -->|"uses"| node_src_models_venueserializer_ts
node_src_models_venueserializer_ts -->|"reads/writes"| node_src_models_appstate_ts
node_src_utils_venuedefinitionloader_ts -->|"loads"| node_src_data_ullauditorium_ts
node_src_utils_venuedefinitionloader_ts -->|"uses"| node_src_data_amphitheatergenerator_ts
node_src_utils_venuedefinitionloader_ts -->|"uses"| node_src_data_boxesgenerator_ts
node_src_utils_venuedefinitionloader_ts -->|"uses"| node_src_data_stallsgenerator_ts
node_src_utils_venuedefinitionloader_ts -->|"builds"| node_src_models_venue_ts
node_src_utils_graduationallocator_ts -->|"reads"| node_src_models_appstate_ts
node_src_controllers_graduationcontroller_ts -->|"invokes"| node_src_utils_graduationallocator_ts
node_src_views_venue_venueview_ts -->|"styled by"| node_src_styles_venue_css
node_src_views_appview_ts -->|"styled by"| node_src_styles_main_css
node_src_pages_legal_astro -->|"uses"| node_src_styles_legal_css
node_src_views_layout_footerview_ts -->|"links"| node_src_pages_legal_astro
node_github_workflows_deploy_yml -->|"builds"| node_src_pages_index_astro
node_github_workflows_deploy_yml -->|"builds"| node_src_pages_legal_astro
node_github_workflows_deploy_yml -->|"publishes"| node_public_images

click node_src_pages_index_astro "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/pages/index.astro"
click node_src_pages_legal_astro "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/pages/legal.astro"
click node_src_main_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/main.ts"
click node_src_events_eventbus_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/events/EventBus.ts"
click node_src_models_appstate_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/AppState.ts"
click node_src_models_venueserializer_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/VenueSerializer.ts"
click node_src_controllers_appcontroller_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/AppController.ts"
click node_src_controllers_selectioncontroller_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/SelectionController.ts"
click node_src_controllers_groupcontroller_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/GroupController.ts"
click node_src_controllers_graduationcontroller_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/GraduationController.ts"
click node_src_controllers_exportcontroller_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/ExportController.ts"
click node_src_utils_venuedefinitionloader_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/utils/VenueDefinitionLoader.ts"
click node_src_data_ullauditorium_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/UllAuditorium.ts"
click node_src_data_amphitheatergenerator_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/AmphitheaterGenerator.ts"
click node_src_data_boxesgenerator_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/BoxesGenerator.ts"
click node_src_data_stallsgenerator_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/StallsGenerator.ts"
click node_src_models_venue_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/Venue.ts"
click node_src_utils_graduationallocator_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/utils/GraduationAllocator.ts"
click node_src_views_appview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/AppView.ts"
click node_src_views_venue_venueview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/venue/VenueView.ts"
click node_src_views_groups_grouppanelview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/groups/GroupPanelView.ts"
click node_src_views_graduation_graduationpanelview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/graduation/GraduationPanelView.ts"
click node_src_views_layout_toolbarview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/layout/ToolbarView.ts"
click node_src_views_layout_footerview_ts "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/layout/FooterView.ts"
click node_src_styles_main_css "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/main.css"
click node_src_styles_venue_css "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/venue.css"
click node_src_styles_legal_css "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/legal.css"
click node_github_workflows_deploy_yml "https://github.com/samuelfriher/ull-auditorium-seating/blob/main/.github/workflows/deploy.yml"
click node_public_images "https://github.com/samuelfriher/ull-auditorium-seating/tree/main/public/images"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_src_pages_index_astro,node_src_pages_legal_astro,node_src_main_ts toneBlue
class node_src_events_eventbus_ts,node_src_models_appstate_ts,node_src_models_venueserializer_ts,node_src_controllers_appcontroller_ts,node_src_controllers_selectioncontroller_ts,node_src_controllers_groupcontroller_ts,node_src_controllers_exportcontroller_ts toneAmber
class node_src_utils_venuedefinitionloader_ts,node_src_data_ullauditorium_ts,node_src_data_amphitheatergenerator_ts,node_src_data_boxesgenerator_ts,node_src_data_stallsgenerator_ts,node_src_models_venue_ts toneMint
class node_src_controllers_graduationcontroller_ts,node_src_utils_graduationallocator_ts,node_src_views_graduation_graduationpanelview_ts toneRose
class node_src_views_appview_ts,node_src_views_venue_venueview_ts,node_src_views_groups_grouppanelview_ts,node_src_views_layout_toolbarview_ts,node_src_views_layout_footerview_ts toneIndigo
class node_src_styles_main_css,node_src_styles_venue_css,node_src_styles_legal_css,node_github_workflows_deploy_yml,node_public_images toneTeal
```

## Components

### App Shell

Astro entry pages and client bootstrap.

- [App Shell](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/pages/index.astro): astro page · Main static entry page that hosts the interactive app. · `src/pages/index.astro`
- [Legal Page](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/pages/legal.astro): astro page · Standalone disclaimer/legal page. · `src/pages/legal.astro`
- [Bootstrap](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/main.ts): client entry · Client-side startup that wires the app together. · `src/main.ts`

### Core MVC

Event bus, controllers, state, and serialization.

- [EventBus](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/events/EventBus.ts): typed bus · Shared event backbone between views and controllers. · `src/events/EventBus.ts`
- [AppState](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/AppState.ts): state store · Central mutable application state container. · `src/models/AppState.ts`
- [Serializer](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/VenueSerializer.ts): state codec · Import/export and portable persistence for seating state. · `src/models/VenueSerializer.ts`
- [AppController](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/AppController.ts): orchestrator · Top-level coordinator for app workflows. · `src/controllers/AppController.ts`
- [Selection](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/SelectionController.ts): controller · Seat selection and drag-selection interactions. · `src/controllers/SelectionController.ts`
- [Groups](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/GroupController.ts): controller · Create, edit, and delete group workflows. · `src/controllers/GroupController.ts`
- [Export](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/ExportController.ts): controller · Import/export workflow for seating state. · `src/controllers/ExportController.ts`

### Venue Domain

Venue model, layout data, and loaders.

- [Venue Loader](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/utils/VenueDefinitionLoader.ts): adapter · Bridges static venue definitions into runtime models. · `src/utils/VenueDefinitionLoader.ts`
- [Ull Auditorium](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/UllAuditorium.ts): venue spec · Base auditorium definition used by the app. · `src/data/UllAuditorium.ts`
- [Amphitheater](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/AmphitheaterGenerator.ts): layout generator · Generates amphitheater seating structure. · `src/data/AmphitheaterGenerator.ts`
- [Boxes](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/BoxesGenerator.ts): layout generator · Generates box seating structure. · `src/data/BoxesGenerator.ts`
- [Stalls](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/data/StallsGenerator.ts): layout generator · Generates stalls seating structure. · `src/data/StallsGenerator.ts`
- [Venue](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/models/Venue.ts): domain model · Core seating layout and structural domain model. · `src/models/Venue.ts`

### Graduation

Specialized graduation/orla allocation workflow.

- [Graduation](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/controllers/GraduationController.ts): controller · Orla/graduation configuration and allocation flow. · `src/controllers/GraduationController.ts`
- [Allocator](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/utils/GraduationAllocator.ts): allocation engine · Assigns graduation guests to seats. · `src/utils/GraduationAllocator.ts`
- [Graduation Panel](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/graduation/GraduationPanelView.ts): panel view · Graduation/orla configuration UI panel. · `src/views/graduation/GraduationPanelView.ts`

### Views

DOM/SVG view layer split by screen area.

- [AppView](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/AppView.ts): shell view · Top-level UI composition and app rendering. · `src/views/AppView.ts`
- [Venue Map](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/venue/VenueView.ts): svg view · Renders the seating map and seat interactions. · `src/views/venue/VenueView.ts`
- [Group Panel](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/groups/GroupPanelView.ts): panel view · Group management UI panel. · `src/views/groups/GroupPanelView.ts`
- [Toolbar](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/layout/ToolbarView.ts): chrome view · Shared toolbar and top-level controls. · `src/views/layout/ToolbarView.ts`
- [Footer](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/views/layout/FooterView.ts): chrome view · Shared footer and legal link area. · `src/views/layout/FooterView.ts`

### Support

Styling, assets, and deployment.

- [Main CSS](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/main.css): stylesheet · Primary app styling. · `src/styles/main.css`
- [Venue CSS](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/venue.css): stylesheet · SVG and seating map styling. · `src/styles/venue.css`
- [Legal CSS](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/src/styles/legal.css): stylesheet · Legal page styling. · `src/styles/legal.css`
- [Deploy](https://github.com/samuelfriher/ull-auditorium-seating/blob/main/.github/workflows/deploy.yml): ci workflow · Build and publish pipeline for GitHub Pages. · `.github/workflows/deploy.yml`
- [Images](https://github.com/samuelfriher/ull-auditorium-seating/tree/main/public/images): static assets · Site images used by the app. · `public/images`

## Connections

- App Shell → Bootstrap: loads · The Astro shell mounts the client app.
- Bootstrap → AppController: starts · Bootstrap creates the application coordinator.
- Bootstrap → AppView: mounts · Bootstrap initializes the root view.
- Bootstrap → Venue Loader: loads venue · Runtime venue data is prepared during startup.
- AppView → Venue Map: composes · Root view includes the seating map.
- AppView → Group Panel: composes · Root view includes group management.
- AppView → Graduation Panel: composes · Root view includes graduation controls.
- AppView → Toolbar: composes · Root view includes shared toolbar chrome.
- AppView → Footer: composes · Root view includes shared footer chrome.
- AppController → EventBus: subscribes · Coordinator listens to app-level events.
- AppController → AppState: mutates · Coordinator owns app state changes.
- AppController → Selection: delegates · Selection behavior is handled by a dedicated controller.
- AppController → Groups: delegates · Group workflows are delegated.
- AppController → Graduation: delegates · Graduation workflows are delegated.
- AppController → Export: delegates · Import/export workflows are delegated.
- Venue Map → EventBus: emits · Seat and section interactions become events.
- Group Panel → EventBus: emits · Group UI actions are published to the bus.
- Graduation Panel → EventBus: emits · Graduation panel actions are published to the bus.
- Toolbar → EventBus: emits · Toolbar actions are published to the bus.
- Selection → AppState: updates · Selection changes are stored in app state.
- Groups → AppState: updates · Group edits update the central state.
- Graduation → AppState: updates · Graduation configuration updates state.
- Export → Serializer: uses · Serialization powers import/export.
- Serializer → AppState: reads/writes · Serializer converts the application state.
- Venue Loader → Ull Auditorium: loads · Loader consumes the base auditorium spec.
- Venue Loader → Amphitheater: uses · Loader consumes amphitheater generation rules.
- Venue Loader → Boxes: uses · Loader consumes box generation rules.
- Venue Loader → Stalls: uses · Loader consumes stalls generation rules.
- Venue Loader → Venue: builds · Definitions are materialized into venue models.
- Allocator → AppState: reads · Allocation uses current app state and seat data.
- Graduation → Allocator: invokes · Controller triggers graduation seat allocation.
- Venue Map → Venue CSS: styled by · SVG seating view depends on venue styling.
- AppView → Main CSS: styled by · Root shell uses primary styling.
- Legal Page → Legal CSS: uses · Legal page uses dedicated styles.
- Footer → Legal Page: links · Footer exposes the legal page.
- Deploy → App Shell: builds · CI builds the static site.
- Deploy → Legal Page: builds · CI builds the legal page.
- Deploy → Images: publishes · Deployment includes static assets.
