Files
workbuddy_skills/oil-ui-pro/assets/cards/gallery-catalog.js
T
admin d9445b5888 oil-ui-pro 0.15.4 → 0.22.2(上游 ui.oiloil.org 正式包)+ 记 P0-98 跨盘 rename 坑
- 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(含通则:更新器把原生错误兜底成指错方向的人话)。
2026-10-14 10:21:46 +08:00

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();}};
}