Files
ttstd-infinite-canvas/web/src/styles/globals.css

1506 lines
44 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@custom-variant dark (&:is(.dark *));
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-border: var(--border);
--color-ring: var(--ring);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--font-heading: var(--font-sans);
--font-sans: var(--font-sans);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-input: var(--input);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--radius-2xl: calc(var(--radius) * 1.8);
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
}
:root {
--radius: 0.5rem;
--motion-instant: 120ms;
--motion-state: 180ms;
--motion-panel: 240ms;
--ease-aceternity: cubic-bezier(0.2, 0.85, 0.18, 1);
--ease-product-enter: cubic-bezier(0.16, 1, 0.3, 1);
--workspace-canvas: #ffffff;
--workspace-surface: rgba(255, 255, 255, 0.82);
--workspace-surface-strong: #ffffff;
--workspace-border: rgba(15, 23, 42, 0.1);
--workspace-border-strong: rgba(15, 23, 42, 0.18);
--workspace-grid-line: rgba(51, 65, 85, 0.045);
--workspace-nav: rgba(255, 255, 255, 0.88);
--workspace-sidebar: #f5f6f8;
--workspace-accent: #2563eb;
--workspace-accent-soft: #eaf1ff;
--border: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--input: oklch(0.922 0 0);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--border: oklch(1 0 0 / 10%);
--ring: oklch(0.556 0 0);
--card: oklch(0.205 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.205 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.922 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--input: oklch(1 0 0 / 15%);
--workspace-canvas: #0b0c0d;
--workspace-surface: rgba(20, 21, 22, 0.72);
--workspace-surface-strong: rgba(25, 26, 27, 0.9);
--workspace-border: rgba(255, 255, 255, 0.085);
--workspace-border-strong: rgba(255, 255, 255, 0.16);
--workspace-grid-line: rgba(255, 255, 255, 0.038);
--workspace-nav: rgba(11, 12, 13, 0.82);
--workspace-sidebar: #101112;
--workspace-accent: #7da2ff;
--workspace-accent-soft: rgba(80, 125, 230, 0.16);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.922 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.556 0 0);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
html,
body,
#root,
.ant-app {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
border: 0;
overflow: hidden;
overscroll-behavior: none;
background: var(--background);
}
body {
@apply bg-background text-foreground;
}
#root {
position: fixed;
inset: 0;
isolation: isolate;
}
textarea {
resize: none;
}
textarea::-webkit-resizer {
display: none;
}
html {
@apply font-sans;
}
}
@layer utilities {
.app-user-workspace {
background-color: var(--workspace-canvas);
}
.app-workspace-sidebar {
border-right: 1px solid var(--workspace-border);
background: var(--workspace-sidebar);
transition: width var(--motion-state) var(--ease-aceternity);
}
.app-workspace-nav-link.is-active {
background: color-mix(in srgb, var(--foreground) 6%, transparent);
color: var(--foreground);
}
.app-workspace-nav-link.is-active::before {
position: absolute;
left: -8px;
width: 2px;
height: 18px;
border-radius: 0 2px 2px 0;
background: var(--workspace-accent);
content: "";
}
.app-workspace-icon-button {
display: inline-flex;
width: 30px;
height: 30px;
flex: 0 0 auto;
align-items: center;
justify-content: center;
border-radius: 6px;
color: color-mix(in srgb, var(--foreground) 58%, transparent);
transition: color var(--motion-instant) ease-out, background-color var(--motion-instant) ease-out;
}
.app-workspace-icon-button:hover {
background: color-mix(in srgb, var(--foreground) 6%, transparent);
color: var(--foreground);
}
.workspace-signal-icon {
filter: drop-shadow(0 7px 16px color-mix(in srgb, var(--workspace-accent) 14%, transparent));
}
.workspace-state {
animation: workspace-state-enter var(--motion-panel) var(--ease-product-enter) both;
}
.workspace-loading-state .ant-skeleton-title,
.workspace-loading-state .ant-skeleton-paragraph > li {
border-radius: 4px;
}
:where(.ant-btn) {
letter-spacing: 0;
transition:
color var(--motion-instant) ease-out,
background-color var(--motion-instant) ease-out,
border-color var(--motion-instant) ease-out,
box-shadow var(--motion-instant) ease-out,
transform 90ms ease-out;
}
:where(.ant-btn:not(:disabled)):active {
transform: scale(0.98);
}
:where(.ant-select-item-option-content) {
min-width: 0;
}
.app-user-content,
.app-workspace-grid {
background: transparent;
}
.app-workspace-surface {
border-color: var(--workspace-border);
background: var(--workspace-surface);
box-shadow: 0 18px 54px color-mix(in srgb, var(--workspace-canvas) 62%, transparent), inset 0 1px 0 color-mix(in srgb, white 7%, transparent);
}
.credit-balance-card {
border-color: rgba(225, 185, 74, 0.3);
background: #11100d;
color: #f8edc5;
box-shadow: 0 28px 78px rgba(0, 0, 0, 0.38), inset 0 1px 0 rgba(255, 228, 145, 0.16);
}
.credit-balance-card::before {
position: absolute;
z-index: 1;
inset: 0;
border-radius: inherit;
background-image:
linear-gradient(to right, rgba(232, 193, 86, 0.055) 1px, transparent 1px),
linear-gradient(to bottom, rgba(232, 193, 86, 0.055) 1px, transparent 1px);
background-size: 28px 28px;
content: "";
pointer-events: none;
}
.credit-balance-card > * {
position: relative;
z-index: 3;
}
.app-collection-card {
position: relative;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
background: var(--workspace-surface-strong);
transition:
background-color var(--motion-instant) ease-out,
border-color var(--motion-instant) ease-out,
box-shadow var(--motion-instant) ease-out;
}
.app-collection-card:hover,
.app-collection-card:focus-within {
border-color: color-mix(in srgb, var(--foreground) 22%, var(--border));
background: color-mix(in srgb, var(--workspace-surface-strong) 96%, var(--foreground) 4%);
box-shadow: none;
}
/* 画布文件采用“缩略图 + 元信息”结构,避免整张卡片形成笨重的白色容器。 */
.app-canvas-project-card {
min-width: 0;
color: var(--foreground);
}
.app-canvas-project-preview {
overflow: hidden;
border: 1px solid var(--workspace-border);
border-radius: 8px;
background: var(--workspace-surface-strong);
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
transition:
border-color var(--motion-instant) ease-out,
box-shadow var(--motion-instant) ease-out;
}
.app-canvas-project-card:hover .app-canvas-project-preview,
.app-canvas-project-card:focus-within .app-canvas-project-preview {
border-color: color-mix(in srgb, var(--foreground) 24%, var(--workspace-border));
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.08);
}
.app-canvas-project-card.is-selected .app-canvas-project-preview {
border-color: var(--workspace-accent);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--workspace-accent) 22%, transparent);
}
.app-canvas-project-checkbox {
accent-color: var(--workspace-accent);
}
.app-canvas-selection-toolbar {
border-color: color-mix(in srgb, var(--workspace-accent) 24%, var(--workspace-border));
background: var(--workspace-accent-soft);
color: color-mix(in srgb, var(--workspace-accent) 48%, var(--foreground));
}
.dark .app-canvas-project-preview {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.28);
}
.dark .app-canvas-project-card:hover .app-canvas-project-preview,
.dark .app-canvas-project-card:focus-within .app-canvas-project-preview {
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.34);
}
.app-data-table .ant-table-pagination {
position: sticky;
z-index: 10;
bottom: 0;
margin: 0 !important;
border-top: 1px solid var(--border);
background: color-mix(in srgb, var(--background) 94%, transparent);
padding: 12px 16px;
backdrop-filter: blur(12px);
}
.app-list-search {
width: 100%;
}
@media (min-width: 640px) {
.app-list-search {
width: 20rem !important;
flex: 0 0 20rem;
}
}
.app-table-surface {
box-shadow: 0 14px 38px color-mix(in srgb, var(--foreground) 5%, transparent), inset 0 1px 0 color-mix(in srgb, var(--background) 72%, transparent);
}
.app-data-table .ant-table-container,
.app-data-table .ant-table-content,
.app-data-table .ant-table-body {
min-width: 0;
}
.app-data-table .ant-table-thead > tr > th,
.app-data-table .ant-table-tbody > tr > td {
overflow: hidden;
}
.app-data-table .ant-table-thead > tr > th {
white-space: nowrap;
}
.task-table-surface {
border-radius: 6px;
box-shadow: none;
}
.task-table-surface .ant-table-thead > tr > th {
height: 38px;
padding: 8px 12px !important;
background: color-mix(in srgb, var(--foreground) 4%, var(--background)) !important;
color: color-mix(in srgb, var(--foreground) 52%, transparent) !important;
font-size: 11px;
font-weight: 500;
}
.task-table-surface .ant-table-tbody > tr > td {
height: 72px;
padding: 10px 12px !important;
background: var(--background);
transition: background-color var(--motion-instant) ease-out;
}
.task-table-surface .ant-table-tbody > tr:hover > td {
background: color-mix(in srgb, var(--foreground) 2.5%, var(--background)) !important;
}
.task-media-preview-modal .ant-modal-body {
display: grid;
min-height: 240px;
place-items: center;
padding: 0 !important;
background: #000;
}
@media (max-width: 767px) {
.task-table-surface .ant-table-content table {
width: 100% !important;
min-width: 100% !important;
}
.task-table-surface .ant-table-tbody > tr > td {
height: auto;
padding: 12px !important;
}
}
.wallet-ledger-table .ant-table-cell:nth-last-child(-n + 2) {
white-space: nowrap;
}
.app-pagination-bar .ant-pagination {
display: flex;
min-width: 0;
flex-wrap: wrap;
justify-content: flex-end;
gap: 4px 0;
}
:where(.ant-modal-content, .ant-drawer-content) {
border: 1px solid var(--border);
box-shadow: 0 28px 84px rgba(15, 23, 42, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
backdrop-filter: blur(24px);
}
:where(.ant-modal) .ant-modal-content {
padding: 0;
overflow: hidden;
}
:where(.ant-modal) .ant-modal-header {
margin: 0;
border-bottom: 1px solid var(--border);
padding: 13px 16px 12px;
}
:where(.ant-modal) .ant-modal-body {
padding: 14px 16px;
}
:where(.ant-modal) .ant-modal-footer {
margin: 0;
border-top: 1px solid var(--border);
padding: 10px 16px;
}
:where(.ant-modal) .ant-modal-close {
top: 9px;
right: 10px;
}
.ant-drawer .ant-drawer-header {
min-height: 48px;
padding: 10px 14px;
}
.ant-drawer .ant-drawer-body {
padding: 14px;
}
.dark :where(.ant-modal-content, .ant-drawer-content) {
box-shadow: 0 32px 96px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.06) !important;
}
:where(.ant-modal-mask, .ant-drawer-mask) {
backdrop-filter: blur(5px);
}
:where(.ant-select-dropdown, .ant-dropdown-menu, .ant-popover-inner) {
border: 1px solid var(--border);
box-shadow: 0 20px 56px rgba(15, 23, 42, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
backdrop-filter: blur(22px);
}
.dark :where(.ant-select-dropdown, .ant-dropdown-menu, .ant-popover-inner) {
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.44), inset 0 1px 0 rgba(255, 255, 255, 0.06) !important;
}
:where(.ant-input, .ant-input-affix-wrapper, .ant-input-number, .ant-select-content) {
transition:
border-color var(--motion-instant) ease-out,
background-color var(--motion-instant) ease-out,
box-shadow var(--motion-instant) ease-out !important;
}
.auth-card-tabs .ant-tabs-nav {
margin: 0;
}
.auth-card-tabs .ant-tabs-nav-list {
width: 100%;
}
.auth-card-tabs .ant-tabs-tab {
flex: 1;
justify-content: center;
margin: 0 !important;
padding: 12px 0;
font-weight: 600;
}
.auth-card-dark input:-webkit-autofill,
.auth-card-dark input:-webkit-autofill:hover,
.auth-card-dark input:-webkit-autofill:focus {
box-shadow: 0 0 0 1000px #17181c inset !important;
-webkit-text-fill-color: #f5f5f5 !important;
caret-color: #f5f5f5;
}
:where(.ant-modal, .ant-drawer, .ant-select-dropdown, .ant-dropdown, .ant-popover) {
overscroll-behavior: contain;
}
@media (prefers-reduced-motion: reduce) {
.app-collection-card {
transition: none;
}
.app-collection-card:hover,
.app-collection-card:focus-within {
transform: none;
}
:where(.ant-input, .ant-input-affix-wrapper, .ant-input-number, .ant-select-content) {
transition: none !important;
}
}
.ant-table-wrapper .ant-table-thead > tr > th {
font-size: 12px;
font-weight: 500;
letter-spacing: 0.015em;
}
.ant-form-item-label > label {
font-weight: 500;
letter-spacing: 0.01em;
}
.aceternity-floating-dock {
isolation: isolate;
transform-origin: bottom center;
box-shadow: 0 24px 72px rgba(15, 23, 42, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.16);
}
.aceternity-dock-command {
border-color: color-mix(in srgb, currentColor 11%, transparent);
background: var(--dock-command-bg);
color: inherit;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 5px 15px rgba(15, 23, 42, 0.08);
transition:
border-color var(--motion-instant) ease-out,
background-color var(--motion-instant) ease-out,
color var(--motion-instant) ease-out,
box-shadow var(--motion-instant) ease-out;
}
.aceternity-dock-command > span:first-child svg {
width: 100%;
height: 100%;
stroke-width: 1.8;
}
.aceternity-dock-command:hover:not(:disabled) {
border-color: color-mix(in srgb, currentColor 20%, transparent);
background: var(--dock-command-hover);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 12px 30px rgba(15, 23, 42, 0.14);
}
.aceternity-dock-command.is-labeled {
border-color: transparent;
background: transparent;
box-shadow: none;
}
.aceternity-dock-command.is-labeled:hover:not(:disabled) {
border-color: transparent;
background: var(--dock-command-hover);
box-shadow: none;
}
.aceternity-dock-command.is-labeled.is-active {
border-color: transparent;
box-shadow: none;
}
.aceternity-dock-command.is-active {
border-color: color-mix(in srgb, var(--dock-command-active) 28%, transparent);
background: var(--dock-command-active);
color: var(--dock-command-active-text);
box-shadow: 0 12px 30px color-mix(in srgb, var(--dock-command-active) 22%, transparent);
}
.aceternity-dock-command.is-active > span:first-child,
.aceternity-dock-command.is-active > span:first-child svg {
color: var(--dock-command-active-text);
stroke: currentColor;
opacity: 1;
}
.aceternity-dock-command.is-danger {
color: var(--dock-command-danger);
}
.aceternity-dock-command:focus-visible {
box-shadow: 0 0 0 2px var(--dock-command-bg), 0 0 0 4px var(--dock-command-active);
}
.aceternity-dock-command:disabled {
cursor: not-allowed;
opacity: 0.3;
box-shadow: none;
}
.canvas-image-tool-checkbox .ant-checkbox-inner {
border-color: color-mix(in srgb, var(--tool-accent) 44%, transparent) !important;
background: transparent !important;
}
.canvas-image-tool-checkbox.ant-checkbox-wrapper-checked .ant-checkbox-inner,
.canvas-image-tool-checkbox .ant-checkbox-checked .ant-checkbox-inner {
border-color: var(--tool-accent) !important;
background: var(--tool-accent) !important;
}
.aceternity-dock-separator {
background: color-mix(in srgb, currentColor 13%, transparent);
}
.aceternity-dock-tooltip {
border-color: var(--dock-tooltip-border);
background: var(--dock-tooltip-bg);
color: inherit;
}
.aceternity-floating-panel {
transform-origin: bottom center;
box-shadow: 0 30px 90px rgba(15, 23, 42, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.app-workspace-canvas {
background: transparent;
}
.dark .app-workspace-canvas {
background: transparent;
}
.app-spatial-surface {
border: 1px solid rgba(17, 24, 39, 0.1);
background: rgba(255, 255, 255, 0.88);
box-shadow: 0 18px 48px rgba(15, 23, 42, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.72);
backdrop-filter: blur(22px);
}
.dark .app-spatial-surface {
border-color: rgba(255, 255, 255, 0.11);
background: rgba(28, 28, 30, 0.88);
box-shadow: 0 22px 60px rgba(0, 0, 0, 0.34), inset 0 1px 0 rgba(255, 255, 255, 0.07);
}
.app-spatial-interactive {
transition:
transform var(--motion-state) cubic-bezier(0.16, 1, 0.3, 1),
border-color var(--motion-state) ease-out,
box-shadow var(--motion-state) ease-out;
}
.app-spatial-interactive:hover {
transform: translateY(-2px);
border-color: rgba(79, 110, 232, 0.34);
box-shadow: 0 24px 68px rgba(15, 23, 42, 0.14), 0 0 0 1px rgba(79, 110, 232, 0.08);
}
.dark .app-spatial-interactive:hover {
border-color: rgba(130, 144, 240, 0.42);
box-shadow: 0 28px 76px rgba(0, 0, 0, 0.46), 0 0 0 1px rgba(130, 144, 240, 0.1);
}
@media (prefers-reduced-motion: reduce) {
.app-spatial-interactive {
transition: none;
}
.app-spatial-interactive:hover {
transform: none;
}
}
.aceternity-zoom-range {
appearance: none;
border-radius: 999px;
background: color-mix(in srgb, currentColor 12%, transparent);
cursor: ew-resize;
outline: none;
}
.aceternity-zoom-range::-webkit-slider-thumb {
width: 14px;
height: 14px;
appearance: none;
border: 2px solid currentColor;
border-radius: 999px;
background: var(--background);
box-shadow: 0 5px 16px rgba(15, 23, 42, 0.22);
}
.aceternity-zoom-range:focus-visible {
box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 18%, transparent);
}
.aceternity-comet-perspective[data-comet-active="true"] {
perspective: 1200px;
transform-style: preserve-3d;
}
.aceternity-comet-card {
transform-origin: center center;
}
.aceternity-comet-card[data-comet-active="true"] {
transform-style: preserve-3d;
backface-visibility: hidden;
will-change: transform;
}
.aceternity-comet-card::after {
position: absolute;
z-index: 2;
inset: 0;
border-radius: inherit;
background: linear-gradient(145deg, rgba(255, 255, 255, 0.16), transparent 24%, transparent 72%, rgba(255, 255, 255, 0.08));
content: "";
pointer-events: none;
}
.aceternity-drop-grid {
background-image:
linear-gradient(color-mix(in srgb, currentColor 14%, transparent) 1px, transparent 1px),
linear-gradient(90deg, color-mix(in srgb, currentColor 14%, transparent) 1px, transparent 1px);
background-position: center;
background-size: 34px 34px;
mask-image: radial-gradient(circle at center, black 12%, transparent 72%);
}
.ai-title-aurora {
background: linear-gradient(90deg, #111827 0%, #111827 36%, #6b7280 54%, #111827 72%, #111827 100%);
background-size: 220% 100%;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
animation: ai-title-aurora 7s ease-in-out infinite;
}
.dark .ai-title-aurora {
background: linear-gradient(90deg, #fafaf9 0%, #fafaf9 36%, #a8a29e 54%, #fafaf9 72%, #fafaf9 100%);
background-size: 220% 100%;
-webkit-background-clip: text;
background-clip: text;
}
@keyframes ai-title-aurora {
0%,
100% {
background-position: 0% 50%;
filter: drop-shadow(0 0 0 rgba(0, 0, 0, 0));
}
50% {
background-position: 100% 50%;
filter: drop-shadow(0 12px 28px rgba(28, 25, 23, 0.08));
}
}
.hide-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
}
.hide-scrollbar::-webkit-scrollbar {
display: none;
}
.prompt-filter-tag.ant-tag-checkable {
margin: 0;
border: 1px solid transparent;
border-radius: 6px;
padding: 5px 10px;
color: #57534e;
font-size: 14px;
line-height: 1;
transition:
background 0.15s ease,
border-color 0.15s ease,
box-shadow 0.15s ease,
color 0.15s ease;
}
.prompt-filter-tag.ant-tag-checkable:hover {
background: rgba(28, 25, 23, 0.06);
color: #1c1917;
}
.prompt-filter-tag.ant-tag-checkable.is-active,
.prompt-filter-tag.ant-tag-checkable-checked {
background: #111111;
border-color: #111111;
color: #ffffff;
font-weight: 600;
}
.dark .prompt-filter-tag.ant-tag-checkable {
color: #e7e5e4;
}
.dark .prompt-filter-tag.ant-tag-checkable:hover {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
.dark .prompt-filter-tag.ant-tag-checkable.is-active,
.dark .prompt-filter-tag.ant-tag-checkable-checked {
background: rgba(250, 250, 249, 0.96);
border-color: rgba(255, 255, 255, 0.88);
box-shadow:
0 0 0 1px rgba(255, 255, 255, 0.18),
0 6px 18px rgba(0, 0, 0, 0.22);
color: #0c0a09 !important;
font-weight: 700;
}
.thin-scrollbar {
scrollbar-color: rgba(120, 113, 108, 0.45) transparent;
scrollbar-width: thin;
}
.script-column-picker {
display: flex;
flex-wrap: wrap;
gap: 6px 12px;
font-size: 12px;
}
.script-column-picker .ant-checkbox-wrapper {
margin-inline-start: 0;
color: inherit;
}
.script-column-picker .ant-checkbox-inner {
width: 15px;
height: 15px;
border-radius: 4px;
border-color: rgba(120, 113, 108, 0.58);
background: transparent;
}
.script-column-picker .ant-checkbox-checked .ant-checkbox-inner {
border-color: #5b6ee1;
background: #5b6ee1;
}
.script-column-picker .ant-checkbox-checked .ant-checkbox-inner::after {
width: 4px;
height: 7px;
}
.script-column-picker .ant-checkbox-wrapper:hover .ant-checkbox-inner,
.script-column-picker .ant-checkbox:hover .ant-checkbox-inner {
border-color: #7485ee;
}
.thin-scrollbar::-webkit-scrollbar {
height: 4px;
width: 4px;
}
.thin-scrollbar::-webkit-scrollbar-thumb {
background: rgba(120, 113, 108, 0.45);
border-radius: 999px;
}
.storyboard-scrollbar {
overscroll-behavior: contain;
scrollbar-color: rgba(148, 163, 184, 0.72) rgba(120, 113, 108, 0.14);
scrollbar-gutter: stable;
scrollbar-width: auto;
}
.storyboard-scrollbar::-webkit-scrollbar {
width: 12px;
}
.storyboard-scrollbar::-webkit-scrollbar-track {
background: rgba(120, 113, 108, 0.14);
border-left: 1px solid rgba(120, 113, 108, 0.18);
}
.storyboard-scrollbar::-webkit-scrollbar-thumb {
min-height: 40px;
border: 2px solid transparent;
border-radius: 999px;
background: rgba(148, 163, 184, 0.72);
background-clip: content-box;
}
.storyboard-scrollbar::-webkit-scrollbar-thumb:hover {
background: rgba(186, 196, 210, 0.9);
background-clip: content-box;
}
.hover-scrollbar {
scrollbar-color: transparent transparent;
scrollbar-width: thin;
}
.hover-scrollbar:hover {
scrollbar-color: rgba(120, 113, 108, 0.5) transparent;
}
.hover-scrollbar::-webkit-scrollbar {
height: 6px;
width: 6px;
}
.hover-scrollbar::-webkit-scrollbar-thumb {
background: transparent;
border-radius: 999px;
}
.hover-scrollbar:hover::-webkit-scrollbar-track {
background: rgba(120, 113, 108, 0.12);
border-radius: 999px;
}
.hover-scrollbar:hover::-webkit-scrollbar-thumb {
background: rgba(120, 113, 108, 0.5);
}
.hover-scrollbar-hint {
position: relative;
}
.hover-scrollbar-hint::after {
background: rgba(120, 113, 108, 0.42);
border-radius: 999px;
bottom: 4px;
content: "";
height: 3px;
left: 12px;
opacity: 0;
pointer-events: none;
position: absolute;
right: 12px;
transition: opacity 0.18s ease;
}
.hover-scrollbar-hint:hover::after {
opacity: 1;
}
.canvas-control-select.ant-select .ant-select-content,
.canvas-control-number.ant-input-number {
border-color: rgba(120, 113, 108, 0.32) !important;
box-shadow: none !important;
}
.canvas-compact-control.canvas-control-select.ant-select {
height: 100%;
}
.canvas-compact-control.canvas-control-select.ant-select .ant-select-content,
.canvas-compact-control.canvas-control-number.ant-input-number {
height: 100% !important;
}
.canvas-compact-control.canvas-control-select.ant-select .ant-select-content > :first-child {
align-items: center;
display: flex;
}
.canvas-compact-control.canvas-control-select.ant-select .ant-select-content,
.canvas-compact-control.canvas-control-select.ant-select .ant-select-input,
.canvas-compact-control.canvas-control-number.ant-input-number .ant-input-number-input {
height: 100% !important;
line-height: 1 !important;
}
.canvas-composer-icon.ant-btn {
flex: 0 0 32px;
width: 32px;
}
.canvas-composer-tools {
container-type: inline-size;
}
.canvas-composer-mode-button {
width: 32px;
}
.canvas-composer-tools .canvas-composer-mode-button span,
.canvas-composer-tools .canvas-model-picker-label > span:nth-child(n + 2),
.canvas-composer-tools .canvas-composer-icon.ant-btn > span:not(.ant-btn-icon) {
display: none;
}
.canvas-composer-tools .canvas-composer-model-picker.ant-select {
width: 32px;
min-width: 32px;
}
.canvas-composer-tools .canvas-composer-model-picker .ant-select-content {
padding-inline: 7px !important;
}
.canvas-composer-tools .canvas-composer-model-picker .ant-select-content,
.canvas-composer-tools .canvas-model-picker-label {
min-width: 0;
}
.canvas-model-picker-popup .ant-select-item-option-content {
overflow: visible;
}
.canvas-composer-model-picker.ant-select .ant-select-content {
background: color-mix(in srgb, var(--background) 96%, var(--foreground) 4%) !important;
border-color: color-mix(in srgb, var(--foreground) 16%, transparent) !important;
box-shadow: none !important;
}
.canvas-composer-model-picker.ant-select-focused .ant-select-content {
border-color: color-mix(in srgb, var(--foreground) 28%, transparent) !important;
box-shadow: none !important;
}
.canvas-model-picker-popup .ant-select-item-option-active:not(.ant-select-item-option-disabled),
.canvas-model-picker-popup .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {
background: color-mix(in srgb, var(--foreground) 6%, transparent) !important;
}
.agent-text-model-select .ant-select-content {
padding-inline: 6px !important;
}
.agent-text-model-select .ant-select-content {
min-width: 0;
}
@container (min-width: 440px) {
.canvas-composer-mode-button {
padding-inline: 8px;
width: auto;
}
.canvas-composer-tools .canvas-composer-mode-button span {
display: inline;
font-size: 12px;
line-height: 1;
}
.canvas-composer-icon.ant-btn {
flex: 0 1 auto;
max-width: 170px;
width: auto !important;
}
.canvas-composer-tools .canvas-composer-icon.ant-btn > span:not(.ant-btn-icon) {
display: inline-flex;
min-width: 0;
}
.canvas-composer-tools .canvas-composer-model-picker.ant-select {
width: auto;
min-width: 9rem;
}
.canvas-composer-tools .canvas-composer-model-picker .ant-select-content {
padding-inline: 10px !important;
}
.canvas-composer-tools .canvas-model-picker-label > span:nth-child(n + 2) {
display: inline-flex;
}
}
.canvas-control-select.ant-select-focused .ant-select-content,
.canvas-control-number.ant-input-number-focused {
border-color: #a8a29e !important;
}
.dark .canvas-control-select.ant-select .ant-select-content,
.dark .canvas-control-number.ant-input-number {
border-color: rgba(214, 211, 209, 0.2) !important;
}
.dark .canvas-control-select.ant-select-focused .ant-select-content,
.dark .canvas-control-number.ant-input-number-focused {
border-color: #78716c !important;
}
.canvas-image-settings-popover .ant-popover-inner {
border-radius: 18px;
box-shadow: 0 18px 54px rgba(28, 25, 23, 0.16);
padding: 18px;
}
.canvas-image-settings-popover .ant-popover-inner-content {
max-height: calc(100vh - 96px);
overflow-y: auto;
}
.canvas-image-settings-popover .ant-segmented {
border-radius: 999px;
padding: 3px;
}
.canvas-image-settings-popover .ant-segmented-item {
border-radius: 999px;
}
.dark .canvas-image-settings-popover .ant-popover-inner {
box-shadow: 0 18px 54px rgba(0, 0, 0, 0.45);
}
.canvas-floating-dock,
.canvas-floating-panel,
.canvas-node-toolbar {
animation: canvas-panel-in 180ms cubic-bezier(0.2, 0.85, 0.18, 1) both;
}
/* 覆盖工具栏与节点之间的视觉留白,避免鼠标途中被相邻节点抢走悬浮状态。 */
.canvas-node-toolbar::after {
position: absolute;
top: 100%;
right: -8px;
left: -8px;
height: 14px;
content: "";
}
.canvas-floating-dock,
.canvas-node-toolbar {
box-shadow:
0 1px 2px rgba(15, 23, 42, 0.06),
0 10px 26px rgba(15, 23, 42, 0.08);
}
.dark .canvas-floating-dock,
.dark .canvas-node-toolbar {
box-shadow:
0 1px 1px rgba(0, 0, 0, 0.28),
0 12px 28px rgba(0, 0, 0, 0.3);
}
.canvas-floating-panel {
box-shadow:
0 1px 2px rgba(15, 23, 42, 0.06),
0 14px 34px rgba(15, 23, 42, 0.1);
}
@media (max-width: 1024px) {
.aceternity-mode-switch {
top: 56px;
}
}
.dark .canvas-floating-panel {
box-shadow:
0 1px 1px rgba(0, 0, 0, 0.28),
0 14px 34px rgba(0, 0, 0, 0.34);
}
.canvas-tool-button,
.canvas-menu-item,
.canvas-node-tool-button {
transform: translate3d(0, 0, 0) scale(1);
transition:
background-color 140ms ease,
color 140ms ease,
opacity 140ms ease,
box-shadow 140ms ease,
transform 160ms cubic-bezier(0.2, 0.85, 0.18, 1);
}
.canvas-connection-handle {
touch-action: none;
}
@media (pointer: coarse) {
.canvas-connection-handle {
width: 44px !important;
height: 44px !important;
}
}
.canvas-tool-button:not(:disabled):hover,
.canvas-node-tool-button:not(:disabled):hover {
transform: translate3d(0, -1px, 0) scale(1.04);
}
.canvas-tool-button:not(:disabled):active,
.canvas-node-tool-button:not(:disabled):active,
.canvas-menu-item:not(:disabled):active {
transform: translate3d(0, 0, 0) scale(0.94);
}
.canvas-menu-item:not(:disabled):hover {
transform: translate3d(4px, 0, 0);
}
.canvas-menu-item:not(:disabled):hover .canvas-menu-item-icon,
.canvas-node-tool-button:not(:disabled):hover .canvas-node-tool-icon {
transform: scale(1.08);
}
.canvas-menu-item-icon,
.canvas-node-tool-icon {
transition: transform 160ms cubic-bezier(0.2, 0.85, 0.18, 1);
}
.canvas-node-shell {
transition:
border-color 160ms ease,
box-shadow 160ms ease,
background-color 160ms ease;
}
.canvas-node-shell.aceternity-comet-card {
box-shadow: 0 18px 48px rgba(15, 23, 42, 0.1), 0 2px 6px rgba(15, 23, 42, 0.06);
}
.canvas-node-shell.aceternity-comet-card:hover {
box-shadow: 0 30px 80px rgba(15, 23, 42, 0.18), 0 6px 20px rgba(15, 23, 42, 0.1);
}
.dark .canvas-node-shell.aceternity-comet-card {
box-shadow: 0 22px 60px rgba(0, 0, 0, 0.34), 0 2px 8px rgba(0, 0, 0, 0.3);
}
.dark .canvas-node-shell.aceternity-comet-card:hover {
box-shadow: 0 34px 90px rgba(0, 0, 0, 0.52), 0 8px 26px rgba(0, 0, 0, 0.36);
}
[data-canvas-viewport-interacting="true"] .canvas-node-shell,
[data-canvas-viewport-interacting="true"] .aceternity-comet-card {
transition: none !important;
}
/* 静止期用最终倍率重新排版 DOM,避免 Windows Chromium 复用交互期的低分辨率合成纹理。 */
.canvas-world-layer {
transform: translate(var(--canvas-live-x), var(--canvas-live-y)) scale(var(--canvas-live-scale-ratio));
transform-origin: 0 0;
}
.canvas-world-raster-layer {
zoom: var(--canvas-committed-scale);
}
[data-canvas-viewport-interacting="true"] .canvas-world-layer {
transform: translate3d(var(--canvas-live-x), var(--canvas-live-y), 0) scale(var(--canvas-live-scale-ratio));
will-change: transform;
}
[data-canvas-viewport-interacting="true"] .canvas-node-shell.aceternity-comet-card,
[data-canvas-viewport-interacting="true"] .canvas-node-shell.aceternity-comet-card:hover {
box-shadow: none !important;
}
[data-canvas-viewport-interacting="true"] :where(.canvas-node-shell-generating::before, .canvas-connection-flow, .canvas-connection-draft) {
animation: none !important;
}
.canvas-node-shell-generating::before {
position: absolute;
z-index: 45;
inset: -1.5px;
padding: 1px;
border-radius: 19px;
background: linear-gradient(110deg, rgba(91, 110, 225, 0.66), rgba(96, 165, 250, 0.62), rgba(167, 139, 250, 0.58), rgba(244, 114, 182, 0.54), rgba(250, 204, 21, 0.5), rgba(52, 211, 153, 0.58), rgba(91, 110, 225, 0.66));
background-size: 300% 100%;
content: "";
filter: drop-shadow(0 0 3px rgba(96, 165, 250, 0.2));
pointer-events: none;
animation: canvas-generation-border-flow 2.4s linear infinite;
-webkit-mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
}
.dark .canvas-node-shell-generating::before {
filter: drop-shadow(0 0 4px rgba(91, 110, 225, 0.22));
}
.canvas-connection-flow {
animation: canvas-connection-flow 1.25s linear infinite;
}
.canvas-connection-draft {
animation: canvas-connection-flow 0.9s linear infinite;
}
@keyframes canvas-panel-in {
from {
opacity: 0;
filter: saturate(0.92);
}
to {
opacity: 1;
filter: saturate(1);
}
}
@keyframes canvas-connection-flow {
to {
stroke-dashoffset: -44;
}
}
@keyframes canvas-generation-border-flow {
to {
background-position: 300% 0;
}
}
.canvas-node-info-modal .ant-modal-header {
padding-right: 0;
}
.canvas-node-info-modal .ant-modal-title {
line-height: 1;
}
.canvas-node-info-modal .ant-modal-close {
top: 21px;
}
@keyframes canvas-batch-child-in {
from {
opacity: 0;
transform: translate(var(--batch-from-x), var(--batch-from-y)) rotate(var(--batch-from-rotate)) scale(0.72);
}
72% {
opacity: 1;
transform: translate(0, 0) rotate(-1deg) scale(1.015);
}
to {
opacity: 1;
transform: translate(0, 0) rotate(0) scale(1);
}
}
@keyframes canvas-batch-child-out {
from {
opacity: 1;
transform: translate(0, 0) rotate(0) scale(1);
}
to {
opacity: 0;
transform: translate(var(--batch-from-x), var(--batch-from-y)) rotate(var(--batch-from-rotate)) scale(0.72);
}
}
}
@keyframes workspace-state-enter {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
.workspace-state { animation: none; }
:where(.ant-btn:not(:disabled)):active { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.aceternity-comet-card,
.aceternity-dock-command,
.aceternity-floating-panel,
.canvas-menu-item {
transform: none !important;
transition-duration: 0.01ms !important;
}
.canvas-node-shell-generating::before,
.canvas-connection-flow,
.canvas-connection-draft {
animation: none;
}
.canvas-node-shell-generating::before {
background-position: 50% 0;
}
}
/* 章节编辑区用清晰边界区分工具栏与正文,同时保留连续写作空间。 */
.project-workbench-page .project-chapter-editor-wrap {
min-height: 100%;
}
.project-chapter-editor {
min-height: 100%;
width: 100%;
padding: 24px 28px 48px;
color: var(--foreground);
font-size: 15px;
line-height: 1.8;
}
.project-chapter-editor p {
margin: 0 0 1em;
}
.project-chapter-editor h1,
.project-chapter-editor h2,
.project-chapter-editor h3 {
margin: 1.35em 0 0.55em;
font-weight: 650;
line-height: 1.3;
letter-spacing: -0.02em;
}
.project-chapter-editor h1 { font-size: 1.55em; }
.project-chapter-editor h2 { font-size: 1.3em; }
.project-chapter-editor h3 { font-size: 1.12em; }
.project-chapter-editor ul,
.project-chapter-editor ol {
margin: 0 0 1em;
padding-left: 1.4em;
}
.project-chapter-editor blockquote {
margin: 1.2em 0;
border-left: 2px solid color-mix(in srgb, var(--workspace-accent) 55%, transparent);
padding-left: 1em;
color: color-mix(in srgb, var(--foreground) 66%, transparent);
}
.project-chapter-editor p.is-editor-empty:first-child::before {
float: left;
height: 0;
color: color-mix(in srgb, var(--foreground) 34%, transparent);
content: attr(data-placeholder);
pointer-events: none;
}
@media (max-width: 1023px) {
.project-workbench-page .project-chapter-editor-wrap {
min-height: 100%;
}
.project-chapter-editor {
min-height: 420px;
padding: 18px 20px 36px;
font-size: 15px;
}
}
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
html[data-theme-switching="true"] :where(.canvas-node-shell, .aceternity-comet-card, .aceternity-floating-panel, .canvas-connection-flow, .canvas-connection-draft) {
animation: none !important;
transition: none !important;
}