- oil-ui-pro 升到 0.22.2:references 13→28 份(新增 16、删 imagery.md)、assets 增 cards/(22 组)与 fonts/、SKILL.md 顶层五步结构未改名。 - 升级路径:官方 `npx github:oil-oil/oil-cli update` 稳定失败(error=replace、报「检查目录权限」)。 真身为 EXDEV —— 解压在 os.tmpdir()(C 盘)、技能目录在 E 盘,Windows 上 rename 不能跨盘; CLI 的 catch 把非 CliError 原生异常一律兜底成 replaceFailed,真错误一个字不吐。 做法=借其 prepare() 只做下载+校验,再 cp 到同盘 stage、rename 交换;官方命令复验 up_to_date。 - 回归:product-planning 按名引用的 visual-review.md/tools.md/design-direction.md/style-explorer.md 全部健在;命名闸门 2061|0|27。 - session-mechanism/references/pitfalls.md 新增 P0-98(含通则:更新器把原生错误兜底成指错方向的人话)。
26 lines
2.0 KiB
JavaScript
26 lines
2.0 KiB
JavaScript
export function createCatalog(query) {
|
|
const descriptions={
|
|
all:'',
|
|
visual:'用光场、曲面和影像建立品牌印象。先选视觉语言,再替换品牌与内容。',
|
|
product:'把真实产品的一小段体验放大呈现:任务、文件、运行输出与内容就绪。',
|
|
data:'表达数量、范围和连接关系。数据可以替换,图形应保持清楚的阅读顺序。',
|
|
action:'引导一个清楚的下一步:快捷操作、资源入口或推广行动。'
|
|
};
|
|
const items=[...document.querySelectorAll('main [data-family]')],buttons=[...document.querySelectorAll('[data-family-filter]')],summary=document.querySelector('.category-summary');
|
|
const groups=[...document.querySelectorAll('.signature-grid,.exploration-grid,.utility-grid,.peer-grid')];
|
|
const controller=new AbortController();
|
|
buttons.forEach(button=>{const family=button.dataset.familyFilter;button.querySelector('span').textContent=String(items.filter(item=>family==='all'||item.dataset.family===family).length);});
|
|
function select(family){
|
|
document.querySelector('main').dataset.category=family;
|
|
items.forEach(item=>{item.hidden=family!=='all'&&item.dataset.family!==family;});
|
|
groups.forEach(group=>{group.hidden=![...group.querySelectorAll('[data-family]')].some(item=>!item.hidden);});
|
|
document.querySelector('.peer-intro').hidden=document.querySelector('.peer-grid').hidden;
|
|
document.querySelector('.showcase-intro').hidden=document.querySelector('.showcase-section').hidden;
|
|
buttons.forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.familyFilter===family)));
|
|
summary.textContent=descriptions[family];summary.hidden=!summary.textContent;
|
|
}
|
|
buttons.forEach(button=>button.addEventListener('click',()=>select(button.dataset.familyFilter),{signal:controller.signal}));
|
|
const requested=query.get('category');select(!query.has('focus')&&Object.hasOwn(descriptions,requested)?requested:'all');
|
|
return {destroy(){controller.abort();}};
|
|
}
|