Files
wordpress-theme-aksrt/assets/css/admin/tickets.css
T
kate522andClaude Fable 5 4083613dbe fix(admin): scroll ticket notes inside their card instead of the whole sidebar
Keep ticket info at its natural height and let the internal notes card fill
the remaining sidebar height, so only the notes list scrolls.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-10-31 15:34:24 +08:00

183 lines
18 KiB
CSS

/* 工单运营页:列表与处理工作区(?id=)为页内视图,代客提交与内部备注为原生 dialog。复用 NativeUi 令牌。 */
.aksrt-tickets-admin__toolbar { display: flex; flex-direction: column; gap: 14px; padding: 20px; }
.aksrt-tickets-admin__toolbar .subsubsub { margin: 0; padding: 0; box-shadow: none; }
.aksrt-tickets-admin__table { min-width: 1000px; table-layout: fixed; }
.aksrt-tickets-admin__table .column-title { width: 29%; }
.aksrt-tickets-admin__table .column-status { width: 11%; }
.aksrt-tickets-admin__table .column-type { width: 9%; }
.aksrt-tickets-admin__table .column-user { width: 13%; }
.aksrt-tickets-admin__table .column-admin { width: 10%; }
.aksrt-tickets-admin__table .column-time { width: 18%; }
.aksrt-tickets-admin__table .column-actions { width: 10%; }
.aksrt-tickets-admin__table .row-title { display: inline; font-size: 14px; font-weight: 600; line-height: 1.6; overflow-wrap: anywhere; }
.aksrt-tickets-admin__sub { margin-top: 4px; color: var(--an-text-2); font-size: 12px; overflow-wrap: anywhere; }
.aksrt-native .aksrt-tickets-admin__row.is-awaiting td:first-child { box-shadow: inset 3px 0 0 var(--an-primary); }
.aksrt-ticket-hint { color: var(--an-muted); font-size: 12px; font-weight: 400; }
.aksrt-ticket-pill { display: inline-flex; align-items: center; min-width: 18px; height: 18px; padding: 0 6px; color: var(--an-text-2); background: var(--an-bg-soft); border-radius: 9px; font-size: 11px; font-weight: 500; line-height: 1; justify-content: center; font-variant-numeric: tabular-nums; vertical-align: 1px; }
.aksrt-ticket-dot { display: inline-block; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--aksrt-ticket-color); }
.aksrt-ticket-badge { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; color: var(--an-text); background: var(--an-bg-soft); border: 1px solid var(--an-border); border-radius: 6px; font-size: 12px; line-height: 20px; white-space: nowrap; }
.aksrt-ticket-badge::before { content: ""; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--aksrt-ticket-color, var(--an-muted)); }
.aksrt-ticket-urge { display: inline-block; padding: 1px 6px; color: var(--an-danger); background: #fdf0f2; border-radius: 4px; font-size: 12px; white-space: nowrap; }
.aksrt-ticket-user { display: inline-flex; align-items: center; gap: 7px; max-width: 100%; color: var(--an-text); text-decoration: none; }
.aksrt-ticket-user img { flex: none; border-radius: 50%; }
.aksrt-ticket-user span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 工作区与代客提交弹窗共用:页头、提交反馈与表单控件。 */
.aksrt-tickets-admin__detail-header .aksrt-native-header__title { overflow-wrap: anywhere; }
.aksrt-tickets-admin__detail-header .aksrt-native-header__desc { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.aksrt-tickets-admin [hidden] { display: none !important; }
.aksrt-tickets-admin textarea { box-sizing: border-box; width: 100%; min-height: 64px; resize: vertical; line-height: 1.65; }
.aksrt-tickets-admin :is(input, select, textarea, button, a, summary):focus-visible,
.aksrt-ticket-conversation__scroll:focus-visible { outline: 2px solid var(--an-primary); outline-offset: 2px; box-shadow: none; }
.aksrt-tickets-admin button:disabled { cursor: default; opacity: .6; }
.aksrt-ticket-feedback { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 16px; padding: 10px 16px; color: #176b3d; background: var(--an-primary-soft); border: 1px solid color-mix(in srgb, var(--an-primary) 18%, transparent); border-radius: var(--an-radius-sm); font-size: 13px; }
.aksrt-ticket-feedback p { margin: 0; }
.aksrt-ticket-feedback.is-error { color: #a61b36; background: #fdf0f2; border-color: #f6d3da; }
.aksrt-ticket-feedback .button { flex: none; }
/* 代客提交:原生 top layer 弹窗,头尾固定,仅正文滚动。 */
.aksrt-ticket-dialog { box-sizing: border-box; width: min(720px, calc(100vw - 48px)); max-width: none; max-height: calc(100dvh - 48px); margin: auto; padding: 0; color: var(--an-text); background: var(--an-card); border: 0; border-radius: var(--an-radius); box-shadow: 0 12px 32px rgba(15, 23, 42, .12), 0 32px 80px rgba(15, 23, 42, .16); overflow: hidden; font: inherit; }
.aksrt-ticket-dialog:not([open]) { display: none; }
.aksrt-ticket-dialog::backdrop { background: rgba(15, 23, 42, .45); }
.aksrt-ticket-dialog__frame { display: flex; flex-direction: column; max-height: calc(100dvh - 48px); margin: 0; }
.aksrt-ticket-dialog__head { display: flex; flex: none; align-items: flex-start; justify-content: space-between; gap: 20px; padding: 18px 24px; border-bottom: 1px solid var(--an-border-soft); }
.aksrt-ticket-dialog__head h2 { margin: 0; font-size: 18px; font-weight: 600; line-height: 1.5; }
.aksrt-ticket-dialog__head h2:focus { outline: 0; }
.aksrt-ticket-dialog__head p { margin: 4px 0 0; color: var(--an-muted); font-size: 12px; }
.aksrt-ticket-dialog__close { display: inline-flex; flex: none; align-items: center; justify-content: center; width: 32px; height: 32px; margin: -2px -6px 0 0; padding: 0; color: var(--an-muted); background: transparent; border: 0; border-radius: 8px; cursor: pointer; }
.aksrt-ticket-dialog__close:hover { color: var(--an-text); background: var(--an-bg-soft); }
.aksrt-ticket-dialog__body { min-height: 0; padding: 20px 24px; overflow-y: auto; overscroll-behavior: contain; }
.aksrt-ticket-dialog__foot { display: flex; flex: none; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 10px; padding: 14px 24px; border-top: 1px solid var(--an-border-soft); }
.aksrt-ticket-dialog__foot > .aksrt-ticket-hint { margin-right: auto; }
/* 处理工作区:会话与回复在左,处理信息与内部备注在右。 */
/* 主内容与侧栏共用同一个面板高度:会话面板固定为该高度,侧栏最多到该高度、超出时栏内滚动,两栏顶边和底边对齐。 */
.aksrt-ticket-detail { --aksrt-ticket-pane-height: max(460px, calc(100vh - 200px)); display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 16px; align-items: start; }
.aksrt-ticket-detail__main,
.aksrt-ticket-detail__side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
/* 侧栏固定为面板高度且自身不滚动:工单信息按内容高度完整显示,内部备注占满剩余高度,只有备注列表在卡片内滚动。
仅当视口极矮、两张卡片的最小高度之和仍放不下时,才退回到侧栏整体滚动,避免内容被裁掉。 */
.aksrt-ticket-detail__side { height: var(--aksrt-ticket-pane-height); overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }
.aksrt-ticket-detail__side > .aksrt-ticket-detail__card { flex: none; }
.aksrt-ticket-detail__side > .aksrt-ticket-detail__private { display: flex; flex: 1 1 auto; flex-direction: column; min-height: 160px; }
.aksrt-ticket-conversation,
.aksrt-ticket-detail__card { background: var(--an-card); border: 1px solid var(--an-border); border-radius: var(--an-radius); }
/* 会话面板(IM 式):头部、时间线、回复框同属一张卡片;卡片高度跟随视口,开屏即可看到回复框与发送按钮,只有时间线滚动。 */
.aksrt-ticket-conversation { display: flex; flex-direction: column; height: var(--aksrt-ticket-pane-height); overflow: hidden; }
.aksrt-ticket-detail__card { padding: 16px; }
.aksrt-ticket-section-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 14px; }
.aksrt-ticket-section-head h3 { display: inline-flex; align-items: center; gap: 6px; margin: 0; color: var(--an-text); font-size: 14px; font-weight: 600; }
.aksrt-ticket-section-head .button-link { font-size: 12px; text-decoration: none; }
.aksrt-ticket-conversation > .aksrt-ticket-section-head { flex: none; margin: 0; padding: 12px 16px; border-bottom: 1px solid var(--an-border-soft); }
/* 会话时间线:用户在左、客服在右、系统事件居中。 */
.aksrt-ticket-conversation__scroll { flex: 1 1 auto; min-height: 0; padding: 20px 16px; background: var(--an-bg-soft); overflow-y: auto; overscroll-behavior: contain; }
.aksrt-ticket-detail__thread { display: flex; flex-direction: column; gap: 18px; margin: 0; padding: 0; list-style: none; }
.aksrt-ticket-detail__message { display: flex; align-items: flex-start; gap: 10px; max-width: 86%; margin: 0; }
.aksrt-ticket-detail__message.is-admin { flex-direction: row-reverse; align-self: flex-end; }
.aksrt-ticket-detail__message.is-origin { max-width: none; }
.aksrt-ticket-detail__avatar { flex: none; width: 32px; height: 32px; background: var(--an-border); border-radius: 50%; object-fit: cover; }
.aksrt-ticket-detail__bubble { min-width: 0; padding: 10px 14px 12px; background: var(--an-card); border: 1px solid var(--an-border); border-radius: 4px 12px 12px 12px; }
.aksrt-ticket-detail__message.is-admin .aksrt-ticket-detail__bubble { background: var(--an-primary-soft); border-color: color-mix(in srgb, var(--an-primary) 20%, transparent); border-radius: 12px 4px 12px 12px; }
.aksrt-ticket-detail__message.is-origin .aksrt-ticket-detail__bubble { flex: 1; background: var(--an-card); border-color: var(--an-border); border-left: 3px solid var(--an-info); border-radius: 4px 12px 12px 12px; }
.aksrt-ticket-detail__meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; margin-bottom: 6px; font-size: 12px; }
.aksrt-ticket-detail__message.is-admin .aksrt-ticket-detail__meta { flex-direction: row-reverse; }
.aksrt-ticket-detail__meta strong { color: var(--an-text); font-weight: 600; overflow-wrap: anywhere; }
.aksrt-ticket-detail__role { padding: 0 6px; color: var(--an-text-2); background: rgba(15, 23, 42, .05); border-radius: 4px; line-height: 18px; }
.aksrt-ticket-detail__meta time { color: var(--an-muted); font-variant-numeric: tabular-nums; }
.aksrt-ticket-detail__body { color: var(--an-text); overflow-wrap: anywhere; line-height: 1.7; }
.aksrt-ticket-detail__body > p { margin: 0 0 .6em; }
.aksrt-ticket-detail__body > p:last-child { margin-bottom: 0; }
.aksrt-ticket-detail__empty,
.aksrt-ticket-detail__event { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 10px; margin: 0; color: var(--an-muted); font-size: 12px; text-align: center; }
.aksrt-ticket-detail__event::before,
.aksrt-ticket-detail__event::after { content: ""; flex: 1 1 24px; max-width: 80px; height: 1px; background: var(--an-border); }
.aksrt-ticket-detail__quote { margin: 0 0 8px; padding: 6px 10px; color: var(--an-text-2); background: rgba(15, 23, 42, .04); border-left: 3px solid var(--an-border); border-radius: 0 6px 6px 0; font-size: 12px; white-space: pre-line; overflow-wrap: anywhere; }
.aksrt-ticket-detail__attachments { display: flex; flex-wrap: wrap; gap: 8px; margin: 10px 0 0; padding: 0; list-style: none; }
.aksrt-ticket-detail__attachments li { margin: 0; }
.aksrt-ticket-detail__attachments a { display: block; border-radius: 8px; transition: transform .15s; }
.aksrt-ticket-detail__attachments a:hover { transform: translateY(-1px); }
.aksrt-ticket-detail__attachments img { display: block; width: 72px; height: 72px; object-fit: cover; border: 1px solid var(--an-border); border-radius: 8px; }
/* 回复框:固定在会话卡片底部,文本框与工具栏合成一个可聚焦整体。 */
.aksrt-ticket-composer { flex: none; margin: 0; padding: 12px 16px 14px; background: var(--an-card); border-top: 1px solid var(--an-border-soft); }
.aksrt-ticket-composer textarea { max-height: 30vh; }
.aksrt-ticket-composer__bar .button .dashicons { margin: 0 4px 0 -2px; font-size: 16px; width: 16px; height: 16px; vertical-align: -3px; }
.aksrt-ticket-composer__shortcut { margin-left: auto; }
.aksrt-ticket-composer__shortcut + .aksrt-ticket-counter { margin-left: 0; }
.aksrt-ticket-composer__box { background: var(--an-card); border: 1px solid var(--an-border); border-radius: var(--an-radius-sm); transition: border-color .15s, box-shadow .15s; }
.aksrt-ticket-composer__box:focus-within { border-color: var(--an-primary); box-shadow: 0 0 0 2px color-mix(in srgb, var(--an-primary) 18%, transparent); }
.aksrt-native .aksrt-ticket-composer__box textarea { display: block; padding: 10px 12px; background: transparent; border: 0; border-radius: var(--an-radius-sm) var(--an-radius-sm) 0 0; box-shadow: none; }
.aksrt-native .aksrt-ticket-composer__box textarea:focus,
.aksrt-tickets-admin .aksrt-ticket-composer__box textarea:focus-visible { outline: 0; box-shadow: none; }
.aksrt-ticket-composer__bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 8px 8px 10px; border-top: 1px solid var(--an-border-soft); }
.aksrt-ticket-composer__bar select { max-width: min(240px, 100%); min-height: 30px; font-size: 12px; }
.aksrt-ticket-counter { margin-left: auto; color: var(--an-muted); font-size: 12px; font-variant-numeric: tabular-nums; }
.aksrt-ticket-counter.is-over { color: var(--an-danger); }
.aksrt-native-field .aksrt-ticket-counter { align-self: flex-end; }
.aksrt-ticket-detail__closed { display: flex; flex: none; align-items: center; gap: 8px; margin: 0; padding: 14px 16px; color: var(--an-text-2); background: var(--an-card); border-top: 1px solid var(--an-border-soft); font-size: 13px; }
.aksrt-ticket-detail__closed .dashicons { flex: none; color: var(--an-muted); }
/* 工单信息:标签列固定宽度,可编辑项直接内联。 */
.aksrt-ticket-detail__info { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: 10px 12px; align-items: center; margin: 0; font-size: 13px; }
.aksrt-ticket-detail__info dt { color: var(--an-muted); font-size: 12px; }
.aksrt-ticket-detail__info dd { margin: 0; min-width: 0; color: var(--an-text); overflow-wrap: anywhere; }
.aksrt-ticket-detail__status-form { display: flex; flex-direction: column; gap: 14px; }
.aksrt-ticket-detail__status-form select { width: 100%; max-width: none; }
.aksrt-ticket-detail__status-form > .button { align-self: stretch; justify-content: center; }
.aksrt-ticket-close-warning { padding: 10px 12px; color: #9d2038; background: #fdf0f2; border: 1px solid #f6d3da; border-radius: var(--an-radius-sm); font-size: 12px; }
.aksrt-ticket-close-warning label { display: flex; align-items: flex-start; gap: 6px; line-height: 1.6; }
.aksrt-ticket-close-warning input { flex: none; margin: 3px 0 0; }
/* 内部备注:暖色便签,与对用户可见的会话区分。 */
.aksrt-ticket-detail__private { background: #fffbf0; border-color: #f3e2b6; }
.aksrt-ticket-detail__private .aksrt-ticket-section-head { margin-bottom: 4px; }
.aksrt-ticket-detail__private > .aksrt-ticket-hint { margin: 0 0 12px; color: #a26b07; }
.aksrt-ticket-detail__private > .aksrt-ticket-section-head,
.aksrt-ticket-detail__private > .aksrt-ticket-hint { flex: none; }
.aksrt-ticket-detail__notes { flex: 1 1 auto; min-height: 0; margin: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }
.aksrt-ticket-detail__notes ol { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.aksrt-ticket-detail__notes-older { margin-bottom: 8px; }
.aksrt-ticket-detail__notes-older > summary { display: flex; align-items: center; gap: 6px; padding: 2px 0; color: #a26b07; font-size: 12px; cursor: pointer; list-style: none; }
.aksrt-ticket-detail__notes-older > summary::-webkit-details-marker { display: none; }
.aksrt-ticket-detail__notes-older > summary::before { content: ""; flex: none; width: 5px; height: 5px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(-45deg); transition: transform .15s; }
.aksrt-ticket-detail__notes-older[open] > summary::before { transform: rotate(45deg); }
.aksrt-ticket-detail__notes-older > summary:hover { color: #7a5005; }
.aksrt-ticket-detail__notes-older > ol { margin-top: 8px; }
.aksrt-ticket-detail__notes li { margin: 0; padding: 8px 10px; background: var(--an-card); border: 1px solid #f3e2b6; border-radius: var(--an-radius-sm); font-size: 13px; line-height: 1.6; overflow-wrap: anywhere; }
.aksrt-ticket-detail__note-head { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px; margin-bottom: 4px; font-size: 12px; }
.aksrt-ticket-detail__note-head time { color: var(--an-muted); font-variant-numeric: tabular-nums; }
.aksrt-ticket-detail__private .aksrt-ticket-section-head .button .dashicons { margin: 0 2px 0 -4px; font-size: 14px; width: 14px; height: 14px; vertical-align: -2px; }
.aksrt-ticket-detail__notes-empty { margin: 0; color: var(--an-muted); font-size: 12px; }
/* 内部备注弹窗:窄版,计数器右对齐在输入框下方。 */
.aksrt-ticket-dialog--note { width: min(560px, calc(100vw - 48px)); }
.aksrt-ticket-dialog__counter { display: block; margin-top: 6px; text-align: right; }
@media (max-width: 960px) {
.aksrt-ticket-detail { grid-template-columns: minmax(0, 1fr); }
/* 单列时侧栏按内容高度排在会话下方,备注列表恢复独立的高度上限。 */
.aksrt-ticket-detail__side { height: auto; overflow: visible; }
.aksrt-ticket-detail__side > .aksrt-ticket-detail__private { flex: none; min-height: 0; }
.aksrt-ticket-detail__notes { max-height: 320px; }
}
@media (max-width: 600px) {
.aksrt-ticket-detail { --aksrt-ticket-pane-height: max(400px, calc(100vh - 160px)); }
.aksrt-ticket-conversation__scroll { padding: 14px 12px; }
.aksrt-ticket-composer { padding: 10px 12px 12px; }
.aksrt-ticket-composer__shortcut { display: none; }
.aksrt-ticket-detail__message { max-width: 100%; }
.aksrt-ticket-detail__avatar { width: 28px; height: 28px; }
.aksrt-ticket-composer__bar select { flex-basis: 100%; max-width: 100%; }
.aksrt-ticket-feedback { align-items: flex-start; flex-direction: column; }
.aksrt-ticket-dialog { width: calc(100vw - 16px); max-height: calc(100dvh - 16px); }
.aksrt-ticket-dialog__frame { max-height: calc(100dvh - 16px); }
.aksrt-ticket-dialog__head,
.aksrt-ticket-dialog__body,
.aksrt-ticket-dialog__foot { padding: 12px 14px; }
.aksrt-ticket-dialog__foot > .aksrt-ticket-hint { flex-basis: 100%; }
}
@media (prefers-reduced-motion: reduce) {
.aksrt-tickets-admin *, .aksrt-tickets-admin *::before { scroll-behavior: auto !important; transition: none !important; animation: none !important; }
}