skills-experimental/dom-element-type/SKILL.md
# DOM Element Type Skill DOM Element Type - DOMElement comprehensive type + Scroll State + Event Handlers + dirty flag + yogaNode LayoutNode + scrollTop/pendingScrollDelta + scrollClamp pattern。 ## 功能概述 从Claude Code的ink/dom.ts提取的DOM元素类型定义,用于OpenClaw的终端UI渲染。 ## 核心机制 ### DOMElement Type ```typescript export type DOMElement = { nodeName: ElementNames attributes: Record<string, DOMNodeAttribute> childNodes: DOMNode[] textStyles?: TextStyles // Internal properties onComputeLayout?:
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/dom-element-typeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
DOM Element Type - DOMElement comprehensive type + Scroll State + Event Handlers + dirty flag + yogaNode LayoutNode + scrollTop/pendingScrollDelta + scrollClamp pattern。
从Claude Code的ink/dom.ts提取的DOM元素类型定义,用于OpenClaw的终端UI渲染。
export type DOMElement = {
nodeName: ElementNames
attributes: Record<string, DOMNodeAttribute>
childNodes: DOMNode[]
textStyles?: TextStyles
// Internal properties
onComputeLayout?: () => void
onRender?: () => void
onImmediateRender?: () => void
hasRenderedContent?: boolean // Skip empty renders in React 19 double-invoke
// When true, this node needs re-rendering
dirty: boolean
// Set by reconciler's hideInstance/unhideInstance; survives style updates
isHidden?: boolean
// Event handlers stored separately from attributes
// Handler identity changes don't mark dirty
_eventHandlers?: Record<string, unknown>
// Scroll state for overflow: 'scroll' boxes
scrollTop?: number
pendingScrollDelta?: number // Accumulated delta, drained at SCROLL_MAX_PER_FRAME
scrollClampMin?: number // Virtual scroll clamp bounds
scrollClampMax?: number
scrollHeight?: number
scrollViewportHeight?: number
scrollViewportTop?: number
stickyScroll?: boolean
// ... more fields
}
// Comprehensive DOM element type
// Scroll state + Event handlers + dirty flag
// yogaNode LayoutNode reference
// ScrollTop: number of rows scrolled down
scrollTop?: number
// pendingScrollDelta: accumulated scroll delta not yet applied
// Drained at SCROLL_MAX_PER_FRAME rows/frame
// Fast flicks show intermediate frames instead of big jump
pendingScrollDelta?: number
// scrollClampMin/Max: virtual scroll clamp bounds
// Prevents blank screen when scrollTo races past React re-render
scrollClampMin?: number
scrollClampMax?: number
// Scroll state for overflow: 'scroll' boxes
// pendingScrollDelta accumulator
// scrollClamp bounds
// Event handlers set by reconciler for capture/bubble dispatcher
// Stored separately from attributes so handler identity changes
// don't mark dirty and defeat blit optimization
_eventHandlers?: Record<string, unknown>
// Separated from attributes
// Identity changes don't trigger dirty
# Blit optimization preserved
// When true, this node needs re-rendering
dirty: boolean
// Simple boolean flag
// Mark dirty on changes
# Trigger re-render
yogaNode?: LayoutNode
// Yoga layout engine node
// Layout computation reference
# Flexbox layout
// Used to skip empty renders during React 19's effect double-invoke in test mode
hasRenderedContent?: boolean
// React 19 test mode optimization
# Skip empty renders
# Double-invoke protection
stickyScroll?: boolean
// Auto-pins scrollTop to bottom when content grows
// Sticky scroll behavior
{
"nodeName": "ink-box",
"dirty": true,
"scrollTop": 10,
"pendingScrollDelta": 5,
"stickyScroll": true
}
pendingScrollDelta → SCROLL_MAX_PER_FRAME → intermediate frames → fast flicks
// Scroll delta accumulator
// 每帧drain限制
// 显示intermediate frames
scrollClampMin/Max → prevent blank screen → race condition protection
// Virtual scroll clamp bounds
// 防止blank screen
// scrollTo vs re-render race
_eventHandlers ≠ attributes → identity changes → no dirty → blit optimization
// Event handlers独立存储
// Identity changes不触发dirty
# 保持blit optimization
hasRenderedContent → skip empty renders → test mode double-invoke
// React 19 test mode会double-invoke effects
// hasRenderedContent避免empty renders
ink/dom.ts (484 lines)business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings