mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
1768 lines
34 KiB
SCSS
1768 lines
34 KiB
SCSS
// Feature page components — BEM classes for JSON-driven UI definitions
|
|
// Uses MD3 CSS custom properties from var(--mat-sys-*)
|
|
|
|
// ─── File Explorer ──────────────────────────────────────────────────────────
|
|
|
|
.file-explorer {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background: var(--mat-sys-surface-container);
|
|
border-right: 1px solid var(--mat-sys-outline-variant);
|
|
|
|
&__header {
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 12px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__title {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.06em;
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
|
|
&__body {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
padding: 6px 12px;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface);
|
|
cursor: pointer;
|
|
border-radius: 4px;
|
|
transition: background 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
|
|
}
|
|
|
|
&--active {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
color: var(--mat-sys-primary);
|
|
font-weight: 500;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ─── Tree Panel ─────────────────────────────────────────────────────────────
|
|
|
|
.tree-panel {
|
|
width: 320px;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
padding: 16px;
|
|
background: var(--mat-sys-surface-container);
|
|
border-right: 1px solid var(--mat-sys-outline-variant);
|
|
|
|
&__header {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__header-row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
&__title-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__body {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__node {
|
|
background: var(--mat-sys-surface);
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
cursor: pointer;
|
|
transition: background 150ms ease, box-shadow 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 4%, var(--mat-sys-surface));
|
|
}
|
|
|
|
&--selected {
|
|
border-color: var(--mat-sys-primary);
|
|
box-shadow: 0 0 0 2px var(--mat-sys-primary);
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 8%, var(--mat-sys-surface));
|
|
}
|
|
}
|
|
|
|
&__node-header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
&__node-info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
&__node-name {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin: 0;
|
|
}
|
|
|
|
&__node-desc {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 2;
|
|
-webkit-box-orient: vertical;
|
|
overflow: hidden;
|
|
margin: 2px 0 0;
|
|
}
|
|
|
|
&__node-badge {
|
|
margin-top: 8px;
|
|
}
|
|
|
|
&__node-actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
}
|
|
}
|
|
|
|
// ─── Tree Card ──────────────────────────────────────────────────────────────
|
|
|
|
.tree-card {
|
|
cursor: pointer;
|
|
transition: background 150ms ease, box-shadow 150ms ease;
|
|
padding: 16px;
|
|
border-radius: 8px;
|
|
background: var(--mat-sys-surface);
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 4%, var(--mat-sys-surface));
|
|
}
|
|
|
|
&--selected {
|
|
border-color: var(--mat-sys-primary);
|
|
box-shadow: 0 0 0 2px var(--mat-sys-primary);
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 8%, var(--mat-sys-surface));
|
|
}
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__name {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin: 0;
|
|
}
|
|
|
|
&__description {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 2;
|
|
-webkit-box-orient: vertical;
|
|
overflow: hidden;
|
|
}
|
|
}
|
|
|
|
// ─── Navigation Menu ────────────────────────────────────────────────────────
|
|
|
|
.nav-menu {
|
|
&__header {
|
|
padding: 16px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__title {
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__controls {
|
|
display: flex;
|
|
gap: 8px;
|
|
margin-top: 16px;
|
|
}
|
|
|
|
&__body {
|
|
padding: 0 16px;
|
|
}
|
|
|
|
&__groups {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
padding: 16px 0;
|
|
}
|
|
|
|
&__group {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
&__group-trigger {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
width: 100%;
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
padding: 4px 0;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
|
|
&:hover {
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
}
|
|
|
|
&__group-caret {
|
|
transition: transform 200ms ease;
|
|
flex-shrink: 0;
|
|
|
|
&--open {
|
|
transform: rotate(180deg);
|
|
}
|
|
}
|
|
|
|
&__group-label {
|
|
flex: 1;
|
|
text-align: left;
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.08em;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__group-count {
|
|
font-size: 11px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__group-items {
|
|
margin-top: 4px;
|
|
padding-left: 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
}
|
|
|
|
&__item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
width: 100%;
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
padding: 6px 8px;
|
|
border-radius: 6px;
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
transition: background 150ms ease;
|
|
text-align: left;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
|
|
}
|
|
|
|
&--active {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
color: var(--mat-sys-primary);
|
|
}
|
|
}
|
|
|
|
&__item-icon {
|
|
flex-shrink: 0;
|
|
width: 20px;
|
|
height: 20px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
&__item-label {
|
|
flex: 1;
|
|
}
|
|
}
|
|
|
|
// ─── Storybook Designer ─────────────────────────────────────────────────────
|
|
|
|
.storybook-designer {
|
|
height: 100%;
|
|
display: flex;
|
|
|
|
&__list-panel {
|
|
width: 320px;
|
|
flex-shrink: 0;
|
|
background: var(--mat-sys-surface-container);
|
|
border-right: 1px solid var(--mat-sys-outline-variant);
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
&__list-header {
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 16px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__list-title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__list-actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__list-body {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__category-group {
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
&__category-label {
|
|
padding: 8px 16px;
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.08em;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__category-items {
|
|
padding: 0 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
}
|
|
|
|
&__story-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 6px 8px;
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: background 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
|
|
}
|
|
|
|
&--selected {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
}
|
|
}
|
|
|
|
&__story-info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
&__story-component {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
&__story-name {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
&__editor-panel {
|
|
flex: 1;
|
|
padding: 24px;
|
|
overflow-y: auto;
|
|
background: var(--mat-sys-surface);
|
|
}
|
|
|
|
&__editor-content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 24px;
|
|
}
|
|
|
|
&__editor-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
&__editor-title {
|
|
font-size: 22px;
|
|
font-weight: 700;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__fields-grid {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__args-row {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__args-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__arg-row {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__arg-details {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__arg-label-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__empty-state {
|
|
height: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
&__empty-state-content {
|
|
text-align: center;
|
|
}
|
|
|
|
&__empty-state-title {
|
|
font-size: 18px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 8px;
|
|
}
|
|
|
|
&__empty-state-subtitle {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0 0 16px;
|
|
}
|
|
}
|
|
|
|
// ─── Schema Viewer ──────────────────────────────────────────────────────────
|
|
|
|
.schema-viewer {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background: var(--mat-sys-surface-container);
|
|
|
|
&__header {
|
|
flex-shrink: 0;
|
|
padding: 12px 16px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__tabs {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
}
|
|
|
|
&__code {
|
|
padding: 16px;
|
|
font-size: 12px;
|
|
font-family: monospace;
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
|
|
&__preview {
|
|
padding: 16px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
font-size: 13px;
|
|
}
|
|
}
|
|
|
|
// ─── Feature Toggle ─────────────────────────────────────────────────────────
|
|
|
|
.feature-toggle {
|
|
height: 100%;
|
|
padding: 24px;
|
|
background: var(--mat-sys-surface);
|
|
|
|
&__header {
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 22px;
|
|
font-weight: 700;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 8px;
|
|
}
|
|
|
|
&__description {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
&__grid {
|
|
display: grid;
|
|
grid-template-columns: 1fr;
|
|
gap: 16px;
|
|
|
|
@media (min-width: 1024px) {
|
|
grid-template-columns: 1fr 1fr;
|
|
}
|
|
}
|
|
|
|
&__item {
|
|
background: var(--mat-sys-surface-container);
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__item-info {
|
|
flex: 1;
|
|
}
|
|
|
|
&__item-name {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 4px;
|
|
}
|
|
|
|
&__item-desc {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
}
|
|
|
|
// ─── Seed Manager ───────────────────────────────────────────────────────────
|
|
|
|
.seed-manager {
|
|
$gutter: 28px;
|
|
|
|
&__card {
|
|
max-width: 600px;
|
|
}
|
|
|
|
&__header {
|
|
padding: $gutter $gutter 20px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__title-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__title-icon {
|
|
color: var(--mat-sys-primary);
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
// Override CardContent's default 16px padding so everything aligns to $gutter
|
|
&__content {
|
|
padding: $gutter !important;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: $gutter;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 20px;
|
|
}
|
|
|
|
&__buttons-row {
|
|
display: flex;
|
|
gap: 10px;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
}
|
|
|
|
&__helper-text {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
padding: 16px;
|
|
background: var(--mat-sys-surface-container-low);
|
|
border-radius: 8px;
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
|
|
p { margin: 0; line-height: 1.6; }
|
|
|
|
strong { color: var(--mat-sys-on-surface); }
|
|
}
|
|
}
|
|
|
|
// ─── Storage Settings ───────────────────────────────────────────────────────
|
|
|
|
.storage-settings {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 24px;
|
|
|
|
&__backend-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__backend-label {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__options {
|
|
display: grid;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__flask-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__flask-row {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__other-backends {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__export-row {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
}
|
|
|
|
// ─── Feature Cloud ──────────────────────────────────────────────────────────
|
|
|
|
.feature-cloud {
|
|
padding: 16px;
|
|
|
|
&__title {
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 8px;
|
|
}
|
|
|
|
&__empty {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
&__items {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
margin-top: 12px;
|
|
}
|
|
|
|
&__tag {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 4px 12px;
|
|
border-radius: 16px;
|
|
font-size: 13px;
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
color: var(--mat-sys-primary);
|
|
cursor: pointer;
|
|
transition: background 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 20%, transparent);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ─── Documentation View ─────────────────────────────────────────────────────
|
|
|
|
.doc-view {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background: var(--mat-sys-surface);
|
|
|
|
&__tabs {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
&__header {
|
|
flex-shrink: 0;
|
|
background: var(--mat-sys-surface-container);
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
padding: 12px 24px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__tabs-list {
|
|
display: flex;
|
|
flex-direction: row;
|
|
gap: 4px;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
&__search-wrapper {
|
|
position: relative;
|
|
}
|
|
|
|
&__search-icon {
|
|
position: absolute;
|
|
left: 12px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
color: var(--mat-sys-on-surface-variant);
|
|
pointer-events: none;
|
|
}
|
|
|
|
&__search-input {
|
|
padding-left: 40px;
|
|
width: 100%;
|
|
}
|
|
|
|
&__body {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__content {
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
padding: 32px;
|
|
}
|
|
|
|
&__content-title {
|
|
font-size: 1.5rem;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 24px;
|
|
}
|
|
|
|
&__sections {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__para {
|
|
font-size: 0.9375rem;
|
|
line-height: 1.7;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
}
|
|
|
|
// ─── Atomic Library Showcase ────────────────────────────────────────────────
|
|
|
|
.atomic-showcase {
|
|
max-width: 1280px;
|
|
margin: 0 auto;
|
|
padding: 32px 16px;
|
|
|
|
&__sections {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 48px;
|
|
}
|
|
}
|
|
|
|
// ─── JSON Component Tree Manager ────────────────────────────────────────────
|
|
|
|
.tree-manager {
|
|
height: 100%;
|
|
width: 100%;
|
|
}
|
|
|
|
// ─── Playwright Designer ────────────────────────────────────────────────────
|
|
|
|
.playwright-designer {
|
|
&__editor {
|
|
flex: 1;
|
|
padding: 24px;
|
|
overflow: auto;
|
|
background: var(--mat-sys-surface);
|
|
}
|
|
|
|
&__btn-label {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
}
|
|
|
|
// ─── Playwright Editor Content ───────────────────────────────────────────────
|
|
|
|
.playwright-editor {
|
|
&__content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 20px;
|
|
font-weight: 700;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__fields {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
padding: 8px 0;
|
|
}
|
|
|
|
&__steps-header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__scroll-area {
|
|
height: 400px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__steps-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
padding: 4px 0;
|
|
}
|
|
|
|
&__no-steps {
|
|
text-align: center;
|
|
padding: 48px 0;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
&__label {
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
display: block;
|
|
margin-bottom: 4px;
|
|
}
|
|
}
|
|
|
|
// ─── Step Editor ─────────────────────────────────────────────────────────────
|
|
|
|
.step-editor {
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
&__index-label {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
|
|
&__fields {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
|
|
&--full {
|
|
grid-column: span 2;
|
|
}
|
|
}
|
|
|
|
&__field-label {
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__select {
|
|
width: 100%;
|
|
padding: 8px 12px;
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
border-radius: 4px;
|
|
background: var(--mat-sys-surface);
|
|
color: var(--mat-sys-on-surface);
|
|
font-size: 14px;
|
|
cursor: pointer;
|
|
|
|
&:focus {
|
|
outline: 2px solid var(--mat-sys-primary);
|
|
outline-offset: -1px;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ─── Test List ───────────────────────────────────────────────────────────────
|
|
|
|
.test-list {
|
|
width: 320px;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-right: 1px solid var(--mat-sys-outline-variant);
|
|
background: var(--mat-sys-surface-container);
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 12px 16px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__scroll {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__items {
|
|
padding: 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
}
|
|
|
|
&__item {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
padding: 10px 12px;
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: background 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
|
|
|
|
.test-list__item-delete {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
&--selected {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
|
|
.test-list__item-name {
|
|
color: var(--mat-sys-primary);
|
|
}
|
|
}
|
|
}
|
|
|
|
&__item-body {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
&__item-name {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
&__item-url {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
&__item-steps {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin-top: 2px;
|
|
}
|
|
|
|
&__item-delete {
|
|
opacity: 0;
|
|
transition: opacity 150ms ease;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__empty {
|
|
padding: 32px 16px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
}
|
|
|
|
// ─── Project Settings ────────────────────────────────────────────────────────
|
|
|
|
.project-settings {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background: var(--mat-sys-surface);
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 16px;
|
|
padding: 20px 24px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
flex-shrink: 0;
|
|
background: var(--mat-sys-surface-container);
|
|
}
|
|
|
|
&__icon {
|
|
width: 40px;
|
|
height: 40px;
|
|
border-radius: 8px;
|
|
background: linear-gradient(135deg, #3b82f6, #a855f7);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: #fff;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 17px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__subtitle {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 3px 0 0;
|
|
}
|
|
|
|
&__tabs {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__content {
|
|
flex: 1;
|
|
min-height: 0;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__panel {
|
|
padding: 24px;
|
|
max-width: 800px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 24px;
|
|
}
|
|
}
|
|
|
|
// ─── Settings Tab Shared Layout ───────────────────────────────────────────────
|
|
|
|
.settings-tab {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 20px;
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0 0 3px;
|
|
}
|
|
|
|
&__description {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
&__list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__empty {
|
|
padding: 24px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
// Script cards
|
|
&__script-row {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__script-info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__script-name {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
|
|
code {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
}
|
|
|
|
&__script-value {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
&__script-actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
// Package manager select
|
|
&__package-manager {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__select {
|
|
width: 200px;
|
|
height: 36px;
|
|
padding: 0 10px;
|
|
border: 1px solid var(--mat-sys-outline);
|
|
border-radius: 4px;
|
|
background: var(--mat-sys-surface);
|
|
color: var(--mat-sys-on-surface);
|
|
font-size: 14px;
|
|
|
|
&:focus {
|
|
outline: none;
|
|
border-color: var(--mat-sys-primary);
|
|
}
|
|
}
|
|
|
|
&__sections {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 24px;
|
|
}
|
|
}
|
|
|
|
// ─── Package List Section ─────────────────────────────────────────────────────
|
|
|
|
.pkg-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
|
|
&__title {
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.08em;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0 0 6px;
|
|
}
|
|
|
|
&__list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__row {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__name-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
flex-wrap: wrap;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
|
|
code {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
}
|
|
}
|
|
|
|
&__desc {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__empty {
|
|
padding: 16px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0;
|
|
}
|
|
}
|
|
|
|
// ─── Next.js Config Tab ───────────────────────────────────────────────────────
|
|
|
|
.nextjs-config-tab {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 20px;
|
|
}
|
|
|
|
// ─── Card Form Fields (shared across settings cards) ─────────────────────────
|
|
|
|
.ps-card-fields {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
.ps-card-field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
.ps-helper-text {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 2px 0 0;
|
|
}
|
|
|
|
// ─── Switch Rows (features card) ─────────────────────────────────────────────
|
|
|
|
.ps-switch-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.ps-switch-row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
padding: 12px 0;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
|
|
&:last-child {
|
|
border-bottom: none;
|
|
padding-bottom: 0;
|
|
}
|
|
}
|
|
|
|
.ps-switch-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.ps-switch-desc {
|
|
font-size: 12px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 3px 0 0;
|
|
}
|
|
|
|
// ─── Workspace Body ──────────────────────────────────────────────────────────
|
|
// Shared layout root for full-height designer/workspace pages.
|
|
// Used as the root class in JSON page definitions (playwright-designer, unit-test-designer, etc.)
|
|
// Requires the parent .main to zero out its padding — handled via :has() in layout.module.scss
|
|
|
|
.workspace__body {
|
|
flex: 1;
|
|
display: flex;
|
|
overflow: hidden;
|
|
}
|
|
|
|
// ─── Unit Test Designer ───────────────────────────────────────────────────────
|
|
|
|
.unit-test-designer {
|
|
display: flex;
|
|
height: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.unit-test-list {
|
|
width: 300px;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-right: 1px solid var(--mat-sys-outline-variant);
|
|
background: var(--mat-sys-surface-container);
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 12px 16px;
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
gap: 4px;
|
|
}
|
|
|
|
&__scroll {
|
|
flex: 1;
|
|
min-height: 0;
|
|
}
|
|
|
|
&__items {
|
|
padding: 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
}
|
|
|
|
&__item {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
padding: 10px 12px;
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: background 150ms ease;
|
|
|
|
&:hover {
|
|
background: color-mix(in srgb, var(--mat-sys-on-surface) 8%, transparent);
|
|
|
|
.unit-test-list__item-delete {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
&--selected {
|
|
background: color-mix(in srgb, var(--mat-sys-primary) 12%, transparent);
|
|
|
|
.unit-test-list__item-name {
|
|
color: var(--mat-sys-primary);
|
|
}
|
|
}
|
|
}
|
|
|
|
&__item-body {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
&__item-name-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__item-indicator {
|
|
width: 8px;
|
|
height: 8px;
|
|
border-radius: 50%;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__item-name {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
&__item-file {
|
|
font-size: 11px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin-top: 3px;
|
|
padding-left: 14px;
|
|
}
|
|
|
|
&__item-count {
|
|
font-size: 11px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin-top: 2px;
|
|
padding-left: 14px;
|
|
}
|
|
|
|
&__item-delete {
|
|
opacity: 0;
|
|
transition: opacity 150ms ease;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
&__empty {
|
|
padding: 32px 16px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
}
|
|
|
|
.unit-test-editor {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
padding: 24px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 0;
|
|
|
|
&__content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 24px;
|
|
}
|
|
|
|
&__empty {
|
|
flex: 1;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
&__empty-inner {
|
|
text-align: center;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
|
|
&__empty-title {
|
|
font-size: 16px;
|
|
font-weight: 500;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 16px 0 8px;
|
|
}
|
|
|
|
&__empty-body {
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
margin: 0 0 20px;
|
|
}
|
|
}
|
|
|
|
.test-suite-editor {
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
&__title {
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
color: var(--mat-sys-on-surface);
|
|
margin: 0;
|
|
}
|
|
|
|
&__fields {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__row {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 16px;
|
|
}
|
|
|
|
&__select {
|
|
width: 100%;
|
|
height: 36px;
|
|
padding: 0 10px;
|
|
border: 1px solid var(--mat-sys-outline);
|
|
border-radius: 4px;
|
|
background: var(--mat-sys-surface);
|
|
color: var(--mat-sys-on-surface);
|
|
font-size: 14px;
|
|
|
|
&:focus {
|
|
outline: none;
|
|
border-color: var(--mat-sys-primary);
|
|
}
|
|
}
|
|
}
|
|
|
|
.test-cases-panel {
|
|
&__header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
}
|
|
|
|
&__scroll {
|
|
height: 480px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
&__items {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
padding: 4px 0;
|
|
}
|
|
|
|
&__empty {
|
|
padding: 32px 16px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
color: var(--mat-sys-on-surface-variant);
|
|
}
|
|
}
|
|
|
|
.test-case-card {
|
|
border: 1px solid var(--mat-sys-outline-variant);
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
|
|
&__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 10px 14px;
|
|
background: var(--mat-sys-surface-container-low);
|
|
border-bottom: 1px solid var(--mat-sys-outline-variant);
|
|
}
|
|
|
|
&__body {
|
|
padding: 14px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 14px;
|
|
}
|
|
|
|
&__field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__assertions {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
&__assertions-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
&__assertion-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
&__assertion-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
}
|