01 CoreUI 设计系统界面预览 选择备注、批量归档、查看“归档”标签页,并撤销最近一次操作。
适用于 Bootstrap 5.9.0 CSS 的原生 CoreUI,以及捆绑的 Tab/Toast JavaScript。·
实现参考 CoreUI Bootstrap 5.9.0 的浅色主题默认值,取自已安装的编译样式表。这些 --cui-* 名称是实际的运行时变量。示例应用使用免费组件,不假设使用 CoreUI PRO 小部件。
名称 / 规则 值 / 配置 用途 --cui-primary#5856d6 CoreUI 主紫色。 --cui-primary-contrast#fff与主色配套的文字颜色。 --cui-secondary#6b7785 次要角色。 --cui-success#1b9e3e 成功角色。 --cui-info#39f信息角色。 --cui-warning#f9b115 警告角色。 --cui-danger#e55353 危险角色。 --cui-primary-bg-subtle#cfc7f3 柔和主色情境卡片背景。 --cui-primary-text-emphasis#3634a3 柔和主色表面上的文字。 --cui-primary-border-subtle#9d92e6 情境卡片边框。 --cui-danger-bg-subtle#f9d4d4 高优先级徽标表面。 --cui-danger-text-emphasis#671414 高优先级徽标文字。 --cui-warning-bg-subtle#feecc5 中优先级徽标表面。 --cui-warning-text-emphasis#764705 中优先级徽标文字。
名称 / 规则 值 / 配置 用途 --cui-font-sans-serifsystem-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"系统 UI 字体栈。 --cui-body-font-size1rem默认正文字号为 1rem;密集表格使用自行设置的 14px 覆盖值。 --cui-body-line-height1.5默认正文行高。 --cui-body-colorrgba(37, 42.92, 54.02, 0.95)浅色主题的主要正文颜色。 --cui-body-bg#fff主要表面。 --cui-tertiary-bg#f3f4f7 本示例中的页面背景。 --cui-secondary-colorrgba(37, 42.92, 54.02, 0.681)辅助文字角色。 --cui-border-color#dbdfe6 默认分隔线颜色。
名称 / 规则 值 / 配置 用途 --cui-border-radius0.375rem默认值,相当于 16px 根字号下的 6px。 --cui-border-radius-sm0.25rem小号,相当于 4px。 --cui-border-radius-lg0.5rem大号,相当于 8px。 --cui-border-radius-xl1rem超大号,相当于 16px。 --cui-border-radius-pill50rem胶囊形状。 --cui-focus-ring-width0.25rem焦点环宽度。 --cui-focus-ring-opacity0.25焦点环不透明度。 --cui-focus-ring-colorrgba(88, 86, 214, 0.25)基于主色的焦点环颜色。
名称 / 规则 值 / 配置 用途 Page padding32px; 24px 14px mobile自定义应用内边距。 Table minimum width740px在本地响应式滚动区域中保持列内容清晰易读。 Table cell padding16px围绕原生表格结构自定义密度选项。 Table text14px; headings 12px自定义紧凑层级。 g-3 summary row1rem native gutter响应式指标卡片使用标准网格间距。 Toast behaviorautohide: false撤销操作会一直保留,直至被关闭或被后续批次替换。
03 CoreUI 设计系统完整指南 实用指南,介绍如何为真实界面选择、应用和评审此系统。
DESIGN-coreui.md 完整指导、实现起点和源代码链接。
下载指南 CoreUI 设计系统:选择你实际使用的 CoreUI 运行时 选择你实际使用的 CoreUI 运行时 本示例使用 CoreUI,适用于 Bootstrap 5.9.0,即 CSS 和浏览器版 JavaScript 软件包。CoreUI 也提供针对不同框架的软件包,但其组件导入方式不能与本示例的数据属性互换。此设置提供一套匹配的样式表和捆绑脚本,不假设使用 React 或 Vue 提供器。
审核工作台使用免费的卡片、表格、表单、标签页和 Toast,不会悄然换用 PRO 数据网格或高级付费选择器。明确这一范围后,完整示例便可直接使用指定软件包复现,无须购买未注明的模板。
阅读配套规范
CoreUI 设计系统:使用实际的紫色主色及其配套状态角色 使用实际的紫色主色及其配套状态角色 CoreUI 的浅色主题主色为 #5856d6,与白色形成主色对比。审核原则卡片将 primary-bg-subtle、primary-border-subtle 和 primary-text-emphasis 配套使用。这些名称代表协调一致的表面样式,因此不会在着色背景上随意搭配前景文字颜色。
高优先级和中优先级徽标也分别将 danger 或 warning 柔和表面与强调文字配套使用。文字标签能独立于颜色表达分类。这些是设计评审示例中的优先级,并不意味着产品中的所有红色徽标都代表相同的领域状态。
阅读配套规范
CoreUI 设计系统:将默认正文字体与密集型工作表格区分开 将默认正文字体与密集型工作表格区分开 编译后的 CoreUI 正文默认字号为 1rem,行高为 1.5。为了让密集的审核队列更易浏览,本示例有意将表格文字设为 14px、列标签设为 12px。页面标题和摘要值则分别使用更大的自定义字号。本指南不会把这些应用层覆盖值误称为整个库的默认值。
这三张上下文卡片使用原生响应式网格和 g-3 间距。在小屏幕上,收件箱和已归档仍并排显示,第三张说明卡片则占满一行。所有数字均根据五条可见示例记录计算;没有无关的仪表盘指标,也没有虚构的增长图表。
阅读配套规范
CoreUI 设计系统:数据属性控制实际标签页面板 CoreUI 数据属性控制实际的标签页面板 收件箱和归档是基于按钮的标签页,使用 data-coreui-toggle="tab",并指向对应的标签页面板。标记中包含 tablist、tab、tabpanel、aria-controls 和 aria-labelledby 关系。CoreUI JavaScript 组件会更新活动状态和可见性,而不是仅由应用处理程序改变下划线。
nav-underline-border 类为此组件提供视觉样式。切换标签页不会归档记录或清除选择。标签页控制本地队列中显示的内容,而应用中已选和已归档的 Set 则保持为独立状态。
阅读配套规范
CoreUI 设计系统:全选操作具有明确含义的混合状态 全选操作具有明确的混合状态 每条备注都使用稳定的 R 系列 ID。勾选一行会将该 ID 添加到已选 Set 中。只有选中当前收件箱中的所有记录时,表头复选框才会呈选中状态;选中部分记录时则呈不确定状态;收件箱为空时,复选框会被禁用。每次重新渲染队列时,都会重新计算这些状态。
未选中任何记录时,批量操作按钮会被禁用,旁边的文字会显示当前选中数量。归档操作完成后会清除选择,避免已归档的记录意外留在下一批操作中。原始备注和负责人信息会保留在记录中,不会被通用的“已解决”标签替代。
选择两条备注,查看表头复选框的不确定状态。 归档所选记录,确认收件箱计数减少两条。 打开“归档”,查看原始请求和负责人。 阅读配套规范
CoreUI 设计系统:Toast 展示一项明确且可撤销的操作 Toast 呈现一项明确且可撤销的操作 应用会记录最近一次归档批次的确切 ID,然后调用原生 Toast 实例的 show 方法。由于通知中包含“撤销”操作,autohide 设为 false;示例不会在任意的短暂计时后取消撤销机会。用户仍可主动关闭 Toast。
撤销操作只会将已保存的 ID 从已归档 Set 中移除、清除最近批次的快照,并禁用对应操作。如果撤销较新的批次,之前归档的批次仍会保持归档状态。这是有意设计的单层撤销操作,并未误称为完整的撤销历史。
阅读配套规范
CoreUI 设计系统:归档后仍保留请求内容,方便阅读 归档后仍保持请求内容清晰可读 收件箱表格会显示备注标题、具体请求的更改、所属区域、优先级和负责人。归档视图会呈现紧凑列表,保留标题、ID、负责人和完整请求。记录处理完成后,界面会减少表格装饰,但不会删除理解已更改内容所需的信息。
在移动设备上,表格会在 table-responsive 容器内保持 740px 的最小宽度。命名区域可通过键盘聚焦,并具有可见的焦点样式;水平滚动会限制在表格内,不会导致整个文档变宽。为了避免出现滚动条而删除重要列,会削弱这一审核任务。
阅读配套规范
CoreUI 设计系统:持久显示操作结果,不虚构后端功能 使用持久化结果,但不要虚构后端 Toast 使用 polite 状态角色和原子播报。另一个内联状态会说明本地归档或撤销的结果。两者都不会声称已关闭外部问题,因为此页面明确没有连接问题跟踪系统。预览只会修改内存中的 Set,因此重新加载后会恢复原来的五条备注。
记录标题和描述(包括归档列表中的内容)均使用 textContent 插入。固定的类映射用于表示已知的两种优先级。这能将类似用户输入的文本与HTML结构分开,也便于检查示例中的数据流。
说明实际批次大小和本地操作范围。 只要快照仍然有效,就保留撤销按钮。 不要把本地 DOM 更新称为远程处理成功。 阅读配套规范
CoreUI 设计系统:在本地模块前加载 CoreUI Bundle 在本地模块之前加载 CoreUI 软件包 完整配置会将软件包的 dist 资源复制到本地 public 路径,并在 app.js 之前加载 coreui.bundle.min.js。该 bundle 会公开 coreui.Toast,并为 data-coreui 属性提供标签页行为。在此组合中无需再添加第二个 Bootstrap 运行时,否则可能造成职责重复、令人困惑。
通过 data-coreui-theme="light" 明确指定浅色主题。更大型的应用可以采用 CoreUI 的 color-mode 机制,但应一并检查语义文本与界面表面的配色组合。本地验证涵盖了部分选择、两条记录的批量操作、归档标签页阅读、撤销恢复,以及 390px 视口。
阅读配套规范
CoreUI 设计系统组件示例 队列、归档标签页和撤销 Toast CoreUI 数据属性、表格控件、语义化优先级徽标和持久显示的 Toast。
html 复制代码
<main class="review-desk"><header class="desk-heading"><div><p class="eyebrow">COREUI · REVIEW OPERATIONS</p><h1>Keep the review queue moving.</h1><p class="text-body-secondary">Archive resolved design notes and undo the last local batch.</p></div><span class="badge text-bg-primary">LOCAL WORKSPACE</span></header><div class="row g-3 mb-4"><div class="col-6 col-md-4"><div class="card metric"><div class="card-body"><div class="text-body-secondary small">Inbox</div><strong id="inbox-count">5</strong><span>design notes</span></div></div></div><div class="col-6 col-md-4"><div class="card metric"><div class="card-body"><div class="text-body-secondary small">Archived</div><strong id="archive-count">0</strong><span>local resolutions</span></div></div></div><div class="col-12 col-md-4"><div class="card metric context-card"><div class="card-body"><div class="text-body-secondary small">Review principle</div><p class="mt-2 mb-0">Keep the original request visible, even after the note is resolved.</p></div></div></div></div><section class="card"><div class="card-header bg-body"><ul class="nav nav-underline-border" role="tablist"><li class="nav-item" role="presentation"><button id="inbox-tab" class="nav-link active" data-coreui-toggle="tab" data-coreui-target="#inbox-panel" type="button" role="tab" aria-controls="inbox-panel" aria-selected="true">Inbox</button></li><li class="nav-item" role="presentation"><button id="archive-tab" class="nav-link" data-coreui-toggle="tab" data-coreui-target="#archive-panel" type="button" role="tab" aria-controls="archive-panel" aria-selected="false">Archive</button></li></ul></div><div class="tab-content"><div id="inbox-panel" class="tab-pane fade show active" role="tabpanel" aria-labelledby="inbox-tab" tabindex="0"><div class="batch-bar"><span id="selection" class="small text-body-secondary">No notes selected</span><button id="archive" class="btn btn-primary btn-sm" disabled>Archive selected</button></div><div class="table-responsive" tabindex="0" role="region" aria-label="Design review inbox"><table class="table table-hover align-middle mb-0"><thead><tr><th scope="col"><input id="select-all" class="form-check-input" type="checkbox" aria-label="Select all inbox notes"></th><th scope="col">Design note</th><th scope="col">Area</th><th scope="col">Priority</th><th scope="col">Owner</th></tr></thead><tbody id="inbox-rows"></tbody></table></div><p id="inbox-empty" class="empty-copy" hidden>All sample notes are archived. Open Archive to inspect them.</p></div><div id="archive-panel" class="tab-pane fade" role="tabpanel" aria-labelledby="archive-tab" tabindex="0"><div class="p-4"><h2 class="h5">Resolved in this local session</h2><p class="text-body-secondary small">The original note and owner stay attached to the record.</p><ul id="archive-list" class="list-group list-group-flush"></ul><p id="archive-empty" class="mb-0 text-body-secondary">No notes archived yet.</p></div></div></div></section><section class="decision-key"><span class="badge bg-danger-subtle text-danger-emphasis">High</span><p>Blocks a clear next action or access to important information.</p><span class="badge bg-warning-subtle text-warning-emphasis">Medium</span><p>Creates avoidable friction while the flow remains usable.</p></section><div class="toast-container position-static mt-4"><div id="undo-toast" class="toast w-100" role="status" aria-live="polite" aria-atomic="true"><div class="toast-header"><strong class="me-auto">Local archive updated</strong><button type="button" class="btn-close" data-coreui-dismiss="toast" aria-label="Dismiss notice"></button></div><div class="toast-body"><p id="toast-copy" class="mb-3"></p><button id="undo" class="btn btn-outline-primary btn-sm">Undo last batch</button></div></div></div><p id="result" class="small text-body-secondary mt-3" role="status">No external issue tracker is connected.</p></main>
代码参考
使用 data-coreui-* 属性配合此 bundle,不要照搬其他库中的 data-bs-*。 表格位于具有明确名称的本地水平滚动区域中。 优先级颜色搭配明确的“高”和“中”标签。 批量选择和最近批次撤销 稳定的记录 ID 用于管理已选和已归档集合,原生 Toast 则负责显示通知。
javascript 复制代码
const records=[{id:'R-201',title:'Explain the empty search result',detail:'Offer a way to clear the filter without losing the query.',area:'Search',priority:'High',owner:'Maya'},{id:'R-202',title:'Label the compact navigation icons',detail:'The collapsed sidebar needs understandable accessible names.',area:'Navigation',priority:'High',owner:'Jules'},{id:'R-203',title:'Keep form errors beside their fields',detail:'Retain entered values after a failed submission.',area:'Forms',priority:'High',owner:'Alex'},{id:'R-204',title:'Align the table’s numeric column',detail:'Right-align quantities so differences can be scanned.',area:'Tables',priority:'Medium',owner:'Sam'},{id:'R-205',title:'Clarify the download format',detail:'Show the file type before the visitor starts the download.',area:'Content',priority:'Medium',owner:'Maya'}];const archived=new Set(),selected=new Set();let lastBatch=[];const q=s=>document.querySelector(s),toast=coreui.Toast.getOrCreateInstance(q('#undo-toast'),{autohide:false});
function render(){const inbox=records.filter(r=>!archived.has(r.id));q('#inbox-rows').replaceChildren();q('#archive-list').replaceChildren();records.forEach(r=>{if(archived.has(r.id)){let li=document.createElement('li');li.className='list-group-item px-0';let title=document.createElement('strong'),detail=document.createElement('p');title.textContent=`${r.id} · ${r.title}`;detail.className='small text-body-secondary mb-0 mt-1';detail.textContent=`${r.owner} · ${r.detail}`;li.append(title,detail);q('#archive-list').append(li);return;}let tr=document.createElement('tr');tr.innerHTML='<td><input class="form-check-input" type="checkbox"></td><td><strong></strong><p class="small text-body-secondary mb-0 mt-1"></p></td><td></td><td><span class="badge"></span></td><td></td>';let cells=tr.children,check=tr.querySelector('input');check.setAttribute('aria-label',`Select ${r.id}: ${r.title}`);check.checked=selected.has(r.id);check.onchange=()=>{check.checked?selected.add(r.id):selected.delete(r.id);sync();};cells[1].querySelector('strong').textContent=r.title;cells[1].querySelector('p').textContent=r.detail;cells[2].textContent=r.area;let badge=tr.querySelector('.badge');badge.classList.add(r.priority==='High'?'bg-danger-subtle':'bg-warning-subtle',r.priority==='High'?'text-danger-emphasis':'text-warning-emphasis');badge.textContent=r.priority;cells[4].textContent=r.owner;q('#inbox-rows').append(tr);});q('#inbox-count').textContent=inbox.length;q('#archive-count').textContent=archived.size;q('#inbox-empty').hidden=inbox.length!==0;q('#archive-empty').hidden=archived.size!==0;sync();}
function sync(){let total=records.length-archived.size;q('#selection').textContent=selected.size?`${selected.size} ${selected.size===1?'note':'notes'} selected`:'No notes selected';q('#archive').disabled=!selected.size;q('#select-all').disabled=!total;q('#select-all').checked=total>0&&selected.size===total;q('#select-all').indeterminate=selected.size>0&&selected.size<total;}
q('#select-all').onchange=e=>{selected.clear();if(e.target.checked)records.filter(r=>!archived.has(r.id)).forEach(r=>selected.add(r.id));render();};q('#archive').onclick=()=>{lastBatch=[...selected];lastBatch.forEach(id=>archived.add(id));selected.clear();render();q('#toast-copy').textContent=`${lastBatch.length} ${lastBatch.length===1?'note was':'notes were'} archived locally. You can undo this most recent batch.`;q('#undo').disabled=false;toast.show();q('#result').textContent='The archive is local. No external issue tracker was changed.';};q('#undo').onclick=()=>{let count=lastBatch.length;lastBatch.forEach(id=>archived.delete(id));lastBatch=[];q('#undo').disabled=true;render();toast.hide();q('#result').textContent=`Restored ${count} ${count===1?'note':'notes'} to the inbox.`;};render();
代码参考
全选控件提供选中、未选中和不确定状态。 撤销操作会准确恢复最近批次中的 ID。 所有记录文本均使用 textContent 插入。 原始队列密度 围绕原生 CoreUI 卡片和表格样式构建页面布局。
css 复制代码
html,body{min-height:0;height:auto}body{background:var(--cui-tertiary-bg)}.review-desk{max-width:1120px;padding:32px;margin:auto}.desk-heading{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;margin-bottom:28px}.eyebrow{color:var(--cui-primary);font-size:11px;font-weight:700;letter-spacing:.12em}h1{font-size:32px;line-height:1.2;margin:12px 0}.desk-heading p:last-child{font-size:15px;line-height:1.6}.metric{height:100%}.metric strong{display:inline-block;font-size:32px;line-height:1.2;margin:12px 10px 0 0}.metric span{font-size:12px;color:var(--cui-secondary-color)}.context-card{background:var(--cui-primary-bg-subtle);border-color:var(--cui-primary-border-subtle)}.context-card p{font-size:14px;line-height:1.6;color:var(--cui-primary-text-emphasis)}.batch-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:16px 20px}.table{min-width:740px;font-size:14px}.table th,.table td{padding:16px}.table th:first-child,.table td:first-child{width:48px}.table td:nth-child(2){max-width:380px}.table td:nth-child(2) p{line-height:1.5}.table th{font-size:12px;color:var(--cui-secondary-color);font-weight:600}.empty-copy{padding:24px;margin:0}.decision-key{display:grid;grid-template-columns:max-content 1fr;align-items:start;gap:10px 14px;margin-top:24px;font-size:12px;color:var(--cui-secondary-color)}.decision-key p{margin:0;line-height:1.6}.toast-container{max-width:520px}[hidden]{display:none!important}@media(max-width:650px){.review-desk{padding:24px 14px}.desk-heading{flex-direction:column;gap:4px}h1{font-size:28px}.metric strong{font-size:28px}.batch-bar{padding:14px}.table-responsive:focus-visible{outline:3px solid var(--cui-primary);outline-offset:-3px}}
代码参考
740px 的表格宽度是为了便于阅读而采用的应用设置,并非 CoreUI 默认值。 实现起点 已针对 Bootstrap 5.9.0 验证 CoreUI。提供的 app.js 需要完整的队列标记,且不执行任何网络操作。HTML 封装代码包含完整的 body 标记;请将提供的交互示例和 CSS 示例保存为此处引用的文件名。
html 复制示例
<!-- npm install @coreui/[email protected] -->
<!-- Copy node_modules/@coreui/coreui/dist to public/vendor/coreui. -->
<html lang="en" data-coreui-theme="light">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/vendor/coreui/css/coreui.min.css">
<link rel="stylesheet" href="style.css">
<main class="review-desk"><header class="desk-heading"><div><p class="eyebrow">COREUI · REVIEW OPERATIONS</p><h1>Keep the review queue moving.</h1><p class="text-body-secondary">Archive resolved design notes and undo the last local batch.</p></div><span class="badge text-bg-primary">LOCAL WORKSPACE</span></header><div class="row g-3 mb-4"><div class="col-6 col-md-4"><div class="card metric"><div class="card-body"><div class="text-body-secondary small">Inbox</div><strong id="inbox-count">5</strong><span>design notes</span></div></div></div><div class="col-6 col-md-4"><div class="card metric"><div class="card-body"><div class="text-body-secondary small">Archived</div><strong id="archive-count">0</strong><span>local resolutions</span></div></div></div><div class="col-12 col-md-4"><div class="card metric context-card"><div class="card-body"><div class="text-body-secondary small">Review principle</div><p class="mt-2 mb-0">Keep the original request visible, even after the note is resolved.</p></div></div></div></div><section class="card"><div class="card-header bg-body"><ul class="nav nav-underline-border" role="tablist"><li class="nav-item" role="presentation"><button id="inbox-tab" class="nav-link active" data-coreui-toggle="tab" data-coreui-target="#inbox-panel" type="button" role="tab" aria-controls="inbox-panel" aria-selected="true">Inbox</button></li><li class="nav-item" role="presentation"><button id="archive-tab" class="nav-link" data-coreui-toggle="tab" data-coreui-target="#archive-panel" type="button" role="tab" aria-controls="archive-panel" aria-selected="false">Archive</button></li></ul></div><div class="tab-content"><div id="inbox-panel" class="tab-pane fade show active" role="tabpanel" aria-labelledby="inbox-tab" tabindex="0"><div class="batch-bar"><span id="selection" class="small text-body-secondary">No notes selected</span><button id="archive" class="btn btn-primary btn-sm" disabled>Archive selected</button></div><div class="table-responsive" tabindex="0" role="region" aria-label="Design review inbox"><table class="table table-hover align-middle mb-0"><thead><tr><th scope="col"><input id="select-all" class="form-check-input" type="checkbox" aria-label="Select all inbox notes"></th><th scope="col">Design note</th><th scope="col">Area</th><th scope="col">Priority</th><th scope="col">Owner</th></tr></thead><tbody id="inbox-rows"></tbody></table></div><p id="inbox-empty" class="empty-copy" hidden>All sample notes are archived. Open Archive to inspect them.</p></div><div id="archive-panel" class="tab-pane fade" role="tabpanel" aria-labelledby="archive-tab" tabindex="0"><div class="p-4"><h2 class="h5">Resolved in this local session</h2><p class="text-body-secondary small">The original note and owner stay attached to the record.</p><ul id="archive-list" class="list-group list-group-flush"></ul><p id="archive-empty" class="mb-0 text-body-secondary">No notes archived yet.</p></div></div></div></section><section class="decision-key"><span class="badge bg-danger-subtle text-danger-emphasis">High</span><p>Blocks a clear next action or access to important information.</p><span class="badge bg-warning-subtle text-warning-emphasis">Medium</span><p>Creates avoidable friction while the flow remains usable.</p></section><div class="toast-container position-static mt-4"><div id="undo-toast" class="toast w-100" role="status" aria-live="polite" aria-atomic="true"><div class="toast-header"><strong class="me-auto">Local archive updated</strong><button type="button" class="btn-close" data-coreui-dismiss="toast" aria-label="Dismiss notice"></button></div><div class="toast-body"><p id="toast-copy" class="mb-3"></p><button id="undo" class="btn btn-outline-primary btn-sm">Undo last batch</button></div></div></div><p id="result" class="small text-body-secondary mt-3" role="status">No external issue tracker is connected.</p></main>
<script src="/vendor/coreui/js/coreui.bundle.min.js"></script>
<script src="app.js"></script>
</html> 适用于你项目的提示词 Agent 提示词 复制提示词
从 CoreUI 5.9.0 设计评审操作台开始。保留原生标签页和撤销提示,并使用 data-coreui 属性;保留五条评审记录和选中 ID 集合,并根据集合派生混合批量选择状态。归档所选批次,在已归档标签页中显示,并允许通过“撤销”恢复最近一次批次。将表格的水平滚动限制在表格内部,并区分选中状态与归档状态。使用匹配的 CoreUI 套件;不要替换为 Bootstrap 属性名,也不要声称归档操作发生在服务器端。 适用于 Bootstrap 5.9.0 免费组件的 CoreUI。区分主题默认值与原始密度设置。归档和撤销操作只影响本地示例记录。