/* ═══════════════════════════════════════════════════════════════
   components.css — Design System Component Definitions
   Auto-extracted from preview/component-*.html
   DO NOT EDIT MANUALLY — regenerate via extract-components-css.mjs
   ═══════════════════════════════════════════════════════════════ */

/* ── Button ────────────────────────────────────────────────── */
/* @anatomy
   <span class="label">类型</span> <button class="btn btn-primary btn-md">新建订单</button> <button class="btn btn-default btn-md">导出报表</button> <button class="btn btn-text btn-md">取消</button> <button class="btn btn-link btn-md">查看详情</button> <button class="btn btn-danger btn-md">删除</button>
*/
.btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-4); border: 1px solid transparent; cursor: pointer; white-space: nowrap; font-size: var(--font-size-body); line-height: var(--line-height-body); border-radius: var(--radius-base); min-width: 64px; padding: 0 var(--space-12); flex-shrink: 0; transition: background .15s, border-color .15s; }
.btn:focus-visible { outline: 2px solid var(--color-focus-ring); outline-offset: 2px; }
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); }
.btn-primary:hover { background: var(--color-brand-hover); }
.btn-primary:active { background: var(--color-brand-active); }
.btn-default { background: var(--color-bg-card); border-color: var(--color-border); color: var(--color-text-body); }
.btn-default:hover { border-color: var(--color-brand); }
.btn-text { background: transparent; color: var(--color-brand); }
.btn-text:hover { background: var(--color-brand-bg); }
.btn-link { background: transparent; border: none; color: var(--color-brand); min-width: auto; padding: 0; }
.btn-link:hover { background: var(--color-brand-bg); }
.btn-danger { background: var(--color-error); color: var(--color-text-inverse); }
.btn-danger:hover { filter: brightness(.92); }
.btn-lg { height: var(--control-height-large); }
.btn-md { height: var(--control-height-default); }
.btn-sm { height: var(--control-height-small); }
.btn-disabled, .btn:disabled { background: var(--color-bg-disabled); border-color: transparent; color: var(--color-text-placeholder); cursor: not-allowed; }
.btn-disabled:hover, .btn:disabled:hover { background: var(--color-bg-disabled); filter: none; }

/* ── Card ──────────────────────────────────────────────────── */
/* @anatomy
   <span class="label">边框卡片</span>
*/
.card { width: 100%; background: var(--color-bg-card); border-radius: var(--radius-large); box-sizing: border-box; }
.card-bordered { border: 1px solid var(--color-border); }
.card-shadowed { box-shadow: var(--shadow-low); }
.card-p16 { padding: var(--space-16); }
.card-p24 { padding: var(--space-24); }
.card-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-12); }
.card-title { font-size: var(--font-size-h2); font-weight: var(--font-weight-h2); color: var(--color-text-title); }
.card-link { color: var(--color-brand); text-decoration: none; white-space: nowrap; transition: color .15s; }
.card-link:hover { color: var(--color-brand-hover); }
.card-body { color: var(--color-text-body); }
.data-row { display: flex; justify-content: space-between; padding: var(--space-8) 0; border-bottom: 1px solid var(--color-border); }
.data-row:last-child { border-bottom: none; }
.card-actions { display: flex; justify-content: flex-end; gap: var(--space-8); margin-top: var(--space-16); }
.btn { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; height: var(--control-height-default); min-width: var(--control-height-default); padding: 0 var(--space-16); border-radius: var(--radius-base); font-size: var(--font-size-body); white-space: nowrap; cursor: pointer; transition: background .15s, border-color .15s; }
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); border: 1px solid var(--color-brand); }
.btn-primary:hover { background: var(--color-brand-hover); border-color: var(--color-brand-hover); }
.btn-default { background: var(--color-bg-card); color: var(--color-text-body); border: 1px solid var(--color-border); }
.btn-default:hover { background: var(--color-brand-bg); }

