Vize

Callout

Headless structured feedback primitive for notes, status messages, and inline alerts.

Package @vizejs/ui/callout
Maturity stable
Own the source vize lib pull callout
Requires id
Aliases callout, banner, inline message, notice, message
Covers WAI-ARIA note role, WAI-ARIA status role, WAI-ARIA alert role, Radix Themes Callout, shadcn/ui Alert, Vuetify Alert

Usage

import { Callout } from "@vizejs/ui/callout";

Or copy the source into your project with vize lib pull callout (see Source Distribution).

API

Callout

Source: src/families/feedback/callout/callout.vue

Props

Prop Type Default Description
as PrimitiveAs "section" Native element, custom element, or component to render.
id string undefined Consumer-owned root id for anchors or application state.
role CalloutRole "note" Accessibility role. note is static, status is polite, and alert is assertive.
open boolean true Whether the Callout is visible.
atomic boolean true Whether assistive technology should present the whole live region on updates.
tone CalloutTone "neutral" Styling tone mirrored to data-tone; no CSS is emitted.
density CalloutDensity "comfortable" Spacing density mirrored to data-density; no CSS is emitted.
iconAriaHidden boolean true Whether the optional icon wrapper is hidden from assistive technology.
ariaHidden boolean undefined Hide the entire Callout from assistive technology.
ariaLabel string undefined Accessible name when no visible title or aria-labelledby supplies one.
ariaLabelledby string generated from the title slot when present Space-separated ids that label the Callout.
ariaDescribedby string generated from the description slot when present Space-separated ids that describe the Callout.
titleId string generated when the title slot is present Consumer-owned id for the title slot wrapper.
descriptionId string generated when the description slot is present Consumer-owned id for the description slot wrapper.

Slots

Slot Slot props Description
default CalloutSlotState Renders the main Callout body.
icon CalloutSlotState Renders an optional consumer-owned icon.
title CalloutSlotState Renders an optional accessible title.
description CalloutSlotState Renders an optional accessible description.
actions CalloutSlotState Renders optional interactive or navigational actions.

Exposed

Member Type Description
open boolean Whether the Callout is visible.
state CalloutState Visibility state mirrored to data-state.
role CalloutRole Requested accessibility role.
ariaState CalloutAriaState Resolved accessibility state after ariaHidden is applied.
live CalloutLive | undefined Derived live-region politeness, when role is alert or status.
atomic boolean Whether assistive technology should present the whole live region on updates.
tone CalloutTone Consumer styling tone mirrored to data-tone.
density CalloutDensity Consumer spacing density mirrored to data-density.
titleId string | undefined Resolved id for the title wrapper.
descriptionId string | undefined Resolved id for the description wrapper.
ariaLabelledby string | undefined Resolved aria-labelledby value for the root.
ariaDescribedby string | undefined Resolved aria-describedby value for the root.
hasIcon boolean Whether the icon slot is rendered.
hasTitle boolean Whether the title slot is rendered.
hasDescription boolean Whether the description slot is rendered.
hasActions boolean Whether the actions slot is rendered.
element CalloutElement | null Rendered host element or component instance.

Behavior

Normative state x input -> outcome table for callout.vue (@vizejs/ui/callout). Every row is proven by the named mounted-DOM, SSR/hydration, renderer, or compile-only type test. A row without a passing test is a contract violation.

# State Input Outcome Proven by
C1 default note render / Tab renders a headless <section role="note"> with root/content parts, strict hooks, and no root focus renders a labelled static note with structured parts by default
C2 titled note title/description generates SSR-stable title and description ids and wires them through ARIA unless consumers override renders a labelled static note with structured parts by default
C3 status render / actions exposes polite live-region semantics, optional atomic policy, trimmed direct naming, and tabbable actions supports polite status semantics with direct naming and interactive actions
C4 alert labelledby exposes assertive alert semantics while preserving normalized consumer-owned label and description ids supports assertive alerts with consumer-owned title and description ids
C5 closed/hidden open/hidden remains mounted, mirrors data-state="closed", suppresses ARIA when closed or decorative, and avoids focus closed and decorative callouts stay mounted without announcing
C6 reactive prop update updates data attributes, slot state, and exposed hooks without replacing the host passes slot state and exposes live Callout hooks
C7 SSR note isolated requests renders byte-identical structured note markup with no class, style, tab, handler, or live leak renders byte-identical labelled note markup across isolated SSR requests
C8 hydration server markup hydrates generated title/description references in place with no diagnostics hydrates generated title and description references without replacing the root
C9 SSR alert render renders assertive server markup only when alert semantics are requested renders assertive server markup when alert semantics are requested
C10 public types invalid contract TypeScript rejects unsupported roles, tones, densities, booleans, and malformed slot state src/families/feedback/callout/callout.types.test-d.ts

