PTT fixes, TDS expansions, performance hooks, state event renderers

PTT fixes (BUG-7/8/9):
- BUG-7: Fix isEditable to use ownerDocument.body (works in EC iframe context)
- BUG-8: Release mic if callEmbed changes during active PTT (cleanup fn)
- BUG-9: Wire iframe blur/focus listeners for stuck-mic prevention

PiP bug fix (BUG-11):
- Track prevPipMode ref so position only resets when first entering pip mode,
  not on every callVisible change (user drag position preserved)

GIF improvements (BUG-15):
- Show user-visible error text in toolbar on GIF send failure
- Also surface size-limit rejection with a 4-second auto-clearing message

Performance:
- useInterval: replace useMemo with useEffect for setInterval (React StrictMode safe)
- usePan: add unmount cleanup effect to remove document mousemove/mouseup listeners

Feature: timeline state event renderers (low effort, high value):
- Added renderers for RoomEncryption, RoomJoinRules, RoomGuestAccess, RoomCanonicalAlias
- These were silently falling through to the hidden-events fallback

TDS (Lotus Terminal Design System):
- Fix: correct 8 escaped template literals in GIF picker light-mode block
- Add data-emoji-board attribute to EmojiBoardLayout for stable CSS targeting
- Add Tooltip panel styles (dark + light mode)
- Add Switch toggle styles (dark + light mode)
- Add Spinner stroke colors (dark + light mode)
- Add EmojiBoard panel styles (dark + light mode)
- Add PopOut/Menu/floating panel styles (dark + light mode)
This commit is contained in:
Lotus Bot
2026-05-19 16:45:02 -04:00
parent 63e1085984
commit 2b2619145c
8 changed files with 241 additions and 38 deletions
+118 -8
View File
@@ -688,8 +688,8 @@ globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-url-p
// ── GIF picker light TDS (dark-mode rules already exist via [data-gif-terminal]) ──
globalStyle(
`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] input,` +
`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] form`, {
`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] input,` +
`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] form`, {
background: '#f4f6fa !important' as any,
color: '#111827 !important' as any,
border: '1px solid rgba(196,78,0,0.28) !important' as any,
@@ -697,23 +697,133 @@ globalStyle(
fontSize: '12px !important' as any,
boxShadow: 'none !important' as any,
});
globalStyle(`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] input:focus`, {
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] input:focus`, {
borderColor: 'rgba(196,78,0,0.60) !important' as any,
boxShadow: '0 0 0 2px rgba(196,78,0,0.12) !important' as any,
outline: 'none !important' as any,
});
globalStyle(`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] input::placeholder`, {
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] input::placeholder`, {
color: 'rgba(196,78,0,0.45) !important' as any,
});
globalStyle(`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] svg,` +
`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] button[type="reset"]`, {
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] svg,` +
`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] button[type="reset"]`, {
display: 'none !important' as any,
});
globalStyle(`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] ::-webkit-scrollbar-track`, {
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] ::-webkit-scrollbar-track`, {
background: '#e2e7ef',
});
globalStyle(`html[data-theme="light"] body.\${lotusTerminalBodyClass} [data-gif-terminal] ::-webkit-scrollbar-thumb`, {
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-gif-terminal] ::-webkit-scrollbar-thumb`, {
background: 'rgba(196,78,0,0.35)',
borderRadius: '2px',
});
// ── Tooltip TDS ──────────────────────────────────────────────────────────────
globalStyle(`body.${lotusTerminalBodyClass} ._6plmi2g > div`, {
background: '#060c14 !important' as any,
border: '1px solid rgba(0,212,255,0.30) !important' as any,
color: '#b0cbe8 !important' as any,
fontFamily: "'JetBrains Mono', 'Cascadia Code', 'Fira Code', monospace !important" as any,
fontSize: '11px !important' as any,
borderRadius: '4px !important' as any,
boxShadow: '0 4px 12px rgba(0,0,0,0.7), 0 0 0 1px rgba(0,212,255,0.08) !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._6plmi2g > div`, {
background: '#f0f4fc !important' as any,
border: '1px solid rgba(0,98,184,0.30) !important' as any,
color: '#2d3d56 !important' as any,
});
// ── Switch toggle TDS ─────────────────────────────────────────────────────────
globalStyle(`body.${lotusTerminalBodyClass} [role="switch"]`, {
background: 'rgba(0,212,255,0.12) !important' as any,
border: '1px solid rgba(0,212,255,0.30) !important' as any,
borderRadius: '99px !important' as any,
transition: 'background 0.2s, border-color 0.2s',
});
globalStyle(`body.${lotusTerminalBodyClass} [role="switch"][aria-checked="true"]`, {
background: 'rgba(255,107,0,0.22) !important' as any,
borderColor: 'rgba(255,107,0,0.60) !important' as any,
boxShadow: '0 0 8px rgba(255,107,0,0.20) !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [role="switch"]`, {
background: 'rgba(0,98,184,0.10) !important' as any,
borderColor: 'rgba(0,98,184,0.35) !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [role="switch"][aria-checked="true"]`, {
background: 'rgba(196,78,0,0.18) !important' as any,
borderColor: 'rgba(196,78,0,0.55) !important' as any,
});
// ── Spinner TDS ───────────────────────────────────────────────────────────────
globalStyle(`body.${lotusTerminalBodyClass} ._31czpko`, {
stroke: 'rgba(0,212,255,0.20) !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} ._31czpkp`, {
stroke: 'rgba(255,107,0,0.85) !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._31czpko`, {
stroke: 'rgba(0,98,184,0.20) !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._31czpkp`, {
stroke: 'rgba(196,78,0,0.85) !important' as any,
});
// ── EmojiBoard TDS ────────────────────────────────────────────────────────────
globalStyle(`body.${lotusTerminalBodyClass} [data-emoji-board]`, {
background: '#060c14 !important' as any,
border: '1px solid rgba(0,212,255,0.20) !important' as any,
borderRadius: '4px !important' as any,
boxShadow: '0 8px 32px rgba(0,0,0,0.75), 0 0 0 1px rgba(0,212,255,0.08) !important' as any,
color: '#b0cbe8 !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} [data-emoji-board] input`, {
background: 'rgba(0,212,255,0.06) !important' as any,
border: '1px solid rgba(0,212,255,0.22) !important' as any,
color: '#b0cbe8 !important' as any,
fontFamily: "'JetBrains Mono', 'Cascadia Code', 'Fira Code', monospace !important" as any,
borderRadius: '4px !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} [data-emoji-board] input:focus`, {
borderColor: 'rgba(255,107,0,0.60) !important' as any,
boxShadow: '0 0 0 2px rgba(255,107,0,0.12) !important' as any,
outline: 'none !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} [data-emoji-board]`, {
background: '#f0f4fc !important' as any,
border: '1px solid rgba(0,98,184,0.22) !important' as any,
color: '#2d3d56 !important' as any,
});
// ── PopOut / Menu / floating panels TDS ──────────────────────────────────────
globalStyle(`body.${lotusTerminalBodyClass} ._1v6ozra1`, {
background: '#060c14 !important' as any,
border: '1px solid rgba(0,212,255,0.22) !important' as any,
borderRadius: '6px !important' as any,
boxShadow: '0 8px 32px rgba(0,0,0,0.80), 0 0 0 1px rgba(0,212,255,0.06) !important' as any,
color: '#b0cbe8 !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} ._1fptcza0`, {
background: 'transparent !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} ._13tt0gb6`, {
color: '#b0cbe8 !important' as any,
borderRadius: '3px !important' as any,
});
globalStyle(`body.${lotusTerminalBodyClass} ._13tt0gb6:hover`, {
background: 'rgba(0,212,255,0.08) !important' as any,
color: '#00d4ff !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._1v6ozra1`, {
background: '#f0f4fc !important' as any,
border: '1px solid rgba(0,98,184,0.22) !important' as any,
boxShadow: '0 8px 32px rgba(0,0,0,0.15) !important' as any,
color: '#2d3d56 !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._13tt0gb6`, {
color: '#2d3d56 !important' as any,
});
globalStyle(`html[data-theme="light"] body.${lotusTerminalBodyClass} ._13tt0gb6:hover`, {
background: 'rgba(0,98,184,0.08) !important' as any,
color: '#0062b8 !important' as any,
});