From bd35e774cb01286ed6f597341ba2af89c5af42ea Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Wed, 20 Nov 2024 09:50:30 -0500 Subject: [PATCH] feat(chat): Use `wrap: pre` so that "text" messages appear as-written --- js/chat/chat.scss | 8 ++++++++ shiny/www/py-shiny/chat/chat.css | 2 +- shiny/www/py-shiny/chat/chat.css.map | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/js/chat/chat.scss b/js/chat/chat.scss index 640823bf1..6bfed2427 100644 --- a/js/chat/chat.scss +++ b/js/chat/chat.scss @@ -52,6 +52,14 @@ shiny-chat-container { } } + shiny-user-message, + shiny-chat-message { + &[content_type="text"] { + white-space: pre; + overflow-x: auto; + } + } + shiny-chat-input { margin-top: auto; position: sticky; diff --git a/shiny/www/py-shiny/chat/chat.css b/shiny/www/py-shiny/chat/chat.css index f53c00888..2a7ae2076 100644 --- a/shiny/www/py-shiny/chat/chat.css +++ b/shiny/www/py-shiny/chat/chat.css @@ -1,2 +1,2 @@ -shiny-chat-container{--shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);--shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), .06);display:flex;flex-direction:column;margin:0 auto;gap:1rem;overflow:auto;padding:.25rem}shiny-chat-container p:last-child{margin-bottom:0}shiny-chat-container shiny-chat-messages{display:flex;flex-direction:column;gap:2rem}shiny-chat-container shiny-chat-messages shiny-chat-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:1rem}shiny-chat-container shiny-chat-messages shiny-chat-message>*{height:fit-content}shiny-chat-container shiny-chat-messages shiny-chat-message .message-icon{border-radius:50%;border:var(--shiny-chat-border)}shiny-chat-container shiny-chat-messages shiny-chat-message .message-icon>*{margin:.5rem;height:20px;width:20px}shiny-chat-container shiny-chat-messages shiny-chat-message .message-content{align-self:center}shiny-chat-container shiny-chat-messages shiny-user-message{align-self:flex-end;padding:.75rem 1rem;border-radius:10px;background-color:var(--shiny-chat-user-message-bg);max-width:100%}shiny-chat-container shiny-chat-input{margin-top:auto;position:sticky;background-color:var(--bs-body-bg, white);bottom:0}shiny-chat-container shiny-chat-input textarea{--bs-border-radius: 26px;resize:none;padding-right:36px!important;max-height:175px}shiny-chat-container shiny-chat-input textarea::placeholder{color:var(--bs-gray-600, #707782)!important}shiny-chat-container shiny-chat-input button{position:absolute;bottom:7px;right:8px;background-color:transparent;color:var(--bs-primary, #007bc2);transition:color .25s ease-in-out;border:none;padding:0;cursor:pointer;line-height:16px;border-radius:50%}shiny-chat-container shiny-chat-input button:disabled{cursor:not-allowed;color:var(--bs-gray-500, #8d959e)}.shiny-busy:has(shiny-chat-input[disabled]):after{display:none}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}pre:has(> code.hljs){color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#a626a4}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#50a14f}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#986801}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}[data-bs-theme=dark] pre code.hljs{display:block;overflow-x:auto;padding:1em}[data-bs-theme=dark] code.hljs{padding:3px 5px}[data-bs-theme=dark] pre:has(> code.hljs){color:#abb2bf;background:#282c34}[data-bs-theme=dark] .hljs-comment,[data-bs-theme=dark] .hljs-quote{color:#5c6370;font-style:italic}[data-bs-theme=dark] .hljs-doctag,[data-bs-theme=dark] .hljs-keyword,[data-bs-theme=dark] .hljs-formula{color:#c678dd}[data-bs-theme=dark] .hljs-section,[data-bs-theme=dark] .hljs-name,[data-bs-theme=dark] .hljs-selector-tag,[data-bs-theme=dark] .hljs-deletion,[data-bs-theme=dark] .hljs-subst{color:#e06c75}[data-bs-theme=dark] .hljs-literal{color:#56b6c2}[data-bs-theme=dark] .hljs-string,[data-bs-theme=dark] .hljs-regexp,[data-bs-theme=dark] .hljs-addition,[data-bs-theme=dark] .hljs-attribute,[data-bs-theme=dark] .hljs-meta .hljs-string{color:#98c379}[data-bs-theme=dark] .hljs-attr,[data-bs-theme=dark] .hljs-variable,[data-bs-theme=dark] .hljs-template-variable,[data-bs-theme=dark] .hljs-type,[data-bs-theme=dark] .hljs-selector-class,[data-bs-theme=dark] .hljs-selector-attr,[data-bs-theme=dark] .hljs-selector-pseudo,[data-bs-theme=dark] .hljs-number{color:#d19a66}[data-bs-theme=dark] .hljs-symbol,[data-bs-theme=dark] .hljs-bullet,[data-bs-theme=dark] .hljs-link,[data-bs-theme=dark] .hljs-meta,[data-bs-theme=dark] .hljs-selector-id,[data-bs-theme=dark] .hljs-title{color:#61aeee}[data-bs-theme=dark] .hljs-built_in,[data-bs-theme=dark] .hljs-title.class_,[data-bs-theme=dark] .hljs-class .hljs-title{color:#e6c07b}[data-bs-theme=dark] .hljs-emphasis{font-style:italic}[data-bs-theme=dark] .hljs-strong{font-weight:700}[data-bs-theme=dark] .hljs-link{text-decoration:underline}pre:has(.code-copy-button){position:relative}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:transparent}.code-copy-button>.bi{display:flex;gap:.25em}.code-copy-button>.bi:after{content:"";display:block;height:1rem;width:1rem;mask-image:url('data:image/svg+xml,');background-color:var(--bs-body-color, #222)}.code-copy-button-checked>.bi:before{content:"Copied!";font-size:.75em;vertical-align:.25em}.code-copy-button-checked>.bi:after{mask-image:url('data:image/svg+xml,');background-color:var(--bs-success, #198754)} +shiny-chat-container{--shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);--shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), .06);display:flex;flex-direction:column;margin:0 auto;gap:1rem;overflow:auto;padding:.25rem}shiny-chat-container p:last-child{margin-bottom:0}shiny-chat-container shiny-chat-messages{display:flex;flex-direction:column;gap:2rem}shiny-chat-container shiny-chat-messages shiny-chat-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:1rem}shiny-chat-container shiny-chat-messages shiny-chat-message>*{height:fit-content}shiny-chat-container shiny-chat-messages shiny-chat-message .message-icon{border-radius:50%;border:var(--shiny-chat-border)}shiny-chat-container shiny-chat-messages shiny-chat-message .message-icon>*{margin:.5rem;height:20px;width:20px}shiny-chat-container shiny-chat-messages shiny-chat-message .message-content{align-self:center}shiny-chat-container shiny-chat-messages shiny-user-message{align-self:flex-end;padding:.75rem 1rem;border-radius:10px;background-color:var(--shiny-chat-user-message-bg);max-width:100%}shiny-chat-container shiny-user-message[content_type=text],shiny-chat-container shiny-chat-message[content_type=text]{white-space:pre;overflow-x:auto}shiny-chat-container shiny-chat-input{margin-top:auto;position:sticky;background-color:var(--bs-body-bg, white);bottom:0}shiny-chat-container shiny-chat-input textarea{--bs-border-radius: 26px;resize:none;padding-right:36px!important;max-height:175px}shiny-chat-container shiny-chat-input textarea::placeholder{color:var(--bs-gray-600, #707782)!important}shiny-chat-container shiny-chat-input button{position:absolute;bottom:7px;right:8px;background-color:transparent;color:var(--bs-primary, #007bc2);transition:color .25s ease-in-out;border:none;padding:0;cursor:pointer;line-height:16px;border-radius:50%}shiny-chat-container shiny-chat-input button:disabled{cursor:not-allowed;color:var(--bs-gray-500, #8d959e)}.shiny-busy:has(shiny-chat-input[disabled]):after{display:none}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}pre:has(> code.hljs){color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#a626a4}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#50a14f}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#986801}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}[data-bs-theme=dark] pre code.hljs{display:block;overflow-x:auto;padding:1em}[data-bs-theme=dark] code.hljs{padding:3px 5px}[data-bs-theme=dark] pre:has(> code.hljs){color:#abb2bf;background:#282c34}[data-bs-theme=dark] .hljs-comment,[data-bs-theme=dark] .hljs-quote{color:#5c6370;font-style:italic}[data-bs-theme=dark] .hljs-doctag,[data-bs-theme=dark] .hljs-keyword,[data-bs-theme=dark] .hljs-formula{color:#c678dd}[data-bs-theme=dark] .hljs-section,[data-bs-theme=dark] .hljs-name,[data-bs-theme=dark] .hljs-selector-tag,[data-bs-theme=dark] .hljs-deletion,[data-bs-theme=dark] .hljs-subst{color:#e06c75}[data-bs-theme=dark] .hljs-literal{color:#56b6c2}[data-bs-theme=dark] .hljs-string,[data-bs-theme=dark] .hljs-regexp,[data-bs-theme=dark] .hljs-addition,[data-bs-theme=dark] .hljs-attribute,[data-bs-theme=dark] .hljs-meta .hljs-string{color:#98c379}[data-bs-theme=dark] .hljs-attr,[data-bs-theme=dark] .hljs-variable,[data-bs-theme=dark] .hljs-template-variable,[data-bs-theme=dark] .hljs-type,[data-bs-theme=dark] .hljs-selector-class,[data-bs-theme=dark] .hljs-selector-attr,[data-bs-theme=dark] .hljs-selector-pseudo,[data-bs-theme=dark] .hljs-number{color:#d19a66}[data-bs-theme=dark] .hljs-symbol,[data-bs-theme=dark] .hljs-bullet,[data-bs-theme=dark] .hljs-link,[data-bs-theme=dark] .hljs-meta,[data-bs-theme=dark] .hljs-selector-id,[data-bs-theme=dark] .hljs-title{color:#61aeee}[data-bs-theme=dark] .hljs-built_in,[data-bs-theme=dark] .hljs-title.class_,[data-bs-theme=dark] .hljs-class .hljs-title{color:#e6c07b}[data-bs-theme=dark] .hljs-emphasis{font-style:italic}[data-bs-theme=dark] .hljs-strong{font-weight:700}[data-bs-theme=dark] .hljs-link{text-decoration:underline}pre:has(.code-copy-button){position:relative}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:transparent}.code-copy-button>.bi{display:flex;gap:.25em}.code-copy-button>.bi:after{content:"";display:block;height:1rem;width:1rem;mask-image:url('data:image/svg+xml,');background-color:var(--bs-body-color, #222)}.code-copy-button-checked>.bi:before{content:"Copied!";font-size:.75em;vertical-align:.25em}.code-copy-button-checked>.bi:after{mask-image:url('data:image/svg+xml,');background-color:var(--bs-success, #198754)} /*# sourceMappingURL=chat.css.map */ diff --git a/shiny/www/py-shiny/chat/chat.css.map b/shiny/www/py-shiny/chat/chat.css.map index 383c722c1..23996bdb9 100644 --- a/shiny/www/py-shiny/chat/chat.css.map +++ b/shiny/www/py-shiny/chat/chat.css.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../../js/chat/chat.scss"], - "sourcesContent": ["/************************************************************\n From ../node_modules/highlight.js/styles/atom-one-light.css\n with minor adjustments\n************************************************************/\n/************************************************************\n From ../node_modules/highlight.js/styles/atom-one-dark.css\n with minor adjustments\n************************************************************/\nshiny-chat-container {\n --shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);\n --shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), 0.06);\n display: flex;\n flex-direction: column;\n margin: 0 auto;\n gap: 1rem;\n overflow: auto;\n padding: 0.25rem;\n}\nshiny-chat-container p:last-child {\n margin-bottom: 0;\n}\nshiny-chat-container shiny-chat-messages {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n /* Align the user message to the right */\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 1rem;\n /* Vertically center the 2nd column (message content) */\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message > * {\n height: fit-content;\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-icon {\n border-radius: 50%;\n border: var(--shiny-chat-border);\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-icon > * {\n margin: 0.5rem;\n height: 20px;\n width: 20px;\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-content {\n align-self: center;\n}\nshiny-chat-container shiny-chat-messages shiny-user-message {\n align-self: flex-end;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n background-color: var(--shiny-chat-user-message-bg);\n max-width: 100%;\n}\nshiny-chat-container shiny-chat-input {\n margin-top: auto;\n position: sticky;\n background-color: var(--bs-body-bg, white);\n bottom: 0;\n}\nshiny-chat-container shiny-chat-input textarea {\n --bs-border-radius: 26px;\n resize: none;\n padding-right: 36px !important;\n max-height: 175px;\n}\nshiny-chat-container shiny-chat-input textarea::placeholder {\n color: var(--bs-gray-600, #707782) !important;\n}\nshiny-chat-container shiny-chat-input button {\n position: absolute;\n bottom: 7px;\n right: 8px;\n background-color: transparent;\n color: var(--bs-primary, #007bc2);\n transition: color 0.25s ease-in-out;\n border: none;\n padding: 0;\n cursor: pointer;\n line-height: 16px;\n border-radius: 50%;\n}\nshiny-chat-container shiny-chat-input button:disabled {\n cursor: not-allowed;\n color: var(--bs-gray-500, #8d959e);\n}\n\n/*\n Disable the page-level pulse when the chat input is disabled\n (i.e., when a response is being generated and brought into the chat)\n*/\n.shiny-busy:has(shiny-chat-input[disabled])::after {\n display: none;\n}\n\n/* Code highlighting (for both light and dark mode) */\npre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\n\ncode.hljs {\n padding: 3px 5px;\n}\n\n/*\n\nAtom One Light by Daniel Gamage\nOriginal One Light Syntax theme from https://github.com/atom/one-light-syntax\n\nbase: #fafafa\nmono-1: #383a42\nmono-2: #686b77\nmono-3: #a0a1a7\nhue-1: #0184bb\nhue-2: #4078f2\nhue-3: #a626a4\nhue-4: #50a14f\nhue-5: #e45649\nhue-5-2: #c91243\nhue-6: #986801\nhue-6-2: #c18401\n\n*/\npre:has(> code.hljs) {\n color: #383a42;\n background: #fafafa;\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #a0a1a7;\n font-style: italic;\n}\n\n.hljs-doctag,\n.hljs-keyword,\n.hljs-formula {\n color: #a626a4;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-selector-tag,\n.hljs-deletion,\n.hljs-subst {\n color: #e45649;\n}\n\n.hljs-literal {\n color: #0184bb;\n}\n\n.hljs-string,\n.hljs-regexp,\n.hljs-addition,\n.hljs-attribute,\n.hljs-meta .hljs-string {\n color: #50a14f;\n}\n\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-type,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-number {\n color: #986801;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-meta,\n.hljs-selector-id,\n.hljs-title {\n color: #4078f2;\n}\n\n.hljs-built_in,\n.hljs-title.class_,\n.hljs-class .hljs-title {\n color: #c18401;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n\n.hljs-link {\n text-decoration: underline;\n}\n\n[data-bs-theme=dark] {\n /*\n\n Atom One Dark by Daniel Gamage\n Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax\n\n base: #282c34\n mono-1: #abb2bf\n mono-2: #818896\n mono-3: #5c6370\n hue-1: #56b6c2\n hue-2: #61aeee\n hue-3: #c678dd\n hue-4: #98c379\n hue-5: #e06c75\n hue-5-2: #be5046\n hue-6: #d19a66\n hue-6-2: #e6c07b\n\n */\n}\n[data-bs-theme=dark] pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\n[data-bs-theme=dark] code.hljs {\n padding: 3px 5px;\n}\n[data-bs-theme=dark] pre:has(> code.hljs) {\n color: #abb2bf;\n background: #282c34;\n}\n[data-bs-theme=dark] .hljs-comment,\n[data-bs-theme=dark] .hljs-quote {\n color: #5c6370;\n font-style: italic;\n}\n[data-bs-theme=dark] .hljs-doctag,\n[data-bs-theme=dark] .hljs-keyword,\n[data-bs-theme=dark] .hljs-formula {\n color: #c678dd;\n}\n[data-bs-theme=dark] .hljs-section,\n[data-bs-theme=dark] .hljs-name,\n[data-bs-theme=dark] .hljs-selector-tag,\n[data-bs-theme=dark] .hljs-deletion,\n[data-bs-theme=dark] .hljs-subst {\n color: #e06c75;\n}\n[data-bs-theme=dark] .hljs-literal {\n color: #56b6c2;\n}\n[data-bs-theme=dark] .hljs-string,\n[data-bs-theme=dark] .hljs-regexp,\n[data-bs-theme=dark] .hljs-addition,\n[data-bs-theme=dark] .hljs-attribute,\n[data-bs-theme=dark] .hljs-meta .hljs-string {\n color: #98c379;\n}\n[data-bs-theme=dark] .hljs-attr,\n[data-bs-theme=dark] .hljs-variable,\n[data-bs-theme=dark] .hljs-template-variable,\n[data-bs-theme=dark] .hljs-type,\n[data-bs-theme=dark] .hljs-selector-class,\n[data-bs-theme=dark] .hljs-selector-attr,\n[data-bs-theme=dark] .hljs-selector-pseudo,\n[data-bs-theme=dark] .hljs-number {\n color: #d19a66;\n}\n[data-bs-theme=dark] .hljs-symbol,\n[data-bs-theme=dark] .hljs-bullet,\n[data-bs-theme=dark] .hljs-link,\n[data-bs-theme=dark] .hljs-meta,\n[data-bs-theme=dark] .hljs-selector-id,\n[data-bs-theme=dark] .hljs-title {\n color: #61aeee;\n}\n[data-bs-theme=dark] .hljs-built_in,\n[data-bs-theme=dark] .hljs-title.class_,\n[data-bs-theme=dark] .hljs-class .hljs-title {\n color: #e6c07b;\n}\n[data-bs-theme=dark] .hljs-emphasis {\n font-style: italic;\n}\n[data-bs-theme=dark] .hljs-strong {\n font-weight: bold;\n}\n[data-bs-theme=dark] .hljs-link {\n text-decoration: underline;\n}\n\n/*\n Styling for the code-copy button (inspired by Quarto's code-copy feature)\n*/\npre:has(.code-copy-button) {\n position: relative;\n}\n\n.code-copy-button {\n position: absolute;\n top: 0;\n right: 0;\n border: 0;\n margin-top: 5px;\n margin-right: 5px;\n background-color: transparent;\n}\n.code-copy-button > .bi {\n display: flex;\n gap: 0.25em;\n}\n.code-copy-button > .bi::after {\n content: \"\";\n display: block;\n height: 1rem;\n width: 1rem;\n mask-image: url('data:image/svg+xml,');\n background-color: var(--bs-body-color, #222);\n}\n\n.code-copy-button-checked > .bi::before {\n content: \"Copied!\";\n font-size: 0.75em;\n vertical-align: 0.25em;\n}\n.code-copy-button-checked > .bi::after {\n mask-image: url('data:image/svg+xml,');\n background-color: var(--bs-success, #198754);\n}"], - "mappings": "AAQA,qBACE,uFACA,4EACA,aACA,sBAZF,cAcE,SACA,cAfF,eAkBA,kCACE,gBAEF,yCACE,aACA,sBACA,SAGF,4DACE,aACA,yCACA,SAGF,8DACE,mBAEF,0EApCA,kBAsCE,gCAEF,4EAxCA,aA0CE,YACA,WAEF,6EACE,kBAEF,4DACE,oBAjDF,uCAoDE,mDACA,eAEF,sCACE,gBACA,gBACA,0CACA,SAEF,+CACE,yBACA,YACA,6BACA,iBAEF,4DACE,4CAEF,6CACE,kBACA,WACA,UACA,6BACA,iCACA,kCACA,YA7EF,UA+EE,eACA,iBAhFF,kBAmFA,sDACE,mBACA,kCAOF,kDACE,aAIF,cACE,cACA,gBAnGF,YAuGA,UAvGA,gBA8HA,qBACE,cACA,mBAGF,0BAEE,cACA,kBAGF,yCAGE,cAGF,uEAKE,cAGF,cACE,cAGF,iFAKE,cAGF,yIAQE,cAGF,8EAME,cAGF,0DAGE,cAGF,eACE,kBAGF,aACE,gBAGF,WACE,0BAwBF,mCACE,cACA,gBAhOF,YAmOA,+BAnOA,gBAsOA,0CACE,cACA,mBAEF,oEAEE,cACA,kBAEF,wGAGE,cAEF,gLAKE,cAEF,mCACE,cAEF,0LAKE,cAEF,iTAQE,cAEF,4MAME,cAEF,yHAGE,cAEF,oCACE,kBAEF,kCACE,gBAEF,gCACE,0BAMF,2BACE,kBAGF,kBACE,kBACA,MACA,QACA,SACA,eACA,iBACA,6BAEF,sBACE,aACA,UAEF,4BACE,WACA,cACA,YACA,WACA,ufACA,4CAGF,qCACE,kBACA,gBACA,qBAEF,oCACE,6RACA", + "sourcesContent": ["/************************************************************\n From ../node_modules/highlight.js/styles/atom-one-light.css\n with minor adjustments\n************************************************************/\n/************************************************************\n From ../node_modules/highlight.js/styles/atom-one-dark.css\n with minor adjustments\n************************************************************/\nshiny-chat-container {\n --shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);\n --shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), 0.06);\n display: flex;\n flex-direction: column;\n margin: 0 auto;\n gap: 1rem;\n overflow: auto;\n padding: 0.25rem;\n}\nshiny-chat-container p:last-child {\n margin-bottom: 0;\n}\nshiny-chat-container shiny-chat-messages {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n /* Align the user message to the right */\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 1rem;\n /* Vertically center the 2nd column (message content) */\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message > * {\n height: fit-content;\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-icon {\n border-radius: 50%;\n border: var(--shiny-chat-border);\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-icon > * {\n margin: 0.5rem;\n height: 20px;\n width: 20px;\n}\nshiny-chat-container shiny-chat-messages shiny-chat-message .message-content {\n align-self: center;\n}\nshiny-chat-container shiny-chat-messages shiny-user-message {\n align-self: flex-end;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n background-color: var(--shiny-chat-user-message-bg);\n max-width: 100%;\n}\nshiny-chat-container shiny-user-message[content_type=text],\nshiny-chat-container shiny-chat-message[content_type=text] {\n white-space: pre;\n overflow-x: auto;\n}\nshiny-chat-container shiny-chat-input {\n margin-top: auto;\n position: sticky;\n background-color: var(--bs-body-bg, white);\n bottom: 0;\n}\nshiny-chat-container shiny-chat-input textarea {\n --bs-border-radius: 26px;\n resize: none;\n padding-right: 36px !important;\n max-height: 175px;\n}\nshiny-chat-container shiny-chat-input textarea::placeholder {\n color: var(--bs-gray-600, #707782) !important;\n}\nshiny-chat-container shiny-chat-input button {\n position: absolute;\n bottom: 7px;\n right: 8px;\n background-color: transparent;\n color: var(--bs-primary, #007bc2);\n transition: color 0.25s ease-in-out;\n border: none;\n padding: 0;\n cursor: pointer;\n line-height: 16px;\n border-radius: 50%;\n}\nshiny-chat-container shiny-chat-input button:disabled {\n cursor: not-allowed;\n color: var(--bs-gray-500, #8d959e);\n}\n\n/*\n Disable the page-level pulse when the chat input is disabled\n (i.e., when a response is being generated and brought into the chat)\n*/\n.shiny-busy:has(shiny-chat-input[disabled])::after {\n display: none;\n}\n\n/* Code highlighting (for both light and dark mode) */\npre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\n\ncode.hljs {\n padding: 3px 5px;\n}\n\n/*\n\nAtom One Light by Daniel Gamage\nOriginal One Light Syntax theme from https://github.com/atom/one-light-syntax\n\nbase: #fafafa\nmono-1: #383a42\nmono-2: #686b77\nmono-3: #a0a1a7\nhue-1: #0184bb\nhue-2: #4078f2\nhue-3: #a626a4\nhue-4: #50a14f\nhue-5: #e45649\nhue-5-2: #c91243\nhue-6: #986801\nhue-6-2: #c18401\n\n*/\npre:has(> code.hljs) {\n color: #383a42;\n background: #fafafa;\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #a0a1a7;\n font-style: italic;\n}\n\n.hljs-doctag,\n.hljs-keyword,\n.hljs-formula {\n color: #a626a4;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-selector-tag,\n.hljs-deletion,\n.hljs-subst {\n color: #e45649;\n}\n\n.hljs-literal {\n color: #0184bb;\n}\n\n.hljs-string,\n.hljs-regexp,\n.hljs-addition,\n.hljs-attribute,\n.hljs-meta .hljs-string {\n color: #50a14f;\n}\n\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-type,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-number {\n color: #986801;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-meta,\n.hljs-selector-id,\n.hljs-title {\n color: #4078f2;\n}\n\n.hljs-built_in,\n.hljs-title.class_,\n.hljs-class .hljs-title {\n color: #c18401;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n\n.hljs-link {\n text-decoration: underline;\n}\n\n[data-bs-theme=dark] {\n /*\n\n Atom One Dark by Daniel Gamage\n Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax\n\n base: #282c34\n mono-1: #abb2bf\n mono-2: #818896\n mono-3: #5c6370\n hue-1: #56b6c2\n hue-2: #61aeee\n hue-3: #c678dd\n hue-4: #98c379\n hue-5: #e06c75\n hue-5-2: #be5046\n hue-6: #d19a66\n hue-6-2: #e6c07b\n\n */\n}\n[data-bs-theme=dark] pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\n[data-bs-theme=dark] code.hljs {\n padding: 3px 5px;\n}\n[data-bs-theme=dark] pre:has(> code.hljs) {\n color: #abb2bf;\n background: #282c34;\n}\n[data-bs-theme=dark] .hljs-comment,\n[data-bs-theme=dark] .hljs-quote {\n color: #5c6370;\n font-style: italic;\n}\n[data-bs-theme=dark] .hljs-doctag,\n[data-bs-theme=dark] .hljs-keyword,\n[data-bs-theme=dark] .hljs-formula {\n color: #c678dd;\n}\n[data-bs-theme=dark] .hljs-section,\n[data-bs-theme=dark] .hljs-name,\n[data-bs-theme=dark] .hljs-selector-tag,\n[data-bs-theme=dark] .hljs-deletion,\n[data-bs-theme=dark] .hljs-subst {\n color: #e06c75;\n}\n[data-bs-theme=dark] .hljs-literal {\n color: #56b6c2;\n}\n[data-bs-theme=dark] .hljs-string,\n[data-bs-theme=dark] .hljs-regexp,\n[data-bs-theme=dark] .hljs-addition,\n[data-bs-theme=dark] .hljs-attribute,\n[data-bs-theme=dark] .hljs-meta .hljs-string {\n color: #98c379;\n}\n[data-bs-theme=dark] .hljs-attr,\n[data-bs-theme=dark] .hljs-variable,\n[data-bs-theme=dark] .hljs-template-variable,\n[data-bs-theme=dark] .hljs-type,\n[data-bs-theme=dark] .hljs-selector-class,\n[data-bs-theme=dark] .hljs-selector-attr,\n[data-bs-theme=dark] .hljs-selector-pseudo,\n[data-bs-theme=dark] .hljs-number {\n color: #d19a66;\n}\n[data-bs-theme=dark] .hljs-symbol,\n[data-bs-theme=dark] .hljs-bullet,\n[data-bs-theme=dark] .hljs-link,\n[data-bs-theme=dark] .hljs-meta,\n[data-bs-theme=dark] .hljs-selector-id,\n[data-bs-theme=dark] .hljs-title {\n color: #61aeee;\n}\n[data-bs-theme=dark] .hljs-built_in,\n[data-bs-theme=dark] .hljs-title.class_,\n[data-bs-theme=dark] .hljs-class .hljs-title {\n color: #e6c07b;\n}\n[data-bs-theme=dark] .hljs-emphasis {\n font-style: italic;\n}\n[data-bs-theme=dark] .hljs-strong {\n font-weight: bold;\n}\n[data-bs-theme=dark] .hljs-link {\n text-decoration: underline;\n}\n\n/*\n Styling for the code-copy button (inspired by Quarto's code-copy feature)\n*/\npre:has(.code-copy-button) {\n position: relative;\n}\n\n.code-copy-button {\n position: absolute;\n top: 0;\n right: 0;\n border: 0;\n margin-top: 5px;\n margin-right: 5px;\n background-color: transparent;\n}\n.code-copy-button > .bi {\n display: flex;\n gap: 0.25em;\n}\n.code-copy-button > .bi::after {\n content: \"\";\n display: block;\n height: 1rem;\n width: 1rem;\n mask-image: url('data:image/svg+xml,');\n background-color: var(--bs-body-color, #222);\n}\n\n.code-copy-button-checked > .bi::before {\n content: \"Copied!\";\n font-size: 0.75em;\n vertical-align: 0.25em;\n}\n.code-copy-button-checked > .bi::after {\n mask-image: url('data:image/svg+xml,');\n background-color: var(--bs-success, #198754);\n}"], + "mappings": "AAQA,qBACE,uFACA,4EACA,aACA,sBAZF,cAcE,SACA,cAfF,eAkBA,kCACE,gBAEF,yCACE,aACA,sBACA,SAGF,4DACE,aACA,yCACA,SAGF,8DACE,mBAEF,0EApCA,kBAsCE,gCAEF,4EAxCA,aA0CE,YACA,WAEF,6EACE,kBAEF,4DACE,oBAjDF,uCAoDE,mDACA,eAEF,sHAEE,gBACA,gBAEF,sCACE,gBACA,gBACA,0CACA,SAEF,+CACE,yBACA,YACA,6BACA,iBAEF,4DACE,4CAEF,6CACE,kBACA,WACA,UACA,6BACA,iCACA,kCACA,YAlFF,UAoFE,eACA,iBArFF,kBAwFA,sDACE,mBACA,kCAOF,kDACE,aAIF,cACE,cACA,gBAxGF,YA4GA,UA5GA,gBAmIA,qBACE,cACA,mBAGF,0BAEE,cACA,kBAGF,yCAGE,cAGF,uEAKE,cAGF,cACE,cAGF,iFAKE,cAGF,yIAQE,cAGF,8EAME,cAGF,0DAGE,cAGF,eACE,kBAGF,aACE,gBAGF,WACE,0BAwBF,mCACE,cACA,gBArOF,YAwOA,+BAxOA,gBA2OA,0CACE,cACA,mBAEF,oEAEE,cACA,kBAEF,wGAGE,cAEF,gLAKE,cAEF,mCACE,cAEF,0LAKE,cAEF,iTAQE,cAEF,4MAME,cAEF,yHAGE,cAEF,oCACE,kBAEF,kCACE,gBAEF,gCACE,0BAMF,2BACE,kBAGF,kBACE,kBACA,MACA,QACA,SACA,eACA,iBACA,6BAEF,sBACE,aACA,UAEF,4BACE,WACA,cACA,YACA,WACA,ufACA,4CAGF,qCACE,kBACA,gBACA,qBAEF,oCACE,6RACA", "names": [] }