processTemplateNode(node, context) {
      Logger.debug("DOMManager: processTemplateNode", { node, context });
      if (node.nodeType === Node.TEXT_NODE) {
        const originalText = node.textContent;
        const newText = node.textContent.replace(/\{\{\s*([^}]+)\s*\}\}/g, (match, path) => {
          path = path.trim();
          const getValueByPath = (obj, path2) => {
            return path2.split(".").reduce((value2, key) => {
              return value2 ? value2[key] : void 0;
            }, obj);
          };
          let value = context ? getValueByPath(context, path) : void 0;
          if (value === void 0) {
            value = this.model.store.get(path);
          }
          return value !== void 0 ? value : "";
        });
        if (originalText !== newText) {
          Logger.debug(`DOMManager: updated node text from ${originalText} to ${newText}`);
          node.textContent = newText;
        }
      } else if (node.nodeType === Node.ELEMENT_NODE) {
        Array.from(node.childNodes).forEach((child) => {
          this.processTemplateNode(child, context);
        });
      }
    }
Recursively processes template nodes and replaces placeholders with values.
- Handles text nodes: replaces {{expression}} with actual values
- For text nodes: compares original and new content to avoid unnecessary updates
- For element nodes: recursively processes all child nodes
- Supports both context values and model store values

@param {Node} node - DOM node to process
@param {Object} context - Optional context data for placeholder replacement