@@ -252,6 +252,7 @@ describe("tool-cards", () => {
252252 expect ( rawToggle ! . getAttribute ( "aria-expanded" ) ) . toBe ( "true" ) ;
253253 expect ( rawBody ! . hidden ) . toBe ( false ) ;
254254 expect ( rawBody ! . querySelector ( ".chat-tool-card__block-label" ) ?. textContent ) . toBe ( "Tool output" ) ;
255+ expect ( rawBody ! . querySelector ( "code.markdown-block-art" ) ) . toBeNull ( ) ;
255256 expect ( JSON . parse ( rawBody ! . querySelector ( "code" ) ?. textContent ?? "{}" ) ) . toEqual ( {
256257 kind : "canvas" ,
257258 presentation : {
@@ -267,6 +268,36 @@ describe("tool-cards", () => {
267268 } ) ;
268269 } ) ;
269270
271+ it ( "marks expanded raw block-art output so QR whitespace uses block-art rendering" , ( ) => {
272+ const container = document . createElement ( "div" ) ;
273+ const blockArt = " ▄▄▄▄▄▄▄ \n █ ▄▄▄ █ \n █▄▄▄▄▄█ " ;
274+ render (
275+ renderToolCard (
276+ {
277+ id : "msg:view:block-art" ,
278+ name : "canvas_render" ,
279+ outputText : blockArt ,
280+ preview : {
281+ kind : "canvas" ,
282+ surface : "assistant_message" ,
283+ render : "url" ,
284+ viewId : "qr_preview" ,
285+ url : "/__openclaw__/canvas/documents/qr_preview/index.html" ,
286+ } ,
287+ } ,
288+ { expanded : true , onToggleExpanded : vi . fn ( ) } ,
289+ ) ,
290+ container ,
291+ ) ;
292+
293+ const rawToggle = container . querySelector < HTMLButtonElement > ( ".chat-tool-card__raw-toggle" ) ;
294+ rawToggle ! . dispatchEvent ( new MouseEvent ( "click" , { bubbles : true } ) ) ;
295+
296+ const code = container . querySelector ( "code.markdown-block-art" ) ;
297+ expect ( code ) . not . toBeNull ( ) ;
298+ expect ( code ?. textContent ) . toBe ( blockArt ) ;
299+ } ) ;
300+
270301 it ( "opens assistant-surface canvas payloads in the sidebar when explicitly requested" , ( ) => {
271302 const container = document . createElement ( "div" ) ;
272303 const onOpenSidebar = vi . fn ( ) ;
0 commit comments