/* 手机交互语义：图标只表达操作类型，短文字保留可读名称；不参与业务事件与权限判断。 */
.mobile-only-label,.mobile-only-entry{display:none}
.desktop-only-label{display:inline}
[data-ui-icon][hidden],.mobile-only-entry[hidden]{display:none!important}
@media(max-width:900px),(pointer:coarse) and (max-width:1400px){
  [data-ui-icon]{--action-icon:var(--icon-list)}
  [data-ui-icon]::before{content:"";display:inline-block;flex:0 0 20px;width:20px;height:20px;background:currentColor;mask:var(--action-icon) center/contain no-repeat;-webkit-mask:var(--action-icon) center/contain no-repeat;vertical-align:middle;margin-right:6px;pointer-events:none}
  button[data-ui-icon],a[data-ui-icon]{display:inline-flex;align-items:center;justify-content:center;gap:0;min-height:44px;min-width:44px;line-height:1.4;box-sizing:border-box}
  [data-ui-nav="page"]::after{content:"";width:7px;height:7px;border-top:1.5px solid currentColor;border-right:1.5px solid currentColor;transform:rotate(45deg);margin-left:auto;flex-shrink:0;opacity:.65}
  [data-ui-nav="expand"]::after{content:"";width:7px;height:7px;border-bottom:1.5px solid currentColor;border-right:1.5px solid currentColor;transform:rotate(45deg);margin-left:auto;flex-shrink:0}
  [data-ui-nav="expand"][aria-expanded="true"]::after{transform:rotate(225deg)}
  button:active:not(:disabled),a[data-ui-icon]:active{filter:brightness(.94)}
  button:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--ui-primary,#2d63e8);outline-offset:2px}
  button:disabled{cursor:default;box-shadow:none}
  .mobile-disabled-reason,.interaction-reason{font-size:12px;line-height:1.5;color:var(--ui-muted,#697792);overflow-wrap:anywhere;margin:4px 0}
  .mobile-only-label{display:inline}
  .desktop-only-label{display:none}
  .mobile-only-entry{display:inline-flex}
  /* 图标与状态不可仅靠颜色区分；只读字段不套用操作控件的按压效果。 */
  .readonly-caption{font-size:12px;color:var(--ui-muted,#697792)}
}
@media(prefers-reduced-motion:reduce){button[data-ui-icon]{transition:none;animation:none}}

/* 单色线性图标使用 CSS mask，动态更新按钮文字不会丢失图标。 */
:root{
--icon-list:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%204h14v16H5z%20M8%208h8M8%2012h8M8%2016h5%22%2F%3E%3C%2Fsvg%3E");
--icon-settings:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%207h16M4%2017h16M8%204v6M16%2014v6%22%2F%3E%3C%2Fsvg%3E");
--icon-users:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M16%2021v-2a4%204%200%200%200-4-4H6a4%204%200%200%200-4%204v2M17%203a4%204%200%200%201%200%208M22%2021v-2a4%204%200%200%200-3-3.87%22%2F%3E%3Ccircle%20cx%3D%229%22%20cy%3D%227%22%20r%3D%224%22%2F%3E%3C%2Fsvg%3E");
--icon-edit:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m16%203%205%205-12%2012H4v-5zM14%205l5%205%22%2F%3E%3C%2Fsvg%3E");
--icon-archive:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%204h18v4H3zM5%208v12h14V8M9%2012h6%22%2F%3E%3C%2Fsvg%3E");
--icon-restore:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%2010a8%208%200%201%201%201%209M4%204v6h6%22%2F%3E%3C%2Fsvg%3E");
--icon-save:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%203h12l4%204v14H3V3zM7%203v6h10V3M7%2021v-8h10v8%22%2F%3E%3C%2Fsvg%3E");
--icon-add:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%204v16M4%2012h16%22%2F%3E%3C%2Fsvg%3E");
--icon-download:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%203v12m-5-5%205%205%205-5M4%2016v5h16v-5%22%2F%3E%3C%2Fsvg%3E");
--icon-copy:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M8%208h13v13H8zM16%208V3H3v13h5%22%2F%3E%3C%2Fsvg%3E");
--icon-check:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m4%2012%205%205L20%206%22%2F%3E%3C%2Fsvg%3E");
--icon-close:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m6%206%2012%2012M18%206%206%2018%22%2F%3E%3C%2Fsvg%3E");
--icon-back:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m14%205-7%207%207%207M7%2012h14%22%2F%3E%3C%2Fsvg%3E");
--icon-menu:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%206h16M4%2012h16M4%2018h16%22%2F%3E%3C%2Fsvg%3E");
--icon-filter:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%204h16l-6%208v7l-4%202v-9z%22%2F%3E%3C%2Fsvg%3E");
--icon-calendar:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%205h16v16H4zM8%202v6M16%202v6M4%2010h16%22%2F%3E%3C%2Fsvg%3E");
--icon-table:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%204h18v16H3zM3%2010h18M10%204v16%22%2F%3E%3C%2Fsvg%3E");
--icon-refresh:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M20%205v6h-6M4%2019v-6h6M5%208a8%208%200%200%201%2013-3l2%203M4%2016l2%203a8%208%200%200%200%2013-3%22%2F%3E%3C%2Fsvg%3E");
--icon-logout:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%204H4v16h6M10%2012h11m-5-5%205%205-5%205%22%2F%3E%3C%2Fsvg%3E");
--icon-home:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m3%2010%209-7%209%207M5%209v12h5v-7h4v7h5V9%22%2F%3E%3C%2Fsvg%3E");
--icon-model:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m12%202%209%205v10l-9%205-9-5V7zM3%207l9%205%209-5M12%2012v10%22%2F%3E%3C%2Fsvg%3E");
--icon-api:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m8%205-6%207%206%207M16%205l6%207-6%207M14%203l-4%2018%22%2F%3E%3C%2Fsvg%3E");
--icon-send:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22m3%203%2019%209-19%209%204-9zM7%2012h15%22%2F%3E%3C%2Fsvg%3E");
--icon-more:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%2012h1m6%200h1m6%200h1%22%2F%3E%3C%2Fsvg%3E");
--icon-trash:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%206h18M5%206l1%2015h12l1-15M9%206V3h6v3M9%2010v7M15%2010v7%22%2F%3E%3C%2Fsvg%3E");
--icon-photo:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%204h18v16H3zM3%2016l5-5%205%205%203-3%205%205%22%2F%3E%3C%2Fsvg%3E");
--icon-branch:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%203v14h14M5%208h14M15%204l4%204-4%204M15%2013l4%204-4%204%22%2F%3E%3C%2Fsvg%3E");
--icon-clock:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.7%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%203a9%209%200%201%200%200%2018%209%209%200%200%200%200-18M12%207v5l3%202%22%2F%3E%3C%2Fsvg%3E");
}
[data-ui-icon="list"]{--action-icon:var(--icon-list)}
[data-ui-icon="settings"]{--action-icon:var(--icon-settings)}
[data-ui-icon="users"]{--action-icon:var(--icon-users)}
[data-ui-icon="edit"]{--action-icon:var(--icon-edit)}
[data-ui-icon="archive"]{--action-icon:var(--icon-archive)}
[data-ui-icon="restore"]{--action-icon:var(--icon-restore)}
[data-ui-icon="save"]{--action-icon:var(--icon-save)}
[data-ui-icon="add"]{--action-icon:var(--icon-add)}
[data-ui-icon="download"]{--action-icon:var(--icon-download)}
[data-ui-icon="copy"]{--action-icon:var(--icon-copy)}
[data-ui-icon="check"]{--action-icon:var(--icon-check)}
[data-ui-icon="close"]{--action-icon:var(--icon-close)}
[data-ui-icon="back"]{--action-icon:var(--icon-back)}
[data-ui-icon="menu"]{--action-icon:var(--icon-menu)}
[data-ui-icon="filter"]{--action-icon:var(--icon-filter)}
[data-ui-icon="calendar"]{--action-icon:var(--icon-calendar)}
[data-ui-icon="table"]{--action-icon:var(--icon-table)}
[data-ui-icon="refresh"]{--action-icon:var(--icon-refresh)}
[data-ui-icon="logout"]{--action-icon:var(--icon-logout)}
[data-ui-icon="home"]{--action-icon:var(--icon-home)}
[data-ui-icon="model"]{--action-icon:var(--icon-model)}
[data-ui-icon="api"]{--action-icon:var(--icon-api)}
[data-ui-icon="send"]{--action-icon:var(--icon-send)}
[data-ui-icon="more"]{--action-icon:var(--icon-more)}
[data-ui-icon="trash"]{--action-icon:var(--icon-trash)}
[data-ui-icon="photo"]{--action-icon:var(--icon-photo)}
[data-ui-icon="branch"]{--action-icon:var(--icon-branch)}
[data-ui-icon="clock"]{--action-icon:var(--icon-clock)}
