@anvia/react-ui 1.0.0-rc.6 → 1.0.0

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 (63) hide show
  1. package/README.md +48 -38
  2. package/dist/attachment/index.d.ts +2 -2
  3. package/dist/attachment/index.js +4 -4
  4. package/dist/chat/index.d.ts +8 -8
  5. package/dist/chat/index.js +10 -9
  6. package/dist/{chat-BRVgYE68.d.ts → chat-tfA570mg.d.ts} +2 -2
  7. package/dist/{chunk-ZDSFYPAG.js → chunk-647LAYRV.js} +90 -65
  8. package/dist/chunk-647LAYRV.js.map +1 -0
  9. package/dist/chunk-6XOJFLX4.js +22 -0
  10. package/dist/chunk-6XOJFLX4.js.map +1 -0
  11. package/dist/{chunk-CI7E67HQ.js → chunk-CRXNFZRW.js} +119 -90
  12. package/dist/chunk-CRXNFZRW.js.map +1 -0
  13. package/dist/{chunk-WIV5S327.js → chunk-CVXLQCDI.js} +13 -21
  14. package/dist/chunk-CVXLQCDI.js.map +1 -0
  15. package/dist/{chunk-ULGJLLZE.js → chunk-F6AKBUO3.js} +12 -12
  16. package/dist/chunk-F6AKBUO3.js.map +1 -0
  17. package/dist/{chunk-CBUEQW2Y.js → chunk-HWJIMLHC.js} +83 -77
  18. package/dist/chunk-HWJIMLHC.js.map +1 -0
  19. package/dist/{chunk-LAME27US.js → chunk-MISX4WUT.js} +10 -15
  20. package/dist/chunk-MISX4WUT.js.map +1 -0
  21. package/dist/{chunk-AFIEM7PA.js → chunk-OQE6SHZE.js} +16 -30
  22. package/dist/chunk-OQE6SHZE.js.map +1 -0
  23. package/dist/{chunk-7WKUHKCF.js → chunk-S4XLE2RN.js} +6 -12
  24. package/dist/chunk-S4XLE2RN.js.map +1 -0
  25. package/dist/{chunk-OAQBMWJ5.js → chunk-SOG2GVE4.js} +45 -15
  26. package/dist/chunk-SOG2GVE4.js.map +1 -0
  27. package/dist/{chunk-W6Q5UFKR.js → chunk-UCBAG42A.js} +9 -21
  28. package/dist/chunk-UCBAG42A.js.map +1 -0
  29. package/dist/completion/index.d.ts +2 -2
  30. package/dist/completion/index.js +4 -4
  31. package/dist/{composer-BTT2vzYF.d.ts → composer-CigccTLT.d.ts} +19 -7
  32. package/dist/human-input/index.d.ts +6 -6
  33. package/dist/human-input/index.js +4 -4
  34. package/dist/{human-input-DOBCZgqw.d.ts → human-input-D7jgYsfM.d.ts} +1 -1
  35. package/dist/image/index.d.ts +2 -2
  36. package/dist/image/index.js +4 -4
  37. package/dist/index.d.ts +14 -14
  38. package/dist/index.js +58 -63
  39. package/dist/index.js.map +1 -1
  40. package/dist/message/index.d.ts +4 -4
  41. package/dist/message/index.js +7 -6
  42. package/dist/selection-toolbar/index.d.ts +2 -2
  43. package/dist/selection-toolbar/index.js +5 -4
  44. package/dist/shared.d.ts +4 -4
  45. package/dist/shared.js +1 -1
  46. package/dist/stream/index.d.ts +2 -0
  47. package/dist/stream/index.js +1 -1
  48. package/dist/{thread-uEm8hH0s.d.ts → thread-Bz6-1zaJ.d.ts} +1 -0
  49. package/dist/thread-list/index.d.ts +3 -3
  50. package/dist/thread-list/index.js +6 -6
  51. package/package.json +7 -9
  52. package/dist/chunk-7WKUHKCF.js.map +0 -1
  53. package/dist/chunk-AFIEM7PA.js.map +0 -1
  54. package/dist/chunk-CBUEQW2Y.js.map +0 -1
  55. package/dist/chunk-CI7E67HQ.js.map +0 -1
  56. package/dist/chunk-LAME27US.js.map +0 -1
  57. package/dist/chunk-OAQBMWJ5.js.map +0 -1
  58. package/dist/chunk-ULGJLLZE.js.map +0 -1
  59. package/dist/chunk-W6Q5UFKR.js.map +0 -1
  60. package/dist/chunk-WIV5S327.js.map +0 -1
  61. package/dist/chunk-ZDSFYPAG.js.map +0 -1
  62. package/dist/stream/styles.css +0 -17
  63. package/dist/styles.css +0 -130
@@ -6,7 +6,7 @@ import {
6
6
  InternalImageProvider,
7
7
  useImage,
8
8
  useOptionalAttachment
9
- } from "./chunk-OAQBMWJ5.js";
9
+ } from "./chunk-SOG2GVE4.js";
10
10
 
