feat: complete asset deployment for plugin engines
**Asset Deployment Infrastructure:** - Enhanced RenderingEngineManager with complete asset deployment - Automatic plugin source directory discovery and asset copying - File system operations with proper directory structure preservation - Comprehensive error handling for missing assets **CLI Integration:** - Automatic asset deployment when using plugin engines - Verbose output showing deployment progress and statistics - Asset verification and accessibility validation - Production-ready deployment to _markitect/plugins/ structure **TestDrive JSUI Assets:** - Complete CSS asset suite (editor, controls, GitHub theme) - Placeholder image assets for testing deployment - Proper asset organization following plugin conventions - All 18 assets now deployed correctly **Testing Infrastructure:** - Comprehensive asset deployment testing - CLI integration verification with asset shipping - File existence and accessibility validation - Complete directory structure verification **Key Features:** - Assets deployed to `_markitect/plugins/testdrive-jsui/` when using --edit - HTML references match deployed asset locations - 18 total assets: 12 JS, 3 CSS, 3 images - Automatic deployment without --ship-assets flag needed - Clean separation of development vs production asset handling **Example Output:** ``` 🎯 Using rendering engine: testdrive-jsui (supports: edit, view) 📦 Deploying assets for engine 'testdrive-jsui'... 📄 Deployed 18 asset files js: 12 files css: 3 files images: 3 files ✅ Rendered with INTERACTIVE editing mode ``` This fixes the "HTML assets not found" issue when using explicit output directories with plugin engines. All plugin assets are now properly deployed and accessible. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
135
testdrive-jsui/static/css/controls.css
Normal file
135
testdrive-jsui/static/css/controls.css
Normal file
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* TestDrive JSUI Control Panel Styles
|
||||
*
|
||||
* Styles for individual control panels
|
||||
*/
|
||||
|
||||
/* Contents Control (Northwest) */
|
||||
.contents-control {
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.contents-control .toc-item {
|
||||
padding: 0.25rem 0;
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
padding-left: 0.5rem;
|
||||
}
|
||||
|
||||
.contents-control .toc-item:hover {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.contents-control .toc-h1 { font-weight: bold; }
|
||||
.contents-control .toc-h2 { margin-left: 1rem; }
|
||||
.contents-control .toc-h3 { margin-left: 2rem; font-size: 0.9em; }
|
||||
|
||||
/* Status Control (East) */
|
||||
.status-control {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.status-metric {
|
||||
padding: 0.5rem;
|
||||
margin: 0.25rem 0;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.status-metric .metric-value {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
.status-metric .metric-label {
|
||||
font-size: 0.8em;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
/* Debug Control (Southeast) */
|
||||
.debug-control {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.debug-control .debug-header {
|
||||
background: #343a40;
|
||||
color: #fff;
|
||||
padding: 0.5rem;
|
||||
margin: -0.75rem -0.75rem 0.5rem -0.75rem;
|
||||
border-radius: 5px 5px 0 0;
|
||||
}
|
||||
|
||||
.debug-control .debug-logs {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
background: #f8f9fa;
|
||||
padding: 0.5rem;
|
||||
margin: 0 -0.75rem -0.75rem -0.75rem;
|
||||
border-radius: 0 0 5px 5px;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
/* Edit Control (Northeast) */
|
||||
.edit-control {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.edit-control .control-button {
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin: 0.5rem 0;
|
||||
padding: 0.5rem;
|
||||
background: #007bff;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.edit-control .control-button:hover {
|
||||
background: #0056b3;
|
||||
}
|
||||
|
||||
.edit-control .control-button:disabled {
|
||||
background: #6c757d;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.edit-control .control-button.danger {
|
||||
background: #dc3545;
|
||||
}
|
||||
|
||||
.edit-control .control-button.danger:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
/* Control panel animations */
|
||||
.markitect-control-panel {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.markitect-control-panel.entering {
|
||||
opacity: 0;
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
.markitect-control-panel.entered {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media (max-width: 768px) {
|
||||
.markitect-control-panel {
|
||||
position: fixed !important;
|
||||
top: auto !important;
|
||||
bottom: 10px !important;
|
||||
left: 10px !important;
|
||||
right: 10px !important;
|
||||
transform: none !important;
|
||||
max-width: none !important;
|
||||
}
|
||||
}
|
||||
101
testdrive-jsui/static/css/editor.css
Normal file
101
testdrive-jsui/static/css/editor.css
Normal file
@@ -0,0 +1,101 @@
|
||||
/**
|
||||
* TestDrive JSUI Editor Styles
|
||||
*
|
||||
* Base styles for the markdown editor interface
|
||||
*/
|
||||
|
||||
.markitect-edit-mode {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Section editing styles */
|
||||
.markitect-section {
|
||||
position: relative;
|
||||
padding: 0.5rem;
|
||||
margin: 0.5rem 0;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.markitect-section:hover {
|
||||
background-color: #f8f9fa;
|
||||
border-color: #e9ecef;
|
||||
}
|
||||
|
||||
.markitect-section.editing {
|
||||
background-color: #fff;
|
||||
border-color: #007bff;
|
||||
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
|
||||
}
|
||||
|
||||
/* Editor styles */
|
||||
.markitect-editor {
|
||||
width: 100%;
|
||||
min-height: 100px;
|
||||
padding: 0.75rem;
|
||||
border: none;
|
||||
background: transparent;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.markitect-editor:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Control panel positioning */
|
||||
.markitect-control-panel {
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
background: #fff;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 6px;
|
||||
padding: 0.75rem;
|
||||
min-width: 200px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* Compass positioning */
|
||||
.markitect-control-nw { top: 20px; left: 20px; }
|
||||
.markitect-control-ne { top: 20px; right: 20px; }
|
||||
.markitect-control-e { top: 50%; right: 20px; transform: translateY(-50%); }
|
||||
.markitect-control-se { bottom: 20px; right: 20px; }
|
||||
.markitect-control-s { bottom: 20px; left: 50%; transform: translateX(-50%); }
|
||||
.markitect-control-sw { bottom: 20px; left: 20px; }
|
||||
.markitect-control-w { top: 50%; left: 20px; transform: translateY(-50%); }
|
||||
|
||||
/* Control panel states */
|
||||
.markitect-control-collapsed {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.markitect-control-expanded {
|
||||
max-width: 300px;
|
||||
max-height: 400px;
|
||||
}
|
||||
|
||||
/* Debug styles */
|
||||
.markitect-debug-panel {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 12px;
|
||||
background: #2d3748;
|
||||
color: #e2e8f0;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.markitect-debug-message {
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-bottom: 1px solid #4a5568;
|
||||
}
|
||||
|
||||
.markitect-debug-error { color: #fed7d7; }
|
||||
.markitect-debug-warning { color: #faf089; }
|
||||
.markitect-debug-success { color: #9ae6b4; }
|
||||
.markitect-debug-info { color: #bee3f8; }
|
||||
138
testdrive-jsui/static/css/themes/github.css
Normal file
138
testdrive-jsui/static/css/themes/github.css
Normal file
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* TestDrive JSUI GitHub Theme
|
||||
*
|
||||
* GitHub-inspired theme for the markdown editor
|
||||
*/
|
||||
|
||||
:root {
|
||||
--github-primary: #0969da;
|
||||
--github-border: #d0d7de;
|
||||
--github-bg-subtle: #f6f8fa;
|
||||
--github-fg-default: #1f2328;
|
||||
--github-fg-muted: #656d76;
|
||||
--github-success: #1a7f37;
|
||||
--github-danger: #d1242f;
|
||||
--github-warning: #9a6700;
|
||||
}
|
||||
|
||||
/* GitHub-style editor */
|
||||
.markitect-edit-mode {
|
||||
color: var(--github-fg-default);
|
||||
}
|
||||
|
||||
.markitect-section {
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.markitect-section:hover {
|
||||
background-color: var(--github-bg-subtle);
|
||||
border-color: var(--github-border);
|
||||
}
|
||||
|
||||
.markitect-section.editing {
|
||||
border-color: var(--github-primary);
|
||||
box-shadow: 0 0 0 0.2rem rgba(9, 105, 218, 0.25);
|
||||
}
|
||||
|
||||
/* GitHub-style control panels */
|
||||
.markitect-control-panel {
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--github-border);
|
||||
color: var(--github-fg-default);
|
||||
}
|
||||
|
||||
/* GitHub-style buttons */
|
||||
.edit-control .control-button {
|
||||
background: var(--github-primary);
|
||||
border: 1px solid transparent;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.edit-control .control-button:hover {
|
||||
background: #0860ca;
|
||||
}
|
||||
|
||||
.edit-control .control-button.danger {
|
||||
background: var(--github-danger);
|
||||
}
|
||||
|
||||
.edit-control .control-button.danger:hover {
|
||||
background: #b91c1c;
|
||||
}
|
||||
|
||||
/* GitHub-style status metrics */
|
||||
.status-metric {
|
||||
background: var(--github-bg-subtle);
|
||||
border: 1px solid var(--github-border);
|
||||
}
|
||||
|
||||
.status-metric .metric-value {
|
||||
color: var(--github-primary);
|
||||
}
|
||||
|
||||
.status-metric .metric-label {
|
||||
color: var(--github-fg-muted);
|
||||
}
|
||||
|
||||
/* GitHub-style debug panel */
|
||||
.markitect-debug-panel {
|
||||
background: #24292f;
|
||||
color: #f0f6fc;
|
||||
border: 1px solid #30363d;
|
||||
}
|
||||
|
||||
.markitect-debug-message {
|
||||
border-bottom: 1px solid #30363d;
|
||||
}
|
||||
|
||||
.markitect-debug-error {
|
||||
color: #f85149;
|
||||
background-color: rgba(248, 81, 73, 0.1);
|
||||
}
|
||||
|
||||
.markitect-debug-warning {
|
||||
color: #f0c674;
|
||||
background-color: rgba(240, 198, 116, 0.1);
|
||||
}
|
||||
|
||||
.markitect-debug-success {
|
||||
color: #56d364;
|
||||
background-color: rgba(86, 211, 100, 0.1);
|
||||
}
|
||||
|
||||
.markitect-debug-info {
|
||||
color: #79c0ff;
|
||||
background-color: rgba(121, 192, 255, 0.1);
|
||||
}
|
||||
|
||||
/* GitHub-style table of contents */
|
||||
.contents-control .toc-item {
|
||||
color: var(--github-fg-default);
|
||||
}
|
||||
|
||||
.contents-control .toc-item:hover {
|
||||
background-color: var(--github-bg-subtle);
|
||||
color: var(--github-primary);
|
||||
}
|
||||
|
||||
/* GitHub-style scrollbars */
|
||||
.contents-control::-webkit-scrollbar,
|
||||
.debug-control .debug-logs::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
}
|
||||
|
||||
.contents-control::-webkit-scrollbar-track,
|
||||
.debug-control .debug-logs::-webkit-scrollbar-track {
|
||||
background: var(--github-bg-subtle);
|
||||
}
|
||||
|
||||
.contents-control::-webkit-scrollbar-thumb,
|
||||
.debug-control .debug-logs::-webkit-scrollbar-thumb {
|
||||
background: var(--github-border);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.contents-control::-webkit-scrollbar-thumb:hover,
|
||||
.debug-control .debug-logs::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--github-fg-muted);
|
||||
}
|
||||
Reference in New Issue
Block a user