@ai-matrx/rich-content 0.2.47 → 0.2.49

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.49
4
+
5
+ - The code block's HTML "Preview" button opens the `html` canvas kind with the source
6
+ (`{ type: "html", data, metadata: { title } }`) — the same frame every other "open HTML in
7
+ canvas" path uses — instead of publishing a page and opening the generic `iframe` web view.
8
+ It no longer needs a signed-in user or a page-service call.
9
+
10
+ Consumer action: none.
11
+
12
+ ## 0.2.48
13
+
14
+ - The copy commands and the document menu strip thinking with THE rule
15
+ (`stripThinking`, `@ai-matrx/content-ir/source`) instead of a static import of
16
+ `@ai-matrx/print/markdown`, which put KaTeX and an HTML parser on every first screen. The
17
+ formatted-HTML copy still loads print at click time.
18
+
3
19
  ## 0.2.47
4
20
 
5
21
  - The JSON value types and guards (`isJsonObject`, `isJsonArray`, `isJsonPrimitive`, `Json*`)
@@ -8,17 +8,15 @@ import {
8
8
  isKindJsonText,
9
9
  valueCarriesKind
10
10
  } from "@ai-matrx/content-ir/surfaces";
11
- import { extractErrorMessage } from "../utils/lifted/errors.js";
12
11
  import { cn } from "@ai-matrx/design-system";
13
12
  import SmallCodeEditor from "./SmallCodeEditor.js";
14
13
  import CodeBlockHeader from "./CodeBlockHeader.js";
15
14
  import { useThemeMode } from "../host/app-bindings.js";
16
15
  import StickyButtons from "./StickyButtons.js";
17
16
  import { useIsMobile } from "@ai-matrx/kit/media-query";
18
- import { hostHtmlPageService, useHostUser } from "../host/app-bindings.js";
19
17
  import { isCompleteHtmlDocument } from "../utils/lifted/html-document.js";
20
18
  import { codeLanguageToExtension } from "../utils/lifted/code-language-extension.js";
21
- import { Globe, Loader2 } from "lucide-react";
19
+ import { Globe } from "lucide-react";
22
20
  import { useCanvas } from "../host/app-bindings.js";
23
21
  import { toast } from "../host/toast.js";
24
22
  import { ShikiCodeView } from "./highlight/ShikiCodeView.js";
