Cooler styling for reasoning blocks

e7c799ae2aa4667e33911ffae37e57bc7077a98c

Wolfsblvt <wolfsblvt@gmail.com>

3 files changed, +79 -42Showing whitespace changes
public/index.html+13 -8
@@ -6247,15 +6247,20 @@
6247 <div class="mes_edit_cancel menu_button fa-solid fa-xmark" title="Cancel" data-i18n="[title]Cancel"></div>6247 <div class="mes_edit_cancel menu_button fa-solid fa-xmark" title="Cancel" data-i18n="[title]Cancel"></div>
6248 </div>6248 </div>
6249 </div>6249 </div>
6250 <details class="mes_reasoning_details">6250 <details class="mes_reasoning_details" open>
6251 <summary class="mes_reasoning_summary">6251 <summary class="mes_reasoning_summary flex-container">
6252 <span data-i18n="Reasoning">Reasoning</span>6252 <div class="mes_reasoning_header_block flex-container">
6253 <div class="mes_reasoning_actions">6253 <div class="mes_reasoning_header flex-container">
6254 <div class="mes_reasoning_edit_done mes_button fa-solid fa-check" title="Confirm" data-i18n="[title]Confirmedit"></div>6254 <span class="mes_reasoning_header_title" data-i18n="Thought for some time">Thought for some time</span>
6255 <div class="mes_reasoning_edit_cancel mes_button fa-solid fa-xmark" title="Cancel edit" data-i18n="[title]Cancel edit"></div>6255 <div class="mes_reasoning_arrow fa-solid fa-chevron-up"></div>
6256 <div class="mes_reasoning_edit mes_button fa-solid fa-pencil" title="Edit reasoning" data-i18n="[title]Edit reasoning"></div>6256 </div>
6257 </div>
6258 <div class="mes_reasoning_actions flex-container">
6259 <div class="mes_reasoning_edit_done menu_button edit_button fa-solid fa-check" title="Confirm" data-i18n="[title]Confirmedit"></div>
6260 <div class="mes_reasoning_delete menu_button edit_button fa-solid fa-trash-can" title="Remove reasoning" data-i18n="[title]Remove reasoning"></div>
6261 <div class="mes_reasoning_edit_cancel menu_button edit_button fa-solid fa-xmark" title="Cancel edit" data-i18n="[title]Cancel edit"></div>
6257 <div class="mes_reasoning_copy mes_button fa-solid fa-copy" title="Copy reasoning" data-i18n="[title]Copy reasoning"></div>6262 <div class="mes_reasoning_copy mes_button fa-solid fa-copy" title="Copy reasoning" data-i18n="[title]Copy reasoning"></div>
6258 <div class="mes_reasoning_delete mes_button fa-solid fa-trash-can" title="Remove reasoning" data-i18n="[title]Remove reasoning"></div>6263 <div class="mes_reasoning_edit mes_button fa-solid fa-pencil" title="Edit reasoning" data-i18n="[title]Edit reasoning"></div>
6259 </div>6264 </div>
6260 </summary>6265 </summary>
6261 <div class="mes_reasoning"></div>6266 <div class="mes_reasoning"></div>
public/script.js+16 -13
@@ -2189,26 +2189,29 @@ function insertSVGIcon(mes, extra) {
2189 modelName = extra.api;2189 modelName = extra.api;
2190 }2190 }
21912191
2192 const image = new Image();2192 const insertOrReplaceSVG = (image, className, targetSelector, insertBefore) => {
2193 // Add classes for styling and identification
2194 image.classList.add('icon-svg', 'timestamp-icon');
2195 image.src = `/img/${modelName}.svg`;
2196 image.title = `${extra?.api ? extra.api + ' - ' : ''}${extra?.model ?? ''}`;
2197
2198 image.onload = async function () {2193 image.onload = async function () {
2199 // Check if an SVG already exists adjacent to the timestamp2194 let existingSVG = insertBefore ? mes.find(targetSelector).prev(`.${className}`) : mes.find(targetSelector).next(`.${className}`);
2200 let existingSVG = mes.find('.timestamp').next('.timestamp-icon');
2201
2202 if (existingSVG.length) {2195 if (existingSVG.length) {
2203 // Replace existing SVG
2204 existingSVG.replaceWith(image);2196 existingSVG.replaceWith(image);
2205 } else {2197 } else {
2206 // Append the new SVG if none exists2198 if (insertBefore) mes.find(targetSelector).before(image);
2207 mes.find('.timestamp').after(image);2199 else mes.find(targetSelector).after(image);
2208 }2200 }
2209
2210 await SVGInject(image);2201 await SVGInject(image);
2211 };2202 };
2203 };
2204
2205 const createModelImage = (className, targetSelector, insertBefore) => {
2206 const image = new Image();
2207 image.classList.add('icon-svg', className);
2208 image.src = `/img/${modelName}.svg`;
2209 image.title = `${extra?.api ? extra.api + ' - ' : ''}${extra?.model ?? ''}`;
2210 insertOrReplaceSVG(image, className, targetSelector, insertBefore);
2211 };
2212
2213 createModelImage('timestamp-icon', '.timestamp');
2214 createModelImage('thinking-icon', '.mes_reasoning_header_title', true);
2212}2215}
22132216
22142217
public/style.css+50 -21
@@ -342,18 +342,44 @@ input[type='checkbox']:focus-visible {
342342
343.mes_reasoning {343.mes_reasoning {
344 display: block;344 display: block;
345 border: 1px solid var(--SmartThemeBorderColor);345 border-left: 2px solid var(--SmartThemeEmColor);
346 background-color: var(--black30a);346 border-radius: 2px;
347 border-radius: 5px;
348 padding: 5px;347 padding: 5px;
349 margin: 5px 0;348 padding-left: 14px;
349 margin-bottom: 0.5rem;
350 overflow-y: auto;350 overflow-y: auto;
351 color: var(--SmartThemeEmColor);
352}
353
354.mes_reasoning *:last-child {
355 margin-bottom: 0;
356}
357
358.mes_reasoning em,
359.mes_reasoning i,
360.mes_reasoning u,
361.mes_reasoning q,
362.mes_reasoning blockquote {
363 filter: saturate(0.5);
364}
365
366.mes_reasoning_details .mes_reasoning em {
367 color: color-mix(in srgb, var(--SmartThemeEmColor) 67%, var(--SmartThemeBlurTintColor) 33%)
351}368}
352369
353.mes_reasoning_summary {370.mes_reasoning_header_block {
371 flex-grow: 1;
372}
373
374.mes_reasoning_header {
354 cursor: pointer;375 cursor: pointer;
355 position: relative;376 position: relative;
356 margin: 2px;377 user-select: none;
378 margin: 0.5rem 2px;
379 padding: 7px 14px;
380 border-radius: 10px;
381 background-color: var(--grey30);
382 font-size: 0.9rem;
357}383}
358384
359@supports not selector(:has(*)) {385@supports not selector(:has(*)) {
@@ -368,24 +394,20 @@ input[type='checkbox']:focus-visible {
368.mes_block:has(.edit_textarea) .mes_reasoning_details,394.mes_block:has(.edit_textarea) .mes_reasoning_details,
369.mes_reasoning_details:not([open]) .mes_reasoning_actions,395.mes_reasoning_details:not([open]) .mes_reasoning_actions,
370.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning,396.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning,
371.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .mes_button.mes_reasoning_edit_done,397.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .edit_button,
372.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .mes_button.mes_reasoning_edit_cancel,398.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning_actions .mes_button:not(.edit_button) {
373.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning_actions .mes_button:not(.mes_reasoning_edit_done, .mes_reasoning_edit_cancel) {
374 display: none;399 display: none;
375}400}
376401
377.mes_reasoning_actions {402.mes_reasoning_details .mes_reasoning_arrow {
378 position: absolute;403 font-size: 10px;
379 right: 0;404 width: 10px;
380 top: 0;405 height: 10px;
406 margin-top: 5px;
407}
381408
382 display: flex;409.mes_reasoning_details:not([open]) .mes_reasoning_arrow {
383 gap: 4px;410 transform: rotate(180deg);
384 flex-wrap: nowrap;
385 justify-content: flex-end;
386 transition: all 200ms;
387 overflow-x: hidden;
388 padding: 1px;
389}411}
390412
391.mes_reasoning_summary>span {413.mes_reasoning_summary>span {
@@ -4224,7 +4246,8 @@ input[type="range"]::-webkit-slider-thumb {
4224 transition: 0.3s ease-in-out;4246 transition: 0.3s ease-in-out;
4225}4247}
42264248
4227.mes_edit_buttons .menu_button {4249.mes_edit_buttons .menu_button,
4250.mes_reasoning_actions .edit_button {
4228 opacity: 0.5;4251 opacity: 0.5;
4229 padding: 0px;4252 padding: 0px;
4230 font-size: 1rem;4253 font-size: 1rem;
@@ -4237,6 +4260,12 @@ input[type="range"]::-webkit-slider-thumb {
4237 align-items: center;4260 align-items: center;
4238}4261}
42394262
4263.mes_reasoning_actions .edit_button {
4264 margin-bottom: 0.5rem;
4265 opacity: 1;
4266 filter: brightness(0.7);
4267}
4268
4240.mes_reasoning_edit_cancel,4269.mes_reasoning_edit_cancel,
4241.mes_edit_cancel.menu_button {4270.mes_edit_cancel.menu_button {
4242 background-color: var(--crimson70a);4271 background-color: var(--crimson70a);