@hjmds/react 1.31.0 → 1.32.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.
Files changed (45) hide show
  1. package/dist/bottom-cta.d.ts +6 -1
  2. package/dist/bottom-cta.d.ts.map +1 -1
  3. package/dist/bottom-cta.js +1 -1
  4. package/dist/bottom-cta.js.map +1 -1
  5. package/dist/bottom-navigation.d.ts +4 -1
  6. package/dist/bottom-navigation.d.ts.map +1 -1
  7. package/dist/bottom-navigation.js +18 -2
  8. package/dist/bottom-navigation.js.map +1 -1
  9. package/dist/evidence.d.ts +1 -1
  10. package/dist/evidence.js +1 -1
  11. package/dist/evidence.js.map +1 -1
  12. package/dist/image-choice.d.ts +15 -2
  13. package/dist/image-choice.d.ts.map +1 -1
  14. package/dist/image-choice.js +59 -7
  15. package/dist/image-choice.js.map +1 -1
  16. package/dist/internal/media-album.d.ts +22 -1
  17. package/dist/internal/media-album.d.ts.map +1 -1
  18. package/dist/internal/media-album.js +28 -7
  19. package/dist/internal/media-album.js.map +1 -1
  20. package/dist/internal/message-reactions.d.ts +11 -0
  21. package/dist/internal/message-reactions.d.ts.map +1 -1
  22. package/dist/internal/message-reactions.js +10 -1
  23. package/dist/internal/message-reactions.js.map +1 -1
  24. package/dist/pagination.d.ts +13 -11
  25. package/dist/pagination.d.ts.map +1 -1
  26. package/dist/pagination.js +12 -5
  27. package/dist/pagination.js.map +1 -1
  28. package/dist/public-exports.generated.d.ts +1 -0
  29. package/dist/public-exports.generated.d.ts.map +1 -1
  30. package/dist/public-exports.generated.js +3 -0
  31. package/dist/public-exports.generated.js.map +1 -1
  32. package/dist/screen-flows.d.ts +18 -6
  33. package/dist/screen-flows.d.ts.map +1 -1
  34. package/dist/screen-flows.js +13 -10
  35. package/dist/screen-flows.js.map +1 -1
  36. package/dist/screens.d.ts +12 -4
  37. package/dist/screens.d.ts.map +1 -1
  38. package/dist/screens.js +23 -3
  39. package/dist/screens.js.map +1 -1
  40. package/dist/styles.css +47 -7
  41. package/dist/styles.layered.css +47 -7
  42. package/dist/toast.d.ts.map +1 -1
  43. package/dist/toast.js +1 -1
  44. package/dist/toast.js.map +1 -1
  45. package/package.json +3 -3
@@ -14,7 +14,10 @@ type MediaAlbumBase = Readonly<{
14
14
  nextLabel: string;
15
15
  /** Page frame width / height. Defaults to `mediaAlbumRecipe.defaultAspectRatio` (square). */
16
16
  aspectRatio?: number;
17
- /** Opens the shown page (viewer); without it the page is a static image. */
17
+ /**
18
+ * Opens the shown page (viewer); without it the page is a static image. While the page renders a
19
+ * `MediaAlbumPageStatus` it is not an image yet, so it does not open.
20
+ */
18
21
  onPress?(index: number): void;
19
22
  }>;
20
23
  /**
@@ -36,6 +39,24 @@ export type MediaAlbum = MediaAlbumBase & (Readonly<{
36
39
  * the same page. Called unconditionally; `album` may be absent.
37
40
  */
38
41
  export declare function useMediaAlbumIndex(album: MediaAlbum | undefined): readonly [number, (index: number) => void];
