/*!
 * ltmdui.css 1.0.0 —— 蓝天 UI 扩展合集（MDUI 1.0.2 之上）
 * 需在 mdui.css 之后引入；不修改 mdui 原有任何代码
 *
 * 本文件由以下样式按顺序合并而成：
 *   feedback（提示 / 通知）  popover（气泡）  chooser（选择框）  date-picker（日期选择框）
 *   terminal（终端，ANSI 颜色解析）  loading（加载指示 / 顶部进度条）  dropdown（下拉菜单）
 */

/* ============================== 1/7  feedback.css  ============================== */
/*!
 * mdui-feedback 1.0.0 (提示信息 message / 通知信息 notification)
 * 基于 mdui 1.0.2 的扩展反馈组件，需在 mdui.css 之后引入
 * 不修改、不覆盖 mdui 原有任何样式，所有类名均为新增命名空间
 */

/**
 * =============================================================================
 * ************   容器   ************
 * =============================================================================
 * 容器 pointer-events 为 none，避免遮挡页面点击；单条消息恢复为 auto
 */
.mdui-message-container {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 8000;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
  flex-direction: column;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center;
  padding: 16px 16px 0;
  pointer-events: none;
}

.mdui-notification-container {
  position: fixed;
  z-index: 8000;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
  flex-direction: column;
  pointer-events: none;
}
.mdui-notification-container-right-top {
  top: 16px;
  right: 16px;
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
  align-items: flex-end;
}
.mdui-notification-container-right-bottom {
  right: 16px;
  bottom: 16px;
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
  align-items: flex-end;
}
.mdui-notification-container-left-top {
  top: 16px;
  left: 16px;
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
  align-items: flex-start;
}
.mdui-notification-container-left-bottom {
  bottom: 16px;
  left: 16px;
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
  align-items: flex-start;
}

/**
 * =============================================================================
 * ************   消息本体（初始为隐藏态，由 JS 添加 shown 类入场）   ************
 * =============================================================================
 * 高度/外边距参与过渡，用于关闭时收起高度，使下方的消息平滑上移顶替
 */
.mdui-message,
.mdui-notification {
  position: relative;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  pointer-events: auto;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
  align-items: center;
  margin-bottom: 12px;
  padding: 10px 16px;
  font-size: 14px;
  line-height: 20px;
  color: #ffffff;
  background-color: #323232;
  border: 1px solid transparent;
  border-radius: 4px;
  -webkit-box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
  box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
  opacity: 0;
  -webkit-transition: -webkit-transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
                      opacity 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
                      height 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
                      margin-bottom 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
                      padding 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
                      border-width 300ms cubic-bezier(0.25, 0.8, 0.25, 1);
  transition: transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
              opacity 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
              height 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
              margin-bottom 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
              padding 300ms cubic-bezier(0.25, 0.8, 0.25, 1),
              border-width 300ms cubic-bezier(0.25, 0.8, 0.25, 1);
}

/* 提示信息：从顶部上方滑入 */
.mdui-message {
  max-width: 568px;
  -webkit-transform: translateY(-100%);
  transform: translateY(-100%);
}

/* 通知信息：右侧从屏幕外向左滑入，左侧从屏幕外向右滑入 */
.mdui-notification {
  width: 320px;
  max-width: calc(100vw - 32px);
  -webkit-transform: translateX(110%);
  transform: translateX(110%);
}
.mdui-notification-container-left-top .mdui-notification,
.mdui-notification-container-left-bottom .mdui-notification {
  -webkit-transform: translateX(-110%);
  transform: translateX(-110%);
}

/* 入场完成状态 */
.mdui-message-shown {
  opacity: 1 !important;
  -webkit-transform: translateY(0) !important;
  transform: translateY(0) !important;
}
.mdui-notification-shown {
  opacity: 1 !important;
  -webkit-transform: translateX(0) !important;
  transform: translateX(0) !important;
}

/* 关闭状态：向上滑出并淡出（逐渐消失）；高度由 JS 锁定后过渡到 0，其余消息平滑顶替 */
.mdui-message-closing,
.mdui-notification-closing {
  opacity: 0 !important;
  -webkit-transform: translateY(-100%) !important;
  transform: translateY(-100%) !important;
  padding: 0 !important;
  margin-bottom: 0 !important;
  border-width: 0 !important;
  -webkit-box-shadow: none !important;
  box-shadow: none !important;
  overflow: hidden;
  pointer-events: none;
}

/* 图标 */
.mdui-message-icon,
.mdui-notification-icon {
  -webkit-flex-shrink: 0;
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  margin-right: 12px;
  font-size: 24px;
  line-height: 24px;
  text-align: center;
  /* 跟随提示框自身的文字色（由全局自适应按背景深浅算出来） */
  color: inherit;
}

/* 文本 */
.mdui-message-text {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1;
  min-width: 0;
  word-break: break-word;
}
.mdui-notification-content {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
  flex: 1;
  min-width: 0;
  word-break: break-word;
}
.mdui-notification-title {
  margin-bottom: 2px;
  font-size: 15px;
  font-weight: 500;
  line-height: 20px;
}
.mdui-notification-message {
  font-size: 13px;
  line-height: 18px;
  opacity: 0.75;
}

/* 小屏时提示信息占满一行 */
@media (max-width: 600px) {
  .mdui-message {
    max-width: none;
    width: 100%;
  }
}

/**
 * =============================================================================
 * ************   语义色（默认态：彩色背景 + 白色图标和文字）   ************
 * =============================================================================
 */
.mdui-message-info,
.mdui-notification-info {
  background-color: #2196F3;
}
.mdui-message-success,
.mdui-notification-success {
  background-color: #4CAF50;
}
.mdui-message-warning,
.mdui-notification-warning {
  background-color: #FF9800;
}
.mdui-message-danger,
.mdui-notification-danger {
  background-color: #F44336;
}

/**
 * =============================================================================
 * ************   default 类型跟随 MDUI 主题色   ************
 * =============================================================================
 * 需要在 body 或祖先元素上设置 mdui-theme-primary-{color}，未设置时保持深灰色
 */
/* 深色背景主题（白色文字与图标） */
.mdui-theme-primary-blue-grey .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-blue-grey .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #607D8B !important;
}
.mdui-theme-primary-brown .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-brown .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #795548 !important;
}
.mdui-theme-primary-deep-purple .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-deep-purple .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #673AB7 !important;
}
.mdui-theme-primary-indigo .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-indigo .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #3F51B5 !important;
}
.mdui-theme-primary-pink .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-pink .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #E91E63 !important;
}
.mdui-theme-primary-purple .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-purple .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #9C27B0 !important;
}
.mdui-theme-primary-red .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-red .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #F44336 !important;
}
.mdui-theme-primary-teal .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-teal .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #009688 !important;
}

/* 浅色背景主题只负责背景色；文字色与图标色交给全局自适应
   （js/text-auto-color.js 按实际背景深浅算黑 / 白，图标 color: inherit 跟随提示框） */
.mdui-theme-primary-amber .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-amber .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #FFC107 !important;
}
.mdui-theme-primary-blue .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-blue .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #2196F3 !important;
}
.mdui-theme-primary-cyan .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-cyan .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #00BCD4 !important;
}
.mdui-theme-primary-deep-orange .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-deep-orange .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #FF5722 !important;
}
.mdui-theme-primary-green .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-green .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #4CAF50 !important;
}
.mdui-theme-primary-grey .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-grey .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #9E9E9E !important;
}
.mdui-theme-primary-light-blue .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-light-blue .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #03A9F4 !important;
}
.mdui-theme-primary-light-green .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-light-green .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #8BC34A !important;
}
.mdui-theme-primary-lime .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-lime .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #CDDC39 !important;
}
.mdui-theme-primary-orange .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-orange .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #FF9800 !important;
}
.mdui-theme-primary-yellow .mdui-message-default:not(.mdui-message-pale),
.mdui-theme-primary-yellow .mdui-notification-default:not(.mdui-notification-pale) {
  background-color: #FFEB3B !important;
}

/**
 * =============================================================================
 * ************   pale 变体（白色背景 + 深色文字 + 图标跟随类型颜色）   ************
 * =============================================================================
 */
.mdui-message-pale,
.mdui-notification-pale {
  color: rgba(0, 0, 0, 0.87) !important;
  background-color: #ffffff !important;
  border-color: rgba(0, 0, 0, 0.08);
  -webkit-box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.1), 0 6px 10px 0 rgba(0, 0, 0, 0.07), 0 1px 18px 0 rgba(0, 0, 0, 0.06);
  box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.1), 0 6px 10px 0 rgba(0, 0, 0, 0.07), 0 1px 18px 0 rgba(0, 0, 0, 0.06);
}

/* pale 变体的图标颜色：info / success / warning / danger */
.mdui-message-pale.mdui-message-info .mdui-message-icon,
.mdui-notification-pale.mdui-notification-info .mdui-notification-icon {
  color: #2196F3;
}
.mdui-message-pale.mdui-message-success .mdui-message-icon,
.mdui-notification-pale.mdui-notification-success .mdui-notification-icon {
  color: #4CAF50;
}
.mdui-message-pale.mdui-message-warning .mdui-message-icon,
.mdui-notification-pale.mdui-notification-warning .mdui-notification-icon {
  color: #FF9800;
}
.mdui-message-pale.mdui-message-danger .mdui-message-icon,
.mdui-notification-pale.mdui-notification-danger .mdui-notification-icon {
  color: #F44336;
}

