Skip to content

Styling ​

Set CSS variables on the host element. The panel lives in a shadow root, so nothing else reaches it.

app.css
action-wire {
  --aw-color-accent: #7c3aed;
  --aw-panel-width: 380px;
  --aw-panel-max-height: 640px;
  --aw-radius: 12px;
}

Variables ​

Colour ​

VariablePurpose
--aw-color-accentLauncher fill, send button, focus ring.
--aw-color-accent-strongEnd of the launcher gradient. Hover fill.
--aw-color-accent-textText drawn on the accent colour.
--aw-color-surfacePanel background.
--aw-color-raisedAssistant bubble, composer field, code background.
--aw-color-textPrimary text.
--aw-color-mutedSecondary text, tool card labels.
--aw-color-borderPanel border and dividers.
--aw-color-userBackground of the person's message bubble.
--aw-color-successTool card icon after a tool succeeds.
--aw-color-dangerTool card error icon. Destructive confirm button.
--aw-color-warningConfirmation background.
--aw-color-warning-borderConfirmation border.
--aw-color-warning-textConfirmation warning line.

Type, shape, and size ​

VariablePurpose
--aw-fontFont stack for the whole panel.
--aw-font-monoTool names, code spans, and code blocks.
--aw-radiusCorner radius of the panel and cards.
--aw-radius-bubbleCorner radius of a message bubble.
--aw-radius-fullCorner radius of round controls.
--aw-shadowPanel shadow.
--aw-spaceBase spacing step.
--aw-panel-widthPanel width on a desktop screen.
--aw-panel-max-heightMaximum panel height.
--aw-launcher-sizeDiameter of the closed launcher button.
--aw-avatar-sizeDiameter of the assistant avatar.

The definitions live in packages/actionwire/src/widget/styles.ts.

Layout rules you do not control ​

At 640px and below the panel becomes a bottom sheet with safe-area padding, so the composer stays above a virtual keyboard. The timeline scrolls; the page behind it does not.

The panel is a modal dialog. It traps Tab, closes on Escape, and returns focus to the launcher. Status changes are announced through a live region. These behaviours are not configurable, because turning any of them off breaks keyboard and screen-reader use.

TIP

The widget respects prefers-reduced-motion. Do not add your own transitions to the host element without the same guard.

Developer mode ​

ts
createAssistant({ model, developerMode: true }).mount();

Tool cards then show the raw JSON arguments and results instead of a text summary. Use it while you write tool descriptions. Leave it off in production: raw arguments can contain data a person should not see in a chat panel.

Released under the MIT License.