@lijinmei-810/dev-inspector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/DevInspector.tsx","../src/DevInspectorProvider.tsx","../src/config.ts","../src/mount.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { CircleHelp } from 'lucide-react';\nimport './dev-inspector.css';\nimport { useDevInspectorConfig } from './DevInspectorProvider';\nimport type { DevInspectorTokenConfig } from './config';\nimport type { PaletteColor, PaletteGroup } from './config';\n\nfunction calcDropPos(rect: DOMRect, dropHeight = 280): { top: number; left: number } {\n const spaceBelow = window.innerHeight - rect.bottom;\n const top = spaceBelow >= dropHeight + 8 ? rect.bottom + 4 : rect.top - dropHeight - 4;\n return { top: Math.max(8, top), left: rect.left };\n}\n\n// ─── 常量(Inspector 专属)───────────────────────────────────────\nconst COLOR_PROPS = [\n { label: '背景色', prop: 'background-color' },\n];\n\n// hex/rgba → 短标签(通过色板反查)\nfunction getColorLabel(val: string, colorPalette: DevInspectorTokenConfig['colorPalette']): string | null {\n for (const g of colorPalette) {\n const found = g.colors.find((c: PaletteColor) => c.val === val);\n if (found) return `${g.group}·${found.label}`;\n }\n return null;\n}\n\nfunction getTypographyToken(\n fontSize: string,\n fontWeight: string,\n color: string,\n typographyTokens: DevInspectorTokenConfig['typographyTokens'],\n) {\n const normalizedColor = normalizeColor(color);\n return typographyTokens.find(token =>\n token.fontSize === fontSize.trim()\n && token.fontWeight === fontWeight.trim()\n && normalizeColor(token.color) === normalizedColor,\n ) ?? null;\n}\n\nconst BORDER_STYLE_OPTIONS = [\n { label: '─', value: 'solid', title: '实线' },\n { label: '┄', value: 'dashed', title: '虚线' },\n { label: '⋯', value: 'dotted', title: '点线' },\n { label: '✕', value: 'none', title: '无' },\n];\n\ntype SizeAxis = 'width' | 'height';\ntype SizeMode = 'fill' | 'hug' | 'fixed';\ntype ScopeMode = 'current' | 'component';\ntype StyleIntentChange = { prop: string; val: string; from?: string };\ntype StyleIntentEntryGroup = { selector: string; changes: StyleIntentChange[] };\ntype StyleIntentQueueEntry = {\n id: string;\n createdAt: string;\n targetLabel?: string;\n selector?: string;\n note?: string;\n entries: StyleIntentEntryGroup[];\n};\ntype StyleIntentSummary = {\n pendingCount: number;\n latestPending: StyleIntentQueueEntry | null;\n pendingEntries: StyleIntentQueueEntry[];\n};\n\nconst SIZE_OPTIONS: { label: string; mode: SizeMode; value?: string }[] = [\n { label: 'Fill', mode: 'fill', value: '100%' },\n { label: 'Hug', mode: 'hug', value: 'fit-content' },\n { label: 'Fixed', mode: 'fixed' },\n];\n\n// ─── 工具函数 ────────────────────────────────────────────────────\nfunction rgbToHex(rgb: string): string {\n const m = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n if (!m) return rgb;\n return '#' + [m[1], m[2], m[3]].map(n => parseInt(n).toString(16).padStart(2, '0')).join('');\n}\n\nfunction normalizeColor(val: string): string {\n const m = val.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n if (m) return '#' + [m[1],m[2],m[3]].map(n=>parseInt(n).toString(16).padStart(2,'0')).join('');\n return val.trim();\n}\n\nfunction formatColorDisplay(val: string): string {\n // rgba(r,g,b,a) → #hex / a%\n const m = val.match(/^rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([\\d.]+)\\)$/);\n if (m) {\n const hex = '#' + [m[1],m[2],m[3]].map(n=>parseInt(n).toString(16).padStart(2,'0')).join('');\n const alpha = Math.round(parseFloat(m[4]) * 100);\n return alpha < 100 ? `${hex} / ${alpha}%` : hex;\n }\n return val;\n}\n\nconst shadowValueCache = new Map<string, string>();\n\n// 跨面板共享的复制样式缓存\nlet _copiedStyles: { prop: string; val: string }[] = [];\n\nfunction canonicalizeShadowValue(val: string): string {\n const raw = (val || 'none').trim() || 'none';\n if (shadowValueCache.has(raw)) return shadowValueCache.get(raw)!;\n if (typeof document === 'undefined' || !document.body) return raw;\n const probe = document.createElement('div');\n probe.style.boxShadow = raw;\n probe.style.position = 'fixed';\n probe.style.opacity = '0';\n probe.style.pointerEvents = 'none';\n document.body.appendChild(probe);\n const normalized = getComputedStyle(probe).boxShadow.trim() || raw;\n probe.remove();\n shadowValueCache.set(raw, normalized);\n return normalized;\n}\n\nfunction formatShadowDisplay(val: string): string {\n if (!val || val === 'none') return 'none';\n return val.replace(/\\s+/g, ' ');\n}\n\nfunction getShadowDisplay(\n val: string,\n authoredVal: string,\n shadowTokens: DevInspectorTokenConfig['shadowTokens'],\n): { label: string; sub: string; isHardcoded: boolean } {\n const authoredVar = authoredVal.match(/var\\((--[^),\\s]+)/)?.[1];\n const normalized = canonicalizeShadowValue(val);\n const matched = shadowTokens.find(token => token.cssVar === authoredVar)\n ?? shadowTokens.find(token => canonicalizeShadowValue(token.value) === normalized);\n\n if (matched) {\n return {\n label: matched.label,\n sub: matched.cssVar,\n isHardcoded: false,\n };\n }\n\n return {\n label: val === 'none' ? '无' : '自定义',\n sub: formatShadowDisplay(val),\n isHardcoded: val !== 'none',\n };\n}\n\nfunction getClasses(el: Element): string[] {\n return Array.from(el.classList).filter(c => !c.startsWith('di-'));\n}\n\nconst STATE_CLASS_NAMES = new Set([\n 'active', 'selected', 'current', 'open', 'expanded', 'collapsed',\n 'disabled', 'enabled', 'checked', 'focus', 'focused', 'hover', 'pressed',\n 'loading', 'error', 'success', 'warning',\n]);\n\nfunction isStateClass(className: string): boolean {\n return STATE_CLASS_NAMES.has(className)\n || className.startsWith('is-')\n || className.startsWith('has-')\n || className.startsWith('state-')\n || className.endsWith('--active')\n || className.endsWith('--selected')\n || className.endsWith('--current')\n || className.endsWith('--open')\n || className.endsWith('--disabled');\n}\n\nfunction getComponentClasses(el: Element): string[] {\n const componentClasses = getClasses(el).filter(c =>\n !isStateClass(c)\n && !/^lucide(-|$)/.test(c)\n );\n return componentClasses.length ? componentClasses : getClasses(el);\n}\n\nfunction getStateClasses(el: Element): string[] {\n return getClasses(el).filter(c => !/^lucide(-|$)/.test(c));\n}\n\nconst UNSAFE_GLOBAL_TAGS = new Set([\n 'a', 'aside', 'button', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'img', 'input', 'label', 'li', 'main', 'ol', 'p', 'path', 'section',\n 'span', 'strong', 'svg', 'textarea', 'ul',\n]);\n\nfunction classSelector(classes: string[]): string {\n const escapeClass = (value: string) => {\n try { return CSS.escape(value); } catch { return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&'); }\n };\n return classes.length ? '.' + classes.map(escapeClass).join('.') : '';\n}\n\nfunction queryByClasses(el: Element, classes: string[]): Element[] {\n if (!classes.length) return [el];\n const includePanels = !!el.closest('.di-panel');\n try {\n return Array.from(document.querySelectorAll(classSelector(classes)))\n .filter(e => includePanels || !e.closest('.di-panel'));\n } catch { return [el]; }\n}\n\nfunction getSameComponentEls(el: Element): Element[] {\n return queryByClasses(el, getComponentClasses(el));\n}\n\nfunction getSameStateEls(el: Element): Element[] {\n return queryByClasses(el, getStateClasses(el));\n}\n\nfunction getScopeTargets(el: Element, scope: ScopeMode): Element[] {\n if (scope === 'component') return getSameComponentEls(el);\n return [el];\n}\n\nfunction getClassSelectorForScope(el: Element, scope: ScopeMode): string {\n const classes = scope === 'component' ? getComponentClasses(el) : getStateClasses(el);\n return classSelector(classes) || el.tagName.toLowerCase();\n}\n\nfunction getStructuralStep(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const parent = el.parentElement;\n if (!parent) return tag;\n const sameTagSiblings = Array.from(parent.children).filter(child => child.tagName === el.tagName);\n if (sameTagSiblings.length <= 1) return tag;\n return `${tag}:nth-of-type(${sameTagSiblings.indexOf(el) + 1})`;\n}\n\nfunction getContextualSelectorForScope(el: Element, scope: ScopeMode): string {\n let anchor = el.parentElement;\n while (anchor && !getClasses(anchor).length) anchor = anchor.parentElement;\n if (!anchor) return '';\n\n const anchorSelector = getClassSelectorForScope(anchor, scope);\n const path: string[] = [];\n let cursor: Element | null = el;\n\n while (cursor && cursor !== anchor) {\n path.unshift(getStructuralStep(cursor));\n cursor = cursor.parentElement;\n }\n\n return path.length ? `${anchorSelector} > ${path.join(' > ')}` : anchorSelector;\n}\n\nfunction getSelectorForScope(el: Element, scope: ScopeMode): string {\n const classes = scope === 'component' ? getComponentClasses(el) : getStateClasses(el);\n if (classes.length) return classSelector(classes);\n const tag = el.tagName.toLowerCase();\n if (!UNSAFE_GLOBAL_TAGS.has(tag)) return tag;\n const contextualSelector = getContextualSelectorForScope(el, scope);\n return contextualSelector || tag;\n}\n\nfunction canPersistSelector(el: Element, scope: ScopeMode): boolean {\n const classes = scope === 'component' ? getComponentClasses(el) : getStateClasses(el);\n if (classes.length) return true;\n if (el.classList.contains('lucide') || Array.from(el.classList).some(c => /^lucide-/.test(c))) {\n return getContextualSelectorForScope(el, scope).length > 0;\n }\n const tag = el.tagName.toLowerCase();\n if (!UNSAFE_GLOBAL_TAGS.has(tag)) return true;\n return getContextualSelectorForScope(el, scope).length > 0;\n}\n\nfunction isInsidePanel(el: Element): boolean {\n return el.closest('.di-panel') !== null || el.closest('.di-trigger') !== null || el.closest('.di-label') !== null;\n}\n\nfunction pickPanelElement(x: number, y: number, panel: HTMLElement, excluded?: Element): Element | null {\n const stack = document.elementsFromPoint(x, y);\n return stack.find(el =>\n el !== excluded &&\n el !== panel &&\n panel.contains(el)\n ) ?? null;\n}\n\n// 扫描 :root CSS 变量,建立 值→token 映射\nfunction scanTokenMap(): Record<string, string> {\n const map: Record<string, string> = {};\n try {\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules)) {\n if (rule instanceof CSSStyleRule && rule.selectorText === ':root') {\n for (let i = 0; i < rule.style.length; i++) {\n const prop = rule.style[i];\n if (!prop.startsWith('--')) continue;\n const raw = rule.style.getPropertyValue(prop).trim();\n const hex = raw.startsWith('rgb') ? rgbToHex(raw) : raw;\n map[raw] = prop;\n if (hex !== raw) map[hex] = prop;\n }\n }\n }\n } catch { /* cross-origin */ }\n }\n } catch {}\n return map;\n}\n\nfunction getComputedColor(el: Element, prop: string): string {\n return normalizeColor(getComputedStyle(el).getPropertyValue(prop).trim());\n}\n\nfunction getComputedRadius(el: Element): string {\n return getComputedStyle(el).getPropertyValue('border-radius').trim();\n}\n\nfunction getComputedPadding(el: Element): string {\n const cs = getComputedStyle(el);\n const t = cs.paddingTop, r = cs.paddingRight, b = cs.paddingBottom, l = cs.paddingLeft;\n if (t === r && r === b && b === l) return t;\n return `${t} ${r} ${b} ${l}`;\n}\n\nfunction parseTranslate(val: string): { x: number; y: number } {\n const raw = (val || 'none').trim();\n if (!raw || raw === 'none') return { x: 0, y: 0 };\n const parts = raw.split(/\\s+/);\n const toNum = (v?: string) => v ? Number.parseFloat(v) || 0 : 0;\n return { x: toNum(parts[0]), y: toNum(parts[1]) };\n}\n\nfunction formatTranslate(pos: { x: number; y: number }): string {\n return `${Math.round(pos.x)}px ${Math.round(pos.y)}px`;\n}\n\nfunction normalizeCssSize(v: string): string {\n const raw = v.trim();\n if (!raw) return 'auto';\n if (/^-?\\d+(\\.\\d+)?$/.test(raw)) return `${raw}px`;\n const appendedPxNumber = raw.match(/px(-?\\d+(?:\\.\\d+)?)$/i);\n if (appendedPxNumber) return `${appendedPxNumber[1]}px`;\n return raw;\n}\n\nfunction getAuthoredStyleValue(el: Element, prop: string): string {\n const inline = (el as HTMLElement).style.getPropertyValue(prop).trim();\n if (inline) return inline;\n let found = '';\n try {\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules)) {\n if (!(rule instanceof CSSStyleRule)) continue;\n if (!rule.style.getPropertyValue(prop)) continue;\n if (el.matches(rule.selectorText)) found = rule.style.getPropertyValue(prop).trim();\n }\n } catch { /* ignore */ }\n }\n } catch {}\n return found;\n}\n\nfunction inferSizeMode(el: Element, axis: SizeAxis, computedSize: string): SizeMode {\n const cs = getComputedStyle(el);\n const authored = getAuthoredStyleValue(el, axis).toLowerCase();\n const display = cs.display.trim();\n const flexGrow = Number.parseFloat(cs.flexGrow) || 0;\n\n if (authored) {\n if (authored === 'auto') return axis === 'height' ? 'hug' : 'fill';\n if (authored.includes('fit-content') || authored.includes('max-content') || authored.includes('min-content')) return 'hug';\n if (authored.includes('%') || authored.includes('vw') || authored.includes('vh') || flexGrow > 0) return 'fill';\n return 'fixed';\n }\n\n if (axis === 'width') {\n if (flexGrow > 0) return 'fill';\n if (display === 'block' && el.parentElement) {\n const parentWidth = el.parentElement.getBoundingClientRect().width;\n const selfWidth = el.getBoundingClientRect().width;\n if (parentWidth > 0 && selfWidth / parentWidth > 0.88) return 'fill';\n }\n if (display.startsWith('inline')) return 'hug';\n }\n\n if (axis === 'height' && !getAuthoredStyleValue(el, 'min-height') && computedSize !== '0px') {\n return 'hug';\n }\n\n return 'fixed';\n}\n\nfunction sizeValueForMode(mode: SizeMode, current: string): string {\n if (mode === 'fill') return '100%';\n if (mode === 'hug') return 'fit-content';\n return current || '0px';\n}\n\nfunction displaySizeValue(cssValue: string, current: string): string {\n if (!cssValue || cssValue === '100%' || cssValue === 'fit-content') return current || '0px';\n return cssValue;\n}\n\nfunction getOneLineHugHeight(el: Element | null): number {\n if (!(el instanceof HTMLElement)) return 0;\n const hasText = (el.textContent ?? '').trim().length > 0;\n const isTextControl = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLButtonElement;\n if (!hasText && !isTextControl) return 0;\n\n const cs = getComputedStyle(el);\n const fontSize = Number.parseFloat(cs.fontSize) || 0;\n const lineHeight = cs.lineHeight === 'normal'\n ? fontSize * 1.2\n : Number.parseFloat(cs.lineHeight) || fontSize * 1.2;\n const paddingY = (Number.parseFloat(cs.paddingTop) || 0) + (Number.parseFloat(cs.paddingBottom) || 0);\n const borderY = (Number.parseFloat(cs.borderTopWidth) || 0) + (Number.parseFloat(cs.borderBottomWidth) || 0);\n return Math.ceil(lineHeight + paddingY + borderY);\n}\n\nfunction clampHeightToOneLine(cssValue: string, el: Element | null): string {\n const px = cssValue.match(/^(-?\\d+(?:\\.\\d+)?)px$/i);\n if (!px) return cssValue;\n const minH = getOneLineHugHeight(el);\n if (!minH) return cssValue;\n return `${Math.max(Number.parseFloat(px[1]), minH)}px`;\n}\n\nfunction calcPanelPos(rect: DOMRect): { top: number; left: number } {\n const W = 380;\n const maxH = window.innerHeight * 0.9; // 和 CSS max-height: 90vh 保持一致\n let left = rect.right + 16;\n let top = rect.top;\n if (left + W > window.innerWidth - 8) left = Math.max(8, rect.left - W - 16);\n // 确保面板不超出底部:top + 90vh <= 100vh\n top = Math.min(top, window.innerHeight - maxH - 8);\n top = Math.max(8, top);\n return { top, left };\n}\n\nfunction matchPreset<T extends { value: string }>(presets: T[], val: string): T | null {\n const px = val.replace(/\\s/g, '');\n return presets.find(p => p.value === px || p.value === val) ?? null;\n}\n\nfunction resizeTextareaToContent(el: HTMLTextAreaElement) {\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n}\n\n// ── SideInput:单格输入,支持 token 下拉 ──────────────────────\nfunction SideInput({\n value,\n onChange,\n spaceSteps,\n wide,\n compact,\n}: {\n value: string;\n onChange: (v: string) => void;\n spaceSteps: DevInspectorTokenConfig['spaceSteps'];\n wide?: boolean;\n compact?: boolean;\n}) {\n const [focused, setFocused] = useState(false);\n const [draft, setDraft] = useState('');\n const [popupPos, setPopupPos] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLDivElement>(null);\n const step = spaceSteps.find(s => s.val === value);\n const displayLabel = step && step.label !== '无' ? step.label : value === '0px' ? '0' : value;\n const displaySub = step && step.label !== '无' ? value : null;\n\n return (\n <div className={`di-side-combo${wide ? ' di-side-combo--wide' : ''}${compact ? ' di-side-combo--compact' : ''}`}>\n <div className=\"di-side-display\" ref={triggerRef} onClick={() => {\n if (triggerRef.current) {\n const r = triggerRef.current.getBoundingClientRect();\n // wide 时左对齐,普通时居中\n setPopupPos({ top: r.bottom + 4, left: wide ? r.left : r.left + r.width / 2 });\n }\n setFocused(true); setDraft(value);\n }}>\n <span className=\"di-side-display-label\">{displayLabel}</span>\n {displaySub && <span className=\"di-side-display-sub\">{displaySub}</span>}\n </div>\n {focused && (\n <>\n <div className=\"di-side-overlay\" onClick={() => setFocused(false)} />\n <div className=\"di-side-popup\" style={{ top: popupPos.top, left: popupPos.left, transform: wide ? 'none' : 'translateX(-50%)' }}>\n <input\n className=\"di-side-input-edit\"\n value={draft}\n autoFocus\n onChange={e => setDraft(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n const s = spaceSteps.find(s => s.label.toLowerCase() === draft.toLowerCase());\n onChange(s ? s.val : draft || '0px');\n setFocused(false);\n }\n if (e.key === 'Escape') setFocused(false);\n }}\n placeholder=\"输入数值…\"\n />\n <div className=\"di-side-steps\">\n {spaceSteps.map(s => (\n <button key={s.val}\n className={`di-side-step-item${value === s.val ? ' di-side-step-item--on' : ''}`}\n onMouseDown={e => { e.preventDefault(); onChange(s.val); setFocused(false); }}>\n <span>{s.label}</span>\n {s.val !== '0px' && <span className=\"di-side-step-sub\">{s.val}</span>}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n\ntype FourSides = { top: string; right: string; bottom: string; left: string };\nfunction parseFourSides(val: string): FourSides {\n const p = (val || '0px').trim().split(/\\s+/);\n if (p.length === 1) return { top: p[0], right: p[0], bottom: p[0], left: p[0] };\n if (p.length === 2) return { top: p[0], right: p[1], bottom: p[0], left: p[1] };\n if (p.length === 3) return { top: p[0], right: p[1], bottom: p[2], left: p[1] };\n return { top: p[0], right: p[1], bottom: p[2], left: p[3] };\n}\nfunction joinFourSides(s: FourSides): string {\n if (s.top === s.right && s.right === s.bottom && s.bottom === s.left) return s.top;\n if (s.top === s.bottom && s.left === s.right) return `${s.top} ${s.right}`;\n return `${s.top} ${s.right} ${s.bottom} ${s.left}`;\n}\n\n// SpaceCard 子组件\nfunction SpaceCard({ title, variant, value, onChange, spaceSteps }: {\n title: string;\n variant: 'padding' | 'margin' | 'gap';\n value: string;\n onChange: (v: string) => void;\n spaceSteps: DevInspectorTokenConfig['spaceSteps'];\n}) {\n // gap:宽版 SideInput,图示放 input 左右两侧\n if (variant === 'gap') {\n return (\n <div className=\"di-space-card\">\n <div className=\"di-space-head\">\n <span className=\"di-space-title\">{title}</span>\n </div>\n <div className=\"di-gap-input-row\">\n <div className=\"di-gap-block\" />\n <SideInput value={value} onChange={onChange} spaceSteps={spaceSteps} wide />\n <div className=\"di-gap-block\" />\n </div>\n </div>\n );\n }\n\n // padding / margin:4方向 SideInput\n const sides = parseFourSides(value);\n function updateSide(side: keyof FourSides, v: string) {\n const next = { ...sides, [side]: v };\n onChange(joinFourSides(next));\n }\n\n return (\n <div className=\"di-space-card\">\n <div className=\"di-space-head\">\n <span className=\"di-space-title\">{title}</span>\n </div>\n <div className={`di-boxing di-boxing--${variant}`}>\n <div className=\"di-box-top\"> <SideInput value={sides.top} onChange={v => updateSide('top', v)} spaceSteps={spaceSteps} compact /></div>\n <div className=\"di-box-left\"> <SideInput value={sides.left} onChange={v => updateSide('left', v)} spaceSteps={spaceSteps} compact /></div>\n <div className=\"di-box-center\"><div className=\"di-boxing-block\" /></div>\n <div className=\"di-box-right\"> <SideInput value={sides.right} onChange={v => updateSide('right', v)} spaceSteps={spaceSteps} compact /></div>\n <div className=\"di-box-bottom\"><SideInput value={sides.bottom} onChange={v => updateSide('bottom', v)} spaceSteps={spaceSteps} compact /></div>\n </div>\n </div>\n );\n}\n\n// 判断是否为文字元素(直接包含文本内容)\nfunction getTextContent(el: Element): string | null {\n const text = Array.from(el.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent ?? '')\n .join('')\n .trim();\n // 只有纯文本(或极少子元素)才视为文字层\n return text.length > 0 ? el.textContent?.trim() ?? null : null;\n}\n\nconst TOKEN_TYPES = [\n { key: 'bg', label: '背景色', code: 'bg' },\n { key: 'text', label: '文字色', code: 'text' },\n { key: 'accent', label: '强调色', code: 'accent' },\n { key: 'border', label: '边框色', code: 'border' },\n];\nconst TOKEN_COMPONENTS = [\n { key: 'global', label: '全局', code: 'global' },\n { key: 'sidebar', label: '侧边栏', code: 'sidebar' },\n { key: 'button', label: '按钮', code: 'button' },\n { key: 'card', label: '卡片', code: 'card' },\n { key: 'tag', label: '标签', code: 'tag' },\n { key: 'input', label: '输入框', code: 'input' },\n];\nconst TOKEN_STATES = [\n { key: 'default', label: '默认态', code: 'default' },\n { key: 'hover', label: '悬浮态', code: 'hover' },\n { key: 'active', label: '激活态', code: 'active' },\n { key: 'disabled', label: '禁用态', code: 'disabled' },\n { key: 'success', label: '成功态', code: 'success' },\n { key: 'warning', label: '警告态', code: 'warning' },\n];\n\n// ─── ColorDropdown:色板分组下拉 ──────────────────────────────────\nfunction ColorDropdown({ value, onChange, onClose, onAddToken, pos, colorPalette }: {\n value: string;\n onChange: (v: string, token: string) => void;\n onClose: () => void;\n onAddToken?: (val: string) => void; // 只传颜色值,Modal 里选 token 名\n pos?: { top: number; left: number };\n colorPalette: DevInspectorTokenConfig['colorPalette'];\n}) {\n const initHex = value.startsWith('#') ? value : '#6b7280';\n const [hexInput, setHexInput] = useState(initHex);\n const [alpha, setAlpha] = useState(100);\n\n function buildColor(hex: string, a: number): string {\n const m = hex.match(/^#([0-9a-f]{6})$/i);\n if (!m || a >= 100) return hex;\n const r=parseInt(m[1].slice(0,2),16), g=parseInt(m[1].slice(2,4),16), b=parseInt(m[1].slice(4,6),16);\n return `rgba(${r},${g},${b},${(a/100).toFixed(2)})`;\n }\n\n function applyColor(hex: string, a: number) {\n onChange(buildColor(hex, a), '');\n }\n\n const style = pos ? { position: 'fixed' as const, top: pos.top, left: pos.left, zIndex: 99998 } : {};\n return (\n <>\n <div style={{ position: 'fixed', inset: 0, zIndex: 99997 }} onClick={onClose} />\n <div className=\"di-palette-dropdown\" style={style}>\n {/* 无背景色 */}\n <div className=\"di-palette-group\">\n <div className=\"di-palette-group-label\">无</div>\n <div className=\"di-palette-swatches\">\n <button className=\"di-palette-none\" title=\"无背景色 / transparent\"\n onClick={() => { onChange('transparent', ''); onClose(); }} />\n </div>\n </div>\n\n {/* 色板 + 每组末尾「+」格子 */}\n {colorPalette.map(g => (\n <div key={g.group} className=\"di-palette-group\">\n <div className=\"di-palette-group-label\">{g.group}</div>\n <div className=\"di-palette-swatches\">\n {g.colors.map(c => (\n <button key={c.token}\n className={`di-palette-swatch${value === c.val ? ' di-palette-swatch--on' : ''}`}\n style={{ background: c.val }}\n title={`${g.group}·${c.label} ${c.val}`}\n onClick={() => { onChange(c.val, c.token); onClose(); }}\n />\n ))}\n {onAddToken && (\n <button className=\"di-palette-add-btn\" title={`添加为${g.group}色 token`}\n onClick={() => { onAddToken(buildColor(hexInput, alpha)); onClose(); }}>\n +\n </button>\n )}\n </div>\n </div>\n ))}\n\n {/* 自定义底部:色块 + [#][hex] + [alpha][%] */}\n <div className=\"di-custom-bottom\">\n <button className=\"di-custom-color-trigger\" style={{ background: buildColor(hexInput, alpha), flexShrink: 0 }}\n onClick={() => {}} />\n {/* hex 输入,# 是灰色前缀 */}\n <div className=\"di-field-wrap\">\n <span className=\"di-field-prefix\">#</span>\n <input className=\"di-field-input\" value={hexInput.replace(/^#/, '')} placeholder=\"ffffff\"\n onChange={e => { const h='#'+e.target.value; setHexInput(h); applyColor(h, alpha); }}\n onBlur={e => { if (!/^[0-9a-f]{6}$/i.test(e.target.value)) setHexInput(initHex); }}\n />\n </div>\n {/* 透明度,% 是灰色后缀 */}\n <div className=\"di-field-wrap di-field-wrap--fixed\">\n <input className=\"di-field-input di-field-input--num\" type=\"number\" min=\"0\" max=\"100\" value={alpha}\n onChange={e => { const a=Math.min(100,Math.max(0,+e.target.value||0)); setAlpha(a); applyColor(hexInput, a); }}\n />\n <span className=\"di-field-suffix\">%</span>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// 从 CSS 属性名推断颜色类型\nfunction inferType(cssProp?: string): string {\n if (!cssProp) return 'bg';\n if (cssProp === 'color') return 'text';\n if (cssProp.includes('border')) return 'border';\n if (cssProp.includes('background')) return 'bg';\n return 'accent';\n}\n\n// 从 class 列表推断组件\nfunction inferComponent(classes: string[]): string {\n const joined = classes.join(' ').toLowerCase();\n if (/sidebar|nav-item|nav/.test(joined)) return 'sidebar';\n if (/button|btn|start/.test(joined)) return 'button';\n if (/card/.test(joined)) return 'card';\n if (/tag|badge|chip/.test(joined)) return 'tag';\n if (/input|field|form/.test(joined)) return 'input';\n return 'global';\n}\n\n// 从 class 列表推断状态\nfunction inferState(classes: string[]): string {\n const joined = classes.join(' ').toLowerCase();\n if (/is-active|active|is-current|current/.test(joined)) return 'active';\n if (/disabled/.test(joined)) return 'disabled';\n if (/hover/.test(joined)) return 'hover';\n if (/success/.test(joined)) return 'success';\n if (/warning/.test(joined)) return 'warning';\n return 'default';\n}\n\n// ─── AddTokenModal:添加 token 弹出框 ─────────────────────────────\nfunction AddTokenModal({ value, cssProp, elementClasses, onClose, onConfirm, colorPalette }: {\n value: string;\n cssProp?: string;\n elementClasses?: string[];\n onClose: () => void;\n onConfirm: (cssVar: string, val: string, usage: string) => void;\n colorPalette: DevInspectorTokenConfig['colorPalette'];\n}) {\n const [mode, setMode] = useState<'new' | 'replace'>('new');\n const [type, setType] = useState(() => inferType(cssProp));\n const [component, setComponent] = useState(() => inferComponent(elementClasses ?? []));\n const [state, setState] = useState(() => inferState(elementClasses ?? []));\n const [replaceTarget, setReplaceTarget] = useState('');\n\n const allTokens = colorPalette.flatMap(g => g.colors);\n const typeObj = TOKEN_TYPES.find(t => t.key === type)!;\n const componentObj = TOKEN_COMPONENTS.find(c => c.key === component)!;\n const stateObj = TOKEN_STATES.find(s => s.key === state)!;\n\n const generatedVar = mode === 'new'\n ? `--color-${typeObj.code}-${componentObj.code}-${stateObj.code}`\n : replaceTarget;\n\n const BtnGroup = ({ items, active, onSelect }: { items: {key:string;label:string}[]; active: string; onSelect:(k:string)=>void }) => (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {items.map(i => (\n <button key={i.key}\n className={`di-modal-opt-btn${active === i.key ? ' --on' : ''}`}\n onClick={() => onSelect(i.key)}>\n {i.label}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"di-modal-overlay\" onClick={onClose}>\n <div className=\"di-modal\" onClick={e => e.stopPropagation()}>\n {/* 顶部颜色信息 */}\n <div className=\"di-modal-header\">\n <span className=\"di-modal-swatch\" style={{ background: value }} />\n <span className=\"di-modal-hex\">{value}</span>\n <div style={{ flex: 1 }} />\n <span style={{ fontSize: 12, color: '#6b7280' }}>添加为 token</span>\n </div>\n\n <div className=\"di-modal-body\">\n {/* 模式切换 */}\n <div className=\"di-modal-tabs\">\n {[{k:'new',l:'新建 token'},{k:'replace',l:'替换已有 token'}].map(m => (\n <button key={m.k} className={`di-modal-tab${mode===m.k?' --on':''}`}\n onClick={() => setMode(m.k as 'new'|'replace')}>{m.l}</button>\n ))}\n </div>\n\n {mode === 'new' ? (\n <>\n <div className=\"di-modal-field\">\n <div className=\"di-modal-field-label\">颜色类型 <span className=\"di-modal-auto-tag\">自动识别</span></div>\n <BtnGroup items={TOKEN_TYPES} active={type} onSelect={setType} />\n </div>\n <div className=\"di-modal-field\">\n <div className=\"di-modal-field-label\">组件 <span className=\"di-modal-auto-tag\">自动识别</span></div>\n <BtnGroup items={TOKEN_COMPONENTS} active={component} onSelect={setComponent} />\n </div>\n <div className=\"di-modal-field\">\n <div className=\"di-modal-field-label\">用途 / 状态 <span className=\"di-modal-auto-tag\">自动推断,可改</span></div>\n <BtnGroup items={TOKEN_STATES} active={state} onSelect={setState} />\n </div>\n </>\n ) : (\n <div className=\"di-modal-field\">\n <div className=\"di-modal-field-label\">选择要替换的 token</div>\n <select className=\"di-modal-select\"\n value={replaceTarget} onChange={e => setReplaceTarget(e.target.value)}>\n <option value=\"\">请选择…</option>\n {allTokens.map(c => (\n <option key={c.token} value={c.token}>{c.token}({c.val})</option>\n ))}\n </select>\n </div>\n )}\n\n {/* 生成结果预览 */}\n {generatedVar && (\n <div className=\"di-modal-result\">\n <div className=\"di-modal-result-label\">系统生成 token 名称</div>\n <div className=\"di-modal-result-var\">{generatedVar}</div>\n {mode === 'new' && (\n <div className=\"di-modal-result-trail\">\n {typeObj.label} → <code>{typeObj.code}</code>\n &ensp;{componentObj.label} → <code>{componentObj.code}</code>\n &ensp;{stateObj.label} → <code>{stateObj.code}</code>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* 底部按钮 */}\n <div className=\"di-modal-foot\">\n <button className=\"di-modal-cancel\" onClick={onClose}>取消</button>\n <button className=\"di-modal-ok\" disabled={!generatedVar}\n onClick={() => { if (generatedVar) { onConfirm(generatedVar, value, type); onClose(); } }}>\n 确认创建\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// 获取颜色的显示标签(优先用色板短标签,其次 tokenMap,最后 hex)\nfunction getDisplayLabel(\n val: string,\n tokenMap: Record<string, string>,\n colorPalette: DevInspectorTokenConfig['colorPalette'],\n tokenLabels: DevInspectorTokenConfig['tokenLabels'],\n): { label: string; sub: string; isHardcoded: boolean } {\n const displayVal = formatColorDisplay(val);\n const paletteLabel = getColorLabel(val, colorPalette);\n if (paletteLabel) return { label: paletteLabel, sub: displayVal, isHardcoded: false };\n const token = tokenMap[val];\n if (token) return { label: tokenLabels[token] ?? token.replace('--', ''), sub: displayVal, isHardcoded: false };\n return { label: displayVal, sub: '', isHardcoded: true };\n}\n\n// ─── InspectorPanel:可复用的面板组件 ────────────────────────────\nexport function InspectorPanel({\n targetEl,\n tokenMap,\n onTokenMapUpdate,\n onClose,\n}: {\n targetEl: Element;\n tokenMap: Record<string, string>;\n onTokenMapUpdate: (updates: Record<string, string>) => void;\n onClose: () => void;\n}) {\n const isSecondary = false;\n const { endpoints, tokens } = useDevInspectorConfig();\n const {\n colorPalette,\n tokenLabels,\n radiusPresets,\n spaceSteps,\n borderWidthSteps,\n fontSizeOptions,\n fontWeightOptions,\n shadowTokens,\n typographyTokens,\n } = tokens;\n const shadowOptions = [\n { cssVar: '', value: 'none', label: '无', usage: '不使用阴影' },\n ...shadowTokens,\n ];\n const [isEditing, setIsEditing] = useState(false);\n const panelElRef = useRef<HTMLDivElement>(null);\n const [selected, setSelected] = useState<Element>(targetEl);\n const [panelPos, setPanelPos] = useState(() => calcPanelPos(targetEl.getBoundingClientRect()));\n const dragRef = useRef<{ sx: number; sy: number; sl: number; st: number } | null>(null);\n const modalOpenRef = useRef(false);\n const [colors, setColors] = useState<Record<string, string>>({});\n const [radiusVal, setRadiusVal] = useState('');\n const [paddingVal, setPaddingVal] = useState('0px');\n const [marginVal, setMarginVal] = useState('0px');\n const [gapVal, setGapVal] = useState('0px');\n const [translateVal, setTranslateVal] = useState({ x: 0, y: 0 });\n const [widthVal, setWidthVal] = useState('');\n const [heightVal, setHeightVal] = useState('');\n const [widthMode, setWidthMode] = useState<SizeMode>('fixed');\n const [heightMode, setHeightMode] = useState<SizeMode>('hug');\n const [customRadius, setCustomRadius] = useState('');\n const [scope, setScope] = useState<ScopeMode>('current');\n const [note, setNote] = useState('');\n const [textContent, setTextContent] = useState<string | null>(null);\n const [pendingColors, setPendingColors] = useState<Record<string, string>>({});\n const [pendingRadius, setPendingRadius] = useState('');\n const [shadowVal, setShadowVal] = useState('none');\n const [shadowAuthoredVal, setShadowAuthoredVal] = useState('');\n const [pendingShadow, setPendingShadow] = useState('');\n const [borderColorVal, setBorderColorVal] = useState('');\n const [borderWidthVal, setBorderWidthVal] = useState('0px');\n const [borderStyleVal, setBorderStyleVal] = useState('none');\n const [pendingBorderColor, setPendingBorderColor] = useState('');\n const [pendingBorderWidth, setPendingBorderWidth] = useState('');\n const [pendingBorderStyle, setPendingBorderStyle] = useState('');\n const [expandedBorderColor, setExpandedBorderColor] = useState(false);\n const [showShadowDrop, setShowShadowDrop] = useState(false);\n const [showStyleDrop, setShowStyleDrop] = useState(false);\n const [showWeightDrop, setShowWeightDrop] = useState(false);\n const [showFontSizeDrop, setShowFontSizeDrop] = useState(false);\n const [showScopeHelp, setShowScopeHelp] = useState(false);\n const [dropPos, setDropPos] = useState({ top: 0, left: 0 });\n const [fontSizeVal, setFontSizeVal] = useState('');\n const [fontWeightVal, setFontWeightVal] = useState('');\n const [textColorVal, setTextColorVal] = useState('');\n const [fontSizeCustomDraft, setFontSizeCustomDraft] = useState('');\n const [expandedTextColor, setExpandedTextColor] = useState(false);\n const [pendingFontSize, setPendingFontSize] = useState('');\n const [pendingFontWeight, setPendingFontWeight] = useState('');\n const [pendingTextColor, setPendingTextColor] = useState('');\n const [pendingPadding, setPendingPadding] = useState('');\n const [pendingMargin, setPendingMargin] = useState('');\n const [pendingGap, setPendingGap] = useState('');\n const [pendingTranslate, setPendingTranslate] = useState<{ x: number; y: number } | null>(null);\n const [pendingWidth, setPendingWidth] = useState('');\n const [pendingHeight, setPendingHeight] = useState('');\n const [pendingWidthMode, setPendingWidthMode] = useState<SizeMode | null>(null);\n const [pendingHeightMode, setPendingHeightMode] = useState<SizeMode | null>(null);\n const [sizeDraft, setSizeDraft] = useState<Partial<Record<SizeAxis, string>>>({});\n const [newTokenProp, setNewTokenProp] = useState<string | null>(null);\n const [newTokenName, setNewTokenName] = useState('');\n const [saveMsg, setSaveMsg] = useState('');\n const [copyMsg, setCopyMsg] = useState('');\n const [submitMsg, setSubmitMsg] = useState('');\n const [styleIntentSummary, setStyleIntentSummary] = useState<StyleIntentSummary>({ pendingCount: 0, latestPending: null, pendingEntries: [] });\n const [hasCopied, setHasCopied] = useState(() => _copiedStyles.length > 0);\n const [expandedColor, setExpandedColor] = useState<string | null>(null);\n const [pendingNewToken, setPendingNewToken] = useState<{ cssVar: string; value: string; usage: string } | null>(null);\n const [addTokenModal, setAddTokenModal] = useState<{ value: string; cssProp?: string } | null>(null);\n const [customColorVals, setCustomColorVals] = useState<Record<string, string>>({});\n const selectedRef = useRef<Element>(targetEl);\n const gapTargetRef = useRef<HTMLElement | null>(null); // gap 实际作用的元素(可能是父容器)\n\n useEffect(() => { modalOpenRef.current = addTokenModal !== null; }, [addTokenModal]);\n\n const formatStyleIntentSummary = useCallback((r: any): StyleIntentSummary => ({\n pendingCount: r.pendingCount ?? 0,\n latestPending: r.latestPending\n ? {\n id: r.latestPending.id,\n targetLabel: r.latestPending.targetLabel,\n selector: r.latestPending.selector,\n createdAt: r.latestPending.createdAt,\n note: r.latestPending.note,\n entries: r.latestPending.entries ?? [],\n }\n : null,\n pendingEntries: Array.isArray(r.pendingEntries)\n ? r.pendingEntries.map((entry: any) => ({\n id: entry.id,\n targetLabel: entry.targetLabel,\n selector: entry.selector,\n createdAt: entry.createdAt,\n note: entry.note,\n entries: entry.entries ?? [],\n }))\n : [],\n }), []);\n\n const refreshStyleIntentSummary = useCallback(() => {\n fetch(endpoints.styleIntents)\n .then(r => r.json())\n .then(r => {\n if (r.ok) {\n setStyleIntentSummary(formatStyleIntentSummary(r));\n }\n })\n .catch(() => {});\n }, [endpoints.styleIntents, formatStyleIntentSummary]);\n\n useEffect(() => {\n refreshStyleIntentSummary();\n }, [refreshStyleIntentSummary]);\n\n // 选中逻辑\n const selectEl = useCallback((el: Element) => {\n selectedRef.current = el;\n const rect = el.getBoundingClientRect();\n setPanelPos(calcPanelPos(rect));\n\n // 读颜色\n const elCs = getComputedStyle(el);\n const c: Record<string, string> = {};\n for (const { prop } of COLOR_PROPS) {\n const val = getComputedColor(el, prop);\n if (!val || val === 'rgba(0, 0, 0, 0)' || val === 'transparent') continue;\n // 边框色:只在有真实边框时才显示\n if (prop === 'border-color' && elCs.borderWidth.trim() === '0px') continue;\n c[prop] = val;\n }\n setColors(c);\n setPendingColors({});\n\n // 字体\n setFontSizeVal(elCs.fontSize.trim());\n setFontWeightVal(elCs.fontWeight.trim());\n setTextColorVal(normalizeColor(elCs.color.trim()));\n setFontSizeCustomDraft(elCs.fontSize.trim());\n setPendingFontSize(''); setPendingFontWeight(''); setPendingTextColor('');\n setExpandedTextColor(false);\n\n // 边框\n const bw = elCs.borderTopWidth.trim();\n const bs = elCs.borderTopStyle.trim();\n const bc = normalizeColor(elCs.borderTopColor.trim());\n setBorderWidthVal(bw);\n setBorderStyleVal(bs);\n setBorderColorVal(bw !== '0px' ? bc : '');\n setPendingBorderColor(''); setPendingBorderWidth(''); setPendingBorderStyle('');\n setExpandedBorderColor(false);\n\n // 圆角\n const r = getComputedRadius(el);\n setRadiusVal(r);\n setPendingRadius('');\n\n // 阴影\n const shadowComputed = elCs.boxShadow.trim() || 'none';\n setShadowVal(shadowComputed === 'rgba(0, 0, 0, 0) 0px 0px 0px 0px' ? 'none' : shadowComputed);\n setShadowAuthoredVal(getAuthoredStyleValue(el, 'box-shadow'));\n setPendingShadow('');\n setShowShadowDrop(false);\n\n // 间距\n const cs = getComputedStyle(el);\n const normPad = (v: string) => {\n const parts = v.trim().split(' ');\n return parts.every(p => p === parts[0]) ? parts[0] : v.trim();\n };\n setPaddingVal(normPad(`${cs.paddingTop} ${cs.paddingRight} ${cs.paddingBottom} ${cs.paddingLeft}`));\n setMarginVal(normPad(`${cs.marginTop} ${cs.marginRight} ${cs.marginBottom} ${cs.marginLeft}`));\n const isFlexGrid = (d: string) => d.includes('flex') || d.includes('grid');\n if (isFlexGrid(cs.display)) {\n const g = cs.gap.trim();\n setGapVal(g === 'normal' ? '0px' : g);\n gapTargetRef.current = el as HTMLElement;\n } else if (el.parentElement) {\n const pcs = getComputedStyle(el.parentElement);\n if (isFlexGrid(pcs.display)) {\n const g = pcs.gap.trim();\n setGapVal(g === 'normal' ? '0px' : g);\n gapTargetRef.current = el.parentElement as HTMLElement;\n } else {\n setGapVal('0px');\n gapTargetRef.current = el as HTMLElement;\n }\n }\n setPendingPadding(''); setPendingMargin(''); setPendingGap('');\n\n setTranslateVal(parseTranslate(cs.translate));\n setWidthVal(cs.width.trim());\n setHeightVal(cs.height.trim());\n setWidthMode(inferSizeMode(el, 'width', cs.width.trim()));\n setHeightMode(inferSizeMode(el, 'height', cs.height.trim()));\n setPendingTranslate(null); setPendingWidth(''); setPendingHeight('');\n setPendingWidthMode(null); setPendingHeightMode(null);\n setSizeDraft({});\n\n setNote('');\n setTextContent(getTextContent(el));\n setNewTokenProp(null);\n setExpandedColor(null);\n setShowScopeHelp(false);\n setIsEditing(false); // 选中新元素时重置为查看模式\n setSelected(el);\n }, []);\n\n // targetEl 变化时读取样式(包含初始化)\n useEffect(() => { selectEl(targetEl); }, [targetEl]); // eslint-disable-line\n\n // 高亮选中\n useEffect(() => {\n document.querySelectorAll('.di-selected').forEach(e => e.classList.remove('di-selected'));\n if (scope !== 'current') {\n getScopeTargets(selected, scope).forEach(e => e.classList.add('di-selected'));\n } else {\n selected.classList.add('di-selected');\n }\n return () => {\n document.querySelectorAll('.di-selected').forEach(e => e.classList.remove('di-selected'));\n };\n }, [selected, scope]);\n\n // ─── 应用改动到 DOM ───────────────────────────────────────────\n function applyToDOM(changes: { prop: string; val: string }[]) {\n const el = selectedRef.current;\n if (!el) return;\n const targets = getScopeTargets(el, scope);\n changes.forEach(({ prop, val }) => {\n targets.forEach(t => (t as HTMLElement).style.setProperty(prop, val));\n });\n }\n\n function onDragStart(e: React.MouseEvent) {\n if ((e.target as Element).closest('button, input, textarea')) return;\n e.preventDefault();\n dragRef.current = { sx: e.clientX, sy: e.clientY, sl: panelPos.left, st: panelPos.top };\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current) return;\n const left = Math.max(0, Math.min(window.innerWidth - 380, dragRef.current.sl + ev.clientX - dragRef.current.sx));\n const top = Math.max(0, Math.min(window.innerHeight - 60, dragRef.current.st + ev.clientY - dragRef.current.sy));\n setPanelPos({ left, top });\n };\n const onUp = () => {\n dragRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }\n\n function handleAddToken(val: string, cssProp?: string) {\n setAddTokenModal({ value: val, cssProp });\n }\n\n function handleTokenConfirm(cssVar: string, val: string, usage: string) {\n setPendingNewToken({ cssVar, value: val, usage });\n onTokenMapUpdate({ [val]: cssVar });\n (tokenLabels as Record<string, string>)[cssVar] = cssVar.replace('--color-', '').replace(/-/g, '·');\n }\n\n function liveApply(prop: string, val: string) {\n if (prop === 'gap' && gapTargetRef.current) {\n gapTargetRef.current.style.setProperty('gap', val);\n } else {\n applyToDOM([{ prop, val }]);\n }\n }\n\n function liveApplyMany(changes: { prop: string; val: string }[]) {\n applyToDOM(changes);\n }\n\n function getPendingEntries() {\n const el = selectedRef.current;\n if (!el) return null;\n const fixedMinHeight = pendingHeight && pendingHeightMode === 'fixed'\n ? `${getOneLineHugHeight(el) || Number.parseFloat(pendingHeight) || 0}px`\n : '';\n\n const pending: [string, string][] = [\n ...Object.entries(pendingColors),\n ...(pendingTextColor ? [['color', pendingTextColor] as [string, string]] : []),\n ...(pendingRadius ? [['border-radius', pendingRadius] as [string, string]] : []),\n ...(pendingShadow ? [['box-shadow', pendingShadow] as [string, string]] : []),\n ...(pendingBorderColor ? [['border-color', pendingBorderColor] as [string, string]] : []),\n ...(pendingBorderWidth ? [['border-width', pendingBorderWidth] as [string, string]] : []),\n ...(pendingBorderStyle ? [['border-style', pendingBorderStyle] as [string, string]] : []),\n ...(pendingFontSize ? [['font-size', pendingFontSize] as [string, string]] : []),\n ...(pendingFontWeight ? [['font-weight', pendingFontWeight] as [string, string]] : []),\n ...(pendingPadding ? [['padding', pendingPadding] as [string, string]] : []),\n ...(pendingMargin ? [['margin', pendingMargin] as [string, string]] : []),\n ...(pendingGap ? [['gap', pendingGap] as [string, string]] : []),\n ...(pendingTranslate ? [['translate', formatTranslate(pendingTranslate)] as [string, string]] : []),\n ...(pendingWidth ? [['width', pendingWidth] as [string, string]] : []),\n ...(pendingHeight ? [['height', pendingHeight] as [string, string]] : []),\n ...(fixedMinHeight ? [['min-height', fixedMinHeight] as [string, string]] : []),\n ...(pendingHeight && pendingHeightMode === 'fixed' ? [['max-height', pendingHeight] as [string, string]] : []),\n ];\n\n const gapEntry = pending.find(([p]) => p === 'gap');\n const nonGapPending = pending.filter(([p]) => p !== 'gap');\n const selector = getSelectorForScope(el, scope);\n const entries: { selector: string; changes: { prop: string; val: string; from?: string }[]; note?: string }[] = [];\n\n if (gapEntry && gapTargetRef.current && gapTargetRef.current !== el) {\n entries.push({\n selector: getSelectorForScope(gapTargetRef.current, 'current'),\n changes: [{ prop: 'gap', from: gapVal, val: gapEntry[1] }],\n });\n }\n\n entries.push({\n selector,\n changes: (gapEntry && gapTargetRef.current !== el ? nonGapPending : pending)\n .map(([prop, val]) => ({ prop, from: getOriginalValueForProp(prop), val })),\n note: note || undefined,\n });\n\n return {\n el,\n selector,\n pending,\n entries,\n };\n }\n\n function nudgeSelected(dx: number, dy: number) {\n const base = pendingTranslate ?? translateVal;\n const next = { x: base.x + dx, y: base.y + dy };\n setPendingTranslate(next);\n liveApply('translate', formatTranslate(next));\n }\n\n function setSize(prop: SizeAxis, val: string, mode: SizeMode = 'fixed') {\n const current = prop === 'width' ? widthVal : heightVal;\n const next = normalizeCssSize(val);\n const selectedEl = selectedRef.current;\n const cssValue = prop === 'height' && mode === 'fixed'\n ? clampHeightToOneLine(next, selectedEl)\n : mode === 'fixed' ? next : sizeValueForMode(mode, current);\n if (prop === 'width') {\n setPendingWidth(cssValue);\n setPendingWidthMode(mode);\n } else {\n setPendingHeight(cssValue);\n setPendingHeightMode(mode);\n }\n if (prop === 'height' && mode === 'fixed') {\n const minHeight = `${getOneLineHugHeight(selectedEl) || Number.parseFloat(cssValue) || 0}px`;\n liveApplyMany([\n { prop: 'height', val: cssValue },\n { prop: 'min-height', val: minHeight },\n { prop: 'max-height', val: cssValue },\n ]);\n return;\n }\n if (prop === 'height') {\n const el = selectedRef.current as HTMLElement | null;\n if (el) {\n const targets = getScopeTargets(el, scope);\n targets.forEach(t => (t as HTMLElement).style.removeProperty('min-height'));\n targets.forEach(t => (t as HTMLElement).style.removeProperty('max-height'));\n }\n }\n liveApply(prop, cssValue);\n }\n\n // ─── 保存并修改 ───────────────────────────────────────────────\n function handleSave() {\n const payload = getPendingEntries();\n if (!payload) return;\n const { el, pending, entries } = payload;\n\n if (pending.length === 0 && !note && !newTokenName) {\n setSaveMsg('无改动');\n setTimeout(() => setSaveMsg(''), 1500);\n return;\n }\n\n applyToDOM(pending.map(([prop, val]) => ({ prop, val })));\n\n if (!canPersistSelector(el, scope)) {\n setSaveMsg('需选中具体类名');\n setTimeout(() => setSaveMsg(''), 2000);\n return;\n }\n\n fetch(endpoints.applyCss, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ entries }),\n })\n .then(r => r.json())\n .then(r => {\n setSaveMsg(r.ok ? '已保存 ✓' : '保存失败');\n setTimeout(() => setSaveMsg(''), 2000);\n })\n .catch(() => { setSaveMsg('保存失败'); setTimeout(() => setSaveMsg(''), 2000); });\n }\n\n async function copyTextToClipboard(text: string): Promise<boolean> {\n if (navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // 异步请求返回后常常丢失用户激活态,继续尝试 execCommand 兜底\n }\n }\n const ta = document.createElement('textarea');\n ta.value = text;\n ta.style.cssText = 'position:fixed;opacity:0;top:0;left:0';\n document.body.appendChild(ta);\n ta.select();\n const copied = document.execCommand('copy');\n document.body.removeChild(ta);\n return copied;\n }\n\n function buildAiTaskPrompt(params: {\n entryId?: string;\n targetLabel: string;\n selector: string;\n scopeLabel: string;\n changes: { prop: string; from: string; val: string }[];\n }) {\n const inboxJson = '/Users/heqiao/Desktop/Claude练习/项目3-快消AI中台/docs/style-inbox.json';\n const inboxMd = '/Users/heqiao/Desktop/Claude练习/项目3-快消AI中台/docs/STYLE_INBOX.md';\n const changes = params.changes\n .map((change, index) => `${index + 1}. ${getChangeLabel(change.prop)}:${change.from} → ${change.val}`)\n .join('\\n');\n const latestHint = params.entryId\n ? `优先处理 id = ${params.entryId} 这条记录。`\n : '这条任务文本来自当前选中元素的本轮修改。';\n return [\n '请处理这条 DevInspector 样式任务:',\n '',\n latestHint,\n `如需查看累计记录,读取:${inboxJson}`,\n `必要时对照:${inboxMd}`,\n '',\n `对象:${params.targetLabel}`,\n `作用范围:${params.scopeLabel}`,\n `选择器:${params.selector}`,\n '改动:',\n changes,\n '',\n '请先判断是否适合固化进正式组件样式,再修改代码,并在处理后把这条任务标记为已处理。',\n ].join('\\n');\n }\n\n function handleSubmitToAi() {\n const payload = getPendingEntries();\n if (!payload) return;\n const { el, pending, selector } = payload;\n const changes = getPendingChangeRecords();\n if (pending.length === 0 && !note) {\n setSubmitMsg('先改点样式或写备注');\n setTimeout(() => setSubmitMsg(''), 1800);\n return;\n }\n\n const scopeLabel = scope === 'current' ? '当前元素' : '同组件';\n const targetClasses = getClasses(el);\n const targetLabel = targetClasses.length\n ? `${el.tagName.toLowerCase()}.${targetClasses.join('.')}`\n : el.tagName.toLowerCase();\n\n const prompt = buildAiTaskPrompt({\n targetLabel,\n selector,\n scopeLabel,\n changes,\n });\n copyTextToClipboard(prompt)\n .then((copied) => {\n setSubmitMsg(copied ? '任务文本已复制 ✓' : '复制失败');\n setTimeout(() => setSubmitMsg(''), copied ? 2200 : 1800);\n })\n .catch(() => {\n setSubmitMsg('复制失败');\n setTimeout(() => setSubmitMsg(''), 1800);\n });\n }\n\n function handleDeleteStyleIntent(intentId: string, selector?: string, prop?: string) {\n fetch(endpoints.deleteStyleIntent, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: intentId, selector, prop }),\n })\n .then(async response => {\n let body: any = null;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n return {\n httpOk: response.ok,\n ...(body ?? {}),\n };\n })\n .then(r => {\n if (r.ok) {\n setStyleIntentSummary(formatStyleIntentSummary(r));\n setSubmitMsg(prop ? '已删除属性' : '已删除对象');\n } else {\n const errorMsg = !r.httpOk\n ? '删除失败:本地服务异常'\n : `删除失败${r.error ? `:${String(r.error)}` : ''}`;\n setSubmitMsg(errorMsg);\n }\n setTimeout(() => setSubmitMsg(''), 1800);\n })\n .catch(() => {\n setSubmitMsg('删除失败:请刷新页面或重启本地 dev');\n setTimeout(() => setSubmitMsg(''), 1800);\n });\n }\n\n function getOriginalValueForProp(prop: string) {\n if (prop === 'font-size') return fontSizeVal;\n if (prop === 'font-weight') return fontWeightVal;\n if (prop === 'color') return getDisplayLabel(textColorVal, tokenMap, colorPalette, tokenLabels).label;\n if (prop === 'background-color') return getDisplayLabel(colors[prop] ?? '', tokenMap, colorPalette, tokenLabels).label;\n if (prop === 'border-color') return getDisplayLabel(borderColorVal, tokenMap, colorPalette, tokenLabels).label;\n if (prop === 'border-width') return borderWidthVal;\n if (prop === 'border-style') return borderStyleVal;\n if (prop === 'border-radius') return radiusVal;\n if (prop === 'box-shadow') return getShadowDisplay(shadowVal, shadowAuthoredVal, shadowTokens).label;\n if (prop === 'padding') return paddingVal;\n if (prop === 'margin') return marginVal;\n if (prop === 'gap') return gapVal;\n if (prop === 'translate') return formatTranslate(translateVal);\n if (prop === 'width') return widthVal;\n if (prop === 'height') return heightVal;\n if (prop === 'min-height') return `${getOneLineHugHeight(selectedRef.current) || Number.parseFloat(heightVal) || 0}px`;\n if (prop === 'max-height') return heightVal;\n return '';\n }\n\n function getPendingChangeRecords() {\n const records: { prop: string; from: string; val: string }[] = [];\n const add = (prop: string, from: string, val: string) => records.push({ prop, from, val });\n if (pendingFontSize) add('font-size', fontSizeVal, pendingFontSize);\n if (pendingFontWeight) add('font-weight', fontWeightVal, pendingFontWeight);\n if (pendingTextColor) add('color', getDisplayLabel(textColorVal, tokenMap, colorPalette, tokenLabels).label, getDisplayLabel(pendingTextColor, tokenMap, colorPalette, tokenLabels).label);\n for (const [prop, val] of Object.entries(pendingColors)) {\n add(prop, getDisplayLabel(colors[prop] ?? '', tokenMap, colorPalette, tokenLabels).label, getDisplayLabel(val, tokenMap, colorPalette, tokenLabels).label);\n }\n if (pendingBorderColor) add('border-color', getDisplayLabel(borderColorVal, tokenMap, colorPalette, tokenLabels).label, getDisplayLabel(pendingBorderColor, tokenMap, colorPalette, tokenLabels).label);\n if (pendingBorderWidth) add('border-width', borderWidthVal, pendingBorderWidth);\n if (pendingBorderStyle) add('border-style', borderStyleVal, pendingBorderStyle);\n if (pendingRadius) add('border-radius', radiusVal, pendingRadius);\n if (pendingShadow) add('box-shadow', getShadowDisplay(shadowVal, shadowAuthoredVal, shadowTokens).label, getShadowDisplay(pendingShadow, pendingShadow, shadowTokens).label);\n if (pendingPadding) add('padding', paddingVal, pendingPadding);\n if (pendingMargin) add('margin', marginVal, pendingMargin);\n if (pendingGap) add('gap', gapVal, pendingGap);\n if (pendingTranslate) add('translate', formatTranslate(translateVal), formatTranslate(pendingTranslate));\n if (pendingWidth) add('width', widthVal, pendingWidth);\n if (pendingHeight) add('height', heightVal, pendingHeight);\n if (pendingNewToken) add('token', '新增', `${pendingNewToken.cssVar}: ${pendingNewToken.value}`);\n return records;\n }\n\n function getChangeLabel(prop: string) {\n const map: Record<string, string> = {\n 'font-size': '字号',\n 'font-weight': '字重',\n 'color': '文字色',\n 'background-color': '背景色',\n 'border-color': '边框色',\n 'border-width': '边框粗细',\n 'border-style': '边框样式',\n 'border-radius': '圆角',\n 'box-shadow': '阴影',\n 'padding': '内边距',\n 'margin': '外边距',\n 'gap': '元素间距',\n 'translate': '位置',\n 'width': '宽度',\n 'height': '高度',\n 'min-height': '最小高度',\n 'max-height': '最大高度',\n };\n return map[prop] || prop;\n }\n\n // ─── 取消 ────────────────────────────────────────────────────\n function handleReset() {\n const el = selectedRef.current;\n if (!el) return;\n // 还原所有 inline style 改动\n const targets = getScopeTargets(el, scope);\n targets.forEach(t => {\n const hEl = t as HTMLElement;\n [...Object.keys(pendingColors)].forEach(p => hEl.style.removeProperty(p));\n if (pendingRadius) hEl.style.removeProperty('border-radius');\n if (pendingShadow) hEl.style.removeProperty('box-shadow');\n if (pendingBorderColor) hEl.style.removeProperty('border-color');\n if (pendingBorderWidth) hEl.style.removeProperty('border-width');\n if (pendingBorderStyle) hEl.style.removeProperty('border-style');\n if (pendingPadding) hEl.style.removeProperty('padding');\n if (pendingMargin) hEl.style.removeProperty('margin');\n if (pendingGap) hEl.style.removeProperty('gap');\n if (pendingTranslate) hEl.style.removeProperty('translate');\n if (pendingWidth) hEl.style.removeProperty('width');\n if (pendingHeight) hEl.style.removeProperty('height');\n if (pendingHeight) hEl.style.removeProperty('min-height');\n if (pendingHeight) hEl.style.removeProperty('max-height');\n });\n setPendingColors({});\n setPendingRadius('');\n setPendingShadow('');\n setPendingFontSize(''); setPendingFontWeight(''); setPendingTextColor('');\n setPendingBorderColor(''); setPendingBorderWidth(''); setPendingBorderStyle('');\n setPendingPadding(''); setPendingMargin(''); setPendingGap('');\n setPendingTranslate(null); setPendingWidth(''); setPendingHeight('');\n setPendingWidthMode(null); setPendingHeightMode(null);\n setSizeDraft({});\n setCustomColorVals({});\n // 重新读取当前计算值\n setColors(Object.fromEntries(\n COLOR_PROPS.map(({ prop }) => [prop, getComputedColor(el, prop)])\n .filter(([, v]) => v && v !== 'rgba(0, 0, 0, 0)' && v !== 'transparent')\n ));\n const cs = getComputedStyle(el);\n setRadiusVal(getComputedRadius(el));\n setShadowVal(cs.boxShadow.trim() === 'rgba(0, 0, 0, 0) 0px 0px 0px 0px' ? 'none' : cs.boxShadow.trim());\n setShadowAuthoredVal(getAuthoredStyleValue(el, 'box-shadow'));\n const normSpace = (v: string) => {\n const parts = v.trim().split(' ');\n return parts.every(p => p === parts[0]) ? parts[0] : v.trim();\n };\n setPaddingVal(normSpace(`${cs.paddingTop} ${cs.paddingRight} ${cs.paddingBottom} ${cs.paddingLeft}`));\n setMarginVal(normSpace(`${cs.marginTop} ${cs.marginRight} ${cs.marginBottom} ${cs.marginLeft}`));\n const g = cs.gap.trim();\n setGapVal(g === 'normal' ? '0px' : g);\n setTranslateVal(parseTranslate(cs.translate));\n setWidthVal(cs.width.trim());\n setHeightVal(cs.height.trim());\n setWidthMode(inferSizeMode(el, 'width', cs.width.trim()));\n setHeightMode(inferSizeMode(el, 'height', cs.height.trim()));\n }\n\n function handleClose() {\n onClose();\n }\n\n // ─── Render ──────────────────────────────────────────────────\n return (\n <>\n {/* 添加 token 弹出框 */}\n {addTokenModal && (\n <AddTokenModal\n value={addTokenModal.value}\n cssProp={addTokenModal.cssProp}\n elementClasses={getClasses(selected)}\n colorPalette={colorPalette}\n onClose={() => setAddTokenModal(null)}\n onConfirm={handleTokenConfirm}\n />\n )}\n\n {(\n <div\n ref={panelElRef}\n className=\"di-panel\"\n data-di-panel-role=\"primary\"\n style={{ top: panelPos.top, left: panelPos.left }}\n >\n\n {/* 顶部 */}\n <div className=\"di-head\" onMouseDown={onDragStart}>\n <div className=\"di-head-left\">\n <span className=\"di-title\">页面样式</span>\n <span className=\"di-badge-dev\">Dev Only</span>\n <button\n className=\"di-layer-btn\"\n title=\"选中父层\"\n disabled={!selected.parentElement || selected.parentElement === document.body}\n onClick={() => { if (selected.parentElement && selected.parentElement !== document.body) selectEl(selected.parentElement); }}\n >↑</button>\n <button\n className=\"di-layer-btn\"\n title=\"选中第一个子层\"\n disabled={!selected.firstElementChild}\n onClick={() => { if (selected.firstElementChild) selectEl(selected.firstElementChild); }}\n >↓</button>\n </div>\n <div className=\"di-head-right\">\n <button className=\"di-close\" onClick={handleClose}>×</button>\n </div>\n </div>\n\n <div className=\"di-body\">\n\n {/* 作用范围 */}\n <div className=\"di-section\">\n <div className=\"di-section-title-row\">\n <div className=\"di-section-title\">作用范围</div>\n <button\n type=\"button\"\n className={`di-help-icon${showScopeHelp ? ' di-help-icon--on' : ''}`}\n aria-label=\"查看作用范围说明\"\n aria-expanded={showScopeHelp}\n onClick={() => setShowScopeHelp(v => !v)}\n >\n <CircleHelp size={14} strokeWidth={1.8} />\n </button>\n </div>\n {showScopeHelp && (\n <div className=\"di-help-popover\">\n 同组件 = 忽略激活 / 当前 / 展开等状态类后,共享同一业务类名的元素。\n </div>\n )}\n <div className=\"di-scope-row\">\n <button className={`di-scope-btn${scope === 'current' ? ' di-scope-btn--on' : ''}`} onClick={() => setScope('current')}>当前元素</button>\n <button className={`di-scope-btn${scope === 'component' ? ' di-scope-btn--on' : ''}`} onClick={() => setScope('component')}>\n 同组件 {selected && <span className=\"di-scope-count\">{getSameComponentEls(selected).length}</span>}\n </button>\n </div>\n </div>\n\n {/* 文字区(内容+字号+字重+颜色) */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">文字</div>\n {/* 文字内容 */}\n {textContent !== null && (\n <textarea className=\"di-note di-note--sm\" defaultValue={textContent}\n ref={(el) => { if (el) resizeTextareaToContent(el); }}\n placeholder=\"修改文字内容...\"\n onChange={e => {\n resizeTextareaToContent(e.currentTarget);\n const el = selectedRef.current;\n if (!el) return;\n const ts = getScopeTargets(el, scope);\n ts.forEach(t => { t.textContent = e.currentTarget.value; });\n }}\n />\n )}\n {/* 字号 + 字重 + 颜色 三列卡片 */}\n <div className=\"di-border-row\">\n {/* 字号 */}\n <div className=\"di-border-card\">\n <div className=\"di-border-card-title\">字号</div>\n {(() => {\n const curSize = pendingFontSize || fontSizeVal || '—';\n const curWeight = pendingFontWeight || fontWeightVal;\n const curColor = pendingTextColor || textColorVal;\n const matchedToken = getTypographyToken(curSize, curWeight, curColor, typographyTokens);\n const curOpt = matchedToken\n ? fontSizeOptions.find(opt => opt.key === matchedToken.key)\n : null;\n return (\n <>\n <div\n className=\"di-border-style-single di-font-token-trigger\"\n role=\"button\"\n tabIndex={0}\n onClick={e => { const r=(e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setShowWeightDrop(false); setShowStyleDrop(false); setExpandedTextColor(false); setExpandedBorderColor(false); setShowShadowDrop(false); setCustomRadius(''); setSizeDraft({}); setFontSizeCustomDraft(curSize); setShowFontSizeDrop(v=>!v); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const r=(e.currentTarget as HTMLElement).getBoundingClientRect();\n setDropPos(calcDropPos(r));\n setFontSizeCustomDraft(curSize);\n setShowFontSizeDrop(v=>!v);\n }\n }}\n >\n {curOpt && <span className=\"di-border-style-label\">{curOpt.label}</span>}\n <span className={`di-border-style-name${curOpt ? '' : ' di-border-style-name--custom'}`}>{curSize}</span>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\" fill=\"none\" style={{marginLeft:'auto',flexShrink:0}}><path d=\"M1 1l3 3 3-3\" stroke=\"#9ca3af\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/></svg>\n </div>\n {showFontSizeDrop && (\n <>\n <div style={{position:'fixed',inset:0,zIndex:99997}} onClick={()=>setShowFontSizeDrop(false)} />\n <div className=\"di-border-style-drop\" style={{position:'fixed',top:dropPos.top,left:dropPos.left,zIndex:99998}}>\n {fontSizeOptions.map(opt => (\n <button key={opt.key}\n className={`di-border-style-drop-item${curOpt?.key===opt.key?' di-border-style-drop-item--on':''}`}\n onClick={() => {\n setPendingFontSize(opt.value);\n setPendingFontWeight(opt.fontWeight);\n setPendingTextColor(opt.color);\n liveApplyMany([\n { prop: 'font-size', val: opt.value },\n { prop: 'font-weight', val: opt.fontWeight },\n { prop: 'color', val: opt.color },\n ]);\n setShowFontSizeDrop(false);\n }}>\n <span className=\"di-border-style-label\">{opt.label}</span>\n <span className=\"di-border-style-name\">{`${opt.value} / ${opt.fontWeight}`}</span>\n </button>\n ))}\n <div className=\"di-dropdown-custom\">\n <span className=\"di-dropdown-custom-label\">自定义</span>\n <input\n className=\"di-dropdown-custom-input\"\n value={fontSizeCustomDraft}\n placeholder=\"13px\"\n onChange={(e) => setFontSizeCustomDraft(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n <button\n type=\"button\"\n className=\"di-dropdown-custom-apply\"\n onClick={(e) => {\n e.stopPropagation();\n if (!fontSizeCustomDraft.trim()) return;\n setPendingFontSize(fontSizeCustomDraft.trim());\n liveApply('font-size', fontSizeCustomDraft.trim());\n setShowFontSizeDrop(false);\n }}\n >\n 应用\n </button>\n </div>\n </div>\n </>\n )}\n </>\n );\n })()}\n </div>\n\n {/* 字重:单值 + 下拉 */}\n <div className=\"di-border-card\" style={{ position: 'relative' }}>\n <div className=\"di-border-card-title\">字重</div>\n {(() => {\n const cur = pendingFontWeight || fontWeightVal;\n const curOpt = fontWeightOptions.find(o => o.value === cur) ?? fontWeightOptions[1];\n return (\n <>\n <button className=\"di-border-style-single\" style={{ marginTop: 4 }}\n onClick={e => { const r=(e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setShowWeightDrop(v=>!v); }}>\n <span className=\"di-border-style-label\" style={curOpt.value === 'none' ? { color: '#9ca3af' } : undefined}>{curOpt.label}</span>\n <span className=\"di-border-style-name\">{cur}</span>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\" fill=\"none\" style={{marginLeft:'auto',flexShrink:0}}><path d=\"M1 1l3 3 3-3\" stroke=\"#9ca3af\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/></svg>\n </button>\n {showWeightDrop && (\n <>\n <div style={{position:'fixed',inset:0,zIndex:99997}} onClick={()=>setShowWeightDrop(false)} />\n <div className=\"di-border-style-drop\" style={{position:'fixed',top:dropPos.top,left:dropPos.left,zIndex:99998}}>\n {fontWeightOptions.map(opt => (\n <button key={opt.value}\n className={`di-border-style-drop-item${cur===opt.value?' di-border-style-drop-item--on':''}`}\n onClick={() => { setPendingFontWeight(opt.value); liveApply('font-weight',opt.value); setShowWeightDrop(false); }}>\n <span className=\"di-border-style-label\" style={opt.value === 'none' ? { color: '#9ca3af' } : undefined}>{opt.label}</span>\n <span className=\"di-border-style-name\">{opt.value}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </>\n );\n })()}\n </div>\n\n {/* 颜色:卡片式 */}\n {(() => {\n const tcVal = pendingTextColor || textColorVal;\n const { label: tcLabel, sub: tcSub, isHardcoded: tcHard } = getDisplayLabel(tcVal, tokenMap, colorPalette, tokenLabels);\n const tcDark = (() => { const m=tcVal.match(/^#([0-9a-f]{6})$/i); if(!m) return true; const r=parseInt(m[1].slice(0,2),16),g=parseInt(m[1].slice(2,4),16),b=parseInt(m[1].slice(4,6),16); return (r*299+g*587+b*114)/1000<128; })();\n return (\n <div className=\"di-border-card\" style={{ position: 'relative' }}>\n <div className=\"di-border-card-title\">颜色</div>\n <div className=\"di-border-color-body\" style={{ marginTop: 4 }}>\n <button className={`di-swatch-btn${tcDark?' di-swatch-btn--dark':''}`}\n style={{ background: tcVal||'#1d293d' }}\n onClick={e => { const r=(e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setExpandedTextColor(v=>!v); }}>\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\"><path d=\"M1 1l4 4 4-4\" stroke={tcDark?'#fff':'#374151'} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n </button>\n <div className=\"di-border-color-info\">\n <span className={tcHard?'di-token-name--plain':'di-token-name'}>{tcLabel}</span>\n {tcSub && <span className=\"di-hex\">{tcSub}</span>}\n </div>\n </div>\n {expandedTextColor && (\n <ColorDropdown value={tcVal} pos={dropPos} colorPalette={colorPalette}\n onChange={c=>{ setPendingTextColor(c); liveApply('color',c); }}\n onClose={()=>setExpandedTextColor(false)}\n onAddToken={v=>handleAddToken(v,'color')}\n />\n )}\n </div>\n );\n })()}\n </div>\n </div>\n\n {/* 颜色区 */}\n {Object.keys(colors).length > 0 && (\n <div className=\"di-section\">\n <div className=\"di-section-title\">颜色</div>\n {COLOR_PROPS.filter(({ prop }) => colors[prop]).map(({ label, prop }) => {\n const val = pendingColors[prop] ?? colors[prop];\n const token = tokenMap[val];\n const isDark = (() => {\n const m = val.match(/^#([0-9a-f]{6})$/i);\n if (!m) return false;\n const r = parseInt(m[1].slice(0,2),16), g = parseInt(m[1].slice(2,4),16), b = parseInt(m[1].slice(4,6),16);\n return (r*299 + g*587 + b*114) / 1000 < 128;\n })();\n const isExpanded = expandedColor === prop;\n // 所有颜色 token 列表(从 tokenMap 反转)\n const tokenList = Object.entries(tokenMap)\n .filter(([v]) => v.startsWith('#') && v !== val)\n .map(([v, t]) => ({ val: v, token: t }));\n const { label: dispLabel, sub: dispSub, isHardcoded: dispHard } = getDisplayLabel(val, tokenMap, colorPalette, tokenLabels);\n return (\n <div key={prop} className=\"di-color-row\">\n <span className=\"di-attr-label\">{label}</span>\n <button\n className={`di-swatch-btn${isDark ? ' di-swatch-btn--dark' : ''}`}\n style={{ background: val }}\n onClick={e => { const r = (e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setExpandedColor(isExpanded ? null : prop); }}\n >\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1l4 4 4-4\" stroke={isDark ? '#fff' : '#374151'} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n <div className=\"di-color-info\">\n <span className={dispHard ? 'di-token-name--plain' : 'di-token-name'}>{dispLabel}</span>\n {dispSub && <span className=\"di-hex\">{dispSub}</span>}\n </div>\n {isExpanded && (\n <ColorDropdown value={val} pos={dropPos} colorPalette={colorPalette}\n onChange={(c, _tk) => { setPendingColors(prev => ({ ...prev, [prop]: c })); liveApply(prop, c); }}\n onClose={() => setExpandedColor(null)}\n onAddToken={v=>handleAddToken(v, prop)}\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* 布局区 */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">布局</div>\n <div className=\"di-layout-grid\">\n <div className=\"di-layout-card\">\n <div className=\"di-layout-card-title\">位置</div>\n <div className=\"di-nudge-pad\" aria-label=\"移动元素\">\n <button className=\"di-nudge-btn di-nudge-btn--up\" onClick={() => nudgeSelected(0, -1)} title=\"上移 1px\">↑</button>\n <button className=\"di-nudge-btn di-nudge-btn--left\" onClick={() => nudgeSelected(-1, 0)} title=\"左移 1px\">←</button>\n <div className=\"di-nudge-readout\">\n <span>X {Math.round((pendingTranslate ?? translateVal).x)}</span>\n <span>Y {Math.round((pendingTranslate ?? translateVal).y)}</span>\n </div>\n <button className=\"di-nudge-btn di-nudge-btn--right\" onClick={() => nudgeSelected(1, 0)} title=\"右移 1px\">→</button>\n <button className=\"di-nudge-btn di-nudge-btn--down\" onClick={() => nudgeSelected(0, 1)} title=\"下移 1px\">↓</button>\n </div>\n </div>\n\n <div className=\"di-layout-card di-layout-card--size\">\n <div className=\"di-layout-card-title\">尺寸</div>\n {([\n { key: 'width', label: 'W', current: widthVal, pending: pendingWidth, mode: widthMode, pendingMode: pendingWidthMode },\n { key: 'height', label: 'H', current: heightVal, pending: pendingHeight, mode: heightMode, pendingMode: pendingHeightMode },\n ] as const).map(item => {\n const cur = displaySizeValue(item.pending, item.current);\n const inputVal = sizeDraft[item.key] ?? cur;\n const activeMode = item.pendingMode ?? item.mode;\n return (\n <div className=\"di-size-row\" key={item.key}>\n <span className=\"di-size-axis\">{item.label}</span>\n <input\n className=\"di-size-value\"\n value={inputVal}\n aria-label={`${item.label} 自定义尺寸`}\n onChange={e => {\n setSizeDraft(prev => ({ ...prev, [item.key]: e.target.value }));\n setSize(item.key, e.target.value, 'fixed');\n }}\n onFocus={e => {\n setSizeDraft(prev => ({ ...prev, [item.key]: cur }));\n e.currentTarget.select();\n }}\n onClick={e => e.currentTarget.select()}\n onMouseUp={e => e.preventDefault()}\n onBlur={() => setSizeDraft(prev => {\n const next = { ...prev };\n delete next[item.key];\n return next;\n })}\n onKeyDown={e => {\n if (e.key === 'Enter') e.currentTarget.blur();\n }}\n />\n <select\n className=\"di-size-mode-select\"\n value={activeMode}\n onChange={e => {\n const mode = e.target.value as SizeMode;\n setSize(item.key, item.current, mode);\n }}\n >\n {SIZE_OPTIONS.map(opt => (\n <option key={opt.mode} value={opt.mode}>{opt.label}</option>\n ))}\n </select>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* 阴影区 */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">阴影</div>\n <div className=\"di-shadow-grid\">\n {(() => {\n const activeShadow = pendingShadow || shadowVal;\n const shadowDisplay = getShadowDisplay(activeShadow, shadowAuthoredVal, shadowTokens);\n const matchedOption = shadowOptions.find(option => canonicalizeShadowValue(option.value) === canonicalizeShadowValue(activeShadow)) ?? null;\n const activeOption = matchedOption ?? shadowOptions[0];\n return (\n <>\n <div className=\"di-shadow-card\" style={{ position: 'relative' }}>\n <div className=\"di-shadow-card-title\">Token</div>\n <button\n className=\"di-border-style-single\"\n onClick={e => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setDropPos(calcDropPos(r));\n setShowShadowDrop(v => !v);\n }}\n >\n <span className=\"di-border-style-label\" style={activeOption.cssVar ? undefined : { color: '#9ca3af' }}>{activeOption.label}</span>\n <span className=\"di-border-style-name\">{activeOption.cssVar || 'none'}</span>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\" fill=\"none\" style={{marginLeft:'auto',flexShrink:0}}><path d=\"M1 1l3 3 3-3\" stroke=\"#9ca3af\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/></svg>\n </button>\n {showShadowDrop && (\n <>\n <div style={{position:'fixed',inset:0,zIndex:99997}} onClick={() => setShowShadowDrop(false)} />\n <div className=\"di-border-style-drop di-shadow-drop\" style={{position:'fixed',top:dropPos.top,left:dropPos.left,zIndex:99998}}>\n {shadowOptions.map(option => {\n const isOn = canonicalizeShadowValue(option.value) === canonicalizeShadowValue(activeShadow);\n return (\n <button\n key={option.cssVar || option.label}\n className={`di-border-style-drop-item${isOn ? ' di-border-style-drop-item--on' : ''}`}\n onClick={() => {\n setPendingShadow(option.value);\n liveApply('box-shadow', option.value);\n setShowShadowDrop(false);\n }}\n >\n <span className=\"di-border-style-label\" style={option.cssVar ? undefined : { color: '#9ca3af' }}>{option.label}</span>\n <span className=\"di-shadow-drop-meta\">\n <span className=\"di-border-style-name\">{option.cssVar || option.usage}</span>\n {option.cssVar && <span className=\"di-shadow-drop-value\">{option.value}</span>}\n </span>\n </button>\n );\n })}\n <button\n className={`di-border-style-drop-item${matchedOption ? '' : ' di-border-style-drop-item--on'}`}\n onClick={() => {\n const next = prompt('自定义阴影(如 0 12px 30px rgba(15,23,42,0.08))', activeShadow === 'none' ? '' : activeShadow);\n if (next === null) return;\n const value = next.trim() || 'none';\n setPendingShadow(value);\n liveApply('box-shadow', value);\n setShowShadowDrop(false);\n }}\n >\n <span className=\"di-border-style-label\">自定义</span>\n <span className=\"di-shadow-drop-meta\">\n <span className=\"di-border-style-name\">{shadowDisplay.label}</span>\n <span className=\"di-shadow-drop-value\">{formatShadowDisplay(activeShadow)}</span>\n </span>\n </button>\n </div>\n </>\n )}\n </div>\n\n <div className=\"di-shadow-card\">\n <div className=\"di-shadow-card-title\">预览</div>\n <div className=\"di-shadow-preview-row\">\n <div className=\"di-shadow-preview-chip\" style={{ boxShadow: activeShadow === 'none' ? 'none' : activeShadow }} />\n <div className=\"di-shadow-preview-copy\">\n <span className={shadowDisplay.isHardcoded ? 'di-token-name--plain' : 'di-token-name'}>{shadowDisplay.label}</span>\n <span className=\"di-hex di-hex--wrap\">{shadowDisplay.sub}</span>\n </div>\n </div>\n </div>\n </>\n );\n })()}\n </div>\n </div>\n\n {/* 边框区 */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">边框</div>\n <div className=\"di-border-row\">\n\n {/* 边框颜色 */}\n {(() => {\n const bcVal = pendingBorderColor || borderColorVal;\n const { label: bcLabel, sub: bcSub, isHardcoded: bcHard } = getDisplayLabel(bcVal || '', tokenMap, colorPalette, tokenLabels);\n const bcDark = (() => { const m = bcVal?.match(/^#([0-9a-f]{6})$/i); if (!m) return false; const r=parseInt(m[1].slice(0,2),16),g=parseInt(m[1].slice(2,4),16),b=parseInt(m[1].slice(4,6),16); return (r*299+g*587+b*114)/1000 < 128; })();\n return (\n <div className=\"di-border-card\">\n <div className=\"di-border-card-title\">颜色</div>\n <div className=\"di-border-color-body\">\n <button\n className={`di-swatch-btn${bcDark ? ' di-swatch-btn--dark' : ''}${!bcVal ? ' di-swatch-btn--empty' : ''}`}\n style={{ background: bcVal || undefined }}\n onClick={e => { const r=(e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setExpandedBorderColor(v=>!v); }}\n >\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1l4 4 4-4\" stroke={!bcVal ? '#9ca3af' : bcDark ? '#fff' : '#374151'} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n <div className=\"di-border-color-info\">\n <span className={bcHard ? 'di-token-name--plain' : 'di-token-name'}>{bcVal ? bcLabel : '未设置'}</span>\n {bcSub && <span className=\"di-hex\">{bcSub}</span>}\n </div>\n </div>\n {expandedBorderColor && (\n <ColorDropdown value={bcVal || ''} pos={dropPos} colorPalette={colorPalette}\n onChange={c => {\n setPendingBorderColor(c); liveApply('border-color', c);\n if ((pendingBorderWidth || borderWidthVal) === '0px') { liveApply('border-width', '1px'); liveApply('border-style', 'solid'); setPendingBorderWidth('1px'); setPendingBorderStyle('solid'); }\n }}\n onClose={() => setExpandedBorderColor(false)}\n onAddToken={v=>handleAddToken(v,'border-color')}\n />\n )}\n </div>\n );\n })()}\n\n {/* 粗细:合并到颜色卡片下方(已在上面的卡片里),单独卡片 */}\n <div className=\"di-border-card\" style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className=\"di-border-card-title\">粗细</div>\n {(() => {\n const cur = pendingBorderWidth || borderWidthVal || '0px';\n const idx = borderWidthSteps.indexOf(cur);\n return (\n <div className=\"di-spinner\">\n <span className=\"di-spinner-val\">{cur}</span>\n <div className=\"di-spinner-btns\">\n <button className=\"di-spinner-up\" disabled={idx <= 0}\n onClick={() => { const nv=borderWidthSteps[Math.max(0,idx-1)]; setPendingBorderWidth(nv); liveApply('border-width',nv); }}>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\"><path d=\"M1 4l3-3 3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\"/></svg>\n </button>\n <button className=\"di-spinner-dn\" disabled={idx >= borderWidthSteps.length - 1}\n onClick={() => { const nv=borderWidthSteps[Math.min(borderWidthSteps.length-1,idx<0?1:idx+1)]; setPendingBorderWidth(nv); liveApply('border-width',nv); }}>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\"><path d=\"M1 1l3 3 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\"/></svg>\n </button>\n </div>\n </div>\n );\n })()}\n </div>\n\n {/* 样式:单值展示 + 下拉 */}\n <div className=\"di-border-card\" style={{ position: 'relative' }}>\n <div className=\"di-border-card-title\">样式</div>\n {(() => {\n const cur = pendingBorderStyle || borderStyleVal;\n const curOpt = BORDER_STYLE_OPTIONS.find(o => o.value === cur) ?? BORDER_STYLE_OPTIONS[0];\n return (\n <>\n <button className=\"di-border-style-single\"\n onClick={e => { const r=(e.currentTarget as HTMLElement).getBoundingClientRect(); setDropPos(calcDropPos(r)); setShowStyleDrop(v=>!v); }}>\n <span className=\"di-border-style-label\" style={curOpt.value === 'none' ? { color: '#9ca3af' } : undefined}>{curOpt.label}</span>\n <span className=\"di-border-style-name\">{curOpt.title}</span>\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\" fill=\"none\" style={{marginLeft:'auto',flexShrink:0}}><path d=\"M1 1l3 3 3-3\" stroke=\"#9ca3af\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/></svg>\n </button>\n {showStyleDrop && (\n <>\n <div style={{position:'fixed',inset:0,zIndex:99997}} onClick={() => setShowStyleDrop(false)} />\n <div className=\"di-border-style-drop\" style={{position:'fixed',top:dropPos.top,left:dropPos.left,zIndex:99998}}>\n {BORDER_STYLE_OPTIONS.map(opt => (\n <button key={opt.value}\n className={`di-border-style-drop-item${cur===opt.value?' di-border-style-drop-item--on':''}`}\n onClick={() => { setPendingBorderStyle(opt.value); liveApply('border-style',opt.value); setShowStyleDrop(false); }}>\n <span className=\"di-border-style-label\" style={opt.value === 'none' ? { color: '#9ca3af' } : undefined}>{opt.label}</span>\n <span className=\"di-border-style-name\">{opt.title}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </>\n );\n })()}\n </div>\n\n </div>\n </div>\n\n {/* 圆角区 */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">圆角</div>\n <div className=\"di-preset-row\">\n {radiusPresets.map(opt => {\n const current = pendingRadius || radiusVal;\n const isOn = matchPreset(radiusPresets, current)?.value === opt.value;\n return (\n <button\n key={opt.label}\n className={`di-preset${isOn ? ' di-preset--on' : ''}`}\n onClick={() => { setPendingRadius(opt.value); setCustomRadius(''); liveApply('border-radius', opt.value); }}\n >\n <span className=\"di-preset-label\">{opt.label}</span>\n {opt.sub && <span className=\"di-preset-sub\">{opt.sub}</span>}\n </button>\n );\n })}\n {(() => {\n const cur = pendingRadius || radiusVal;\n const isCustom = !!cur && cur !== '0px' && !matchPreset(radiusPresets, cur);\n return (\n <button\n className={`di-preset${isCustom ? ' di-preset--on' : ''}`}\n onClick={() => { const v = prompt('自定义圆角(如 12px)', cur || ''); if (v) { setPendingRadius(v); setCustomRadius(v); liveApply('border-radius', v); } }}\n >\n <span className=\"di-preset-label\">自定义</span>\n {isCustom && <span className=\"di-preset-sub\">{cur}</span>}\n </button>\n );\n })()}\n </div>\n </div>\n\n {/* 间距区 */}\n <div className=\"di-section\">\n <div className=\"di-section-title\">间距</div>\n <div className=\"di-space-row\">\n <SpaceCard\n title=\"内边距\" variant=\"padding\"\n value={pendingPadding || paddingVal}\n spaceSteps={spaceSteps}\n onChange={v => { setPendingPadding(v); liveApply('padding', v); }}\n />\n <SpaceCard\n title=\"外边距\" variant=\"margin\"\n value={pendingMargin || marginVal}\n spaceSteps={spaceSteps}\n onChange={v => { setPendingMargin(v); liveApply('margin', v); }}\n />\n <SpaceCard\n title=\"元素间距\" variant=\"gap\"\n value={pendingGap || gapVal}\n spaceSteps={spaceSteps}\n onChange={v => { setPendingGap(v); liveApply('gap', v); }}\n />\n </div>\n </div>\n\n <div className=\"di-section\">\n <div className=\"di-section-title\">本次修改内容</div>\n <div className=\"di-inbox-summary\">\n <div className=\"di-inbox-pill\">已记录 {styleIntentSummary.pendingCount}</div>\n {(() => {\n const currentChanges = getPendingChangeRecords();\n if (currentChanges.length === 0) return null;\n const el = selectedRef.current;\n const targetClasses = el ? getClasses(el) : [];\n const targetLabel = el\n ? targetClasses.length\n ? `${el.tagName.toLowerCase()}.${targetClasses.join('.')}`\n : el.tagName.toLowerCase()\n : '当前对象';\n return (\n <div className=\"di-inbox-list\">\n <div className=\"di-inbox-card di-inbox-card--draft\">\n <div className=\"di-inbox-card-head\">\n <div className=\"di-inbox-target\">{targetLabel}</div>\n </div>\n <ol className=\"di-inbox-change-list\">\n {currentChanges.map((change, idx) => (\n <li className=\"di-inbox-change-item\" key={`current-${change.prop}-${idx}`}>\n <span className=\"di-inbox-change-text\">\n {idx + 1}. {getChangeLabel(change.prop)}:{change.from} → {change.val}\n </span>\n </li>\n ))}\n </ol>\n </div>\n </div>\n );\n })()}\n {styleIntentSummary.pendingEntries.length > 0 ? (\n <div className=\"di-inbox-list\">\n {styleIntentSummary.pendingEntries.map((entry) => (\n <div className=\"di-inbox-card\" key={entry.id}>\n <div className=\"di-inbox-card-head\">\n <div className=\"di-inbox-target\">{entry.targetLabel || entry.selector || '未命名对象'}</div>\n <button className=\"di-inbox-delete\" onClick={() => handleDeleteStyleIntent(entry.id)}>删除对象</button>\n </div>\n {entry.note ? <div className=\"di-inbox-note\">{entry.note}</div> : null}\n <ol className=\"di-inbox-change-list\">\n {entry.entries.flatMap((group) => group.changes.map((change) => ({ selector: group.selector, ...change }))).map((change, idx) => (\n <li className=\"di-inbox-change-item\" key={`${entry.id}-${change.selector}-${change.prop}-${idx}`}>\n <span className=\"di-inbox-change-text\">\n {idx + 1}. {getChangeLabel(change.prop)}:{change.from ? `${change.from} → ` : ''}{change.val}\n </span>\n <button\n className=\"di-inbox-delete di-inbox-delete--mini\"\n onClick={() => handleDeleteStyleIntent(entry.id, change.selector, change.prop)}\n >\n 删除\n </button>\n </li>\n ))}\n </ol>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"di-empty\">还没有记录的修改</div>\n )}\n </div>\n </div>\n\n </div>\n\n {/* 底部操作 */}\n {(() => {\n const hasPending = Object.keys(pendingColors).length > 0 ||\n !!pendingTextColor || !!pendingRadius || !!pendingShadow ||\n !!pendingBorderColor || !!pendingBorderWidth || !!pendingBorderStyle ||\n !!pendingFontSize || !!pendingFontWeight || !!pendingPadding ||\n !!pendingMargin || !!pendingGap || !!pendingTranslate ||\n !!pendingWidth || !!pendingHeight || !!note;\n return (\n <div className=\"di-foot\">\n <button className=\"di-btn-cancel\" onClick={handleReset}>重置</button>\n <button className=\"di-btn-cancel\" onClick={() => {\n const el = selectedRef.current;\n if (!el) return;\n // 合并实际值 + pending 改动,pending 优先\n const effectiveColors = { ...colors, ...pendingColors };\n const pending: [string, string][] = [\n ...Object.entries(effectiveColors).filter(([, v]) => v && v !== 'transparent'),\n [(pendingTextColor || textColorVal) ? 'color' : '', pendingTextColor || textColorVal],\n [(pendingRadius || radiusVal) ? 'border-radius' : '', pendingRadius || radiusVal],\n [(pendingShadow || (shadowVal !== 'none' ? shadowVal : '')) ? 'box-shadow' : '', pendingShadow || (shadowVal !== 'none' ? shadowVal : '')],\n [(pendingBorderColor || borderColorVal) ? 'border-color' : '', pendingBorderColor || borderColorVal],\n [(pendingBorderWidth || (borderWidthVal !== '0px' ? borderWidthVal : '')) ? 'border-width' : '', pendingBorderWidth || borderWidthVal],\n [(pendingBorderStyle || (borderStyleVal !== 'none' ? borderStyleVal : '')) ? 'border-style' : '', pendingBorderStyle || borderStyleVal],\n [(pendingFontSize || fontSizeVal) ? 'font-size' : '', pendingFontSize || fontSizeVal],\n [(pendingFontWeight || fontWeightVal) ? 'font-weight' : '', pendingFontWeight || fontWeightVal],\n [(pendingPadding || (paddingVal !== '0px' ? paddingVal : '')) ? 'padding' : '', pendingPadding || paddingVal],\n [(pendingMargin || (marginVal !== '0px' ? marginVal : '')) ? 'margin' : '', pendingMargin || marginVal],\n [(pendingGap || (gapVal !== '0px' ? gapVal : '')) ? 'gap' : '', pendingGap || gapVal],\n [(pendingWidth || widthVal) ? 'width' : '', pendingWidth || widthVal],\n [(pendingHeight || heightVal) ? 'height' : '', pendingHeight || heightVal],\n ].filter(([k, v]) => k && v) as [string, string][];\n const selector = getSelectorForScope(el, scope);\n const css = pending.length > 0\n ? `${selector} {\\n${pending.map(([p, v]) => ` ${p}: ${v};`).join('\\n')}\\n}`\n : `/* ${selector} — 暂无改动 */`;\n const ta = document.createElement('textarea');\n ta.value = css;\n ta.style.cssText = 'position:fixed;opacity:0;top:0;left:0';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n _copiedStyles = pending.map(([p, v]) => ({ prop: p, val: v }));\n setHasCopied(true);\n setCopyMsg('已复制 ✓');\n setTimeout(() => setCopyMsg(''), 1500);\n }}>{copyMsg || '复制样式'}</button>\n <button\n className=\"di-btn-save\"\n onClick={handleSubmitToAi}\n disabled={!hasPending}\n style={!hasPending ? { opacity: 0.4, cursor: 'not-allowed' } : {}}\n title=\"复制一段可直接发给 AI 的任务文本\"\n >{submitMsg || '发送给AI'}</button>\n </div>\n );\n })()}\n {hasCopied && (\n <div className=\"di-paste-bar\">\n <button className=\"di-btn-paste\" onClick={() => {\n _copiedStyles.forEach(({ prop, val }) => {\n if (prop === 'background-color' || prop === 'background')\n setPendingColors(prev => ({ ...prev, [prop]: val }));\n else if (prop === 'color') setPendingTextColor(val);\n else if (prop === 'border-radius') setPendingRadius(val);\n else if (prop === 'box-shadow') setPendingShadow(val);\n else if (prop === 'border-color') setPendingBorderColor(val);\n else if (prop === 'border-width') setPendingBorderWidth(val);\n else if (prop === 'border-style') setPendingBorderStyle(val);\n else if (prop === 'font-size') setPendingFontSize(val);\n else if (prop === 'font-weight') setPendingFontWeight(val);\n else if (prop === 'padding') setPendingPadding(val);\n else if (prop === 'margin') setPendingMargin(val);\n else if (prop === 'gap') setPendingGap(val);\n else if (prop === 'width') setPendingWidth(val);\n else if (prop === 'height') setPendingHeight(val);\n });\n applyToDOM(_copiedStyles);\n }}>\n 粘贴样式({_copiedStyles.length} 个属性)\n </button>\n </div>\n )}\n\n </div>\n )}\n </>\n );\n}\n\n// ─── 主组件:管理 active + panels 数组 ───────────────────────────\ntype FileEntry = { name: string; desc: string };\n\nconst CODE_FILES: FileEntry[] = [\n { name: 'src/', desc: 'React 组件、页面、样式源码(不含调试工具)' },\n { name: 'index.html', desc: '应用入口 HTML' },\n { name: 'package.json', desc: '依赖包与脚本配置' },\n { name: 'tsconfig.json', desc: 'TypeScript 编译配置' },\n { name: 'vite.config.ts', desc: '构建工具配置' },\n];\n\nconst PRODUCT_FILES: FileEntry[] = [\n { name: 'docs/PRODUCT_PLAN.md', desc: '产品规划与路线图' },\n { name: 'docs/PROJECT.md', desc: '项目背景与目标概述' },\n { name: 'docs/DECISIONS.md', desc: '关键产品决策记录' },\n { name: 'docs/CHANGELOG.md', desc: '功能迭代变更日志' },\n { name: 'docs/CODE_STRUCTURE.md', desc: '前端目录结构说明' },\n { name: 'docs/DESIGN_STANDARDS.md', desc: '设计规范总览' },\n];\n\nconst DESIGN_FILES: FileEntry[] = [\n { name: 'docs/design/OVERVIEW.md', desc: '设计系统总览' },\n { name: 'docs/design/tokens.md', desc: 'Design Token 使用说明' },\n { name: 'docs/design/layout.md', desc: '页面布局规范' },\n { name: 'docs/design/component-index.md', desc: '组件清单索引' },\n { name: 'docs/design/business-components.md', desc: '业务组件说明' },\n];\n\nfunction FileList({ files }: { files: FileEntry[] }) {\n return (\n <ul className=\"di-dl-file-list\">\n {files.map(f => (\n <li key={f.name}>\n <span className=\"di-dl-file-name\">{f.name}</span>\n <span className=\"di-dl-file-desc\">{f.desc}</span>\n </li>\n ))}\n </ul>\n );\n}\n\ntype DlStatus = 'idle' | 'packing' | 'done' | 'error';\n\nfunction DownloadButton() {\n const { endpoints } = useDevInspectorConfig();\n const [open, setOpen] = useState(false);\n const [status, setStatus] = useState<DlStatus>('idle');\n const [filePath, setFilePath] = useState('');\n const [details, setDetails] = useState({ code: false, product: false, design: false });\n const [opts, setOpts] = useState({ code: true, product: false, design: false });\n\n function toggle(k: keyof typeof opts) {\n setOpts(prev => ({ ...prev, [k]: !prev[k] }));\n }\n function toggleDetail(k: keyof typeof details) {\n setDetails(prev => ({ ...prev, [k]: !prev[k] }));\n }\n function handleOpen() {\n setOpen(v => !v);\n if (open) setStatus('idle');\n }\n\n async function download() {\n if (!opts.code && !opts.product && !opts.design) return;\n setStatus('packing');\n try {\n const params = new URLSearchParams({\n code: opts.code ? '1' : '0',\n product: opts.product ? '1' : '0',\n design: opts.design ? '1' : '0',\n });\n const res = await fetch(`${endpoints.handoff}?${params}`);\n const json = await res.json();\n if (!json.ok) throw new Error(json.error);\n setFilePath(json.path);\n setStatus('done');\n } catch {\n setStatus('error');\n }\n }\n\n async function revealInFinder() {\n await fetch(`${endpoints.reveal}?path=${encodeURIComponent(filePath)}`);\n }\n\n const sections = [\n { key: 'code' as const, label: '前端代码', files: CODE_FILES },\n { key: 'product' as const, label: '产品文档', files: PRODUCT_FILES },\n { key: 'design' as const, label: '设计文档', files: DESIGN_FILES },\n ];\n\n return (\n <>\n <button className=\"di-dl-btn\" onClick={handleOpen}>下载</button>\n\n {open && (\n <div className=\"di-dl-modal\">\n <div className=\"di-dl-title\">选择下载内容</div>\n\n {status === 'packing' && (\n <div className=\"di-dl-status\">\n <span className=\"di-dl-spinner\" />\n 正在打包,请稍候…\n </div>\n )}\n\n {status === 'done' && (\n <div className=\"di-dl-done\">\n <div className=\"di-dl-done-check\">✓ 已保存至桌面</div>\n <div className=\"di-dl-done-path\">{filePath.replace(/.*\\//, '')}</div>\n <button className=\"di-dl-reveal-btn\" onClick={revealInFinder}>\n 在 Finder 中显示\n </button>\n </div>\n )}\n\n {status === 'error' && (\n <div className=\"di-dl-status di-dl-status--error\">打包失败,请查看控制台</div>\n )}\n\n {(status === 'idle' || status === 'error') && (<>\n {sections.map(({ key, label, files }) => (\n <div key={key}>\n <div className=\"di-dl-row\">\n <label className=\"di-dl-check-label\">\n <input type=\"checkbox\" checked={opts[key]} onChange={() => toggle(key)} />\n {label}\n </label>\n <button className=\"di-dl-detail-btn\" onClick={() => toggleDetail(key)}>\n {details[key] ? '收起' : '详情'}\n </button>\n </div>\n {details[key] && <FileList files={files} />}\n </div>\n ))}\n\n <button\n className=\"di-dl-confirm\"\n onClick={download}\n disabled={!opts.code && !opts.product && !opts.design}\n >\n 下载\n </button>\n </>)}\n </div>\n )}\n </>\n );\n}\n\nexport default function DevInspector() {\n const [active, setActive] = useState(false);\n const [tokenMap, setTokenMap] = useState<Record<string, string>>({});\n const [panels, setPanels] = useState<{ id: string; el: Element }[]>([]);\n const modalOpenRef = useRef(false);\n\n useEffect(() => { setTokenMap(scanTokenMap()); }, []);\n\n useEffect(() => {\n const fn = (e: KeyboardEvent) => {\n if (e.altKey && e.key === 'i') setActive(v => !v);\n if (e.key === 'Escape') { setActive(false); setPanels([]); }\n };\n window.addEventListener('keydown', fn);\n return () => window.removeEventListener('keydown', fn);\n }, []);\n\n useEffect(() => {\n const onOver = (e: MouseEvent) => {\n if (!active || modalOpenRef.current) return;\n const el = e.target as Element;\n if (!el?.classList) return;\n if (isInsidePanel(el)) { el.classList.remove('di-hover'); return; }\n el.classList.add('di-hover');\n };\n const onOut = (e: MouseEvent) => { (e.target as Element)?.classList?.remove('di-hover'); };\n const onClick = (e: MouseEvent) => {\n if (!active || modalOpenRef.current) return;\n const el = e.target as Element;\n if (isInsidePanel(el)) return;\n e.preventDefault(); e.stopPropagation();\n el.classList.remove('di-hover');\n setPanels(prev =>\n prev.length === 0\n ? [{ id: 'main', el }]\n : prev.map((p, i) => i === 0 ? { ...p, el } : p)\n );\n };\n document.addEventListener('mouseover', onOver, true);\n document.addEventListener('mouseout', onOut, true);\n document.addEventListener('click', onClick, true);\n return () => {\n document.removeEventListener('mouseover', onOver, true);\n document.removeEventListener('mouseout', onOut, true);\n document.removeEventListener('click', onClick, true);\n };\n }, [active]);\n\n useEffect(() => {\n if (!active) {\n document.querySelectorAll('.di-selected,.di-hover').forEach(e => e.classList.remove('di-selected','di-hover'));\n }\n }, [active]);\n\n useEffect(() => {\n document.body.style.cursor = active ? 'crosshair' : '';\n return () => { document.body.style.cursor = ''; };\n }, [active]);\n\n const primaryEl = panels[0]?.el;\n\n return (\n <>\n <DownloadButton />\n\n <button\n className={`di-trigger${active ? ' di-trigger--on' : ''}`}\n onClick={() => { setActive(v => !v); if (active) setPanels([]); }}\n title=\"Dev Inspector (Alt+I)\"\n >\n {active ? '退出' : '编辑'}\n </button>\n\n {/* 已选中标签 */}\n {active && primaryEl && (() => {\n const rect = primaryEl.getBoundingClientRect();\n const classes = getClasses(primaryEl);\n return (\n <div className=\"di-label\" style={{ top: rect.top - 34, left: rect.left + rect.width / 2 }}>\n 已选中 {classes[0] ?? primaryEl.tagName.toLowerCase()}\n </div>\n );\n })()}\n\n {panels.map((p) => (\n <InspectorPanel\n key={p.id}\n targetEl={p.el}\n tokenMap={tokenMap}\n onTokenMapUpdate={updates => setTokenMap(prev => ({ ...prev, ...updates }))}\n onClose={() => setPanels(prev => prev.filter(x => x.id !== p.id))}\n />\n ))}\n </>\n );\n}\n","import { createContext, useContext, type ReactNode } from 'react';\nimport { type DevInspectorConfig, defaultDevInspectorConfig, mergeDevInspectorConfig } from './config';\n\nconst DevInspectorConfigContext = createContext<DevInspectorConfig>(defaultDevInspectorConfig);\n\nexport function DevInspectorProvider({\n children,\n config,\n}: {\n children: ReactNode;\n config?: Partial<DevInspectorConfig> & {\n endpoints?: Partial<DevInspectorConfig['endpoints']>;\n tokens?: Partial<DevInspectorConfig['tokens']>;\n };\n}) {\n return (\n <DevInspectorConfigContext.Provider value={mergeDevInspectorConfig(config)}>\n {children}\n </DevInspectorConfigContext.Provider>\n );\n}\n\nexport function useDevInspectorConfig() {\n return useContext(DevInspectorConfigContext);\n}\n","// ─── 类型 ────────────────────────────────────────────────────\n\nexport type PaletteColor = { label: string; val: string; token: string };\nexport type PaletteGroup = { group: string; colors: PaletteColor[] };\n\nexport type ShadowToken = {\n cssVar: string;\n value: string;\n label: string;\n usage: string;\n};\n\nexport type TypographyToken = {\n key: string;\n label: string;\n fontSizeVar: string;\n fontWeightVar: string;\n colorVar: string;\n fontSize: string;\n fontWeight: string;\n color: string;\n usage: string;\n};\n\nexport type RadiusPreset = {\n label: string;\n sub: string;\n value: string;\n token: string;\n};\n\nexport type SpaceStep = {\n label: string;\n size: string;\n val: string;\n};\n\nexport type FontSizeOption = {\n key: string;\n label: string;\n value: string;\n fontWeight: string;\n color: string;\n colorVar: string;\n usage: string;\n};\n\nexport type FontWeightOption = { label: string; value: string };\n\nexport type DevInspectorEndpoints = {\n applyCss: string;\n submitStyleIntent: string;\n styleIntents: string;\n deleteStyleIntent: string;\n handoff: string;\n reveal: string;\n};\n\nexport type DevInspectorTokenConfig = {\n colorPalette: PaletteGroup[];\n tokenLabels: Record<string, string>;\n radiusPresets: RadiusPreset[];\n spaceSteps: SpaceStep[];\n borderWidthSteps: string[];\n fontSizeOptions: FontSizeOption[];\n fontWeightOptions: FontWeightOption[];\n shadowTokens: ShadowToken[];\n typographyTokens: TypographyToken[];\n};\n\nexport type DevInspectorConfig = {\n rootId: string;\n endpoints: DevInspectorEndpoints;\n tokens: DevInspectorTokenConfig;\n};\n\n// ─── 内置最小默认值(项目侧可通过 Provider 覆盖) ───────────────\n\nconst FALLBACK_TOKENS: DevInspectorTokenConfig = {\n colorPalette: [],\n tokenLabels: {},\n radiusPresets: [\n { label: '无', sub: '', value: '0px', token: '' },\n { label: 'S', sub: '4px', value: '4px', token: '' },\n { label: 'M', sub: '8px', value: '8px', token: '' },\n { label: 'L', sub: '12px', value: '12px', token: '' },\n { label: 'XL', sub: '16px', value: '16px', token: '' },\n { label: 'XXL', sub: '24px', value: '24px', token: '' },\n ],\n spaceSteps: [\n { label: '无', size: '', val: '0px' },\n { label: 'S', size: '4px', val: '4px' },\n { label: 'M', size: '8px', val: '8px' },\n { label: 'L', size: '12px', val: '12px' },\n { label: 'XL', size: '16px', val: '16px' },\n { label: 'XXL', size: '24px', val: '24px' },\n ],\n borderWidthSteps: ['0px', '1px', '2px', '4px'],\n fontSizeOptions: [],\n fontWeightOptions: [\n { label: '常', value: '400' },\n { label: '中', value: '500' },\n { label: '粗', value: '600' },\n { label: '黑', value: '700' },\n ],\n shadowTokens: [],\n typographyTokens: [],\n};\n\nexport const defaultDevInspectorConfig: DevInspectorConfig = {\n rootId: 'dev-inspector-root',\n endpoints: {\n applyCss: '/__dev/apply-css',\n submitStyleIntent: '/__dev/submit-style-intent',\n styleIntents: '/__dev/style-intents',\n deleteStyleIntent: '/__dev/style-intents/delete',\n handoff: '/__dev/handoff',\n reveal: '/__dev/reveal',\n },\n tokens: FALLBACK_TOKENS,\n};\n\nexport function mergeDevInspectorConfig(\n overrides?: Partial<DevInspectorConfig> & {\n endpoints?: Partial<DevInspectorEndpoints>;\n tokens?: Partial<DevInspectorTokenConfig>;\n },\n): DevInspectorConfig {\n return {\n ...defaultDevInspectorConfig,\n ...overrides,\n endpoints: {\n ...defaultDevInspectorConfig.endpoints,\n ...overrides?.endpoints,\n },\n tokens: {\n ...defaultDevInspectorConfig.tokens,\n ...overrides?.tokens,\n },\n };\n}\n","import { StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport DevInspector from './DevInspector';\nimport { DevInspectorProvider } from './DevInspectorProvider';\nimport { mergeDevInspectorConfig, type DevInspectorConfig } from './config';\n\nexport function mountDevInspector(\n config?: Partial<DevInspectorConfig> & { endpoints?: Partial<DevInspectorConfig['endpoints']> },\n) {\n const resolved = mergeDevInspectorConfig(config);\n const existingRoot = document.getElementById(resolved.rootId);\n if (existingRoot) return existingRoot;\n\n const devRoot = document.createElement('div');\n devRoot.id = resolved.rootId;\n document.body.appendChild(devRoot);\n\n createRoot(devRoot).render(\n <StrictMode>\n <DevInspectorProvider config={resolved}>\n <DevInspector />\n </DevInspectorProvider>\n </StrictMode>,\n );\n\n return devRoot;\n}\n"],"mappings":"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","names":["jsx","jsx","s","prompt","jsx"]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@lijinmei-810/dev-inspector",
3
+ "version": "0.1.0",
4
+ "description": "可视化 CSS 检查与编辑工具(React 组件)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "./style.css": "./dist/dev-inspector.css"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch"
25
+ },
26
+ "peerDependencies": {
27
+ "react": ">=18",
28
+ "react-dom": ">=18"
29
+ },
30
+ "dependencies": {
31
+ "lucide-react": "^0.546.0"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "keywords": ["devtools", "css-inspector", "react", "vite"],
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/lijinmei915/dev-inspector.git",
40
+ "directory": "packages/dev-inspector"
41
+ }
42
+ }