/* ── Input ─────────────────────────────────────────────────── */
/* @anatomy
   <span class="label">状态</span> <div class="field" data-evidence-sample="默认输入框"><div class="kole-input"><input placeholder="请输入客户名称">
*/
.field { display: inline-flex; flex-direction: column; gap: var(--space-4); flex-shrink: 0; }
.kole-input { display: inline-flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); padding: 0 var(--space-12); background: var(--color-bg-card); border: 1px solid var(--color-border); border-radius: var(--radius-base); transition: border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard); }
.kole-input input { border: none; outline: none; background: transparent; font-size: var(--font-size-body); color: var(--color-text-body); min-width: 120px; }
.kole-input input::placeholder { color: var(--color-text-placeholder); }
.kole-input:focus-within { border-color: var(--color-brand); box-shadow: 0 0 0 2px var(--color-focus-ring); }
.kole-input.is-error { border-color: var(--color-error); }
.kole-input.is-error:focus-within { border-color: var(--color-error); box-shadow: 0 0 0 2px var(--color-focus-ring); }
.kole-input .affix { display: inline-flex; flex-shrink: 0; }
.kole-input .action { display: inline-flex; flex-shrink: 0; padding: 0; border: none; background: none; cursor: pointer; color: var(--color-text-secondary); transition: background var(--duration-fast) var(--ease-standard); }
.kole-input .action:hover { background: var(--color-brand-bg); }
.kole-input-lg { height: var(--control-height-large); }
.kole-input-sm { height: var(--control-height-small); }
.kole-input-sm input { font-size: var(--font-size-caption); }
.error-text { font-size: var(--font-size-caption); color: var(--color-error); line-height: var(--line-height-caption); }

/* ── Modal ─────────────────────────────────────────────────── */
/* @anatomy
   <div class="story"> <span class="story-label">默认对话框</span> <div class="modal-scene"> <div class="modal modal-default" data-evidence-sample="默认对话框"> <div class="modal-title">确认删除客户</div>
*/
/* Component definitions — extracted to components.css */
.modal-scene { flex: 1; min-width: 0; background: var(--color-mask); border-radius: var(--radius-large); padding: var(--space-24); display: flex; justify-content: center; }
.modal { background: var(--color-bg-card); border-radius: var(--radius-large); box-shadow: var(--shadow-high); display: flex; flex-direction: column; overflow: hidden; }
.modal-default { width: 480px; }
.modal-large { width: 680px; }
.modal-small { width: 320px; }
.modal-title { padding: var(--space-16) var(--space-24); font-size: var(--font-size-h1); line-height: var(--line-height-h1); font-weight: var(--font-weight-h1); color: var(--color-text-title); border-bottom: 1px solid var(--color-border); word-break: keep-all; overflow-wrap: break-word; }
.modal-content { padding: var(--space-24); color: var(--color-text-body); overflow-wrap: break-word; }
.modal-footer { display: flex; justify-content: flex-end; gap: var(--space-8); padding: var(--space-12) var(--space-24) var(--space-24); }
.btn { display: inline-flex; align-items: center; justify-content: center; height: var(--control-height-default); min-width: var(--control-height-default); padding: 0 var(--space-16); border-radius: var(--radius-base); font-size: var(--font-size-body); line-height: var(--line-height-body); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; }
.btn-secondary { background: var(--color-bg-card); color: var(--color-text-body); border: 1px solid var(--color-border); }
.btn-secondary:hover { background: var(--color-brand-bg); }
.btn-primary { background: var(--color-brand); color: var(--color-text-inverse); border: 1px solid var(--color-brand); }
.btn-primary:hover { background: var(--color-brand-hover); border-color: var(--color-brand-hover); }