Props

Prop Type Purpose Default
as PrimitiveAs Native element, custom element, or component rendered as host. "section"
id string Consumer-owned root id for anchors or application state. undefined
role "note" | "status" | "alert" Static note, polite status, or assertive alert semantics. "note"
open boolean Whether the Callout is visible. true
atomic boolean Whether live-region updates should be atomic for status and alert. true
tone "accent" | "danger" | "info" | "neutral" | "success" | "warning" Consumer styling tone mirrored to data-tone. "neutral"
density "compact" | "comfortable" Consumer density mirrored to data-density. "comfortable"
iconAriaHidden boolean Whether the icon wrapper is decorative. true
ariaHidden boolean Forces decorative semantics for the entire Callout. undefined
ariaLabel string Trimmed accessible name when no visible title or aria-labelledby supplies one. undefined
ariaLabelledby string Space-separated ids that label the Callout after whitespace normalization. title slot id
ariaDescribedby string Space-separated ids that describe the Callout after whitespace normalization. description id
titleId string Consumer-owned id for the title slot wrapper. generated
descriptionId string Consumer-owned id for the description slot wrapper. generated

Slots

Slot Props Purpose Default
default CalloutSlotState Render the main message body. none
icon CalloutSlotState Render an optional consumer-owned icon. none
title CalloutSlotState Render the accessible title. none
description CalloutSlotState Render the accessible description. none
actions CalloutSlotState Render optional controls, links, or retry UI. none

Expose

Name Type Purpose Default
element CalloutElement | null Rendered host element or component instance. null
open boolean Visibility boolean. true
state "open" | "closed" Visibility state token. "open"
role CalloutRole Requested accessibility role. "note"
ariaState CalloutAriaState Resolved accessibility policy; closed content is decorative. "note"
live CalloutLive | undefined Live-region politeness. undefined
atomic boolean Live-region atomicity. true
tone CalloutTone Consumer styling tone token. "neutral"
density CalloutDensity Consumer density token. "comfortable"
titleId string | undefined Resolved title wrapper id. undefined
descriptionId string | undefined Resolved description wrapper id. undefined
ariaLabelledby string | undefined Resolved root label ids. undefined
ariaDescribedby string | undefined Resolved root description ids. undefined
hasIcon boolean Whether the icon slot is present. false
hasTitle boolean Whether the title slot is present. false
hasDescription boolean Whether the description slot is present. false
hasActions boolean Whether the actions slot is present. false

Data Attributes

Attribute Values Purpose Default
data-vize-ui "callout" Stable family selector. always
data-state "open", "closed" Visibility state. "open"
data-tone "accent", "danger", "info", "neutral", "success", "warning" Consumer tone styling hook. "neutral"
data-density "compact", "comfortable" Consumer density hook. "comfortable"
data-aria-state "decorative", "note", "status", "alert" Accessibility policy hook. "note"
data-live "off", "polite", "assertive" Live-region policy hook. "off"
data-has-icon "true", "false" Icon slot presence hook. "false"
data-has-title "true", "false" Title slot presence hook. "false"
data-has-description "true", "false" Description slot presence hook. "false"
data-has-actions "true", "false" Actions slot presence hook. "false"

ARIA Attributes

Attribute Values Purpose Default
role "note", "status", "alert" Defines static or live feedback semantics. "note"
hidden true Keeps closed Callouts mounted but hidden. undefined
aria-hidden "true" Hides closed or decorative Callouts from assistive technology. undefined
aria-label string Optional direct accessible name. undefined
aria-labelledby string External or title-slot accessible name. generated title id
aria-describedby string External or description-slot accessible description. generated description id
aria-live "polite" or "assertive" Status or alert live-region politeness. undefined
aria-atomic "true" or "false" Live-region atomicity. undefined for "note"

CSS Custom Properties

Callout defines no CSS custom properties and ships no stylesheet. Consumers own layout, icon spacing, typography, action placement, color, forced-colors treatment, and responsive composition through ordinary CSS.

Parts

Part Element Purpose
root host Style the rendered Callout host.
icon span Style optional icon chrome.
content div Style title, description, body, and actions as one region.
title div Style the title slot wrapper.
description div Style the description slot wrapper.
actions div Style optional action controls.