/* Kole UI Mobile · Popover 样式 — 对齐移动端规格 §41 弹出气泡:由**触发元素定位**——根是 position: relative 的包一层,气泡在其中绝对定位, 所以气泡永远贴着它自己的触发器,不铺满视口(这不是 toast/overlay 那种全屏浮层)。 四个方向靠 placement 修饰符切换;箭头是纯 CSS 三角形(border 拼出,无图片、无 hex)。 点击外部关闭由宿主(或演示页脚本)判定:气泡是绝对定位的普通元素,没有遮罩可以依赖。 */ .kole-m-popover { --kole-m-popover-gap: var(--kole-space-8); --kole-m-popover-arrow: 5px; --kole-m-popover-max-width: 240px; position: relative; display: inline-flex; flex-direction: column; align-items: flex-start; font-family: var(--kole-font-family); font-size: var(--kole-m-font-size-label); line-height: 1.5; } .kole-m-popover__panel { position: absolute; z-index: 1200; box-sizing: border-box; max-width: var(--kole-m-popover-max-width); padding: var(--kole-space-8) var(--kole-space-12); border-radius: var(--kole-radius-medium); background: var(--kole-color-card-bg); color: var(--kole-color-text-body); box-shadow: var(--kole-shadow-medium); text-align: start; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity var(--kole-duration-fast) var(--kole-ease-out), visibility var(--kole-duration-fast) var(--kole-ease-out); } .kole-m-popover__panel.is-open { opacity: 1; visibility: visible; pointer-events: auto; } /* 变体 placement:四个方向(面板贴着触发器的那一侧) */ .kole-m-popover__panel--top { left: 0; bottom: calc(100% + var(--kole-m-popover-gap)); } .kole-m-popover__panel--bottom { left: 0; top: calc(100% + var(--kole-m-popover-gap)); } .kole-m-popover__panel--left { right: calc(100% + var(--kole-m-popover-gap)); top: 0; } .kole-m-popover__panel--right { left: calc(100% + var(--kole-m-popover-gap)); top: 0; } /* 变体 arrow=true:指向触发器的小三角(border 拼出,颜色取卡片底) */ .kole-m-popover__panel--arrow::after { content: ''; position: absolute; width: 0; height: 0; border: var(--kole-m-popover-arrow) solid transparent; pointer-events: none; } .kole-m-popover__panel--arrow.kole-m-popover__panel--top::after { left: var(--kole-space-16); top: 100%; border-top-color: var(--kole-color-card-bg); } .kole-m-popover__panel--arrow.kole-m-popover__panel--bottom::after { left: var(--kole-space-16); bottom: 100%; border-bottom-color: var(--kole-color-card-bg); } .kole-m-popover__panel--arrow.kole-m-popover__panel--left::after { top: var(--kole-space-16); left: 100%; border-left-color: var(--kole-color-card-bg); } .kole-m-popover__panel--arrow.kole-m-popover__panel--right::after { top: var(--kole-space-16); right: 100%; border-right-color: var(--kole-color-card-bg); } .kole-m-popover__title { margin: 0 0 var(--kole-space-4); font-size: var(--kole-m-font-size-label); font-weight: 500; color: var(--kole-color-text-title); } .kole-m-popover__text { margin: 0; } /* 触发器:宿主提供的可点元素(原生 button / a);热区 ≥ 44px、可聚焦、有焦点环 */ .kole-m-popover__trigger { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; min-height: var(--kole-m-touch-target); padding: 0 var(--kole-space-12); border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base); background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-family: inherit; font-size: var(--kole-m-font-size-label); line-height: 1; cursor: pointer; touch-action: manipulation; } .kole-m-popover__trigger:active { background: var(--kole-color-table-header-bg); } .kole-m-popover__trigger:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: -2px; } .kole-m-popover__trigger[aria-expanded="true"] { border-color: var(--kole-color-brand); color: var(--kole-color-brand); } @media (prefers-reduced-motion: reduce) { .kole-m-popover__panel { transition: none; } }