Cooler styling for reasoning blocks

e7c799ae2aa4667e33911ffae37e57bc7077a98c

Wolfsblvt <wolfsblvt@gmail.com>

3 files changed, +84 -47Ignore whitespace
public/index.html+13 -8
@@ -6247,15 +6247,20 @@
62476247 <div class="mes_edit_cancel menu_button fa-solid fa-xmark" title="Cancel" data-i18n="[title]Cancel"></div>
62486248 </div>
62496249 </div>
62506250 <details class="mes_reasoning_details" open>
62516251 <summary class="mes_reasoning_summary flex-container">
6252- <span data-i18n="Reasoning">Reasoning</span>
6252+ <div class="mes_reasoning_header_block flex-container">
62536253 <div class="mes_reasoning_actionsmes_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>
62556255 <div class="mes_reasoning_edit_cancel mes_buttonmes_reasoning_arrow fa-solid fa-xmark" title="Cancel edit" datachevron-i18n="[title]Cancel editup"></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>
62576262 <div class="mes_reasoning_copy mes_button fa-solid fa-copy" title="Copy reasoning" data-i18n="[title]Copy reasoning"></div>
62586263 <div class="mes_reasoning_deletemes_reasoning_edit mes_button fa-solid fa-trash-canpencil" title="RemoveEdit reasoning" data-i18n="[title]RemoveEdit reasoning"></div>
62596264 </div>
62606265 </summary>
62616266 <div class="mes_reasoning"></div>
public/script.js+21 -18
@@ -2189,26 +2189,29 @@ function insertSVGIcon(mes, extra) {
21892189 modelName = extra.api;
21902190 }
21912191
2192- const image = new Image();
2192+ const insertOrReplaceSVG = (image, className, targetSelector, insertBefore) => {
2193- // Add classes for styling and identification
2193+ image.onload = async function () {
2194- image.classList.add('icon-svg', 'timestamp-icon');
2194+ let existingSVG = insertBefore ? mes.find(targetSelector).prev(`.${className}`) : mes.find(targetSelector).next(`.${className}`);
2195- image.src = `/img/${modelName}.svg`;
2195+ if (existingSVG.length) {
2196- image.title = `${extra?.api ? extra.api + ' - ' : ''}${extra?.model ?? ''}`;
2196+ existingSVG.replaceWith(image);
2197-
2197+ } else {
2198- image.onload = async function () {
2198+ if (insertBefore) mes.find(targetSelector).before(image);
2199- // Check if an SVG already exists adjacent to the timestamp
2199+ else mes.find(targetSelector).after(image);
2200- let existingSVG = mes.find('.timestamp').next('.timestamp-icon');
2200+ }
2201-
2201+ await SVGInject(image);
2202- if (existingSVG.length) {
2202+ };
2203- // Replace existing SVG
2203+ };
2204- existingSVG.replaceWith(image);
2205- } else {
2206- // Append the new SVG if none exists
2207- mes.find('.timestamp').after(image);
2208- }
22092204
2210- await SVGInject(image);
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);
22112211 };
2212+
2213+ createModelImage('timestamp-icon', '.timestamp');
2214+ createModelImage('thinking-icon', '.mes_reasoning_header_title', true);
22122215}
22132216
22142217
public/style.css+50 -21
@@ -342,18 +342,44 @@ input[type='checkbox']:focus-visible {
342342
343343.mes_reasoning {
344344 display: block;
345345 border-left: 1px2px solid var(--SmartThemeBorderColorSmartThemeEmColor);
346- background-color: var(--black30a);
346+ border-radius: 2px;
347- border-radius: 5px;
348347 padding: 5px;
349348 marginpadding-left: 5px 014px;
349+ margin-bottom: 0.5rem;
350350 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%)
351368}
352369
353370.mes_reasoning_summarymes_reasoning_header_block {
371+ flex-grow: 1;
372+}
373+
374+.mes_reasoning_header {
354375 cursor: pointer;
355376 position: relative;
356377 marginuser-select: 2pxnone;
378+ margin: 0.5rem 2px;
379+ padding: 7px 14px;
380+ border-radius: 10px;
381+ background-color: var(--grey30);
382+ font-size: 0.9rem;
357383}
358384
359385@supports not selector(:has(*)) {
@@ -368,24 +394,20 @@ input[type='checkbox']:focus-visible {
368394.mes_block:has(.edit_textarea) .mes_reasoning_details,
369395.mes_reasoning_details:not([open]) .mes_reasoning_actions,
370396.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning,
371397.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .mes_button.mes_reasoning_edit_doneedit_button,
372398.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .mes_button:not(.mes_reasoning_edit_cancel,edit_button) {
373-.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning_actions .mes_button:not(.mes_reasoning_edit_done, .mes_reasoning_edit_cancel) {
374399 display: none;
375400}
376401
377402.mes_reasoning_actionsmes_reasoning_details .mes_reasoning_arrow {
378403 positionfont-size: absolute10px;
379404 rightwidth: 010px;
380405 topheight: 010px;
406+ margin-top: 5px;
407+}
381408
382- display: flex;
409+.mes_reasoning_details:not([open]) .mes_reasoning_arrow {
383410 gaptransform: 4pxrotate(180deg);
384- flex-wrap: nowrap;
385- justify-content: flex-end;
386- transition: all 200ms;
387- overflow-x: hidden;
388- padding: 1px;
389411}
390412
391413.mes_reasoning_summary>span {
@@ -4224,7 +4246,8 @@ input[type="range"]::-webkit-slider-thumb {
42244246 transition: 0.3s ease-in-out;
42254247}
42264248
42274249.mes_edit_buttons .menu_button {,
4250+.mes_reasoning_actions .edit_button {
42284251 opacity: 0.5;
42294252 padding: 0px;
42304253 font-size: 1rem;
@@ -4237,6 +4260,12 @@ input[type="range"]::-webkit-slider-thumb {
42374260 align-items: center;
42384261}
42394262
4263+.mes_reasoning_actions .edit_button {
4264+ margin-bottom: 0.5rem;
4265+ opacity: 1;
4266+ filter: brightness(0.7);
4267+}
4268+
42404269.mes_reasoning_edit_cancel,
42414270.mes_edit_cancel.menu_button {
42424271 background-color: var(--crimson70a);