// app.jsx — Exo Studio single-pager /* global React, ReactDOM, DOMPurify, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakColor, TweakSlider, TweakToggle */ const { useState, useEffect, useMemo, useRef, useCallback, createContext, useContext } = React; /* ─── Rich-text rendering (admin uses Quill → stores HTML) ───────── */ const RICH_ALLOWED_TAGS = [ "p", "br", "span", "div", "strong", "em", "u", "s", "b", "i", "h2", "h3", "h4", "h5", "h6", "ul", "ol", "li", "a", "blockquote", ]; const RICH_ALLOWED_ATTR = ["href", "target", "rel", "style", "class"]; function looksLikeHtml(s) { return typeof s === "string" && /<\w+[\s\S]*>/.test(s); } // Quill 2 хранит списки как
// + внутри li. Без квилловского CSS это рендерится как // нумерованный список. Конвертим в стандартные