/* pale 变体的 default 类型：图标跟随 MDUI 主题色 */
.mdui-theme-primary-amber .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-amber .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #FFC107;
}
.mdui-theme-primary-blue .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-blue .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #2196F3;
}
.mdui-theme-primary-blue-grey .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-blue-grey .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #607D8B;
}
.mdui-theme-primary-brown .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-brown .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #795548;
}
.mdui-theme-primary-cyan .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-cyan .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #00BCD4;
}
.mdui-theme-primary-deep-orange .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-deep-orange .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #FF5722;
}
.mdui-theme-primary-deep-purple .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-deep-purple .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #673AB7;
}
.mdui-theme-primary-green .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-green .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #4CAF50;
}
.mdui-theme-primary-grey .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-grey .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #9E9E9E;
}
.mdui-theme-primary-indigo .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-indigo .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #3F51B5;
}
.mdui-theme-primary-light-blue .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-light-blue .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #03A9F4;
}
.mdui-theme-primary-light-green .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-light-green .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #8BC34A;
}
.mdui-theme-primary-lime .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-lime .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #CDDC39;
}
.mdui-theme-primary-orange .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-orange .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #FF9800;
}
.mdui-theme-primary-pink .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-pink .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #E91E63;
}
.mdui-theme-primary-purple .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-purple .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #9C27B0;
}
.mdui-theme-primary-red .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-red .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #F44336;
}
.mdui-theme-primary-teal .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-teal .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #009688;
}
.mdui-theme-primary-yellow .mdui-message-pale.mdui-message-default .mdui-message-icon,
.mdui-theme-primary-yellow .mdui-notification-pale.mdui-notification-default .mdui-notification-icon {
  color: #FFEB3B;
}

/* ============================== 2/7  popover.css  ============================== */
/*!
 * mdui-popover-ext 1.0.0 样式（弹出气泡组件）
 * 需与 js/popover.js 配合使用，不修改 mdui 原有任何样式
 * 气泡的定位、箭头位置、动画均由 JS 计算；本文件只负责外观
 */
.mdui-popover {
  position: fixed;
  z-index: 2500;
  display: none;
  box-sizing: border-box;
  min-width: 120px;
  max-width: 280px;
  padding: 14px 16px;
  background-color: #ffffff;
  border-radius: 4px;
  color: rgba(0, 0, 0, 0.87);
  font-size: 14px;
  line-height: 20px;
  box-shadow:
    0 5px 5px -3px rgba(0, 0, 0, 0.2),
    0 8px 10px 1px rgba(0, 0, 0, 0.14),
    0 3px 14px 2px rgba(0, 0, 0, 0.12);
}

.mdui-popover-title {
  margin: 0 0 8px;
  font-size: 16px;
  font-weight: 500;
  line-height: 24px;
}

.mdui-popover-title + .mdui-popover-content {
  margin-top: 0;
}

.mdui-popover-content p {
  margin: 0 0 8px;
}

.mdui-popover-content p:last-child {
  margin-bottom: 0;
}

/* 倒三角：实心边框三角形，具体朝向与坐标由 JS 设置 */
.mdui-popover-arrow {
  position: absolute;
  width: 0;
  height: 0;
  border: 6px solid transparent;
  pointer-events: none;
}

/* 动作按钮区（确认 / 取消），仅当传入 actions 选项时生成 */
.mdui-popover-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  margin: 10px -16px -14px;
  padding: 4px 8px 4px 12px;
  border-top: 1px solid rgba(0, 0, 0, 0.08);
}

.mdui-popover-actions .mdui-btn {
  min-width: 64px;
  margin: 0;
}

/* ============================== 3/7  chooser.css  ============================== */
/*!
 * mdui-chooser-ext 1.0.0 样式（选择框组件）
 * 需与 js/chooser.js 配合使用，不修改 mdui 原有任何样式
 * 定位、展开/收起动画由 JS 通过内联样式驱动；本文件只负责外观
 *
 * 主题色通过 CSS 变量 --mdui-chooser-accent 控制，可在页面里覆盖：
 *   .mdui-chooser, .mdui-chooser-panel { --mdui-chooser-accent: #1E96D8; }
 */

/* 触发框与面板共用的主题色变量（面板被挂到 body 下，需单独声明） */
.mdui-chooser,
.mdui-chooser-panel {
  --mdui-chooser-accent: #1E96D8;
}

/* ============ 触发框 ============ */
.mdui-chooser {
  position: relative;
  display: inline-flex;
  align-items: center;
  box-sizing: border-box;
  min-width: 120px;
  max-width: 320px;
  min-height: 36px;
  padding: 6px 32px 6px 12px;
  font-size: 14px;
  line-height: 20px;
  color: rgba(0, 0, 0, 0.87);
  background-color: #ffffff;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-radius: 4px;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  outline: none;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.mdui-chooser:hover {
  border-color: rgba(0, 0, 0, 0.3);
}

.mdui-chooser:focus,
.mdui-chooser-open {
  border-color: var(--mdui-chooser-accent);
}

.mdui-chooser-open {
  box-shadow: 0 0 0 2px rgba(30, 150, 216, 0.12);
}

.mdui-chooser-disabled {
  color: rgba(0, 0, 0, 0.3);
  background-color: rgba(0, 0, 0, 0.04);
  cursor: not-allowed;
}

