@equal-experts/kuat-react 0.15.0-beta.0 → 0.15.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,4 +7,4 @@ Rules for this install live under `agent-docs/` in `@equal-experts/kuat-core`, `
7
7
  3. Load component guides via `agent-docs/components/components.manifest.json`.
8
8
  4. Skills: `kuat-review`, `kuat-create` from [kuat-agent-docs](https://github.com/equalexperts/kuat-agent-docs).
9
9
 
10
- **Version:** 0.15.0-beta.0 · **Rules snapshot:** 24ebd2dee5cc
10
+ **Version:** 0.15.0-beta.1 · **Rules snapshot:** 038a985b57fe
@@ -14,4 +14,4 @@ Curated agent docs bundled with `@equal-experts/kuat-core`, `@equal-experts/kuat
14
14
  node scripts/agent-docs/bundle-for-core.mjs
15
15
  ```
16
16
 
17
- Built against upstream ref: `24ebd2dee5cc`
17
+ Built against upstream ref: `038a985b57fe`
@@ -0,0 +1,66 @@
1
+ # Callout (`kuat:callout`)
2
+
3
+ ## Overview
4
+
5
+ Inline banner for surfacing a status message tied to a section of content: info, positive, warning, or issue. Supports a required title, an optional description, a per-type icon (shown by default, can be hidden), and an optional link-style action. Exported from `@equal-experts/kuat-react` / `@equal-experts/kuat-vue`.
6
+
7
+ ## When to use
8
+
9
+ - Persistent, in-page status messages tied to a section of content (e.g. explaining what a view shows, or that a save failed)
10
+ - Confirmations, warnings, or errors that should stay visible until the user navigates away or dismisses them via the action link
11
+
12
+ ## When not to use
13
+
14
+ - Transient, self-dismissing notifications — use `Sonner`
15
+ - Form field-level validation — use `Field`'s error slot
16
+ - A single inline icon+label with no message — use `Badge`
17
+
18
+ ## Variants
19
+
20
+ Four semantic `type` values, each with its own background tint and left border/icon accent:
21
+
22
+ - `info` (default) — ee-blue tint, `Info` icon
23
+ - `positive` — uptime-green tint, `CheckCircle2` icon
24
+ - `warning` — equal-ember tint, `AlertTriangle` icon
25
+ - `issue` — runtime-red tint, `XCircle` icon
26
+
27
+ ## States
28
+
29
+ - **Icon shown / hidden** — `icon` prop, default `true`. The icon glyph is chosen automatically from `type`; consumers cannot swap it independently.
30
+ - **With / without description** — omit `description` to render title only.
31
+ - **With / without action** — omit `action` to render no link. Only a link-style action ships in this release; additional action kinds (e.g. a button) may be added in future without changing the `title`/`description`/`icon` API.
32
+
33
+ ## Content guidance
34
+
35
+ - Title should be a short, complete statement of the status — it's the only text guaranteed to be read, since colour is never the sole signal (icon shape + title wording both carry the meaning, independent of the accent colour).
36
+ - Description is for supporting detail, not another restatement of the title.
37
+ - Action label should describe the action's effect (e.g. "Close message"), not just "Click here".
38
+
39
+ ## Behaviour
40
+
41
+ - Root element renders `role="status"` (polite live region) — appropriate for a persistent banner already present in the page, as opposed to a toast that should interrupt.
42
+ - The action renders as a real `<a href>` (with optional `target` and `onClick`), not a button — it's always a navigation/link affordance in this release.
43
+
44
+ ## Accessibility
45
+
46
+ - Status is never conveyed by colour alone: the icon shape (circle-i / check / triangle / x) and the title wording both signal the type independent of colour (WCAG 1.4.1).
47
+ - The icon and title text share the same neutral `--foreground` token — only the left border stripe and background use the per-type accent colour, so the icon remains legible regardless of type.
48
+ - All four `background`/`foreground` token pairs (`--callout-info`, `--callout-positive`, `--callout-warning`, `--callout-issue`, each with a `-foreground` counterpart) are covered by `pnpm tokens:contrast-check` in both light and dark mode.
49
+ - Icon is `aria-hidden="true"` — it's decorative reinforcement of the title text, not a separate accessible element.
50
+
51
+ ## API
52
+
53
+ Import from `@equal-experts/kuat-react` (subpath: `@equal-experts/kuat-react/callout`) or `@equal-experts/kuat-vue` (subpath: `@equal-experts/kuat-vue/callout`).
54
+
55
+ - `type?: "info" | "positive" | "warning" | "issue"` — default `"info"`
56
+ - `title` — required
57
+ - `description?` — optional
58
+ - `icon?: boolean` — default `true`
59
+ - `action?: { label: string; href: string; target?: string; onClick?: (event) => void }` — optional
60
+
61
+ See Storybook (`Feedback/Callout`) for live examples of every type and combination.
62
+
63
+ ## Related components
64
+
65
+ - `shadcn:sonner` (Kuat `Sonner`) — transient, self-dismissing toast notifications
66
+ - `kuat:field` — inline form-field validation messages
@@ -18,6 +18,12 @@
18
18
  "displayName": "KuatHeader",
19
19
  "path": "components/kuat-header.md",
20
20
  "sources": ["@equal-experts/kuat-react", "@equal-experts/kuat-vue"]
21
+ },
22
+ "kuat:callout": {
23
+ "slug": "callout",
24
+ "displayName": "Callout",
25
+ "path": "components/callout.md",
26
+ "sources": ["@equal-experts/kuat-react", "@equal-experts/kuat-vue"]
21
27
  }
22
28
  }
23
29
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "packageVersion": "0.15.0-beta.0",
2
+ "packageVersion": "0.15.0-beta.1",
3
3
  "rules": {
4
- "snapshotRef": "24ebd2dee5cc5153859fd56beb166826f4d98e3a",
5
- "snapshotDate": "2026-07-06T10:02:11.557Z",
4
+ "snapshotRef": "038a985b57fe567a24d3a663277f4594d75b9a87",
5
+ "snapshotDate": "2026-07-06T14:20:52.535Z",
6
6
  "sourceRepo": "equalexperts/kuat-agent-docs",
7
7
  "loadingPath": "agent-docs/rules/LOADING-consumer.md"
8
8
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Package:** @equal-experts/kuat-core (and mirrored in kuat-react / kuat-vue agent-docs)
4
4
 
5
- **Snapshot:** 24ebd2dee5cc
5
+ **Snapshot:** 038a985b57fe
6
6
 
7
7
  ## Default load (web product / marketing UI)
8
8
 
@@ -0,0 +1,46 @@
1
+ import { jsxs as c, jsx as t } from "react/jsx-runtime";
2
+ import * as d from "react";
3
+ import { XCircle as m, AlertTriangle as _, CheckCircle2 as f, Info as C } from "lucide-react";
4
+ import { c as h } from "./utils-DLUjLwnh.js";
5
+ const T = ["info", "positive", "warning", "issue"], p = {
6
+ info: C,
7
+ positive: f,
8
+ warning: _,
9
+ issue: m
10
+ }, N = d.forwardRef(function({ className: e, type: a = "info", title: s, description: o, icon: n = !0, action: l, ...i }, r) {
11
+ const u = p[a];
12
+ return /* @__PURE__ */ c(
13
+ "div",
14
+ {
15
+ ref: r,
16
+ role: "status",
17
+ "data-slot": "callout",
18
+ "data-type": a,
19
+ className: h("callout", `callout--${a}`, e),
20
+ ...i,
21
+ children: [
22
+ n ? /* @__PURE__ */ t(u, { "aria-hidden": "true", className: "callout__icon", "data-slot": "callout-icon" }) : null,
23
+ /* @__PURE__ */ t("div", { className: "callout__content", "data-slot": "callout-content", children: /* @__PURE__ */ c("div", { className: "callout__text-content", children: [
24
+ /* @__PURE__ */ t("p", { className: "callout__title", "data-slot": "callout-title", children: s }),
25
+ o != null ? /* @__PURE__ */ t("p", { className: "callout__description", "data-slot": "callout-description", children: o }) : null,
26
+ l ? /* @__PURE__ */ t(
27
+ "a",
28
+ {
29
+ className: "callout__action",
30
+ "data-slot": "callout-action",
31
+ href: l.href,
32
+ target: l.target,
33
+ onClick: l.onClick,
34
+ children: l.label
35
+ }
36
+ ) : null
37
+ ] }) })
38
+ ]
39
+ }
40
+ );
41
+ });
42
+ N.displayName = "Callout";
43
+ export {
44
+ N as C,
45
+ T as a
46
+ };
@@ -0,0 +1,3 @@
1
+ export { cn } from './lib/utils';
2
+ export { Callout, CALLOUT_TYPES } from './components/ui/callout';
3
+ export type { CalloutProps, CalloutType, CalloutAction } from './components/ui/callout';
@@ -0,0 +1,7 @@
1
+ import { c as r } from "./utils-DLUjLwnh.js";
2
+ import { a as t, C } from "./callout-DFmAtUwR.js";
3
+ export {
4
+ t as CALLOUT_TYPES,
5
+ C as Callout,
6
+ r as cn
7
+ };
@@ -0,0 +1,19 @@
1
+ import { KuatSlotContent } from '../../../lib/react-node-compat';
2
+ import * as React from "react";
3
+ export declare const CALLOUT_TYPES: readonly ["info", "positive", "warning", "issue"];
4
+ export type CalloutType = (typeof CALLOUT_TYPES)[number];
5
+ export interface CalloutAction {
6
+ label: string;
7
+ href: string;
8
+ target?: React.HTMLAttributeAnchorTarget;
9
+ onClick?: React.MouseEventHandler<HTMLAnchorElement>;
10
+ }
11
+ export interface CalloutProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
12
+ type?: CalloutType;
13
+ title: KuatSlotContent;
14
+ description?: KuatSlotContent;
15
+ icon?: boolean;
16
+ action?: CalloutAction;
17
+ }
18
+ declare const Callout: React.ForwardRefExoticComponent<CalloutProps & React.RefAttributes<HTMLDivElement>>;
19
+ export { Callout };
@@ -0,0 +1,2 @@
1
+ export { Callout, CALLOUT_TYPES } from './callout';
2
+ export type { CalloutProps, CalloutType, CalloutAction } from './callout';
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants
4
4
  export type { ButtonGroupProps, ButtonGroupTextProps, ButtonGroupSeparatorProps, ButtonGroupOrientation, } from './components/ui/button-group';
5
5
  export { ContentCard } from './components/ui/content-card';
6
6
  export type { ContentCardProps } from './components/ui/content-card';
7
+ export { Callout, CALLOUT_TYPES } from './components/ui/callout';
8
+ export type { CalloutProps, CalloutType, CalloutAction, } from './components/ui/callout';
7
9
  export { KuatHeader, kuatHeaderVariants, EELogo, KUAT_HEADER_LOCKUP_VARIANTS, KUAT_HEADER_APP_SWITCHER_EMPTY, } from './components/ui/kuat-header';
8
10
  export type { KuatHeaderProps, EELogoProps, KuatHeaderVariant, KuatHeaderLockupVariant, KuatHeaderSubItem, KuatHeaderNavItem, KuatHeaderAccountItem, KuatHeaderAccountConfig, KuatHeaderAccountLabels, KuatHeaderAccountMobileTier, KuatHeaderActionItem, KuatHeaderApp, KuatHeaderAppSwitcherConfig, KuatHeaderAppSwitcherEmpty, KuatHeaderAppSwitcherLabels, KuatHeaderLockupConfig, } from './components/ui/kuat-header';
9
11
  export { shouldShowAppSwitcher, resolveAppSwitcherLabels, resolveHeaderLockup, } from './components/ui/kuat-header';