Files
ai-code-app/src/features/layout/draw/LayoutDrawPage.css

1047 lines
22 KiB
CSS

.layout-draw-page {
position: relative;
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
overflow: hidden;
overscroll-behavior: none;
overscroll-behavior-x: none;
touch-action: none;
background: #f8f8f2;
}
.layout-draw-page__toolbar {
position: absolute;
z-index: 4;
display: flex;
flex-direction: column;
gap: 8px;
padding: 8px;
background: rgba(255, 252, 245, 0.94);
border: 1px solid rgba(148, 163, 184, 0.24);
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.08);
backdrop-filter: blur(8px);
touch-action: none;
user-select: none;
}
.layout-draw-page__toolbar--attached {
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.1);
}
.layout-draw-page__toolbar-chrome {
display: flex;
align-items: center;
gap: 6px;
}
.layout-draw-page__toolbar-buttons {
display: flex;
gap: 8px;
}
.layout-draw-page__toolbar-buttons--tools,
.layout-draw-page__toolbar-buttons--actions {
flex-direction: column;
}
.layout-draw-page__toolbar-buttons--row,
.layout-draw-page__toolbar-buttons--mobile-actions {
flex-wrap: wrap;
}
.layout-draw-page__tool-group {
display: flex;
flex-direction: column;
gap: 6px;
padding: 8px;
border: 1px solid rgba(148, 163, 184, 0.34);
background: rgba(255, 255, 255, 0.44);
}
.layout-draw-page__tool-group--compact,
.layout-draw-page__tool-group--toggle {
padding: 8px;
}
.layout-draw-page__paint-palette {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 6px;
}
.layout-draw-page__paint-swatch {
width: 24px;
height: 24px;
border: 1px solid rgba(15, 23, 42, 0.18);
border-radius: 999px;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.62);
cursor: pointer;
}
.layout-draw-page__paint-swatch--active {
border-color: #7c8fb8;
box-shadow: 0 0 0 2px rgba(124, 143, 184, 0.22);
}
.layout-draw-page__paint-swatch--clear {
display: inline-flex;
align-items: center;
justify-content: center;
background:
linear-gradient(135deg, transparent 0 46%, rgba(220, 38, 38, 0.86) 46% 54%, transparent 54% 100%),
rgba(255, 255, 255, 0.92);
color: transparent;
}
.layout-draw-page__label-editor {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
min-width: 0;
padding-top: 2px;
}
.layout-draw-page__label-editor .ant-input {
min-width: 0;
font-size: 12px;
}
.layout-draw-page__box-handle {
display: inline-flex;
flex: 1;
align-items: center;
justify-content: center;
height: 20px;
padding: 0;
border: 0;
background: rgba(226, 232, 240, 0.96);
color: #475569;
cursor: grab;
touch-action: none;
}
.layout-draw-page__box-handle:active {
cursor: grabbing;
}
.layout-draw-page__box-handle:disabled {
cursor: default;
opacity: 0.45;
}
.layout-draw-page__box-handle--status {
width: 28px;
flex: 0 0 auto;
}
.layout-draw-page__icon-button {
width: 44px;
min-width: 44px;
height: 44px;
padding: 0;
border-radius: 0;
box-shadow: none;
pointer-events: auto;
}
.layout-draw-page__icon-button--chrome {
width: 30px;
min-width: 30px;
height: 20px;
border-radius: 0;
padding: 0;
}
.layout-draw-page__toolbar-anchor {
position: absolute;
z-index: 4;
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
border: 1px solid rgba(148, 163, 184, 0.32);
background: rgba(255, 252, 245, 0.94);
color: #334155;
box-shadow: 0 8px 18px rgba(15, 23, 42, 0.08);
backdrop-filter: blur(8px);
cursor: pointer;
}
.layout-draw-page__toolbar-anchor:hover {
border-color: rgba(124, 143, 184, 0.56);
}
.layout-draw-page__status {
position: absolute;
z-index: 4;
display: flex;
flex-direction: column;
gap: 6px;
min-width: 200px;
max-width: min(280px, calc(100vw - 16px));
padding: 8px 12px;
background: rgba(255, 252, 245, 0.92);
border: 1px solid rgba(148, 163, 184, 0.26);
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.08);
backdrop-filter: blur(8px);
font-size: 13px;
touch-action: none;
}
.layout-draw-page__status-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.layout-draw-page__status strong {
color: #0f172a;
font-size: 13px;
line-height: 1.2;
}
.layout-draw-page__status span {
color: #475569;
font-size: 12px;
}
.layout-draw-page__panel {
position: absolute;
top: 12px;
right: 72px;
z-index: 7;
width: min(320px, calc(100vw - 96px));
max-height: calc(100% - 24px);
display: flex;
flex-direction: column;
background: rgba(255, 252, 245, 0.96);
border: 1px solid rgba(148, 163, 184, 0.28);
box-shadow: 0 16px 36px rgba(15, 23, 42, 0.16);
backdrop-filter: blur(10px);
}
.layout-draw-page__panel-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 12px 14px;
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.layout-draw-page__panel-header strong {
color: #0f172a;
font-size: 14px;
}
.layout-draw-page__panel-body {
display: flex;
flex-direction: column;
gap: 10px;
padding: 14px;
overflow: auto;
}
.layout-draw-page__panel-label,
.layout-draw-page__panel-meta,
.layout-draw-page__saved-copy span {
color: #475569;
font-size: 12px;
}
.layout-draw-page__panel-error {
margin: 0;
color: #b91c1c;
font-size: 12px;
}
.layout-draw-page__panel-actions {
display: flex;
justify-content: flex-end;
}
.layout-draw-page__panel-loading {
display: flex;
justify-content: center;
padding: 24px 0;
}
.layout-draw-page__saved-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.layout-draw-page__saved-item {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
padding: 12px;
border: 1px solid rgba(148, 163, 184, 0.22);
background: rgba(255, 255, 255, 0.72);
}
.layout-draw-page__saved-copy {
display: flex;
flex: 1;
min-width: 0;
flex-direction: column;
gap: 4px;
}
.layout-draw-page__saved-copy strong {
color: #0f172a;
font-size: 13px;
line-height: 1.3;
}
.layout-draw-page__saved-actions {
display: flex;
flex-direction: column;
gap: 6px;
}
.layout-draw-page__canvas {
display: block;
width: 100%;
height: 100%;
touch-action: none;
background: #f8f8f2;
}
.layout-draw-page__paper {
fill: #f8f8f2;
}
.layout-draw-page__grid-minor {
stroke: rgba(148, 163, 184, 0.2);
stroke-width: 1;
}
.layout-draw-page__grid-major {
stroke: rgba(100, 116, 139, 0.34);
stroke-width: 1.2;
}
.layout-draw-page__region {
stroke: transparent;
stroke-width: 1;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__region--selected {
stroke: rgba(2, 132, 199, 0.86);
stroke-dasharray: 6 4;
}
.layout-draw-page__line {
stroke: #0f172a;
stroke-width: 2;
stroke-linecap: square;
shape-rendering: crispEdges;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__line--selected,
.layout-draw-page__rect--selected {
stroke: #0284c7;
}
.layout-draw-page__line--draft,
.layout-draw-page__rect--draft {
stroke: #0ea5e9;
stroke-dasharray: 8 6;
}
.layout-draw-page__rect {
fill: rgba(14, 165, 233, 0.08);
stroke: #0f172a;
stroke-width: 2;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__region {
stroke: none;
}
.layout-draw-page__region--selected {
stroke: #0284c7;
stroke-width: 2;
stroke-dasharray: 6 4;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__rect--draft {
fill: rgba(14, 165, 233, 0.12);
}
.layout-draw-page__shape-label {
fill: #0f172a;
font-size: 14px;
font-weight: 700;
pointer-events: none;
user-select: none;
}
.layout-draw-page__resize-handle {
fill: #fff;
stroke: #0284c7;
stroke-width: 2;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__selection-box {
fill: rgba(2, 132, 199, 0.12);
stroke: #0284c7;
stroke-width: 2;
stroke-dasharray: 8 6;
vector-effect: non-scaling-stroke;
}
.layout-draw-page__component-modal .ant-modal-content {
overflow: hidden;
border-radius: 24px;
background:
linear-gradient(180deg, rgba(255, 252, 245, 0.98), rgba(255, 255, 255, 0.98)),
linear-gradient(135deg, rgba(191, 219, 254, 0.2), rgba(253, 224, 71, 0.08));
}
.layout-draw-page__component-modal .ant-modal-header {
margin-bottom: 12px;
padding-bottom: 0;
background: transparent;
}
.layout-draw-page__component-modal .ant-modal-body {
display: flex;
max-height: min(76vh, 920px);
flex-direction: column;
gap: 16px;
overflow: hidden;
}
.layout-draw-page__component-modal-copy {
display: flex;
flex-direction: column;
gap: 6px;
}
.layout-draw-page__component-modal-copy strong {
color: #0f172a;
font-size: 15px;
}
.layout-draw-page__component-modal-copy span {
color: #475569;
font-size: 13px;
line-height: 1.5;
}
.layout-draw-page__component-save-form {
display: flex;
flex-direction: column;
gap: 8px;
}
.layout-draw-page__component-tabs {
display: flex;
min-height: 0;
flex: 1;
flex-direction: column;
}
.layout-draw-page__component-tabs .ant-tabs-nav {
margin-bottom: 20px;
}
.layout-draw-page__component-tabs .ant-tabs-nav::before {
border-bottom-color: rgba(226, 232, 240, 0.96);
}
.layout-draw-page__component-tabs .ant-tabs-tab {
padding: 6px 0 14px;
margin: 0 28px 0 0;
color: #94a3b8;
font-size: 15px;
font-weight: 600;
background: transparent;
border-radius: 0;
}
.layout-draw-page__component-tabs .ant-tabs-tab-active {
background: transparent;
}
.layout-draw-page__component-tabs .ant-tabs-tab:hover {
color: #475569;
}
.layout-draw-page__component-tabs .ant-tabs-tab-active .ant-tabs-tab-btn {
color: #0f172a;
}
.layout-draw-page__component-tabs .ant-tabs-ink-bar {
height: 2px;
border-radius: 0;
background: #0f172a;
}
.layout-draw-page__component-tabs .ant-tabs-content-holder,
.layout-draw-page__component-tabs .ant-tabs-content,
.layout-draw-page__component-tabs .ant-tabs-tabpane {
min-height: 0;
}
.layout-draw-page__component-modal-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 220px;
}
.layout-draw-page__component-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
overflow: auto;
padding-right: 4px;
}
.layout-draw-page__component-card {
min-width: 0;
border-radius: 18px;
border-color: rgba(148, 163, 184, 0.22);
background: rgba(255, 255, 255, 0.88);
box-shadow: 0 18px 36px rgba(15, 23, 42, 0.06);
}
.layout-draw-page__component-card .ant-card-head {
min-height: 44px;
}
.layout-draw-page__component-card .ant-card-body {
display: flex;
flex-direction: column;
gap: 12px;
}
.layout-draw-page__component-card-copy {
display: flex;
flex-direction: column;
gap: 8px;
}
.layout-draw-page__component-card-copy .ant-typography {
margin-bottom: 0;
}
.layout-draw-page__component-card-meta {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.layout-draw-page__component-card-preview {
min-width: 0;
overflow: hidden;
padding: 14px;
border: 1px solid rgba(148, 163, 184, 0.18);
border-radius: 16px;
background:
radial-gradient(circle at top left, rgba(226, 232, 240, 0.56), rgba(255, 255, 255, 0) 44%),
linear-gradient(180deg, #ffffff, #f8fafc);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.92),
0 12px 28px rgba(15, 23, 42, 0.08);
}
.layout-draw-page__component-preview-column {
display: flex;
flex-direction: column;
gap: 8px;
}
.layout-draw-page__component-preview-column--grow {
flex: 1;
}
.layout-draw-page__component-preview-row {
display: flex;
align-items: center;
gap: 12px;
}
.layout-draw-page__component-preview-row--tight {
gap: 0;
}
.layout-draw-page__component-preview-row--end {
justify-content: flex-end;
}
.layout-draw-page__component-preview-row--form {
align-items: flex-start;
}
.layout-draw-page__component-preview-shot {
display: flex;
flex-direction: column;
gap: 12px;
padding: 14px;
border: 1px solid rgba(226, 232, 240, 0.96);
border-radius: 18px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.99), rgba(248, 250, 252, 0.96));
box-shadow: 0 18px 36px rgba(148, 163, 184, 0.16);
}
.layout-draw-page__component-preview-shot--dashboard,
.layout-draw-page__component-preview-shot--detail,
.layout-draw-page__component-preview-shot--stats {
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(248, 250, 252, 0.98)),
linear-gradient(135deg, rgba(148, 163, 184, 0.12), rgba(255, 255, 255, 0));
}
.layout-draw-page__component-preview-shot-topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.layout-draw-page__component-preview-eyebrow {
color: #64748b;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.layout-draw-page__component-preview-hero-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 46px;
padding: 0 18px;
border-radius: 14px;
background: linear-gradient(135deg, #0f172a, #334155);
color: #f8fafc;
font-size: 13px;
font-weight: 700;
}
.layout-draw-page__component-preview-window {
display: flex;
flex-direction: column;
gap: 14px;
padding: 6px;
border-radius: 16px;
background: linear-gradient(180deg, rgba(248, 250, 252, 0.94), rgba(255, 255, 255, 0.98));
}
.layout-draw-page__component-preview-window-header {
display: flex;
align-items: center;
gap: 10px;
}
.layout-draw-page__component-preview-window-dots {
display: inline-flex;
gap: 5px;
}
.layout-draw-page__component-preview-window-dots span {
width: 7px;
height: 7px;
border-radius: 999px;
background: #cbd5e1;
}
.layout-draw-page__component-preview-window-bar {
flex: 1;
height: 10px;
border-radius: 999px;
background: rgba(226, 232, 240, 0.92);
}
.layout-draw-page__component-preview-tabbar {
display: flex;
align-items: center;
gap: 24px;
padding: 2px 0 0;
border-bottom: 1px solid rgba(226, 232, 240, 0.96);
color: #64748b;
font-size: 13px;
font-weight: 600;
}
.layout-draw-page__component-preview-tabbar-active {
position: relative;
color: #0f172a;
}
.layout-draw-page__component-preview-tabbar-active::after {
content: '';
position: absolute;
right: 0;
bottom: -9px;
left: 0;
height: 2px;
border-radius: 999px;
background: #0f172a;
}
.layout-draw-page__component-preview-filter-pills {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.layout-draw-page__component-preview-card-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.layout-draw-page__component-preview-metric-card {
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
padding: 14px 12px;
border: 1px solid rgba(226, 232, 240, 0.96);
border-radius: 16px;
background: rgba(255, 255, 255, 0.96);
}
.layout-draw-page__component-preview-metric {
color: #0f172a;
font-size: 24px;
font-weight: 700;
line-height: 1;
}
.layout-draw-page__component-preview-spark {
height: 36px;
border-radius: 12px;
background:
linear-gradient(180deg, rgba(59, 130, 246, 0.12), rgba(59, 130, 246, 0)),
linear-gradient(90deg, rgba(59, 130, 246, 0.18) 10%, rgba(59, 130, 246, 0.7) 45%, rgba(59, 130, 246, 0.2) 100%);
}
.layout-draw-page__component-preview-spark--green {
background:
linear-gradient(180deg, rgba(34, 197, 94, 0.12), rgba(34, 197, 94, 0)),
linear-gradient(90deg, rgba(34, 197, 94, 0.18) 10%, rgba(34, 197, 94, 0.68) 45%, rgba(34, 197, 94, 0.2) 100%);
}
.layout-draw-page__component-preview-spark--amber {
background:
linear-gradient(180deg, rgba(249, 115, 22, 0.12), rgba(249, 115, 22, 0)),
linear-gradient(90deg, rgba(249, 115, 22, 0.18) 10%, rgba(249, 115, 22, 0.72) 45%, rgba(249, 115, 22, 0.2) 100%);
}
.layout-draw-page__component-preview-text-block {
display: flex;
flex-direction: column;
gap: 8px;
}
.layout-draw-page__component-preview-text-line {
height: 10px;
border-radius: 999px;
background: rgba(203, 213, 225, 0.72);
}
.layout-draw-page__component-preview-text-line--title {
width: 48%;
height: 14px;
background: rgba(148, 163, 184, 0.9);
}
.layout-draw-page__component-preview-text-line--short {
width: 62%;
}
.layout-draw-page__component-preview-divider {
height: 1px;
background: rgba(226, 232, 240, 0.96);
}
.layout-draw-page__component-preview-property-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.layout-draw-page__component-preview-property-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 12px;
border: 1px solid rgba(226, 232, 240, 0.96);
border-radius: 12px;
background: rgba(248, 250, 252, 0.92);
}
.layout-draw-page__component-preview-property-item span {
color: #64748b;
font-size: 11px;
font-weight: 600;
}
.layout-draw-page__component-preview-property-item strong {
color: #0f172a;
font-size: 12px;
font-weight: 700;
}
.layout-draw-page__component-preview-button,
.layout-draw-page__component-preview-space,
.layout-draw-page__component-preview-title,
.layout-draw-page__component-preview-caption,
.layout-draw-page__component-preview-segment,
.layout-draw-page__component-preview-chip {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 14px;
border: 1px solid rgba(148, 163, 184, 0.24);
color: #1e293b;
font-size: 12px;
font-weight: 600;
white-space: nowrap;
}
.layout-draw-page__component-preview-button {
min-width: 84px;
height: 40px;
padding: 0 18px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(248, 250, 252, 0.96));
box-shadow: 0 6px 14px rgba(148, 163, 184, 0.1);
}
.layout-draw-page__component-preview-button--primary,
.layout-draw-page__component-preview-segment--active,
.layout-draw-page__component-preview-chip--active {
border-color: rgba(59, 130, 246, 0.2);
background: linear-gradient(180deg, #eff6ff, #dbeafe);
}
.layout-draw-page__component-preview-button--compact {
min-width: 64px;
height: 32px;
padding: 0 14px;
}
.layout-draw-page__component-preview-space {
min-height: 46px;
justify-content: flex-start;
padding: 0 14px;
border-style: solid;
background: rgba(248, 250, 252, 0.92);
}
.layout-draw-page__component-preview-space--input {
flex: 1;
}
.layout-draw-page__component-preview-space--body {
min-height: 56px;
}
.layout-draw-page__component-preview-title {
justify-content: flex-start;
min-height: 34px;
padding: 0 14px;
border-color: rgba(226, 232, 240, 0.96);
background: rgba(255, 255, 255, 0.98);
font-size: 14px;
font-weight: 700;
}
.layout-draw-page__component-preview-title--flex {
flex: 1;
}
.layout-draw-page__component-preview-title--label {
min-width: 76px;
}
.layout-draw-page__component-preview-caption {
justify-content: flex-start;
min-height: 24px;
width: fit-content;
padding: 0;
border: none;
background: transparent;
font-size: 11px;
font-weight: 500;
color: #64748b;
}
.layout-draw-page__component-preview-segment {
min-height: 34px;
padding: 0 16px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.94);
}
.layout-draw-page__component-preview-chip {
min-height: 30px;
padding: 0 12px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.96);
}
@media (max-width: 768px) {
.layout-draw-page__toolbar {
gap: 5px;
padding: 5px;
max-width: calc(100vw - 16px);
}
.layout-draw-page__icon-button {
width: 32px;
min-width: 32px;
height: 32px;
}
.layout-draw-page__icon-button .anticon,
.layout-draw-page__toolbar-anchor .anticon,
.layout-draw-page__box-handle .anticon {
font-size: 13px;
}
.layout-draw-page__icon-button--chrome {
width: 24px;
min-width: 24px;
height: 18px;
}
.layout-draw-page__toolbar-buttons {
gap: 5px;
}
.layout-draw-page__toolbar-buttons--tools {
flex-direction: row;
}
.layout-draw-page__toolbar-buttons--actions,
.layout-draw-page__toolbar-buttons--row,
.layout-draw-page__toolbar-buttons--mobile-actions {
flex-direction: row;
max-width: 146px;
}
.layout-draw-page__label-editor {
max-width: 146px;
}
.layout-draw-page__paint-palette {
max-width: 146px;
gap: 5px;
}
.layout-draw-page__paint-swatch {
width: 20px;
height: 20px;
}
.layout-draw-page__toolbar--mobile-expanded {
gap: 6px;
}
.layout-draw-page__tool-group {
gap: 4px;
padding: 6px;
}
.layout-draw-page__toolbar-anchor {
width: 32px;
height: 32px;
}
.layout-draw-page__action-button--background {
opacity: 0.68;
}
.layout-draw-page__status {
min-width: min(220px, calc(100vw - 16px));
max-width: min(260px, calc(100vw - 16px));
padding: 7px 10px;
}
.layout-draw-page__panel {
top: auto;
right: 8px;
bottom: calc(56px + max(16px, env(safe-area-inset-bottom)));
left: 8px;
width: auto;
max-height: min(320px, calc(100% - 88px));
}
.layout-draw-page__saved-item {
flex-direction: column;
}
.layout-draw-page__saved-actions {
width: 100%;
flex-direction: row;
}
.layout-draw-page__saved-actions .ant-btn {
flex: 1;
}
.layout-draw-page__component-modal {
max-width: calc(100vw - 16px);
}
.layout-draw-page__component-modal .ant-modal-body {
max-height: min(78vh, calc(100vh - 96px));
gap: 12px;
}
.layout-draw-page__component-tabs .ant-tabs-nav {
margin-bottom: 10px;
}
.layout-draw-page__component-tabs .ant-tabs-tab {
margin-right: 16px;
font-size: 13px;
padding-bottom: 10px;
}
.layout-draw-page__component-grid {
grid-template-columns: minmax(0, 1fr);
gap: 10px;
}
.layout-draw-page__component-card-preview {
padding: 10px;
}
.layout-draw-page__component-card-meta {
align-items: stretch;
flex-direction: column;
}
.layout-draw-page__component-preview-row {
flex-wrap: wrap;
gap: 8px;
}
.layout-draw-page__component-preview-card-grid {
grid-template-columns: minmax(0, 1fr);
}
}