/* ── Select ────────────────────────────────────────────────── */
/* @anatomy
   <span class="label">单选</span> <div class="select"><span class="value">华东区</span><svg class="icon"><use href="#icon-chevron-down"/></svg>
*/
.select { position: relative; display: inline-flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); min-width: 200px; padding: 0 var(--space-12); background: var(--color-bg-card); border: 1px solid var(--color-border); border-radius: var(--radius-base); font-size: var(--font-size-body); color: var(--color-text-body); cursor: pointer; transition: background .15s, border-color .15s; }
.select:hover { filter: brightness(1.08); }
.select .value { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.select .placeholder { color: var(--color-text-placeholder); white-space: nowrap; }
.select .icon { width: var(--icon-size-16); height: var(--icon-size-16); flex-shrink: 0; color: var(--color-text-secondary); margin-left: auto; }
.select.open { border-color: var(--color-brand); box-shadow: 0 0 0 2px var(--color-focus-ring); }
.select.wide { width: 240px; }
.select-tags { display: inline-flex; align-items: center; gap: var(--space-4); min-width: 0; overflow: hidden; }
.select-tag { display: inline-flex; align-items: center; height: var(--line-height-caption); padding: 0 var(--space-8); background: var(--color-brand-bg); color: var(--color-brand); border-radius: var(--radius-small); font-size: var(--font-size-caption); white-space: nowrap; }
.select-panel { position: absolute; top: calc(100% + var(--space-4)); left: 0; width: 100%; max-height: 256px; overflow: auto; background: var(--color-bg-card); border-radius: var(--radius-base); box-shadow: var(--shadow-medium); padding: var(--space-4); z-index: 10; }
.select-option { display: flex; align-items: center; gap: var(--space-8); height: var(--control-height-default); padding: 0 var(--space-12); border-radius: var(--radius-base); color: var(--color-text-body); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; }
.select-option:hover { filter: brightness(1.08); }
.select-option.selected { background: var(--color-brand-bg); color: var(--color-brand); }
.select-option .icon { width: var(--icon-size-16); height: var(--icon-size-16); flex-shrink: 0; }

/* ── Table ─────────────────────────────────────────────────── */
/* @anatomy
   <span class="label">基础表格</span>
*/
.tbl { width: 100%; border-collapse: collapse; background: var(--color-bg-card); }
.tbl th { background: var(--color-bg-table-header); color: var(--color-text-body); font-weight: var(--font-weight-body); text-align: left; white-space: nowrap; }
.tbl th, .tbl td { height: var(--space-48); padding: 0 var(--space-16); border-bottom: 1px solid var(--color-border); }
.tbl tbody tr:hover { background: var(--color-bg-page); }
.tbl tr.selected { background: var(--color-brand-bg); }
.tbl .num { text-align: right; }
.tbl .ops { text-align: right; white-space: nowrap; }
.tbl .ops a { color: var(--color-brand); text-decoration: none; }
.tbl .ops a + a { margin-left: var(--space-8); }
.tbl .ops a:hover, .tbl .sort:hover, .tbl .expand:hover, .batchbar .btn:hover { background: var(--color-brand-bg); }
.tbl .ops a, .tbl .sort, .tbl .expand, .batchbar .btn { transition: background .15s, border-color .15s; }
.tbl .sel { width: var(--icon-size-16); height: var(--icon-size-16); vertical-align: middle; }
.tbl .sort, .tbl .expand { display: inline-flex; align-items: center; }
.tbl .sort { gap: var(--space-4); }
.tbl .fixed { position: sticky; left: 0; background: var(--color-bg-card); }
.tbl th.fixed { background: var(--color-bg-table-header); }
.tbl .detail td { background: var(--color-bg-page); }
.tbl-wrap .tbl { min-width: 720px; }
.batchbar { display: flex; align-items: center; gap: var(--space-8); height: var(--space-48); padding: 0 var(--space-16); background: var(--color-bg-card); border-bottom: 1px solid var(--color-border); }
.batchbar .count { color: var(--color-text-secondary); }
.batchbar .btn { color: var(--color-brand); background: none; border: none; padding: 0; }
