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(含通则:更新器把原生错误兜底成指错方向的人话)。
This commit is contained in:
1 parent
053a6a6723
commit
d9445b5888
126 files changed
+10345
-1401
No files matched your search
@@ -0,0 +1,30 @@
|
||||
.card.capture-notes {
|
||||
--_card-stage-track-min:340px; aspect-ratio:auto; background:color-mix(in oklab,var(--card-surface) 95%,var(--card-ink));
|
||||
& .card-stage { display:grid; grid-template-rows:minmax(0,1fr) auto; gap:12px; padding:0 22px 22px; }
|
||||
& .capture-sheet { min-height:0; overflow:hidden; background:var(--card-panel); border:1px solid color-mix(in oklab,var(--card-ink) 8%,transparent); border-radius:10px; box-shadow:0 5px 18px #18243207; padding:23px 19px 0; mask-image:linear-gradient(#000 82%,transparent); }
|
||||
& .capture-sheet-title { display:flex; align-items:center; gap:8px; margin-bottom:16px; font-size:20px; line-height:1.3; }
|
||||
& .capture-sheet-title strong { font-weight:550; overflow-wrap:anywhere; }
|
||||
& .capture-sheet-title svg { width:22px; height:22px; flex:none; fill:none; stroke:var(--_card-accent-ink); stroke-width:1.7; stroke-linecap:round; }
|
||||
& .capture-tabs { display:flex; gap:12px; align-items:center; color:var(--card-muted); font-size:10px; line-height:1.5; padding-bottom:13px; border-bottom:1px solid var(--card-line); }
|
||||
& .capture-tabs span:first-child { color:var(--card-ink); background:var(--card-wash); padding:3px 6px; border-radius:4px; }
|
||||
& .capture-tabs i { font-style:normal; margin-left:auto; }
|
||||
& .capture-labels { display:flex; justify-content:space-between; font-size:9px; color:var(--card-muted); padding:12px 0 6px; }
|
||||
& .capture-row { display:flex; align-items:center; gap:8px; width:100%; min-width:0; padding:12px 0; background:transparent; border:0; border-top:1px solid var(--card-line); text-align:left; color:var(--card-ink); cursor:pointer; font-size:11px; line-height:1.3; }
|
||||
& .capture-row::before { content:''; width:9px; height:12px; flex:none; border:1px solid var(--card-muted); border-radius:1px; background:linear-gradient(var(--card-line),var(--card-line)) 2px 4px/5px 1px no-repeat; }
|
||||
& .capture-row span { font-size:11px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||
& .capture-row .capture-tags { display:flex; flex:none; gap:4px; margin-left:auto; max-width:42%; }
|
||||
& .capture-row small { flex:0 1 auto; min-width:0; font-size:9px; color:var(--tag-ink); background:color-mix(in oklab,var(--tag-ink) 11%,var(--card-panel)); border-radius:3px; padding:3px 5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||
& [data-tone="indigo"] { --tag-ink:light-dark(#5960b5,#a8adf3); }
|
||||
& [data-tone="teal"] { --tag-ink:light-dark(#347768,#88c9b7); }
|
||||
& [data-tone="amber"] { --tag-ink:light-dark(#936b32,#d9b277); }
|
||||
& [data-tone="rose"] { --tag-ink:light-dark(#995c74,#d8a1b5); }
|
||||
& [data-tone="slate"] { --tag-ink:light-dark(#5f7089,#adbdd3); }
|
||||
& .capture-row[aria-pressed="true"] span { color:var(--_card-accent-ink); }
|
||||
& .capture-recorder { display:flex; align-items:center; gap:9px; min-width:0; padding:9px 11px; background:var(--card-panel); border:1px solid color-mix(in oklab,var(--card-ink) 12%,transparent); border-radius:40px; box-shadow:0 6px 16px #1118270a; }
|
||||
& .record-dot { width:6px; height:6px; flex:none; border-radius:50%; background:var(--card-accent); }
|
||||
& .capture-now { font-size:11px; min-width:0; flex:1; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
|
||||
& .capture-wave { display:flex; align-items:center; gap:3px; height:22px; flex:none; }
|
||||
& .capture-wave i { width:2px; height:20px; background:var(--card-muted); border-radius:2px; transform:scaleY(.3); }
|
||||
& .capture-pause { display:grid; place-items:center; border:0; border-radius:50%; width:28px; height:28px; flex:none; background:var(--card-wash); color:var(--card-ink); cursor:pointer; }
|
||||
& .capture-pause svg { width:15px; height:15px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<article class="card capture-notes" data-card="capture-notes" style="--card-accent:#5865c7">
|
||||
<h2 class="card-heading" data-text="title">把每一次讨论,
|
||||
留在同一份记录里。</h2>
|
||||
<div class="card-stage"><div class="capture-sheet"><div class="capture-sheet-title"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M6 10v2a6 6 0 0 0 12 0v-2M12 18v3M8 21h8"/></svg><strong data-text="collection">团队讨论</strong></div><div class="capture-tabs"><span data-text="tab">全部记录</span><span data-text="scope">我的会议</span><i>+</i></div><div class="capture-labels"><span data-text="listLabel">会议主题</span><span data-text="tagLabel">团队</span></div><div class="capture-rows"></div></div>
|
||||
<div class="capture-recorder"><span class="record-dot"></span><span class="capture-now"></span><span class="capture-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><button class="capture-pause" aria-label="暂停波形动画"><svg viewBox="0 0 20 20"><path d="M7 5v10M13 5v10"/></svg></button></div>
|
||||
</div>
|
||||
</article>
|
||||
@@ -0,0 +1,25 @@
|
||||
import {shell,loop,staticMotion,clamp} from '../shared/runtime.js';
|
||||
export function mount(element, options = {}) {
|
||||
const clean=shell(element,options),content=options.content || {},rows=element.querySelector('.capture-rows'),now=element.querySelector('.capture-now'),bars=[...element.querySelectorAll('.capture-wave i')],button=element.querySelector('.capture-pause');
|
||||
const defaults=[{title:'首页设计评审',team:'设计'},{title:'内容与视觉方向',team:'创作'},{title:'本周项目同步',team:'产品'},{title:'新想法的第一轮讨论',team:'团队'},{title:'发布前的最后一次检查',team:'工程'}];
|
||||
const records=(Array.isArray(content.records)?content.records:defaults).filter(record=>record && typeof record==='object');
|
||||
const still=staticMotion(element,options),events=new AbortController(),tones=['indigo','teal','amber','rose','slate'];let clock,paused=false,phase=0,selected=0;
|
||||
rows.replaceChildren();
|
||||
const select=index=>{selected=index;now.textContent=String(records[index]?.title ?? content.emptyText ?? '还没有讨论记录');now.title=String(records[index]?.detail ?? now.textContent);[...rows.children].forEach((r,i)=>r.setAttribute('aria-pressed',String(i===index)));clock?.invalidate();};
|
||||
records.forEach((record,index)=>{
|
||||
const row=document.createElement('button'),name=document.createElement('span'),tags=document.createElement('span');row.type='button';row.className='capture-row';tags.className='capture-tags';name.textContent=String(record.title ?? '');
|
||||
const values=Array.isArray(record.tags)?record.tags:[{label:record.team ?? '',tone:record.tone}];
|
||||
values.forEach((value,i)=>{const tag=document.createElement('small'),label=typeof value==='object'?value?.label:value,tone=typeof value==='object'?value?.tone:undefined;tag.textContent=String(label ?? '');tag.dataset.tone=tones.includes(tone)?tone:tones[(index+i)%tones.length];tags.append(tag);});
|
||||
row.append(name,tags);row.addEventListener('click',()=>select(index),{signal:events.signal});rows.append(row);
|
||||
});select(0);
|
||||
const start=()=>{clock?.destroy();clock=loop(element,(time,dt)=>{
|
||||
if(!paused)phase+=dt;
|
||||
const waveform=records[selected]?.waveform;
|
||||
bars.forEach((b,i)=>{const sample=Array.isArray(waveform)&&waveform.length?waveform[i%waveform.length]:undefined,base=typeof sample==='number'&&Number.isFinite(sample)?clamp(sample):undefined;
|
||||
const value=base!==undefined?clamp(base*(still()?1:.8+.2*Math.sin(phase*3.2+i*.85)),.08,1):still()?.25+.5*Math.abs(Math.sin(i*1.8)):.2+.8*Math.abs(Math.sin(phase*3.2+i*.85)*Math.cos(phase*1.4-i*.32));b.style.transform=`scaleY(${value})`;
|
||||
});
|
||||
},{...options,continuous:!paused&&records.length>0});};
|
||||
const syncButton=()=>{button.setAttribute('aria-label',paused?'播放波形动画':'暂停波形动画');button.setAttribute('aria-pressed',String(paused));button.querySelector('path').setAttribute('d',paused?'m7 4 8 6-8 6Z':'M7 5v10M13 5v10');};
|
||||
button.disabled=!records.length;syncButton();button.addEventListener('click',()=>{paused=!paused;syncButton();start();},{signal:events.signal});start();
|
||||
return {destroy(){clock.destroy();events.abort();clean();rows.replaceChildren();bars.forEach(bar=>bar.style.removeProperty('transform'));}};
|
||||
}
|
||||
Reference in new issue
Block a user