/* 触发框内显示的当前选中内容（支持 HTML，如国旗） */
.mdui-chooser-value {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 6px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mdui-chooser-placeholder {
  color: rgba(0, 0, 0, 0.38);
}

/* 可编辑模式：触发框本身就是输入框 */
.mdui-chooser-editable {
  cursor: text;
}

.mdui-chooser-input {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
  padding: 0;
  margin: 0;
  font: inherit;
  color: inherit;
  background: transparent;
  border: 0;
  outline: none;
  cursor: text;
}

.mdui-chooser-input::placeholder {
  color: rgba(0, 0, 0, 0.38);
}

.mdui-chooser-input:disabled {
  cursor: not-allowed;
}

/* 倒三角：展开时旋转 180°，用来指示当前是展开还是收起 */
.mdui-chooser-caret {
  position: absolute;
  right: 12px;
  top: 50%;
  width: 0;
  height: 0;
  margin-top: -3px;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-top: 6px solid rgba(0, 0, 0, 0.54);
  transition: transform 0.25s ease;
  pointer-events: none;
}

.mdui-chooser-open .mdui-chooser-caret {
  transform: rotate(180deg);
}

/* ============ 下拉面板 ============ */
.mdui-chooser-panel {
  position: fixed;
  z-index: 2600;
  box-sizing: border-box;
  min-width: 120px;
  max-width: 360px;
  background-color: #ffffff;
  border-radius: 4px;
  box-shadow:
    0 5px 5px -3px rgba(0, 0, 0, 0.2),
    0 8px 10px 1px rgba(0, 0, 0, 0.14),
    0 3px 14px 2px rgba(0, 0, 0, 0.12);
  overflow: hidden;
  /* 展开 / 收起动画：从贴着触发框的那个角缩放（原点由 JS 按上翻 / 下展动态写入） */
  transform-origin: 0 0;
  transform: scale(0.25);
  opacity: 0;
  transition:
    transform 0.24s cubic-bezier(0.4, 0, 0.2, 1),
    opacity 0.24s ease;
  will-change: transform, opacity;
}

/* 静态搜索框 */
.mdui-chooser-search {
  padding: 8px 10px 6px;
}

.mdui-chooser-search-input {
  width: 100%;
  box-sizing: border-box;
  height: 32px;
  padding: 0 10px;
  font-size: 14px;
  color: inherit;
  background-color: #ffffff;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-radius: 4px;
  outline: none;
}

.mdui-chooser-search-input:focus {
  border-color: var(--mdui-chooser-accent);
}

/* 选项列表（可滚动） */
.mdui-chooser-list {
  position: relative;
  max-height: 256px;
  overflow-y: auto;
  padding: 6px 0;
}

/* 选项组标题：不参与选择，仅作分组罗列 */
.mdui-chooser-group-title {
  padding: 8px 14px 4px;
  font-size: 12px;
  line-height: 16px;
  color: rgba(0, 0, 0, 0.54);
  cursor: default;
}

/* 选项行：左侧内容 + 右侧附加信息（如区号） */
.mdui-chooser-option {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: 40px;
  box-sizing: border-box;
  padding: 0 34px 0 14px;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color 0.15s ease;
}

/* 关闭对勾时右侧不预留空间 */
.mdui-chooser-no-tick .mdui-chooser-option {
  padding-right: 14px;
}

.mdui-chooser-option:hover {
  background-color: rgba(0, 0, 0, 0.06);
}

.mdui-chooser-option-left {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 8px;
  overflow: hidden;
  text-overflow: ellipsis;
}

.mdui-chooser-option-right {
  flex: 0 0 auto;
  margin-left: auto;
  color: rgba(0, 0, 0, 0.54);
  font-size: 13px;
}

.mdui-chooser-option-selected {
  color: var(--mdui-chooser-accent);
  font-weight: 500;
}

.mdui-chooser-option-selected .mdui-chooser-option-right {
  color: inherit;
}

.mdui-chooser-option-disabled {
  color: rgba(0, 0, 0, 0.3);
  cursor: not-allowed;
}

.mdui-chooser-option-disabled:hover {
  background-color: transparent;
}

/* 选中态对勾（使用 mdui 自带的 material-icons 字体） */
.mdui-chooser-tick {
  position: absolute;
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 18px;
  line-height: 1;
  color: var(--mdui-chooser-accent);
  visibility: hidden;
}

.mdui-chooser-option-selected .mdui-chooser-tick {
  visibility: visible;
}

/* 无匹配结果时的占位提示 */
.mdui-chooser-empty {
  display: none;
  padding: 16px;
  text-align: center;
  font-size: 13px;
  color: rgba(0, 0, 0, 0.38);
}

/* ============================== 4/7  date-picker.css  ============================== */
/*!
 * mdui-date-picker-ext 1.0.0 样式（日期选择框组件）
 * 需与 js/date-picker.js 配合使用，不修改 mdui 原有任何样式
 * 定位与展开 / 收起动画由 JS 通过内联样式驱动；本文件只负责外观
 *
 * 主题色通过 CSS 变量 --mdui-dp-accent 控制，可在页面里覆盖：
 *   .mdui-dp, .mdui-dp-panel { --mdui-dp-accent: #1E96D8; }
 */

/* 触发框与面板共用的主题色变量（面板被挂到 body 下，需单独声明） */
.mdui-dp,
.mdui-dp-panel {
  --mdui-dp-accent: #1E96D8;
}

/* ============ 触发框 ============ */

.mdui-dp {
  position: relative;
  display: inline-flex;
  align-items: center;
  box-sizing: border-box;
  min-width: 160px;
  max-width: 320px;
  min-height: 36px;
  padding: 6px 56px 6px 12px;
  font-size: 14px;
  line-height: 20px;
  color: rgba(0, 0, 0, 0.87);
  background-color: #ffffff;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-radius: 4px;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  outline: none;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

/* 无清空按钮时右侧只留给倒三角 */
.mdui-dp-no-clear {
  padding-right: 32px;
}

.mdui-dp:hover {
  border-color: rgba(0, 0, 0, 0.3);
}

.mdui-dp:focus,
.mdui-dp-open {
  border-color: var(--mdui-dp-accent);
}

.mdui-dp-open {
  box-shadow: 0 0 0 2px rgba(30, 150, 216, 0.12);
}

.mdui-dp-disabled {
  color: rgba(0, 0, 0, 0.3);
  background-color: rgba(0, 0, 0, 0.04);
  cursor: not-allowed;
}

/* 触发框里显示的当前日期（renderSelected 可返回 HTML） */
.mdui-dp-value {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 6px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mdui-dp-placeholder {
  color: rgba(0, 0, 0, 0.38);
}

/* 清空按钮：有值时出现 */
.mdui-dp-clear {
  position: absolute;
  right: 28px;
  top: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  margin-top: -9px;
  font-size: 16px;
  font-style: normal;
  line-height: 1;
  color: rgba(0, 0, 0, 0.38);
  border-radius: 50%;
  visibility: hidden;
  cursor: pointer;
}

.mdui-dp-clear-show {
  visibility: visible;
}

.mdui-dp-clear:hover {
  color: rgba(0, 0, 0, 0.66);
}

/* 倒三角：展开时旋转 180°，用于指示伸缩状态 */
.mdui-dp-caret {
  position: absolute;
  right: 12px;
  top: 50%;
  width: 0;
  height: 0;
  margin-top: -3px;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-top: 6px solid rgba(0, 0, 0, 0.54);
  transition: transform 0.25s ease;
  pointer-events: none;
}

.mdui-dp-open .mdui-dp-caret {
  transform: rotate(180deg);
}

/* ============ 下拉面板 ============ */

.mdui-dp-panel {
  position: fixed;
  z-index: 2600;
  box-sizing: border-box;
  width: 280px;
  padding: 8px;
  background-color: #ffffff;
  border-radius: 4px;
  box-shadow:
    0 5px 5px -3px rgba(0, 0, 0, 0.2),
    0 8px 10px 1px rgba(0, 0, 0, 0.14),
    0 3px 14px 2px rgba(0, 0, 0, 0.12);
  /* 裁剪网格滑入动画的横向溢出，让内容看起来是在面板内滑入 */
  overflow: hidden;
  /* 展开 / 收起动画：从贴着触发框的那个角缩放（原点由 JS 按上翻 / 下展动态写入） */
  transform-origin: 0 0;
  transform: scale(0.25);
  opacity: 0;
  transition:
    transform 0.24s cubic-bezier(0.4, 0, 0.2, 1),
    opacity 0.24s ease;
  will-change: transform, opacity;
}

/* 节日 / 调休模式下单元格略高，容纳「日期 + 角标」两行 */
.mdui-dp-holiday-mode .mdui-dp-cell {
  height: 40px;
}

/* 面板顶部：上一页 / 标题 / 下一页 */
.mdui-dp-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 2px 2px 6px;
}

.mdui-dp-nav {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0 0 4px;
  font-family: inherit;
  font-size: 22px;
  line-height: 1;
  color: rgba(0, 0, 0, 0.54);
  background: transparent;
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  outline: none;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.mdui-dp-nav:hover {
  background-color: rgba(0, 0, 0, 0.06);
  color: rgba(0, 0, 0, 0.87);
}

/* 标题即视图切换按钮：日 → 月 → 年 → 日 */
.mdui-dp-title {
  flex: 1 1 auto;
  height: 32px;
  margin: 0 4px;
  padding: 0 8px;
  font-family: inherit;
  font-size: 14px;
  font-weight: 500;
  color: rgba(0, 0, 0, 0.87);
  background: transparent;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
  outline: none;
  transition: background-color 0.15s ease;
}

.mdui-dp-title:hover {
  background-color: rgba(0, 0, 0, 0.06);
}

/* 星期表头：列宽与日期网格一一对应 */
.mdui-dp-weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
  margin-bottom: 4px;
}

.mdui-dp-weekdays span {
  font-size: 12px;
  line-height: 28px;
  text-align: center;
  color: rgba(0, 0, 0, 0.54);
}

/* 日期网格：7 列 6 行 */
.mdui-dp-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}

/* 月份 / 年份视图：3 列 4 行 */
.mdui-dp-grid-wide {
  grid-template-columns: repeat(3, 1fr);
}

.mdui-dp-grid-wide .mdui-dp-cell {
  height: 44px;
}

/* ============ 网格入场动画（类名由 JS 在重绘后临时挂上） ============ */

/* 下一月 / 下一年：内容从右侧滑入 */
@keyframes mdui-dp-grid-in-next {
  from {
    opacity: 0;
    transform: translateX(14px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

/* 上一月 / 上一年：内容从左侧滑入 */
@keyframes mdui-dp-grid-in-prev {
  from {
    opacity: 0;
    transform: translateX(-14px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

/* 切换视图（日期 / 月份 / 年份）、定位到某月：淡入 */
@keyframes mdui-dp-grid-in-fade {
  from {
    opacity: 0;
    transform: scale(0.94);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.mdui-dp-grid-next {
  animation: mdui-dp-grid-in-next 0.22s cubic-bezier(0.4, 0, 0.2, 1);
}

.mdui-dp-grid-prev {
  animation: mdui-dp-grid-in-prev 0.22s cubic-bezier(0.4, 0, 0.2, 1);
}

.mdui-dp-grid-fade {
  animation: mdui-dp-grid-in-fade 0.22s cubic-bezier(0.4, 0, 0.2, 1);
}

/* 单元格：可承载 HTML（renderCell 返回的内容） */
.mdui-dp-cell {
  position: relative;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 34px;
  padding: 0;
  font-family: inherit;
  font-size: 13px;
  color: rgba(0, 0, 0, 0.87);
  background: transparent;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
  outline: none;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.mdui-dp-cell:hover {
  background-color: rgba(0, 0, 0, 0.06);
}

/* 非本月的补位日期 */
.mdui-dp-other {
  color: rgba(0, 0, 0, 0.32);
}

/* 今天：文字用主题色标记 */
.mdui-dp-today {
  color: var(--mdui-dp-accent);
  font-weight: 600;
}

/* 当前选中：实心主题色（文字色交给全局自适应按主题色深浅算黑 / 白） */
.mdui-dp-selected,
.mdui-dp-selected:hover {
  background-color: var(--mdui-dp-accent);
}

/* 不可选（超出 min/max 或被 disabledDate 拦截） */
.mdui-dp-disabled,
.mdui-dp-disabled:hover {
  color: rgba(0, 0, 0, 0.26);
  background-color: transparent;
  cursor: not-allowed;
}

/* 面板底部：今天 / 清除 */
.mdui-dp-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 6px;
  padding: 6px 2px 0;
  border-top: 1px solid rgba(0, 0, 0, 0.08);
}

.mdui-dp-action {
  height: 28px;
  padding: 0 8px;
  font-family: inherit;
  font-size: 13px;
  color: var(--mdui-dp-accent);
  background: transparent;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
  outline: none;
  transition: background-color 0.15s ease;
}

.mdui-dp-action:hover {
  background-color: rgba(30, 150, 216, 0.1);
}

.mdui-dp-action.mdui-dp-action-muted {
  color: rgba(0, 0, 0, 0.54);
}

.mdui-dp-action.mdui-dp-action-muted:hover {
  background-color: rgba(0, 0, 0, 0.06);
}

/* ============ 可输入模式（editable） ============ */

/* 触发框里换成输入框：外观与原来的文本完全一致 */
.mdui-dp-input {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
  padding: 0;
  font-family: inherit;
  font-size: inherit;
  line-height: 20px;
  color: inherit;
  background: transparent;
  border: 0;
  outline: none;
  cursor: text;
}

.mdui-dp-input::placeholder {
  color: rgba(0, 0, 0, 0.38);
}

/* ============ 节日 / 调休标记 ============ */

/* 日期 + 角标两行居中 */
.mdui-dp-cell-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1px;
  line-height: 1;
}

.mdui-dp-cell-day {
  font-size: 13px;
}

/* 角标：节日名 / “班”字 */
.mdui-dp-cell-tag {
  font-size: 9px;
  line-height: 1;
  white-space: nowrap;
}

/* 放假：角标用红色提示 */
.mdui-dp-holiday .mdui-dp-cell-tag {
  color: #e53935;
}

/* 普通节日（非法定假日）：角标用主题色 */
.mdui-dp-festival .mdui-dp-cell-tag {
  color: var(--mdui-dp-accent);
}

/* 调休上班：角标用中性灰 */
.mdui-dp-workday .mdui-dp-cell-tag {
  color: rgba(0, 0, 0, 0.54);
}

/* 选中态下角标跟随单元格文字色（只降低一点透明度，保持可读） */
.mdui-dp-selected .mdui-dp-cell-tag {
  color: inherit;
  opacity: 0.9;
}

/* ============================== 5/7  terminal.css  ============================== */
/*!
 * mdui-terminal-ext 1.1.0 样式 —— 配合 js/ltmdui.js 的 8/10 终端组件使用
 *
 * 配色全部走 CSS 变量，便于整套换肤：
 *   --mdui-term-bg / --mdui-term-fg        终端底色 / 缺省文字色
 *   --mdui-term-fg0 ~ --mdui-term-fg15     16 色前景（缺省 = xterm 经典调色板）
 *   --mdui-term-bg0 ~ --mdui-term-bg15     16 色背景
 *   --mdui-term-cursor / -select / -scroll 光标、选中、滚动条
 *   --mdui-term-chrome-*                   窗口标题栏
 * 底部三套皮肤（shell-cmd / shell-powershell / shell-ssh）只做一件事：覆盖上面这些变量 + 换字体。
 * 想加自己的皮肤，照抄一段改色值即可，不用碰组件逻辑。
 */

/* ============ 终端容器 ============ */

/* 这一大段变量就是「皮肤」的全部接口：底部三套 shell 皮肤只覆盖这里的值 */
.mdui-terminal {
  --mdui-term-bg: #000000;
  --mdui-term-fg: #e5e5e5;
  --mdui-term-cursor: #e5e5e5;
  --mdui-term-select: rgba(229, 229, 229, 0.3);
  --mdui-term-scroll: rgba(255, 255, 255, 0.2);
  --mdui-term-scroll-hover: rgba(255, 255, 255, 0.35);
  --mdui-term-chrome-bg: #333333;
  --mdui-term-chrome-fg: #d4d4d4;
  --mdui-term-chrome-border: rgba(0, 0, 0, 0.5);
  --mdui-term-radius: 4px;
  /* 16 色 = xterm 经典调色板。反色换算在解析器里按「缺省前景 = fg7」的约定做，改色不改语义 */
  --mdui-term-fg0: #000000;
  --mdui-term-fg1: #cd0000;
  --mdui-term-fg2: #00cd00;
  --mdui-term-fg3: #cdcd00;
  --mdui-term-fg4: #0000ee;
  --mdui-term-fg5: #cd00cd;
  --mdui-term-fg6: #00cdcd;
  --mdui-term-fg7: #e5e5e5;
  --mdui-term-fg8: #7f7f7f;
  --mdui-term-fg9: #ff0000;
  --mdui-term-fg10: #00ff00;
  --mdui-term-fg11: #ffff00;
  --mdui-term-fg12: #5c5cff;
  --mdui-term-fg13: #ff00ff;
  --mdui-term-fg14: #00ffff;
  --mdui-term-fg15: #ffffff;
  --mdui-term-bg0: #000000;
  --mdui-term-bg1: #cd0000;
  --mdui-term-bg2: #00cd00;
  --mdui-term-bg3: #cdcd00;
  --mdui-term-bg4: #0000ee;
  --mdui-term-bg5: #cd00cd;
  --mdui-term-bg6: #00cdcd;
  --mdui-term-bg7: #e5e5e5;
  --mdui-term-bg8: #7f7f7f;
  --mdui-term-bg9: #ff0000;
  --mdui-term-bg10: #00ff00;
  --mdui-term-bg11: #ffff00;
  --mdui-term-bg12: #5c5cff;
  --mdui-term-bg13: #ff00ff;
  --mdui-term-bg14: #00ffff;
  --mdui-term-bg15: #ffffff;

  display: block;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  max-height: 100%;
  padding: 12px 14px;
  overflow-y: auto;
  color: var(--mdui-term-fg);
  background-color: var(--mdui-term-bg);
  border-radius: var(--mdui-term-radius);
  font-family: 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
  font-size: 13px;
  line-height: 1.5;
  text-align: left;
  cursor: text;
  outline: none;
  -webkit-overflow-scrolling: touch;
}

/* 带标题栏时 root 退化成「不滚动的外壳」，滚动交给里面的 .mdui-terminal-screen，
   这样标题栏永远吸在顶部、不会被内容滚走 */
.mdui-terminal-chrome-on {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}

.mdui-terminal-screen {
  flex: 1 1 auto;
  min-height: 0;
  padding: 12px 14px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

/* ---------- 窗口标题栏 ---------- */

.mdui-terminal-chrome {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  box-sizing: border-box;
  height: 30px;
  padding: 0 10px;
  background-color: var(--mdui-term-chrome-bg);
  color: var(--mdui-term-chrome-fg);
  border-bottom: 1px solid var(--mdui-term-chrome-border);
  font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
  font-size: 12px;
  line-height: 1;
  cursor: default;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

/* 状态点：颜色跟着当前服务端 / 皮肤的主色走（由 JS 写 inline background-color） */
.mdui-terminal-chrome-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  margin-right: 8px;
  border-radius: 50%;
}

.mdui-terminal-chrome-title {
  flex: 1 1 auto;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.mdui-terminal-chrome-right {
  flex: 0 0 auto;
  margin-left: 12px;
  opacity: 0.75;
  white-space: nowrap;
}

.mdui-terminal-body {
  /* 隐藏输入层在里面绝对定位，得有个定位父级 */
  position: relative;
  min-width: 0;
}

/* pre-wrap 保住输出里的连续空格与对齐；break-all 防长 token 撑破容器 */
.mdui-terminal-line {
  white-space: pre-wrap;
  word-break: break-all;
  min-height: 1.5em;
}

/* 当前行为空时整行收起（由 JS 挂类）：提示符紧接上一行输出，中间不留空行。
   注意只作用于「未写完的当前行」，输出里真正的空行是独立 .mdui-terminal-line，照旧占位。 */
.mdui-terminal-pending-empty {
  display: none;
}

/* 选中文字：深底上提亮一档 */
.mdui-terminal ::selection {
  background-color: var(--mdui-term-select);
}

/* 滚动条：细条，与终端底色融为一体（外壳与屏幕两层都要管） */
.mdui-terminal::-webkit-scrollbar,
.mdui-terminal-screen::-webkit-scrollbar {
  width: 8px;
}
.mdui-terminal::-webkit-scrollbar-track,
.mdui-terminal-screen::-webkit-scrollbar-track {
  background-color: transparent;
}
.mdui-terminal::-webkit-scrollbar-thumb,
.mdui-terminal-screen::-webkit-scrollbar-thumb {
  background-color: var(--mdui-term-scroll);
  border-radius: 4px;
}
.mdui-terminal::-webkit-scrollbar-thumb:hover,
.mdui-terminal-screen::-webkit-scrollbar-thumb:hover {
  background-color: var(--mdui-term-scroll-hover);
}

/* ============ 隐藏输入代理层 ============ */

/* 终端是自绘输入行的，页面上没有真的输入框，浏览器也就不知道能往哪儿粘贴。
   这一层是贴在输入行上的透明 textarea：Ctrl+V、右键菜单里的「粘贴」、拖拽、输入法
   都先落到它身上，再由 JS 转交给终端的输入行。opacity: 0 不影响它接收编辑操作；
   它只盖住输入行一行，输出区照常可以拖选复制。 */
.mdui-terminal-input-proxy {
  position: absolute;
  left: 0;
  width: 100%;
  margin: 0;
  padding: 0;
  border: 0;
  outline: none;
  resize: none;
  overflow: hidden;
  background-color: transparent;
  color: transparent;
  caret-color: transparent;
  white-space: pre;
  opacity: 0;
  z-index: 1;
}

/* ============ 块状光标 ============ */

/* 光标是一个 1ch 宽的块，盖在光标处的字符前；聚焦时闪烁，失焦时变成描边（xterm 同款） */
.mdui-terminal-cursor {
  display: inline-block;
  width: 1ch;
  height: 1.2em;
  vertical-align: text-bottom;
  background-color: var(--mdui-term-cursor);
  animation: mdui-terminal-cursor-blink 1.1s step-end infinite;
}

/* 焦点可能落在 root 上，也可能落在隐藏输入层上，所以用 :focus-within 一起认 */
.mdui-terminal:not(:focus-within) .mdui-terminal-cursor {
  background-color: transparent;
  box-shadow: inset 0 0 0 1px var(--mdui-term-cursor);
  animation: none;
}

@keyframes mdui-terminal-cursor-blink {
  50% {
    opacity: 0;
  }
}

/* ============ SGR 文字样式 ============ */

.mdui-terminal-bold {
  font-weight: 700;
}
.mdui-terminal-dim {
  opacity: 0.6;
}
.mdui-terminal-italic {
  font-style: italic;
}
.mdui-terminal-underline {
  text-decoration: underline;
}
.mdui-terminal-strike {
  text-decoration: line-through;
}
.mdui-terminal-blink {
  animation: mdui-terminal-text-blink 1s step-end infinite;
}

@keyframes mdui-terminal-text-blink {
  50% {
    opacity: 0.2;
  }
}

/* ============ 16 色（值取自 --mdui-term-fgN / bgN，皮肤一换整块跟着变） ============ */

.mdui-terminal-fg0 { color: var(--mdui-term-fg0); }
.mdui-terminal-fg1 { color: var(--mdui-term-fg1); }
.mdui-terminal-fg2 { color: var(--mdui-term-fg2); }
.mdui-terminal-fg3 { color: var(--mdui-term-fg3); }
.mdui-terminal-fg4 { color: var(--mdui-term-fg4); }
.mdui-terminal-fg5 { color: var(--mdui-term-fg5); }
.mdui-terminal-fg6 { color: var(--mdui-term-fg6); }
.mdui-terminal-fg7 { color: var(--mdui-term-fg7); }
.mdui-terminal-fg8 { color: var(--mdui-term-fg8); }
.mdui-terminal-fg9 { color: var(--mdui-term-fg9); }
.mdui-terminal-fg10 { color: var(--mdui-term-fg10); }
.mdui-terminal-fg11 { color: var(--mdui-term-fg11); }
.mdui-terminal-fg12 { color: var(--mdui-term-fg12); }
.mdui-terminal-fg13 { color: var(--mdui-term-fg13); }
.mdui-terminal-fg14 { color: var(--mdui-term-fg14); }
.mdui-terminal-fg15 { color: var(--mdui-term-fg15); }

.mdui-terminal-bg0 { background-color: var(--mdui-term-bg0); }
.mdui-terminal-bg1 { background-color: var(--mdui-term-bg1); }
.mdui-terminal-bg2 { background-color: var(--mdui-term-bg2); }
.mdui-terminal-bg3 { background-color: var(--mdui-term-bg3); }
.mdui-terminal-bg4 { background-color: var(--mdui-term-bg4); }
.mdui-terminal-bg5 { background-color: var(--mdui-term-bg5); }
.mdui-terminal-bg6 { background-color: var(--mdui-term-bg6); }
.mdui-terminal-bg7 { background-color: var(--mdui-term-bg7); }
.mdui-terminal-bg8 { background-color: var(--mdui-term-bg8); }
.mdui-terminal-bg9 { background-color: var(--mdui-term-bg9); }
.mdui-terminal-bg10 { background-color: var(--mdui-term-bg10); }
.mdui-terminal-bg11 { background-color: var(--mdui-term-bg11); }
.mdui-terminal-bg12 { background-color: var(--mdui-term-bg12); }
.mdui-terminal-bg13 { background-color: var(--mdui-term-bg13); }
.mdui-terminal-bg14 { background-color: var(--mdui-term-bg14); }
.mdui-terminal-bg15 { background-color: var(--mdui-term-bg15); }

/* ============ 皮肤一：Windows 命令提示符（cmd.exe） ============ */
/* Windows 10/11 控制台的 Campbell 配色 + Consolas；cmd 的提示符没颜色，白字直给 */
.mdui-terminal-shell-cmd {
  --mdui-term-bg: #0c0c0c;
  --mdui-term-fg: #cccccc;
  --mdui-term-cursor: #cccccc;
  --mdui-term-select: #264f78;
  --mdui-term-scroll: #464646;
  --mdui-term-scroll-hover: #5a5a5a;
  --mdui-term-chrome-bg: #f0f0f0;
  --mdui-term-chrome-fg: #1f1f1f;
  --mdui-term-chrome-border: #d0d0d0;
  --mdui-term-radius: 0;
  --mdui-term-fg0: #0c0c0c;
  --mdui-term-fg1: #c50f1f;
  --mdui-term-fg2: #13a10e;
  --mdui-term-fg3: #c19c00;
  --mdui-term-fg4: #0037da;
  --mdui-term-fg5: #881798;
  --mdui-term-fg6: #3a96dd;
  --mdui-term-fg7: #cccccc;
  --mdui-term-fg8: #767676;
  --mdui-term-fg9: #e74856;
  --mdui-term-fg10: #16c60c;
  --mdui-term-fg11: #f9f1a5;
  --mdui-term-fg12: #3b78ff;
  --mdui-term-fg13: #b4009e;
  --mdui-term-fg14: #61d6d6;
  --mdui-term-fg15: #f2f2f2;
  /* 背景色只有落在深底上的那几个需要提亮，其余沿用前景同值 */
  --mdui-term-bg0: #0c0c0c;
  --mdui-term-bg1: #c50f1f;
  --mdui-term-bg2: #13a10e;
  --mdui-term-bg3: #c19c00;
  --mdui-term-bg4: #0037da;
  --mdui-term-bg5: #881798;
  --mdui-term-bg6: #3a96dd;
  --mdui-term-bg7: #cccccc;
  --mdui-term-bg8: #767676;
  --mdui-term-bg9: #e74856;
  --mdui-term-bg10: #16c60c;
  --mdui-term-bg11: #f9f1a5;
  --mdui-term-bg12: #3b78ff;
  --mdui-term-bg13: #b4009e;
  --mdui-term-bg14: #61d6d6;
  --mdui-term-bg15: #f2f2f2;
  font-family: Consolas, 'Cascadia Mono', 'Lucida Console', 'Courier New', monospace;
  font-size: 14px;
}

/* ============ 皮肤二：Windows PowerShell（经典蓝底） ============ */
/* 复刻 Windows PowerShell 5.1 控制台的 #012456 蓝底 + PS C:\...> 提示符。
   暗档 8 色做了提亮处理 —— 原版深蓝字压在蓝底上根本看不清，这里优先保证可读性 */
.mdui-terminal-shell-powershell {
  --mdui-term-bg: #012456;
  --mdui-term-fg: #eeedf0;
  --mdui-term-cursor: #eeedf0;
  --mdui-term-select: #2b579a;
  --mdui-term-scroll: rgba(238, 237, 240, 0.25);
  --mdui-term-scroll-hover: rgba(238, 237, 240, 0.45);
  --mdui-term-chrome-bg: #eeedf0;
  --mdui-term-chrome-fg: #1f1f1f;
  --mdui-term-chrome-border: #c8c8c8;
  --mdui-term-radius: 0;
  --mdui-term-fg0: #012456;
  --mdui-term-fg1: #ff5f5f;
  --mdui-term-fg2: #3ddc84;
  --mdui-term-fg3: #f2d45c;
  --mdui-term-fg4: #6fa8ff;
  --mdui-term-fg5: #d36bff;
  --mdui-term-fg6: #5ad4d4;
  --mdui-term-fg7: #eeedf0;
  --mdui-term-fg8: #a8a8b3;
  --mdui-term-fg9: #ff7b72;
  --mdui-term-fg10: #6be36b;
  --mdui-term-fg11: #f9f1a5;
  --mdui-term-fg12: #8ab4ff;
  --mdui-term-fg13: #ef8bff;
  --mdui-term-fg14: #7fe3e3;
  --mdui-term-fg15: #ffffff;
  --mdui-term-bg0: #012456;
  --mdui-term-bg1: #ff5f5f;
  --mdui-term-bg2: #3ddc84;
  --mdui-term-bg3: #f2d45c;
  --mdui-term-bg4: #6fa8ff;
  --mdui-term-bg5: #d36bff;
  --mdui-term-bg6: #5ad4d4;
  --mdui-term-bg7: #eeedf0;
  --mdui-term-bg8: #a8a8b3;
  --mdui-term-bg9: #ff7b72;
  --mdui-term-bg10: #6be36b;
  --mdui-term-bg11: #f9f1a5;
  --mdui-term-bg12: #8ab4ff;
  --mdui-term-bg13: #ef8bff;
  --mdui-term-bg14: #7fe3e3;
  --mdui-term-bg15: #ffffff;
  font-family: Consolas, 'Cascadia Mono', 'Lucida Console', monospace;
  font-size: 14px;
}

/* ============ 皮肤三：Linux SSH ============ */
/* 黑底 + xterm 经典调色板，就是变量区的缺省值 —— 这里只调整窗口标题栏和字体，表明「这是一套皮肤」 */
.mdui-terminal-shell-ssh {
  --mdui-term-chrome-bg: #1f1f22;
  --mdui-term-chrome-fg: #b9b9c0;
  --mdui-term-chrome-border: rgba(255, 255, 255, 0.08);
  font-family: 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  font-size: 13px;
}

/* ============================== 6/7  loading.css  ============================== */
/*!
 * mdui-loading-ext 1.0.0 样式（加载指示组件）
 * 需与 js 里的 ltmdui-loading 模块配合使用，不修改 mdui 原有任何样式
 *
 * ─── 主题色 ───────────────────────────────────────────────────────────────────
 * 遮罩指示器与顶部进度条的颜色统一取 CSS 变量 --mdui-loading-color，默认 #1E96D8。
 * 全局换色在 :root 上覆盖一次即可（全屏 / 区域 / 顶部条都在 body 下游，都能继承到）：
 *     :root { --mdui-loading-color: #4AB1EF; }
 * 单次调用也可用 options.color 覆盖（组件会把值写到根元素的内联变量上）。
 * 唯一的例外是按钮内联加载：它取按钮自身的 currentColor，浅色按钮上是深色圈、
 * 主题色按钮上是白圈，不必也不该被这个变量覆盖。
 *
 * ─── 四套外观 ─────────────────────────────────────────────────────────────────
 *   .mdui-loading            区域遮罩：盖住某个容器（absolute，宿主会被补 position: relative）
 *   .mdui-loading-full       全屏遮罩：盖住整个视口（fixed）
 *   .mdui-loading-btn*       按钮内联加载：不改变按钮尺寸，指示器跟随按钮文字色
 *   .mdui-loadingbar*        页面顶部线性进度条
 *
 * ─── 九种指示器样式（类名后缀 = options.style） ──────────────────────────────
 *   material Material 四象限圆环    spinner 单弧旋转    ring 双环对转
 *   dots     三点弹跳          pulse   脉冲扩散    bars 五柱律动
 *   line     横线滚动          orbit   轨道旋转    ripple 波纹扩散
 * 九种指示器全部自绘，不依赖 mdui 原生 .mdui-spinner。
 * 确定进度（options.progress 为数字）时统一换成「SVG 圆环 + 百分比」。
 */

/* ##############################  一、遮罩层  ############################## */

/* 变量默认值：单独写在遮罩与顶部条上，页面覆盖 :root 或本类均可生效 */
.mdui-loading,
.mdui-loadingbar {
  --mdui-loading-color: #1E96D8;
}

/* 遮罩本体：区域模式（absolute，盖住宿主容器）。层级只取 10 —— 它只需压过宿主
   内部的同级元素，真正的全局层级交给宿主自己的 z-index，避免无谓地跟对话框打架 */
.mdui-loading {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  padding: 16px;
  background-color: rgba(255, 255, 255, 0.72);
  opacity: 0;
  -webkit-transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1);
          transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1);
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  /* 未完全显示前不拦截鼠标，避免 delay 期间或已关闭后还挡住底下的操作 */
  pointer-events: none;
  -webkit-tap-highlight-color: transparent;
}

/* 全屏模式：改成 fixed 盖住视口，层级排在对话框（6000）之上、提示信息（8000）之下 */
.mdui-loading-full {
  position: fixed;
  z-index: 7000;
}

/* 显示态：由 JS 在插入 DOM 后加上，触发淡入过渡 */
.mdui-loading-shown {
  opacity: 1;
  /* 只有真正显示了才拦截点击（关闭后连同 disabled 一起撤销） */
  pointer-events: auto;
}

/* 关闭中：立刻放行鼠标，让关闭动画不再挡操作 */
.mdui-loading-closing {
  pointer-events: none;
}

/* 不画遮罩底：只有指示器悬浮，始终不拦截点击 */
.mdui-loading-nomask {
  background-color: transparent;
  pointer-events: none;
}

/* 深色遮罩：配浅色文字与指示器更醒目 */
.mdui-loading-dark {
  background-color: rgba(0, 0, 0, 0.46);
}

/* 遮罩毛玻璃 */
.mdui-loading-blur {
  -webkit-backdrop-filter: blur(3px);
          backdrop-filter: blur(3px);
}

/* 点击遮罩可关闭（options.closeOnClick） */
.mdui-loading-clickable {
  cursor: pointer;
}

/* 指示器 + 文字的竖排容器 */
.mdui-loading-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
}

/* 指示器与文字之间的间距（没有文字时不占位） */
.mdui-loading-text {
  max-width: 80%;
  margin-top: 14px;
  color: rgba(0, 0, 0, 0.6);
  font-size: 14px;
  line-height: 20px;
  text-align: center;
  word-break: break-all;
}

.mdui-loading-dark .mdui-loading-text {
  color: rgba(255, 255, 255, 0.9);
}

/* 卡片面板（options.panel）：遮罩之上再加一块白卡片，指示器与文字包在里面 */
.mdui-loading-body-card {
  padding: 26px 30px;
  background-color: #ffffff;
  border-radius: 8px;
  box-shadow:
    0 8px 24px rgba(0, 0, 0, 0.16),
    0 2px 6px rgba(0, 0, 0, 0.1);
}

/* 卡片内部一律是白底，文字必须收回深色 —— 否则 dark + panel 会得到白字压白卡。
   权重与上面的 dark 规则相同，靠书写顺序取胜，所以这行必须排在它后面 */
.mdui-loading-body-card .mdui-loading-text {
  color: rgba(0, 0, 0, 0.6);
}

/* ##############################  二、指示器  ############################## */

/* 指示器容器：尺寸由 --mdui-loading-size 驱动，线宽由它派生，整体等比缩放 */
.mdui-loading-indicator {
  --mdui-loading-size: 44px;
  --mdui-loading-stroke: calc(var(--mdui-loading-size) / 11);
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--mdui-loading-size);
  height: var(--mdui-loading-size);
  box-sizing: border-box;
  color: var(--mdui-loading-color);
}

/* 尺寸档位（options.size 传字符串时由 JS 落成 small / medium / large 类）。
   这里特意叠加 .mdui-loading-indicator 提一级权重 —— 按钮内联加载在后面也声明了
   --mdui-loading-size，不提高权重的话按钮上选档位会被它压掉 */
.mdui-loading-indicator.mdui-loading-size-small  { --mdui-loading-size: 20px; }
.mdui-loading-indicator.mdui-loading-size-medium { --mdui-loading-size: 44px; }
.mdui-loading-indicator.mdui-loading-size-large  { --mdui-loading-size: 64px; }

/* ---------- material：Material 风格圆环（自绘，不依赖 mdui 原生 .mdui-spinner） ---------- */
/* 原生 .mdui-spinner 靠「左右两个半圆各裁一半、再反向对转」把弧拉长，几何全靠百分比宽度
   叠加，被缩放或塞进小尺寸容器时就容易退化成一条线；另外它自身带 rotate 动画，
   外部再写 transform 缩放会被动画直接覆盖掉。这里改成四个 90° 扇形按相位依次明灭、
   整体再匀速自转 —— 纯 border 绘制，不裁剪不缩放，任意尺寸都稳定
   扇形颜色跟随 currentColor（即 --mdui-loading-color / 主题色） */
.mdui-loading-ind-material .mdui-loading-mat {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  -webkit-animation: mdui-loading-rotate 1568ms linear infinite;
          animation: mdui-loading-rotate 1568ms linear infinite;
}

.mdui-loading-ind-material .mdui-loading-mat-arc {
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  border: var(--mdui-loading-stroke) solid transparent;
  border-top-color: currentColor;
  border-radius: 50%;
  /* 四条边各占 90°：只留一条可见 = 一个扇形，按 --mdui-loading-mat-i 摆到自己的象限 */
  -webkit-transform: rotate(calc(var(--mdui-loading-mat-i) * 90deg));
          transform: rotate(calc(var(--mdui-loading-mat-i) * 90deg));
  -webkit-animation: mdui-loading-mat-fade 1600ms linear infinite;
          animation: mdui-loading-mat-fade 1600ms linear infinite;
  /* 负延迟 = 各扇形错开 1/4 周期，形成首尾相接的追赶感 */
  -webkit-animation-delay: calc(var(--mdui-loading-mat-i) * -400ms);
          animation-delay: calc(var(--mdui-loading-mat-i) * -400ms);
}

@-webkit-keyframes mdui-loading-mat-fade {
  0% {
    opacity: 0;
  }
  35% {
    opacity: 1;
  }
  70% {
    opacity: 0;
  }
  100% {
    opacity: 0;
  }
}

@keyframes mdui-loading-mat-fade {
  0% {
    opacity: 0;
  }
  35% {
    opacity: 1;
  }
  70% {
    opacity: 0;
  }
  100% {
    opacity: 0;
  }
}

/* ---------- spinner：单弧旋转（默认样式） ---------- */
.mdui-loading-ind-spinner .mdui-loading-arc {
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  border: var(--mdui-loading-stroke) solid transparent;
  border-top-color: currentColor;
  border-left-color: currentColor;
  border-radius: 50%;
  -webkit-animation: mdui-loading-rotate 900ms linear infinite;
          animation: mdui-loading-rotate 900ms linear infinite;
}

/* ---------- ring：双环反向对转 ---------- */
.mdui-loading-ind-ring .mdui-loading-ring-a,
.mdui-loading-ind-ring .mdui-loading-ring-b {
  position: absolute;
  box-sizing: border-box;
  border: var(--mdui-loading-stroke) solid transparent;
  border-top-color: currentColor;
  border-radius: 50%;
}

.mdui-loading-ind-ring .mdui-loading-ring-a {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  -webkit-animation: mdui-loading-rotate 1000ms linear infinite;
          animation: mdui-loading-rotate 1000ms linear infinite;
}

.mdui-loading-ind-ring .mdui-loading-ring-b {
  top: calc(var(--mdui-loading-stroke) * 2);
  left: calc(var(--mdui-loading-stroke) * 2);
  width: calc(100% - var(--mdui-loading-stroke) * 4);
  height: calc(100% - var(--mdui-loading-stroke) * 4);
  border-top-color: transparent;
  border-bottom-color: currentColor;
  -webkit-animation: mdui-loading-rotate-rev 700ms linear infinite;
          animation: mdui-loading-rotate-rev 700ms linear infinite;
}

/* ---------- dots：三点依次弹跳 ---------- */
.mdui-loading-ind-dots .mdui-loading-dot {
  width: calc(var(--mdui-loading-size) * 0.22);
  height: calc(var(--mdui-loading-size) * 0.22);
  margin: 0 calc(var(--mdui-loading-size) * 0.055);
  background-color: currentColor;
  border-radius: 50%;
  -webkit-animation: mdui-loading-dot-bounce 1300ms ease-in-out infinite both;
          animation: mdui-loading-dot-bounce 1300ms ease-in-out infinite both;
}

.mdui-loading-ind-dots .mdui-loading-dot:nth-child(2) {
  -webkit-animation-delay: 160ms;
          animation-delay: 160ms;
}

.mdui-loading-ind-dots .mdui-loading-dot:nth-child(3) {
  -webkit-animation-delay: 320ms;
          animation-delay: 320ms;
}

/* ---------- pulse：外层脉冲扩散 + 内层心跳 ---------- */
.mdui-loading-ind-pulse .mdui-loading-pulse-ring {
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  border: var(--mdui-loading-stroke) solid currentColor;
  border-radius: 50%;
  -webkit-animation: mdui-loading-pulse-ring 1500ms cubic-bezier(0.24, 0, 0.38, 1) infinite;
          animation: mdui-loading-pulse-ring 1500ms cubic-bezier(0.24, 0, 0.38, 1) infinite;
}

.mdui-loading-ind-pulse .mdui-loading-pulse-core {
  width: 34%;
  height: 34%;
  background-color: currentColor;
  border-radius: 50%;
  -webkit-animation: mdui-loading-pulse-core 1500ms ease-in-out infinite;
          animation: mdui-loading-pulse-core 1500ms ease-in-out infinite;
}

/* ---------- bars：五柱律动（均衡器） ---------- */
.mdui-loading-ind-bars .mdui-loading-bar-col {
  width: calc(var(--mdui-loading-size) * 0.13);
  height: 100%;
  margin: 0 calc(var(--mdui-loading-size) * 0.035);
  background-color: currentColor;
  border-radius: 999px;
  -webkit-animation: mdui-loading-bars-scale 1200ms ease-in-out infinite;
          animation: mdui-loading-bars-scale 1200ms ease-in-out infinite;
}

.mdui-loading-ind-bars .mdui-loading-bar-col:nth-child(2) { -webkit-animation-delay: 100ms; animation-delay: 100ms; }
.mdui-loading-ind-bars .mdui-loading-bar-col:nth-child(3) { -webkit-animation-delay: 200ms; animation-delay: 200ms; }
.mdui-loading-ind-bars .mdui-loading-bar-col:nth-child(4) { -webkit-animation-delay: 300ms; animation-delay: 300ms; }
.mdui-loading-ind-bars .mdui-loading-bar-col:nth-child(5) { -webkit-animation-delay: 400ms; animation-delay: 400ms; }

/* ---------- line：长条里来回滚动的短线 ---------- */
.mdui-loading-ind-line {
  width: calc(var(--mdui-loading-size) * 1.9);
  height: calc(var(--mdui-loading-size) * 0.24);
  min-height: 4px;
  overflow: hidden;
  border-radius: 999px;
}

.mdui-loading-ind-line .mdui-loading-line-seg {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 42%;
  background-color: currentColor;
  border-radius: 999px;
  -webkit-animation: mdui-loading-line-move 1100ms cubic-bezier(0.65, 0.05, 0.36, 1) infinite;
          animation: mdui-loading-line-move 1100ms cubic-bezier(0.65, 0.05, 0.36, 1) infinite;
}

/* ---------- orbit：小点绕轨道公转 ---------- */
.mdui-loading-ind-orbit .mdui-loading-orbit-track {
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  border: var(--mdui-loading-stroke) solid currentColor;
  border-radius: 50%;
  opacity: 0.2;
}

.mdui-loading-ind-orbit .mdui-loading-orbit-rotor {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  -webkit-animation: mdui-loading-rotate 1100ms linear infinite;
          animation: mdui-loading-rotate 1100ms linear infinite;
}

.mdui-loading-ind-orbit .mdui-loading-orbit-rotor::after {
  position: absolute;
  top: calc(var(--mdui-loading-stroke) * -0.5);
  left: 50%;
  width: calc(var(--mdui-loading-size) * 0.24);
  height: calc(var(--mdui-loading-size) * 0.24);
  margin-left: calc(var(--mdui-loading-size) * -0.12);
  background-color: currentColor;
  border-radius: 50%;
  content: ' ';
}

.mdui-loading-ind-orbit .mdui-loading-orbit-core {
  width: 30%;
  height: 30%;
  background-color: currentColor;
  border-radius: 50%;
  opacity: 0.5;
}

/* ---------- ripple：三圈波纹错峰扩散 ---------- */
.mdui-loading-ind-ripple .mdui-loading-ripple-wave {
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  border: var(--mdui-loading-stroke) solid currentColor;
  border-radius: 50%;
  opacity: 0;
  -webkit-animation: mdui-loading-ripple 1800ms cubic-bezier(0.24, 0, 0.38, 1) infinite;
          animation: mdui-loading-ripple 1800ms cubic-bezier(0.24, 0, 0.38, 1) infinite;
}

.mdui-loading-ind-ripple .mdui-loading-ripple-wave:nth-child(2) { -webkit-animation-delay: 600ms; animation-delay: 600ms; }
.mdui-loading-ind-ripple .mdui-loading-ripple-wave:nth-child(3) { -webkit-animation-delay: 1200ms; animation-delay: 1200ms; }

/* ---------- 确定进度：SVG 圆环 + 百分比 ---------- */
.mdui-loading-progress {
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  width: 100%;
  height: 100%;
  -webkit-transform: rotate(-90deg);
          transform: rotate(-90deg);
  -webkit-transform-origin: 50% 50%;
          transform-origin: 50% 50%;
}

.mdui-loading-progress-track {
  fill: none;
  stroke: currentColor;
  stroke-opacity: 0.16;
  stroke-width: 4;
}

.mdui-loading-progress-bar {
  fill: none;
  stroke: currentColor;
  stroke-width: 4;
  stroke-linecap: round;
  -webkit-transition: stroke-dashoffset 300ms cubic-bezier(0.4, 0, 0.2, 1);
          transition: stroke-dashoffset 300ms cubic-bezier(0.4, 0, 0.2, 1);
}

.mdui-loading-percent {
  position: absolute;
  top: 50%;
  left: 50%;
  color: currentColor;
  font-size: calc(var(--mdui-loading-size) * 0.26);
  line-height: 1;
  font-variant-numeric: tabular-nums;
  -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
}

/* ##############################  三、按钮内联加载  ############################## */
/*
 * 结构（JS 生成）：
 *   <button class="mdui-btn mdui-loading-btn mdui-loading-btn-center">
 *     <span class="mdui-loading-btn-indicator ...">…</span>
 *     <span class="mdui-loading-btn-label">原文案</span>
 *   </button>
 * 居中模式：label 淡出但仍在文档流里占位 → 按钮长宽分毫不变，只有指示器原地出现；
 * 并排模式（options.keepText）：label 保持可见，指示器以行内块插在文字前面。
 * 按钮始终不置灰、不改配色，只冻结点击，所以主题色按钮上的白圈依旧清晰。
 */

.mdui-btn.mdui-loading-btn {
  position: relative;
}

/* 指示器默认尺寸跟着按钮字号走，比遮罩里的小一号；可用 options.size 覆盖 */
.mdui-loading-btn-indicator {
  --mdui-loading-size: 18px;
  color: inherit;
}

.mdui-loading-btn-label {
  -webkit-transition: opacity 160ms linear;
          transition: opacity 160ms linear;
}

/* 冻结点击：JS 另在捕获期加一层兜底监听，双保险 */
.mdui-loading-btn-loading {
  cursor: default;
}

/* 居中模式 */
.mdui-btn.mdui-loading-btn-center .mdui-loading-btn-label {
  opacity: 0;
}

.mdui-btn.mdui-loading-btn-center .mdui-loading-btn-indicator {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
}

/* 并排模式 */
.mdui-btn.mdui-loading-btn-inline .mdui-loading-btn-indicator {
  --mdui-loading-size: 16px;
  display: inline-flex;
  margin-right: 8px;
  vertical-align: middle;
}

/* 块级按钮（mdui-btn-block）里指示器同样居中，无需额外处理；
   图标按钮（mdui-btn-icon）label 只是一个图标，淡出后同样不改变圆形尺寸 */

/* ##############################  四、顶部进度条  ############################## */
/*
 * 结构（JS 懒创建，全局单例）：
 *   <div class="mdui-loadingbar mdui-loadingbar-active">
 *     <div class="mdui-loadingbar-peg"></div>
 *   </div>
 * 行为：start 后自动朝 90% 缓慢逼近（模仿 NProgress），done 时补满再淡出。
 */

.mdui-loadingbar {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  z-index: 8500;
  height: 3px;
  opacity: 0;
  pointer-events: none;
  -webkit-transition: opacity 320ms ease;
          transition: opacity 320ms ease;
}

.mdui-loadingbar-active {
  opacity: 1;
}

/* 贴到底部的变体（options.position: 'bottom'） */
.mdui-loadingbar-bottom {
  top: auto;
  bottom: 0;
}

.mdui-loadingbar-peg {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 0;
  background-color: var(--mdui-loading-color);
  box-shadow:
    0 0 10px var(--mdui-loading-color),
    0 0 5px var(--mdui-loading-color);
  -webkit-transition: width 220ms cubic-bezier(0.4, 0, 0.2, 1);
          transition: width 220ms cubic-bezier(0.4, 0, 0.2, 1);
  will-change: width;
}

/* 进度尖端的高光，让条子末端有一点呼吸感 */
.mdui-loadingbar-peg::after {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 12px;
  background-color: #ffffff;
  border-radius: 999px;
  opacity: 0.85;
  content: ' ';
}

/* 失败：整条变红后淡出 */
.mdui-loadingbar-error .mdui-loadingbar-peg {
  background-color: #E5484D;
  box-shadow:
    0 0 10px #E5484D,
    0 0 5px #E5484D;
}

.mdui-loadingbar-error .mdui-loadingbar-peg::after {
  background-color: #ffffff;
}

/* ##############################  五、动画关键帧  ############################## */

@-webkit-keyframes mdui-loading-rotate {
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}
@keyframes mdui-loading-rotate {
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}

@-webkit-keyframes mdui-loading-rotate-rev {
  to {
    -webkit-transform: rotate(-360deg);
            transform: rotate(-360deg);
  }
}
@keyframes mdui-loading-rotate-rev {
  to {
    -webkit-transform: rotate(-360deg);
            transform: rotate(-360deg);
  }
}

@-webkit-keyframes mdui-loading-dot-bounce {
  0%,
  70%,
  100% {
    -webkit-transform: translateY(0) scale(0.85);
            transform: translateY(0) scale(0.85);
    opacity: 0.55;
  }
  35% {
    -webkit-transform: translateY(-38%) scale(1);
            transform: translateY(-38%) scale(1);
    opacity: 1;
  }
}
@keyframes mdui-loading-dot-bounce {
  0%,
  70%,
  100% {
    -webkit-transform: translateY(0) scale(0.85);
            transform: translateY(0) scale(0.85);
    opacity: 0.55;
  }
  35% {
    -webkit-transform: translateY(-38%) scale(1);
            transform: translateY(-38%) scale(1);
    opacity: 1;
  }
}

@-webkit-keyframes mdui-loading-pulse-ring {
  0% {
    -webkit-transform: scale(0.45);
            transform: scale(0.45);
    opacity: 0.9;
  }
  100% {
    -webkit-transform: scale(1);
            transform: scale(1);
    opacity: 0;
  }
}
@keyframes mdui-loading-pulse-ring {
  0% {
    -webkit-transform: scale(0.45);
            transform: scale(0.45);
    opacity: 0.9;
  }
  100% {
    -webkit-transform: scale(1);
            transform: scale(1);
    opacity: 0;
  }
}

@-webkit-keyframes mdui-loading-pulse-core {
  0%,
  100% {
    -webkit-transform: scale(0.7);
            transform: scale(0.7);
  }
  50% {
    -webkit-transform: scale(1);
            transform: scale(1);
  }
}
@keyframes mdui-loading-pulse-core {
  0%,
  100% {
    -webkit-transform: scale(0.7);
            transform: scale(0.7);
  }
  50% {
    -webkit-transform: scale(1);
            transform: scale(1);
  }
}

@-webkit-keyframes mdui-loading-bars-scale {
  0%,
  100% {
    -webkit-transform: scaleY(0.35);
            transform: scaleY(0.35);
  }
  50% {
    -webkit-transform: scaleY(1);
            transform: scaleY(1);
  }
}
@keyframes mdui-loading-bars-scale {
  0%,
  100% {
    -webkit-transform: scaleY(0.35);
            transform: scaleY(0.35);
  }
  50% {
    -webkit-transform: scaleY(1);
            transform: scaleY(1);
  }
}

@-webkit-keyframes mdui-loading-line-move {
  0% {
    -webkit-transform: translateX(-100%);
            transform: translateX(-100%);
  }
  100% {
    -webkit-transform: translateX(250%);
            transform: translateX(250%);
  }
}
@keyframes mdui-loading-line-move {
  0% {
    -webkit-transform: translateX(-100%);
            transform: translateX(-100%);
  }
  100% {
    -webkit-transform: translateX(250%);
            transform: translateX(250%);
  }
}

@-webkit-keyframes mdui-loading-ripple {
  0% {
    -webkit-transform: scale(0.4);
            transform: scale(0.4);
    opacity: 0.8;
  }
  100% {
    -webkit-transform: scale(1);
            transform: scale(1);
    opacity: 0;
  }
}
@keyframes mdui-loading-ripple {
  0% {
    -webkit-transform: scale(0.4);
            transform: scale(0.4);
    opacity: 0.8;
  }
  100% {
    -webkit-transform: scale(1);
            transform: scale(1);
    opacity: 0;
  }
}

/* ##############################  六、减少动效偏好  ############################## */
/* 系统开了「减弱动态效果」时，把无限循环的旋转 / 弹跳整体放慢，降低持续闪动的干扰；
   注意只是减速，指整体形态不变，不会换成另一种动画 */
@media (prefers-reduced-motion: reduce) {
  .mdui-loading-indicator > *,
  .mdui-loading-indicator *::after {
    -webkit-animation-duration: 2400ms !important;
            animation-duration: 2400ms !important;
    -webkit-animation-iteration-count: infinite !important;
            animation-iteration-count: infinite !important;
  }
  .mdui-loading,
  .mdui-loadingbar,
  .mdui-loadingbar-peg {
    -webkit-transition-duration: 60ms;
            transition-duration: 60ms;
  }
}

/* ============================== 7/7  dropdown.css  ============================== */
/*!
 * mdui-dropdown-ext 1.0.0 样式（下拉菜单组件）
 * 配合 js/ltmdui.js 的 10/10 下拉菜单组件使用
 */

/* 面板本体：fixed 定位，坐标由 JS 每次打开时计算；z-index 由 popupLayer 动态抬高 */
.mdui-dropdown-menu {
  position: fixed;
  z-index: 2600;
  display: none;
  min-width: 180px;
  max-width: 360px;
  max-height: 65vh;
  box-sizing: border-box;
  overflow-y: auto;
  background-color: #ffffff;
  border-radius: 2px;
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2), 0 3px 14px rgba(0, 0, 0, 0.14), 0 5px 5px rgba(0, 0, 0, 0.1);
  will-change: transform, opacity;
}

/* items 菜单项模式的容器：上下留白由它统一控制 */
.mdui-dropdown-content {
  padding: 8px 0;
}

/* 自定义 HTML 内容模式（按钮 / 头像 / 表单等）：内容区四周加内边距 */
.mdui-dropdown-content-free {
  padding: 12px 16px;
}

/* 菜单项 */
.mdui-dropdown-item {
  display: flex;
  align-items: center;
  gap: 12px;
  min-height: 40px;
  box-sizing: border-box;
  padding: 0 16px;
  color: rgba(0, 0, 0, 0.87);
  font-size: 15px;
  text-decoration: none;
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  transition: background-color 0.15s ease;
}

.mdui-dropdown-item:hover {
  background-color: rgba(0, 0, 0, 0.06);
}

/* 菜单项图标位 */
.mdui-dropdown-item-icon {
  flex: 0 0 auto;
  color: rgba(0, 0, 0, 0.54);
  font-size: 20px;
  line-height: 1;
}

/* 菜单项头像位 */
.mdui-dropdown-item-avatar {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  object-fit: cover;
}

/* 菜单项文字：超长省略，撑满剩余空间 */
.mdui-dropdown-item-text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* 分隔线 */
.mdui-dropdown-item-divider {
  height: 1px;
  margin: 8px 0;
  background-color: rgba(0, 0, 0, 0.12);
}

/* 禁用态：pointer-events 直接掐掉，点击 / 悬浮都不响应 */
.mdui-dropdown-item-disabled {
  color: rgba(0, 0, 0, 0.38) !important;
  cursor: default;
  pointer-events: none;
}