42
+ export type MediaAlbumPageStatusProps = Readonly<{
43
+ kind: "loading"; /** Localized name of what is loading, e.g. "Loading photo". */
44
+ label: string;
45
+ }> | Readonly<{
46
+ kind: "error"; /** Localized failure text, shown and announced. */
47
+ label: string;
48
+ /** Retry button; label and action come from the product. */ retry?: Readonly<{
49
+ label: string;
50
+ onPress(): void;
51
+ }>;
52
+ }>;
53
+ /**
54
+ * Loading or failed page of a `mediaAlbum` (2026-10-18 Utilverse). Return it from `renderPage` (or the component it
55
+ * renders) while the photo is not available. While it is shown the frame drops its image name and open action, so
56
+ * the spinner's name, the failure text and the retry button are reachable by screen readers and pointer instead of
57
+ * being swallowed by one accessible image. Centered in the frame (VQ-09).
58
+ */
59
+ export declare function MediaAlbumPageStatus(props: MediaAlbumPageStatusProps): import("react").JSX.Element;
39
60
  export declare function MediaAlbumView({ album, index, onIndexChange, width, radius, className }: Readonly<{
40
61
  album: MediaAlbum;
41
62
  index: number;
@@ -1 +1 @@
1
- {"version":3,"file":"media-album.d.ts","sourceRoot":"","sources":["../../src/internal/media-album.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMrE,KAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,gEAAgE;IAChE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,CACtC,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACrF,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAC1F,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAS5G;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC;IACjG,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,+GAA+G;IAC/G,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnD,CAAC,+BAgBD"}
1
+ {"version":3,"file":"media-album.d.ts","sourceRoot":"","sources":["../../src/internal/media-album.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4E,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOjH,KAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,gEAAgE;IAChE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,CACtC,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACrF,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAC1F,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAS5G;AAKD,MAAM,MAAM,yBAAyB,GACjC,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC,CAAC,+DAA+D;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5G,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC,CAAC,mDAAmD;IAAC,KAAK,EAAE,MAAM,CAAC;IAC1F,4DAA4D,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,IAAI,IAAI,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAE3H;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,+BAYpE;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC;IACjG,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,+GAA+G;IAC/G,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnD,CAAC,+BAuBD"}
@@ -1,9 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from "react";
3
- import { mediaAlbumRecipe, resolveMediaAlbumIndex, validateMediaAlbum } from "@hjmds/design-contracts/screen-patterns";
4
- import { IconButton } from "../actions.js";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useLayoutEffect, useState } from "react";
3
+ import { mediaAlbumRecipe, resolveMediaAlbumIndex, validateMediaAlbum, validateMediaAlbumPageStatus } from "@hjmds/design-contracts/screen-patterns";
4
+ import { Button, IconButton } from "../actions.js";
5
5
  import { Text } from "../layout.js";
6
6
  import { Icon } from "../supplemental-display.js";
7
+ import { Spinner } from "./spinner.js";
7
8
  /**
8
9
  * Hosts keep the page state so every copy of the album they render (the message and its hold-menu preview) shows
9
10
  * the same page. Called unconditionally; `album` may be absent.
@@ -19,13 +20,33 @@ export function useMediaAlbumIndex(album) {
19
20
  const current = resolveMediaAlbumIndex(album.count, own);
20
21
  return [current, (next) => { setOwn(next); album.onIndexChange?.(next); }];
21
22
  }
23
+ /** Lets a page's status tell its frame that the page is not an image yet. */
24
+ const MediaAlbumPageContext = createContext(null);
25
+ /**
26
+ * Loading or failed page of a `mediaAlbum` (2026-10-18 Utilverse). Return it from `renderPage` (or the component it
27
+ * renders) while the photo is not available. While it is shown the frame drops its image name and open action, so
28
+ * the spinner's name, the failure text and the retry button are reachable by screen readers and pointer instead of
29
+ * being swallowed by one accessible image. Centered in the frame (VQ-09).
30
+ */
31
+ export function MediaAlbumPageStatus(props) {
32
+ validateMediaAlbumPageStatus(props.kind, props.label);
33
+ const report = useContext(MediaAlbumPageContext);
34
+ // Layout effect: the frame switches its semantics before the browser paints, so the status never shows inside
35
+ // an image or button for a frame.
36
+ useLayoutEffect(() => { report?.(true); return () => report?.(false); }, [report]);
37
+ const s = mediaAlbumRecipe.pageStatus;
38
+ return _jsx("div", { className: "hjm-media-album__status", style: { gap: s.gap, padding: s.padding }, children: props.kind === "loading" ? _jsx(Spinner, { label: props.label })
39
+ : _jsxs(_Fragment, { children: [_jsx(Text, { as: "p", role: "alert", variant: s.textVariant, tone: "muted", children: props.label }), props.retry ? _jsx(Button, { type: "button", tone: s.retryTone, size: s.retrySize, onClick: props.retry.onPress, children: props.retry.label }) : null] }) });
40
+ }
22
41
  export function MediaAlbumView({ album, index, onIndexChange, width, radius, className }) {
23
42
  validateMediaAlbum(album.count, index);
43
+ const [statusShown, setStatusShown] = useState(false);
24
44
  const label = album.pageLabel(index, album.count);
25
45
  const frame = { aspectRatio: album.aspectRatio ?? mediaAlbumRecipe.defaultAspectRatio, borderRadius: radius };
26
46
  const page = album.renderPage(index);
27
- return _jsxs("div", { className: ["hjm-media-album", className].filter(Boolean).join(" "), style: { inlineSize: width, gap: mediaAlbumRecipe.controlGap }, children: [album.onPress
28
- ? _jsx("button", { type: "button", className: "hjm-media-album__page", "aria-label": label, style: frame, onClick: () => album.onPress?.(index), children: page })
29
- : _jsx("div", { role: "img", "aria-label": label, className: "hjm-media-album__page", style: frame, children: page }), album.count > 1 ? _jsxs("div", { className: "hjm-media-album__controls", children: [_jsx(IconButton, { label: album.previousLabel, tone: "ghost", size: mediaAlbumRecipe.controlSize, edge: "start", disabled: index === 0, onClick: () => onIndexChange(index - 1), children: _jsx(Icon, { name: "chevronStart" }) }), _jsxs(Text, { variant: "caption", "aria-live": "polite", children: [index + 1, "/", album.count] }), _jsx(IconButton, { label: album.nextLabel, tone: "ghost", size: mediaAlbumRecipe.controlSize, edge: "end", disabled: index === album.count - 1, onClick: () => onIndexChange(index + 1), children: _jsx(Icon, { name: "chevronEnd" }) })] }) : null] });
47
+ const opens = album.onPress !== undefined && !statusShown;
48
+ // The frame element and the page wrapper stay the same elements in every state, so the product's page (which owns
49
+ // the fetch) is never remounted when its status comes and goes. Only roles and the open overlay change.
50
+ return _jsxs("div", { className: ["hjm-media-album", className].filter(Boolean).join(" "), style: { inlineSize: width, gap: mediaAlbumRecipe.controlGap }, children: [_jsxs("div", { className: "hjm-media-album__page", style: frame, role: statusShown || album.onPress ? undefined : "img", "aria-label": statusShown || album.onPress ? undefined : label, children: [_jsx("div", { className: "hjm-media-album__content", "aria-hidden": opens || undefined, children: _jsx(MediaAlbumPageContext.Provider, { value: setStatusShown, children: page }) }), opens ? _jsx("button", { type: "button", className: "hjm-media-album__open", "aria-label": label, onClick: () => album.onPress?.(index) }) : null] }), album.count > 1 ? _jsxs("div", { className: "hjm-media-album__controls", children: [_jsx(IconButton, { label: album.previousLabel, tone: "ghost", size: mediaAlbumRecipe.controlSize, edge: "start", disabled: index === 0, onClick: () => onIndexChange(index - 1), children: _jsx(Icon, { name: "chevronStart" }) }), _jsxs(Text, { variant: "caption", "aria-live": "polite", children: [index + 1, "/", album.count] }), _jsx(IconButton, { label: album.nextLabel, tone: "ghost", size: mediaAlbumRecipe.controlSize, edge: "end", disabled: index === album.count - 1, onClick: () => onIndexChange(index + 1), children: _jsx(Icon, { name: "chevronEnd" }) })] }) : null] });
30
51
  }
31
52
  //# sourceMappingURL=media-album.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"media-album.js","sourceRoot":"","sources":["../../src/internal/media-album.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAsC,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AACvH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AA+BlD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAIpF;IACA,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,gBAAgB,CAAC,kBAAkB,EAAE,YAAY,EAAE,MAAM,EAAmB,CAAC;IAC/H,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,eAAK,SAAS,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,CAAC,UAAU,EAAE,aAC5I,KAAK,CAAC,OAAO;gBACZ,CAAC,CAAC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,uBAAuB,gBAAa,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,YAAG,IAAI,GAAU;gBACjJ,CAAC,CAAC,cAAK,IAAI,EAAC,KAAK,gBAAa,KAAK,EAAE,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAO,EAClG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,2BAA2B,aAE3D,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,EAAC,cAAc,GAAG,GAAa,EAC/M,MAAC,IAAI,IAAC,OAAO,EAAC,SAAS,eAAW,QAAQ,aAAE,KAAK,GAAG,CAAC,OAAG,KAAK,CAAC,KAAK,IAAQ,EAC3E,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAC,KAAK,EAAC,QAAQ,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,EAAC,YAAY,GAAG,GAAa,IACjN,CAAC,CAAC,CAAC,IAAI,IACT,CAAC;AACT,CAAC","sourcesContent":["import { useState, type CSSProperties, type ReactNode } from \"react\";\nimport { mediaAlbumRecipe, resolveMediaAlbumIndex, validateMediaAlbum } from \"@hjmds/design-contracts/screen-patterns\";\nimport { IconButton } from \"../actions.js\";\nimport { Text } from \"../layout.js\";\nimport { Icon } from \"../supplemental-display.js\";\n\ntype MediaAlbumBase = Readonly<{\n /** Number of photos in the set; at least one. */\n count: number;\n /**\n * Draws one page. HJM calls it only for the page on screen, so the product can fetch, authorize and decode that\n * photo alone instead of mounting every image in the set.\n */\n renderPage(index: number): ReactNode;\n /** Localized accessible name of a page, e.g. \"Photo 2 of 5\". */\n pageLabel(index: number, count: number): string;\n /** Localized accessible names of the previous/next icon buttons. */\n previousLabel: string;\n nextLabel: string;\n /** Page frame width / height. Defaults to `mediaAlbumRecipe.defaultAspectRatio` (square). */\n aspectRatio?: number;\n /** Opens the shown page (viewer); without it the page is a static image. */\n onPress?(index: number): void;\n}>;\n\n/**\n * Paged photo set (2026-10-18). Products own image sources, authorization and the viewer; HJM owns the frame,\n * the counter row and which page is mounted. Controlled with `index` + `onIndexChange`, or uncontrolled from\n * `defaultIndex`.\n */\nexport type MediaAlbum = MediaAlbumBase & (\n | Readonly<{ index: number; onIndexChange(index: number): void; defaultIndex?: never }>\n | Readonly<{ index?: never; defaultIndex?: number; onIndexChange?(index: number): void }>\n);\n\n/**\n * Hosts keep the page state so every copy of the album they render (the message and its hold-menu preview) shows\n * the same page. Called unconditionally; `album` may be absent.\n */\nexport function useMediaAlbumIndex(album: MediaAlbum | undefined): readonly [number, (index: number) => void] {\n const [own, setOwn] = useState(album?.defaultIndex ?? 0);\n if (!album) return [0, setOwn];\n if (album.index !== undefined) {\n validateMediaAlbum(album.count, album.index);\n return [album.index, album.onIndexChange];\n }\n const current = resolveMediaAlbumIndex(album.count, own);\n return [current, (next: number) => { setOwn(next); album.onIndexChange?.(next); }];\n}\n\nexport function MediaAlbumView({ album, index, onIndexChange, width, radius, className }: Readonly<{\n album: MediaAlbum; index: number; onIndexChange(index: number): void;\n /** Host media width (chat `mediaWidth`, comment `mediaMaxWidth`); the album never grows past its container. */\n width: number; radius: number; className?: string;\n}>) {\n validateMediaAlbum(album.count, index);\n const label = album.pageLabel(index, album.count);\n const frame = { aspectRatio: album.aspectRatio ?? mediaAlbumRecipe.defaultAspectRatio, borderRadius: radius } as CSSProperties;\n const page = album.renderPage(index);\n return <div className={[\"hjm-media-album\", className].filter(Boolean).join(\" \")} style={{ inlineSize: width, gap: mediaAlbumRecipe.controlGap }}>\n {album.onPress\n ? <button type=\"button\" className=\"hjm-media-album__page\" aria-label={label} style={frame} onClick={() => album.onPress?.(index)}>{page}</button>\n : <div role=\"img\" aria-label={label} className=\"hjm-media-album__page\" style={frame}>{page}</div>}\n {album.count > 1 ? <div className=\"hjm-media-album__controls\">\n {/* Same counter presentation as CarouselMotion navigation=\"counter\"; logical chevrons mirror in RTL. */}\n <IconButton label={album.previousLabel} tone=\"ghost\" size={mediaAlbumRecipe.controlSize} edge=\"start\" disabled={index === 0} onClick={() => onIndexChange(index - 1)}><Icon name=\"chevronStart\" /></IconButton>\n <Text variant=\"caption\" aria-live=\"polite\">{index + 1}/{album.count}</Text>\n <IconButton label={album.nextLabel} tone=\"ghost\" size={mediaAlbumRecipe.controlSize} edge=\"end\" disabled={index === album.count - 1} onClick={() => onIndexChange(index + 1)}><Icon name=\"chevronEnd\" /></IconButton>\n </div> : null}\n </div>;\n}\n"]}
1
+ {"version":3,"file":"media-album.js","sourceRoot":"","sources":["../../src/internal/media-album.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createContext, useContext, useLayoutEffect, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { mediaAlbumRecipe, resolveMediaAlbumIndex, validateMediaAlbum, validateMediaAlbumPageStatus } from \"@hjmds/design-contracts/screen-patterns\";\nimport { Button, IconButton } from \"../actions.js\";\nimport { Text } from \"../layout.js\";\nimport { Icon } from \"../supplemental-display.js\";\nimport { Spinner } from \"./spinner.js\";\n\ntype MediaAlbumBase = Readonly<{\n /** Number of photos in the set; at least one. */\n count: number;\n /**\n * Draws one page. HJM calls it only for the page on screen, so the product can fetch, authorize and decode that\n * photo alone instead of mounting every image in the set.\n */\n renderPage(index: number): ReactNode;\n /** Localized accessible name of a page, e.g. \"Photo 2 of 5\". */\n pageLabel(index: number, count: number): string;\n /** Localized accessible names of the previous/next icon buttons. */\n previousLabel: string;\n nextLabel: string;\n /** Page frame width / height. Defaults to `mediaAlbumRecipe.defaultAspectRatio` (square). */\n aspectRatio?: number;\n /**\n * Opens the shown page (viewer); without it the page is a static image. While the page renders a\n * `MediaAlbumPageStatus` it is not an image yet, so it does not open.\n */\n onPress?(index: number): void;\n}>;\n\n/**\n * Paged photo set (2026-10-18). Products own image sources, authorization and the viewer; HJM owns the frame,\n * the counter row and which page is mounted. Controlled with `index` + `onIndexChange`, or uncontrolled from\n * `defaultIndex`.\n */\nexport type MediaAlbum = MediaAlbumBase & (\n | Readonly<{ index: number; onIndexChange(index: number): void; defaultIndex?: never }>\n | Readonly<{ index?: never; defaultIndex?: number; onIndexChange?(index: number): void }>\n);\n\n/**\n * Hosts keep the page state so every copy of the album they render (the message and its hold-menu preview) shows\n * the same page. Called unconditionally; `album` may be absent.\n */\nexport function useMediaAlbumIndex(album: MediaAlbum | undefined): readonly [number, (index: number) => void] {\n const [own, setOwn] = useState(album?.defaultIndex ?? 0);\n if (!album) return [0, setOwn];\n if (album.index !== undefined) {\n validateMediaAlbum(album.count, album.index);\n return [album.index, album.onIndexChange];\n }\n const current = resolveMediaAlbumIndex(album.count, own);\n return [current, (next: number) => { setOwn(next); album.onIndexChange?.(next); }];\n}\n\n/** Lets a page's status tell its frame that the page is not an image yet. */\nconst MediaAlbumPageContext = createContext<((shown: boolean) => void) | null>(null);\n\nexport type MediaAlbumPageStatusProps =\n | Readonly<{ kind: \"loading\"; /** Localized name of what is loading, e.g. \"Loading photo\". */ label: string }>\n | Readonly<{ kind: \"error\"; /** Localized failure text, shown and announced. */ label: string;\n /** Retry button; label and action come from the product. */ retry?: Readonly<{ label: string; onPress(): void }> }>;\n\n/**\n * Loading or failed page of a `mediaAlbum` (2026-10-18 Utilverse). Return it from `renderPage` (or the component it\n * renders) while the photo is not available. While it is shown the frame drops its image name and open action, so\n * the spinner's name, the failure text and the retry button are reachable by screen readers and pointer instead of\n * being swallowed by one accessible image. Centered in the frame (VQ-09).\n */\nexport function MediaAlbumPageStatus(props: MediaAlbumPageStatusProps) {\n validateMediaAlbumPageStatus(props.kind, props.label);\n const report = useContext(MediaAlbumPageContext);\n // Layout effect: the frame switches its semantics before the browser paints, so the status never shows inside\n // an image or button for a frame.\n useLayoutEffect(() => { report?.(true); return () => report?.(false); }, [report]);\n const s = mediaAlbumRecipe.pageStatus;\n return <div className=\"hjm-media-album__status\" style={{ gap: s.gap, padding: s.padding }}>\n {props.kind === \"loading\" ? <Spinner label={props.label} />\n : <><Text as=\"p\" role=\"alert\" variant={s.textVariant} tone=\"muted\">{props.label}</Text>\n {props.retry ? <Button type=\"button\" tone={s.retryTone} size={s.retrySize} onClick={props.retry.onPress}>{props.retry.label}</Button> : null}</>}\n </div>;\n}\n\nexport function MediaAlbumView({ album, index, onIndexChange, width, radius, className }: Readonly<{\n album: MediaAlbum; index: number; onIndexChange(index: number): void;\n /** Host media width (chat `mediaWidth`, comment `mediaMaxWidth`); the album never grows past its container. */\n width: number; radius: number; className?: string;\n}>) {\n validateMediaAlbum(album.count, index);\n const [statusShown, setStatusShown] = useState(false);\n const label = album.pageLabel(index, album.count);\n const frame = { aspectRatio: album.aspectRatio ?? mediaAlbumRecipe.defaultAspectRatio, borderRadius: radius } as CSSProperties;\n const page = album.renderPage(index);\n const opens = album.onPress !== undefined && !statusShown;\n // The frame element and the page wrapper stay the same elements in every state, so the product's page (which owns\n // the fetch) is never remounted when its status comes and goes. Only roles and the open overlay change.\n return <div className={[\"hjm-media-album\", className].filter(Boolean).join(\" \")} style={{ inlineSize: width, gap: mediaAlbumRecipe.controlGap }}>\n <div className=\"hjm-media-album__page\" style={frame} role={statusShown || album.onPress ? undefined : \"img\"} aria-label={statusShown || album.onPress ? undefined : label}>\n <div className=\"hjm-media-album__content\" aria-hidden={opens || undefined}>\n <MediaAlbumPageContext.Provider value={setStatusShown}>{page}</MediaAlbumPageContext.Provider>\n </div>\n {opens ? <button type=\"button\" className=\"hjm-media-album__open\" aria-label={label} onClick={() => album.onPress?.(index)} /> : null}\n </div>\n {album.count > 1 ? <div className=\"hjm-media-album__controls\">\n {/* Same counter presentation as CarouselMotion navigation=\"counter\"; logical chevrons mirror in RTL. */}\n <IconButton label={album.previousLabel} tone=\"ghost\" size={mediaAlbumRecipe.controlSize} edge=\"start\" disabled={index === 0} onClick={() => onIndexChange(index - 1)}><Icon name=\"chevronStart\" /></IconButton>\n <Text variant=\"caption\" aria-live=\"polite\">{index + 1}/{album.count}</Text>\n <IconButton label={album.nextLabel} tone=\"ghost\" size={mediaAlbumRecipe.controlSize} edge=\"end\" disabled={index === album.count - 1} onClick={() => onIndexChange(index + 1)}><Icon name=\"chevronEnd\" /></IconButton>\n </div> : null}\n </div>;\n}\n"]}
@@ -64,5 +64,16 @@ export declare function ReactionSummaryButton({ label, items, selected, disabled
64
64
  disabled: boolean;
65
65
  onPress(): void;
66
66
  }>): import("react").JSX.Element;
67
+ /**
68
+ * Read-only counts (`summary.readOnly`, 2026-10-18 Utilverse guests who cannot react): the same place and items as
69
+ * the pill, as plain caption text without the pill surface, so it is neither drawn nor announced as a control. The
70
+ * product label is the text screen readers read; the drawn emoji and numbers are hidden from them.
71
+ */
72
+ export declare function ReactionSummaryText({ label, items }: Readonly<{
73
+ label: string;
74
+ items: readonly (ChatReactionSummaryItem & Readonly<{
75
+ showCount: boolean;
76
+ }>)[];
77
+ }>): import("react").JSX.Element;
67
78
  export {};
68
79
  //# sourceMappingURL=message-reactions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-reactions.d.ts","sourceRoot":"","sources":["../../src/internal/message-reactions.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-reactions.d.ts","sourceRoot":"","sources":["../../src/internal/message-reactions.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useImperativeHandle, useRef, useState } from "react";
3
3
  import { chatMessageRecipe, screenPatternRecipe } from "@hjmds/design-contracts/screen-patterns";
4
- import { Text } from "../layout.js";
4
+ import { Text, VisuallyHidden } from "../layout.js";
5
5
  import { Popover } from "../popover.js";
6
6
  import { ReactionPicker } from "../reaction-picker.js";
7
7
  /** Chat-specific trigger translation; Popover retains collision, focus, Escape and outside dismissal. */
@@ -62,4 +62,13 @@ export function ReactionSummaryButton({ label, items, selected, disabled, onPres
62
62
  const mine = items.some(item => item.id === selected);
63
63
  return _jsx("button", { type: "button", className: "hjm-chat-message__reaction-summary", "aria-label": label, disabled: disabled, "data-selected": mine || undefined, onClick: onPress, style: { minBlockSize: r.minHeight, paddingInline: r.paddingInline, gap: r.itemGap }, children: items.map(item => _jsxs("span", { "aria-hidden": "true", style: { display: "inline-flex", alignItems: "center", gap: r.emojiGap }, children: [_jsx("span", { children: item.emoji }), item.showCount ? _jsx(Text, { as: "span", variant: "caption", children: item.count }) : null] }, item.id)) });
64
64
  }
65
+ /**
66
+ * Read-only counts (`summary.readOnly`, 2026-10-18 Utilverse guests who cannot react): the same place and items as
67
+ * the pill, as plain caption text without the pill surface, so it is neither drawn nor announced as a control. The
68
+ * product label is the text screen readers read; the drawn emoji and numbers are hidden from them.
69
+ */
70
+ export function ReactionSummaryText({ label, items }) {
71
+ const r = chatMessageRecipe.reactionSummary;
72
+ return _jsxs("span", { className: "hjm-chat-message__reaction-counts", style: { minBlockSize: r.minHeight, gap: r.itemGap }, children: [_jsx(VisuallyHidden, { children: label }), items.map(item => _jsxs("span", { "aria-hidden": "true", style: { display: "inline-flex", alignItems: "center", gap: r.emojiGap }, children: [_jsx("span", { children: item.emoji }), item.showCount ? _jsx(Text, { as: "span", variant: "caption", tone: "muted", children: item.count }) : null] }, item.id))] });
73
+ }
65
74
  //# sourceMappingURL=message-reactions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-reactions.js","sourceRoot":"","sources":["../../src/internal/message-reactions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useImperativeHandle, useRef, useState, type ReactNode, type Ref } from \"react\";\nimport { chatMessageRecipe, screenPatternRecipe, type ChatReactionSummaryItem } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { MenuItemTone } from \"@hjmds/design-contracts/recipes\";\nimport { Text } from \"../layout.js\";\nimport { Popover } from \"../popover.js\";\nimport { ReactionPicker, type ReactionPickerProps } from \"../reaction-picker.js\";\n\n/** One row of the hold menu. Products supply copy and icons; HJM owns order, size and tone. */\nexport type MessageMenuAction = Readonly<{ id: string; label: string; icon?: ReactNode; onPress(): void; disabled?: boolean; /** Shows › for rows that open a further list. */ submenu?: boolean;\n /** Same vocabulary as Menu items: `danger` for destructive rows such as delete (default `neutral`). */ tone?: MenuItemTone }>;\n/** Lets the owning message open the same hold menu from its reaction summary. */\nexport type MessageReactionsHandle = Readonly<{ open(): void }>;\ntype Props = ReactionPickerProps & Readonly<{ closeLabel: string; menuAction?: Readonly<{label:string;onPress():void;disabled?:boolean}>; children: ReactNode; interactiveContent?:boolean; /** Comments reuse the hold menu without chat bubble styling. */ triggerClassName?: string;\n replyAction?: Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;\n /** Shown above the actions, e.g. the exact send time that a run only shows once. */\n menuTitle?: string;\n menuActions?: readonly MessageMenuAction[];\n /** Always last and in the danger tone, matching the measured reference menu (2026-10-16). */\n reportAction?: Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;\n menuRef?: Ref<MessageReactionsHandle> }>;\n/** Chat-specific trigger translation; Popover retains collision, focus, Escape and outside dismissal. */\nexport function MessageReactions({ children, closeLabel, menuAction, interactiveContent=false, triggerClassName = \"hjm-chat-message__bubble\", replyAction, menuTitle, menuActions = [], reportAction, menuRef, ...picker }: Props) {\n // Reply leads and report trails; legacy single menuAction keeps its place before report.\n const rows: MessageMenuAction[] = [\n ...(replyAction ? [{ id: \"reply\", ...replyAction }] : []),\n ...menuActions,\n ...(menuAction ? [{ id: \"menu\", ...menuAction }] : []),\n ...(reportAction ? [{ id: \"report\", ...reportAction, tone: \"danger\" as const }] : []),\n ];\n const [open, setOpen] = useState(false);\n const press = useRef<{ timer: ReturnType<typeof setTimeout>; x: number; y: number } | null>(null);\n const held = useRef(false);\n const cancel = () => { if (press.current) clearTimeout(press.current.timer); press.current = null; };\n useEffect(() => () => { if (press.current) clearTimeout(press.current.timer); }, []);\n useEffect(() => { if (picker.disabled) { cancel(); setOpen(false); } }, [picker.disabled]);\n useImperativeHandle(menuRef, () => ({ open: () => { if (!picker.disabled) setOpen(true); } }), [picker.disabled]);\n return <Popover open={open && !picker.disabled} onOpenChange={(next) => { if (!next) setOpen(false); }} title={picker.label} closeLabel={closeLabel}\n descriptor={{ placement: \"top\", align: \"start\" }} className=\"hjm-message-reactions\" trigger={<div\n className={triggerClassName} tabIndex={picker.disabled ? -1 : 0} role={interactiveContent?\"group\":\"button\"} aria-label={picker.label} aria-disabled={picker.disabled}\n onContextMenu={event => { event.preventDefault(); cancel(); if (!picker.disabled) setOpen(true); }}\n // Only the bubble itself opens reactions: with interactiveContent, Enter/Space on a nested\n // link or button must keep its native activation instead of being swallowed here.\n onKeyDown={event => { if (event.target === event.currentTarget && (event.key === \"Enter\" || event.key === \" \") && !picker.disabled) { event.preventDefault(); setOpen(true); } }}\n onPointerDown={event => {\n if (picker.disabled || event.button !== 0 || (event.target as HTMLElement).closest(\"button,a,input,textarea\")) return;\n cancel(); held.current = false;\n const { clientX: x, clientY: y } = event;\n press.current = { x, y, timer: setTimeout(() => { held.current = true; press.current = null; setOpen(true); }, screenPatternRecipe.reactionHoldMs) };\n }}\n onPointerMove={event => { const start = press.current; if (start && Math.hypot(event.clientX - start.x, event.clientY - start.y) > screenPatternRecipe.reactionMoveTolerance) cancel(); }}\n onPointerCancel={cancel} onPointerLeave={cancel} onPointerUp={cancel}\n onClickCapture={event => { if (held.current) { event.preventDefault(); event.stopPropagation(); held.current = false; } }}\n >{children}</div>}>\n {/* Action-only menus (comments, 2026-10-16 reference) pass no options and show no strip. */}\n {picker.options.length ? <ReactionPicker {...picker} layout=\"strip\" onValueChange={value => { picker.onValueChange(value); setOpen(false); }} /> : null}\n {menuTitle || rows.length ? <div className=\"hjm-message-menu\">\n {menuTitle ? <Text variant=\"caption\" tone=\"muted\" className=\"hjm-message-menu__title\">{menuTitle}</Text> : null}\n {rows.map(row => <button key={row.id} type=\"button\" className=\"hjm-message-menu__item\" data-tone={row.tone === \"danger\" ? \"danger\" : undefined} disabled={row.disabled} onClick={() => { setOpen(false); row.onPress(); }}>\n {row.icon ? <span className=\"hjm-message-menu__icon\" aria-hidden=\"true\">{row.icon}</span> : null}<span className=\"hjm-message-menu__label\">{row.label}</span>{row.submenu ? <span className=\"hjm-message-menu__chevron\" aria-hidden=\"true\">›</span> : null}</button>)}\n </div> : null}\n </Popover>;\n}\n\n/** ChatMessage strips its summary before spreading the rest into the hold menu. */\nexport function omitReactionSummary<T extends Readonly<{ summary?: unknown }>>({ summary: _summary, ...rest }: T): Omit<T, \"summary\"> {\n return rest;\n}\n\n/**\n * Current reactions as one button beside the time; pressing it opens the hold menu (the press target and its name\n * are the whole pill, so per-emoji parts are hidden from assistive tech). The pill shows the brand border when the\n * reader's own reaction is among the items.\n */\nexport function ReactionSummaryButton({ label, items, selected, disabled, onPress }: Readonly<{ label: string; items: readonly (ChatReactionSummaryItem & Readonly<{ showCount: boolean }>)[]; selected: string | null; disabled: boolean; onPress(): void }>) {\n const r = chatMessageRecipe.reactionSummary;\n const mine = items.some(item => item.id === selected);\n return <button type=\"button\" className=\"hjm-chat-message__reaction-summary\" aria-label={label} disabled={disabled} data-selected={mine || undefined} onClick={onPress}\n style={{ minBlockSize: r.minHeight, paddingInline: r.paddingInline, gap: r.itemGap }}>\n {items.map(item => <span key={item.id} aria-hidden=\"true\" style={{ display: \"inline-flex\", alignItems: \"center\", gap: r.emojiGap }}><span>{item.emoji}</span>{item.showCount ? <Text as=\"span\" variant=\"caption\">{item.count}</Text> : null}</span>)}\n </button>;\n}\n"]}
1
+ {"version":3,"file":"message-reactions.js","sourceRoot":"","sources":["../../src/internal/message-reactions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useImperativeHandle, useRef, useState, type ReactNode, type Ref } from \"react\";\nimport { chatMessageRecipe, screenPatternRecipe, type ChatReactionSummaryItem } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { MenuItemTone } from \"@hjmds/design-contracts/recipes\";\nimport { Text, VisuallyHidden } from \"../layout.js\";\nimport { Popover } from \"../popover.js\";\nimport { ReactionPicker, type ReactionPickerProps } from \"../reaction-picker.js\";\n\n/** One row of the hold menu. Products supply copy and icons; HJM owns order, size and tone. */\nexport type MessageMenuAction = Readonly<{ id: string; label: string; icon?: ReactNode; onPress(): void; disabled?: boolean; /** Shows › for rows that open a further list. */ submenu?: boolean;\n /** Same vocabulary as Menu items: `danger` for destructive rows such as delete (default `neutral`). */ tone?: MenuItemTone }>;\n/** Lets the owning message open the same hold menu from its reaction summary. */\nexport type MessageReactionsHandle = Readonly<{ open(): void }>;\ntype Props = ReactionPickerProps & Readonly<{ closeLabel: string; menuAction?: Readonly<{label:string;onPress():void;disabled?:boolean}>; children: ReactNode; interactiveContent?:boolean; /** Comments reuse the hold menu without chat bubble styling. */ triggerClassName?: string;\n replyAction?: Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;\n /** Shown above the actions, e.g. the exact send time that a run only shows once. */\n menuTitle?: string;\n menuActions?: readonly MessageMenuAction[];\n /** Always last and in the danger tone, matching the measured reference menu (2026-10-16). */\n reportAction?: Readonly<{label:string;onPress():void;disabled?:boolean;icon?:ReactNode}>;\n menuRef?: Ref<MessageReactionsHandle> }>;\n/** Chat-specific trigger translation; Popover retains collision, focus, Escape and outside dismissal. */\nexport function MessageReactions({ children, closeLabel, menuAction, interactiveContent=false, triggerClassName = \"hjm-chat-message__bubble\", replyAction, menuTitle, menuActions = [], reportAction, menuRef, ...picker }: Props) {\n // Reply leads and report trails; legacy single menuAction keeps its place before report.\n const rows: MessageMenuAction[] = [\n ...(replyAction ? [{ id: \"reply\", ...replyAction }] : []),\n ...menuActions,\n ...(menuAction ? [{ id: \"menu\", ...menuAction }] : []),\n ...(reportAction ? [{ id: \"report\", ...reportAction, tone: \"danger\" as const }] : []),\n ];\n const [open, setOpen] = useState(false);\n const press = useRef<{ timer: ReturnType<typeof setTimeout>; x: number; y: number } | null>(null);\n const held = useRef(false);\n const cancel = () => { if (press.current) clearTimeout(press.current.timer); press.current = null; };\n useEffect(() => () => { if (press.current) clearTimeout(press.current.timer); }, []);\n useEffect(() => { if (picker.disabled) { cancel(); setOpen(false); } }, [picker.disabled]);\n useImperativeHandle(menuRef, () => ({ open: () => { if (!picker.disabled) setOpen(true); } }), [picker.disabled]);\n return <Popover open={open && !picker.disabled} onOpenChange={(next) => { if (!next) setOpen(false); }} title={picker.label} closeLabel={closeLabel}\n descriptor={{ placement: \"top\", align: \"start\" }} className=\"hjm-message-reactions\" trigger={<div\n className={triggerClassName} tabIndex={picker.disabled ? -1 : 0} role={interactiveContent?\"group\":\"button\"} aria-label={picker.label} aria-disabled={picker.disabled}\n onContextMenu={event => { event.preventDefault(); cancel(); if (!picker.disabled) setOpen(true); }}\n // Only the bubble itself opens reactions: with interactiveContent, Enter/Space on a nested\n // link or button must keep its native activation instead of being swallowed here.\n onKeyDown={event => { if (event.target === event.currentTarget && (event.key === \"Enter\" || event.key === \" \") && !picker.disabled) { event.preventDefault(); setOpen(true); } }}\n onPointerDown={event => {\n if (picker.disabled || event.button !== 0 || (event.target as HTMLElement).closest(\"button,a,input,textarea\")) return;\n cancel(); held.current = false;\n const { clientX: x, clientY: y } = event;\n press.current = { x, y, timer: setTimeout(() => { held.current = true; press.current = null; setOpen(true); }, screenPatternRecipe.reactionHoldMs) };\n }}\n onPointerMove={event => { const start = press.current; if (start && Math.hypot(event.clientX - start.x, event.clientY - start.y) > screenPatternRecipe.reactionMoveTolerance) cancel(); }}\n onPointerCancel={cancel} onPointerLeave={cancel} onPointerUp={cancel}\n onClickCapture={event => { if (held.current) { event.preventDefault(); event.stopPropagation(); held.current = false; } }}\n >{children}</div>}>\n {/* Action-only menus (comments, 2026-10-16 reference) pass no options and show no strip. */}\n {picker.options.length ? <ReactionPicker {...picker} layout=\"strip\" onValueChange={value => { picker.onValueChange(value); setOpen(false); }} /> : null}\n {menuTitle || rows.length ? <div className=\"hjm-message-menu\">\n {menuTitle ? <Text variant=\"caption\" tone=\"muted\" className=\"hjm-message-menu__title\">{menuTitle}</Text> : null}\n {rows.map(row => <button key={row.id} type=\"button\" className=\"hjm-message-menu__item\" data-tone={row.tone === \"danger\" ? \"danger\" : undefined} disabled={row.disabled} onClick={() => { setOpen(false); row.onPress(); }}>\n {row.icon ? <span className=\"hjm-message-menu__icon\" aria-hidden=\"true\">{row.icon}</span> : null}<span className=\"hjm-message-menu__label\">{row.label}</span>{row.submenu ? <span className=\"hjm-message-menu__chevron\" aria-hidden=\"true\">›</span> : null}</button>)}\n </div> : null}\n </Popover>;\n}\n\n/** ChatMessage strips its summary before spreading the rest into the hold menu. */\nexport function omitReactionSummary<T extends Readonly<{ summary?: unknown }>>({ summary: _summary, ...rest }: T): Omit<T, \"summary\"> {\n return rest;\n}\n\n/**\n * Current reactions as one button beside the time; pressing it opens the hold menu (the press target and its name\n * are the whole pill, so per-emoji parts are hidden from assistive tech). The pill shows the brand border when the\n * reader's own reaction is among the items.\n */\nexport function ReactionSummaryButton({ label, items, selected, disabled, onPress }: Readonly<{ label: string; items: readonly (ChatReactionSummaryItem & Readonly<{ showCount: boolean }>)[]; selected: string | null; disabled: boolean; onPress(): void }>) {\n const r = chatMessageRecipe.reactionSummary;\n const mine = items.some(item => item.id === selected);\n return <button type=\"button\" className=\"hjm-chat-message__reaction-summary\" aria-label={label} disabled={disabled} data-selected={mine || undefined} onClick={onPress}\n style={{ minBlockSize: r.minHeight, paddingInline: r.paddingInline, gap: r.itemGap }}>\n {items.map(item => <span key={item.id} aria-hidden=\"true\" style={{ display: \"inline-flex\", alignItems: \"center\", gap: r.emojiGap }}><span>{item.emoji}</span>{item.showCount ? <Text as=\"span\" variant=\"caption\">{item.count}</Text> : null}</span>)}\n </button>;\n}\n\n/**\n * Read-only counts (`summary.readOnly`, 2026-10-18 Utilverse guests who cannot react): the same place and items as\n * the pill, as plain caption text without the pill surface, so it is neither drawn nor announced as a control. The\n * product label is the text screen readers read; the drawn emoji and numbers are hidden from them.\n */\nexport function ReactionSummaryText({ label, items }: Readonly<{ label: string; items: readonly (ChatReactionSummaryItem & Readonly<{ showCount: boolean }>)[] }>) {\n const r = chatMessageRecipe.reactionSummary;\n return <span className=\"hjm-chat-message__reaction-counts\" style={{ minBlockSize: r.minHeight, gap: r.itemGap }}>\n <VisuallyHidden>{label}</VisuallyHidden>\n {items.map(item => <span key={item.id} aria-hidden=\"true\" style={{ display: \"inline-flex\", alignItems: \"center\", gap: r.emojiGap }}><span>{item.emoji}</span>{item.showCount ? <Text as=\"span\" variant=\"caption\" tone=\"muted\">{item.count}</Text> : null}</span>)}\n </span>;\n}\n"]}
@@ -1,22 +1,24 @@
1
- import { type ComposePaginationAccessibleName, type PaginationChangeHandler, type PaginationDescriptor, type PaginationLabels } from "@hjmds/design-contracts/components/pagination";
1
+ import { type ComposePaginationAccessibleName, type ComposePaginationCurrentPageLabel, type PaginationChangeHandler, type PaginationDescriptor, type PaginationLabels, type PaginationOpenEndedDescriptor } from "@hjmds/design-contracts/components/pagination";
2
2
  import { type HTMLAttributes } from "react";
3
3
  import type { HjmCompositionStyleProp } from "./composition-style.js";
4
+ /**
5
+ * Bounded results pass a total and `composeAccessibleName` for the numbered window; open-ended results pass
6
+ * `hasNext` and `composeCurrentPageLabel` for previous / current page label / next.
7
+ */
4
8
  export type PaginationProps = Omit<HTMLAttributes<HTMLElement>, "children"> & Readonly<{
5
9
  label: string;
6
- descriptor: PaginationDescriptor;
7
10
  labels: PaginationLabels;
8
- composeAccessibleName: ComposePaginationAccessibleName;
9
11
  onPageChange: PaginationChangeHandler;
10
12
  /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
11
13
  layoutStyle?: HjmCompositionStyleProp;
12
- }>;
13
- export declare const Pagination: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLElement>, "children"> & Readonly<{
14
- label: string;
14
+ }> & (Readonly<{
15
15
  descriptor: PaginationDescriptor;
16
- labels: PaginationLabels;
17
16
  composeAccessibleName: ComposePaginationAccessibleName;
18
- onPageChange: PaginationChangeHandler;
19
- /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */
20
- layoutStyle?: HjmCompositionStyleProp;
21
- }> & import("react").RefAttributes<HTMLElement>>;
17
+ composeCurrentPageLabel?: never;
18
+ }> | Readonly<{
19
+ descriptor: PaginationOpenEndedDescriptor;
20
+ composeCurrentPageLabel: ComposePaginationCurrentPageLabel;
21
+ composeAccessibleName?: never;
22
+ }>);
23
+ export declare const Pagination: import("react").ForwardRefExoticComponent<PaginationProps & import("react").RefAttributes<HTMLElement>>;
22
24
  //# sourceMappingURL=pagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,+BAA+B,EAAE,KAAK,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAClN,OAAO,EAAuC,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GACzE,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,qBAAqB,EAAE,+BAA+B,CAAC;IACvD,YAAY,EAAE,uBAAuB,CAAC;IACtC,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEL,eAAO,MAAM,UAAU;WATZ,MAAM;gBACD,oBAAoB;YACxB,gBAAgB;2BACD,+BAA+B;kBACxC,uBAAuB;IACrC,gGAAgG;kBAClF,uBAAuB;gDAiGxC,CAAC"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,+BAA+B,EACpC,KAAK,iCAAiC,EACtC,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,6BAA6B,EACnC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAuC,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GACzE,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,uBAAuB,CAAC;IACtC,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,GACF,CACI,QAAQ,CAAC;IACP,UAAU,EAAE,oBAAoB,CAAC;IACjC,qBAAqB,EAAE,+BAA+B,CAAC;IACvD,uBAAuB,CAAC,EAAE,KAAK,CAAC;CACjC,CAAC,GACF,QAAQ,CAAC;IACP,UAAU,EAAE,6BAA6B,CAAC;IAC1C,uBAAuB,EAAE,iCAAiC,CAAC;IAC3D,qBAAqB,CAAC,EAAE,KAAK,CAAC;CAC/B,CAAC,CACL,CAAC;AAEJ,eAAO,MAAM,UAAU,yGA6GtB,CAAC"}
@@ -1,13 +1,20 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { resolvePaginationDescriptor } from "@hjmds/design-contracts/components/pagination";
2
+ import { isPaginationOpenEndedDescriptor, resolvePaginationDescriptor, resolvePaginationOpenEndedDescriptor, } from "@hjmds/design-contracts/components/pagination";
3
3
  import { forwardRef, useLayoutEffect, useRef } from "react";
4
4
  import { classNames } from "./internal.js";
5
- export const Pagination = forwardRef(function Pagination({ label, descriptor, labels, composeAccessibleName, onPageChange, className, layoutStyle, onFocusCapture, onBlurCapture, ...props }, ref) {
5
+ export const Pagination = forwardRef(function Pagination({ label, descriptor, labels, composeAccessibleName, composeCurrentPageLabel, onPageChange, className, layoutStyle, onFocusCapture, onBlurCapture, ...props }, ref) {
6
6
  if (label.trim().length === 0)
7
7
  throw new TypeError("Pagination label must not be empty");
8
- const resolved = resolvePaginationDescriptor(descriptor, {
8
+ // The resolvers validate that the matching composer is a function, so a mismatched pair fails loudly.
9
+ const openEnded = isPaginationOpenEndedDescriptor(descriptor)
10
+ ? resolvePaginationOpenEndedDescriptor(descriptor, {
11
+ labels,
12
+ composeCurrentPageLabel: composeCurrentPageLabel,
13
+ })
14
+ : null;
15
+ const resolved = openEnded ?? resolvePaginationDescriptor(descriptor, {
9
16
  labels,
10
- composeAccessibleName,
17
+ composeAccessibleName: composeAccessibleName,
11
18
  });
12
19
  const focusedButton = useRef(null);
13
20
  const currentButton = useRef(null);
@@ -24,7 +31,7 @@ export const Pagination = forwardRef(function Pagination({ label, descriptor, la
24
31
  focusedButton.current = null;
25
32
  onBlurCapture?.(event);
26
33
  }, children: _jsxs("ul", { className: "hjm-pagination__list", children: [_jsx("li", { children: _jsx("button", { type: "button", className: "hjm-pagination__item hjm-pagination__previous", "aria-label": resolved.labels.previous, "aria-disabled": !resolved.hasPrevious || undefined, onClick: () => { if (resolved.hasPrevious)
27
- onPageChange(resolved.currentPage - 1, "previous"); }, children: _jsx("span", { "aria-hidden": "true", children: "\u2039" }) }) }), resolved.items.map((item, index) => item.type === "ellipsis" ? (_jsx("li", { children: _jsx("span", { className: "hjm-pagination__ellipsis", "aria-hidden": "true", children: "\u2026" }) }, `ellipsis-${index}`)) : (_jsx("li", { children: _jsx("button", { type: "button", className: "hjm-pagination__item", ref: item.current ? currentButton : undefined, "data-state": item.current ? "current" : "idle", "aria-current": item.current ? "page" : undefined, "aria-label": item.accessibleName, onClick: () => {
34
+ onPageChange(resolved.currentPage - 1, "previous"); }, children: _jsx("span", { "aria-hidden": "true", children: "\u2039" }) }) }), openEnded ? (_jsx("li", { children: _jsx("span", { className: "hjm-pagination__page-label", "aria-current": "page", children: openEnded.currentPageLabel }) })) : null, "items" in resolved && resolved.items.map((item, index) => item.type === "ellipsis" ? (_jsx("li", { children: _jsx("span", { className: "hjm-pagination__ellipsis", "aria-hidden": "true", children: "\u2026" }) }, `ellipsis-${index}`)) : (_jsx("li", { children: _jsx("button", { type: "button", className: "hjm-pagination__item", ref: item.current ? currentButton : undefined, "data-state": item.current ? "current" : "idle", "aria-current": item.current ? "page" : undefined, "aria-label": item.accessibleName, onClick: () => {
28
35
  if (!item.current)
29
36
  onPageChange(item.page, "page");
30
37
  }, children: item.page }) }, item.page))), _jsx("li", { children: _jsx("button", { type: "button", className: "hjm-pagination__item hjm-pagination__next", "aria-label": resolved.labels.next, "aria-disabled": !resolved.hasNext || undefined, onClick: () => { if (resolved.hasNext)
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.tsx"],"names":[],"mappings":"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","sourcesContent":["import { resolvePaginationDescriptor, type ComposePaginationAccessibleName, type PaginationChangeHandler, type PaginationDescriptor, type PaginationLabels } from \"@hjmds/design-contracts/components/pagination\";\nimport { forwardRef, useLayoutEffect, useRef, type HTMLAttributes } from \"react\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type PaginationProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> &\n Readonly<{\n label: string;\n descriptor: PaginationDescriptor;\n labels: PaginationLabels;\n composeAccessibleName: ComposePaginationAccessibleName;\n onPageChange: PaginationChangeHandler;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n function Pagination(\n {\n label,\n descriptor,\n labels,\n composeAccessibleName,\n onPageChange,\n className,\n layoutStyle,\n onFocusCapture,\n onBlurCapture,\n ...props\n },\n ref,\n ) {\n if (label.trim().length === 0) throw new TypeError(\"Pagination label must not be empty\");\n const resolved = resolvePaginationDescriptor(descriptor, {\n labels,\n composeAccessibleName,\n });\n const focusedButton = useRef<HTMLElement | null>(null);\n const currentButton = useRef<HTMLButtonElement>(null);\n useLayoutEffect(() => {\n // A smaller result set or moved page window can remove the focused numbered button.\n if (focusedButton.current && !focusedButton.current.isConnected && document.activeElement === document.body) {\n currentButton.current?.focus();\n }\n });\n // Preserve focus when a page change reaches a boundary; aria-disabled buttons\n // remain reachable but their activation is guarded below.\n return (\n <nav\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-pagination\", className)}\n aria-label={label}\n onFocusCapture={(event) => { focusedButton.current = event.target; onFocusCapture?.(event); }}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) focusedButton.current = null;\n onBlurCapture?.(event);\n }}\n >\n <ul className=\"hjm-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"hjm-pagination__item hjm-pagination__previous\"\n aria-label={resolved.labels.previous}\n aria-disabled={!resolved.hasPrevious || undefined}\n onClick={() => { if (resolved.hasPrevious) onPageChange(resolved.currentPage - 1, \"previous\"); }}\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n </li>\n {resolved.items.map((item, index) =>\n item.type === \"ellipsis\" ? (\n <li key={`ellipsis-${index}`}>\n <span className=\"hjm-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n </li>\n ) : (\n <li key={item.page}>\n <button\n type=\"button\"\n className=\"hjm-pagination__item\"\n ref={item.current ? currentButton : undefined}\n data-state={item.current ? \"current\" : \"idle\"}\n aria-current={item.current ? \"page\" : undefined}\n aria-label={item.accessibleName}\n onClick={() => {\n if (!item.current) onPageChange(item.page, \"page\");\n }}\n >\n {item.page}\n </button>\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"hjm-pagination__item hjm-pagination__next\"\n aria-label={resolved.labels.next}\n aria-disabled={!resolved.hasNext || undefined}\n onClick={() => { if (resolved.hasNext) onPageChange(resolved.currentPage + 1, \"next\"); }}\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n </li>\n </ul>\n </nav>\n );\n },\n);\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n isPaginationOpenEndedDescriptor,\n resolvePaginationDescriptor,\n resolvePaginationOpenEndedDescriptor,\n type ComposePaginationAccessibleName,\n type ComposePaginationCurrentPageLabel,\n type PaginationChangeHandler,\n type PaginationDescriptor,\n type PaginationLabels,\n type PaginationOpenEndedDescriptor,\n} from \"@hjmds/design-contracts/components/pagination\";\nimport { forwardRef, useLayoutEffect, useRef, type HTMLAttributes } from \"react\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\n/**\n * Bounded results pass a total and `composeAccessibleName` for the numbered window; open-ended results pass\n * `hasNext` and `composeCurrentPageLabel` for previous / current page label / next.\n */\nexport type PaginationProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> &\n Readonly<{\n label: string;\n labels: PaginationLabels;\n onPageChange: PaginationChangeHandler;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }> &\n (\n | Readonly<{\n descriptor: PaginationDescriptor;\n composeAccessibleName: ComposePaginationAccessibleName;\n composeCurrentPageLabel?: never;\n }>\n | Readonly<{\n descriptor: PaginationOpenEndedDescriptor;\n composeCurrentPageLabel: ComposePaginationCurrentPageLabel;\n composeAccessibleName?: never;\n }>\n );\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n function Pagination(\n {\n label,\n descriptor,\n labels,\n composeAccessibleName,\n composeCurrentPageLabel,\n onPageChange,\n className,\n layoutStyle,\n onFocusCapture,\n onBlurCapture,\n ...props\n },\n ref,\n ) {\n if (label.trim().length === 0) throw new TypeError(\"Pagination label must not be empty\");\n // The resolvers validate that the matching composer is a function, so a mismatched pair fails loudly.\n const openEnded = isPaginationOpenEndedDescriptor(descriptor)\n ? resolvePaginationOpenEndedDescriptor(descriptor, {\n labels,\n composeCurrentPageLabel: composeCurrentPageLabel as ComposePaginationCurrentPageLabel,\n })\n : null;\n const resolved = openEnded ?? resolvePaginationDescriptor(descriptor as PaginationDescriptor, {\n labels,\n composeAccessibleName: composeAccessibleName as ComposePaginationAccessibleName,\n });\n const focusedButton = useRef<HTMLElement | null>(null);\n const currentButton = useRef<HTMLButtonElement>(null);\n useLayoutEffect(() => {\n // A smaller result set or moved page window can remove the focused numbered button.\n if (focusedButton.current && !focusedButton.current.isConnected && document.activeElement === document.body) {\n currentButton.current?.focus();\n }\n });\n // Preserve focus when a page change reaches a boundary; aria-disabled buttons\n // remain reachable but their activation is guarded below.\n return (\n <nav\n {...props}\n style={{ ...props.style, ...layoutStyle }}\n ref={ref}\n className={classNames(\"hjm-pagination\", className)}\n aria-label={label}\n onFocusCapture={(event) => { focusedButton.current = event.target; onFocusCapture?.(event); }}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) focusedButton.current = null;\n onBlurCapture?.(event);\n }}\n >\n <ul className=\"hjm-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"hjm-pagination__item hjm-pagination__previous\"\n aria-label={resolved.labels.previous}\n aria-disabled={!resolved.hasPrevious || undefined}\n onClick={() => { if (resolved.hasPrevious) onPageChange(resolved.currentPage - 1, \"previous\"); }}\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n </li>\n {openEnded ? (\n <li>\n <span className=\"hjm-pagination__page-label\" aria-current=\"page\">\n {openEnded.currentPageLabel}\n </span>\n </li>\n ) : null}\n {\"items\" in resolved && resolved.items.map((item, index) =>\n item.type === \"ellipsis\" ? (\n <li key={`ellipsis-${index}`}>\n <span className=\"hjm-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n </li>\n ) : (\n <li key={item.page}>\n <button\n type=\"button\"\n className=\"hjm-pagination__item\"\n ref={item.current ? currentButton : undefined}\n data-state={item.current ? \"current\" : \"idle\"}\n aria-current={item.current ? \"page\" : undefined}\n aria-label={item.accessibleName}\n onClick={() => {\n if (!item.current) onPageChange(item.page, \"page\");\n }}\n >\n {item.page}\n </button>\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"hjm-pagination__item hjm-pagination__next\"\n aria-label={resolved.labels.next}\n aria-disabled={!resolved.hasNext || undefined}\n onClick={() => { if (resolved.hasNext) onPageChange(resolved.currentPage + 1, \"next\"); }}\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n </li>\n </ul>\n </nav>\n );\n },\n);\n"]}
@@ -107,6 +107,7 @@ export declare const publicExportEntries: {
107
107
  readonly LoadMore: readonly ["./navigation"];
108
108
  readonly Masonry: readonly ["./masonry"];
109
109
  readonly MatrixTable: readonly ["./data-table"];
110
+ readonly MediaAlbumPageStatus: readonly ["./screens"];
110
111
  readonly MediaSelectionCell: readonly ["./screen-flows"];
111
112
  readonly MediaSelectionScreen: readonly ["./screen-flows"];
112
113
  readonly MediaTransport: readonly ["./media-transport"];
@@ -1 +1 @@
1
- {"version":3,"file":"public-exports.generated.d.ts","sourceRoot":"","sources":["../src/public-exports.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0pBuC,CAAC"}
1
+ {"version":3,"file":"public-exports.generated.d.ts","sourceRoot":"","sources":["../src/public-exports.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6pBuC,CAAC"}
@@ -329,6 +329,9 @@ export const publicExportEntries = {
329
329
  MatrixTable: [
330
330
  "./data-table"
331
331
  ],
332
+ MediaAlbumPageStatus: [
333
+ "./screens"
334
+ ],
332
335
  MediaSelectionCell: [
333
336
  "./screen-flows"
334
337
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"public-exports.generated.js","sourceRoot":"","sources":["../src/public-exports.generated.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE;QACT,WAAW;KACZ;IACD,eAAe,EAAE;QACf,iBAAiB;KAClB;IACD,YAAY,EAAE;QACZ,iBAAiB;QACjB,YAAY;KACb;IACD,eAAe,EAAE;QACf,oBAAoB;KACrB;IACD,KAAK,EAAE;QACL,SAAS;KACV;IACD,SAAS,EAAE;QACT,aAAa;KACd;IACD,WAAW,EAAE;QACX,YAAY;KACb;IACD,MAAM,EAAE;QACN,UAAU;KACX;IACD,iBAAiB,EAAE;QACjB,oBAAoB;KACrB;IACD,WAAW,EAAE;QACX,UAAU;KACX;IACD,KAAK,EAAE;QACL,SAAS;KACV;IACD,UAAU,EAAE;QACV,SAAS;KACV;IACD,kBAAkB,EAAE;QAClB,mBAAmB;KACpB;IACD,gBAAgB,EAAE;QAChB,eAAe;KAChB;IACD,cAAc,EAAE;QACd,eAAe;KAChB;IACD,gBAAgB,EAAE;QAChB,eAAe;KAChB;IACD,MAAM,EAAE;QACN,WAAW;KACZ;IACD,WAAW,EAAE;QACX,WAAW;KACZ;IACD,KAAK,EAAE;QACL,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,SAAS;KACV;IACD,YAAY,EAAE;QACZ,mBAAmB;KACpB;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,UAAU,EAAE;QACV,eAAe;KAChB;IACD,gBAAgB,EAAE;QAChB,cAAc;KACf;IACD,6BAA6B,EAAE;QAC7B,cAAc;KACf;IACD,UAAU,EAAE;QACV,cAAc;QACd,cAAc;KACf;IACD,MAAM,EAAE;QACN,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,IAAI,EAAE;QACJ,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,WAAW,EAAE;QACX,eAAe;KAChB;IACD,WAAW,EAAE;QACX,SAAS;KACV;IACD,iBAAiB,EAAE;QACjB,WAAW;KACZ;IACD,WAAW,EAAE;QACX,WAAW;KACZ;IACD,UAAU,EAAE;QACV,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,aAAa;KACd;IACD,aAAa,EAAE;QACb,aAAa;KACd;IACD,IAAI,EAAE;QACJ,aAAa;KACd;IACD,eAAe,EAAE;QACf,aAAa;KACd;IACD,mBAAmB,EAAE;QACnB,aAAa;KACd;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,oBAAoB,EAAE;QACpB,kBAAkB;KACnB;IACD,WAAW,EAAE;QACX,eAAe;KAChB;IACD,iBAAiB,EAAE;QACjB,eAAe;KAChB;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,WAAW,EAAE;QACX,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,SAAS;KACV;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,mBAAmB,EAAE;QACnB,gBAAgB;KACjB;IACD,eAAe,EAAE;QACf,cAAc;KACf;IACD,iBAAiB,EAAE;QACjB,WAAW;KACZ;IACD,SAAS,EAAE;QACT,UAAU;KACX;IACD,iBAAiB,EAAE;QACjB,sBAAsB;KACvB;IACD,WAAW,EAAE;QACX,gBAAgB;KACjB;IACD,eAAe,EAAE;QACf,oBAAoB;KACrB;IACD,gBAAgB,EAAE;QAChB,kBAAkB;KACnB;IACD,iBAAiB,EAAE;QACjB,kBAAkB;KACnB;IACD,YAAY,EAAE;QACZ,WAAW;KACZ;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,UAAU,EAAE;QACV,eAAe;QACf,SAAS;KACV;IACD,eAAe,EAAE;QACf,cAAc;KACf;IACD,eAAe,EAAE;QACf,WAAW;KACZ;IACD,MAAM,EAAE;QACN,YAAY;KACb;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,gBAAgB,EAAE;QAChB,qBAAqB;KACtB;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,YAAY,EAAE;QACZ,gBAAgB;KACjB;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,UAAU,EAAE;QACV,YAAY;KACb;IACD,mBAAmB,EAAE;QACnB,uBAAuB;KACxB;IACD,gBAAgB,EAAE;QAChB,iBAAiB;KAClB;IACD,KAAK,EAAE;QACL,SAAS;KACV;IACD,UAAU,EAAE;QACV,eAAe;KAChB;IACD,UAAU,EAAE;QACV,eAAe;QACf,SAAS;KACV;IACD,cAAc,EAAE;QACd,sBAAsB;KACvB;IACD,oBAAoB,EAAE;QACpB,0BAA0B;KAC3B;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,iBAAiB,EAAE;QACjB,uBAAuB;KACxB;IACD,IAAI,EAAE;QACJ,SAAS;KACV;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,IAAI,EAAE;QACJ,UAAU;KACX;IACD,UAAU,EAAE;QACV,eAAe;KAChB;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,iBAAiB,EAAE;QACjB,kBAAkB;KACnB;IACD,WAAW,EAAE;QACX,YAAY;KACb;IACD,IAAI,EAAE;QACJ,WAAW;KACZ;IACD,UAAU,EAAE;QACV,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,WAAW;KACZ;IACD,KAAK,EAAE;QACL,WAAW;KACZ;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,eAAe,EAAE;QACf,oBAAoB;KACrB;IACD,gBAAgB,EAAE;QAChB,YAAY;KACb;IACD,kBAAkB,EAAE;QAClB,kBAAkB;KACnB;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,UAAU,EAAE;QACV,sBAAsB;KACvB;IACD,MAAM,EAAE;QACN,UAAU;KACX;IACD,SAAS,EAAE;QACT,SAAS;KACV;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,IAAI,EAAE;QACJ,WAAW;KACZ;IACD,IAAI,EAAE;QACJ,WAAW;KACZ;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,cAAc;KACf;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,WAAW,EAAE;QACX,cAAc;KACf;IACD,kBAAkB,EAAE;QAClB,gBAAgB;KACjB;IACD,oBAAoB,EAAE;QACpB,gBAAgB;KACjB;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,IAAI,EAAE;QACJ,YAAY;KACb;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,eAAe,EAAE;QACf,WAAW;KACZ;IACD,cAAc,EAAE;QACd,gBAAgB;KACjB;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,YAAY,EAAE;QACZ,cAAc;KACf;IACD,YAAY,EAAE;QACZ,SAAS;KACV;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,MAAM,EAAE;QACN,YAAY;KACb;IACD,gBAAgB,EAAE;QAChB,qBAAqB;KACtB;IACD,uBAAuB,EAAE;QACvB,WAAW;KACZ;IACD,gBAAgB,EAAE;QAChB,WAAW;KACZ;IACD,eAAe,EAAE;QACf,WAAW;KACZ;IACD,WAAW,EAAE;QACX,gBAAgB;QAChB,SAAS;KACV;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,aAAa;QACb,SAAS;KACV;IACD,oBAAoB,EAAE;QACpB,iBAAiB;KAClB;IACD,cAAc,EAAE;QACd,kBAAkB;KACnB;IACD,aAAa,EAAE;QACb,YAAY;KACb;IACD,UAAU,EAAE;QACV,cAAc;QACd,cAAc;KACf;IACD,aAAa,EAAE;QACb,kBAAkB;QAClB,SAAS;KACV;IACD,kBAAkB,EAAE;QAClB,iBAAiB;KAClB;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,gBAAgB,EAAE;QAChB,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,SAAS;KACV;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,aAAa,EAAE;QACb,iBAAiB;KAClB;IACD,aAAa,EAAE;QACb,gBAAgB;KACjB;IACD,cAAc,EAAE;QACd,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,eAAe,EAAE;QACf,oBAAoB;KACrB;IACD,MAAM,EAAE;QACN,WAAW;KACZ;IACD,UAAU,EAAE;QACV,SAAS;KACV;IACD,KAAK,EAAE;QACL,aAAa;KACd;IACD,UAAU,EAAE;QACV,aAAa;KACd;IACD,MAAM,EAAE;QACN,UAAU;KACX;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,oBAAoB,EAAE;QACpB,sBAAsB;KACvB;IACD,aAAa,EAAE;QACb,iBAAiB;KAClB;IACD,YAAY,EAAE;QACZ,iBAAiB;KAClB;IACD,MAAM,EAAE;QACN,YAAY;KACb;IACD,gBAAgB,EAAE;QAChB,eAAe;KAChB;IACD,YAAY,EAAE;QACZ,SAAS;KACV;IACD,YAAY,EAAE;QACZ,WAAW;KACZ;IACD,cAAc,EAAE;QACd,mBAAmB;KACpB;IACD,WAAW,EAAE;QACX,SAAS;KACV;IACD,YAAY,EAAE;QACZ,gBAAgB;KACjB;IACD,OAAO,EAAE;QACP,UAAU;KACX;IACD,gBAAgB,EAAE;QAChB,aAAa;KACd;IACD,MAAM,EAAE;QACN,SAAS;KACV;IACD,kBAAkB,EAAE;QAClB,sBAAsB;KACvB;IACD,cAAc,EAAE;QACd,WAAW;KACZ;IACD,KAAK,EAAE;QACL,YAAY;KACb;IACD,gBAAgB,EAAE;QAChB,mBAAmB;KACpB;IACD,OAAO,EAAE;QACP,WAAW;KACZ;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,OAAO,EAAE;QACP,YAAY;KACb;IACD,MAAM,EAAE;QACN,UAAU;QACV,SAAS;KACV;IACD,kBAAkB,EAAE;QAClB,YAAY;KACb;IACD,SAAS,EAAE;QACT,SAAS;KACV;IACD,OAAO,EAAE;QACP,YAAY;KACb;IACD,WAAW,EAAE;QACX,iBAAiB;KAClB;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,KAAK,EAAE;QACL,UAAU;KACX;IACD,SAAS,EAAE;QACT,WAAW;KACZ;IACD,cAAc,EAAE;QACd,WAAW;KACZ;IACD,UAAU,EAAE;QACV,eAAe;KAChB;IACD,UAAU,EAAE;QACV,eAAe;KAChB;IACD,KAAK,EAAE;QACL,SAAS;QACT,cAAc;KACf;IACD,eAAe,EAAE;QACf,oBAAoB;KACrB;IACD,OAAO,EAAE;QACP,UAAU;KACX;IACD,YAAY,EAAE;QACZ,iBAAiB;KAClB;IACD,MAAM,EAAE;QACN,aAAa;KACd;IACD,KAAK,EAAE;QACL,WAAW;KACZ;IACD,mBAAmB,EAAE;QACnB,sBAAsB;KACvB;IACD,QAAQ,EAAE;QACR,cAAc;KACf;IACD,IAAI,EAAE;QACJ,cAAc;KACf;IACD,GAAG,EAAE;QACH,WAAW;KACZ;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,aAAa,EAAE;QACb,kBAAkB;KACnB;IACD,QAAQ,EAAE;QACR,aAAa;KACd;IACD,IAAI,EAAE;QACJ,UAAU;KACX;IACD,QAAQ,EAAE;QACR,SAAS;KACV;IACD,SAAS,EAAE;QACT,SAAS;KACV;IACD,UAAU,EAAE;QACV,gBAAgB;KACjB;IACD,cAAc,EAAE;QACd,sBAAsB;KACvB;IACD,WAAW,EAAE;QACX,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,WAAW;KACZ;IACD,KAAK,EAAE;QACL,SAAS;KACV;IACD,aAAa,EAAE;QACb,SAAS;KACV;IACD,oBAAoB,EAAE;QACpB,mBAAmB;KACpB;IACD,WAAW,EAAE;QACX,gBAAgB;KACjB;IACD,OAAO,EAAE;QACP,YAAY;KACb;IACD,GAAG,EAAE;QACH,OAAO;KACR;IACD,MAAM,EAAE;QACN,WAAW;KACZ;IACD,IAAI,EAAE;QACJ,QAAQ;KACT;IACD,YAAY,EAAE;QACZ,iBAAiB;KAClB;IACD,YAAY,EAAE;QACZ,iBAAiB;KAClB;IACD,IAAI,EAAE;QACJ,QAAQ;KACT;IACD,eAAe,EAAE;QACf,WAAW;KACZ;IACD,UAAU,EAAE;QACV,eAAe;QACf,WAAW;KACZ;IACD,WAAW,EAAE;QACX,gBAAgB;KACjB;IACD,cAAc,EAAE;QACd,UAAU;KACX;IACD,SAAS,EAAE;QACT,cAAc;KACf;IACD,SAAS,EAAE;QACT,aAAa;KACd;CACoE,CAAC","sourcesContent":["// Generated by scripts/sync-public-component-map.mjs --write. Do not edit by hand.\n// Public value exports per symbol, canonical granular entry first (the root entry is omitted).\nexport const publicExportEntries = {\n Accordion: [\n \"./display\"\n ],\n AccountSwitcher: [\n \"./task-controls\"\n ],\n ActivityChip: [\n \"./activity-chip\",\n \"./feedback\"\n ],\n ActivityHeatmap: [\n \"./activity-heatmap\"\n ],\n Affix: [\n \"./affix\"\n ],\n Agreement: [\n \"./agreement\"\n ],\n AlertDialog: [\n \"./overlays\"\n ],\n Anchor: [\n \"./anchor\"\n ],\n AnimatedStatistic: [\n \"./statistic-motion\"\n ],\n AspectRatio: [\n \"./layout\"\n ],\n Asset: [\n \"./asset\"\n ],\n AssetGroup: [\n \"./asset\"\n ],\n AuthProviderButton: [\n \"./provider-button\"\n ],\n AuthScreenFooter: [\n \"./auth-screen\"\n ],\n AuthScreenHero: [\n \"./auth-screen\"\n ],\n AuthScreenLayout: [\n \"./auth-screen\"\n ],\n Avatar: [\n \"./display\"\n ],\n AvatarGroup: [\n \"./display\"\n ],\n Badge: [\n \"./display\"\n ],\n BarChart: [\n \"./chart\"\n ],\n BezierEditor: [\n \"./authoring-tools\"\n ],\n BottomCTA: [\n \"./bottom-cta\"\n ],\n BottomInfo: [\n \"./bottom-info\"\n ],\n BottomNavigation: [\n \"./navigation\"\n ],\n BottomNavigationInsetProvider: [\n \"./navigation\"\n ],\n Breadcrumb: [\n \"./breadcrumb\",\n \"./navigation\"\n ],\n Button: [\n \"./actions\"\n ],\n Calendar: [\n \"./calendar\"\n ],\n Card: [\n \"./display\"\n ],\n Carousel: [\n \"./carousel\"\n ],\n CarouselMotion: [\n \"./carousel-motion\"\n ],\n Celebration: [\n \"./celebration\"\n ],\n ChartLegend: [\n \"./chart\"\n ],\n ChatDateSeparator: [\n \"./screens\"\n ],\n ChatMessage: [\n \"./screens\"\n ],\n ChatScreen: [\n \"./screens\"\n ],\n Checkbox: [\n \"./selection\"\n ],\n CheckboxGroup: [\n \"./selection\"\n ],\n Chip: [\n \"./selection\"\n ],\n ClipboardButton: [\n \"./clipboard\"\n ],\n ClipboardIconButton: [\n \"./clipboard\"\n ],\n CodeBlock: [\n \"./code-block\"\n ],\n CohortRetentionTable: [\n \"./data-workflows\"\n ],\n Collapsible: [\n \"./collapsible\"\n ],\n CollapsibleMarker: [\n \"./collapsible\"\n ],\n CollectionRail: [\n \"./collection-rail\"\n ],\n ColorPicker: [\n \"./color-picker\"\n ],\n Combobox: [\n \"./forms\"\n ],\n CommandPalette: [\n \"./command-palette\"\n ],\n CommentThreadRow: [\n \"./screen-flows\"\n ],\n CommentThreadScreen: [\n \"./screen-flows\"\n ],\n ComparisonTable: [\n \"./data-table\"\n ],\n CompositionLayout: [\n \"./screens\"\n ],\n Container: [\n \"./layout\"\n ],\n ContentTransition: [\n \"./content-transition\"\n ],\n ContextMenu: [\n \"./context-menu\"\n ],\n ConversationRow: [\n \"./conversation-row\"\n ],\n ConversionFunnel: [\n \"./data-workflows\"\n ],\n CorrelationMatrix: [\n \"./data-workflows\"\n ],\n CounterBadge: [\n \"./display\"\n ],\n DataTable: [\n \"./data-table\"\n ],\n DateEntry: [\n \"./date-entry\"\n ],\n DatePicker: [\n \"./date-picker\",\n \"./forms\"\n ],\n DateRangePicker: [\n \"./date-range\"\n ],\n DescriptionList: [\n \"./display\"\n ],\n Dialog: [\n \"./overlays\"\n ],\n Divider: [\n \"./display\"\n ],\n DocumentResource: [\n \"./document-resource\"\n ],\n DurationField: [\n \"./duration-field\"\n ],\n EditorScreen: [\n \"./screen-flows\"\n ],\n EffectSurface: [\n \"./effect-surface\"\n ],\n EmptyState: [\n \"./feedback\"\n ],\n EventAttendanceCard: [\n \"./social-compositions\"\n ],\n ExpandableSearch: [\n \"./communication\"\n ],\n Field: [\n \"./forms\"\n ],\n FieldGroup: [\n \"./field-group\"\n ],\n FilePicker: [\n \"./file-picker\",\n \"./forms\"\n ],\n FilterRecovery: [\n \"./collection-editing\"\n ],\n FloatingActionButton: [\n \"./floating-action-button\"\n ],\n FolderPreview: [\n \"./folder-preview\"\n ],\n FollowProfileCard: [\n \"./social-compositions\"\n ],\n Form: [\n \"./forms\"\n ],\n GravityLetters: [\n \"./gravity-letters\"\n ],\n Grid: [\n \"./layout\"\n ],\n GridReveal: [\n \"./grid-reveal\"\n ],\n Heading: [\n \"./heading\"\n ],\n HistogramExplorer: [\n \"./data-workflows\"\n ],\n HjmProvider: [\n \"./provider\"\n ],\n Icon: [\n \"./display\"\n ],\n IconButton: [\n \"./actions\"\n ],\n IconTile: [\n \"./screens\"\n ],\n Image: [\n \"./display\"\n ],\n ImageChoiceGroup: [\n \"./image-choice\"\n ],\n ImageComparison: [\n \"./image-comparison\"\n ],\n ImmersiveOverlay: [\n \"./overlays\"\n ],\n ImportFieldMapping: [\n \"./data-workflows\"\n ],\n InlineConfirm: [\n \"./inline-confirm\"\n ],\n InlineEdit: [\n \"./collection-editing\"\n ],\n Layout: [\n \"./layout\"\n ],\n LineChart: [\n \"./chart\"\n ],\n LineScore: [\n \"./data-table\"\n ],\n Link: [\n \"./actions\"\n ],\n List: [\n \"./display\"\n ],\n ListDetailScreen: [\n \"./screen-flows\"\n ],\n ListRow: [\n \"./display\"\n ],\n LoadMore: [\n \"./navigation\"\n ],\n Masonry: [\n \"./masonry\"\n ],\n MatrixTable: [\n \"./data-table\"\n ],\n MediaSelectionCell: [\n \"./screen-flows\"\n ],\n MediaSelectionScreen: [\n \"./screen-flows\"\n ],\n MediaTransport: [\n \"./media-transport\"\n ],\n Mentions: [\n \"./mentions\"\n ],\n Menu: [\n \"./overlays\"\n ],\n Menubar: [\n \"./menubar\"\n ],\n MessageComposer: [\n \"./screens\"\n ],\n ModerationForm: [\n \"./screen-flows\"\n ],\n ModerationScreen: [\n \"./screen-flows\"\n ],\n MorphingMenu: [\n \"./menu-morph\"\n ],\n NativeSelect: [\n \"./forms\"\n ],\n NavigationBar: [\n \"./navigation-bar\"\n ],\n Notice: [\n \"./feedback\"\n ],\n NotificationBell: [\n \"./notification-bell\"\n ],\n NotificationInboxScreen: [\n \"./screens\"\n ],\n NotificationItem: [\n \"./screens\"\n ],\n NotificationRow: [\n \"./screens\"\n ],\n NumberField: [\n \"./number-field\",\n \"./forms\"\n ],\n OnboardingScreen: [\n \"./screen-flows\"\n ],\n OtpField: [\n \"./otp-field\",\n \"./forms\"\n ],\n OverlayStackProvider: [\n \"./overlay-stack\"\n ],\n OverviewScreen: [\n \"./design-profile\"\n ],\n PageIndicator: [\n \"./carousel\"\n ],\n Pagination: [\n \"./pagination\",\n \"./navigation\"\n ],\n PasswordField: [\n \"./password-field\",\n \"./forms\"\n ],\n PasswordRulesField: [\n \"./task-controls\"\n ],\n PermissionScreen: [\n \"./screen-flows\"\n ],\n PhotoSourceSheet: [\n \"./screen-flows\"\n ],\n PieChart: [\n \"./chart\"\n ],\n Popover: [\n \"./popover\"\n ],\n PricingChoice: [\n \"./task-controls\"\n ],\n ProfileScreen: [\n \"./screen-flows\"\n ],\n ProfileSummary: [\n \"./screen-flows\"\n ],\n Progress: [\n \"./feedback\"\n ],\n ProgressiveBlur: [\n \"./progressive-blur\"\n ],\n QRCode: [\n \"./qr-code\"\n ],\n RadarChart: [\n \"./chart\"\n ],\n Radio: [\n \"./selection\"\n ],\n RadioGroup: [\n \"./selection\"\n ],\n Rating: [\n \"./rating\"\n ],\n ReactionPicker: [\n \"./reaction-picker\"\n ],\n RepeatableFieldGroup: [\n \"./collection-editing\"\n ],\n ReplyComposer: [\n \"./communication\"\n ],\n ReplyMessage: [\n \"./communication\"\n ],\n Result: [\n \"./feedback\"\n ],\n SavedItemsScreen: [\n \"./saved-items\"\n ],\n ScatterChart: [\n \"./chart\"\n ],\n ScreenLayout: [\n \"./screens\"\n ],\n ScrollProgress: [\n \"./scroll-progress\"\n ],\n SearchField: [\n \"./forms\"\n ],\n SearchScreen: [\n \"./screen-flows\"\n ],\n Section: [\n \"./layout\"\n ],\n SegmentedControl: [\n \"./selection\"\n ],\n Select: [\n \"./forms\"\n ],\n SelectionActionBar: [\n \"./collection-editing\"\n ],\n SettingsScreen: [\n \"./screens\"\n ],\n Sheet: [\n \"./overlays\"\n ],\n ShortcutRecorder: [\n \"./authoring-tools\"\n ],\n Sidebar: [\n \"./sidebar\"\n ],\n SidePanel: [\n \"./side-panel\"\n ],\n Skeleton: [\n \"./feedback\"\n ],\n SkipNav: [\n \"./skip-nav\"\n ],\n Slider: [\n \"./slider\",\n \"./forms\"\n ],\n SortableCollection: [\n \"./sortable\"\n ],\n Sparkline: [\n \"./chart\"\n ],\n Spinner: [\n \"./feedback\"\n ],\n SplitAction: [\n \"./task-controls\"\n ],\n Splitter: [\n \"./splitter\"\n ],\n Stack: [\n \"./layout\"\n ],\n Statistic: [\n \"./display\"\n ],\n StatisticGroup: [\n \"./display\"\n ],\n StatusText: [\n \"./status-text\"\n ],\n StepPlayer: [\n \"./step-player\"\n ],\n Steps: [\n \"./steps\",\n \"./navigation\"\n ],\n StreamingAnswer: [\n \"./streaming-answer\"\n ],\n Surface: [\n \"./layout\"\n ],\n SwipeActions: [\n \"./swipe-actions\"\n ],\n Switch: [\n \"./selection\"\n ],\n Table: [\n \"./display\"\n ],\n TableColumnSettings: [\n \"./collection-editing\"\n ],\n TabPanel: [\n \"./navigation\"\n ],\n Tabs: [\n \"./navigation\"\n ],\n Tag: [\n \"./display\"\n ],\n TagsInput: [\n \"./tags-input\"\n ],\n TargetSummary: [\n \"./data-workflows\"\n ],\n TaskList: [\n \"./task-list\"\n ],\n Text: [\n \"./layout\"\n ],\n TextArea: [\n \"./forms\"\n ],\n TextField: [\n \"./forms\"\n ],\n TextFormat: [\n \"./text-formats\"\n ],\n TextTransition: [\n \"./content-transition\"\n ],\n ThinkingOrb: [\n \"./thinking-orb\"\n ],\n Timeline: [\n \"./display\"\n ],\n Toast: [\n \"./toast\"\n ],\n ToastProvider: [\n \"./toast\"\n ],\n ToggleFeedbackButton: [\n \"./toggle-feedback\"\n ],\n ToggleGroup: [\n \"./toggle-group\"\n ],\n Tooltip: [\n \"./overlays\"\n ],\n Top: [\n \"./top\"\n ],\n TopBar: [\n \"./top-bar\"\n ],\n Tour: [\n \"./tour\"\n ],\n TransferList: [\n \"./transfer-list\"\n ],\n TransferTask: [\n \"./transfer-task\"\n ],\n Tree: [\n \"./tree\"\n ],\n TypingIndicator: [\n \"./screens\"\n ],\n UploadItem: [\n \"./upload-item\",\n \"./display\"\n ],\n VirtualList: [\n \"./virtual-list\"\n ],\n VisuallyHidden: [\n \"./layout\"\n ],\n VoiceNote: [\n \"./voice-note\"\n ],\n Watermark: [\n \"./watermark\"\n ]\n} as const satisfies Readonly<Record<string, readonly `./${string}`[]>>;\n"]}
1
+ {"version":3,"file":"public-exports.generated.js","sourceRoot":"","sources":["../src/public-exports.generated.ts"],"names":[],"mappings":"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","sourcesContent":["// Generated by scripts/sync-public-component-map.mjs --write. Do not edit by hand.\n// Public value exports per symbol, canonical granular entry first (the root entry is omitted).\nexport const publicExportEntries = {\n Accordion: [\n \"./display\"\n ],\n AccountSwitcher: [\n \"./task-controls\"\n ],\n ActivityChip: [\n \"./activity-chip\",\n \"./feedback\"\n ],\n ActivityHeatmap: [\n \"./activity-heatmap\"\n ],\n Affix: [\n \"./affix\"\n ],\n Agreement: [\n \"./agreement\"\n ],\n AlertDialog: [\n \"./overlays\"\n ],\n Anchor: [\n \"./anchor\"\n ],\n AnimatedStatistic: [\n \"./statistic-motion\"\n ],\n AspectRatio: [\n \"./layout\"\n ],\n Asset: [\n \"./asset\"\n ],\n AssetGroup: [\n \"./asset\"\n ],\n AuthProviderButton: [\n \"./provider-button\"\n ],\n AuthScreenFooter: [\n \"./auth-screen\"\n ],\n AuthScreenHero: [\n \"./auth-screen\"\n ],\n AuthScreenLayout: [\n \"./auth-screen\"\n ],\n Avatar: [\n \"./display\"\n ],\n AvatarGroup: [\n \"./display\"\n ],\n Badge: [\n \"./display\"\n ],\n BarChart: [\n \"./chart\"\n ],\n BezierEditor: [\n \"./authoring-tools\"\n ],\n BottomCTA: [\n \"./bottom-cta\"\n ],\n BottomInfo: [\n \"./bottom-info\"\n ],\n BottomNavigation: [\n \"./navigation\"\n ],\n BottomNavigationInsetProvider: [\n \"./navigation\"\n ],\n Breadcrumb: [\n \"./breadcrumb\",\n \"./navigation\"\n ],\n Button: [\n \"./actions\"\n ],\n Calendar: [\n \"./calendar\"\n ],\n Card: [\n \"./display\"\n ],\n Carousel: [\n \"./carousel\"\n ],\n CarouselMotion: [\n \"./carousel-motion\"\n ],\n Celebration: [\n \"./celebration\"\n ],\n ChartLegend: [\n \"./chart\"\n ],\n ChatDateSeparator: [\n \"./screens\"\n ],\n ChatMessage: [\n \"./screens\"\n ],\n ChatScreen: [\n \"./screens\"\n ],\n Checkbox: [\n \"./selection\"\n ],\n CheckboxGroup: [\n \"./selection\"\n ],\n Chip: [\n \"./selection\"\n ],\n ClipboardButton: [\n \"./clipboard\"\n ],\n ClipboardIconButton: [\n \"./clipboard\"\n ],\n CodeBlock: [\n \"./code-block\"\n ],\n CohortRetentionTable: [\n \"./data-workflows\"\n ],\n Collapsible: [\n \"./collapsible\"\n ],\n CollapsibleMarker: [\n \"./collapsible\"\n ],\n CollectionRail: [\n \"./collection-rail\"\n ],\n ColorPicker: [\n \"./color-picker\"\n ],\n Combobox: [\n \"./forms\"\n ],\n CommandPalette: [\n \"./command-palette\"\n ],\n CommentThreadRow: [\n \"./screen-flows\"\n ],\n CommentThreadScreen: [\n \"./screen-flows\"\n ],\n ComparisonTable: [\n \"./data-table\"\n ],\n CompositionLayout: [\n \"./screens\"\n ],\n Container: [\n \"./layout\"\n ],\n ContentTransition: [\n \"./content-transition\"\n ],\n ContextMenu: [\n \"./context-menu\"\n ],\n ConversationRow: [\n \"./conversation-row\"\n ],\n ConversionFunnel: [\n \"./data-workflows\"\n ],\n CorrelationMatrix: [\n \"./data-workflows\"\n ],\n CounterBadge: [\n \"./display\"\n ],\n DataTable: [\n \"./data-table\"\n ],\n DateEntry: [\n \"./date-entry\"\n ],\n DatePicker: [\n \"./date-picker\",\n \"./forms\"\n ],\n DateRangePicker: [\n \"./date-range\"\n ],\n DescriptionList: [\n \"./display\"\n ],\n Dialog: [\n \"./overlays\"\n ],\n Divider: [\n \"./display\"\n ],\n DocumentResource: [\n \"./document-resource\"\n ],\n DurationField: [\n \"./duration-field\"\n ],\n EditorScreen: [\n \"./screen-flows\"\n ],\n EffectSurface: [\n \"./effect-surface\"\n ],\n EmptyState: [\n \"./feedback\"\n ],\n EventAttendanceCard: [\n \"./social-compositions\"\n ],\n ExpandableSearch: [\n \"./communication\"\n ],\n Field: [\n \"./forms\"\n ],\n FieldGroup: [\n \"./field-group\"\n ],\n FilePicker: [\n \"./file-picker\",\n \"./forms\"\n ],\n FilterRecovery: [\n \"./collection-editing\"\n ],\n FloatingActionButton: [\n \"./floating-action-button\"\n ],\n FolderPreview: [\n \"./folder-preview\"\n ],\n FollowProfileCard: [\n \"./social-compositions\"\n ],\n Form: [\n \"./forms\"\n ],\n GravityLetters: [\n \"./gravity-letters\"\n ],\n Grid: [\n \"./layout\"\n ],\n GridReveal: [\n \"./grid-reveal\"\n ],\n Heading: [\n \"./heading\"\n ],\n HistogramExplorer: [\n \"./data-workflows\"\n ],\n HjmProvider: [\n \"./provider\"\n ],\n Icon: [\n \"./display\"\n ],\n IconButton: [\n \"./actions\"\n ],\n IconTile: [\n \"./screens\"\n ],\n Image: [\n \"./display\"\n ],\n ImageChoiceGroup: [\n \"./image-choice\"\n ],\n ImageComparison: [\n \"./image-comparison\"\n ],\n ImmersiveOverlay: [\n \"./overlays\"\n ],\n ImportFieldMapping: [\n \"./data-workflows\"\n ],\n InlineConfirm: [\n \"./inline-confirm\"\n ],\n InlineEdit: [\n \"./collection-editing\"\n ],\n Layout: [\n \"./layout\"\n ],\n LineChart: [\n \"./chart\"\n ],\n LineScore: [\n \"./data-table\"\n ],\n Link: [\n \"./actions\"\n ],\n List: [\n \"./display\"\n ],\n ListDetailScreen: [\n \"./screen-flows\"\n ],\n ListRow: [\n \"./display\"\n ],\n LoadMore: [\n \"./navigation\"\n ],\n Masonry: [\n \"./masonry\"\n ],\n MatrixTable: [\n \"./data-table\"\n ],\n MediaAlbumPageStatus: [\n \"./screens\"\n ],\n MediaSelectionCell: [\n \"./screen-flows\"\n ],\n MediaSelectionScreen: [\n \"./screen-flows\"\n ],\n MediaTransport: [\n \"./media-transport\"\n ],\n Mentions: [\n \"./mentions\"\n ],\n Menu: [\n \"./overlays\"\n ],\n Menubar: [\n \"./menubar\"\n ],\n MessageComposer: [\n \"./screens\"\n ],\n ModerationForm: [\n \"./screen-flows\"\n ],\n ModerationScreen: [\n \"./screen-flows\"\n ],\n MorphingMenu: [\n \"./menu-morph\"\n ],\n NativeSelect: [\n \"./forms\"\n ],\n NavigationBar: [\n \"./navigation-bar\"\n ],\n Notice: [\n \"./feedback\"\n ],\n NotificationBell: [\n \"./notification-bell\"\n ],\n NotificationInboxScreen: [\n \"./screens\"\n ],\n NotificationItem: [\n \"./screens\"\n ],\n NotificationRow: [\n \"./screens\"\n ],\n NumberField: [\n \"./number-field\",\n \"./forms\"\n ],\n OnboardingScreen: [\n \"./screen-flows\"\n ],\n OtpField: [\n \"./otp-field\",\n \"./forms\"\n ],\n OverlayStackProvider: [\n \"./overlay-stack\"\n ],\n OverviewScreen: [\n \"./design-profile\"\n ],\n PageIndicator: [\n \"./carousel\"\n ],\n Pagination: [\n \"./pagination\",\n \"./navigation\"\n ],\n PasswordField: [\n \"./password-field\",\n \"./forms\"\n ],\n PasswordRulesField: [\n \"./task-controls\"\n ],\n PermissionScreen: [\n \"./screen-flows\"\n ],\n PhotoSourceSheet: [\n \"./screen-flows\"\n ],\n PieChart: [\n \"./chart\"\n ],\n Popover: [\n \"./popover\"\n ],\n PricingChoice: [\n \"./task-controls\"\n ],\n ProfileScreen: [\n \"./screen-flows\"\n ],\n ProfileSummary: [\n \"./screen-flows\"\n ],\n Progress: [\n \"./feedback\"\n ],\n ProgressiveBlur: [\n \"./progressive-blur\"\n ],\n QRCode: [\n \"./qr-code\"\n ],\n RadarChart: [\n \"./chart\"\n ],\n Radio: [\n \"./selection\"\n ],\n RadioGroup: [\n \"./selection\"\n ],\n Rating: [\n \"./rating\"\n ],\n ReactionPicker: [\n \"./reaction-picker\"\n ],\n RepeatableFieldGroup: [\n \"./collection-editing\"\n ],\n ReplyComposer: [\n \"./communication\"\n ],\n ReplyMessage: [\n \"./communication\"\n ],\n Result: [\n \"./feedback\"\n ],\n SavedItemsScreen: [\n \"./saved-items\"\n ],\n ScatterChart: [\n \"./chart\"\n ],\n ScreenLayout: [\n \"./screens\"\n ],\n ScrollProgress: [\n \"./scroll-progress\"\n ],\n SearchField: [\n \"./forms\"\n ],\n SearchScreen: [\n \"./screen-flows\"\n ],\n Section: [\n \"./layout\"\n ],\n SegmentedControl: [\n \"./selection\"\n ],\n Select: [\n \"./forms\"\n ],\n SelectionActionBar: [\n \"./collection-editing\"\n ],\n SettingsScreen: [\n \"./screens\"\n ],\n Sheet: [\n \"./overlays\"\n ],\n ShortcutRecorder: [\n \"./authoring-tools\"\n ],\n Sidebar: [\n \"./sidebar\"\n ],\n SidePanel: [\n \"./side-panel\"\n ],\n Skeleton: [\n \"./feedback\"\n ],\n SkipNav: [\n \"./skip-nav\"\n ],\n Slider: [\n \"./slider\",\n \"./forms\"\n ],\n SortableCollection: [\n \"./sortable\"\n ],\n Sparkline: [\n \"./chart\"\n ],\n Spinner: [\n \"./feedback\"\n ],\n SplitAction: [\n \"./task-controls\"\n ],\n Splitter: [\n \"./splitter\"\n ],\n Stack: [\n \"./layout\"\n ],\n Statistic: [\n \"./display\"\n ],\n StatisticGroup: [\n \"./display\"\n ],\n StatusText: [\n \"./status-text\"\n ],\n StepPlayer: [\n \"./step-player\"\n ],\n Steps: [\n \"./steps\",\n \"./navigation\"\n ],\n StreamingAnswer: [\n \"./streaming-answer\"\n ],\n Surface: [\n \"./layout\"\n ],\n SwipeActions: [\n \"./swipe-actions\"\n ],\n Switch: [\n \"./selection\"\n ],\n Table: [\n \"./display\"\n ],\n TableColumnSettings: [\n \"./collection-editing\"\n ],\n TabPanel: [\n \"./navigation\"\n ],\n Tabs: [\n \"./navigation\"\n ],\n Tag: [\n \"./display\"\n ],\n TagsInput: [\n \"./tags-input\"\n ],\n TargetSummary: [\n \"./data-workflows\"\n ],\n TaskList: [\n \"./task-list\"\n ],\n Text: [\n \"./layout\"\n ],\n TextArea: [\n \"./forms\"\n ],\n TextField: [\n \"./forms\"\n ],\n TextFormat: [\n \"./text-formats\"\n ],\n TextTransition: [\n \"./content-transition\"\n ],\n ThinkingOrb: [\n \"./thinking-orb\"\n ],\n Timeline: [\n \"./display\"\n ],\n Toast: [\n \"./toast\"\n ],\n ToastProvider: [\n \"./toast\"\n ],\n ToggleFeedbackButton: [\n \"./toggle-feedback\"\n ],\n ToggleGroup: [\n \"./toggle-group\"\n ],\n Tooltip: [\n \"./overlays\"\n ],\n Top: [\n \"./top\"\n ],\n TopBar: [\n \"./top-bar\"\n ],\n Tour: [\n \"./tour\"\n ],\n TransferList: [\n \"./transfer-list\"\n ],\n TransferTask: [\n \"./transfer-task\"\n ],\n Tree: [\n \"./tree\"\n ],\n TypingIndicator: [\n \"./screens\"\n ],\n UploadItem: [\n \"./upload-item\",\n \"./display\"\n ],\n VirtualList: [\n \"./virtual-list\"\n ],\n VisuallyHidden: [\n \"./layout\"\n ],\n VoiceNote: [\n \"./voice-note\"\n ],\n Watermark: [\n \"./watermark\"\n ]\n} as const satisfies Readonly<Record<string, readonly `./${string}`[]>>;\n"]}