# XWUICampaignWorkbench

A campaign list (composing `XWUITable`) with a detail panel for the selected
campaign: status, budget spend against a track, leads/conversions stat tiles,
channel-spend breakdown (composing `XWUIChartDonut`) and a status-aware
actions row (composing `XWUIQuickActions`: Pause/Resume, Duplicate, Archive).

This is the first real component in `industry/marketing/` - the domain used to
be roadmap-only; `XWUISuperMarketing`'s menu already reserves the
`marketing-campaigns` leaf this workbench fills.

## Loading / error / empty

`data.loading` and `data.error` are host-set flags, not state this component
derives from a fetch of its own - it never calls a network API. A host doing
its own async load flips these the way it would any other field; there is no
async-ready gate to wire up.

- `loading: true` renders a busy placeholder.
- `error: '...'` renders the message with `role="alert"`.
- `campaigns: []` (and neither of the above) renders the empty-state copy
  (`config.emptyLabel`, default `"No campaigns"`).

## Actions

Clicking a campaign name in the list selects it (`data.onSelectCampaign`, the
`onSelectCampaign()` subscriber API, and a bubbling
`xwui-campaign-workbench:select-campaign` event). The detail panel's quick
actions report intent the same way `XWUIDealPipelineBoard.onMoveDeal` does -
via `data.onAction`, `onCampaignAction()`, and a bubbling
`xwui-campaign-workbench:action` event - the host owns the actual mutation.

## RTL

`config.direction: 'rtl'` sets `dir="rtl"` on the root and mirrors the
list/detail column order.

## Basic Usage

Four campaigns spanning active/scheduled/paused/completed, each with a
channel-spend split.

```api
```
