# XWUIActivityLogPanel

A cross-entity CRM activity feed: everything logged against any contact,
company or deal in one chronological list, with a row of type-filter tabs
above it. Each entry carries a `title`, an optional `description`, a display
`date` (a string the panel shows as given - it does not parse or re-sort by
it, the host already supplies the order it wants) and an optional `relatedTo`
name, which is what keeps a mixed feed readable.

The activity types are `call`, `email`, `note`, `task`, `meeting` and `log` -
the same ids as `XWUIQuickActions.DEFAULT_CRM_ACTIONS`, so an activity logged
from a quick action in `XWUIContactWorkbench` or `XWUICompanyWorkbench` shows
up here with no type remapping. The filter strip lists only the types actually
present in `data.activities`, so a feed of nothing but notes does not offer
five dead tabs. The active filter lives in ephemeral UI state (`ui.typeFilter`,
`null` for "all"), never in schema-backed data - the same convention
`XWUIDealWorkbench` uses for its `stageFilter`.

Two empty states, because they mean different things: `config.emptyLabel` when
there is no activity at all, and `config.emptyFilteredLabel` when a filter is
active and matches nothing - the second tells the reader to clear the filter
rather than that the record is blank.

The feed itself is a nested `basic/XWUITimeline`, a real XWUIComponent rather
than markup this projector could describe; the view reserves a host div with a
`ref` and the adapter builds and destroys the timeline from `onCommit`. The
filter tabs are plain markup: there is no tab-strip primitive worth composing
for a row of buttons, the same judgement `XWUIDealPipelineBoard`'s column
headers already made.

## Basic Usage

A feed mixing all six activity types across several `relatedTo` entities, so
every filter tab is present and the cross-entity subtitle is visible.

```api
```
