chore: establish YCode replication baseline and TODO

This commit is contained in:
xiaohan.yuan committed 2026-10-17 02:43:49 +08:00
commit 6dc59f89ba
1118 files changed
+196002

No files matched your search

+16
View File
@@ -0,0 +1,16 @@
import fs from 'node:fs'
import postcss from 'postcss'
const menu=JSON.parse(fs.readFileSync('.tmp/rea-home-workspace-menu-static-20261016/layout.json','utf8'))
const selected=JSON.parse(fs.readFileSync('.tmp/rea-home-workspace-selected-static-20261016/layout.json','utf8'))
if(menu.evidenceId!=='ev_52d92db9b00973e41c6a87b2d07c50994f33cc7e830e1a31d1206899acc12708'||selected.evidenceId!=='ev_3d39021c1d58a382b7cc2bb67129fed6567eb45626e9b892674984535f66c658')throw Error('Unexpected REA menu evidence')
const camel=(key)=>key==='class'?'className':key.replace(/-([a-z])/g,(_,letter)=>letter.toUpperCase())
function getIcon(layout,predicate,index=0){const doc=layout.layout.documents[0],nodes=doc.nodes,root=nodes.filter(predicate)[index];if(!root)return null;const byId=new Map(nodes.filter((node)=>!node.node_name.startsWith('::')).map((node)=>[node.node_index,node]));const inside=(node)=>{for(let current=node;current;current=byId.get(current.parent_index)){if(current.node_index===root.node_index)return true;if(current.parent_index===current.node_index)break}return false};const svg=doc.svg_nodes.find((node)=>node.node_name==='svg'&&inside(node));if(!svg)return null;const props=Object.fromEntries(Object.entries(svg.attributes).map(([key,value])=>[camel(key),value]));const children=doc.svg_nodes.filter((node)=>node.parent_index===svg.node_index).map((node)=>({tag:node.node_name,props:Object.fromEntries(Object.entries(node.attributes).map(([key,value])=>[camel(key),value]))}));return{props,children}}
const cls=(name)=>(node)=>(node.attributes.class??'').split(' ').includes(name)
const footerNodes=selected.layout.documents[0].nodes.filter((node)=>(node.attributes.class??'')==='wb-dropdown__item')
const icons={check:getIcon(selected,cls('wb-dropdown__check')),folder:getIcon(menu,cls('cr-workspace-picker')),down:getIcon(menu,cls('cr-input-footer-item__chevron')),search:getIcon(menu,cls('wb-dropdown__search')),clear:getIcon(menu,cls('wb-input__clear')),create:getIcon(selected,(node)=>node.node_index===footerNodes[0].node_index),none:getIcon(selected,(node)=>node.node_index===footerNodes[2].node_index)}
if(Object.values(icons).some((icon)=>!icon?.children.length))throw Error('Missing captured source SVG')
fs.writeFileSync('src/renderer/src/components/source-workspace-picker-reference.ts','// Static SVG geometry from REA '+menu.evidenceId+' and '+selected.evidenceId+'.\nexport const sourceWorkspaceIcons: Record<string,{props:Record<string,string>;children:{tag:string;props:Record<string,string>}[]}> = '+JSON.stringify(icons,null,2)+'\n')
const css=[]
for(const file of ['src-Bh3YZ35H.css','src-CyXHA0IC.css'])postcss.parse(fs.readFileSync('.tmp/rea-css-recovered/'+file,'utf8')).walkRules((rule)=>{if(!/\.wb-(?:dropdown|popover|input)|\.cr-(?:workspace-picker|input-footer-item)/.test(rule.selector))return;const copy=rule.clone();copy.selectors=copy.selectors.map((s)=>'.source-workspace-picker '+s);let tree=copy;for(let parent=rule.parent;parent?.type==='atrule';parent=parent.parent){const wrap=parent.clone({nodes:[]});wrap.append(tree);tree=wrap}css.push(tree.toString())})
const vars=new Set(),collect=(text)=>{for(const match of text.matchAll(/var\((--[\w-]+)/g))vars.add(match[1])};collect(css.join(''));const rules=[];postcss.parse(fs.readFileSync('.tmp/rea-css-recovered/tokens-Df-i-zsO.css','utf8')).walkRules((rule)=>rules.push(rule));for(let pass=0;pass<10;pass++)for(const rule of rules)rule.walkDecls((decl)=>{if(vars.has(decl.prop))collect(decl.value)});const light=new Map(),dark=new Map();for(const rule of rules){const target=rule.selector.includes('dark')?dark:rule.selector.includes(':root')?light:null;if(target)rule.walkDecls((decl)=>{if(vars.has(decl.prop))target.set(decl.prop,decl.value)})}const serialize=(map)=>[...map].map(([key,value])=>key+':'+value).join(';');css.unshift('.source-workspace-picker{'+serialize(light)+'}',':root[data-theme=dark] .source-workspace-picker{'+serialize(dark)+'}');
fs.writeFileSync('src/renderer/src/components/source-workspace-picker-recovered.css','/* Shared styles from REA ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94; original @media conditions retained. */\n'+css.join('\n')+'\n');console.log(JSON.stringify({icons:Object.keys(icons),rules:css.length}))