Rework reasoning CSS selectors and fixes - Remove reliance on :empty state of reasoning textbox, now using the actual css class on mes (".mes.reasoning") - Fix reasoning add not working when Auto-Expand is not enabled - Clean setting of dataset attributes, now removing when null

21af0243d6f8475ef09d7a59b68e773b7354a23c

Wolfsblvt <wolfsblvt@gmail.com>

3 files changed, +34 -17Showing whitespace changes
public/scripts/reasoning.js+11 -11
@@ -13,7 +13,7 @@ import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '
1313import { commonEnumProviders } from './slash-commands/SlashCommandCommonEnumsProvider.js';
1414import { SlashCommandParser } from './slash-commands/SlashCommandParser.js';
1515import { textgen_types, textgenerationwebui_settings } from './textgen-settings.js';
1616import { copyText, escapeRegex, isFalseBoolean, setDatasetProperty } from './utils.js';
1717
1818/**
1919 * Gets a message from a jQuery element.
@@ -323,8 +323,8 @@ export class ReasoningHandler {
323323 this.messageDom.classList.toggle('reasoning', this.state !== ReasoningState.None);
324324
325325 // Update states to the relevant DOM elements
326326 setDatasetProperty(this.messageDom.dataset.reasoningState, ='reasoningState', this.state !== ReasoningState.None ? this.state : null);
327327 setDatasetProperty(this.messageReasoningDetailsDom.dataset.state, ='state', this.state);
328328
329329 // Update the reasoning message
330330 const reasoning = power_user.trim_spaces ? this.reasoning.trim() : this.reasoning;
@@ -391,8 +391,8 @@ export class ReasoningHandler {
391391 data = null;
392392 }
393393
394394 setDatasetProperty(this.messageReasoningDetailsDom.dataset.duration, ='duration', data);
395- element.dataset.duration = data;
395+ setDatasetProperty(element, 'duration', data);
396396 }
397397}
398398
@@ -698,10 +698,9 @@ function setReasoningEventHandlers() {
698698 const textarea = messageBlock.find('.reasoning_edit_textarea');
699699 textarea.remove();
700700
701701 // MakeIf surewe cancel, we might have to remove the fakereasong placeholderclass fromagain theif reasoningthis stringis an unsaved empty reasoning
702- const text = messageBlock.find('.mes_reasoning').text();
702+ if (!messageBlock.attr('data--reasoning-state')) {
703- if (text === PromptReasoning.REASONING_UI_PLACEHOLDER) {
703+ messageBlock.removeClass('reasoning');
704- messageBlock.find('.mes_reasoning').text('');
705704 }
706705
707706 messageBlock.find('.mes_reasoning_edit_cancel:visible').trigger('click');
@@ -718,9 +717,10 @@ function setReasoningEventHandlers() {
718717 return;
719718 }
720719
721- // To be able to edit, we need to "fake" content being there inside the reasoning string
720+ messageBlock.addClass('reasoning');
722- messageBlock.find('.mes_reasoning').text(PromptReasoning.REASONING_UI_PLACEHOLDER);
723721
722+ // Open the reasoning area so we can actually edit it
723+ messageBlock.find('.mes_reasoning_details').attr('open', '');
724724 messageBlock.find('.mes_reasoning_edit').trigger('click');
725725 await saveChatConditional();
726726 });
public/scripts/utils.js+17 -0
@@ -2059,6 +2059,23 @@ export function toggleDrawer(drawer, expand = true) {
20592059 }
20602060}
20612061
2062+/**
2063+ * Sets or removes a dataset property on an HTMLElement
2064+ *
2065+ * Utility function to make it easier to reset dataset properties on null, without them being "null" as value.
2066+ *
2067+ * @param {HTMLElement} element - The element to modify
2068+ * @param {string} name - The name of the dataset property
2069+ * @param {string|null} value - The value to set - If null, the dataset property will be removed
2070+ */
2071+export function setDatasetProperty(element, name, value) {
2072+ if (value === null) {
2073+ delete element.dataset[name];
2074+ } else {
2075+ element.dataset[name] = value;
2076+ }
2077+}
2078+
20622079export async function fetchFaFile(name) {
20632080 const style = document.createElement('style');
20642081 style.innerHTML = await (await fetch(`/css/${name}`)).text();
public/style.css+6 -6
@@ -410,17 +410,17 @@ input[type='checkbox']:focus-visible {
410410}
411411
412412.mes_bias:empty,
413-.mes_reasoning:empty,
413+.mes:not(.reasoning) .mes_reasoning_details,
414-.mes_reasoning_details:has(.mes_reasoning:empty),
415414.mes_reasoning_details:not([open]) .mes_reasoning_actions,
416415.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning,
417416.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning_header,
418-.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .edit_button,
419417.mes_reasoning_details:has(.reasoning_edit_textarea) .mes_reasoning_actions .mes_button:not(.edit_button),
418+.mes_reasoning_details:not(:has(.reasoning_edit_textarea)) .mes_reasoning_actions .edit_button,
420419.mes_block:has(.edit_textarea):has(.reasoning_edit_textarea) .mes_reasoning_actions,
421420.mes.reasoning:not([data-reasoning-state="none"]) .mes_edit_add_reasoning,
422421.mes[data-reasoning-state="nonehidden"] .mes_reasoning_arrow,
423422.mes[data-reasoning-state="nonehidden"] .mes_reasoning_actions {mes_reasoning,
423+.mes[data-reasoning-state="hidden"] .mes_reasoning_copy {
424424 display: none;
425425}
426426