@@ -91,7 +89,6 @@ const CodeBlockBody = ({
91
89
  const [minimapEnabled, setMinimapEnabled] = useState(false);
92
90
  const [isTopInView, setIsTopInView] = useState(false);
93
91
  const [isBottomInView, setIsBottomInView] = useState(false);
94
- const [isCreatingPage, setIsCreatingPage] = useState(false);
95
92
  const [formatTrigger, setFormatTrigger] = useState(0);
96
93
  const openSmartCodeEditorWindow = useOpenSmartCodeEditorWindow();
97
94
  const bottomRef = useRef(null);
@@ -101,37 +98,15 @@ const CodeBlockBody = ({
101
98
  const showStickyButtons = isBottomInView && !isTopInView && !isEditing;
102
99
  const mode = useThemeMode();
103
100
  const isMobile = useIsMobile();
104
- const user = useHostUser();
105
101
  const { open: openCanvas } = useCanvas();
106
102
  const code = editedCode ?? initialCode;
107
103
  const isCompleteHTMLDocument = (htmlCode) => viewLanguage === "html" && isCompleteHtmlDocument(htmlCode);
108
- const handleViewHTML = async () => {
109
- if (!user?.id) {
110
- toast.error("You must be logged in to view HTML pages");
111
- return;
112
- }
113
- setIsCreatingPage(true);
114
- try {
115
- const result = await hostHtmlPageService().createPage(
116
- code,
117
- "HTML Preview",
118
- "Generated from code block",
119
- user.id
120
- );
121
- openCanvas({
122
- type: "iframe",
123
- data: result.url,
124
- metadata: {
125
- title: "HTML Preview",
126
- htmlPageId: result.pageId
127
- }
128
- });
129
- } catch (error) {
130
- console.error("Failed to create HTML page:", error);
131
- toast.error(`Failed to create HTML page: ${extractErrorMessage(error)}`);
132
- } finally {
133
- setIsCreatingPage(false);
134
- }
104
+ const handleViewHTML = () => {
105
+ openCanvas({
106
+ type: "html",
107
+ data: code,
108
+ metadata: { title: "HTML Preview" }
109
+ });
135
110
  };
136
111
  useEffect(() => {
137
112
  const observerOptions = {
@@ -315,7 +290,6 @@ const CodeBlockBody = ({
315
290
  isMobile,
316
291
  isCompleteHTML: isCompleteHTMLDocument(code),
317
292
  handleViewHTML,
318
- isCreatingPage,
319
293
  showWrapLines,
320
294
  handleFormat,
321
295
  handleReset,
@@ -389,11 +363,10 @@ const CodeBlockBody = ({
389
363
  highlightLines: fence.highlightLines
390
364
  }
391
365
  ),
392
- isCompleteHTMLDocument(code) && !isCollapsed && /* @__PURE__ */ jsx(
366
+ isCompleteHTMLDocument(code) && !isCollapsed && /* @__PURE__ */ jsxs(
393
367
  "button",
394
368
  {
395
369
  onClick: handleViewHTML,
396
- disabled: isCreatingPage,
397
370
  className: cn(
398
371
  "absolute bottom-4 right-4 z-20",
399
372
  "flex items-center gap-2 px-4 py-2 rounded-full",
@@ -401,17 +374,13 @@ const CodeBlockBody = ({
401
374
  "text-white text-sm font-medium",
402
375
  "shadow-lg hover:shadow-xl",
403
376
  "transition-all duration-200 ease-in-out",
404
- "transform hover:scale-105",
405
- isCreatingPage && "opacity-50 cursor-not-allowed"
377
+ "transform hover:scale-105"
406
378
  ),
407
379
  title: "Open HTML Preview in Canvas",
408
- children: isCreatingPage ? /* @__PURE__ */ jsxs(Fragment, { children: [
409
- /* @__PURE__ */ jsx(Loader2, { className: "w-4 h-4 animate-spin" }),
410
- /* @__PURE__ */ jsx("span", { children: "Creating..." })
411
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
380
+ children: [
412
381
  /* @__PURE__ */ jsx(Globe, { className: "w-4 h-4" }),
413
382
  /* @__PURE__ */ jsx("span", { children: "Preview" })
414
- ] })
383
+ ]
415
384
  }
416
385
  )
417
386
  ]
@@ -1,3 +1,3 @@
1
- export { removeThinkingContent } from "@ai-matrx/print/markdown";
1
+ export { stripThinking as removeThinkingContent } from "@ai-matrx/content-ir/source";
2
2
  /** The formatted HTML for a copy (loaded at click time), or `undefined` when this host writes plain text only. */
3
3
  export declare function formattedCopyHtml(markdown: string): Promise<string> | undefined;
@@ -1,8 +1,8 @@
1
- import { removeThinkingContent } from "@ai-matrx/print/markdown";
1
+ import { stripThinking } from "@ai-matrx/content-ir/source";
2
2
  function formattedCopyHtml(markdown) {
3
3
  return import("@ai-matrx/print/markdown").then(({ markdownToHtml }) => markdownToHtml(markdown));
4
4
  }
5
5
  export {
6
6
  formattedCopyHtml,
7
- removeThinkingContent
7
+ stripThinking as removeThinkingContent
8
8
  };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { ConfirmDialog as DesignSystemConfirmDialog } from "@ai-matrx/design-system";
3
- import { createElement } from "react";
3
+ import { createElement, lazy, Suspense } from "react";
4
4
  import { GenericStructuredView } from "@ai-matrx/content-ir-react";
5
5
  import { announceBareHost, BARE_HOST_ATTR, hostCapability } from "./registry.js";
6
6
  function binding(key) {
@@ -47,7 +47,17 @@ const getArtifactDef = fn("getArtifactDef", nothing, "no artifact types are know
47
47
  const resolveArtifactDef = fn("resolveArtifactDef", nothing, "no artifact types are known");
48
48
  const hasArtifactRenderer = fn("hasArtifactRenderer", () => false, "no artifact renderers are known");
49
49
  const ArtifactRender = component("ArtifactRender", ValueFloor, "artifacts render through the generic structured view");
50
- const CodeBlockWithContextAttach = component("CodeBlockWithContextAttach", null, "code blocks render without the attach-to-context action");
50
+ const LazyCodeBlock = lazy(() => import("../code-block/CodeBlock.js"));
51
+ function PlainCodeBlock(props) {
52
+ const { conversationId: _c, messageId: _m, existingArtifactId: _a, extraMenuItems: _e, ...rest } = props;
53
+ const code = typeof rest.code === "string" ? rest.code : "";
54
+ return createElement(
55
+ Suspense,
56
+ { fallback: createElement("pre", { ...BARE_HOST_ATTR, "data-code-block-loading": "" }, createElement("code", null, code)) },
57
+ createElement(LazyCodeBlock, rest)
58
+ );
59
+ }
60
+ const CodeBlockWithContextAttach = component("CodeBlockWithContextAttach", PlainCodeBlock, "code blocks render without the attach-to-context action");
51
61
  const useOpenConvertToShapeWindow = fn("useOpenConvertToShapeWindow", nothing, "no convert-to-shape window");
52
62
  const useOpenSmartCodeEditorWindow = fn("useOpenSmartCodeEditorWindow", nothing, "no code editor window");
53
63
  const useOpenTableViewerWindow = fn("useOpenTableViewerWindow", nothing, "no table viewer window");
@@ -5,7 +5,7 @@ import * as React from "react";
5
5
  import { ContentTransferMenu } from "@ai-matrx/alchemy/react/workspace";
6
6
  import { unwrapKindEnvelopes } from "@ai-matrx/content-ir/source";
7
7
  import { directSource } from "@ai-matrx/alchemy/operate";
8
- import { removeThinkingContent } from "@ai-matrx/print/markdown";
8
+ import { stripThinking as removeThinkingContent } from "@ai-matrx/content-ir/source";
9
9
  function AlchemyDocumentMenu({
10
10
  getCtx,
11
11
  sourceId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/rich-content",
3
- "version": "0.2.47",
3
+ "version": "0.2.49",
4
4
  "description": "The AI Matrx formatted-text engine: the one markdown renderer, streaming markdown, the block splitter and renderer, the generic blocks, <RichContent> levels, the rich-document action registry and menus, copy, and the selection toolbar — as portable React.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -130,21 +130,21 @@
130
130
  "unist-util-visit": "^5.1.0",
131
131
  "unist-util-visit-parents": "^6.0.2",
132
132
  "yaml": "^2.9.1",
133
+ "@ai-matrx/agents": "latest",
134
+ "@ai-matrx/alchemy": "latest",
133
135
  "@ai-matrx/canvas": "latest",
134
136
  "@ai-matrx/content-ir": "latest",
135
137
  "@ai-matrx/content-ir-react": "latest",
136
138
  "@ai-matrx/data": "latest",
137
- "@ai-matrx/alchemy": "latest",
138
139
  "@ai-matrx/design-system": "latest",
139
140
  "@ai-matrx/diff": "latest",
140
141
  "@ai-matrx/icons": "latest",
141
- "@ai-matrx/kit": "latest",
142
142
  "@ai-matrx/media": "latest",
143
143
  "@ai-matrx/print": "latest",
144
144
  "@ai-matrx/records": "latest",
145
145
  "@ai-matrx/records-ui": "latest",
146
146
  "@ai-matrx/tap-target": "latest",
147
- "@ai-matrx/agents": "latest"
147
+ "@ai-matrx/kit": "latest"
148
148
  },
149
149
  "peerDependencies": {
150
150
  "react": ">=19.0.0",