岗位会商样式修改

This commit is contained in:
董宏凯 committed 2026-08-02 15:33:26 +08:00
1 parent a0a75a9964
commit 1ffead7ee2
5 files changed
+275 -30

No files matched your search

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><defs><style>.a{fill:#fff;opacity:0;}.b,.c{fill:none;stroke:#fff;stroke-linejoin:round;}.b{stroke-linecap:round;}</style></defs><g transform="translate(-1)"><rect class="a" width="16" height="16" transform="translate(1)"/><path class="b" d="M7,42H19" transform="translate(-4 -28)"/><path class="b" d="M0,0H3" transform="translate(9.848 3.848) rotate(45)"/><path class="c" d="M11,12.907v2.427h2.439l6.894-6.9L17.9,6Z" transform="translate(-6.667 -4)"/></g></svg>

After

Width:  |  Height:  |  Size: 545 B

@@ -97,6 +97,7 @@ export function getPositionDemoTask(): PositionTask {
direction: String(task.direction ?? ""), direction: String(task.direction ?? ""),
source: String(task.source ?? "演示数据"), source: String(task.source ?? "演示数据"),
issuedAt: String(task.issuedAt ?? ""), issuedAt: String(task.issuedAt ?? ""),
priority: String(task.priority ?? "紧急"),
}; };
} }
@@ -13,6 +13,7 @@ export interface PositionTask {
direction: string; direction: string;
source: string; source: string;
issuedAt: string; issuedAt: string;
priority?: string;
} }
export const MOCK_POSITION_TASKS: readonly PositionTask[] = [ export const MOCK_POSITION_TASKS: readonly PositionTask[] = [
@@ -53,6 +54,7 @@ export function taskFromPositionSnapshot(
title: value(["title", "taskName", "name"], fallback.title), title: value(["title", "taskName", "name"], fallback.title),
description: value(["description", "taskContent", "overview", "content"], fallback.description), description: value(["description", "taskContent", "overview", "content"], fallback.description),
direction: value(["direction", "taskDirection", "category"], fallback.direction), direction: value(["direction", "taskDirection", "category"], fallback.direction),
priority: value(["priority", "level", "urgency"], fallback.priority ?? "紧急"),
source: (() => { source: (() => {
const source = value(["source", "taskSource", "sourceName"], fallback.source); const source = value(["source", "taskSource", "sourceName"], fallback.source);
return source === "mock" ? "本系统创建" : source; return source === "mock" ? "本系统创建" : source;
@@ -74,6 +74,7 @@ import { textOfMessage } from "@/core/threads/utils";
import { desensitize } from "@/lib/desensitize"; import { desensitize } from "@/lib/desensitize";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import expandLogo from "@/assets/position-roundtable/expand-logo.svg"; import expandLogo from "@/assets/position-roundtable/expand-logo.svg";
import editTaskIcon from "@/assets/position-roundtable/edit-task.svg";
import { listChains } from "@/roundtable-planning/api/chains"; import { listChains } from "@/roundtable-planning/api/chains";
import { Step1Panel } from "@/roundtable-planning/components/Step1Panel"; import { Step1Panel } from "@/roundtable-planning/components/Step1Panel";
import { PositionIntentInput } from "@/position-roundtable/components/PositionIntentInput"; import { PositionIntentInput } from "@/position-roundtable/components/PositionIntentInput";
@@ -1071,6 +1072,7 @@ export default function PositionRoundtablePage({
const nextTask: PositionTask = { const nextTask: PositionTask = {
...task, ...task,
title, title,
priority: taskDraft.priority?.trim() || task.priority || "紧急",
description: taskDraft.description.trim(), description: taskDraft.description.trim(),
direction: taskDraft.direction.trim() || task.direction, direction: taskDraft.direction.trim() || task.direction,
source: taskDraft.source.trim() || task.source, source: taskDraft.source.trim() || task.source,
@@ -2594,34 +2596,33 @@ export default function PositionRoundtablePage({
<aside <aside
aria-hidden={leftSidebarHidden || undefined} aria-hidden={leftSidebarHidden || undefined}
className={cn( className={cn(
"position-roundtable-sidebar-scrollbar custom-scrollbar relative flex min-h-0 shrink-0 flex-col gap-3 overflow-y-auto rounded-2xl border border-slate-200 bg-white shadow-sm transition-[width,opacity,transform,padding,border-width] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none dark:rounded-none dark:border-0 dark:bg-transparent dark:text-[#c5cfe0] dark:shadow-none", "position-roundtable-sidebar-scrollbar custom-scrollbar relative flex min-h-0 shrink-0 flex-col gap-3 overflow-y-auto rounded-2xl border border-slate-200 shadow-sm transition-[width,opacity,transform,padding,border-width] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none dark:rounded-none dark:border-0 dark:bg-transparent dark:text-[#c5cfe0] dark:shadow-none",
leftSidebarHidden leftSidebarHidden
? "w-0 translate-x-4 !border-0 !p-0 opacity-0 pointer-events-none" ? "w-0 translate-x-4 !border-0 !p-0 opacity-0 pointer-events-none"
: "w-[360px] translate-x-0 p-3 opacity-100 dark:p-0", : "w-[360px] translate-x-0 p-3 opacity-100 dark:p-0",
)} )}
> >
<TaskAnalysisPanel {activePosition.isIntentPosition && !isIntelligenceDeliveryOverview && (
task={task} <PositionRoundtableEntrySidebar
intent={frozenIntent ?? intent.intentReady} task={task}
taskEditable={!isArchivedSession} editable={!isArchivedSession}
intentEditable={!isArchivedSession} onEditTask={openTaskEditor}
onEditTask={openTaskEditor} chains={chains}
onEditIntent={openIntentEditor} loading={chainsLoading}
collapsed={false} value={selectedChainId}
onCollapsedChange={setLeftPanelCollapsed} onChange={setSelectedChainId}
className="min-h-full" onConfigure={openPositionConfig}
> />
{activePosition.isIntentPosition && !isIntelligenceDeliveryOverview && ( )}
<BusinessChainSelector {(!activePosition.isIntentPosition || isIntelligenceDeliveryOverview) && (
chains={chains} <>
loading={chainsLoading} <TaskInformationCard
value={selectedChainId} task={task}
onChange={setSelectedChainId} editable={!isArchivedSession}
onConfigure={openPositionConfig} onEdit={openTaskEditor}
className="min-h-0 flex-1" collapsed={false}
onCollapsedChange={() => undefined}
/> />
)}
{(!activePosition.isIntentPosition || isIntelligenceDeliveryOverview) && (
<BusinessChainFlow <BusinessChainFlow
chain={activeChain} chain={activeChain}
nodes={positionSession?.nodes ?? []} nodes={positionSession?.nodes ?? []}
@@ -2630,8 +2631,8 @@ export default function PositionRoundtablePage({
onSelectSeat={openSeatFlowDetail} onSelectSeat={openSeatFlowDetail}
embedded embedded
/> />
)} </>
</TaskAnalysisPanel> )}
</aside> </aside>
{leftSidebarHidden && ( {leftSidebarHidden && (
@@ -3878,6 +3879,82 @@ function TaskAnalysisPanel({
); );
} }
function PositionRoundtableEntrySidebar({
task,
editable,
onEditTask,
chains,
loading,
value,
onChange,
onConfigure,
}: {
task: PositionTask;
editable: boolean;
onEditTask: () => void;
chains: BusinessChain[];
loading: boolean;
value: string;
onChange: (value: string) => void;
onConfigure: (chainId: string) => void;
}) {
const displayDescription =
task.id === DEFAULT_MOCK_POSITION_TASK_ID
? "围绕暑期活动的游泳夏令营开展宣传,结合线上线下渠道吸引目标人群参与,持续提升活动影响力。"
: desensitize(task.description);
return (
<div className="position-roundtable-entry-sidebar">
<section className="position-roundtable-entry-task-card">
{editable && (
<button type="button" className="position-roundtable-entry-edit" onClick={onEditTask} aria-label="编辑任务信息">
<img src={editTaskIcon} alt="" />
</button>
)}
<h2 title={desensitize(task.title)}>{desensitize(task.title)}</h2>
<div className="position-roundtable-entry-tags">
<span>{desensitize(task.priority || "紧急")}</span>
<span>{desensitize(task.source)}</span>
<span>{desensitize(task.direction)}</span>
</div>
<p>{desensitize(task.description)}</p>
</section>
<section className="position-roundtable-entry-chain-card">
<header>
<span aria-hidden="true" />
<h2>作业链条选择</h2>
<b>{chains.length}</b>
</header>
<div className="position-roundtable-entry-chain-list">
{loading ? (
<div className="position-roundtable-entry-empty"><Loader2 className="size-4 animate-spin" />正在加载作业链条…</div>
) : chains.length === 0 ? (
<div className="position-roundtable-entry-empty">暂无可用作业链条</div>
) : (
chains.map((chain) => {
const selected = chain.id === value;
return (
<article key={chain.id} className={selected ? "is-selected" : undefined}>
<button type="button" onClick={() => onChange(selected ? "" : chain.id)} aria-pressed={selected}>
<i aria-hidden="true" />
<span>{desensitize(chain.title)}</span>
<em>{chain.seats.length} 席</em>
<small>{desensitize(chain.description || "点击选择该业务链")}</small>
</button>
<button type="button" className="position-roundtable-entry-config" onClick={() => onConfigure(chain.id)} aria-label={`配置岗位:${desensitize(chain.title)}`}>
<Settings className="size-3.5" />
</button>
</article>
);
})
)}
</div>
</section>
</div>
);
}
function TaskInformationCard({ function TaskInformationCard({
task, task,
editable, editable,
@@ -3892,8 +3969,34 @@ function TaskInformationCard({
onCollapsedChange: (collapsed: boolean) => void; onCollapsedChange: (collapsed: boolean) => void;
}) { }) {
return ( return (
<section className="group relative shrink-0 overflow-hidden rounded-[4px] border border-[#ECE7E4] bg-white shadow-[0_4px_20px_rgba(0,0,0,0.02)] dark:border-[rgba(43,143,254,0.6)] dark:bg-[#032650] dark:shadow-none"> <section className="position-roundtable-task-card group relative shrink-0 overflow-hidden rounded-[4px] border border-[#ECE7E4] bg-white p-5 shadow-[0_4px_20px_rgba(0,0,0,0.02)] dark:border-[rgba(0,110,254,0.5)] dark:bg-[#032650] dark:shadow-none">
<div className="relative flex h-10 items-center border-b border-rose-100 bg-[linear-gradient(89.65deg,rgba(245,34,45,0.10)_0.03%,rgba(245,34,45,0)_99.97%)] px-4 [&_h2]:!text-slate-900 dark:!bg-[linear-gradient(89.65deg,#0062d9_0.03%,#0062d900_99.97%)] dark:border-b-[#2b8ffe]/60 dark:[&_h2]:!text-white dark:after:absolute dark:after:inset-x-0 dark:after:bottom-[-1px] dark:after:h-px dark:after:bg-[#45c3f3]/85 dark:after:content-['']"> <div className="position-roundtable-task-card__content relative z-10">
<h2
title={desensitize(task.title)}
className="pr-8 text-[18px] font-medium leading-7 text-slate-900 dark:text-white"
style={{ fontFamily: "'Noto Sans SC', sans-serif" }}
>
<span className="line-clamp-1">{desensitize(task.title)}</span>
</h2>
<div
data-task-tags
className="mt-3 flex flex-wrap gap-2 [&>span]:inline-flex [&>span]:min-h-7 [&>span]:items-center [&>span]:!leading-5 [&>span:first-child]:!border-[#cf1322] [&>span:nth-child(2)]:!shadow-none"
style={{ fontFamily: "'Noto Sans SC', sans-serif" }}
>
<span className="rounded-[2px] border border-[#cf1322] bg-[rgba(207,19,34,0.5)] px-2 py-0.5 text-center text-[16px] font-light leading-4 text-white">紧急</span>
<span className="rounded-[2px] border border-[#4bcdff] bg-[rgba(75,205,255,0.3)] px-2 py-0.5 text-[16px] font-light leading-7 text-[#4bcdff] shadow-[0_0_9px_rgba(252,131,131,0.27)]">{desensitize(task.source)}</span>
<span className="rounded-[2px] border border-[#a2e1f9] bg-[rgba(162,225,249,0.3)] px-2 py-0.5 text-[16px] font-light leading-[18px] text-[#a2e1f9]">{desensitize(task.direction)}</span>
</div>
<p
data-task-description
title={desensitize(task.description)}
className="mt-3 line-clamp-3 whitespace-pre-wrap text-sm leading-[22px] text-slate-600 dark:text-[#96bbf8]"
style={{ fontFamily: "'Noto Sans SC', sans-serif" }}
>
{desensitize(task.description)}
</p>
</div>
<div style={{ display: "none" }} className="relative flex h-10 items-center border-b border-rose-100 bg-[linear-gradient(89.65deg,rgba(245,34,45,0.10)_0.03%,rgba(245,34,45,0)_99.97%)] px-4 [&_h2]:!text-slate-900 dark:!bg-[linear-gradient(89.65deg,#0062d9_0.03%,#0062d900_99.97%)] dark:border-b-[#2b8ffe]/60 dark:[&_h2]:!text-white dark:after:absolute dark:after:inset-x-0 dark:after:bottom-[-1px] dark:after:h-px dark:after:bg-[#45c3f3]/85 dark:after:content-['']">
<span <span
aria-hidden="true" aria-hidden="true"
className="mr-3 h-5 w-1 shrink-0 rounded-l-[2px] rounded-br-[2px] bg-[linear-gradient(167.47deg,#f15959_0%,#cc1925_100%)] dark:bg-[linear-gradient(167.47deg,#a2e1f9_0%,#45c3f3_100%)]" className="mr-3 h-5 w-1 shrink-0 rounded-l-[2px] rounded-br-[2px] bg-[linear-gradient(167.47deg,#f15959_0%,#cc1925_100%)] dark:bg-[linear-gradient(167.47deg,#a2e1f9_0%,#45c3f3_100%)]"
@@ -3914,8 +4017,9 @@ function TaskInformationCard({
</div> </div>
</div> </div>
<div <div
style={{ display: "none" }}
className={cn( className={cn(
"grid transition-[grid-template-rows,opacity] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none", "hidden grid transition-[grid-template-rows,opacity] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none",
collapsed ? "grid-rows-[0fr] opacity-0" : "grid-rows-[1fr] opacity-100", collapsed ? "grid-rows-[0fr] opacity-0" : "grid-rows-[1fr] opacity-100",
)} )}
> >
@@ -3973,6 +4077,20 @@ function TaskInformationEditDialog({
<DialogTitle>编辑任务信息</DialogTitle> <DialogTitle>编辑任务信息</DialogTitle>
</DialogHeader> </DialogHeader>
<div className="space-y-4 py-1"> <div className="space-y-4 py-1">
<div className="grid grid-cols-3 gap-3">
<label className="block space-y-1.5">
<span className="text-xs font-semibold text-slate-500 dark:text-[#9ebfe2]">标签一</span>
<TInput value={task.priority ?? ""} onChange={(value) => onChange({ ...task, priority: String(value) })} placeholder="例如:紧急" />
</label>
<label className="block space-y-1.5">
<span className="text-xs font-semibold text-slate-500 dark:text-[#9ebfe2]">标签二</span>
<TInput value={task.source} onChange={(value) => onChange({ ...task, source: String(value) })} placeholder="例如:本系统创建" />
</label>
<label className="block space-y-1.5">
<span className="text-xs font-semibold text-slate-500 dark:text-[#9ebfe2]">标签三</span>
<TInput value={task.direction} onChange={(value) => onChange({ ...task, direction: String(value) })} placeholder="例如:暑期活动" />
</label>
</div>
<label className="block space-y-1.5"> <label className="block space-y-1.5">
<span className="text-xs font-semibold text-slate-500 dark:text-[#9ebfe2]">任务名称</span> <span className="text-xs font-semibold text-slate-500 dark:text-[#9ebfe2]">任务名称</span>
<TInput <TInput
@@ -4048,19 +4166,25 @@ function BusinessChainSelector({
const [relationOpenId, setRelationOpenId] = useState<string | null>(null); const [relationOpenId, setRelationOpenId] = useState<string | null>(null);
return ( return (
<section className={cn("group/business-chain flex min-h-0 flex-col", className)}> <section className={cn("position-roundtable-chain-selector group/business-chain flex min-h-0 flex-col rounded-[4px] border border-[#ECE7E4] bg-white p-5 shadow-[0_4px_20px_rgba(0,0,0,0.02)] dark:border-[rgba(0,110,254,0.5)] dark:bg-[#032650] dark:shadow-none [&>div>h3:first-of-type]:hidden", className)}>
<div className="relative flex h-10 items-center border-b border-slate-200 dark:border-[#2b8ffe]/60"> <div className="relative flex h-8 shrink-0 items-center">
<span <span
aria-hidden="true" aria-hidden="true"
className="mr-3 h-6 w-1 shrink-0 rounded-l-[2px] rounded-br-[2px] bg-[linear-gradient(167.47deg,#f15959_0%,#cc1925_100%)] dark:bg-[linear-gradient(167.47deg,#a2e1f9_0%,#45c3f3_100%)]" className="mr-3 h-6 w-1 shrink-0 rounded-l-[2px] rounded-br-[2px] bg-[linear-gradient(167.47deg,#f15959_0%,#cc1925_100%)] dark:bg-[linear-gradient(167.47deg,#a2e1f9_0%,#45c3f3_100%)]"
/> />
<h3 className="text-lg font-[550] tracking-wide text-slate-900 dark:text-white">业务链</h3> <h3 className="text-lg font-[550] tracking-wide text-slate-900 dark:text-white">业务链</h3>
<h3
className="text-[18px] font-medium leading-7 tracking-wide text-slate-900 dark:text-white"
style={{ fontFamily: "'Noto Sans SC', sans-serif" }}
>
作业链条选择
</h3>
<span className="ml-auto flex size-6 items-center justify-center rounded-[4px] bg-slate-100 text-xs font-semibold tabular-nums text-slate-500 dark:bg-[#0b386d] dark:text-[#83c1ff]"> <span className="ml-auto flex size-6 items-center justify-center rounded-[4px] bg-slate-100 text-xs font-semibold tabular-nums text-slate-500 dark:bg-[#0b386d] dark:text-[#83c1ff]">
{chains.length} {chains.length}
</span> </span>
</div> </div>
<div className="business-chain-scrollbar min-h-0 flex-1 space-y-2.5 overflow-y-auto py-4 pr-1 custom-scrollbar"> <div className="business-chain-scrollbar min-h-0 flex-1 space-y-2.5 overflow-y-auto pt-4 pr-1 custom-scrollbar">
{loading ? ( {loading ? (
<div className="flex h-20 items-center justify-center gap-2 text-xs text-slate-400 dark:text-[#8aa0c4]"> <div className="flex h-20 items-center justify-center gap-2 text-xs text-slate-400 dark:text-[#8aa0c4]">
<Loader2 className="size-4 animate-spin" /> <Loader2 className="size-4 animate-spin" />
@@ -69,3 +69,120 @@
.position-roundtable-intent-model-switch { .position-roundtable-intent-model-switch {
border-radius: var(--prt-intent-radius); border-radius: var(--prt-intent-radius);
} }
/* 岗位会商第一步左侧栏:使用独立样式,避免与通用 Tailwind 面板规则相互覆盖。 */
.dark .position-roundtable-task-card {
padding: 10px 15px !important;
background: #032650;
border-color: rgba(0, 110, 254, 0.5);
}
.dark .position-roundtable-task-card [data-task-description] {
color: #96bbf8 !important;
}
.dark .position-roundtable-chain-selector {
background: #032650;
border-color: rgba(0, 110, 254, 0.5);
}
/* First-step entry rail is a self-contained redraw; do not inherit legacy panel rules. */
.dark .position-roundtable-sidebar-scrollbar:has(.position-roundtable-entry-sidebar) {
display: block;
overflow: hidden;
padding: 0;
background: transparent !important;
}
.position-roundtable-entry-sidebar {
display: flex;
height: 100%;
min-height: 0;
flex-direction: column;
gap: 20px;
font-family: "Noto Sans SC", sans-serif;
}
.position-roundtable-entry-task-card,
.position-roundtable-entry-chain-card {
box-sizing: border-box;
border: 1px solid rgba(0, 110, 254, 0.5);
border-radius: 4px;
background: #032650;
}
.position-roundtable-entry-task-card {
position: relative;
flex: none;
padding: 10px 15px;
}
.position-roundtable-entry-task-card h2 {
margin: 0;
overflow: hidden;
color: #fff;
font-size: 18px;
font-weight: 500;
line-height: 28px;
text-overflow: ellipsis;
white-space: nowrap;
}
.position-roundtable-entry-tags {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 12px;
}
.position-roundtable-entry-tags span {
display: inline-flex;
box-sizing: border-box;
min-height: 28px;
align-items: center;
padding: 3px 8px;
border: 1px solid;
border-radius: 2px;
font-size: 16px;
font-weight: 300;
line-height: 20px;
white-space: nowrap;
}
.position-roundtable-entry-tags span:nth-child(1) { border-color: #cf1322; background: rgba(207, 19, 34, 0.5); color: #fff; }
.position-roundtable-entry-tags span:nth-child(2) { border-color: #4bcdff; background: rgba(75, 205, 255, 0.3); color: #4bcdff; }
.position-roundtable-entry-tags span:nth-child(3) { border-color: #a2e1f9; background: rgba(162, 225, 249, 0.3); color: #a2e1f9; }
.position-roundtable-entry-task-card > p {
display: -webkit-box;
margin: 12px 0 0;
overflow: hidden;
color: #96bbf8;
color: #96bbf8 !important;
font-size: 16px;
line-height: 22px;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
.position-roundtable-entry-edit { position: absolute; top: 8px; right: 8px; display: none; width: 16px; height: 16px; padding: 0; cursor: pointer; color: #4bcdff; }
.position-roundtable-entry-edit img { display: block; width: 16px; height: 16px; }
.position-roundtable-entry-task-card:hover .position-roundtable-entry-edit,
.position-roundtable-entry-edit:focus-visible { display: inline-flex; }
.position-roundtable-entry-chain-card { display: flex; min-height: 0; flex: 1; flex-direction: column; padding: 10px 15px; }
.position-roundtable-entry-chain-card header { display: flex; height: 36px; flex: none; align-items: center; gap: 10px; }
.position-roundtable-entry-chain-card header > span { width: 4px; height: 16px; border-radius: 2px 0 2px 0; background: linear-gradient(165.96deg, #a2e1f9 0%, #45c3f3 100%); }
.position-roundtable-entry-chain-card h2 { margin: 0; color: #fff; font-size: 18px; font-weight: 500; line-height: 28px; }
.position-roundtable-entry-chain-card header b { margin-left: auto; padding: 2px 9px; border-radius: 4px; background: #0b234c; color: #a2e1f9; font-size: 16px; line-height: 24px; }
.position-roundtable-entry-chain-list { min-height: 0; flex: 1; margin-top: 10px; overflow-y: auto; }
.position-roundtable-entry-chain-list article { position: relative; margin-bottom: 10px; border: 1px solid rgba(43, 143, 254, 0.35); border-radius: 4px; background: rgba(11, 56, 109, 0.45); }
.position-roundtable-entry-chain-list article.is-selected { border-color: #2b8ffe; background: rgba(43, 143, 254, 0.18); box-shadow: 0 0 0 1px rgba(43, 143, 254, 0.22); }
.position-roundtable-entry-chain-list article > button:first-child { display: grid; width: 100%; grid-template-columns: 18px minmax(0, 1fr) auto; gap: 8px; padding: 14px; color: #d8e6f8; text-align: left; }
.position-roundtable-entry-chain-list i { width: 14px; height: 14px; align-self: center; border: 4px solid #2b8ffe; border-radius: 50%; box-sizing: border-box; }
.position-roundtable-entry-chain-list article:not(.is-selected) i { border: 1px solid #83b6ed; }
.position-roundtable-entry-chain-list article > button:first-child > span { overflow: hidden; font-size: 16px; font-weight: 500; line-height: 22px; text-overflow: ellipsis; white-space: nowrap; }
.position-roundtable-entry-chain-list em { border-radius: 16px; background: rgba(162, 225, 249, 0.16); padding: 2px 8px; color: #a2e1f9; font-size: 14px; font-style: normal; line-height: 20px; }
.position-roundtable-entry-chain-list small { grid-column: 2 / 4; color: #96bbf8; font-size: 14px; line-height: 22px; }
.position-roundtable-entry-config { position: absolute; top: 10px; right: 10px; display: inline-flex; padding: 4px; color: #83c1ff; }
.position-roundtable-entry-empty { display: flex; min-height: 80px; align-items: center; justify-content: center; gap: 8px; color: #96bbf8; font-size: 14px; }