/* ============================================================
 * utilities.css — 原子化工具类
 * 融合 Tailwind CSS / Bootstrap / Layui 设计理念
 * 依赖：design-tokens.css
 * ============================================================ */

/* ----------------------------------------------------------
 * 1. Display — 显示控制
 * ---------------------------------------------------------- */
.d-none         { display: none !important; }
.d-block        { display: block !important; }
.d-inline       { display: inline !important; }
.d-inline-block { display: inline-block !important; }
.d-flex         { display: flex !important; }
.d-inline-flex  { display: inline-flex !important; }
.d-grid         { display: grid !important; }
.d-table        { display: table !important; }
.d-table-cell   { display: table-cell !important; }
.d-table-row    { display: table-row !important; }

/* ----------------------------------------------------------
 * 2. Flexbox — 弹性布局
 * ---------------------------------------------------------- */
.flex-row          { flex-direction: row; }
.flex-col          { flex-direction: column; }
.flex-row-reverse  { flex-direction: row-reverse; }
.flex-col-reverse  { flex-direction: column-reverse; }
.flex-wrap         { flex-wrap: wrap; }
.flex-nowrap       { flex-wrap: nowrap; }
.flex-wrap-reverse { flex-wrap: wrap-reverse; }
.flex-1            { flex: 1 1 0%; }
.flex-auto         { flex: 1 1 auto; }
.flex-initial      { flex: 0 1 auto; }
.flex-none         { flex: none; }
.flex-grow         { flex-grow: 1; }
.flex-grow-0       { flex-grow: 0; }
.flex-shrink       { flex-shrink: 1; }
.flex-shrink-0     { flex-shrink: 0; }

/* 对齐项 */
.items-start    { align-items: flex-start; }
.items-center   { align-items: center; }
.items-end      { align-items: flex-end; }
.items-stretch  { align-items: stretch; }
.items-baseline { align-items: baseline; }

/* 主轴对齐 */
.justify-start    { justify-content: flex-start; }
.justify-center   { justify-content: center; }
.justify-end      { justify-content: flex-end; }
.justify-between  { justify-content: space-between; }
.justify-around   { justify-content: space-around; }
.justify-evenly   { justify-content: space-evenly; }

/* 自身对齐 */
.self-start   { align-self: flex-start; }
.self-center  { align-self: center; }
.self-end     { align-self: flex-end; }
.self-stretch { align-self: stretch; }

/* Flex 间距 */
.gap-0  { gap: 0; }
.gap-1  { gap: var(--space-1); }
.gap-2  { gap: var(--space-2); }
.gap-3  { gap: var(--space-3); }
.gap-4  { gap: var(--space-4); }
.gap-5  { gap: var(--space-5); }
.gap-6  { gap: var(--space-6); }
.gap-8  { gap: var(--space-8); }
.gap-10 { gap: var(--space-10); }
.gap-12 { gap: var(--space-12); }

/* 行/列间距 */
.gap-x-2 { column-gap: var(--space-2); }
.gap-x-4 { column-gap: var(--space-4); }
.gap-x-6 { column-gap: var(--space-6); }
.gap-y-2 { row-gap: var(--space-2); }
.gap-y-4 { row-gap: var(--space-4); }
.gap-y-6 { row-gap: var(--space-6); }

/* ----------------------------------------------------------
 * 3. Grid — 网格布局
 * ---------------------------------------------------------- */
