# `MishkaCmsCore.Builder.Actions.Say`
[🔗](https://github.com/mishka-group/mishka_cms_core/blob/v0.0.1/lib/mishka_cms_core/builder/actions/say.ex#L5)

Show a message — core's one server action, and the shape a package's should copy.

## Why this one is not a `JS` command

The other six move classes and visibility around, which the browser can do on its own. A message
cannot be one of them: a flash lives on the socket, `put_flash/3` writes it, the layout or the page
renders it and `lv:clear-flash` dismisses it. There is no client-side way to add one, and inventing
a second notification system beside the framework's would mean styling it twice and dismissing it
twice.

So it takes the ordinary route a developer would have written by hand — `JS.push/2` out,
`handle_event/3` and `put_flash/3` back — and the words arrive in whatever flash component that
site designed. `MishkaCmsCore.Runtime.Compilers.LiveViewCompiler` gives a page that carries the
push the matching clause.

## The handler is runtime code, deliberately

`handler/1` names `MishkaCmsCore.Runtime.PageMessage`, not this module. What it names is compiled
into every published page that uses the action, and a visitor's page has no business naming
anything under `MishkaCmsCore.Builder.*`. A package's server action should point at its own runtime
module for the same reason.

# `descriptor`

```elixir
@spec descriptor() :: map()
```

The descriptor this module answers for.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
