Cooler styling for reasoning blocks
| @@ -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> |
| @@ -2189,26 +2189,29 @@ function insertSVGIcon(mes, extra) { | |||
| 2189 | modelName = extra.api; | 2189 | modelName = extra.api; |
| 2190 | } | 2190 | } |
| 2191 | 2191 | ||
| 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 timestamp | 2194 | 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 exists | 2198 | 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 | } |
| 2213 | 2216 | ||
| 2214 | 2217 | ||
| @@ -342,18 +342,44 @@ input[type='checkbox']:focus-visible { | |||
| 342 | 342 | ||
| 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 | } |
| 352 | 369 | ||
| 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 | } |
| 358 | 384 | ||
| 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 | } |
| 376 | 401 | ||
| 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 | } | ||
| 381 | 408 | ||
| 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 | } |
| 390 | 412 | ||
| 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 | } |
| 4226 | 4248 | ||
| 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 | } |
| 4239 | 4262 | ||
| 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); |