11
11
  // src/image/parts.tsx
12
12
  import {
@@ -24,7 +24,9 @@ var ImageRoot = forwardRef(function ImageRoot2({ attachment: attachmentProp, chi
24
24
  const attachment = attachmentProp ?? attachmentContext?.attachment;
25
25
  const [zoomOpen, setZoomOpen] = useState(false);
26
26
  if (attachment === void 0) {
27
- throw new Error("Image.Root requires an attachment prop or Attachment context.");
27
+ throw new Error(
28
+ "ImagePrimitive.Root requires an attachment prop or AttachmentPrimitive context."
29
+ );
28
30
  }
29
31
  const src = imageSource(attachment);
30
32
  const isImage = isImageAttachment(attachment);
@@ -52,9 +54,7 @@ var ImageRoot = forwardRef(function ImageRoot2({ attachment: attachmentProp, chi
52
54
  /* @__PURE__ */ jsx(ImagePreview, {}),
53
55
  /* @__PURE__ */ jsx(ImageName, {})
54
56
  ] }),
55
- "data-anvia-image": "",
56
- "data-state": src === void 0 ? "unavailable" : "ready",
57
- "data-type": attachment.type
57
+ "data-state": src === void 0 ? "unavailable" : "ready"
58
58
  },
59
59
  ref
60
60
  ) });
