/** * Admin Block Editor Component * * Modern block editor with split-screen mode, improved block cards, * enhanced drag & drop feedback, and block type icons. * Uses BEM naming convention and design system tokens. */ .admin-block-editor { display: flex; flex-direction: column; gap: var(--space-lg, 1.5rem); padding: var(--space-lg, 1.5rem); background: var(--bg, oklch(100% 0 0)); min-height: 100vh; } /* Split-Screen Layout */ .admin-block-editor--split-screen { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-lg, 1.5rem); align-items: start; } .admin-block-editor__main { grid-column: 1; display: flex; flex-direction: column; gap: var(--space-lg, 1.5rem); } .admin-block-editor__preview-panel { grid-column: 2; position: sticky; top: var(--space-lg, 1.5rem); max-height: calc(100vh - var(--space-lg, 1.5rem) * 2); overflow-y: auto; background: var(--bg-secondary, oklch(95% 0.01 280)); border: 1px solid var(--border-light, oklch(75% 0.02 280)); border-radius: 8px; padding: var(--space-md, 1rem); } /* Toolbar */ .admin-block-editor__toolbar { background: var(--bg-secondary, oklch(95% 0.01 280)); border: 1px solid var(--border-light, oklch(75% 0.02 280)); border-radius: 8px; padding: var(--space-md, 1rem); margin-bottom: var(--space-md, 1rem); } .admin-block-editor__title { font-size: 1.125rem; font-weight: 600; color: var(--text, oklch(20% 0.02 280)); margin: 0 0 var(--space-md, 1rem) 0; padding-bottom: var(--space-sm, 0.75rem); border-bottom: 2px solid var(--border-light, oklch(75% 0.02 280)); } /* Block Types Grid */ .admin-block-editor__block-types { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: var(--space-sm, 0.75rem); } .admin-block-type-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-xs, 0.5rem); padding: var(--space-md, 1rem); border: 2px solid var(--border-light, oklch(75% 0.02 280)); border-radius: 8px; background: var(--bg, oklch(100% 0 0)); cursor: pointer; transition: all 0.2s ease; min-width: 100px; min-height: 100px; } .admin-block-type-btn:hover { border-color: var(--accent-primary, oklch(60% 0.2 280)); background: var(--bg-secondary, oklch(95% 0.01 280)); transform: translateY(-2px); box-shadow: 0 4px 8px oklch(0% 0 0 / 0.1); } .admin-block-type-btn:active { transform: translateY(0); } .admin-block-type-btn__icon { font-size: 2rem; font-weight: bold; color: var(--accent-primary, oklch(60% 0.2 280)); line-height: 1; } .admin-block-type-btn__label { font-size: 0.875rem; color: var(--text, oklch(20% 0.02 280)); text-align: center; font-weight: 500; } /* Template Selection */ .admin-block-editor__templates { background: var(--bg-secondary, oklch(95% 0.01 280)); border: 1px solid var(--border-light, oklch(75% 0.02 280)); border-radius: 8px; padding: var(--space-md, 1rem); margin-top: var(--space-md, 1rem); } .admin-block-editor__template-select { margin-top: var(--space-sm, 0.75rem); } /* Blocks Container */ .admin-block-editor__blocks { display: flex; flex-direction: column; gap: var(--space-md, 1rem); margin-bottom: var(--space-lg, 1.5rem); min-height: 200px; } .admin-block-editor__blocks--dragging { cursor: move; } .admin-block-editor__blocks--dragging .admin-block-card { cursor: grabbing; } /* Block Card */ .admin-block-card { border: 1px solid var(--border-light, oklch(75% 0.02 280)); border-radius: 8px; background: var(--bg-secondary, oklch(95% 0.01 280)); padding: var(--space-md, 1rem); transition: all 0.2s ease; position: relative; cursor: move; } .admin-block-card:hover { border-color: var(--accent-primary, oklch(60% 0.2 280)); box-shadow: 0 4px 12px oklch(0% 0 0 / 0.1); } .admin-block-card--dragging { opacity: 0.5; transform: scale(0.95); z-index: 1000; } .admin-block-card--drag-over-before { border-top: 3px solid var(--accent-primary, oklch(60% 0.2 280)); padding-top: calc(var(--space-md, 1rem) - 3px); } .admin-block-card--drag-over-after { border-bottom: 3px solid var(--accent-primary, oklch(60% 0.2 280)); padding-bottom: calc(var(--space-md, 1rem) - 3px); } .admin-block-card__header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-sm, 0.75rem); padding-bottom: var(--space-sm, 0.75rem); border-bottom: 1px solid var(--border-light, oklch(75% 0.02 280)); gap: var(--space-sm, 0.75rem); } .admin-block-card__drag-handle { cursor: grab; color: var(--muted, oklch(50% 0.01 280)); padding: var(--space-xs, 0.5rem); display: flex; align-items: center; justify-content: center; transition: color 0.2s ease; flex-shrink: 0; border-radius: 4px; } .admin-block-card__drag-handle:hover { color: var(--text, oklch(20% 0.02 280)); background: var(--bg, oklch(100% 0 0)); } .admin-block-card__drag-handle:active { cursor: grabbing; } .admin-block-card__type { font-weight: 600; color: var(--text, oklch(20% 0.02 280)); text-transform: capitalize; flex: 1; display: flex; align-items: center; gap: var(--space-xs, 0.5rem); } .admin-block-card__type-icon { width: 20px; height: 20px; color: var(--accent-primary, oklch(60% 0.2 280)); } .admin-block-card__actions { display: flex; gap: var(--space-xs, 0.5rem); } .admin-block-card__preview { padding: var(--space-sm, 0.75rem); background: var(--bg, oklch(100% 0 0)); border-radius: 4px; min-height: 60px; display: flex; align-items: center; justify-content: center; border: 1px dashed var(--border-light, oklch(75% 0.02 280)); } .admin-block-card__preview-text { color: var(--muted, oklch(50% 0.01 280)); font-size: 0.875rem; font-style: italic; } .admin-block-card__preview-content { width: 100%; max-height: 200px; overflow: hidden; } /* Empty State */ .admin-block-editor__empty { padding: var(--space-xl, 3rem); text-align: center; color: var(--muted, oklch(50% 0.01 280)); background: var(--bg-secondary, oklch(95% 0.01 280)); border-radius: 8px; border: 2px dashed var(--border-light, oklch(75% 0.02 280)); } /* Edit Form */ .admin-block-editor__edit-form { margin-top: var(--space-lg, 1.5rem); padding: var(--space-lg, 1.5rem); background: var(--bg-secondary, oklch(95% 0.01 280)); border-radius: 8px; border: 1px solid var(--border-light, oklch(75% 0.02 280)); } .admin-block-form { display: flex; flex-direction: column; gap: var(--space-md, 1rem); } .admin-block-form__actions { display: flex; gap: var(--space-md, 1rem); margin-top: var(--space-lg, 1.5rem); padding-top: var(--space-md, 1rem); border-top: 1px solid var(--border-light, oklch(75% 0.02 280)); } /* Preview Controls */ .admin-block-editor__preview-controls { margin-top: var(--space-lg, 1.5rem); padding-top: var(--space-lg, 1.5rem); border-top: 1px solid var(--border-light, oklch(75% 0.02 280)); display: flex; gap: var(--space-sm, 0.75rem); align-items: center; } .admin-block-editor__preview-toggle { padding: var(--space-sm, 0.75rem) var(--space-md, 1rem); border: none; border-radius: 6px; cursor: pointer; font-size: 0.875rem; font-weight: 500; transition: all 0.2s ease; display: flex; align-items: center; gap: var(--space-xs, 0.5rem); background: var(--accent-primary, oklch(60% 0.2 280)); color: var(--bg, oklch(100% 0 0)); } .admin-block-editor__preview-toggle:hover { background: oklch(55% 0.2 280); transform: translateY(-1px); box-shadow: 0 4px 8px oklch(60% 0.2 280 / 0.3); } .admin-block-editor__preview-toggle--active { background: var(--accent-success, oklch(58% 0.22 145)); } /* Preview Area */ .admin-block-editor__preview { margin-top: var(--space-lg, 1.5rem); padding: var(--space-lg, 1.5rem); background: var(--bg-secondary, oklch(95% 0.01 280)); border-radius: 8px; border: 1px solid var(--border-light, oklch(75% 0.02 280)); } .admin-block-editor__preview-content { margin-top: var(--space-md, 1rem); padding: var(--space-md, 1rem); background: var(--bg, oklch(100% 0 0)); border-radius: 4px; min-height: 200px; border: 1px solid var(--border-light, oklch(75% 0.02 280)); } .admin-block-editor__preview-error { padding: var(--space-md, 1rem); background: oklch(95% 0.05 25 / 0.1); border: 1px solid var(--accent-error, oklch(60% 0.25 25)); border-radius: 4px; color: var(--accent-error, oklch(60% 0.25 25)); } .admin-block-editor__preview-loading { display: flex; align-items: center; justify-content: center; padding: var(--space-xl, 3rem); color: var(--muted, oklch(50% 0.01 280)); } /* Asset Picker Wrapper */ .admin-asset-picker-wrapper { display: flex; flex-direction: column; gap: var(--space-xs, 0.5rem); } .admin-asset-picker-container { margin-bottom: var(--space-xs, 0.5rem); } .admin-asset-preview { display: flex; align-items: center; gap: var(--space-xs, 0.5rem); padding: var(--space-xs, 0.5rem); background: var(--bg-secondary, oklch(95% 0.01 280)); border-radius: 4px; font-size: 0.875rem; } .admin-asset-preview__label { font-weight: 600; color: var(--text, oklch(20% 0.02 280)); } .admin-asset-preview__value { color: var(--muted, oklch(50% 0.01 280)); font-family: monospace; word-break: break-all; } /* Buttons */ .admin-btn { padding: var(--space-sm, 0.75rem) var(--space-md, 1rem); border: none; border-radius: 6px; cursor: pointer; font-size: 0.875rem; font-weight: 500; transition: all 0.2s ease; display: inline-flex; align-items: center; gap: var(--space-xs, 0.5rem); } .admin-btn--small { padding: var(--space-xs, 0.5rem) var(--space-sm, 0.75rem); font-size: 0.8125rem; } .admin-btn--primary { background: var(--accent-primary, oklch(60% 0.2 280)); color: var(--bg, oklch(100% 0 0)); } .admin-btn--primary:hover { background: oklch(55% 0.2 280); transform: translateY(-1px); box-shadow: 0 4px 8px oklch(60% 0.2 280 / 0.3); } .admin-btn--secondary { background: var(--bg-secondary, oklch(95% 0.01 280)); color: var(--text, oklch(20% 0.02 280)); border: 1px solid var(--border-light, oklch(75% 0.02 280)); } .admin-btn--secondary:hover { background: var(--bg-tertiary, oklch(92% 0.01 280)); } .admin-btn--danger { background: var(--accent-error, oklch(60% 0.25 25)); color: var(--bg, oklch(100% 0 0)); } .admin-btn--danger:hover { background: oklch(55% 0.25 25); transform: translateY(-1px); box-shadow: 0 4px 8px oklch(60% 0.25 25 / 0.3); } /* Responsive Design */ @media (max-width: 1024px) { .admin-block-editor--split-screen { grid-template-columns: 1fr; } .admin-block-editor__preview-panel { position: static; max-height: none; } } @media (max-width: 768px) { .admin-block-editor { padding: var(--space-md, 1rem); } .admin-block-editor__block-types { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } .admin-block-card__header { flex-wrap: wrap; } .admin-block-card__actions { width: 100%; justify-content: flex-end; } } /* Drag & Drop Visual Feedback */ @keyframes drag-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } .admin-block-editor__blocks--dragging .admin-block-card:not(.admin-block-card--dragging) { animation: drag-pulse 1s ease-in-out infinite; } /* Block Type Icons */ .admin-block-type-icon { width: 24px; height: 24px; display: inline-block; vertical-align: middle; margin-right: var(--space-xs, 0.5rem); } .admin-block-type-icon--hero { background: linear-gradient(135deg, var(--accent-primary, oklch(60% 0.2 280)), oklch(65% 0.2 300)); border-radius: 4px; } .admin-block-type-icon--text { background: var(--accent-info, oklch(58% 0.22 240)); border-radius: 50%; } .admin-block-type-icon--image { background: var(--accent-success, oklch(58% 0.22 145)); border-radius: 4px; }