.grid-cols-1  { grid-template-columns: repeat(1, minmax(0, 1fr)); }
.grid-cols-2  { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-cols-3  { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-cols-4  { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.grid-cols-5  { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.grid-cols-6  { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }

.col-span-1  { grid-column: span 1 / span 1; }
.col-span-2  { grid-column: span 2 / span 2; }
.col-span-3  { grid-column: span 3 / span 3; }
.col-span-4  { grid-column: span 4 / span 4; }
.col-span-5  { grid-column: span 5 / span 5; }
.col-span-6  { grid-column: span 6 / span 6; }
.col-span-7  { grid-column: span 7 / span 7; }
.col-span-8  { grid-column: span 8 / span 8; }
.col-span-9  { grid-column: span 9 / span 9; }
.col-span-10 { grid-column: span 10 / span 10; }
.col-span-11 { grid-column: span 11 / span 11; }
.col-span-12 { grid-column: span 12 / span 12; }

.grid-flow-row    { grid-auto-flow: row; }
.grid-flow-col    { grid-auto-flow: column; }
.grid-flow-dense  { grid-auto-flow: dense; }

/* ----------------------------------------------------------
 * 4. Spacing — 间距（基于 4px 基准）
 * ---------------------------------------------------------- */

/* Margin */
.m-0    { margin: 0 !important; }
.m-1    { margin: var(--space-1) !important; }
.m-2    { margin: var(--space-2) !important; }
.m-3    { margin: var(--space-3) !important; }
.m-4    { margin: var(--space-4) !important; }
.m-5    { margin: var(--space-5) !important; }
.m-6    { margin: var(--space-6) !important; }
.m-8    { margin: var(--space-8) !important; }
.m-auto { margin: auto !important; }

.mx-0    { margin-left: 0 !important; margin-right: 0 !important; }
.mx-1    { margin-left: var(--space-1) !important; margin-right: var(--space-1) !important; }
.mx-2    { margin-left: var(--space-2) !important; margin-right: var(--space-2) !important; }
.mx-3    { margin-left: var(--space-3) !important; margin-right: var(--space-3) !important; }
.mx-4    { margin-left: var(--space-4) !important; margin-right: var(--space-4) !important; }
.mx-auto { margin-left: auto !important; margin-right: auto !important; }

.my-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
.my-1 { margin-top: var(--space-1) !important; margin-bottom: var(--space-1) !important; }
.my-2 { margin-top: var(--space-2) !important; margin-bottom: var(--space-2) !important; }
.my-3 { margin-top: var(--space-3) !important; margin-bottom: var(--space-3) !important; }
.my-4 { margin-top: var(--space-4) !important; margin-bottom: var(--space-4) !important; }

.mt-0 { margin-top: 0 !important; }
.mt-1 { margin-top: var(--space-1) !important; }
.mt-2 { margin-top: var(--space-2) !important; }
.mt-3 { margin-top: var(--space-3) !important; }
.mt-4 { margin-top: var(--space-4) !important; }
.mt-5 { margin-top: var(--space-5) !important; }
.mt-6 { margin-top: var(--space-6) !important; }
.mt-8 { margin-top: var(--space-8) !important; }
.mt-auto { margin-top: auto !important; }

.mb-0 { margin-bottom: 0 !important; }
.mb-1 { margin-bottom: var(--space-1) !important; }
.mb-2 { margin-bottom: var(--space-2) !important; }
.mb-3 { margin-bottom: var(--space-3) !important; }
.mb-4 { margin-bottom: var(--space-4) !important; }
.mb-5 { margin-bottom: var(--space-5) !important; }
.mb-6 { margin-bottom: var(--space-6) !important; }
.mb-8 { margin-bottom: var(--space-8) !important; }
.mb-auto { margin-bottom: auto !important; }

.ml-0 { margin-left: 0 !important; }
.ml-1 { margin-left: var(--space-1) !important; }
.ml-2 { margin-left: var(--space-2) !important; }
.ml-3 { margin-left: var(--space-3) !important; }
.ml-4 { margin-left: var(--space-4) !important; }
.ml-auto { margin-left: auto !important; }

.mr-0 { margin-right: 0 !important; }
.mr-1 { margin-right: var(--space-1) !important; }
.mr-2 { margin-right: var(--space-2) !important; }
.mr-3 { margin-right: var(--space-3) !important; }
.mr-4 { margin-right: var(--space-4) !important; }
.mr-auto { margin-right: auto !important; }

.ms-0 { margin-inline-start: 0 !important; }
.ms-1 { margin-inline-start: var(--space-1) !important; }
.ms-2 { margin-inline-start: var(--space-2) !important; }
.ms-3 { margin-inline-start: var(--space-3) !important; }
.ms-auto { margin-inline-start: auto !important; }

.me-0 { margin-inline-end: 0 !important; }
.me-1 { margin-inline-end: var(--space-1) !important; }
.me-2 { margin-inline-end: var(--space-2) !important; }
.me-3 { margin-inline-end: var(--space-3) !important; }
.me-auto { margin-inline-end: auto !important; }

/* Padding */
.p-0 { padding: 0 !important; }
.p-1 { padding: var(--space-1) !important; }
.p-2 { padding: var(--space-2) !important; }
.p-3 { padding: var(--space-3) !important; }
.p-4 { padding: var(--space-4) !important; }
.p-5 { padding: var(--space-5) !important; }
.p-6 { padding: var(--space-6) !important; }
.p-8 { padding: var(--space-8) !important; }

.px-0 { padding-left: 0 !important; padding-right: 0 !important; }
.px-1 { padding-left: var(--space-1) !important; padding-right: var(--space-1) !important; }
.px-2 { padding-left: var(--space-2) !important; padding-right: var(--space-2) !important; }
.px-3 { padding-left: var(--space-3) !important; padding-right: var(--space-3) !important; }
.px-4 { padding-left: var(--space-4) !important; padding-right: var(--space-4) !important; }
.px-5 { padding-left: var(--space-5) !important; padding-right: var(--space-5) !important; }
.px-6 { padding-left: var(--space-6) !important; padding-right: var(--space-6) !important; }

.py-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
.py-1 { padding-top: var(--space-1) !important; padding-bottom: var(--space-1) !important; }
.py-2 { padding-top: var(--space-2) !important; padding-bottom: var(--space-2) !important; }
.py-3 { padding-top: var(--space-3) !important; padding-bottom: var(--space-3) !important; }
.py-4 { padding-top: var(--space-4) !important; padding-bottom: var(--space-4) !important; }
.py-5 { padding-top: var(--space-5) !important; padding-bottom: var(--space-5) !important; }
.py-6 { padding-top: var(--space-6) !important; padding-bottom: var(--space-6) !important; }

.pt-0 { padding-top: 0 !important; }
.pt-1 { padding-top: var(--space-1) !important; }
.pt-2 { padding-top: var(--space-2) !important; }
.pt-3 { padding-top: var(--space-3) !important; }
.pt-4 { padding-top: var(--space-4) !important; }
.pt-5 { padding-top: var(--space-5) !important; }
.pt-6 { padding-top: var(--space-6) !important; }

.pb-0 { padding-bottom: 0 !important; }
.pb-1 { padding-bottom: var(--space-1) !important; }
.pb-2 { padding-bottom: var(--space-2) !important; }
.pb-3 { padding-bottom: var(--space-3) !important; }
.pb-4 { padding-bottom: var(--space-4) !important; }
.pb-5 { padding-bottom: var(--space-5) !important; }
.pb-6 { padding-bottom: var(--space-6) !important; }

.ps-0 { padding-inline-start: 0 !important; }
.ps-2 { padding-inline-start: var(--space-2) !important; }
.ps-3 { padding-inline-start: var(--space-3) !important; }
.ps-4 { padding-inline-start: var(--space-4) !important; }

.pe-0 { padding-inline-end: 0 !important; }
.pe-2 { padding-inline-end: var(--space-2) !important; }
.pe-3 { padding-inline-end: var(--space-3) !important; }
.pe-4 { padding-inline-end: var(--space-4) !important; }

/* ----------------------------------------------------------
 * 5. Sizing — 尺寸
 * ---------------------------------------------------------- */
.w-full   { width: 100%; }
.w-auto   { width: auto; }
.w-screen { width: 100vw; }
.w-0      { width: 0; }
.w-25     { width: 25%; }
.w-50     { width: 50%; }
.w-75     { width: 75%; }
.w-fit    { width: fit-content; }

.h-full   { height: 100%; }
.h-screen { height: 100vh; }
.h-auto   { height: auto; }
.h-0      { height: 0; }
.h-fit    { height: fit-content; }

.min-h-screen { min-height: 100vh; }
.min-h-0      { min-height: 0; }
.min-h-full   { min-height: 100%; }

.max-w-sm  { max-width: 24rem; }
.max-w-md  { max-width: 28rem; }
.max-w-lg  { max-width: 32rem; }
.max-w-xl  { max-width: 36rem; }
.max-w-2xl { max-width: 42rem; }
.max-w-3xl { max-width: 48rem; }
.max-w-4xl { max-width: 56rem; }
.max-w-full{ max-width: 100%; }
.max-w-none{ max-width: none; }

.max-h-screen { max-height: 100vh; }
.max-h-full   { max-height: 100%; }

/* ----------------------------------------------------------
 * 6. Typography — 排版
 * ---------------------------------------------------------- */

/* 字号 */
.text-xs   { font-size: var(--text-xs); }
.text-sm   { font-size: var(--text-sm); }
.text-base { font-size: var(--text-base); }
.text-lg   { font-size: var(--text-lg); }
.text-xl   { font-size: var(--text-xl); }
.text-2xl  { font-size: var(--text-2xl); }
.text-3xl  { font-size: var(--text-3xl); }
.text-4xl  { font-size: var(--text-4xl); }
.text-5xl  { font-size: var(--text-5xl); }

/* 字重 */
.font-light     { font-weight: var(--font-light); }
.font-normal    { font-weight: var(--font-normal); }
.font-medium    { font-weight: var(--font-medium); }
.font-semibold  { font-weight: var(--font-semibold); }
.font-bold      { font-weight: var(--font-bold); }
.font-extrabold { font-weight: var(--font-extrabold); }

/* 文本对齐 */
.text-left    { text-align: left; }
.text-center  { text-align: center; }
.text-right   { text-align: right; }
.text-justify { text-align: justify; }

/* 文本颜色 */
.text-primary   { color: var(--color-text); }
.text-secondary { color: var(--color-text-secondary); }
.text-muted     { color: var(--color-text-muted); }
.text-inherit   { color: inherit; }
.text-current   { color: currentColor; }
.text-white     { color: #ffffff; }
.text-black     { color: #000000; }
.text-success   { color: var(--color-success-600); }
.text-warning   { color: var(--color-warning-600); }
.text-danger    { color: var(--color-danger-600); }
.text-info      { color: var(--color-info-600); }

/* 行高 */
.leading-none    { line-height: var(--leading-none); }
.leading-tight   { line-height: var(--leading-tight); }
.leading-snug    { line-height: var(--leading-snug); }
.leading-normal  { line-height: var(--leading-normal); }
.leading-relaxed { line-height: var(--leading-relaxed); }
.leading-loose   { line-height: var(--leading-loose); }

/* 字间距 */
.tracking-tighter { letter-spacing: var(--tracking-tighter); }
.tracking-tight   { letter-spacing: var(--tracking-tight); }
.tracking-normal  { letter-spacing: var(--tracking-normal); }
.tracking-wide    { letter-spacing: var(--tracking-wide); }
.tracking-wider   { letter-spacing: var(--tracking-wider); }

/* 文本装饰 */
.underline     { text-decoration: underline; }
.line-through  { text-decoration: line-through; }
.no-underline  { text-decoration: none; }

/* 文本转换 */
.uppercase { text-transform: uppercase; }
.lowercase { text-transform: lowercase; }
.capitalize { text-transform: capitalize; }
.normal-case { text-transform: none; }

/* 文本溢出 */
.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.line-clamp-1 {
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.line-clamp-2 {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.line-clamp-3 {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* 文本换行 */
.whitespace-normal  { white-space: normal; }
.whitespace-nowrap  { white-space: nowrap; }
.whitespace-pre     { white-space: pre; }
.whitespace-pre-wrap{ white-space: pre-wrap; }
.break-words        { overflow-wrap: break-word; }
.break-all          { word-break: break-all; }

/* ----------------------------------------------------------
 * 7. Background — 背景
 * ---------------------------------------------------------- */
.bg-transparent    { background-color: transparent; }
.bg-current        { background-color: currentColor; }
.bg-white          { background-color: #ffffff; }
.bg-black          { background-color: #000000; }

.bg-primary-50     { background-color: var(--color-primary-50); }
.bg-primary-100    { background-color: var(--color-primary-100); }
.bg-primary-200    { background-color: var(--color-primary-200); }
.bg-primary-300    { background-color: var(--color-primary-300); }
.bg-primary-400    { background-color: var(--color-primary-400); }
.bg-primary-500    { background-color: var(--color-primary-500); }
.bg-primary-600    { background-color: var(--color-primary-600); }
.bg-primary-700    { background-color: var(--color-primary-700); }
.bg-primary-800    { background-color: var(--color-primary-800); }
.bg-primary-900    { background-color: var(--color-primary-900); }

.bg-success-50     { background-color: var(--color-success-50); }
.bg-success-100    { background-color: var(--color-success-100); }
.bg-success-500    { background-color: var(--color-success-500); }
.bg-success-600    { background-color: var(--color-success-600); }

.bg-warning-50     { background-color: var(--color-warning-50); }
.bg-warning-100    { background-color: var(--color-warning-100); }
.bg-warning-500    { background-color: var(--color-warning-500); }
.bg-warning-600    { background-color: var(--color-warning-600); }

.bg-danger-50      { background-color: var(--color-danger-50); }
.bg-danger-100     { background-color: var(--color-danger-100); }
.bg-danger-500     { background-color: var(--color-danger-500); }
.bg-danger-600     { background-color: var(--color-danger-600); }

.bg-info-50        { background-color: var(--color-info-50); }
.bg-info-100       { background-color: var(--color-info-100); }
.bg-info-500       { background-color: var(--color-info-500); }
.bg-info-600       { background-color: var(--color-info-600); }

.bg-gray-50        { background-color: var(--color-gray-50); }
.bg-gray-100       { background-color: var(--color-gray-100); }
.bg-gray-200       { background-color: var(--color-gray-200); }
.bg-gray-300       { background-color: var(--color-gray-300); }
.bg-gray-800       { background-color: var(--color-gray-800); }
.bg-gray-900       { background-color: var(--color-gray-900); }

/* ----------------------------------------------------------
 * 8. Border — 边框
 * ---------------------------------------------------------- */
.border        { border: 1px solid var(--color-border); }
.border-0      { border: 0 !important; }
.border-2      { border-width: 2px; }
.border-t      { border-top: 1px solid var(--color-border); }
.border-b      { border-bottom: 1px solid var(--color-border); }
.border-l      { border-left: 1px solid var(--color-border); }
.border-r      { border-right: 1px solid var(--color-border); }
.border-t-0    { border-top: 0 !important; }
.border-b-0    { border-bottom: 0 !important; }
.border-l-0    { border-left: 0 !important; }
.border-r-0    { border-right: 0 !important; }

.border-primary   { border-color: var(--color-primary-500); }
.border-secondary { border-color: var(--color-text-secondary); }
.border-muted     { border-color: var(--color-text-muted); }
.border-success   { border-color: var(--color-success-500); }
.border-warning   { border-color: var(--color-warning-500); }
.border-danger    { border-color: var(--color-danger-500); }
.border-info      { border-color: var(--color-info-500); }

/* 圆角 */
.rounded-none { border-radius: var(--radius-none); }
.rounded-sm   { border-radius: var(--radius-sm); }
.rounded-md   { border-radius: var(--radius-md); }
.rounded-lg   { border-radius: var(--radius-lg); }
.rounded-xl   { border-radius: var(--radius-xl); }
.rounded-2xl  { border-radius: var(--radius-2xl); }
.rounded-full { border-radius: var(--radius-full); }
.rounded-t-md { border-top-left-radius: var(--radius-md); border-top-right-radius: var(--radius-md); }
.rounded-b-md { border-bottom-left-radius: var(--radius-md); border-bottom-right-radius: var(--radius-md); }

/* ----------------------------------------------------------
 * 9. Effects — 效果
 * ---------------------------------------------------------- */

/* 阴影 */
.shadow-none { box-shadow: none !important; }
.shadow-xs   { box-shadow: var(--shadow-xs); }
.shadow-sm   { box-shadow: var(--shadow-sm); }
.shadow-md   { box-shadow: var(--shadow-md); }
.shadow-lg   { box-shadow: var(--shadow-lg); }
.shadow-xl   { box-shadow: var(--shadow-xl); }
.shadow-2xl  { box-shadow: var(--shadow-2xl); }
.shadow-inner{ box-shadow: var(--shadow-inner); }

/* 透明度 */
.opacity-0   { opacity: 0; }
.opacity-25  { opacity: 0.25; }
.opacity-50  { opacity: 0.5; }
.opacity-75  { opacity: 0.75; }
.opacity-100 { opacity: 1; }

/* 溢出 */
.overflow-hidden { overflow: hidden; }
.overflow-visible { overflow: visible; }
.overflow-auto    { overflow: auto; }
.overflow-scroll  { overflow: scroll; }
.overflow-x-auto  { overflow-x: auto; }
.overflow-y-auto  { overflow-y: auto; }
.overflow-x-hidden{ overflow-x: hidden; }
.overflow-y-hidden{ overflow-y: hidden; }

/* 光标 */
.cursor-auto    { cursor: auto; }
.cursor-default  { cursor: default; }
.cursor-pointer  { cursor: pointer; }
.cursor-wait     { cursor: wait; }
.cursor-text     { cursor: text; }
.cursor-move     { cursor: move; }
.cursor-not-allowed { cursor: not-allowed; }
.cursor-grab     { cursor: grab; }
.cursor-grabbing { cursor: grabbing; }

/* 指针事件 */
.pointer-events-none { pointer-events: none; }
.pointer-events-auto { pointer-events: auto; }

/* 用户选择 */
.select-none  { user-select: none; }
.select-text  { user-select: text; }
.select-all   { user-select: all; }

/* ----------------------------------------------------------
 * 10. Transitions — 过渡动画
 * ---------------------------------------------------------- */
.transition        { transition-property: color, background-color, border-color, box-shadow; transition-duration: var(--transition-base); }
.transition-all    { transition-property: all; transition-duration: var(--transition-base); }
.transition-colors { transition-property: color, background-color, border-color; transition-duration: var(--transition-base); }
.transition-opacity{ transition-property: opacity; transition-duration: var(--transition-base); }
.transition-transform{ transition-property: transform; transition-duration: var(--transition-base); }
.transition-none   { transition-property: none; }

.duration-75   { transition-duration: 75ms; }
.duration-150  { transition-duration: 150ms; }
.duration-200  { transition-duration: 200ms; }
.duration-300  { transition-duration: 300ms; }
.duration-500  { transition-duration: 500ms; }
.duration-700  { transition-duration: 700ms; }
.duration-1000 { transition-duration: 1000ms; }

.ease-linear  { transition-timing-function: linear; }
.ease-in      { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
.ease-out     { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
.ease-in-out  { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }

/* ----------------------------------------------------------
 * 11. Transform — 变换
 * ---------------------------------------------------------- */
.scale-95  { transform: scale(0.95); }
.scale-100 { transform: scale(1); }
.scale-105 { transform: scale(1.05); }
.scale-110 { transform: scale(1.1); }

.rotate-0   { transform: rotate(0deg); }
.rotate-45  { transform: rotate(45deg); }
.rotate-90  { transform: rotate(90deg); }
.rotate-180 { transform: rotate(180deg); }

.translate-x-0   { transform: translateX(0); }
.translate-x-full{ transform: translateX(100%); }
.translate-x-neg-full{ transform: translateX(-100%); }
.translate-y-0   { transform: translateY(0); }
.translate-y-full{ transform: translateY(100%); }

/* ----------------------------------------------------------
 * 12. Position — 定位
 * ---------------------------------------------------------- */
.static    { position: static; }
.relative  { position: relative; }
.absolute  { position: absolute; }
.fixed     { position: fixed; }
.sticky    { position: sticky; }

.inset-0 { top: 0; right: 0; bottom: 0; left: 0; }
.inset-x-0 { left: 0; right: 0; }
.inset-y-0 { top: 0; bottom: 0; }

.top-0    { top: 0; }
.top-auto { top: auto; }
.right-0  { right: 0; }
.bottom-0 { bottom: 0; }
.left-0   { left: 0; }

.top-50   { top: 50%; }
.left-50  { left: 50%; }

/* Z-index */
.z-0   { z-index: 0; }
.z-10  { z-index: 10; }
.z-20  { z-index: 20; }
.z-30  { z-index: 30; }
.z-40  { z-index: 40; }
.z-50  { z-index: 50; }

/* ----------------------------------------------------------
 * 13. Visibility & Opacity — 可见性
 * ---------------------------------------------------------- */
.visible   { visibility: visible; }
.invisible { visibility: hidden; }

/* ----------------------------------------------------------
 * 14. 交互状态 — Hover / Focus / Active / Disabled
 * ---------------------------------------------------------- */

/* Hover */
.hover\:bg-primary-50:hover  { background-color: var(--color-primary-50); }
.hover\:bg-primary-100:hover { background-color: var(--color-primary-100); }
.hover\:bg-primary-500:hover { background-color: var(--color-primary-500); }
.hover\:bg-primary-600:hover { background-color: var(--color-primary-600); }
.hover\:bg-gray-100:hover    { background-color: var(--color-gray-100); }
.hover\:bg-gray-200:hover    { background-color: var(--color-gray-200); }
.hover\:shadow-sm:hover      { box-shadow: var(--shadow-sm); }
.hover\:shadow-md:hover      { box-shadow: var(--shadow-md); }
.hover\:shadow-lg:hover      { box-shadow: var(--shadow-lg); }
.hover\:opacity-80:hover     { opacity: 0.8; }
.hover\:scale-105:hover      { transform: scale(1.05); }
.hover\:translate-y-[-2px]:hover { transform: translateY(-2px); }

/* Focus */
.focus\:ring-2:focus       { outline: none; box-shadow: 0 0 0 2px var(--color-primary-500); }
.focus\:ring-primary:focus { outline: none; box-shadow: 0 0 0 3px rgba(247, 164, 29, 0.3); }
.focus\:ring-success:focus { outline: none; box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.3); }
.focus\:ring-danger:focus  { outline: none; box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.3); }
.focus\:outline-none:focus { outline: none; }

/* Active */
.active\:scale-95:active    { transform: scale(0.95); }
.active\:scale-100:active   { transform: scale(1); }
.active\:bg-primary-700:active { background-color: var(--color-primary-700); }

/* Disabled */
.disabled\:opacity-50:disabled  { opacity: 0.5; }
.disabled\:cursor-not-allowed:disabled { cursor: not-allowed; }
.disabled\:pointer-events-none:disabled { pointer-events: none; }

/* ----------------------------------------------------------
 * 15. Group 交互（父级 .group 控制子级）
 * ---------------------------------------------------------- */
.group:hover .group-hover\:opacity-100 { opacity: 1; }
.group:hover .group-hover\:opacity-0   { opacity: 0; }
.group:hover .group-hover\:visible     { visibility: visible; }
.group:hover .group-hover\:hidden      { visibility: hidden; }
.group:hover .group-hover\:translate-y-0 { transform: translateY(0); }
.group:hover .group-hover\:scale-110   { transform: scale(1.1); }
.group:hover .group-hover\:text-primary-600 { color: var(--color-primary-600); }

/* ----------------------------------------------------------
 * 16. 响应式断点
 * ---------------------------------------------------------- */

/* sm: >= 640px */
@media (min-width: 640px) {
  .sm\:d-none         { display: none !important; }
  .sm\:d-block        { display: block !important; }
  .sm\:d-flex         { display: flex !important; }
  .sm\:d-inline-flex  { display: inline-flex !important; }
  .sm\:d-grid         { display: grid !important; }
  .sm\:d-none         { display: none !important; }
  .sm\:flex-row       { flex-direction: row; }
  .sm\:flex-col       { flex-direction: column; }
  .sm\:flex-wrap      { flex-wrap: wrap; }
  .sm\:items-center   { align-items: center; }
  .sm\:justify-between{ justify-content: space-between; }
  .sm\:justify-center { justify-content: center; }
  .sm\:grid-cols-1    { grid-template-columns: repeat(1, minmax(0, 1fr)); }
  .sm\:grid-cols-2    { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .sm\:grid-cols-3    { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .sm\:grid-cols-4    { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .sm\:col-span-1     { grid-column: span 1 / span 1; }
  .sm\:col-span-2     { grid-column: span 2 / span 2; }
  .sm\:col-span-3     { grid-column: span 3 / span 3; }
  .sm\:col-span-4     { grid-column: span 4 / span 4; }
  .sm\:col-span-6     { grid-column: span 6 / span 6; }
  .sm\:col-span-12    { grid-column: span 12 / span 12; }
  .sm\:hidden         { display: none !important; }
  .sm\:m-0            { margin: 0 !important; }
  .sm\:mx-auto        { margin-left: auto !important; margin-right: auto !important; }
  .sm\:mt-0           { margin-top: 0 !important; }
  .sm\:mb-0           { margin-bottom: 0 !important; }
  .sm\:p-0            { padding: 0 !important; }
  .sm\:p-4            { padding: var(--space-4) !important; }
  .sm\:p-6            { padding: var(--space-6) !important; }
  .sm\:px-4           { padding-left: var(--space-4) !important; padding-right: var(--space-4) !important; }
  .sm\:px-6           { padding-left: var(--space-6) !important; padding-right: var(--space-6) !important; }
  .sm\:py-4           { padding-top: var(--space-4) !important; padding-bottom: var(--space-4) !important; }
  .sm\:text-left      { text-align: left; }
  .sm\:text-center    { text-align: center; }
  .sm\:text-right     { text-align: right; }
  .sm\:text-sm        { font-size: var(--text-sm); }
  .sm\:text-base      { font-size: var(--text-base); }
  .sm\:text-lg        { font-size: var(--text-lg); }
  .sm\:text-xl        { font-size: var(--text-xl); }
  .sm\:w-full         { width: 100%; }
  .sm\:w-auto         { width: auto; }
  .sm\:gap-4          { gap: var(--space-4); }
  .sm\:gap-6          { gap: var(--space-6); }
  .sm\:rounded-lg     { border-radius: var(--radius-lg); }
}

/* md: >= 768px */
@media (min-width: 768px) {
  .md\:d-none         { display: none !important; }
  .md\:d-block        { display: block !important; }
  .md\:d-flex         { display: flex !important; }
  .md\:d-inline-flex  { display: inline-flex !important; }
  .md\:d-grid         { display: grid !important; }
  .md\:flex-row       { flex-direction: row; }
  .md\:flex-col       { flex-direction: column; }
  .md\:items-center   { align-items: center; }
  .md\:justify-between{ justify-content: space-between; }
  .md\:justify-center { justify-content: center; }
  .md\:grid-cols-2    { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .md\:grid-cols-3    { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .md\:grid-cols-4    { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .md\:grid-cols-6    { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .md\:col-span-2     { grid-column: span 2 / span 2; }
  .md\:col-span-3     { grid-column: span 3 / span 3; }
  .md\:col-span-4     { grid-column: span 4 / span 4; }
  .md\:col-span-6     { grid-column: span 6 / span 6; }
  .md\:col-span-8     { grid-column: span 8 / span 8; }
  .md\:col-span-12    { grid-column: span 12 / span 12; }
  .md\:hidden         { display: none !important; }
  .md\:mx-auto        { margin-left: auto !important; margin-right: auto !important; }
  .md\:p-6            { padding: var(--space-6) !important; }
  .md\:p-8            { padding: var(--space-8) !important; }
  .md\:px-6           { padding-left: var(--space-6) !important; padding-right: var(--space-6) !important; }
  .md\:px-8           { padding-left: var(--space-8) !important; padding-right: var(--space-8) !important; }
  .md\:text-left      { text-align: left; }
  .md\:text-center    { text-align: center; }
  .md\:text-base      { font-size: var(--text-base); }
  .md\:text-lg        { font-size: var(--text-lg); }
  .md\:text-xl        { font-size: var(--text-xl); }
  .md\:text-2xl       { font-size: var(--text-2xl); }
  .md\:w-1\/2         { width: 50%; }
  .md\:w-1\/3         { width: 33.333333%; }
  .md\:w-2\/3         { width: 66.666667%; }
  .md\:w-full         { width: 100%; }
  .md\:gap-6          { gap: var(--space-6); }
  .md\:gap-8          { gap: var(--space-8); }
}

/* lg: >= 1024px */
@media (min-width: 1024px) {
  .lg\:d-none         { display: none !important; }
  .lg\:d-block        { display: block !important; }
  .lg\:d-flex         { display: flex !important; }
  .lg\:d-inline-flex  { display: inline-flex !important; }
  .lg\:d-grid         { display: grid !important; }
  .lg\:flex-row       { flex-direction: row; }
  .lg\:flex-col       { flex-direction: column; }
  .lg\:items-center   { align-items: center; }
  .lg\:justify-between{ justify-content: space-between; }
  .lg\:grid-cols-2    { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lg\:grid-cols-3    { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .lg\:grid-cols-4    { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .lg\:grid-cols-5    { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .lg\:grid-cols-6    { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .lg\:col-span-3     { grid-column: span 3 / span 3; }
  .lg\:col-span-4     { grid-column: span 4 / span 4; }
  .lg\:col-span-6     { grid-column: span 6 / span 6; }
  .lg\:col-span-8     { grid-column: span 8 / span 8; }
  .lg\:col-span-9     { grid-column: span 9 / span 9; }
  .lg\:col-span-12    { grid-column: span 12 / span 12; }
  .lg\:hidden         { display: none !important; }
  .lg\:mx-auto        { margin-left: auto !important; margin-right: auto !important; }
  .lg\:p-8            { padding: var(--space-8) !important; }
  .lg\:px-8           { padding-left: var(--space-8) !important; padding-right: var(--space-8) !important; }
  .lg\:text-left      { text-align: left; }
  .lg\:text-center    { text-align: center; }
  .lg\:text-lg        { font-size: var(--text-lg); }
  .lg\:text-xl        { font-size: var(--text-xl); }
  .lg\:text-2xl       { font-size: var(--text-2xl); }
  .lg\:text-3xl       { font-size: var(--text-3xl); }
  .lg\:w-1\/4         { width: 25%; }
  .lg\:w-1\/3         { width: 33.333333%; }
  .lg\:w-3\/4         { width: 75%; }
  .lg\:gap-8          { gap: var(--space-8); }
}

/* xl: >= 1280px */
@media (min-width: 1280px) {
  .xl\:d-none         { display: none !important; }
  .xl\:d-block        { display: block !important; }
  .xl\:d-flex         { display: flex !important; }
  .xl\:d-grid         { display: grid !important; }
  .xl\:flex-row       { flex-direction: row; }
  .xl\:items-center   { align-items: center; }
  .xl\:justify-between{ justify-content: space-between; }
  .xl\:grid-cols-4    { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .xl\:grid-cols-5    { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .xl\:grid-cols-6    { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .xl\:col-span-4     { grid-column: span 4 / span 4; }
  .xl\:col-span-6     { grid-column: span 6 / span 6; }
  .xl\:col-span-8     { grid-column: span 8 / span 8; }
  .xl\:col-span-12    { grid-column: span 12 / span 12; }
  .xl\:hidden         { display: none !important; }
  .xl\:px-8           { padding-left: var(--space-8) !important; padding-right: var(--space-8) !important; }
  .xl\:text-3xl       { font-size: var(--text-3xl); }
  .xl\:text-4xl       { font-size: var(--text-4xl); }
}

/* ----------------------------------------------------------
 * 17. 辅助功能
 * ---------------------------------------------------------- */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

.not-sr-only {
  position: static;
  width: auto;
  height: auto;
  padding: 0;
  margin: 0;
  overflow: visible;
  clip: auto;
  white-space: normal;
}

/* ----------------------------------------------------------
 * 18. 滚动条美化
 * ---------------------------------------------------------- */
.scrollbar-thin::-webkit-scrollbar {
  width: 6px;
  height: 6px;
}

.scrollbar-thin::-webkit-scrollbar-track {
  background: transparent;
}

.scrollbar-thin::-webkit-scrollbar-thumb {
  background-color: var(--color-gray-300);
  border-radius: var(--radius-full);
}

.scrollbar-thin::-webkit-scrollbar-thumb:hover {
  background-color: var(--color-gray-400);
}

.dark .scrollbar-thin::-webkit-scrollbar-thumb {
  background-color: var(--dark-border);
}

.dark .scrollbar-thin::-webkit-scrollbar-thumb:hover {
  background-color: var(--dark-text-muted);
}