@@ -73,12 +73,11 @@ var ImagePreview = forwardRef(function ImagePreview2({ alt, errorFallback, loadi
73
73
  {
74
74
  ...props,
75
75
  children: image.src === void 0 ? fallback : /* @__PURE__ */ jsxs(Fragment, { children: [
76
- state === "ready" ? null : /* @__PURE__ */ jsx("span", { "data-anvia-image-fallback": "", children: fallback }),
76
+ state === "ready" ? null : /* @__PURE__ */ jsx("span", { children: fallback }),
77
77
  /* @__PURE__ */ jsx(
78
78
  "img",
79
79
  {
80
80
  alt: alt ?? image.name ?? "Image",
81
- "data-anvia-image-img": "",
82
81
  hidden: state !== "ready",
83
82
  onError: () => setState("error"),
84
83
  onLoad: () => setState("ready"),
@@ -86,7 +85,6 @@ var ImagePreview = forwardRef(function ImagePreview2({ alt, errorFallback, loadi
86
85
  }
87
86
  )
88
87
  ] }),
89
- "data-anvia-image-preview": "",
90
88
  "data-state": state
91
89
  },
92
90
  ref
@@ -99,8 +97,7 @@ var ImageName = forwardRef(
99
97
  "figcaption",
100
98
  {
101
99
  ...props,
102
- children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,
103
- "data-anvia-image-name": ""
100
+ children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type
104
101
  },
105
102
  ref
106
103
  );
@@ -111,8 +108,7 @@ var ImageActions = forwardRef(
111
108
  return renderPrimitive(
112
109
  "div",
113
110
  {
114
- ...props,
115
- "data-anvia-image-actions": ""
111
+ ...props
116
112
  },
117
113
  ref
118
114
  );
@@ -145,7 +141,6 @@ var ImageCopy = forwardRef(function ImageCopy2({ onClick, ...props }, ref) {
145
141
  disabled,
146
142
  onClick: handleClick,
147
143
  type: props.type ?? "button",
148
- "data-anvia-image-copy": "",
149
144
  "data-state": copyState
150
145
  },
151
146
  ref
@@ -176,7 +171,6 @@ var ImageDownload = forwardRef(function ImageDownload2({ filename, onClick, ...p
176
171
  disabled,
177
172
  onClick: handleClick,
178
173
  type: props.type ?? "button",
179
- "data-anvia-image-download": "",
180
174
  "data-state": disabled ? "disabled" : "enabled"
181
175
  },
182
176
  ref
@@ -204,7 +198,6 @@ var ImageZoomTrigger = forwardRef(
204
198
  disabled,
205
199
  onClick: handleClick,
206
200
  type: props.type ?? "button",
207
- "data-anvia-image-zoom-trigger": "",
208
201
  "data-state": disabled ? "disabled" : "enabled"
209
202
  },
210
203
  ref
@@ -280,13 +273,12 @@ var ImageZoomOverlay = forwardRef(
280
273
  "div",
281
274
  {
282
275
  ...props,
283
- children: /* @__PURE__ */ jsx("img", { alt: image.name ?? "Image", "data-anvia-image-zoom-img": "", src: image.src }),
276
+ children: /* @__PURE__ */ jsx("img", { alt: image.name ?? "Image", src: image.src }),
284
277
  onClick: handleClick,
285
278
  onKeyDown: handleKeyDown,
286
279
  "aria-modal": props["aria-modal"] ?? true,
287
280
  role: props.role ?? "dialog",
288
- tabIndex: props.tabIndex ?? -1,
289
- "data-anvia-image-zoom-overlay": ""
281
+ tabIndex: props.tabIndex ?? -1
290
282
  },
291
283
  composedRef
292
284
  );
@@ -415,7 +407,7 @@ function focusableElements(container) {
415
407
  }
416
408
 
417
409
  // src/image/index.ts
418
- var Image = {
410
+ var ImagePrimitive = {
419
411
  Root: ImageRoot,
420
412
  Preview: ImagePreview,
421
413
  Name: ImageName,
@@ -427,6 +419,6 @@ var Image = {
427
419
  };
428
420
 
429
421
  export {
430
- Image
422
+ ImagePrimitive
431
423
  };
432
- //# sourceMappingURL=chunk-WIV5S327.js.map
424
+ //# sourceMappingURL=chunk-CVXLQCDI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image/parts.tsx","../src/image/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n type ImageContextValue,\n InternalImageProvider,\n useImage,\n useOptionalAttachment,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ImageRootChildren = ReactNode | ((image: ImageContextValue) => ReactNode);\ntype ImageRenderWhen = \"image\" | \"always\";\n\ntype ImageRootProps = Omit<PrimitiveProps<\"figure\">, \"children\"> & {\n attachment?: UIAttachment;\n children?: ImageRootChildren;\n renderWhen?: ImageRenderWhen;\n};\n\nconst ImageRoot = forwardRef<HTMLElement, ImageRootProps>(function ImageRoot(\n { attachment: attachmentProp, children, renderWhen = \"image\", ...props },\n ref,\n) {\n const attachmentContext = useOptionalAttachment();\n const attachment = attachmentProp ?? attachmentContext?.attachment;\n const [zoomOpen, setZoomOpen] = useState(false);\n\n if (attachment === undefined) {\n throw new Error(\n \"ImagePrimitive.Root requires an attachment prop or AttachmentPrimitive context.\",\n );\n }\n\n const src = imageSource(attachment);\n const isImage = isImageAttachment(attachment);\n const value = useMemo<ImageContextValue>(() => {\n const context: ImageContextValue = {\n attachment,\n isImage,\n zoomOpen,\n setZoomOpen,\n };\n if (src !== undefined) context.src = src;\n if (attachment.name !== undefined) context.name = attachment.name;\n if (attachment.mediaType !== undefined) context.mediaType = attachment.mediaType;\n return context;\n }, [attachment, attachment.mediaType, attachment.name, isImage, src, zoomOpen]);\n if (!isImage && renderWhen !== \"always\") {\n return null;\n }\n\n const renderedChildren = typeof children === \"function\" ? children(value) : children;\n\n return (\n <InternalImageProvider value={value}>\n {renderPrimitive(\n \"figure\",\n {\n ...props,\n children: renderedChildren ?? (\n <>\n <ImagePreview />\n <ImageName />\n </>\n ),\n \"data-state\": src === undefined ? \"unavailable\" : \"ready\",\n } as PrimitiveProps<\"figure\">,\n ref,\n )}\n </InternalImageProvider>\n );\n});\n\ntype ImagePreviewProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n alt?: string;\n errorFallback?: ReactNode;\n loadingFallback?: ReactNode;\n};\n\nconst ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(function ImagePreview(\n { alt, errorFallback, loadingFallback, ...props },\n ref,\n) {\n const image = useImage();\n const [state, setState] = useState<\"loading\" | \"ready\" | \"error\">(\n image.src === undefined ? \"error\" : \"loading\",\n );\n\n useEffect(() => {\n setState(image.src === undefined ? \"error\" : \"loading\");\n }, [image.src]);\n\n const fallback =\n state === \"loading\"\n ? (loadingFallback ?? \"Loading image\")\n : state === \"error\"\n ? (errorFallback ?? \"Image unavailable\")\n : null;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children:\n image.src === undefined ? (\n fallback\n ) : (\n <>\n {state === \"ready\" ? null : <span>{fallback}</span>}\n <img\n alt={alt ?? image.name ?? \"Image\"}\n hidden={state !== \"ready\"}\n onError={() => setState(\"error\")}\n onLoad={() => setState(\"ready\")}\n src={image.src}\n />\n </>\n ),\n \"data-state\": state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ImageName = forwardRef<HTMLElement, PrimitiveProps<\"figcaption\">>(\n function ImageName(props, ref) {\n const image = useImage();\n\n return renderPrimitive(\n \"figcaption\",\n {\n ...props,\n children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,\n } as PrimitiveProps<\"figcaption\">,\n ref,\n );\n },\n);\n\nconst ImageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ImageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ImageActionState = \"idle\" | \"done\" | \"error\";\n\nconst ImageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ImageCopy(\n { onClick, ...props },\n ref,\n) {\n const image = useImage();\n const [copyState, setCopyState] = useState<ImageActionState>(\"idle\");\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await copyImage(image);\n setCopyState(\"done\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ImageDownloadProps = PrimitiveProps<\"button\"> & {\n filename?: string;\n};\n\nconst ImageDownload = forwardRef<HTMLButtonElement, ImageDownloadProps>(function ImageDownload(\n { filename, onClick, ...props },\n ref,\n) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await downloadImage(image, filename);\n } catch {\n return;\n }\n },\n [disabled, filename, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Download\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst ImageZoomTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ImageZoomTrigger({ onClick, ...props }, ref) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n image.setZoomOpen(true);\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Open image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ImageZoomOverlayProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n container?: Element | DocumentFragment;\n};\n\nconst ImageZoomOverlay = forwardRef<HTMLDivElement, ImageZoomOverlayProps>(\n function ImageZoomOverlay({ container, onClick, onKeyDown, ...props }, ref) {\n const image = useImage();\n const portalContainer = container ?? globalThis.document?.body;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useMemo(() => composeRefs(overlayRef, ref), [ref]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [image.setZoomOpen, image.zoomOpen]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const activeElement = globalThis.document?.activeElement;\n const previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n focusOverlay(overlayRef.current);\n return () => {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus();\n }\n };\n }, [image.zoomOpen]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n image.setZoomOpen(false);\n }\n },\n [image, onClick],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n return;\n }\n if (event.key === \"Tab\") {\n trapOverlayFocus(event, overlayRef.current);\n }\n },\n [image, onKeyDown],\n );\n\n if (!image.zoomOpen || image.src === undefined || portalContainer === undefined) {\n return null;\n }\n\n const overlay = renderPrimitive(\n \"div\",\n {\n ...props,\n children: <img alt={image.name ?? \"Image\"} src={image.src} />,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"aria-modal\": props[\"aria-modal\"] ?? true,\n role: props.role ?? \"dialog\",\n tabIndex: props.tabIndex ?? -1,\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n\n return createPortal(overlay, portalContainer);\n },\n);\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction imageSource(attachment: UIAttachment): string | undefined {\n if (!isImageAttachment(attachment)) {\n return attachment.url;\n }\n if (attachment.url !== undefined) {\n return attachment.url;\n }\n if (attachment.data !== undefined && attachment.mediaType !== undefined) {\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n }\n return undefined;\n}\n\nasync function copyImage(image: ImageContextValue): Promise<void> {\n if (image.src === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const clipboard = globalThis.navigator?.clipboard as\n | (Clipboard & { write?: (items: ClipboardItem[]) => Promise<void> })\n | undefined;\n const ClipboardItemConstructor = globalThis.ClipboardItem;\n if (clipboard?.write === undefined || ClipboardItemConstructor === undefined) {\n throw new Error(\"Clipboard image copy is unavailable.\");\n }\n const blob = await imageBlob(image);\n await clipboard.write([new ClipboardItemConstructor({ [blob.type]: blob })]);\n}\n\nasync function imageBlob(image: ImageContextValue): Promise<Blob> {\n if (image.attachment.data !== undefined) {\n return base64ToBlob(\n image.attachment.data,\n image.attachment.mediaType ?? image.mediaType ?? \"image/png\",\n );\n }\n if (image.src === undefined || globalThis.fetch === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const response = await fetch(image.src);\n return response.blob();\n}\n\nfunction base64ToBlob(data: string, mediaType: string): Blob {\n const binary = globalThis.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mediaType });\n}\n\nasync function downloadImage(\n image: ImageContextValue,\n filename: string | undefined,\n): Promise<void> {\n const document = globalThis.document;\n const url = globalThis.URL;\n if (image.src === undefined || document === undefined || url?.createObjectURL === undefined) {\n return;\n }\n const blobUrl = url.createObjectURL(await imageBlob(image));\n const link = document.createElement(\"a\");\n try {\n link.href = blobUrl;\n link.download = filename ?? image.name ?? defaultImageFilename(image);\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n } finally {\n link.remove();\n url.revokeObjectURL(blobUrl);\n }\n}\n\nfunction defaultImageFilename(image: ImageContextValue): string {\n const extension = image.mediaType?.split(\"/\")[1]?.split(\";\")[0] ?? \"png\";\n return `image.${extension}`;\n}\n\nfunction focusOverlay(overlay: HTMLDivElement | null): void {\n if (overlay === null) {\n return;\n }\n const [firstFocusable] = focusableElements(overlay);\n (firstFocusable ?? overlay).focus();\n}\n\nfunction trapOverlayFocus(\n event: KeyboardEvent<HTMLDivElement>,\n overlay: HTMLDivElement | null,\n): void {\n if (overlay === null) {\n return;\n }\n const focusable = focusableElements(overlay);\n if (focusable.length === 0) {\n event.preventDefault();\n overlay.focus();\n return;\n }\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n const activeElement = globalThis.document?.activeElement;\n if (event.shiftKey && activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable?.focus();\n return;\n }\n if (!event.shiftKey && activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable?.focus();\n return;\n }\n if (activeElement instanceof Node && !overlay.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? lastFocusable : firstFocusable)?.focus();\n }\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(\n [\n \"a[href]\",\n \"button:not(:disabled)\",\n \"input:not(:disabled)\",\n \"select:not(:disabled)\",\n \"textarea:not(:disabled)\",\n \"[tabindex]\",\n ].join(\",\"),\n ),\n ).filter((element) => element.tabIndex >= 0 && element.getAttribute(\"aria-hidden\") !== \"true\");\n}\n\nexport {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n};\n","import {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n} from \"./parts\";\n\nexport const ImagePrimitive = {\n Root: ImageRoot,\n Preview: ImagePreview,\n Name: ImageName,\n Actions: ImageActions,\n Copy: ImageCopy,\n Download: ImageDownload,\n ZoomTrigger: ImageZoomTrigger,\n ZoomOverlay: ImageZoomOverlay,\n} as const;\n\nexport type { ImageContextValue } from \"../contexts\";\nexport { useImage } from \"../contexts\";\n"],"mappings":"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","names":["ImageRoot","ImagePreview","ImageName","ImageActions","ImageCopy","ImageDownload","ImageZoomTrigger","ImageZoomOverlay","handleKeyDown"]}
@@ -165,10 +165,10 @@ function wrapStreamRevealGraphemes(targets, graphemes, lifecycleScope, lifecycle
165
165
  type: "element",
166
166
  tagName: "span",
167
167
  properties: {
168
- "data-anvia-stream-duration-ms": String(remainingMs),
169
- "data-anvia-stream-opacity": String(opacity),
170
- "data-anvia-stream-reveal": "",
171
- "data-anvia-stream-reveal-id": revealId
168
+ "data-reveal-duration-ms": String(remainingMs),
169
+ "data-reveal-opacity": String(opacity),
170
+ "data-reveal-id": revealId,
171
+ "data-state": "revealing"
172
172
  },
173
173
  children: [{ type: "text", value: text }]
174
174
  });
@@ -293,8 +293,8 @@ var StreamMarkdown = forwardRef(
293
293
  },
294
294
  block.startOffset
295
295
  )),
296
- "data-anvia-stream-markdown": "",
297
- "data-live": live ? "" : void 0
296
+ "data-role": "markdown",
297
+ "data-state": props["data-state"] ?? (live ? "streaming" : "idle")
298
298
  },
299
299
  ref
300
300
  );
@@ -323,7 +323,7 @@ function withStreamRevealComponent(components, onRevealSettled) {
323
323
  span(spanProps) {
324
324
  const safeProps = componentPropsWithoutKey(spanProps);
325
325
  const internalProps = safeProps;
326
- if (internalProps["data-anvia-stream-reveal"] !== void 0) {
326
+ if (internalProps["data-state"] === "revealing") {
327
327
  return streamRevealSpan(internalProps, onRevealSettled);
328
328
  }
329
329
  if (consumerSpan !== void 0) {
@@ -347,9 +347,9 @@ function streamRevealSpan(props, onRevealSettled) {
347
347
  const {
348
348
  children,
349
349
  node: _node,
350
- "data-anvia-stream-duration-ms": durationMs,
351
- "data-anvia-stream-opacity": opacity,
352
- "data-anvia-stream-reveal-id": revealId,
350
+ "data-reveal-duration-ms": durationMs,
351
+ "data-reveal-opacity": opacity,
352
+ "data-reveal-id": revealId,
353
353
  onAnimationEnd,
354
354
  ...elementProps
355
355
  } = props;
@@ -359,7 +359,7 @@ function streamRevealSpan(props, onRevealSettled) {
359
359
  "span",
360
360
  {
361
361
  ...elementProps,
362
- "data-anvia-stream-reveal-id": revealId,
362
+ "data-state": "revealing",
363
363
  key: revealId ?? "stream-reveal",
364
364
  onAnimationEnd: (event) => {
365
365
  onAnimationEnd?.(event);
@@ -377,4 +377,4 @@ function streamRevealSpan(props, onRevealSettled) {
377
377
  export {
378
378
  StreamMarkdown
379
379
  };
380
- //# sourceMappingURL=chunk-ULGJLLZE.js.map
380
+ //# sourceMappingURL=chunk-F6AKBUO3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stream/markdown.tsx","../src/stream/markdown-blocks.ts","../src/stream/markdown-reveal.ts"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n createElement,\n forwardRef,\n memo,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport ReactMarkdown, {\n type Components,\n type Options as ReactMarkdownOptions,\n} from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { splitStreamMarkdownBlocks } from \"./markdown-blocks\";\nimport { createStreamGradientRevealPlugin, type StreamRevealLifecycle } from \"./markdown-reveal\";\n\nexport type StreamMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n \"data-state\"?: string | undefined;\n components?: Components;\n content: string;\n live?: boolean;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n remarkRehypeOptions?: ReactMarkdownOptions[\"remarkRehypeOptions\"];\n};\n\nconst defaultRemarkPlugins: NonNullable<ReactMarkdownOptions[\"remarkPlugins\"]> = [remarkGfm];\n\nexport const StreamMarkdown = forwardRef<HTMLDivElement, StreamMarkdownProps>(\n function StreamMarkdown(\n { components, content, live = false, remarkPlugins, remarkRehypeOptions, ...props },\n ref,\n ) {\n const revealLifecycleRef = useRef({\n activeScope: null,\n content,\n id: 0,\n settledRevealIds: new Set<string>(),\n startedAtByRevealId: new Map<string, number>(),\n } satisfies StreamRevealLifecycle & { content: string; id: number });\n const revealLifecycle = revealLifecycleRef.current;\n if (revealLifecycle.content !== content) {\n if (!content.startsWith(revealLifecycle.content)) {\n revealLifecycle.id += 1;\n revealLifecycle.activeScope = null;\n revealLifecycle.settledRevealIds.clear();\n revealLifecycle.startedAtByRevealId.clear();\n }\n revealLifecycle.content = content;\n }\n if (!live && revealLifecycle.activeScope !== null) {\n for (const revealId of revealLifecycle.startedAtByRevealId.keys()) {\n revealLifecycle.settledRevealIds.add(revealId);\n }\n }\n const settleReveal = useCallback((revealId: string) => {\n revealLifecycleRef.current.settledRevealIds.add(revealId);\n }, []);\n\n const blocks = useMemo(\n () =>\n splitStreamMarkdownBlocks(content, {\n singleDocument: remarkPlugins !== undefined,\n }),\n [content, remarkPlugins],\n );\n const streamingComponents = useMemo(\n () => withStreamRevealComponent(components, settleReveal),\n [components, settleReveal],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: blocks.map((block, index) => (\n <StreamMarkdownBlock\n components={streamingComponents}\n content={block.content}\n live={live && index === blocks.length - 1}\n revealLifecycle={revealLifecycle}\n revealScope={`${revealLifecycle.id}:${block.startOffset}`}\n remarkPlugins={remarkPlugins ?? defaultRemarkPlugins}\n remarkRehypeOptions={remarkRehypeOptions}\n key={block.startOffset}\n />\n )),\n \"data-role\": \"markdown\",\n \"data-state\": props[\"data-state\"] ?? (live ? \"streaming\" : \"idle\"),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst StreamMarkdownBlock = memo(function StreamMarkdownBlock(props: {\n components: Components;\n content: string;\n live: boolean;\n revealLifecycle: StreamRevealLifecycle;\n revealScope: string;\n remarkPlugins: ReactMarkdownOptions[\"remarkPlugins\"];\n remarkRehypeOptions: ReactMarkdownOptions[\"remarkRehypeOptions\"];\n}) {\n const revealPlugin = useMemo(\n () => createStreamGradientRevealPlugin(props.revealScope, props.revealLifecycle),\n [props.revealScope, props.revealLifecycle],\n );\n return (\n <ReactMarkdown\n components={props.components}\n rehypePlugins={props.live ? [revealPlugin] : undefined}\n remarkPlugins={props.remarkPlugins}\n remarkRehypeOptions={props.remarkRehypeOptions}\n >\n {props.content}\n </ReactMarkdown>\n );\n});\n\nfunction withStreamRevealComponent(\n components: Components | undefined,\n onRevealSettled: (revealId: string) => void,\n): Components {\n const consumerSpan = components?.span;\n return {\n ...components,\n span(spanProps) {\n const safeProps = componentPropsWithoutKey(spanProps);\n const internalProps = safeProps as typeof safeProps & {\n \"data-reveal-duration-ms\"?: string | undefined;\n \"data-reveal-opacity\"?: string | undefined;\n \"data-reveal-id\"?: string | undefined;\n \"data-state\"?: string | undefined;\n };\n if (internalProps[\"data-state\"] === \"revealing\") {\n return streamRevealSpan(internalProps, onRevealSettled);\n }\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, safeProps);\n }\n const { node: _node, ...elementProps } = safeProps;\n return <span {...elementProps} />;\n },\n };\n}\n\nfunction componentPropsWithoutKey<T extends object>(props: T): T {\n const result: Record<string, unknown> = {};\n for (const name of Object.keys(props)) {\n if (name !== \"key\") {\n result[name] = (props as Record<string, unknown>)[name];\n }\n }\n return result as T;\n}\n\nfunction streamRevealSpan(\n props: ComponentPropsWithoutRef<\"span\"> & {\n node?: unknown;\n \"data-reveal-duration-ms\"?: string | undefined;\n \"data-reveal-opacity\"?: string | undefined;\n \"data-reveal-id\"?: string | undefined;\n },\n onRevealSettled: (revealId: string) => void,\n): ReactNode {\n const {\n children,\n node: _node,\n \"data-reveal-duration-ms\": durationMs,\n \"data-reveal-opacity\": opacity,\n \"data-reveal-id\": revealId,\n onAnimationEnd,\n ...elementProps\n } = props;\n const parsedOpacity = Number(opacity);\n const parsedDurationMs = Number(durationMs);\n return (\n <span\n {...elementProps}\n data-state=\"revealing\"\n key={revealId ?? \"stream-reveal\"}\n onAnimationEnd={(event) => {\n onAnimationEnd?.(event);\n if (revealId !== undefined) onRevealSettled(revealId);\n }}\n style={\n {\n \"--anvia-stream-reveal-opacity\": Number.isFinite(parsedOpacity) ? parsedOpacity : 1,\n \"--anvia-stream-reveal-duration\": `${Number.isFinite(parsedDurationMs) ? parsedDurationMs : 180}ms`,\n } as CSSProperties\n }\n >\n {children}\n </span>\n );\n}\n","import { lexer } from \"marked\";\n\nexport type StreamMarkdownBlock = {\n content: string;\n startOffset: number;\n};\n\nexport function splitStreamMarkdownBlocks(\n content: string,\n options: { singleDocument?: boolean } = {},\n): StreamMarkdownBlock[] {\n if (content.length === 0) {\n return [];\n }\n if (options.singleDocument === true) {\n return [{ content, startOffset: 0 }];\n }\n\n try {\n const tokens = lexer(content, { gfm: false });\n if (tokens.some((token) => token.type === \"def\") || Object.keys(tokens.links).length > 0) {\n return [{ content, startOffset: 0 }];\n }\n\n const rawBlocks: string[] = [];\n for (const token of tokens) {\n if (token.type === \"space\" && rawBlocks.length > 0) {\n const lastIndex = rawBlocks.length - 1;\n rawBlocks[lastIndex] = `${rawBlocks[lastIndex] ?? \"\"}${token.raw}`;\n } else {\n rawBlocks.push(token.raw);\n }\n }\n\n if (rawBlocks.length === 0 || rawBlocks.join(\"\") !== content) {\n return [{ content, startOffset: 0 }];\n }\n\n let startOffset = 0;\n return rawBlocks.map((block) => {\n const result = { content: block, startOffset };\n startOffset += block.length;\n return result;\n });\n } catch {\n return [{ content, startOffset: 0 }];\n }\n}\n","export const streamRevealConfig = {\n bandGraphemes: 2,\n durationMs: 180,\n minimumOpacity: 0.12,\n tailGraphemes: 24,\n} as const;\n\nexport type StreamRevealLifecycle = {\n activeScope: string | null;\n settledRevealIds: Set<string>;\n startedAtByRevealId: Map<string, number>;\n};\n\ntype MarkdownNode = {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: MarkdownNode[];\n};\n\ntype TextTarget = {\n endOffset: number;\n index: number;\n node: MarkdownNode;\n parent: MarkdownNode;\n startOffset: number;\n};\n\ntype RevealGrapheme = {\n endOffset: number;\n opacity: number;\n startOffset: number;\n};\n\nexport function createStreamGradientRevealPlugin(\n lifecycleScope: string,\n lifecycle: StreamRevealLifecycle,\n) {\n return function streamGradientRevealPlugin() {\n return (tree: MarkdownNode) => {\n if (lifecycle.activeScope !== lifecycleScope) {\n lifecycle.activeScope = lifecycleScope;\n lifecycle.settledRevealIds.clear();\n lifecycle.startedAtByRevealId.clear();\n }\n const targets = collectTextTargets(tree);\n const renderedText = targets.map((target) => target.node.value ?? \"\").join(\"\");\n const graphemes = createRevealGraphemes(renderedText);\n wrapStreamRevealGraphemes(targets, graphemes, lifecycleScope, lifecycle);\n };\n };\n}\n\nfunction collectTextTargets(tree: MarkdownNode): TextTarget[] {\n const targets: TextTarget[] = [];\n let offset = 0;\n\n function visit(node: MarkdownNode, parent: MarkdownNode | undefined, index: number): void {\n if (node.type === \"element\" && node.tagName === \"pre\") {\n return;\n }\n if (node.type === \"text\" && node.value !== undefined && parent !== undefined) {\n if (!/\\S/u.test(node.value)) {\n return;\n }\n const startOffset = offset;\n offset += node.value.length;\n targets.push({\n endOffset: offset,\n index,\n node,\n parent,\n startOffset,\n });\n return;\n }\n for (const [childIndex, child] of (node.children ?? []).entries()) {\n visit(child, node, childIndex);\n }\n }\n\n visit(tree, undefined, 0);\n return targets;\n}\n\nfunction createRevealGraphemes(content: string): RevealGrapheme[] {\n const tail = segmentTailGraphemeRanges(content, streamRevealConfig.tailGraphemes);\n const graphemes: RevealGrapheme[] = [];\n\n for (let index = 0; index < tail.length; index += 1) {\n const grapheme = tail[index];\n const bandStartIndex =\n Math.floor(index / streamRevealConfig.bandGraphemes) * streamRevealConfig.bandGraphemes;\n const bandEndIndex =\n Math.min(bandStartIndex + streamRevealConfig.bandGraphemes, tail.length) - 1;\n if (grapheme === undefined) {\n continue;\n }\n const progress = tail.length === 1 ? 1 : bandEndIndex / (tail.length - 1);\n graphemes.push({\n startOffset: grapheme.startOffset,\n endOffset: grapheme.endOffset,\n opacity: Math.max(\n streamRevealConfig.minimumOpacity,\n 1 - progress * (1 - streamRevealConfig.minimumOpacity),\n ),\n });\n }\n return graphemes;\n}\n\nfunction wrapStreamRevealGraphemes(\n targets: readonly TextTarget[],\n graphemes: readonly RevealGrapheme[],\n lifecycleScope: string,\n lifecycle: StreamRevealLifecycle,\n): void {\n const activeRevealIds = new Set<string>();\n const nowMs = Date.now();\n for (const target of [...targets].reverse()) {\n const value = target.node.value ?? \"\";\n const intersectingGraphemes = graphemes.filter(\n (grapheme) =>\n grapheme.endOffset > target.startOffset && grapheme.startOffset < target.endOffset,\n );\n if (intersectingGraphemes.length === 0) {\n continue;\n }\n\n const replacement: MarkdownNode[] = [];\n let cursor = 0;\n for (const grapheme of intersectingGraphemes) {\n const start = Math.max(0, grapheme.startOffset - target.startOffset);\n const end = Math.min(value.length, grapheme.endOffset - target.startOffset);\n if (start > cursor) {\n replacement.push({ type: \"text\", value: value.slice(cursor, start) });\n }\n if (end > start) {\n const text = value.slice(start, end);\n const absoluteStart = target.startOffset + start;\n const absoluteEnd = target.startOffset + end;\n const revealId = `${lifecycleScope}:${absoluteStart}:${absoluteEnd}:${hashText(text)}`;\n activeRevealIds.add(revealId);\n const startedAt = lifecycle.startedAtByRevealId.get(revealId) ?? nowMs;\n lifecycle.startedAtByRevealId.set(revealId, startedAt);\n const elapsedMs = Math.max(0, nowMs - startedAt);\n if (elapsedMs >= streamRevealConfig.durationMs) {\n lifecycle.settledRevealIds.add(revealId);\n }\n if (lifecycle.settledRevealIds.has(revealId)) {\n replacement.push({ type: \"text\", value: text });\n } else {\n const progress = Math.min(elapsedMs / streamRevealConfig.durationMs, 1);\n const opacity = grapheme.opacity + (1 - grapheme.opacity) * progress;\n const remainingMs = Math.max(1, streamRevealConfig.durationMs - elapsedMs);\n replacement.push({\n type: \"element\",\n tagName: \"span\",\n properties: {\n \"data-reveal-duration-ms\": String(remainingMs),\n \"data-reveal-opacity\": String(opacity),\n \"data-reveal-id\": revealId,\n \"data-state\": \"revealing\",\n },\n children: [{ type: \"text\", value: text }],\n });\n }\n }\n cursor = Math.max(cursor, end);\n }\n if (cursor < value.length) {\n replacement.push({ type: \"text\", value: value.slice(cursor) });\n }\n target.parent.children?.splice(target.index, 1, ...replacement);\n }\n\n pruneRevealLifecycle(lifecycle, activeRevealIds);\n}\n\nfunction pruneRevealLifecycle(\n lifecycle: StreamRevealLifecycle,\n activeRevealIds: ReadonlySet<string>,\n): void {\n for (const revealId of lifecycle.startedAtByRevealId.keys()) {\n if (!activeRevealIds.has(revealId)) lifecycle.startedAtByRevealId.delete(revealId);\n }\n for (const revealId of lifecycle.settledRevealIds) {\n if (!activeRevealIds.has(revealId)) lifecycle.settledRevealIds.delete(revealId);\n }\n}\n\nfunction hashText(text: string): string {\n let hash = 2_166_136_261;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 16_777_619);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction segmentTailGraphemeRanges(\n content: string,\n limit: number,\n): Array<{\n endOffset: number;\n startOffset: number;\n}> {\n if (typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\") {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n const segments = segmenter.segment(content);\n const ranges: Array<{ endOffset: number; startOffset: number }> = [];\n let cursor = content.length;\n while (cursor > 0 && ranges.length < limit) {\n const segment = segments.containing(cursor - 1);\n if (segment === undefined) {\n break;\n }\n ranges.unshift({\n startOffset: segment.index,\n endOffset: segment.index + segment.segment.length,\n });\n cursor = segment.index;\n }\n return ranges;\n }\n\n const ranges: Array<{ endOffset: number; startOffset: number }> = [];\n let cursor = content.length;\n while (cursor > 0 && ranges.length < limit) {\n let startOffset = cursor - 1;\n const code = content.charCodeAt(startOffset);\n if (code >= 0xdc00 && code <= 0xdfff && startOffset > 0) {\n const previousCode = content.charCodeAt(startOffset - 1);\n if (previousCode >= 0xd800 && previousCode <= 0xdbff) {\n startOffset -= 1;\n }\n }\n ranges.unshift({ startOffset, endOffset: cursor });\n cursor = startOffset;\n }\n return ranges;\n}\n"],"mappings":"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","names":["ranges","cursor","createElement","StreamMarkdown","StreamMarkdownBlock"]}