_demo-shell.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /** 面板 Tab Demo 通用交互 */
  2. function initPanelTabs(rootId) {
  3. const root = document.getElementById(rootId)
  4. if (!root) return
  5. const tabBtns = root.querySelectorAll('[data-tab]')
  6. const panels = root.querySelectorAll('[data-panel]')
  7. const track = root.querySelector('.tabs-06')
  8. const singleContent = root.querySelector('#content')
  9. function activate(name, index) {
  10. tabBtns.forEach((btn) => {
  11. btn.classList.toggle('is-active', btn.dataset.tab === name)
  12. })
  13. panels.forEach((panel) => {
  14. panel.classList.toggle('is-active', panel.dataset.panel === name)
  15. })
  16. if (track) {
  17. track.dataset.active = String(index)
  18. }
  19. if (singleContent && typeof mockContent === 'function') {
  20. singleContent.innerHTML = mockContent(name)
  21. }
  22. }
  23. tabBtns.forEach((btn, index) => {
  24. btn.addEventListener('click', () => activate(btn.dataset.tab, index))
  25. })
  26. }
  27. function buildBanner(currentFile, styleName, styleDesc) {
  28. const files = [
  29. { id: '01', file: '01-underline-default.html', label: '01 下划线' },
  30. { id: '02', file: '02-pill-segmented.html', label: '02 胶囊分段' },
  31. { id: '03', file: '03-card-tabs.html', label: '03 卡片 Tab' },
  32. { id: '04', file: '04-icon-blocks.html', label: '04 图标块' },
  33. { id: '05', file: '05-bar-accent.html', label: '05 竖条强调' },
  34. { id: '06', file: '06-full-track.html', label: '06 全宽滑轨' },
  35. { id: '07', file: '07-minimal-dot.html', label: '07 极简圆点' }
  36. ]
  37. const links = files
  38. .map((f) => {
  39. const current = f.file === currentFile ? ' is-current' : ''
  40. return `<a href="${f.file}" class="${current.trim()}">${f.label}</a>`
  41. })
  42. .join('')
  43. return `
  44. <header class="demo-banner">
  45. <div>
  46. <h1><span class="demo-badge">${styleName}</span> 质检物料库 · Tab 样式 Demo</h1>
  47. <p>${styleDesc} · 点击下方 Tab 可切换模拟内容</p>
  48. </div>
  49. <div class="demo-banner__actions">
  50. <a href="index.html">← 选型索引</a>
  51. ${links}
  52. </div>
  53. </header>
  54. `
  55. }
  56. function mockContent(tabName) {
  57. const labels = {
  58. list: '物料列表',
  59. usage: '变动记录',
  60. stockCheck: '库存盘点'
  61. }
  62. return `
  63. <div class="mock-content">
  64. <div class="filter-block">
  65. <div class="filter-grid">
  66. <div class="filter-item">
  67. <label>关键词</label>
  68. <div class="fake-input">物料编码/名称</div>
  69. </div>
  70. <div class="filter-item">
  71. <label>状态</label>
  72. <div class="fake-input">全部</div>
  73. </div>
  74. <div class="filter-item">
  75. <label>时间范围</label>
  76. <div class="fake-input">开始日期 — 结束日期</div>
  77. </div>
  78. </div>
  79. </div>
  80. <div class="list-toolbar">
  81. <span class="sel-hint">已选 <strong>0</strong> 项</span>
  82. <button class="btn btn-primary">入库</button>
  83. <button class="btn">批量入库</button>
  84. <button class="btn">导出</button>
  85. </div>
  86. <div class="list-body">
  87. <div class="fake-table">
  88. <div class="fake-table-head">
  89. <span>序号</span><span>入库编号</span><span>物料名称</span><span>批号</span><span>剩余数量</span>
  90. </div>
  91. <div class="fake-table-row">
  92. <span>1</span><span>RK-20260601-001</span><span>DMEM培养基</span><span>BN20260501</span><span>20 瓶</span>
  93. </div>
  94. <div class="fake-table-row">
  95. <span>2</span><span>RK-20260601-002</span><span>胎牛血清</span><span>BN20260415</span><span>6 瓶</span>
  96. </div>
  97. </div>
  98. <p style="margin:12px 0 0;font-size:12px;color:var(--text-muted)">当前 Tab:<strong>${labels[tabName] || tabName}</strong>(示意内容相同,仅 Tab 样式不同)</p>
  99. </div>
  100. </div>
  101. `
  102. }