原因:登录时缺少密码可见性切换,长密码输入难以核对。 影响:新增可复用 PasswordInput,在登录表单提供眼睛按钮,并补充禁用态、焦点样式和无障碍标签。 风险:密码仅在用户主动点击时于当前输入框显示,不改变提交、存储或日志行为。 验证:前端 112 项测试通过;pnpm lint 通过;@easyai-ai-gateway/web 生产构建通过。
1115 lines
23 KiB
CSS
1115 lines
23 KiB
CSS
.shCard {
|
|
overflow: hidden;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--card-radius);
|
|
background: var(--surface);
|
|
color: var(--text-normal);
|
|
box-shadow: var(--shadow-soft);
|
|
}
|
|
|
|
.shCardHeader,
|
|
.shCardContent,
|
|
.shCardFooter {
|
|
padding: 14px;
|
|
}
|
|
|
|
.shCardHeader {
|
|
display: flex;
|
|
min-height: 54px;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
border-bottom: 1px solid var(--border-subtle);
|
|
}
|
|
|
|
.shCardTitle {
|
|
color: var(--text-strong);
|
|
font-size: var(--font-size-lg);
|
|
font-weight: var(--font-weight-semibold);
|
|
line-height: 1.3;
|
|
}
|
|
|
|
.shCardDescription,
|
|
.mutedText {
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shFormItem {
|
|
display: flex;
|
|
min-width: 0;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
color: var(--text-normal);
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.shFormItemLabel {
|
|
color: var(--text-soft);
|
|
}
|
|
|
|
.shFormItemDescription {
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-xs);
|
|
font-weight: var(--font-weight-normal);
|
|
line-height: 1.45;
|
|
}
|
|
|
|
.shButton {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 8px;
|
|
border: 1px solid transparent;
|
|
border-radius: var(--control-radius);
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-medium);
|
|
line-height: 1;
|
|
white-space: nowrap;
|
|
transition: background 0.16s ease, color 0.16s ease, box-shadow 0.16s ease;
|
|
}
|
|
|
|
.shButtonXs {
|
|
min-height: 28px;
|
|
padding: 0 9px;
|
|
font-size: var(--font-size-xs);
|
|
}
|
|
|
|
.shButtonSm {
|
|
min-height: 32px;
|
|
padding: 0 12px;
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shButtonMd,
|
|
.shButtonDefaultSize {
|
|
min-height: 36px;
|
|
padding: 0 14px;
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shButtonLg {
|
|
min-height: 40px;
|
|
padding: 0 16px;
|
|
font-size: var(--font-size-base);
|
|
}
|
|
|
|
.shButtonXl {
|
|
min-height: 44px;
|
|
padding: 0 18px;
|
|
font-size: var(--font-size-md);
|
|
}
|
|
|
|
.shButtonIcon {
|
|
width: var(--control-height);
|
|
min-height: var(--control-height);
|
|
padding: 0;
|
|
}
|
|
|
|
.shButtonDefault {
|
|
background: var(--primary);
|
|
color: var(--primary-foreground);
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.06);
|
|
}
|
|
|
|
.shButtonDefault:hover {
|
|
background: #27272a;
|
|
}
|
|
|
|
.shButtonSecondary {
|
|
background: var(--secondary);
|
|
color: var(--secondary-foreground);
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
}
|
|
|
|
.shButtonOutline {
|
|
border-color: var(--input);
|
|
background: #fff;
|
|
color: var(--text-normal);
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
}
|
|
|
|
.shButtonOutline:hover,
|
|
.shButtonSecondary:hover {
|
|
background: var(--accent);
|
|
color: var(--accent-foreground);
|
|
}
|
|
|
|
.shButtonGhost {
|
|
background: transparent;
|
|
color: var(--text-normal);
|
|
}
|
|
|
|
.shButtonGhost:hover {
|
|
background: var(--accent);
|
|
color: var(--accent-foreground);
|
|
}
|
|
|
|
.shButtonDestructive {
|
|
background: var(--destructive);
|
|
color: var(--destructive-foreground);
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
}
|
|
|
|
.shSwitch {
|
|
position: relative;
|
|
display: inline-flex;
|
|
width: 36px;
|
|
height: 20px;
|
|
flex: 0 0 auto;
|
|
align-items: center;
|
|
border: 1px solid transparent;
|
|
border-radius: 999px;
|
|
background: #d1d5db;
|
|
box-shadow: inset 0 1px 2px rgba(16, 24, 40, 0.12);
|
|
cursor: pointer;
|
|
transition: background 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease;
|
|
}
|
|
|
|
.shSwitch[data-state="checked"] {
|
|
background: #059669;
|
|
box-shadow: inset 0 1px 2px rgba(6, 95, 70, 0.2), 0 0 0 3px rgba(16, 185, 129, 0.12);
|
|
}
|
|
|
|
.shSwitch:focus-visible {
|
|
outline: 2px solid var(--ring);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.shSwitch:disabled {
|
|
cursor: not-allowed;
|
|
opacity: 0.55;
|
|
}
|
|
|
|
.shSwitchThumb {
|
|
display: block;
|
|
width: 16px;
|
|
height: 16px;
|
|
margin-left: 2px;
|
|
border-radius: 999px;
|
|
background: #fff;
|
|
box-shadow: 0 1px 3px rgba(16, 24, 40, 0.24);
|
|
transition: transform 0.16s ease;
|
|
}
|
|
|
|
.shSwitch[data-state="checked"] .shSwitchThumb {
|
|
transform: translateX(16px);
|
|
}
|
|
|
|
.screenMessageViewport {
|
|
position: fixed;
|
|
z-index: 100;
|
|
top: 18px;
|
|
left: 50%;
|
|
width: min(520px, calc(100vw - 32px));
|
|
transform: translateX(-50%);
|
|
pointer-events: none;
|
|
}
|
|
|
|
.screenMessage {
|
|
display: grid;
|
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
align-items: center;
|
|
gap: 10px;
|
|
min-height: 44px;
|
|
padding: 8px 8px 8px 12px;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-lg);
|
|
background: var(--surface);
|
|
color: var(--text-normal);
|
|
box-shadow: var(--shadow-dialog);
|
|
pointer-events: auto;
|
|
}
|
|
|
|
.screenMessageIcon {
|
|
display: inline-flex;
|
|
color: var(--text-soft);
|
|
}
|
|
|
|
.screenMessageText {
|
|
min-width: 0;
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.screenMessageClose {
|
|
width: 28px;
|
|
min-height: 28px;
|
|
}
|
|
|
|
.screenMessage-error {
|
|
border-color: #fecaca;
|
|
background: #fef2f2;
|
|
color: #991b1b;
|
|
}
|
|
|
|
.screenMessage-error .screenMessageIcon {
|
|
color: #dc2626;
|
|
}
|
|
|
|
.screenMessage-success {
|
|
border-color: #bbf7d0;
|
|
background: #f0fdf4;
|
|
color: #166534;
|
|
}
|
|
|
|
.screenMessage-success .screenMessageIcon {
|
|
color: #16a34a;
|
|
}
|
|
|
|
.confirmDialogBackdrop {
|
|
position: fixed;
|
|
z-index: 110;
|
|
inset: 0;
|
|
display: grid;
|
|
place-items: center;
|
|
padding: 24px;
|
|
background: rgba(16, 19, 24, 0.36);
|
|
}
|
|
|
|
.confirmDialog {
|
|
display: grid;
|
|
grid-template-columns: auto minmax(0, 1fr);
|
|
gap: 14px;
|
|
width: min(420px, 100%);
|
|
padding: 18px;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-xl);
|
|
background: var(--surface);
|
|
color: var(--text-normal);
|
|
box-shadow: var(--shadow-dialog);
|
|
}
|
|
|
|
.confirmDialogIcon {
|
|
display: grid;
|
|
width: 36px;
|
|
height: 36px;
|
|
place-items: center;
|
|
border-radius: 999px;
|
|
background: #fef2f2;
|
|
color: var(--destructive);
|
|
}
|
|
|
|
.confirmDialogBody {
|
|
min-width: 0;
|
|
}
|
|
|
|
.confirmDialogBody strong {
|
|
display: block;
|
|
color: var(--text-strong);
|
|
font-size: var(--font-size-lg);
|
|
font-weight: var(--font-weight-semibold);
|
|
line-height: 1.35;
|
|
}
|
|
|
|
.confirmDialogBody p {
|
|
margin-top: 6px;
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-sm);
|
|
line-height: 1.55;
|
|
}
|
|
|
|
.confirmDialogActions {
|
|
grid-column: 1 / -1;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
gap: 10px;
|
|
padding-top: 2px;
|
|
}
|
|
|
|
.formDialogBackdrop {
|
|
position: fixed;
|
|
z-index: 60;
|
|
inset: 0;
|
|
display: grid;
|
|
place-items: center;
|
|
padding: 24px;
|
|
background: rgba(16, 19, 24, 0.36);
|
|
}
|
|
|
|
.formDialog {
|
|
display: grid;
|
|
width: min(720px, 100%);
|
|
max-height: min(760px, calc(100vh - 48px));
|
|
grid-template-rows: auto minmax(0, 1fr);
|
|
overflow: hidden;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-xl);
|
|
background: var(--surface);
|
|
box-shadow: var(--shadow-dialog);
|
|
}
|
|
|
|
.formDialogHeader {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 14px;
|
|
padding: 16px 18px;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
|
|
.formDialogHeader span {
|
|
display: block;
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-xs);
|
|
font-weight: var(--font-weight-semibold);
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.formDialogHeader strong {
|
|
display: block;
|
|
margin-top: 3px;
|
|
color: var(--text-strong);
|
|
font-size: var(--font-size-lg);
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.formDialogForm {
|
|
display: grid;
|
|
min-height: 0;
|
|
grid-template-rows: minmax(0, 1fr) auto;
|
|
}
|
|
|
|
.formDialogBody {
|
|
display: grid;
|
|
min-height: 0;
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
gap: 12px;
|
|
overflow: auto;
|
|
padding: 16px 18px;
|
|
}
|
|
|
|
.formDialogActions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
gap: 10px;
|
|
padding: 14px 18px;
|
|
border-top: 1px solid var(--border);
|
|
background: var(--surface);
|
|
box-shadow: 0 -1px 0 rgba(16, 24, 40, 0.02);
|
|
}
|
|
|
|
.shPopoverContent {
|
|
z-index: 80;
|
|
overflow: hidden;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-lg);
|
|
background: var(--popover);
|
|
color: var(--popover-foreground);
|
|
box-shadow: var(--shadow-dialog);
|
|
}
|
|
|
|
.shInput,
|
|
.shTextarea {
|
|
width: 100%;
|
|
border: 1px solid var(--input);
|
|
border-radius: var(--control-radius);
|
|
background: transparent;
|
|
color: var(--text-normal);
|
|
font-size: var(--font-size-base);
|
|
font-weight: var(--font-weight-regular);
|
|
line-height: 1.25;
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
outline: none;
|
|
transition: border-color 0.16s ease, box-shadow 0.16s ease, color 0.16s ease;
|
|
}
|
|
|
|
.shInput {
|
|
padding: 0 11px;
|
|
}
|
|
|
|
.shPasswordInputRoot {
|
|
position: relative;
|
|
width: 100%;
|
|
}
|
|
|
|
.shPasswordInput {
|
|
padding-right: 42px;
|
|
}
|
|
|
|
.shPasswordInputToggle {
|
|
position: absolute;
|
|
top: 50%;
|
|
right: 3px;
|
|
display: grid;
|
|
width: 30px;
|
|
height: 30px;
|
|
padding: 0;
|
|
place-items: center;
|
|
transform: translateY(-50%);
|
|
border: 0;
|
|
border-radius: calc(var(--control-radius) - 2px);
|
|
background: transparent;
|
|
color: var(--text-soft);
|
|
cursor: pointer;
|
|
transition: background 0.16s ease, color 0.16s ease, box-shadow 0.16s ease;
|
|
}
|
|
|
|
.shPasswordInputToggle:hover {
|
|
background: var(--surface-muted);
|
|
color: var(--text-strong);
|
|
}
|
|
|
|
.shPasswordInputToggle:focus-visible {
|
|
outline: none;
|
|
box-shadow: 0 0 0 1px var(--ring);
|
|
}
|
|
|
|
.shPasswordInputToggle:disabled {
|
|
cursor: not-allowed;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.shSelect {
|
|
appearance: none;
|
|
padding-right: 30px;
|
|
background-image:
|
|
linear-gradient(45deg, transparent 50%, var(--text-soft) 50%),
|
|
linear-gradient(135deg, var(--text-soft) 50%, transparent 50%);
|
|
background-position:
|
|
calc(100% - 16px) 50%,
|
|
calc(100% - 11px) 50%;
|
|
background-size: 5px 5px, 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.shTextarea {
|
|
padding: 10px 11px;
|
|
resize: vertical;
|
|
}
|
|
|
|
.shControlXs {
|
|
min-height: 28px;
|
|
padding: 0 8px;
|
|
font-size: var(--font-size-xs);
|
|
}
|
|
|
|
.shControlSm {
|
|
min-height: 32px;
|
|
padding: 0 9px;
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shControlMd {
|
|
min-height: 36px;
|
|
padding: 0 10px;
|
|
font-size: var(--font-size-base);
|
|
}
|
|
|
|
.shControlLg {
|
|
min-height: 40px;
|
|
padding: 0 11px;
|
|
font-size: var(--font-size-base);
|
|
}
|
|
|
|
.shControlXl {
|
|
min-height: 44px;
|
|
padding: 0 13px;
|
|
font-size: var(--font-size-md);
|
|
}
|
|
|
|
.shSelect.shControlXs { padding-right: 26px; }
|
|
.shSelect.shControlSm { padding-right: 28px; }
|
|
.shSelect.shControlMd { padding-right: 30px; }
|
|
.shSelect.shControlLg { padding-right: 32px; }
|
|
.shSelect.shControlXl { padding-right: 34px; }
|
|
|
|
.shTextareaXs { min-height: 64px; padding: 8px 9px; font-size: var(--font-size-xs); }
|
|
.shTextareaSm { min-height: 78px; padding: 9px 10px; font-size: var(--font-size-sm); }
|
|
.shTextareaMd { min-height: 96px; padding: 10px 11px; font-size: var(--font-size-base); }
|
|
.shTextareaLg { min-height: 112px; padding: 11px 12px; font-size: var(--font-size-base); }
|
|
.shTextareaXl { min-height: 128px; padding: 12px 14px; font-size: var(--font-size-md); }
|
|
|
|
.shInput:focus-visible,
|
|
.shTextarea:focus-visible,
|
|
.tokenInline input:focus-visible {
|
|
box-shadow: 0 0 0 1px var(--ring);
|
|
}
|
|
|
|
.shButton:focus-visible {
|
|
outline: none;
|
|
box-shadow: 0 0 0 1px var(--ring);
|
|
}
|
|
|
|
.shInput::placeholder,
|
|
.shTextarea::placeholder {
|
|
color: var(--muted-foreground);
|
|
font-weight: var(--font-weight-regular);
|
|
}
|
|
|
|
.shInput:disabled,
|
|
.shTextarea:disabled {
|
|
cursor: not-allowed;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.shLabel,
|
|
.formGrid {
|
|
display: grid;
|
|
gap: 8px;
|
|
}
|
|
|
|
.shLabel {
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.formGrid {
|
|
gap: 12px;
|
|
}
|
|
|
|
.formGrid.two {
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
}
|
|
|
|
.shTabs {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 6px;
|
|
padding: 4px;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--control-radius);
|
|
background: var(--surface-muted);
|
|
}
|
|
|
|
.shTab {
|
|
display: inline-flex;
|
|
min-height: 32px;
|
|
align-items: center;
|
|
gap: 7px;
|
|
padding: 0 11px;
|
|
border: 0;
|
|
border-radius: calc(var(--control-radius) - 1px);
|
|
background: transparent;
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.shTab[data-active="true"] {
|
|
background: var(--surface);
|
|
color: var(--text-strong);
|
|
box-shadow: var(--shadow-soft);
|
|
}
|
|
|
|
.shBadge {
|
|
display: inline-flex;
|
|
min-height: 24px;
|
|
align-items: center;
|
|
width: fit-content;
|
|
padding: 0 8px;
|
|
border: 1px solid transparent;
|
|
border-radius: 999px;
|
|
font-size: var(--font-size-xs);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.shBadgeDefault { background: #eef1f5; color: var(--text-normal); }
|
|
.shBadgeSecondary { background: #f3f5f7; color: var(--text-soft); }
|
|
.shBadgeOutline { border-color: var(--border); background: #fff; color: var(--text-normal); }
|
|
.shBadgeSuccess { background: #edf7f1; color: #157a57; }
|
|
.shBadgeWarning { background: #fbf4e8; color: #8a6116; }
|
|
.shBadgeDestructive { background: #fff3f3; color: #b42318; }
|
|
|
|
.shCalendar {
|
|
padding: 10px;
|
|
background: var(--surface);
|
|
}
|
|
|
|
.shCalendarRoot,
|
|
.shCalendarMonths,
|
|
.shCalendarMonth,
|
|
.shCalendarWeeks {
|
|
display: grid;
|
|
gap: 8px;
|
|
}
|
|
|
|
.shCalendarCaption {
|
|
position: relative;
|
|
display: flex;
|
|
min-height: 32px;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.shCalendarCaptionLabel {
|
|
color: var(--text-strong);
|
|
font-size: var(--font-size-sm);
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.shCalendarNav {
|
|
position: absolute;
|
|
inset: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.shCalendarNavButton {
|
|
display: grid;
|
|
width: 30px;
|
|
height: 30px;
|
|
place-items: center;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--control-radius);
|
|
background: var(--surface);
|
|
color: var(--text-normal);
|
|
pointer-events: auto;
|
|
}
|
|
|
|
.shCalendarNavButton:hover {
|
|
background: var(--accent);
|
|
}
|
|
|
|
.shCalendarChevronIcon {
|
|
display: block;
|
|
}
|
|
|
|
.shCalendarGrid {
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
.shCalendarWeekdays,
|
|
.shCalendarWeek {
|
|
display: grid;
|
|
grid-template-columns: repeat(7, 32px);
|
|
gap: 4px;
|
|
}
|
|
|
|
.shCalendarWeekday {
|
|
display: grid;
|
|
height: 26px;
|
|
place-items: center;
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-xs);
|
|
font-weight: var(--font-weight-medium);
|
|
}
|
|
|
|
.shCalendarDay {
|
|
display: grid;
|
|
width: 32px;
|
|
height: 32px;
|
|
place-items: center;
|
|
}
|
|
|
|
.shCalendarDayButton {
|
|
width: 32px;
|
|
height: 32px;
|
|
border: 0;
|
|
border-radius: var(--control-radius);
|
|
background: transparent;
|
|
color: var(--text-normal);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shCalendarDayButton:hover {
|
|
background: var(--accent);
|
|
}
|
|
|
|
.shCalendarDayOutside .shCalendarDayButton {
|
|
color: var(--text-faint);
|
|
}
|
|
|
|
.shCalendarDayDisabled .shCalendarDayButton {
|
|
cursor: not-allowed;
|
|
color: var(--text-faint);
|
|
opacity: 0.45;
|
|
}
|
|
|
|
.shCalendarDayToday .shCalendarDayButton {
|
|
border: 1px solid var(--ring);
|
|
}
|
|
|
|
.shCalendarDaySelected .shCalendarDayButton {
|
|
background: var(--primary);
|
|
color: var(--primary-foreground);
|
|
}
|
|
|
|
.shCalendarDayHidden {
|
|
visibility: hidden;
|
|
}
|
|
|
|
.dateTimePickerTrigger {
|
|
width: 100%;
|
|
justify-content: flex-start;
|
|
text-align: left;
|
|
}
|
|
|
|
.dateTimePickerTrigger[data-empty="true"] {
|
|
color: var(--text-soft);
|
|
}
|
|
|
|
.dateTimePickerPopover {
|
|
width: auto;
|
|
}
|
|
|
|
.dateTimePickerFooter {
|
|
display: grid;
|
|
grid-template-columns: minmax(0, 1fr) 34px;
|
|
gap: 10px;
|
|
align-items: end;
|
|
padding: 10px;
|
|
border-top: 1px solid var(--border);
|
|
background: var(--surface);
|
|
}
|
|
|
|
.shDateRangePicker.ant-picker {
|
|
min-height: 36px;
|
|
padding: 0 10px;
|
|
border-color: var(--input);
|
|
border-radius: var(--control-radius);
|
|
background: var(--surface);
|
|
color: var(--text-normal);
|
|
font-family: inherit;
|
|
font-size: var(--font-size-base);
|
|
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
transition: border-color 0.16s ease, box-shadow 0.16s ease;
|
|
}
|
|
|
|
.shDateRangePicker.ant-picker:hover,
|
|
.shDateRangePicker.ant-picker-focused {
|
|
border-color: var(--ring);
|
|
box-shadow: 0 0 0 1px var(--ring);
|
|
}
|
|
|
|
.shDateRangePicker.ant-picker-disabled {
|
|
background: var(--surface-muted);
|
|
opacity: 0.64;
|
|
}
|
|
|
|
.shDateRangePicker .ant-picker-input > input {
|
|
color: var(--text-normal);
|
|
font-family: inherit;
|
|
font-size: var(--font-size-base);
|
|
font-weight: var(--font-weight-regular);
|
|
}
|
|
|
|
.shDateRangePicker .ant-picker-input > input::placeholder {
|
|
color: var(--muted-foreground);
|
|
font-weight: var(--font-weight-regular);
|
|
}
|
|
|
|
.shDateRangePicker .ant-picker-active-bar {
|
|
background: var(--primary);
|
|
}
|
|
|
|
.shDateRangePicker .ant-picker-range-separator,
|
|
.shDateRangePicker .ant-picker-suffix,
|
|
.shDateRangePicker .ant-picker-clear {
|
|
color: var(--text-soft);
|
|
}
|
|
|
|
.shDateRangePicker .ant-picker-clear {
|
|
background: var(--surface);
|
|
}
|
|
|
|
.shDateRangePickerPopup {
|
|
font-family: inherit;
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-panel-container {
|
|
overflow: hidden;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-lg);
|
|
background: var(--popover);
|
|
color: var(--popover-foreground);
|
|
box-shadow: var(--shadow-dialog);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-panel,
|
|
.shDateRangePickerPopup .ant-picker-date-panel,
|
|
.shDateRangePickerPopup .ant-picker-time-panel,
|
|
.shDateRangePickerPopup .ant-picker-footer,
|
|
.shDateRangePickerPopup .ant-picker-content th,
|
|
.shDateRangePickerPopup .ant-picker-header {
|
|
border-color: var(--border-subtle);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-header,
|
|
.shDateRangePickerPopup .ant-picker-content th,
|
|
.shDateRangePickerPopup .ant-picker-cell,
|
|
.shDateRangePickerPopup .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {
|
|
color: var(--text-soft);
|
|
font-family: inherit;
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-header-view,
|
|
.shDateRangePickerPopup .ant-picker-header button,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view,
|
|
.shDateRangePickerPopup .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {
|
|
color: var(--text-strong);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell-inner {
|
|
border-radius: var(--control-radius);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::before {
|
|
border-color: var(--ring);
|
|
border-radius: var(--control-radius);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner {
|
|
background: var(--primary);
|
|
color: var(--primary-foreground);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-in-range::before,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single)::before,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single)::before {
|
|
background: var(--surface-muted);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-hover::before,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-hover-start::before,
|
|
.shDateRangePickerPopup .ant-picker-cell-in-view.ant-picker-cell-range-hover-end::before {
|
|
background: var(--accent);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-cell:hover .ant-picker-cell-inner,
|
|
.shDateRangePickerPopup .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {
|
|
background: var(--accent);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {
|
|
background: var(--surface-muted);
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-ok .ant-btn-primary {
|
|
border-color: var(--primary);
|
|
border-radius: var(--control-radius);
|
|
background: var(--primary);
|
|
color: var(--primary-foreground);
|
|
box-shadow: none;
|
|
}
|
|
|
|
.shDateRangePickerPopup .ant-picker-now-btn {
|
|
color: var(--text-normal);
|
|
}
|
|
|
|
.shTable {
|
|
overflow: auto;
|
|
}
|
|
|
|
.shTableViewportCard {
|
|
display: grid;
|
|
max-height: var(--sh-table-viewport-height, calc(100dvh - 142px));
|
|
min-height: 0;
|
|
}
|
|
|
|
.shTableViewportPanel {
|
|
display: flex;
|
|
min-height: 0;
|
|
max-height: var(--sh-table-viewport-height, calc(100dvh - 142px));
|
|
flex-direction: column;
|
|
gap: var(--sh-table-viewport-gap, 14px);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.shTableViewportPanel > .formMessage {
|
|
margin: 0;
|
|
}
|
|
|
|
.shTableViewportLayout {
|
|
display: flex;
|
|
min-height: 0;
|
|
max-height: 100%;
|
|
flex: 0 1 auto;
|
|
flex-direction: column;
|
|
gap: var(--sh-table-viewport-gap, 14px);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.shTableToolbar {
|
|
display: grid;
|
|
flex: 0 0 auto;
|
|
align-items: end;
|
|
gap: 12px;
|
|
}
|
|
|
|
.shTableSummary,
|
|
.shTableFooter,
|
|
.shTablePageActions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
}
|
|
|
|
.shTableFooter {
|
|
flex: 0 0 auto;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.shTableFooterGroup {
|
|
display: flex;
|
|
min-width: 0;
|
|
align-items: center;
|
|
gap: 10px;
|
|
}
|
|
|
|
.shTableSummary,
|
|
.shTableFooter {
|
|
justify-content: space-between;
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shTableFooter .shLabel {
|
|
width: 116px;
|
|
grid-template-columns: auto minmax(0, 1fr);
|
|
align-items: center;
|
|
}
|
|
|
|
.shTablePageJump {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
.shTableFooterGroup,
|
|
.shTablePageJump,
|
|
.shTablePageActions {
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.shTablePageJump .shInput {
|
|
width: 58px;
|
|
text-align: center;
|
|
}
|
|
|
|
.shTableViewport {
|
|
flex: 0 1 auto;
|
|
min-height: 0;
|
|
overflow: auto;
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-md);
|
|
background: var(--surface);
|
|
overscroll-behavior: contain;
|
|
}
|
|
|
|
.shTableViewport .shTableHeader {
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 1;
|
|
}
|
|
|
|
.shTableRow {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
|
|
min-width: 520px;
|
|
border-bottom: 1px solid var(--border-subtle);
|
|
}
|
|
|
|
.shTableHeader {
|
|
background: var(--surface-subtle);
|
|
}
|
|
|
|
.shTableHead,
|
|
.shTableCell {
|
|
overflow: hidden;
|
|
min-height: 42px;
|
|
padding: 11px 12px;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.shTableHead {
|
|
color: var(--text-soft);
|
|
font-size: var(--font-size-xs);
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.shTableCell {
|
|
color: var(--text-normal);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.shTableCompact .shTableHead,
|
|
.shTableCompact .shTableCell {
|
|
min-height: 30px;
|
|
padding: 5px 9px;
|
|
font-size: var(--font-size-xs);
|
|
line-height: 1.3;
|
|
}
|
|
|
|
.shTableCompact .shTableHead {
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.shTableCompact .shTableRow {
|
|
font-size: var(--font-size-xs);
|
|
}
|
|
|
|
.shTableCompact .shBadge {
|
|
min-height: 18px;
|
|
padding: 0 6px;
|
|
font-size: 0.6875rem;
|
|
}
|
|
|
|
.shTableCompact .shButtonSm {
|
|
min-height: 24px;
|
|
padding: 0 8px;
|
|
font-size: var(--font-size-xs);
|
|
}
|
|
|
|
.shTableCompact .shButtonIcon {
|
|
width: 24px;
|
|
min-height: 24px;
|
|
}
|
|
|
|
.emptyState {
|
|
display: grid;
|
|
min-height: 104px;
|
|
place-items: center;
|
|
gap: 8px;
|
|
padding: 18px;
|
|
color: var(--muted-foreground);
|
|
text-align: center;
|
|
}
|
|
|
|
.modelMeta code,
|
|
.secretBox,
|
|
.codeBlock,
|
|
.taskPreview pre {
|
|
overflow: auto;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--control-radius);
|
|
background: var(--surface-subtle);
|
|
color: var(--text-normal);
|
|
font-family: "SFMono-Regular", Consolas, monospace;
|
|
font-size: 0.75rem;
|
|
}
|
|
|
|
.modelMeta code,
|
|
.secretBox {
|
|
padding: 8px;
|
|
}
|
|
|
|
.createdApiKeyBox {
|
|
display: grid;
|
|
gap: 8px;
|
|
}
|
|
|
|
.codeBlock,
|
|
.taskPreview pre {
|
|
margin: 0;
|
|
padding: 12px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
@media (max-width: 860px) {
|
|
.formDialogBody {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
}
|