|
38 | 38 | dark: '#kapa-widget-root{--mantine-color-body:#1b1812;--mantine-color-default:#221e18;--mantine-color-default-border:#2d2820;--mantine-color-text:#f0ebe0;--mantine-color-placeholder:#a29a8d;}', |
39 | 39 | }; |
40 | 40 |
|
| 41 | + // _schemeObserver is set once #kapa-widget-root exists and guards against Kapa |
| 42 | + // resetting data-mantine-color-scheme on every modal open/render cycle. |
| 43 | + var _schemeObserver = null; |
| 44 | + |
41 | 45 | function sync() { |
42 | 46 | var c = document.getElementById('kapa-widget-container'); |
43 | 47 | if (!c || !c.shadowRoot) return false; |
44 | 48 | var r = c.shadowRoot.querySelector('#kapa-widget-root'); |
45 | 49 | if (!r) return false; |
46 | 50 | var scheme = document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light'; |
47 | | - r.setAttribute('data-mantine-color-scheme', scheme); |
| 51 | + // Only write the attribute when it differs — prevents observer re-entry loops. |
| 52 | + if (r.getAttribute('data-mantine-color-scheme') !== scheme) { |
| 53 | + r.setAttribute('data-mantine-color-scheme', scheme); |
| 54 | + } |
48 | 55 | var st = c.shadowRoot.querySelector('#kapa-icp-tokens'); |
49 | 56 | if (!st) { |
50 | 57 | st = document.createElement('style'); |
51 | 58 | st.id = 'kapa-icp-tokens'; |
52 | 59 | c.shadowRoot.appendChild(st); |
53 | 60 | } |
54 | 61 | st.textContent = TOKENS[scheme]; |
| 62 | + // Arm the attribute observer on first successful sync so future resets by |
| 63 | + // Kapa's React re-renders are caught immediately without a theme toggle. |
| 64 | + if (!_schemeObserver) { |
| 65 | + _schemeObserver = new MutationObserver(sync); |
| 66 | + _schemeObserver.observe(r, { attributes: true, attributeFilter: ['data-mantine-color-scheme'] }); |
| 67 | + } |
55 | 68 | return true; |
56 | 69 | } |
57 | 70 |
|
|
61 | 74 | var added = mutations[i].addedNodes; |
62 | 75 | for (var j = 0; j < added.length; j++) { |
63 | 76 | if (added[j].id === 'kapa-widget-container') { |
| 77 | + bodyObserver.disconnect(); |
| 78 | + var c = added[j]; |
64 | 79 | // Give kapa's React one tick to finish rendering the shadow root. |
65 | | - setTimeout(function () { if (sync()) bodyObserver.disconnect(); }, 0); |
| 80 | + setTimeout(function () { |
| 81 | + if (sync()) return; |
| 82 | + // #kapa-widget-root not rendered yet (modal hasn't opened). |
| 83 | + // Observe the shadow root's subtree so sync() fires the moment it appears. |
| 84 | + if (!c.shadowRoot) return; |
| 85 | + var shadowObserver = new MutationObserver(function () { |
| 86 | + if (sync()) shadowObserver.disconnect(); |
| 87 | + }); |
| 88 | + shadowObserver.observe(c.shadowRoot, { childList: true, subtree: true }); |
| 89 | + }, 0); |
66 | 90 | return; |
67 | 91 | } |
68 | 92 | } |
|
0 commit comments