.html + tests/index.html
# 读 .design_library/aurora-admin/components/index.json 与 frameworks/*.html 派生每组件测试页
# 零依赖、与现有 build-site.ps1 互不影响
# 注:使用 here-string + ascii-safe 转义避免 PS5.1 在 < 而报错
$ErrorActionPreference = 'Stop'
$lib = ".design_library/aurora-admin"
$idx = Get-Content "$lib/components/index.json" -Raw -Encoding UTF8 | ConvertFrom-Json
$catMap = @{}
$catMap['general'] = @('button','buttongroup','tag','card')
$catMap['navigation']= @('tabs','steps','breadcrumb','sidemenu','topmenu','mixednavigation','quicknav','anchornav','enhancedtabnav','dropdown')
$catMap['input'] = @('input','select','cascader','colorpicker','rangequickpicker','numberrangeinput','switchgroup','dragupload','signaturepad','codeinput','passwordinput','phoneinput','bankcardinput','idcardinput','plateinput','autocomplete','mention','transfer','rate','slider','listpicker','radiocard','checkboxcard','segmented')
$catMap['display'] = @('table','treetable','expandabletable','mergedcelltable','summaryrowtable','fixedcolumntable','cardlist','timelinelist','steplist','chartpanel','dashboardcard','calendar','carousel','imagepreview','qrcode','countdown','tree','collapse','watermark','employeecard')
$catMap['feedback'] = @('modal','confirmmodal','alertmodal','formmodal','fullscreenmodal','messagepro','notificationpro','progressvariants','skeletonpro','emptypro','loadingoverlay','resultvariants','exceptionvariants','popconfirm','bottomsheet')
$catMap['system'] = @('themeswitcher','layoutswitcher','densityswitcher','shortcutpanel','backtotop','pagetransition')
$slugCat = @{}
foreach ($ck in $catMap.Keys) { foreach ($s in $catMap[$ck]) { $slugCat[$s] = $ck } }
$catZh = @{ general='通用'; navigation='导航'; input='数据录入'; display='数据展示'; feedback='反馈'; system='工具与系统' }
function Get-Snapshot([string]$prefix) {
$fw = Get-ChildItem "frameworks" -File -Filter ($prefix + ".html") -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $fw) { return '\uff08\u65e0 H5 \u6f14\u793a\u9875\uff09
' }
$raw = Get-Content $fw.FullName -Raw -Encoding UTF8
# 简化:用纯字符串方法抽取 body 块
$startTag = ""
$si = $raw.IndexOf($startTag)
if ($si -lt 0) { return '\uff08\u65e0 body \u5185\u5bb9\uff09
' }
$bodyStart = $raw.IndexOf(">", $si) + 1
$ei = $raw.IndexOf($endTag, $bodyStart)
if ($ei -lt 0) { $ei = $raw.Length }
$body = $raw.Substring($bodyStart, $ei - $bodyStart)
# 移除 script/style 块(极简)
$body = [regex]::Replace($body, "