The Elefant demo is a calm replica of practice software ("Elefant-Demo (Nachbau)"), never the real product and never its logo. Every row comes from the elefant_* tables of the practice workspace through the elefant.* procedures; patients are pseudonyms (P-0142 · K. M.) without health data.
Pages
| Route | What it shows |
|---|---|
/praxis | Today's sessions, the next free slot, contingent warnings, the billing status and recent assistant actions with links into the calendar (?lauf=) or billing. |
/praxis/kalender | ?woche&ansicht=woche|tag&tag&lauf. A week grid Mo–Fr 08–19 on wide containers (one column per day, split by room: colour bar plus the room name), a day strip and day list on phones. Each appointment is a link with its full accessible name; the week is also available as a list. Appointments moved by run lauf are outlined and say "verschoben von Di., 09:00". |
/praxis/patienten | ?q&filter. Search plus the filters "Kontingent knapp" and "Genehmigung offen"; each card shows code, initials, insurance, procedure, therapist and a contingent bar with the value as text. |
/praxis/abrechnung | ?quartal. Services by demo GOP with the total in euro, plausibility checks (severity icon, text and patient code) and billing runs. Submission to the KV stays disabled. |
/praxis/assistent | The assistant full screen: the phone experience and the screenshot source. |
The calendar decides between grid and list with a container query, not the viewport, because the docked assistant takes 400 px of a 1440 px screen.
The assistant
On screens of at least 1024 px the assistant ("Elefant mit Agent bedienen") is docked as a 400 px panel on every praxis page. Below that a floating "Assistent" button opens /praxis/assistent, which has a glass header, a sticky composer above the glass bottom tab bar and safe-area padding.
A command runs through the same harness as a support ticket: useStartRun({ commandText, engine }), then useRunDetail polls the trace while it runs, and useDecideAction approves or rejects the proposed write. The panel shows, in order:
- The command as a chat turn and the engine badge ("KI · OpenAI gpt-6-luna" or "Regelbasiert (Demo-Fallback)", with the fallback reason as text).
- The interpreted intent in plain German, built on the client from the run's intent and preview, so both engines read the same: "Ich verschiebe 7 Termine von Di., 20.10. auf Mi., 21.10."
- The tools used as compact chips, with the full trace behind "Details".
- The preview card: before → after per appointment with conflicts and their alternative slot as text, billing totals and checks, or the ticket text with the context that is sent (version and error codes, no patient data).
- "Bestätigen" / "Abbrechen". After the decision, focus moves to the result message, which links to the calendar with
?lauf=<runId>or to billing; a support handoff shows the created ticket number.
An engine switch ("Automatisch" / "Nur Regeln") chooses the engine for the next command. A command that is still awaiting a decision becomes the current run again when the assistant remounts (for example when you switch from the panel to the full screen). Progress and outcomes are announced in one polite live region; motion respects prefers-reduced-motion and glass falls back to a solid surface.
Files
Everything lives in apps/web/src/features/elefant/: pages (elefant.<page>.page.tsx), the calendar parts (week-grid, day-strip, appointment-list), the assistant (assistant-panel, assistant-run, preview-card, assistant-composer) and its hook elefant.assistant.hooks.ts. Copy lives in apps/web/src/locales/elefant.{en,de,fr}.ts. See also the in-app assistant of the template, which this demo does not use.